From 47647ccd897e579ef421aa2a76a8d9f517f84720 Mon Sep 17 00:00:00 2001
From: Bryan Brancotte <bryan.brancotte@pasteur.fr>
Date: Fri, 15 Dec 2023 16:46:16 +0100
Subject: [PATCH] use panda to add metadata, enrich metadata, add api to edit
 already created inittable

---
 jass/__main__.py                    |  22 +++---
 jass/models/inittable.py            |  50 +++++++------
 jass/test/data_real/initTable.hdf5  | Bin 1487401 -> 1592775 bytes
 jass/test/data_real/metadata.txt    |   6 ++
 jass/test/data_test1/initTable.hdf5 | Bin 701694 -> 798710 bytes
 jass/test/data_test1/metadata.txt   |   5 ++
 jass/test/data_test2/initTable.hdf5 | Bin 792111 -> 890892 bytes
 jass/test/data_test2/metadata.txt   |   5 ++
 jass/test/update_test_hdf5_files.sh |   2 +-
 scripts/hdf5_add_attributes.py      | 107 ++++++++++++++++++++++++----
 10 files changed, 146 insertions(+), 51 deletions(-)
 create mode 100644 jass/test/data_real/metadata.txt
 create mode 100644 jass/test/data_test1/metadata.txt
 create mode 100644 jass/test/data_test2/metadata.txt

diff --git a/jass/__main__.py b/jass/__main__.py
index 3efd212c..8779f1fe 100644
--- a/jass/__main__.py
+++ b/jass/__main__.py
@@ -12,7 +12,7 @@ import uvicorn
 from jass.config import config
 
 from jass.models.phenotype import get_available_phenotypes
-from jass.models.inittable import create_inittable_file, add_gene_annotation, add_inittable_meta
+from jass.models.inittable import create_inittable_file, add_gene_annotation
 from jass.models.worktable import create_worktable_file
 from jass.models.project import get_projects_last_access, load_project
 from jass.models.plots import (
@@ -231,6 +231,7 @@ def w_create_inittable(args):
 
     regions_map_path = absolute_path_of_the_file(args.regions_map_path)
     description_file_path = absolute_path_of_the_file(args.description_file_path)
+    init_table_metadata_path = absolute_path_of_the_file(args.init_table_metadata_path)
     init_table_path = absolute_path_of_the_file(args.init_table_path, True)
 
     create_inittable_file(
@@ -240,9 +241,9 @@ def w_create_inittable(args):
         init_table_path,
         init_covariance_path,
         init_genetic_covariance_path,
+        init_table_metadata_path=init_table_metadata_path,
     )
-    add_inittable_meta(init_table_path, args.title, args.description_inittable)
-    
+
 
 def w_plot_manhattan(args):
     worktable_path = absolute_path_of_the_file(args.worktable_path)
@@ -440,17 +441,10 @@ def get_parser():
         help="path to the genetic covariance file to import. Used only for display on Jass web application",
     )
     parser_create_it.add_argument(
-    "--title",
-    required=False,
-    default="inittable_{}".format(date.today()),
-    help="Title of the dataset (optional)",
-    )
-    
-    parser_create_it.add_argument(
-    "--description-inittable",
-    required=False,
-    default="inittable generated the {}".format(date.today()),
-    help="Textual description of the dataset (optional)",
+        "--init-table-metadata-path",
+        required=False,
+        default=None,
+        help="path to metadata file to attache to the initial data file",
     )
     
     parser_create_it.set_defaults(func=w_create_inittable)
diff --git a/jass/models/inittable.py b/jass/models/inittable.py
index 292d7311..72785ee3 100644
--- a/jass/models/inittable.py
+++ b/jass/models/inittable.py
@@ -9,9 +9,6 @@ import re
 import glob
 import logging
 from pandas import HDFStore, DataFrame, read_csv, concat, options, read_hdf
-import h5py
-import pandas as pd
-# create (or open) an hdf5 file and opens in append mode
 import numpy as np
 import tables
 import warnings
@@ -30,33 +27,36 @@ class InitMeta(object):
 def get_inittable_meta(file_name):
     init_store = HDFStore(file_name, mode='r')
     nb_snps = init_store.get_storer("SumStatTab").nrows
+    metadata = dict(
+        title=f"Filename: {file_name.split('/')[-1]}",
+        description="No description",
+        ancestry="??",
+        assembly="????",
+    )
+    try:
+        df = init_store.get('METADATA')
+        for i in range(len(df)):
+            metadata[df.iloc[i, 0]] = df.iloc[i, 1]
+    except KeyError:
+        pass
     init_store.close()
     nb_phenotypes = read_hdf(file_name, "PhenoList").shape[0]
 
-    try:
-        f = h5py.File(file_name, mode='r')
-        name=f.attrs['title']
-        desc=f.attrs["description"]
-        f.close()
-    except KeyError:
-        name = f"Filename: {file_name.split('/')[-1]}"
-        desc = "No description"
     return dict(
         nb_snps=int(nb_snps),
         nb_phenotypes=int(nb_phenotypes),
-        name=name,
-        desc=desc,
+        name=metadata['title'],
+        desc=metadata['description'],
+        **dict(
+            (k, metadata[k])
+            for k in set(metadata.keys()) if k not in {
+                'title',
+                'description',
+            }
+        ),
     )
 
-def add_inittable_meta(file_name, title, description):
-    """
-    add description in hdf5 attributes 
-    """
-    f = h5py.File(file_name, mode='a')
-    f.attrs['title'] = title
-    f.attrs["description"] = description
-    f.close()
- 
+
 def get_gwasname(file_name):
     return "_".join(os.path.basename(file_name).split("_")[0:3])
 
@@ -235,6 +235,7 @@ def create_inittable_file(
     init_table_path: str,
     init_covariance_path=None,
     init_genetic_covariance_path=None,
+    init_table_metadata_path=None,
 ):
     # Read region file
     regions = read_csv(regions_map_path, sep="\s+", memory_map=True)
@@ -282,6 +283,11 @@ def create_inittable_file(
         GEN_COV = genetic_covariance.loc[pheno_select, pheno_select]
         hdf_init.put("GEN_COV", GEN_COV, format="table", data_columns=True)
 
+    # Read metadata from file and store it
+    if init_table_metadata_path is not None:
+        metadata = read_csv(init_table_metadata_path, sep='\t', quotechar='"', index_col=False, memory_map=True)
+        hdf_init.put("METADATA", metadata, format="table", data_columns=True)
+
     which_cols = [
         "Region",
         "CHR",
diff --git a/jass/test/data_real/initTable.hdf5 b/jass/test/data_real/initTable.hdf5
index c0991ad580a4cea014ba80f654607884366a1d70..821bdcc09b2740e389cec2d5049da4fb1b2d3523 100644
GIT binary patch
delta 22635
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

delta 17826
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

diff --git a/jass/test/data_real/metadata.txt b/jass/test/data_real/metadata.txt
new file mode 100644
index 00000000..1811a8b6
--- /dev/null
+++ b/jass/test/data_real/metadata.txt
@@ -0,0 +1,6 @@
+information	content
+title	Small subset of Curated GWAS data
+description	"lorem ipsum"
+ancestry	UNK
+assembly	hg99
+foo	bar
\ No newline at end of file
diff --git a/jass/test/data_test1/initTable.hdf5 b/jass/test/data_test1/initTable.hdf5
index 96edbc7a1ae7f15228d6656a5238d72372fe4976..43518edff657babee693ad6a63b453d2fbe434cb 100644
GIT binary patch
delta 18938
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
F{{tW<jHLho

delta 15564
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

diff --git a/jass/test/data_test1/metadata.txt b/jass/test/data_test1/metadata.txt
new file mode 100644
index 00000000..8eb75e7a
--- /dev/null
+++ b/jass/test/data_test1/metadata.txt
@@ -0,0 +1,5 @@
+information	content
+title	Mock dataset with disney
+description	"lorem ipsum"
+ancestry	DIS
+assembly	dSNY
diff --git a/jass/test/data_test2/initTable.hdf5 b/jass/test/data_test2/initTable.hdf5
index 11d1d35d79470d801dd232691621e0ee54c091d1..b7dc5d7db470bf3819f4617cd3b9e92e1a2c1f0d 100644
GIT binary patch
delta 21104
zcmds<e_T|>{{Q!!v%BZ)9u^l6LHxlYqF`d6k@zbX3)2#X5~UvqXe6j8{z}wPtSt3v
zfg6l@Q_=e&f0PQE9yL+4OtehUOzmc(iD5;dW%-Nz%)DpL?jGQCzkl4W-^b^J58?fu
zGiT1sJm<%2=FIN44<eS8JzNkfc&xM(KG2slq98BXw=g%FvzM3O<4}GmCv{2C(VxR_
z$zWJ@R`@%sfclFKjsU5biDS|H(X|B55B2?1_I7lU3U(Y5?(&?`am2WAQb}JUL{g(x
zF~7ba4Uc9?<h?Cv;%z=+0{_@i`q$3l8J5!=sOg0>KmIMbusjJ>ZWm2EyreUnBj3-8
zhKc50jss>B_Yg|EYijFw%$yPtANSOwBU7J_k9}&CIj6Tdee~Sa!SQ2KhdmuPYE-N_
zr;jrve%Od%=A4Hd<z_!Fir(L3ey+82cYG*M=N{K292sE_eIX|@(mbPC`jNfiLLcV^
z`k2UvAUMiA1Lccm-+;)6!S4&vh75}xmHOzg5s8n+jTq&4*HSFIJqu0oGzL3rJv%yH
z^X%p5(Z-YOQdl17Nb~H<^`M5Ip4^9Q-eM3A_H?}1<|SeA%$IjuXp_V{_IdY4odvU}
z<F0pa$5wAo$3UOXj;FlaI)29XOz-}VUOt|Vm+}9e!6rz@(Z<_v#}uEg{EjF5GI__u
zcD0TbzGruAZy#-P9K-hv4({Qo4wf8^!A6ItkJ+(5*z9;S*v7)TV7m)W%imFj<KZ-s
zrAjY49_wnu7p#uOKGs(UcSVD{a!0)GQp9T0yU8g5A)HZ<R)%q*3nEx^$S<X_)aI~}
z`BfWeNHUAJ`<6CdE%SBkDQfdtc|senlKHhYG@Nz=9hx1+1u6Am+%kbwW$_(DqEZ#k
zea;h4vHfY-!huzN&rn3If-{EI)QUK#hLz}z%UPI_S*TJpUPZP6+`Hs{lykulyK5l#
zE=@P#l7Zutk{B+M<2`sZ?N!-Vv91vOB|+!GE9?Fy8ze<a<OT}p_#I<AW$!KFB_36e
z#+jsf?1!p%a8_mG8155D5aEnoMFk4?IXnz!_99A1<Mx4vGkgw}jAhqwrroaLjGuGG
zj4--;xBwTCEra_IQo&gsrr2K8mY_0=3*&g1mSEQ;uDygEntx=Q$7Q1OxyDeRvW2wD
zRW#8BoRV&r4ZM%dp~9dzsvR6kFP4*ph*AzcpJxnH_66&g@xsklI5e$;yhKxcK5Z#V
ze_!9Z_(M+O%FwliTz9_gRR}@}IE=ThpiWvZ>=Y~~PGDi>Y^64tTL!fLqtzB_$}gm)
zD?o`y#PQtQsNo<N=&VeHE7QvPqr{as-<gY8R{eMrT1P@c-=ZOv199eW{!Pui!zM_A
z?QITu^^_}6!YXc(pj*wM2QL{qlav)`Swb$3klsr!LIt041;R5fK)8iPI0@OeaA|^l
zBZoeiYYg|PdS6Q^VXsOlx<X5-zJgI2dV*3y$AfSyT{S`<!K0<4xgmmeOKZGxKZGI?
zUVPPdT0ARZQ?-RUgc=u$F7Dt05rM{SM1_aAK&7_3UjLtO=b`+{kI)ktTozxyzZFz`
zL^;dli#W^q+o+R6@a*19of2}zzK1#h&bo^@q}2hq==~I&P``mgH9h4_!T(4Lcm+6;
z3*I%evv*;5Rc6+`WVi7Vl{@4lQ}RhlDIXm?!-aaE*3!(mtkO*WUQ1J|XEZZ!amsTi
zgbH4WIMW)wmES_apu5$hnx8Nv`?s8lJ44G0U2f<V>J*R*7uB-gj~<uvBOZ$C(5fG~
ziQLs@_;P;YytseToR$29b9Ro}0PpOV)M>;Q&_YrwAQw@q<{ro;<60tJPSBlX<f5;&
zAXi4Jl6AX6-r^2Uu&ChNCL#bQgf`J0$d~C9p63_yXuF<|K!@V>{uYg3Ko|6Uo-(;q
z7{a4t3Hl+ZUgTXfLYc&S@g}~oyc4RGupxp;`j?Q;6I+Qe@m>GzZd8L-F2_Sz**l^E
z#jM~yQ#=cCM@1JL+<Ir=covASSEFU`h+!n=2Gsd&ZoD(jM30gm@63MqjSi35cErDm
zxN12_YRs+G#a!2!(ZvX3_=1C$N}GrN;G`mJOo6ndEN14~!BeiLiBH=0?EL82C9mrE
z*ZBv=e~|7!qBk#XoG|+PrU~BGvbKxs`@EOYzeYMMU)~Y?@fuF2?`ilU;L@F`b8b8q
zTrwyoyQ9@!`Bd$@C(C<w58(7&ix&*%`2GC0sr~ElJw4}fI%|&aO>WBp-lqe}M;N;M
zJXZyycI(q)D2ixDF(5KW!muvX8+cUHLk<z5^?)G_kL%n$)&lV;p%nP>OE~^6ZA<9Y
z_I!|Q_*OOs@S&VANz;HfI~$Oj;(-RFWcK8LGmzV{dQp`@Z~i~74D7tSGKl3h+NSa`
zQiM~QB6xeM+Qv4Tuh+LG!2eGOd$eyX|L-Y#^m-Z((q6fj#{YHNUO73D|BJ-^j=^2$
z|Ebi@5LWV7!z_G4@2?cTBq#!^oGXL|tD=76?*hnnI^*bc)y!|aDWFMnh43z_B&@XQ
zH4*EXF9o9&bA?`tb)MiR&>QCqf0aNVx=e5hbR~4TplQWb1wsTT4DjULCAx1LwHZgO
z7qk-n<_4Ti))AG;jl!4z_Hg_EROg{6XBT~_Yxq%;6#=Veryf-5_X@Z-KGKGk0}FL5
zCGyl_prM}&OsSteNqMPQ(k=>2sSmwOuQ(TRmj$ZSlYbZ7mAdUqp`}vi7Nct?h3@>>
zbErl(cSdAV;?APjQ#dU8I~oRhZ?{r-N(jCWl}40htuRrzStp>M4|1TLUG>M?&(cgK
z;Gvo;K<h5zj8@gqFe37}1aysr+0K)&VpI}<CtREqi1OU;gh@i^&q8xiUV<a2>YzY)
zPXnXQ2_y4&Ax+4<B~Ve`cvlM~SJqP?UTL1R$EZN8DCm|jM#!=00Y`I5&PAihyTaep
z#)%qFn!GpzTG!6l8QD&mOenGmm#6VhTE-j_vXF#SOC(P5{ZMdtsTnF%dg#%U8C<4d
zwdz|T!zH6aS>GMwD`{s8MAa8@J}=?`KGRIgVttd8#Y4ZAOG7mt`U9L56<YKY1-rk#
z84qr^64VAKCG@qrcMDIeD%9KuD^S?^!L-WrQDQf)yJ8K}ui%x5Cxop$8rn_o>iE{~
z`uo!HD<7f{bv4`#8>8?-DKuCQiwoovt#_9d(f#yz6j;lOtE5@=c)hL`*W?^>m32?(
zy@Y=yLK9K)2z^hN5<Tf`R<JEmpQwNPuj<1~@ZO0_cM%V^B_dMw9}2{SZHb69Js!5P
ztHAPCsUA-X`mKg*CokuyJxf2zNMaMYq*Tr$ut-v_Jrv@(_E3oD+Cw3pYY&BZu00gE
z=G;Rep1OyEN9iRP7722SL?wAC+1tQjEZg<VNw$Z0xi`l}YPQkPwfZbhkL+G@H(})l
zJ$kFZ6rxo2<ZC&lcAY+eN2~fu4|T|z^5WF#+37R0rcN>EMB**b@l&VF%$PD0?~tOa
zeWf8bO$4%Q>WqLlOlRgighob7F@c&`+GNb>y>yP_@@c+6hrZdM_vfaf)%~P|G|es1
zWYe=B-t%;(?%GG~rQ>w|_`gnPWx7Be!)iCu4yI#&1l>l6*A5SYp^hfY19;cdLw0)*
zse~{K*+*v2(fQz=Qe@w(*K@uoF@y7Sl(ms9wI9#~U&K4rp~$Po(3aG?<3gMEJ#;$_
z8sQPj{GkdBr+e8tUG94d9tS-+M}(J^(>r3le)S`dRfUavo<18Sh53kX7g^p=%p=k~
zG<UncE&6o3zNh0^-vIP{jMQ%GP?iHPorM3nC6ziUYsw375&!bR|NZcP^^u{Ib0W;6
z-C_gpUOEpQ-HGRPEz`@+n3=9ak+D)xpc=`$#Y111IVUFraf-fUKy)-t&W;~S9&3S^
zYGD@a(+7&GlcMN5IGqKGKGKt2Nrl98Xv99fKmTyFBR?Pl*Is!*AUYc>`M0<3WTfE{
zIvoK-enOS<XXHAuu+qF>X4cHf88kG0>i9{v7t&{@&&Zf*o1HZ?(>6YRx>_ACWXu>p
zJu8Pa{K-?NXJp&5a%RlRrZ<w`JTud$jL(=cbNU?YJ{tQJ3v~NK=UbgFea4K8>~WJN
z5)nTplIBRMd`A9C{9pOIz|*)wk7|dR{7sdtaaR{E>@FmHWWZbZVu$j|OB^ao=B;ul
ztBy>?fEN15zJ6|v3@)kIrw%vulihj@y5=JXaSx!?AzWyi__$HAkHwCPeQ;*_I7|@b
z9W}fxtlVcnL3TOZ$G?*HFFSiy$rlEuG#A&<E9#&SeG=c|CqKPF(AikzDvS12R3r1P
zRvNB$+JfCQDYcF4X8zf|>LX}^_1|gZSuayR;tKr>vC#8&<HxA+FlXYwGbjiB<t@CB
zcF;i8E*?&ti*LTF3MJZ&urJN~9|0RAFYkYdI<QriTTLC<oxb@Qaa5T_riuUPY$Vj5
zFi@Eleab*(7I~&~YU1+`vz(G0&FYV-1KVZN0qWR(6;0f6YQu(E+A-o3quRZKiO0-f
zx9sL#14t1*^Pi~KB}1TVwi9Y`93qGDoEB^6#^68Y6S=;^R?YO+piY0X8#}sfw(*LA
zYUGF?C?z{<9R)Ylrj&MvUQwHp^)7xSe!alwTF`TO#vWWp)cFg8Ut8ytX&XOv@~rGB
zBq62dX=5cX<o;+t*QUxrB;(}e5MO;A$_$&>q1R~nVG}$0C+ZOG%-v@8Wn4)&h+SO#
zAlE^8KG`^jgF3)?!#Ol)tZ@RG{G72pgkj0y%c0fJ8}n(D6eE7ogrBQajy2+!PsGAn
z!{QbND<d}-UO5SAxR3|)<n|<?RKdT=fG)gX>`d;4mr%mlTUhqbmqYlKztBvQMGoKC
zz;aCXvu#(Y1N+(ee^7@){*5@rC~Xi|CL~}2u!%j?V5H)jWDz8oP>FL9`-;5UNtX=z
z+@ivAKcSsBTTX{fG~#vW-@R4A?bhum;>A|{PMeGtQd`=wRm7QHjBK=s4xv|6#PuOY
zx-L!VYeW|(%Q5P-q!gA4K|Fe{+VBLH2A*dOeTYJsFW>>t*Qh}(Z0u;n+ogoCpzA<P
zl(xWR;@g2q`mPY#6>PH0%?Dz$h|uMHmE$K3xo&)25Aqtr_3r48vr48RU(&wFyi0z_
z*hH!g;Ja=p?8EgoM0nuHPQ9XF5!#7!MF~pf`nPR0Ev!#{-6FP@7BnPRTCGKa#`Q0w
z&;}RX%?J(774_gU(*qveC>WyUTxFn5uq@aJO;E^bZ=~C#Ren&RmCJEGdxJ^Zo{$^_
zHd)m1ok=~TvNuiTJZ=`y?raaXXm=}dW?HtpQ-$UJe3}t<aWEzj7wC&%z7GzhuPbG@
zIfOL67&LJ--%d#DZ$$5})rSkVIHQ~5b|e_Bf`qSqmdt0!ZYLpjbda!ey8RD*u|dcj
zVpJTP^a+Az^%z<g4$S%^{E8r)^CA6_2+#*oQi)V_$+|_%FHNW6>Rh%s)>vL{A^P)@
z(tn$NmsPln^Zx4reUrE#muvXupyd^NTYYt^IXs!a_|qa!X+`EIX}a-urc56H?Qp}d
z#qyJfa#o*74-c~25=t(-x8(x=#@~nM+n4{k|E&QMukT`5gG!65>W28(s!zY4Bw2^H
z-JNu%hhFMx9)2U!m)Cn6zL=|+IerQMbf+zY^X=;^6W5N$i6y2@8+C7O?oSW<+?3z#
zC|MW#){jFSM&wueaU5UH?{7NNx#FV!*qsA!<lDDa4w}8UPJhX;Hy7{APd8lo=4!Fe
zV!xG_3_5F-Z{sg(zuBP-99t`f{N_`J$lkm1;%E9k24%}pJ+3zV+oaq%qTkLb?^Nrn
zZwQ^niD>ethH#%P8MLlc;gYl;?^?{q@6=&=6qd&3|0<|xozA?Lo<vc{j9Kr{O2+SL
z2XQf|7N46z-}=as?8XA54T?Kz_)xg<qDV)jSrh4F?JV8Xxgr~tO6Sol>JyS)#<vg+
zBjJ?~{i#!E6jhs8c2hrmFa2A_;yv*$&8!-4I`dboq2cOQ>uQ-6LXCHr`E?c=4lmdj
z;6yENY9AcM{G<XJzLGt7+~e8@FJ=DbVKlsi#XC7o8}Byr17_0j0v4~-YSN7)wwlA^
zIDq^#c+<b3;OTUSFKRQ`z<kSP8m?Aq#d49zun91zzb8~o5;em(?>hrstY9)Mdm7kO
zhUHDB4#=>gxzqs}7WEQwig!K8z3m*v@c|GvKC?NP9snU>^Z*F4@NkL`fIt`=0Kpa=
z97{2In2jxG45>m&o`^<Xz_04bb#f#`=rmWPv+?<<EK_7Qj+#OpP+S>V)PdRf@NDY9
zY+O2%IBYgf$`I+OxO|b=d^R@V=aNwo+3ol|z=)xe`+j!FP>GF!zT;^PN8zN%j+bz}
zfHn2_x9Jr-W3*+x+SKz(wN%326X^t8q~MbK%VElmKMa?7p{PiUhr@znjTi`TljG2}
zH^e{+C#jeg5a4A07j*!Rr36a*7sAQId3C{w+Rz-%jejsWJKtfMB5*7#sRM8ZIj940
zR<ENDz{y)f90q3=u1J`&GPbpVa~|iy1?S1fHE_B-uEKHarxZ@<UXcpm@cmji%Rg7)
zq@2*gu~aiSvo4Bs*B+nT_=y*09niwzkADg!0XiXw+pE%vs-z_ZI`Lmn2k0~$h2nzD
zeXSdlxw}G*toxLOsS*}c3<?j!%J=i0O!<OfK~3RI`R4a>>rGhTsuyUNO2LHyYB)I6
z;#)(DNOT5Xbg;c0+PO|2XZ(sjX4xkE8V*v2@Z&n6^eS99z?b(Ky#V-9s-Qen>Bi%#
z27GbnTHvd|*-`Q3qWRCr{zA<V#t>^|tZ+9DQ5m`o@|5AC%dCSL>a`3repeYr-O@6w
zyTusB%MvJD<>RM~U+_Zw)n*J!8=*MBun8sp${2DM#9hWVAPl)liwp=4{|ZG0g!f~m
z5_Ow_gq2DI_OvUNEq^e4*$p(8uu?hvBXywr-MB&>;FolRI>0aLI&oO{3&+(A{5lCz
z^RclAKi9?YR+iCUXs7a{E0l&fm7m*GMERw7O0*BwdC_TB9U$Xu64L^{!RiDIQ?TxE
zutW#Q@F+>aXWV=R0WWYgQ<tzPKvGvA=lzKZW24aE12!Qi7`lK>zzL<DunlVvW#B8?
z6=tW!xStJQq*-C+y-xett~b;LX31i;chUu>8bhHAOx30R&$p{Y`yUQY6^>)?z?<$1
z%;iC#zCwg}KZ&aQQeVg`Ats!*f=z(o!?@*bBzoRP@a;&-K)ag(*DBy@>e&L<Ec`qd
zu5%8ID{+`a=QGpWq`QR<Q*pUzAc|{Hv_z#_#Q-g?PEV=08b)bxtxjUN3=?p%$$XZv
z!HDNG!=Pr&QXV4(gH_|s!B9pxdvkaY*ud=k(_jO$yph<Z%-VjSGAr1kj+gdrDiJzf
zR&2!_pWm(-FPHD29LXC9IF{2>vGz7bapd%kp#DD9#~99|V25}M`4)*iP)W2g1l1Oc
zJyBdA<C|z}kr-E49)fIrxPeGbP$}8T24G6O0oMVHxHv+prF1l{Au{5M%|_gery2W@
zSjIjt2FeWVxAX^_uoo<eV3WQoG{lp-pzQ1VGWMs(wqPGW+MRuQ1!jMJxJ23G&W_n1
z9j>x3jiR|cjMD=x<2#Xc)z#Tr_D%Ct_Q&UI+2<`_?CT07I$aK`A=72ulxFM)y+jHF
z?2BeXxqyA?RIq`4MIP9|K4lKJDf{0}tL$^msO)X$wCq=(#q0-uqhX(Yp3Rkw=he9~
z|AGeEah!R8hNGrh7UjF3oo)s#E{{Po%wW(`ra@)_+VaU@1GI*@U<0({vq>Q+w2CYS
zZRg?^(8BZGp%s3Qq0Pmo#o^5JLF`FFi4$7h1e(j$I6Z(?`Zj|WzETS<<vkTz_$Dp1
z^P6xV_mc<7>N;U!i3wf4Z7l6D_!wPiM6j0*YJ|9t7+rkW8q+<TE~0&Z8iR;PCtH5P
z>Jn0FpnGEtQ~=O5tO6V8cG?Iw(5?6fwt?=>*Ti9L^}vZt2;~c+YaP)EYa3pifZjEV
zbPJFQq2r=Rw*V6)ku57~P0XS_GJG?Gi=(Dm>NdOJ_HG8ZbOVE%v6{iH_&ekk;C4b_
z1KjvhumNuPdQt`oceR7T_1)0|?sA+D*JymrOY|4QgBaW(ZxO?t?Sz|BNOPHo(*wAx
z4=}hPA8X+*s!`!4eW`_OI1O;0Mk7N+^MWMST+|h%Tl0Z+N-|rmM6oBU@!WC(G1N&r
zkBu2>Jhw3f;$^b*iavr|z2IERR?q<5`3jm{`Wr88$5HL3Cg`@nf~0a;f)!Wj9csKf
z<{PeJ3`uYRHT#OByxUF0Y9afRW~0yH&j>hZpPh~YLujAjhrx#S8Fvb7XrFaoV7o{u
z8!NgNxp*%+B@#EpWxZHKq<hg753+`6j}X~jbZw;CeyLP&Mxjzcb!jtA!nj}z!ojJ6
z<tqt|m?XNbevhAIjdOVwYn*kTLPnu+`W^xs8t1HPu%U4#9VZ2#jkBqOHO@ibwrHF?
z@zbGkHck}_g!xZObkHdqLfU20lj=<21`pb$Deo$!LC<;kSQ@BnXRxyGsI7C*pY)14
zkTm?s=8Gh&3E`vEVT#AI;%~f=^m8*}TW*lj05QXFP%t3o`wQ4WEW8P9Aa?vFw(k$I
zLHFE=-N2rf*v`9**sSY}*zrclC=hG<5o{oqavN+QHs}vh07@+6DkBymnVM_y)%bZX
zVi$X|k%ST(6R#3;>mGC@$?!2zU02tR4)H3hfZir1!}%zBMP;=;%0y+j_v82o5q?pi
zm|qj8@Itshekl2<2_60Ed0L?;(4+#Z>qJZ{$m{&U24L6wfDOQ=KZxxjc4&(1_52%e
z^J<i)C}RSzd=n+UU_v%5<cd?cPhbZLcR6-GkUYbA)<hWB$3)-mZGYI*%G*65zN3i>
z^VI>6XJB{Q7i?f>jszRneH~890%H)5lk*~n;4QemL7-oHqy@ugaU}9yuXsJ~boucT
zbUJ$EaPYS#w$tRc_eTkKd4dsKAFm}i_j#4z#8fT8fHX$%m1!oT%wv>*T_P{E!F7?L
zQvP9t2|ch!j1rcPCMAL%cXAXI4tm_7kzfPBXUBpK0FOO`?IOimCw>4EI0YC{A$|!J
zk4MLg$bLwq7_dS=SNtQpglBNKOL&Yt=ZXltoVQ_KSA!0v&_b!Zu4=|7rqS>;a*Ab~
z&?Q|9asXO-UF^p7Mi<AM@KT-#>bZ%KePFp_IM{?GHxWf9;W)suM=~iE$~h`l3&(~r
zhEHX+V0esFZ7=z86!5utMVR!h$qnLmCq%a$VG41@OcPxV2jprYUVmMMcxj0i;)<mV
z;_bhih{TRjmez`9EyQti7({*{DHcF{VgZy8AoiaNHb6YN7;Jzz_%&?b4~YF2w+`{r
zQVqmae`^h*usM(Q#_RJS??BKz8*J!}mllCd2;vV}tXpovpC`(t5c}gAhmLs6(E{RN
z{5TiHe`+9hxuEt$x9xfYF$UchrFP~z2c6kg>QHrCxtq`2e`tX|wOs`|c&8TV^_{pQ
z`^oWzm6B3vmeM%k*&`6rO<DSdp@u_yFNt4k`sktmqIkJ+Xq{rBJHne$>?Yi30q?3(
zC_cf98+;)N2fXXI;qd!`ch!#8@ebal!FzjGt9Z?u7~ZEgKsf;K#Pwi92OW&AZB#ob
zzm=4UvfaLhvF&l71>5!bSt{EvP-Pd%UwHC@$*q^Jbpm#KVMG8ALe)b#ec`f>!l4tU
z=C3q=IBKG=G~GV5O<!r^!-Z>j!CYff2K1LC&f@(QEqhn|r=xSpLEdPF?Y>|JrKF14
zTITC6(Qw+bbh_!NCc(6!uriaJsZ**3N}&d!3TOM*SgA=QpE3$ZF-2ky{WYOjobyKG
zFbOpdGfAdgmJ~U_WRkAXbZzD3BJVuBWV>XB!%HZ6xG6z)%L9Frx9=q(3^ffm{Y^;t
z-b}Sa^$#>1RXZf#GBfR9ze}&EgLC6ud<%J<r)Qt0*Xc?;wV!6MVt&1qhO31h`W;P5
zt(+X@7u3;ke<m{PqP6K+`cXf80R3wt@jB!GH^ylrb{bFpK^gdC^rfiml3?OIl}dkk
zD=+x}WNx8ty!c<ubWk<%*N8<sUG-03<4$Md?|=z?uIzVg|3$*aO}hL~LZ;-lnF^W4
zCUa{-Cc4o~h0NlgA&+H;aCWbP2_xswo5U{u7>C{<8Am0=#A$(wDXYVGlMi9qjB;}&
zx)Mji9Snbhw$PM|A~H?>{LlcD^QzpAN||K=GLtfH1Ys8B)4Y()F8A`TZA(em2`c=v
zC0I$b%SPTiuN%FfHmC6JD6Lo?%@;)@%&CX6Z=UHg&xf`{jZ@_=&RvLxP8cYi{Ng$i
z6Fz;(w*wRAzU&aN0hA>O+eJ!3zDcvl8~(a!0-E=#33eOE8Rv6oIueJWD-p)7sOBrf
zK=i?DCc5`P_Z{&K)TKKU&Z~6s=XB}fPjzAO$LDoNm3eXiNikK33UyU6yqw{0bVVie
z<!=1W094%rpJ^`fhul|Q#K*^czyyS=yU<{=PnZ`-3I)puUh+cKJ>@JRBf^z1J$uBT
z?~d%R$ZH6?0%6f+0EI^sJnlsZhpB6j%&s1a${e`%O9xPFAu-Lc#WQS030iD%i4<Gu
zID*ZtY%VoT;rVPk%IP34)h-`SKTZk(!X;z~lm}+EkXWz*-lCCU13bf%*uH<g?8XS0
z_OiIA<W_nazx**u==@;FB1~YukAO`P4F?+(X7(_Wb+TIEixQEwr@Wt!A3#aXdbS0r
z23&=`<YFMj|Ge3)fAxBw^)It)<fEK+W>8L1Sz1mNvl*w-xmr$1^C+jC%b<H9ynm0s
zQsD%Fl{c{!Sas7#aR63S4wMXFMNI-5U=_^)8({g)!uI`xWthWYCB57#tkqK}tcJ;u
zMSvBO2{ypm@)FnpD{ltLI>0KOM`5L8P*{szYXPeX*CT;dR%a^U$Goq?!k-~=vT{v6
zgq5B1hOeYCRk6d@c5>c08_CUONA_DXksT>mGX_37ax{#VkH?KjCANBu7y@-V#|1u;
zODilNQ=G_2o^Ib6gRi5QFAP0)<Vb@#rN<r90Is*&m#diZrxBWeLk#{%f*QoWyCsr*
zM+_g?8@?n)`Q)zYHD1`cQdXY4XA0#!lh)IQ6^oyB1%H;y{TNsGP57)H{!!=kk<6d^
zJ`Gpr|E40D9pkbpH#u{qNjUhvi~`%6eU)n2TrVOM60^}>B;v0taU2ZxQ>uN;FE*LJ
zXUTxznZ1ps>0e&nh8Ny?--8I94B73GMB|(m4wQLNWfSuuy}=Gy)ai~K@?gql+hKY|
zor+RF#kcs$DGOppTOhJpo-F1sNv7d8mQ;FAZM-GS-_(nS(|4XaU7NG?L27z^nLp-h
z8m`ul@&Wh*oE3S22I%f>r4dzuw1n3_xSaVldPk6TK5SPUIO9PM2;p<uZ|wAFA$+XD
zFZ(>yjvn(7F{$*4*#$Oq^tGRW4IMqO65IE$qqq6QgO19nM?6{?m4yv^JgD~hLxDU(
zPk(R+*wE9JgJ45Xe`7z%JJiZHj2Prk;5M89kw0&p@Mtc7#3Q(c^pZn3q2ucow`Il6
z?>w07apOW4|0lj?t!?DDl$4z{k=O>cwS_g(D{5;y*XTj_;QH|vrDiZ8g)VrsLMrQf
zQWO}H_tZhDU`QTW3pS8y{|nea>YX33{Vz$KBkPMW^yoWctaCSwY~vvKo*c592KzYh
z9XiB=eH^FvKgrc4KQm<KuC<CR=rThlUV_X5vY7K=1G31Uzy@U8RZ<8*7KW1pWV3M{
z12WU?7RVM}^H8QG6J+Iu6q(Z4MZ%-A6Pa6|qsWFCEOdZ4D$&lQA`A1gumR#$d$k|a
zp1di*LXmm(v?zGn)FKF8W{c+Z0-xoDyCD7e!@)Mhgnq@>n87Br_^bY46I%R|w%DfU
z<M&LHHRt13&6X#iqcdgq^YOQ5$?gIbM{yUZ&Z|_QI$bJIRhPb<xP{At-%jKT<sB?&
z;C$Kb#l$p!3q6(>=}9w<chdMJ9$*t{{2mc(LXB_V4s1e=zvYc>cIxDs-a=_z47N1y
zV9#{0D0rtkoD=vJ76rcy4VQ$)uUlB>at&q{N-F3<3*A}U)LTo+6swXt_o$ZClE)aS
zYe^P(c}+hOe6v{oiWjc+X~t~W08$3h!}xXmpg5$5@#PPJ4a|-X1{;`VJ%Vk@?47@B
znay2?nQdC5VfOV}4Kp0Yotg70W#)7#Gu5Tc&f!w6+klxB##vCujqc162Qy|~(KOS9
zP1eI;1G9G`!3JixV!#Gw=LTY%F+19eF*_LFf?2;fixTt!VOEYwC2k?iq-82Ix0#PJ
z<DOy6mOQUzc6Fl4Y)`h9S=JQBtY(2bv$K_iSxrhaW?>nm48UyRcqk4qD;x_pFxxa4
zY+yDl6WjkknC-!(0%p^uHfI(&nK8STPBTrI4NC(Xn9X?(Y+!aS3v6Jv=S6HYW}A{3
zvvspuFl#?mWfqA^QD%z^Rc3Cg1{GeH?F+ts(tOBn)hE35_9riYdTO_|X4bwK|HrM*
z|7O^m8a{Z}jTMIzKHvX%KNH6vHH=MP;Wy?j-NI8*9vyl8cKMq_FHGGU$nhs4CQH_;
zUe+xO?yRZUGhZ()8}#&vJrjOzKjC4$^n#!C{eelpU%BmNtG)Y6pe<ocZRhv4F1e!L
zEDby~D$%RjVNY2YG(5%UxM`GE^p$(#@5H=*Z~Tqa;*69t+5dcY()jnglyqOXm;e3V
z-V0-A@CUxT_eYn?@6Y|hd-!x9nOJse&e*TEq`ZEw?;i`cFPPJ$czq?G*Q3VM@?&C@
z{@c<!Zw^J1R^b(Y&1t!#*jqn;)UU%|MAue|;mX%1<k1H7+e)#Aa`L)rqTQ>+cqQbf
HY&QNkC$MHV

delta 18550
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
X|5wh13zQtCu>TJ>6^7A@ED!rXvIE1F

diff --git a/jass/test/data_test2/metadata.txt b/jass/test/data_test2/metadata.txt
new file mode 100644
index 00000000..e70e8c5f
--- /dev/null
+++ b/jass/test/data_test2/metadata.txt
@@ -0,0 +1,5 @@
+information	content
+title	Mock dataset with car
+description	"lorem ipsum"
+ancestry	CAR
+assembly	car1
diff --git a/jass/test/update_test_hdf5_files.sh b/jass/test/update_test_hdf5_files.sh
index ed467bef..35e5729c 100755
--- a/jass/test/update_test_hdf5_files.sh
+++ b/jass/test/update_test_hdf5_files.sh
@@ -23,7 +23,7 @@ for DATA_DIR in $DATA_DIRS; do
   fi
 
   echo "Creating inittable"
-  jass create-inittable --input-data-path "./${DATA_DIR}/z*.txt" --init-covariance-path "./${DATA_DIR}/COV.csv" --init-genetic-covariance-path ${GEN_COV} --regions-map-path "./${DATA_DIR}/regions.txt" --description-file-path "./${DATA_DIR}/summary.csv" --init-table-path "./${DATA_DIR}/initTable.hdf5"
+  jass create-inittable --input-data-path "./${DATA_DIR}/z*.txt" --init-covariance-path "./${DATA_DIR}/COV.csv" --init-genetic-covariance-path ${GEN_COV} --regions-map-path "./${DATA_DIR}/regions.txt" --description-file-path "./${DATA_DIR}/summary.csv" --init-table-metadata-path "./${DATA_DIR}/metadata.txt" --init-table-path "./${DATA_DIR}/initTable.hdf5"
 
   echo "Creating worktable"
   jass create-project-data --init-table-path "${DATA_DIR}/initTable.hdf5" --phenotype ${TRAITS} --worktable-path ./${DATA_DIR}/worktable.hdf5
diff --git a/scripts/hdf5_add_attributes.py b/scripts/hdf5_add_attributes.py
index 8b5ab657..bb3067b3 100644
--- a/scripts/hdf5_add_attributes.py
+++ b/scripts/hdf5_add_attributes.py
@@ -1,23 +1,102 @@
+import argparse
+import csv
+import json
+import tempfile
 
-from jass.models.inittable import get_inittable_meta, add_inittable_meta
-# we need python package h5py to read/write .hdf5 file
+from pandas import HDFStore, read_csv
 
+from jass.models.inittable import get_inittable_meta
 
 
-if __name__ == "__main__":
-
-    title = 'Curated GWAS summary statistics on African ancestry on 19 blood count traits and glycemic traits (hg38)'
-    des = 'Genome wide curated summary statistics on 19 blood count traits and glycemic traits' \
-          'File format is the inittable format intended to be used with the Joint Analysis of Summary Statistics (JASS), which allows to perform multi-trait GWAS:' \
-          'https://gitlab.pasteur.fr/statistical-genetics/jass' \
-          'GWAS of hematological traits originate from Chen et al paper and were downloaded from the GWAS Catalog (https://www.ebi.ac.uk/gwas/publications/32888493#study_panel). GWAS of glycemic traits come from the (18) study downloadable from GWAS Catalog (https://www.ebi.ac.uk/gwas/publications/34059833).'
-    hdf5_file = '/pasteur/zeus/projets/p02/GGS_JASS/jass_pipeline_dev_copie/jass/jass/test/data_test2/initTable.hdf5'
-
-    add_inittable_meta(hdf5_file, title, des)
-
-    print(get_inittable_meta(hdf5_file))
+def set_metadata_from_file(*, hdf5_file, init_table_metadata_path):
+    global init_store, metadata
+    init_store = HDFStore(hdf5_file)
+    metadata = read_csv(init_table_metadata_path, sep='\t', quotechar='"', index_col=False, memory_map=True)
+    init_store.put("METADATA", metadata, format="table", data_columns=True)
+    init_store.close()
 
 
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        "--init-table-path", default=None, help="path to the inittable to edit", required=True, dest="hdf5_file"
+    )
+    meta_arg = parser.add_argument(
+        "--init-table-metadata-path",
+        required=False,
+        default=None,
+        help="path to metadata file to attache to the inittable. Note that all previous metadata are purged.",
+    )
+    mutex_grp = parser.add_mutually_exclusive_group()
+    mutex_grp._group_actions.append(meta_arg)
+    mutex_grp.add_argument(
+        "--clean-metadata",
+        action="store_true",
+        default=False,
+        help="Remove all information in metadata before adding new one",
+    )
+    mutex_grp = parser.add_mutually_exclusive_group()
+    mutex_grp._group_actions.append(meta_arg)
+    mutex_grp.add_argument(
+        "--title",
+        help="title to append to the metadata",
+        default=None,
+        required=False,
+    )
+    mutex_grp = parser.add_mutually_exclusive_group()
+    mutex_grp._group_actions.append(meta_arg)
+    mutex_grp.add_argument(
+        "--description",
+        help="description to append to the metadata",
+        default=None,
+        required=False,
+    )
+    mutex_grp = parser.add_mutually_exclusive_group()
+    mutex_grp._group_actions.append(meta_arg)
+    mutex_grp.add_argument(
+        "--ancestry",
+        help="ancestry to append to the metadata",
+        default=None,
+        required=False,
+    )
+    mutex_grp = parser.add_mutually_exclusive_group()
+    mutex_grp._group_actions.append(meta_arg)
+    mutex_grp.add_argument(
+        "--assembly",
+        help="assembly to append to the metadata",
+        default=None,
+        required=False,
+    )
+    args = parser.parse_args()
 
+    if args.init_table_metadata_path:
+        set_metadata_from_file(hdf5_file=args.hdf5_file, init_table_metadata_path=args.init_table_metadata_path)
+    else:
+        init_store = HDFStore(args.hdf5_file, mode='r')
+        if args.clean_metadata:
+            metadata = dict()
+        else:
+            try:
+                df = init_store.get('METADATA')
+                metadata = dict((df.iloc[i, 0], df.iloc[i, 1]) for i in range(len(df)))
+            except KeyError:
+                metadata = dict()
+        init_store.close()
+        for k in [
+            'title',
+            'description',
+            'ancestry',
+            'assembly',
+        ]:
+            if getattr(args, k):
+                metadata[k] = getattr(args, k)
 
+        with tempfile.NamedTemporaryFile(suffix=".csv") as f:
+            with open(f.name, 'w', newline='') as csvfile:
+                csvwriter = csv.writer(csvfile, delimiter='\t', quotechar='"', quoting=csv.QUOTE_MINIMAL)
+                csvwriter.writerow(["information", "content"])
+                for item in metadata.items():
+                    csvwriter.writerow(item)
+            set_metadata_from_file(hdf5_file=args.hdf5_file, init_table_metadata_path=f.name)
 
+    print("Resulting metadata is:", json.dumps(get_inittable_meta(args.hdf5_file), indent=4))
-- 
GitLab