From c6906a3831258c5fcf61d69f66ff240661aeac04 Mon Sep 17 00:00:00 2001 From: Alho Markku J Date: Fri, 27 Sep 2024 16:50:22 +0300 Subject: [PATCH 1/3] Check which datareducers are available based on the reader object with VlsvReader.list(datareducer=True) --- pyVlsv/vlsvreader.py | 75 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/pyVlsv/vlsvreader.py b/pyVlsv/vlsvreader.py index 1deccd9b..5b195add 100644 --- a/pyVlsv/vlsvreader.py +++ b/pyVlsv/vlsvreader.py @@ -189,6 +189,10 @@ def __init__(self, file_name, fsGridDecomposition=None): self.variable_cache = {} # {(varname, operator):data} + self.__available_reducers = set() # Set of strings of datareducer names + self.__unavailable_reducers = set() # Set of strings of datareducer names + self.__current_reducer_tree_nodes = set() # Set of strings of datareducer names + self.__read_xml_footer() # vertex-indices is a 3-tuple of integers self.__dual_cells = {(0,0,0):(1,1,1,1,1,1,1,1)} # vertex-indices : 8-tuple of cellids at each corner (for x for y for z) @@ -540,6 +544,64 @@ def __set_cell_offset_and_blocks_nodict(self, pop="proton"): for index,cellid in enumerate(self.__cells_with_blocks[pop]): self.__order_for_cellid_blocks[pop][cellid]=index + def __check_datareducer(self, name, reducer): + + reducer_ok = True + if name in self.__available_reducers: return True + if name in self.__unavailable_reducers: return False + if name in self.__current_reducer_tree_nodes: raise RuntimeError("Cyclical datareduction deteced with "+name+", this is weird and undefined!") + + self.__current_reducer_tree_nodes.add(name) + + for var in reducer.variables: + if len(var) > 3 and var[0:3] == "pop": + in_vars = False + for pop in self.active_populations: + popvar = pop+var[3:] + if popvar in self.__available_reducers: + in_vars = True + elif popvar in self.__unavailable_reducers: + in_vars = False + else: + in_vars = self.check_variable(popvar) + + # print(popvar," is in vars: ",in_vars) + if in_vars: + self.__available_reducers.add(popvar) + break + else: + self.__unavailable_reducers.add(popvar) + else: + in_vars = self.check_variable(var) + + reducer_ok = reducer_ok and in_vars + if in_vars: + continue + + in_reducers = ((var in datareducers.keys()) or + (var in multipopdatareducers.keys()) or + (var in v5reducers.keys()) or + (var in multipopv5reducers.keys())) + if in_reducers: + reducer = None + for reducer_reg in [datareducers, multipopdatareducers, v5reducers, multipopv5reducers]: + try: + reducer = reducer_reg[var] + except: + pass + if reducer is None: # Not in variables not in datareducers, break + reducer_ok = False + break + reducer_ok = reducer_ok and self.__check_datareducer(var, reducer) + + if not reducer_ok: break + + if reducer_ok: self.__available_reducers.add(name) + else: self.__unavailable_reducers.add(name) + + return reducer_ok + + def list(self, parameter=True, variable=True, mesh=False, datareducer=False, operator=False, other=False): ''' Print out a description of the content of the file. Useful for interactive usage. Default is to list parameters and variables, query selection can be adjusted with keywords: @@ -562,16 +624,21 @@ def list(self, parameter=True, variable=True, mesh=False, datareducer=False, ope print("tag = VARIABLE") for child in self.__xml_root: if child.tag == "VARIABLE" and "name" in child.attrib: - print(" ", child.attrib["name"]) + print(" ", child.attrib["name"], "check_variable ", self.check_variable( child.attrib["name"])) if mesh: print("tag = MESH") for child in self.__xml_root: if child.tag == "MESH" and "name" in child.attrib: print(" ", child.attrib["name"]) if datareducer: - print("Datareducers:") - for name in datareducers: - print(" ",name, " based on ", datareducers[name].variables) + print("Datareducers (replace leading pop with a population name):") + + for reducer_reg in [datareducers, multipopdatareducers, v5reducers, multipopv5reducers]: + for name, reducer in reducer_reg.items(): + self.__current_reducer_tree_nodes.clear() + if self.__check_datareducer(name,reducer): + print(" ",name, " based on ", reducer_reg[name].variables) + if operator: print("Data operators:") for name in data_operators: From 602722a160d03b95234013b741b06db4150ee08c Mon Sep 17 00:00:00 2001 From: Alho Markku J Date: Fri, 27 Sep 2024 16:57:32 +0300 Subject: [PATCH 2/3] Remove debug output --- pyVlsv/vlsvreader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyVlsv/vlsvreader.py b/pyVlsv/vlsvreader.py index 5b195add..3ca20ead 100644 --- a/pyVlsv/vlsvreader.py +++ b/pyVlsv/vlsvreader.py @@ -624,7 +624,7 @@ def list(self, parameter=True, variable=True, mesh=False, datareducer=False, ope print("tag = VARIABLE") for child in self.__xml_root: if child.tag == "VARIABLE" and "name" in child.attrib: - print(" ", child.attrib["name"], "check_variable ", self.check_variable( child.attrib["name"])) + print(" ", child.attrib["name"]) if mesh: print("tag = MESH") for child in self.__xml_root: From 1651ac4d3ac15fe2fb5133660c3780a0c94ce7cd Mon Sep 17 00:00:00 2001 From: Alho Markku J Date: Fri, 27 Sep 2024 17:33:07 +0300 Subject: [PATCH 3/3] Fridays pretty-print upgrades --- pyVlsv/vlsvreader.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pyVlsv/vlsvreader.py b/pyVlsv/vlsvreader.py index 3ca20ead..e068c0c1 100644 --- a/pyVlsv/vlsvreader.py +++ b/pyVlsv/vlsvreader.py @@ -633,11 +633,19 @@ def list(self, parameter=True, variable=True, mesh=False, datareducer=False, ope if datareducer: print("Datareducers (replace leading pop with a population name):") + reducer_max_len = 0 + units_max_len = 0 + for reducer_reg in [datareducers, multipopdatareducers, v5reducers, multipopv5reducers]: + for k in reducer_reg.keys(): + reducer_max_len = max(reducer_max_len, len(k)) + units_max_len = max(units_max_len, len(reducer_reg[k].units)) + + for reducer_reg in [datareducers, multipopdatareducers, v5reducers, multipopv5reducers]: for name, reducer in reducer_reg.items(): self.__current_reducer_tree_nodes.clear() if self.__check_datareducer(name,reducer): - print(" ",name, " based on ", reducer_reg[name].variables) + print(((" %-"+str(reducer_max_len)+"s")% name) + ("\t%-"+str(units_max_len+2)+"s")%("["+reducer.units+"]")+"\t based on " + str(reducer_reg[name].variables)) if operator: print("Data operators:")