@@ -1648,11 +1648,19 @@ def events_time2run(self, rowindex: int, colindex: int):
16481648 LOGGER .verbose (f"User sets events['units/sec'] from '{ timeunit } ' to '{ value } ' for { self .target_run } " )
16491649 self .target_run .events ['time' ]['unit' ] = value
16501650 elif key == 'start' :
1651- value = ast .literal_eval (value ) # Convert stringified list back to list
1651+ value = ast .literal_eval (value ) # Convert stringified dict back to dict
1652+ for key , val in value .copy ().items ():
1653+ if key not in self .target_run .eventsparser ().logtable :
1654+ key_ = self .get_input_column (key )
1655+ if key_ == key :
1656+ raise KeyError
1657+ value [key_ ] = value .pop (key )
16521658 LOGGER .verbose (f"User sets events['{ key } '] from '{ start } ' to '{ value } ' for { self .target_run } " )
16531659 self .target_run .events ['time' ]['start' ] = value
16541660 except (ValueError , SyntaxError ):
16551661 QMessageBox .warning (self , 'Input error' , f"Please enter a valid '{ value } ' value" )
1662+ except KeyError as key_error :
1663+ pass
16561664
16571665 # Refresh the events tables, i.e. delete empty rows or add a new row if a key is defined on the last row
16581666 _ ,_ ,_ ,_ ,events_data = self .run2data ()
@@ -1698,8 +1706,13 @@ def events_rows2run(self, rowindex: int, colindex: int):
16981706 if mapping :
16991707 try :
17001708 mapping = ast .literal_eval (mapping ) # Convert stringified dict back to dict
1701- for key , pattern in mapping .items ():
1709+ for key , pattern in mapping .copy (). items ():
17021710 re .compile (pattern )
1711+ if colindex == 0 and key not in self .target_run .eventsparser ().logtable :
1712+ key_ = self .get_input_column (key )
1713+ if key_ == key :
1714+ raise KeyError
1715+ mapping [key_ ] = mapping .pop (key )
17031716 LOGGER .verbose (f"User sets events['rows'][{ rowindex } ] to { mapping } ' for { self .target_run } " )
17041717 if rowindex == nrows - 1 :
17051718 self .target_run .events ['rows' ].append ({'condition' if colindex == 0 else 'cast' : mapping })
@@ -1709,6 +1722,8 @@ def events_rows2run(self, rowindex: int, colindex: int):
17091722 QMessageBox .warning (self , 'Input error' , f"Please enter a valid '{ mapping } ' dictionary\n \n { dict_error } " )
17101723 except re .error as pattern_error :
17111724 QMessageBox .warning (self , 'Input error' , f"Please enter a valid '{ mapping } ' pattern:\n \n { pattern_error } " )
1725+ except KeyError as key_error :
1726+ pass
17121727 elif colindex == 0 and rowindex < nrows - 1 : # Remove the row
17131728 del self .target_run .events ['rows' ][rowindex ]
17141729 else :
@@ -1719,21 +1734,21 @@ def events_rows2run(self, rowindex: int, colindex: int):
17191734 self .fill_table (self .events_table , events_data ['table' ])
17201735 self .fill_table (self .events_rows , events_data ['rows' ])
17211736
1722- def events_columns2run (self , rowindex : int , colindex : int ):
1737+ def events_columns2run (self , rowindex : int , colindex : int , _input : str = '' ):
17231738 """Events value has been changed. Read the data from the event 'columns' table and, if OK, update the target run"""
17241739
17251740 # events_data['columns'] = [[{'source1': target1}],
17261741 # [{'source2': target2}],
17271742 # [..]]
1728- input = self .events_columns .item (rowindex , 0 ).text ().strip () if self .events_columns .item (rowindex , 0 ) else ''
1743+ input = self .events_columns .item (rowindex , 0 ).text ().strip () if self .events_columns .item (rowindex , 0 ) and not _input else _input
17291744 output = self .events_columns .item (rowindex , 1 ).text ().strip () if self .events_columns .item (rowindex , 1 ) else ''
17301745 nrows = self .events_columns .rowCount ()
17311746
17321747 if colindex == 0 and input and not output :
17331748 output = input
17341749
17351750 if not input or input in self .target_run .eventsparser ().logtable :
1736- LOGGER .verbose (f"User sets the column { colindex } to: '{ input } : { output } ' for { self .target_run } " )
1751+ LOGGER .verbose (f"User sets the events column to: '{ input } : { output } ' for { self .target_run } " )
17371752 if output : # Evaluate and store the data
17381753 if rowindex == nrows - 1 :
17391754 self .target_run .events ['columns' ].append ({output : input })
@@ -1742,14 +1757,24 @@ def events_columns2run(self, rowindex: int, colindex: int):
17421757 self .target_run .events ['columns' ][rowindex ] = {output : input }
17431758 elif rowindex < nrows - 1 : # Remove the row
17441759 del self .target_run .events ['columns' ][rowindex ]
1745- else :
1746- QMessageBox .warning (self , 'Input error' , f"The '{ input } ' input column does not exist, please enter a valid name" )
1760+ elif not _input :
1761+ self .events_columns2run (rowindex , - 1 , self .get_input_column (input ))
1762+ return
17471763
17481764 # Refresh the events tables, i.e. delete empty rows or add a new row if a key is defined on the last row
17491765 _ ,_ ,_ ,_ ,events_data = self .run2data ()
17501766 self .fill_table (self .events_columns , events_data ['columns' ])
17511767 self .fill_table (self .events_table , events_data ['table' ])
17521768
1769+ def get_input_column (self , input : str ) -> str :
1770+ """Ask the user to pick an input column from the log table"""
1771+
1772+ # Get column names
1773+ columns = self .target_run .eventsparser ().logtable .columns .tolist ()
1774+ column , ok = QInputDialog .getItem (self , 'Input error' , f"Your '{ input } ' input column does not exist, please choose one of the existing columns:" , columns , 0 , False )
1775+
1776+ return column if ok else input
1777+
17531778 def edit_events (self ):
17541779 """Edit button clicked"""
17551780
0 commit comments