From c99e290389b7cbab05177e48407697478b608fe0 Mon Sep 17 00:00:00 2001 From: Joost van Griethuysen Date: Mon, 9 Oct 2017 16:36:51 +0200 Subject: [PATCH] LOG: Add logger handler to pykwalify if none is defined When parameter validation fails, PyKwalify logs an error. However, by default, no handlers are configured (as pyradiomics defines it's handlers at the 'radiomics' level, not the root logger). Check if either the root logger or PyKwalify has a logger handler configured. If not, add the first radiomics handler (the stream handler with output to stderr), so the error is logged if the parameter validation fails. Fixes #304 --- radiomics/featureextractor.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/radiomics/featureextractor.py b/radiomics/featureextractor.py index 92e9d6a0..2ce166e2 100644 --- a/radiomics/featureextractor.py +++ b/radiomics/featureextractor.py @@ -10,8 +10,8 @@ import SimpleITK as sitk import six -import radiomics -from radiomics import generalinfo, getFeatureClasses, getImageTypes, getParameterValidationFiles, imageoperations +from radiomics import enableCExtensions, generalinfo, getFeatureClasses, getImageTypes, getParameterValidationFiles, \ + imageoperations class RadiomicsFeaturesExtractor: @@ -120,6 +120,11 @@ def loadParams(self, paramsFile): If supplied file does not match the requirements (i.e. unrecognized names or invalid values for a setting), a pykwalify error is raised. """ + # Ensure pykwalify.core has a log handler (needed when parameter validation fails) + if len(pykwalify.core.log.handlers) == 0 and len(logging.getLogger().handlers) == 0: + # No handler available for either pykwalify or root logger, provide first radiomics handler (outputs to stderr) + pykwalify.core.log.addHandler(logging.getLogger('radiomics').handlers[0]) + schemaFile, schemaFuncs = getParameterValidationFiles() c = pykwalify.core.Core(source_file=paramsFile, schema_files=[schemaFile], extensions=[schemaFuncs]) params = c.validate() @@ -231,7 +236,7 @@ def enableImageTypes(self, **enabledImagetypes): To disable input images, use :py:func:`enableInputImageByName` or :py:func:`disableAllInputImages` instead. - :param inputImages: dictionary, key is imagetype (original, wavelet or log) and value is custom settings + :param enabledImagetypes: dictionary, key is imagetype (original, wavelet or log) and value is custom settings (dictionary) """ self.logger.debug('Updating enabled images types with %s', enabledImagetypes) @@ -307,7 +312,7 @@ def execute(self, imageFilepath, maskFilepath, label=None): """ # Enable or disable C extensions for high performance matrix calculation. Only logs a message (INFO) when setting is # successfully changed. If an error occurs, full-python mode is forced and a warning is logged. - radiomics.enableCExtensions(self.settings['enableCExtensions']) + enableCExtensions(self.settings['enableCExtensions']) if self.geometryTolerance != self.settings.get('geometryTolerance'): self._setTolerance()