12
12
"""
13
13
import os
14
14
import re
15
+ import logging
15
16
from typing import Union
16
17
from . import config
17
18
from .ss_logger import SSLogger
18
19
from seglh_naming .sample import Sample
19
20
from seglh_naming .samplesheet import Samplesheet
21
+ import logging_tree
20
22
21
23
22
24
class SamplesheetCheck :
@@ -42,6 +44,9 @@ class SamplesheetCheck:
42
44
panels (list): Valid pan numbers
43
45
tso_panels (list): Valid TSO pannumbers
44
46
development_panels (list): Development pan numbers
47
+ runfolder_name (str): Name of runfolder
48
+ logfile_path (str): Path to use for logfile
49
+ logger (logging.Logger): Logger
45
50
46
51
Methods:
47
52
get_logger()
@@ -115,24 +120,24 @@ def __init__(
115
120
self .panels = panels
116
121
self .tso_panels = tso_panels
117
122
self .dev_panno = dev_panno
123
+ self .runfolder_name = (self .samplesheet_path .split ("/" )[- 1 ]).split ("_SampleSheet.csv" )[0 ]
124
+ self .logfile_path = f"{ os .path .join (logdir , self .runfolder_name )} _samplesheet_validator.log"
125
+ self .logger = self .get_logger ()
126
+
118
127
119
- def get_logger (self ):
128
+ def get_logger (self ) -> logging . Logger :
120
129
"""
121
130
Get logger for the class
122
- :return (object): Logger
131
+ :return (object): Logger
123
132
"""
124
- runfolder_name = (self .samplesheet_path .split ("/" )[- 1 ]).split (
125
- "_SampleSheet.csv"
126
- )[0 ]
127
- logfile_path = f"{ os .path .join (self .logdir , runfolder_name )} _{ config .TIMESTAMP } _samplesheet_validator.log"
128
- return SSLogger (logfile_path ).get_logger ()
133
+ return SSLogger (self .logfile_path , self .runfolder_name ).get_logger (__name__ )
134
+
129
135
130
136
def ss_checks (self ) -> None :
131
137
"""
132
138
Run checks at samplesheet and sample level. Performs required extra checks for
133
139
checks not included in seglh-naming
134
140
"""
135
- self .logger = self .get_logger ()
136
141
if self .check_ss_present ():
137
142
setattr (self , "ss_obj" , self .check_ss_name ())
138
143
if self .ss_obj :
@@ -274,57 +279,57 @@ def get_data_section(self) -> None:
274
279
:return None:
275
280
"""
276
281
with open (self .samplesheet_path , "r" ) as samplesheet_stream :
277
- for line in reversed (samplesheet_stream .readlines ()):
282
+ samplesheet_contents = samplesheet_stream .readlines ()
283
+ for line in reversed (samplesheet_contents ):
284
+ line_index = samplesheet_contents .index (line )
278
285
# If line contains table headers, stop looping through the file
279
286
if any (header in line for header in self .expected_data_headers ):
280
- self .extract_headers (line )
287
+ self .extract_headers (line , line_index )
281
288
break
282
289
elif len (line .split ("," )[0 ]) < 2 :
283
- self .logger .info (self .logger .log_msgs ["found_empty_line" ])
290
+ self .logger .info (self .logger .log_msgs ["found_empty_line" ], line_index )
284
291
pass # Skip empty lines
285
292
else : # Contains sample
286
- self .extract_sample_name_id (line )
293
+ self .extract_sample_name_id (line , line_index )
287
294
288
- def extract_headers (self , line : str ) -> None :
295
+ def extract_headers (self , line : str , line_index : int ) -> None :
289
296
"""
290
297
Extract headers from line
291
- :param line (str): Line containing samplesheet headers
298
+ :param line (str): Line containing samplesheet headers
299
+ :param line_index (int): Index of line
292
300
"""
293
301
try :
294
- self .logger .info (self .logger .log_msgs ["found_header_line" ])
302
+ self .logger .info (self .logger .log_msgs ["found_header_line" ], line_index )
295
303
self .data_headers = line .split ("," )
296
304
except Exception as exception :
297
305
self .errors = True
298
306
self .logger .warning (
299
- self .logger .log_msgs ["error_extracting_headers" ], exception
307
+ self .logger .log_msgs ["error_extracting_headers" ], line_index , exception
300
308
)
301
309
self .add_msg_to_error_dict (
302
310
"Error extracting headers" ,
303
- self .logger .log_msgs ["error_extracting_headers" ] % exception ,
311
+ self .logger .log_msgs ["error_extracting_headers" ] % ( line_index , exception ) ,
304
312
)
305
313
306
- def extract_sample_name_id (self , line : str ) -> None :
314
+ def extract_sample_name_id (self , line : str , line_index : int ) -> None :
307
315
"""
308
316
Extract sample name and sample id from samplesheet line
309
317
:param line (str): Line containing sample details
318
+ :param line_index (int): Index of line
310
319
"""
311
- self .logger .info (self .logger .log_msgs ["found_sample_line" ])
320
+ self .logger .info (self .logger .log_msgs ["found_sample_line" ], line_index )
312
321
for column_details in [("Sample_ID" , 0 ), ("Sample_Name" , 1 )]:
313
322
col_name , index = column_details
314
323
try :
315
324
self .samples [col_name ].append (line .split ("," )[index ])
316
325
except Exception as exception :
317
326
self .errors = True
318
327
self .logger .warning (
319
- self .logger .log_msgs ["col_extraction_error" ],
320
- col_name ,
321
- line ,
322
- exception ,
328
+ self .logger .log_msgs ["col_extraction_error" ], col_name , line_index , line , exception ,
323
329
)
324
330
self .add_msg_to_error_dict (
325
331
"Error extracting sample name and ID" ,
326
- self .logger .log_msgs ["col_extraction_error" ]
327
- % (col_name , line , exception ),
332
+ self .logger .log_msgs ["col_extraction_error" ] % (col_name , line_index , line , exception )
328
333
)
329
334
330
335
def check_expected_headers (self ) -> None :
0 commit comments