From acbb2e5b5d924e6d87984c71e967f6839553fdc5 Mon Sep 17 00:00:00 2001 From: Luca Venturini Date: Wed, 3 Oct 2018 11:36:36 +0100 Subject: [PATCH] Initial modifications to address #130. Now the metric should be considered correctly and the configuration file should be parsed and checked appropriately --- Mikado/configuration/configurator.py | 4 ++++ Mikado/configuration/scoring_blueprint.json | 9 +++++++-- Mikado/loci/abstractlocus.py | 9 ++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Mikado/configuration/configurator.py b/Mikado/configuration/configurator.py index 2bed91d74..bcb3abb3a 100644 --- a/Mikado/configuration/configurator.py +++ b/Mikado/configuration/configurator.py @@ -177,6 +177,10 @@ def check_scoring(json_conf): elif json_conf["scoring"][parameter]["use_raw"] is True: invalid_raw.add(parameter) + if "filter" in json_conf["scoring"][parameter] and "metric" in json_conf["scoring"][parameter]["filter"]: + if json_conf["scoring"][parameter]["filter"]["metric"] not in available_metrics: + parameters_not_found.append(json_conf["scoring"][parameter]["filter"]["metric"]) + if len(parameters_not_found) > 0 or len(double_parameters) > 0 or len(invalid_filter) > 0 or len(invalid_raw) > 0: err_message = '' if len(parameters_not_found) > 0: diff --git a/Mikado/configuration/scoring_blueprint.json b/Mikado/configuration/scoring_blueprint.json index 5f5ab7832..9537b4ea6 100644 --- a/Mikado/configuration/scoring_blueprint.json +++ b/Mikado/configuration/scoring_blueprint.json @@ -12,10 +12,12 @@ "oneOf": [ { "operator": { "oneOf": ["gt", "ge", "lt", "le"], "optional": false}, - "value": {"type": "number", "optional": false} + "value": {"type": "number", "optional": false}, + "metric": {"type": "string", "optional": true} }, { "operator": { "oneOf": ["ne", "eq"], "optional": false}, + "metric": {"type": "string", "optional": true}, "value": { "oneOf": [{"type": "number"}, {"type": "boolean"}], "optional": false} @@ -28,7 +30,8 @@ ], "optional": false }, - "value": {"type": "array"} + "metric": {"type": "string", "optional": true}, + "value": {"type": "array", "optional": false} }, { "operator": { @@ -38,7 +41,9 @@ ], "optional": false }, + "metric": {"type": "string", "optional": true}, "value": { + "optional": false, "type": "array", "items": { "type": "number" diff --git a/Mikado/loci/abstractlocus.py b/Mikado/loci/abstractlocus.py index 2b81a61a5..47013f422 100644 --- a/Mikado/loci/abstractlocus.py +++ b/Mikado/loci/abstractlocus.py @@ -1102,7 +1102,14 @@ def _calculate_score(self, param): check = True if ("filter" in self.json_conf["scoring"][param] and self.json_conf["scoring"][param]["filter"] != {}): - check = self.evaluate(tid_metric, self.json_conf["scoring"][param]["filter"]) + if "metric" not in self.json_conf["scoring"][param]["filter"]: + metric_to_evaluate = tid_metric + else: + metric_key = self.json_conf["scoring"][param]["filter"]["metric"] + if not hasattr(self.transcripts[tid], metric_key): + raise KeyError("Asked for an invalid metric in filter: {}".format(metric_key)) + metric_to_evaluate = getattr(self.transcripts[tid], metric_key) + check = self.evaluate(metric_to_evaluate, self.json_conf["scoring"][param]["filter"]) if check is True: if use_raw is True: