Source code for pipeline.hifv.tasks.circfeedpolcal.renderer

import contextlib
import os

from . import display as polarization
import pipeline.infrastructure.filenamer as filenamer
import pipeline.infrastructure.logging as logging
import pipeline.infrastructure.renderer.basetemplates as basetemplates
import pipeline.infrastructure.renderer.weblog as weblog

LOG = logging.get_logger(__name__)


[docs]class VLASubPlotRenderer(object): def __init__(self, context, result, plots, json_path, template, filename_prefix): self.context = context self.result = result self.plots = plots self.ms = os.path.basename(self.result.inputs['vis'][0]) self.template = template self.filename_prefix = filename_prefix self.summary_plots = {} self.ampfreq_subpages = {} self.ampfreq_subpages[self.ms] = filenamer.sanitize('ampfreq' + '-%s.html' % self.ms) if os.path.exists(json_path): with open(json_path, 'r') as json_file: self.json = json_file.readlines()[0] else: self.json = '{}' def _get_display_context(self): return {'pcontext': self.context, 'result': self.result, 'plots': self.plots, 'dirname': self.dirname, 'json': self.json, 'ampfreq_subpages': self.ampfreq_subpages} @property def dirname(self): stage = 'stage%s' % self.result.stage_number return os.path.join(self.context.report_dir, stage) @property def filename(self): filename = filenamer.sanitize(self.filename_prefix + '-%s.html' % self.ms) return filename @property def path(self): return os.path.join(self.dirname, self.filename)
[docs] def get_file(self): if not os.path.exists(self.dirname): os.makedirs(self.dirname) file_obj = open(self.path, 'w') return contextlib.closing(file_obj)
[docs] def render(self): display_context = self._get_display_context() t = weblog.TEMPLATE_LOOKUP.get_template(self.template) return t.render(**display_context)
[docs]class T2_4MDetailsCircfeedpolcalRenderer(basetemplates.T2_4MDetailsDefaultRenderer): def __init__(self, uri='circfeedpolcal.mako', description='CircFeed Polarization', always_rerender=False): super(T2_4MDetailsCircfeedpolcalRenderer, self).__init__(uri=uri, description=description, always_rerender=always_rerender)
[docs] def update_mako_context(self, ctx, context, result): weblog_dir = os.path.join(context.report_dir, 'stage%s' % result.stage_number) polarization_plots = {} ampfreq_subpages = {} for r in result: if r.final: ktable = r.final[0].gaintable Dtable = r.final[1].gaintable Xtable = r.final[2].gaintable plotter = polarization.CircFeedPolCalChart(context, r, caltable=ktable, yaxis='delay', xaxis='freq', antenna=r.refant, caption='RL delay vs. freq. ') plots = plotter.plot() # ------------- plotter = polarization.CircFeedPolCalChart(context, r, caltable=Xtable, yaxis='phase', xaxis='freq', antenna=r.refant, caption='RL phase offset vs. freq. ') plots.extend(plotter.plot()) # ------------- plotter = polarization.CircFeedPolCalChart(context, r, caltable=Dtable, yaxis='amp', xaxis='Antenna1', antenna='', caption='Inst. pol. amp vs. antenna') plots.extend(plotter.plot()) # ------------- ms = os.path.basename(r.inputs['vis']) polarization_plots[ms] = plots # generate amp vs. frequency plots per antenna and JSON file plotter = polarization.ampfreqPerAntennaChart(context, result, Dtable) plots = plotter.plot() json_path = plotter.json_filename # write the html for each MS to disk renderer = VLASubPlotRenderer(context, result, plots, json_path, 'ampfreq_plots.mako', 'ampfreq') with renderer.get_file() as fileobj: fileobj.write(renderer.render()) ampfreq_subpages[ms] = renderer.filename ctx.update({'dirname' : weblog_dir, 'polarization_plots' : polarization_plots, 'ampfreq_subpages' : ampfreq_subpages}) return ctx