From 2a17f973e6c3c529db83ab99fffc830f1d3489f7 Mon Sep 17 00:00:00 2001
From: Mattia Mancini <mancini@astron.nl>
Date: Tue, 14 May 2019 09:49:57 +0000
Subject: [PATCH] SSB-44: refactored to address reviewer suggestions

---
 .../bin/holography_process.py                 | 82 +++++++++++--------
 1 file changed, 48 insertions(+), 34 deletions(-)

diff --git a/CAL/CalibrationProcessing/bin/holography_process.py b/CAL/CalibrationProcessing/bin/holography_process.py
index 6722662418b..224d1b234b4 100644
--- a/CAL/CalibrationProcessing/bin/holography_process.py
+++ b/CAL/CalibrationProcessing/bin/holography_process.py
@@ -3,12 +3,36 @@ import argparse
 import sys
 import os
 import lofar.calibration.common.datacontainers as datacontainers
-import lofar.calibration.processing as processing
+from lofar.calibration.processing.solver import solve_gains_per_datatable
+from lofar.calibration.processing.averaging import average_data,\
+    weighted_average_dataset_per_station
+from lofar.calibration.processing.normalize import normalize_beams_by_central_one
 import logging
 
+import functools
+
 logger = logging.getLogger('holography_process')
 
 
+def log_step_execution(step_description):
+    def log_step_decorator(function):
+        @functools.wraps(function)
+        def wrapper(*args, **kwargs):
+            logger.info('Performing step %s', step_description)
+            try:
+                result = function(*args, **kwargs)
+                logger.info('Step %s performed', step_description)
+                return result
+
+            except Exception as e:
+                logger.exception('exception occurred performing step %s: %s',
+                                 step_description, e)
+                raise e
+
+        return wrapper
+    return log_step_decorator
+
+
 def setup_argument_parser():
     """
 
@@ -33,6 +57,7 @@ def parse_command_arguments(arguments):
     return parser.parse_args(arguments)
 
 
+@log_step_execution('load')
 def loading(path):
     """
 
@@ -41,16 +66,11 @@ def loading(path):
     :return:
     :rtype: datacontainers.HolographyDataset
     """
-
-    logger.info('loading dataset from %s', path)
-    if not os.path.exists(path):
-        raise Exception('Path not found')
-
     dataset = datacontainers.HolographyDataset.load_from_file(path)
-    logger.info('dataset from path %s loaded', path)
     return dataset
 
 
+@log_step_execution('normalize')
 def normalize_step(dataset, input_datatable):
     """
 
@@ -60,17 +80,14 @@ def normalize_step(dataset, input_datatable):
     :return:
     :rtype: dict(dict(dict(numpy.ndarray)))
     """
-    logger.info('normalizing dataset')
-    output_datatable = \
-        processing.normalize_beams_by_central_one(dataset, input_datatable, dataset.central_beamlets)
-    if dataset.derived_data is None:
-        dataset.derived_data = dict()
-
+    output_datatable = normalize_beams_by_central_one(dataset,
+                                                      input_datatable,
+                                                      dataset.central_beamlets)
     dataset.derived_data['NORMALIZED'] = output_datatable
-    logger.info('dataset normalized')
     return output_datatable
 
 
+@log_step_execution('time average')
 def time_averaging_step(dataset, input_datatable):
     """
 
@@ -80,17 +97,12 @@ def time_averaging_step(dataset, input_datatable):
     :return:
     :rtype: dict(dict(dict(numpy.ndarray)))
     """
-    logger.info('time averaging dataset')
-    output_datable = \
-        processing.averaging.average_data(input_datatable)
-    if dataset.derived_data is None:
-        dataset.derived_data = dict()
-    logger.info('dataset time averaged')
-
+    output_datable = average_data(input_datatable)
     dataset.derived_data['TIME_AVERAGED'] = output_datable
     return output_datable
 
 
+@log_step_execution('station average')
 def station_averaging_step(dataset, input_datatable):
     """
 
@@ -100,16 +112,14 @@ def station_averaging_step(dataset, input_datatable):
     :return:
     :rtype: dict(dict(dict(numpy.ndarray)))
     """
-    logger.info('averaging dataset per reference station')
-    output_datable = \
-        processing.averaging.weighted_average_dataset_per_station(dataset, input_datatable)
+    output_datable = weighted_average_dataset_per_station(dataset, input_datatable)
     if dataset.derived_data is None:
         dataset.derived_data = dict()
-    logger.info('dataset averaged for reference station')
     dataset.derived_data['STATION_AVERAGED'] = output_datable
     return output_datable
 
 
+@log_step_execution('solving gains')
 def compute_gains_step(dataset, input_datatable, direct_complex=True):
     """
 
@@ -119,32 +129,36 @@ def compute_gains_step(dataset, input_datatable, direct_complex=True):
     :return:
     :rtype: dict(dict(dict(numpy.ndarray)))
     """
-    logger.info('computing gains per dataset')
-    output_datable = \
-        processing.solver.solve_gains_per_datatable(dataset, input_datatable, direct_complex=direct_complex)
+    output_datable = solve_gains_per_datatable(dataset, input_datatable, direct_complex=direct_complex)
     if dataset.derived_data is None:
         dataset.derived_data = dict()
-    logger.info('gains per dataset computed')
     dataset.derived_data['GAINS'] = output_datable
     return output_datable
 
 
+@log_step_execution('save')
 def store_step(dataset, filepath):
     absolute_filepath = os.path.abspath(filepath)
-    logger.info('storing dataset in path %s', filepath)
     dataset.store_to_file(absolute_filepath)
-    logger.info('stored dataset in path %s', filepath)
 
 
+def prepare_dataset_for_processing(dataset: datacontainers.HolographyDataset):
+    """
+    :param dataset:
+    :return: None
+    """
+    if dataset.derived_data is None:
+        dataset.derived_data = dict()
+
 def execute_processing(arguments):
     dataset = loading(arguments.input_path)
-
+    prepare_dataset_for_processing(dataset)
     normalized_data = normalize_step(dataset, dataset.data)
     averaged_data = time_averaging_step(dataset, normalized_data)
     station_averaged_data = station_averaging_step(dataset, averaged_data)
-    logger.info('storing datatafile in %s', os.path.abspath(arguments.output_path))
+
     store_step(dataset, arguments.output_path)
-    gains = compute_gains_step(dataset, station_averaged_data)
+    _ = compute_gains_step(dataset, station_averaged_data)
     store_step(dataset, arguments.output_path)
 
 
-- 
GitLab