diff --git a/pyprophet/cli/util.py b/pyprophet/cli/util.py index 41a49003..7c11822a 100644 --- a/pyprophet/cli/util.py +++ b/pyprophet/cli/util.py @@ -93,8 +93,13 @@ class GlobalLogLevelGroup(click.Group): def invoke(self, ctx): log_level = ctx.params.get("log_level", "INFO").upper() - header = setup_logger(log_level=log_level) - ctx.obj = {"LOG_LEVEL": log_level, "LOG_HEADER": header} + log_colorize = ctx.params.get("log_colorize", True) + header = setup_logger(log_level=log_level, log_colorize=log_colorize) + ctx.obj = { + "LOG_LEVEL": log_level, + "LOG_HEADER": header, + "LOG_COLORIZE": log_colorize, + } return super().invoke(ctx) @@ -274,9 +279,9 @@ def get_execution_context(): return " ".join([sys.executable] + sys.argv) -def setup_logger(log_level): +def setup_logger(log_level, log_colorize): def formatter(record): - if log_level != "info": + if log_level.lower() != "info": # Format with module, function, and line number mod_func_line = f"{record['name']}::{record['function']}:{record['line']}" return ( @@ -319,7 +324,7 @@ def formatter(record): # Main console logger # logger.remove() # Remove default logger - logger.add(sys.stdout, colorize=True, format=formatter, level=log_level) + logger.add(sys.stdout, colorize=log_colorize, format=formatter, level=log_level) _LOGGER_INITIALIZED = True diff --git a/pyprophet/io/ipf/osw.py b/pyprophet/io/ipf/osw.py index 1cb2bd83..41bae28a 100644 --- a/pyprophet/io/ipf/osw.py +++ b/pyprophet/io/ipf/osw.py @@ -307,25 +307,49 @@ def _fetch_alignment_features_duckdb(self, con): f"Perform feature alignment using ARYCAL, and apply scoring to alignment-level data before running IPF.\nTable Info:\n{self._fetch_tables_duckdb(con)}" ) - subquery = """ - SELECT - FEATURE_ID, - MIN(PEP) AS pep - FROM osw.SCORE_ALIGNMENT - GROUP BY FEATURE_ID - """ query = f""" - SELECT - DENSE_RANK() OVER (ORDER BY fma.PRECURSOR_ID, fma.ALIGNMENT_ID) AS ALIGNMENT_GROUP_ID, - fma.ALIGNED_FEATURE_ID AS FEATURE_ID - FROM osw.FEATURE_MS2_ALIGNMENT AS fma - JOIN ( - {subquery} + SELECT + DENSE_RANK() OVER (ORDER BY merged.PRECURSOR_ID, merged.ALIGNMENT_ID) AS ALIGNMENT_GROUP_ID, + merged.ALIGNMENT_ID, + merged.FEATURE_ID, + merged.PRECURSOR_ID, + merged.FEATURE_TYPE + FROM ( + SELECT DISTINCT + fma.ALIGNMENT_ID, + fma.REFERENCE_FEATURE_ID AS FEATURE_ID, + fma.PRECURSOR_ID, + 'REFERENCE' AS FEATURE_TYPE + FROM osw.FEATURE_MS2_ALIGNMENT AS fma + WHERE fma.LABEL = 1 + AND fma.REFERENCE_FEATURE_ID != fma.ALIGNED_FEATURE_ID + + UNION + + SELECT DISTINCT + fma.ALIGNMENT_ID, + fma.ALIGNED_FEATURE_ID AS FEATURE_ID, + fma.PRECURSOR_ID, + 'QUERY' AS FEATURE_TYPE + FROM osw.FEATURE_MS2_ALIGNMENT AS fma + WHERE fma.LABEL = 1 + AND fma.REFERENCE_FEATURE_ID != fma.ALIGNED_FEATURE_ID + ) AS merged + LEFT JOIN ( + SELECT + FEATURE_ID, + MIN(PEP) AS pep + FROM osw.SCORE_ALIGNMENT + WHERE PEP <= {pep_threshold} + GROUP BY FEATURE_ID ) AS sa - ON sa.FEATURE_ID = fma.ALIGNED_FEATURE_ID - WHERE fma.LABEL = 1 - AND sa.pep < {pep_threshold} - ORDER BY ALIGNMENT_GROUP_ID + ON merged.FEATURE_ID = sa.FEATURE_ID + ORDER BY + ALIGNMENT_GROUP_ID, + CASE merged.FEATURE_TYPE + WHEN 'REFERENCE' THEN 0 + WHEN 'QUERY' THEN 1 + END; """ df = con.execute(query).fetchdf() diff --git a/pyprophet/main.py b/pyprophet/main.py index 8a6105ab..bf9c2c93 100644 --- a/pyprophet/main.py +++ b/pyprophet/main.py @@ -55,8 +55,13 @@ def profile(fun): ), help="Set global logging level.", ) +@click.option( + "--log-colorize/--no-log-colorize", + default=True, + help="Turn on/off colorized logging output.", +) @click.pass_context -def cli(ctx, log_level): +def cli(ctx, log_level, log_colorize): """ PyProphet: Semi-supervised learning and scoring of OpenSWATH results.