"""Gathers the information together from the tclean return value in a way that makes it easier to query for exactly what you want.
The structure for this nested dictionary is:
1. To get the number of available channels, and the ids of those channels:
nchans = len(summ_min[0].keys())
avail_chans = summ_min[0].keys()
2. To get the number of iterations done on the main field, fifth channel, first stokes plane, during the middle minor cycle:
field0 = summ_min[0] # field 0 is the main field
chan = field0.keys()[5] # channel index doesn't necessarily start at 0
stoke = field0[chan].keys()[0] # stokes index doesn't necessarily start at 0
ncycles = len(field0[chan][stoke]['iterDone'])
itersDone = field0[chan][stoke]['iterDone'][ncycles/2]
3. To get the available minor cycle summary statistics:
stoke0 = field0[chan0].keys()[0]
availSummStats = field0[field0][stoke0].keys()
rowDescriptionsOldOrder = ["iterDone", "peakRes", "modelFlux", "cycleThresh", "deconId", "chan", "stoke", "cycleStartIters", "startIterDone", "startPeakRes", "startModelFlux", "startPeakResNM", "peakResNM", "masksum", "mpiServer", "peakMem", "runtime", "multifieldId", "stopCode"]
rowDescriptions13683 = ["iterDone", "peakRes", "modelFlux", "cycleThresh", "deconId", "chan"]
rowDescriptions = ["startIterDone", "iterDone", "startPeakRes", "peakRes", "startModelFlux", "modelFlux", "startPeakResNM", "peakResNM", "cycleThresh", "cycleStartIters", "masksum", "mpiServer", "peakMem", "runtime", "stopCode"]
rowStartDescs = ["startIterDone", "startPeakRes", "startModelFlux", "startPeakResNM"]
def convertMatrix(summaryminor_matrix, calc_iterdone_deltas=None, keep_startvals=None):
if summaryminor_matrix.shape[1] == 0:
field_ids = SummaryMinor._getFieldIds(summaryminor_matrix)
for fieldId in field_ids:
singleFieldMatrix = SummaryMinor._getSingleFieldMatrix(summaryminor_matrix, field_ids[fieldId])
ret[fieldId] = SummaryMinor._convertSingleFieldMatrix(singleFieldMatrix, calc_iterdone_deltas, keep_startvals)
elif len(field_ids) == 1:
ret[field_ids[0]] = SummaryMinor._convertSingleFieldMatrix(summaryminor_matrix, calc_iterdone_deltas, keep_startvals)
raise RuntimeError("No multifield ids were found. Failed to parse summary minor matrix after tclean finished running.")
def _convertSingleFieldMatrix(single_field_matrix, calc_iterdone_deltas=None, keep_startvals=None):
if single_field_matrix.shape[1] == 0:
summaryminor_dict = SummaryMinor.indexMinorCycleSummaryBySubimage(single_field_matrix)
percycleiters_dict = SummaryMinor._getPerCycleDict(copy.deepcopy(summaryminor_dict), calc_iterdone_deltas, keep_startvals)
return percycleiters_dict
def _getFieldIds(matrix):
""" Get a sorted list of available outlier field ids in the given matrix """
availRows = SummaryMinor.getRowDescriptionsOldOrder()
if not "multifieldId" in availRows:
multifieldIdx = availRows.index("multifieldId")
fieldIds = sorted(np.unique(matrix[multifieldIdx,:]).tolist())
fieldIds = list(map(lambda x: int(x), fieldIds))