@@ -73,32 +73,45 @@ class SqliteExport:
7373 }
7474
7575
76- def __init__ (self , opp_id :str , sqlite_dir :str , scoring_files_dir :str , datasets : list , use_opgs_id_as_gene :bool , insert_block_max :int = 100 ):
76+ def __init__ (self , opp_id :str , sqlite_dir :str , scoring_files_dir :str , datasets : list , use_different_id_as_gene :bool , insert_block_max :int = 100 ):
7777 self .opp_id = opp_id
7878 self .sqlite_dir = sqlite_dir
7979 self .scoring_files_dir = scoring_files_dir
8080 self .datasets = datasets # List of Dataset models
81- self .use_opgs_id_as_gene = use_opgs_id_as_gene
81+ self .use_different_id_as_gene = use_different_id_as_gene
8282 self .insert_block_max = insert_block_max
8383
8484
8585 def read_scoring_file (self , dataset_dir :str , score_id :str , dataset_name :str , reported_trait_id :str , molecular_traits :dict , genome_build :str ) -> list :
8686 ''' Read content of the scoring file '''
87+
88+ data = []
89+ # Fetch correct directory (usually composed of the dataset ID + suffix)
90+ if not os .path .isdir (f'{ self .scoring_files_dir } /{ dataset_dir } ' ):
91+ for ds_dir in os .listdir (self .scoring_files_dir ):
92+ if ds_dir .startswith (dataset_dir ) and os .path .isdir (f'{ self .scoring_files_dir } /{ ds_dir } ' ):
93+ dataset_dir = ds_dir
94+ break
95+ if not os .path .isdir (f'{ self .scoring_files_dir } /{ dataset_dir } ' ):
96+ print (f">> Can't find the directory { self .scoring_files_dir } /{ dataset_dir } " )
97+ exit ()
98+
99+ # Initiate file path(s)
87100 scoring_file = f'{ self .scoring_files_dir } /{ dataset_dir } /{ score_id } .txt'
88101 scoring_file_gz = f'{ self .scoring_files_dir } /{ dataset_dir } /{ score_id } .txt.gz'
89- data = []
102+
90103 if not os .path .isfile (scoring_file ):
91104 scoring_file = f'{ self .scoring_files_dir } /{ dataset_dir } /{ score_id } _model.txt'
92105
93- # Text file
106+ # Case of a text file
94107 if os .path .isfile (scoring_file ):
95108 with open (scoring_file , newline = '' ) as sc_file :
96109 # Ignore lines starting with '#'
97110 reader = csv .DictReader (filter (lambda row : row [0 ]!= '#' , sc_file ), delimiter = '\t ' )
98111 for row in reader :
99112 variant_info = self .get_variant_info (row ,score_id ,dataset_name ,reported_trait_id ,molecular_traits ,genome_build )
100113 data .append (variant_info )
101- # Zipped file
114+ # Case of a zipped file
102115 elif os .path .isfile (scoring_file_gz ):
103116 with gzip .open (scoring_file_gz , mode = "rt" ) as sc_file :
104117 # Ignore lines starting with '#'
@@ -113,18 +126,24 @@ def read_scoring_file(self, dataset_dir:str, score_id:str, dataset_name:str, rep
113126
114127 def get_variant_info (self , row :dict , score_id :str , dataset_name :str , reported_trait_id :str , molecular_traits :dict , genome_build :str ) -> tuple :
115128 ''' Fetch variant information of a row in the scoring file '''
116- rsid = row ['rsID' ] if 'rsID' in row .keys () else row ['rsid' ]
129+ rsid = None
130+ if 'rsID' in row .keys ():
131+ rsid = row ['rsID' ]
132+ elif 'rsid' in row .keys ():
133+ rsid = row ['rsid' ]
117134 varid = None
118135 if 'chr_name' in row .keys () and 'chr_position' in row .keys ():
119136 # 1_156000340_A_G_b38
120137 to_replace = 'GRCh' if genome_build .startswith ('GRCh' ) else 'hg'
121138 build = 'b' + genome_build .replace (to_replace ,'' )
122139 varid = f"{ row ['chr_name' ]} _{ row ['chr_position' ]} _{ row ['other_allele' ]} _{ row ['effect_allele' ]} _{ build } "
140+ if not rsid :
141+ rsid = f'chr{ row ['chr_name' ]} :{ row ['chr_position' ]} '
123142 elif 'variant_description' in row .keys ():
124143 if row ['variant_description' ].startswith ('variant_id=chr' ):
125144 varid = row ['variant_description' ].split ('=' )[1 ]
126145 gene_id = molecular_traits ['gene_id' ]
127- if self .gtex_prefix_study in dataset_name :
146+ if ( self .gtex_prefix_study in dataset_name ) or self . use_different_id_as_gene == 'name' :
128147 variant_info_list = [
129148 score_id , # omicspred_id
130149 reported_trait_id , # gene
@@ -148,7 +167,7 @@ def get_variant_info(self, row:dict, score_id:str, dataset_name:str, reported_tr
148167
149168
150169 def create_table_extra (self , cur :sqlite3 .Cursor , is_proteomics :bool ) -> list :
151- if self .use_opgs_id_as_gene :
170+ if self .use_different_id_as_gene == 'opgs_id' :
152171 cols_extra = ['gene' , 'gene_id' , 'genename' , 'gene_type' ]
153172 else :
154173 cols_extra = ['omicspred_id' , 'gene' , 'genename' , 'gene_type' ]
@@ -161,7 +180,7 @@ def create_table_extra(self, cur:sqlite3.Cursor, is_proteomics:bool) -> list:
161180
162181
163182 def create_table_weights (self , cur :sqlite3 .Cursor , is_proteomics :bool ) -> None :
164- if self .use_opgs_id_as_gene :
183+ if self .use_different_id_as_gene == 'opgs_id' :
165184 cols_weights = ['gene' , 'gene_id' ]
166185 else :
167186 cols_weights = ['omicspred_id' , 'gene' ]
@@ -214,20 +233,28 @@ def get_score_data(self, dataset_name:str, score:Score, gene:Gene, reported_trai
214233 'gene_type' : gene .biotype
215234 }
216235 else :
217- if self .use_opgs_id_as_gene :
218- score_data = {
219- 'gene' : score_id ,
220- 'gene_id' : gene_id ,
221- 'genename' : gene .name ,
222- 'gene_type' : gene .biotype
223- }
224- else :
225- score_data = {
226- 'omicspred_id' : score_id ,
227- 'gene' : gene_id ,
228- 'genename' : gene .name ,
229- 'gene_type' : gene .biotype
230- }
236+ match self .use_different_id_as_gene :
237+ case 'opgs_id' :
238+ score_data = {
239+ 'gene' : score_id ,
240+ 'gene_id' : gene_id ,
241+ 'genename' : gene .name ,
242+ 'gene_type' : gene .biotype
243+ }
244+ case 'name' :
245+ score_data = {
246+ 'omicspred_id' : score_id ,
247+ 'gene' : reported_trait_id ,
248+ 'genename' : gene .name ,
249+ 'gene_type' : gene .biotype
250+ }
251+ case _:
252+ score_data = {
253+ 'omicspred_id' : score_id ,
254+ 'gene' : gene_id ,
255+ 'genename' : gene .name ,
256+ 'gene_type' : gene .biotype
257+ }
231258 if is_proteomics :
232259 proteins = score .proteins .all ()
233260 protein = proteins [0 ]
@@ -243,7 +270,7 @@ def get_score_data(self, dataset_name:str, score:Score, gene:Gene, reported_trai
243270 return score_data
244271
245272
246- def generate_sqlite_files (self ):
273+ def generate_sqlite_files (self , skip_zip : bool = False ):
247274 ds_count = 1
248275 ds_total_count = len (self .datasets )
249276 for dataset in self .datasets :
@@ -310,6 +337,8 @@ def generate_sqlite_files(self):
310337 if self .gtex_prefix_study in dataset_name and score .name .startswith ('intron_' ):
311338 intron_name = score .name .split ('_' )
312339 reported_trait_id = f'{ intron_name [0 ]} _{ intron_name [1 ]} _{ intron_name [2 ]} _{ intron_name [3 ]} '
340+ elif self .use_different_id_as_gene == 'name' :
341+ reported_trait_id = score .name
313342 # Get performance metrics (Training)
314343 metrics = self .get_metrics (score )
315344
@@ -354,11 +383,12 @@ def generate_sqlite_files(self):
354383 con .commit ()
355384
356385 # Gzip the SQLite file
357- with open (sqlite_filepath , 'rb' ) as f_in :
358- with gzip .open (f'{ sqlite_filepath } .gz' , 'wb' ) as f_out :
359- shutil .copyfileobj (f_in , f_out )
360- os .remove (sqlite_filepath )
361- print (f"\t -> File zipped" )
386+ if not skip_zip :
387+ with open (sqlite_filepath , 'rb' ) as f_in :
388+ with gzip .open (f'{ sqlite_filepath } .gz' , 'wb' ) as f_out :
389+ shutil .copyfileobj (f_in , f_out )
390+ os .remove (sqlite_filepath )
391+ print (f"\t -> File zipped" )
362392
363393
364394 ## FOR test - begin ##
0 commit comments