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