Source code for compare_section_table
# -*- coding: utf-8 -*-
"""
"""
import warnings
import datetime
import odml
[docs]class CompareSectionTable():
"""
class to create a table in which you compare different sections of a odml-
file wich have the same properties
:param include_all: if set to false, only those properties which exist in
every chosen section will be shown
:param switch: when set to True, the table will be switched so the
sections are in the rows and the properties in the columns
:type include_all: bool
:type switch: bool
"""
def __init__(self):
self.show_odml_warnings = False
self._odmldoc = None
self._sel_fun = lambda x: True
self.include_all = True
self.switch = False
def _build_table(self):
"""
function to build the table with the names of the sections in the
header
:return fieldnames: header of the table
:return table: nested dictionary of the rows in the table
:type fieldnames: list
:type table: dictionary
"""
properties = []
sections = []
table = []
prop_num = 0
sec_num = 0
sec_ind = 0
for sect in self._odmldoc.itersections(filter_func=self._sel_fun):
sections.append(sect.name)
for prop in sect.properties:
if prop.name not in properties:
properties.append(prop.name)
sec_num = len(sections)
prop_num = len(properties)
table = [[None for p in list(range(prop_num))] for s in list(range(sec_num))]
for sect in self._odmldoc.itersections(filter_func=self._sel_fun):
for prop in sect.properties:
val = prop.values
if val:
# for formatting reasons uncertainties and units are ignored for datetimes
if isinstance(val[0], (datetime.date, datetime.time, datetime.datetime)):
table[sec_ind][properties.index(prop.name)] = val[0]
else:
value, uncertainty, unit = str(val[0]), '', ''
if len(prop.values) > 1:
value += ', ...'
if prop.uncertainty:
uncertainty = f'+-{prop.uncertainty})'
value = f'({value}'
if prop.unit:
unit = prop.unit
table[sec_ind][properties.index(prop.name)] = f'{value}{uncertainty}{unit}'
if len(prop.values) > 1:
# table[sec_ind][properties.index(prop.name)] += ', ...'
warnings.warn('Property %s contains %i values. Only showing first one in '
'comparison table' % (prop.name, len(prop.values)))
sec_ind += 1
if self.include_all:
pass
else:
to_delete = [properties[i] for i in list(range(len(table[0])))
if None in [s[i] for s in table]]
for prop in to_delete:
for section in table:
del section[properties.index(prop)] # CHANGE!!
properties.remove(prop)
return properties, sections, table
[docs] def load_from_file(self, load_from):
"""
load the data for the table from an odml-file
:param load_from: Name of the odml-file to load from
:type load_from: string
"""
self._odmldoc = odml.load(load_from, show_warnings=self.show_odml_warnings)
# resolve links and includes
self._odmldoc.finalize()
[docs] def choose_sections_startwith(self, startwith):
"""
choose all sections with the same beginning
:param startwith: beginning of the sectionname of the sections that
will be compared
:type startwith: string
"""
self._sel_fun = lambda x: x.name.startswith(startwith)
# TODO: change from args to list for easier use of functions
[docs] def choose_sections(self, *args):
"""
choose all sections out of the list of sectionnames you give this
function
:param args: names of the sections
:type args: strings
:Example:
a.choose_sections('section1', 'section2', 'section4')
"""
self._sel_fun = lambda x: x.name in args
[docs] def write2file(self, save_to):
"""
write the table to the specific file
:param save_to: path and name where the file will be saved
:type save_to: string
:raise NotImplementedError: Implemented in the subclass
"""
# TODO: Error Message if no document loaded!!
raise NotImplementedError()