8 Commits 3bc95c9509 ... 48d8628afc

Author SHA1 Message Date
  a7exd 48d8628afc Slightly improve code readability 2 years ago
  a7exd 39f6ba2f1d Change getting quakes, sql query time in timestamp now 2 years ago
  a7exd 6c5b5d7395 fix obtaining region of quake from db, add filter by magnitude for quakes 2 years ago
  a7exd 6c863c0ddc fix obtain quakes and set data into the table 2 years ago
  a7exd 6f8e245616 fix type hinting of storages 2 years ago
  a7exd 3031a08b74 change ui table for data representation 2 years ago
  a7exd 03e6763aa1 fix structures 2 years ago
  a7exd da73ce5edf fix inheritance of storages 2 years ago
6 changed files with 148 additions and 169 deletions
  1. 35 35
      gui.py
  2. 21 14
      quake_storages.py
  3. 5 3
      quake_structures.py
  4. 76 44
      quakes_from_db.py
  5. 4 47
      ui/main_window.ui
  6. 7 26
      ui/main_window_ui.py

+ 35 - 35
gui.py

@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 from pathlib import Path
-from typing import Generator, Tuple, List
+from typing import Generator, List
 
 from PySide6.QtWidgets import (QDialog, QMainWindow, QMessageBox,
                                QFileDialog, QTableWidgetItem)
@@ -8,11 +8,10 @@ from PySide6.QtWidgets import (QDialog, QMainWindow, QMessageBox,
 from exceptions import NoSelectedQuakesError, ConnectDatabaseError, \
     FormatToStrError
 from quake_storages import save_quakes, storages
-from quake_structures import Quake
 from ui.main_window_ui import Ui_MainWindow
 from ui.db_conn_ui import Ui_Dialog
 import config
-from quakes_from_db import get_data, get_quakes
+from quakes_from_db import get_quakes, QueryParams
 import logging.config
 
 
@@ -28,7 +27,7 @@ class Window(QMainWindow, Ui_MainWindow):
         self.setupUi(self)
         self._connect_signals_slots()
         self.file_filter = ';;'.join(config.FILES_FILTERS.values())
-        self.raw_quakes_data = None
+        self.quakes = None
         self.statusBar().showMessage('Ready')
 
     def search_quakes(self) -> None:
@@ -36,9 +35,11 @@ class Window(QMainWindow, Ui_MainWindow):
         try:
             log.info(f'Start search for records. '
                      f'DB connection config: {config.DB}.')
-            self.raw_quakes_data = get_data(self._get_query_params())
+            query_params = self._get_query_params()
+            log.info(f'{query_params}')
+            self.quakes = get_quakes(query_params)
             self._set_data_into_table()
-            self.statusBar().showMessage(f'Searched records: '
+            self.statusBar().showMessage(f'Searched quakes: '
                                          f'{self.tableWidget.rowCount()}')
             self.progressBar.setValue(100)
         except ConnectDatabaseError as exc:
@@ -49,18 +50,20 @@ class Window(QMainWindow, Ui_MainWindow):
                                             f'(File->Settings->Connection) '
                                             f'and try again!')
 
-    def get_selected_quakes(self) -> Tuple[Quake, ...]:
+    def get_selected_quakes(self) -> Generator:
         """Obtain tuple of Quake() according to selected quakes
         from the table of GUI"""
-        selected_data = self._get_selected_data()
-        return get_quakes(selected_data)
+        selected_id = self._get_selected_quakes_id()
+        return (quake for quake in self.quakes
+                if quake.id in selected_id)
 
     def save_file(self) -> None:
         """Save function depending on ext of file."""
         self.progressBar.setValue(10)
         dialog = QFileDialog(self)
-        if not (file := dialog.getSaveFileName(self, dir='untitled.txt',
-                                               filter=self.file_filter)[0]):
+        file = dialog.getSaveFileName(self, dir='untitled.txt',
+                                      filter=self.file_filter)[0]
+        if not file:
             return self._show_error_dialog('File is not selected! '
                                            'Select a file and try again, '
                                            'please.')
@@ -69,7 +72,6 @@ class Window(QMainWindow, Ui_MainWindow):
         ext = file.suffix
         try:
             quakes = self.get_selected_quakes()
-            log.info(f'{len(quakes)} quakes are ready to save into the file')
             save_quakes(quakes, storages[ext](file))
             self.statusBar().showMessage('Writing into the file '
                                          'completed successfully.')
@@ -105,21 +107,22 @@ class Window(QMainWindow, Ui_MainWindow):
 
     def _set_data_into_table(self) -> None:
         self.tableWidget.setRowCount(0)
-        for quake_data in self.raw_quakes_data:
-            params_dict = {config.ALL_PARAMS[i]: quake_data[i]
-                           for i in range(len(quake_data))}
-            column_num = 0
+        for quake in self.quakes:
             row = self.tableWidget.rowCount()
             self.tableWidget.insertRow(row)
-            for param in config.GUI_TABLE_PARAMS:
+            quake_vals = (quake.id, quake.origin_dt, quake.lat, quake.lon,
+                          quake.depth, quake.magnitude.ML,
+                          quake.magnitude.MPSP, quake.reg)
+            for column, val in enumerate(quake_vals):
                 self.tableWidget.setItem(
-                    row, column_num, QTableWidgetItem(f'{params_dict[param]}'))
-                column_num += 1
-
-    def _get_selected_data(self) -> Generator:
-        selected_id = self._get_selected_quakes_id()
-        return (data for data in self.raw_quakes_data
-                for _id in selected_id if data[0] == _id)
+                    row, column, QTableWidgetItem(f'{val}'))
+            sta_ph_time = []
+            for sta in quake.stations:
+                sta_ph_time.append(
+                    ' '.join(
+                        (sta.name, sta.phase, f'{sta.phase_dt}')) + '\n')
+            self.tableWidget.setItem(
+                row, 8, QTableWidgetItem('\n'.join(sta_ph_time)))
 
     def _get_selected_quakes_id(self) -> List[str]:
         selected_items_amnt = len(self.tableWidget.selectedItems())
@@ -128,20 +131,17 @@ class Window(QMainWindow, Ui_MainWindow):
         if selected_items_amnt == 0 or selected_items_amnt % col_count != 0:
             raise NoSelectedQuakesError('Nothing is selected! At least one row'
                                         ' from the table must be selected!')
-        log.info(f'selected records amount: {selected_items_amnt / col_count}')
+        log.info(f'selected quakes amount: {selected_items_amnt / col_count}')
         return [self.tableWidget.selectedItems()[i].text()
                 for i in range(selected_items_amnt) if i % col_count == 0]
 
-    def _get_query_params(self) -> Tuple[str, ...]:
-        from_dt = self.from_dateTime.text()
-        to_dt = self.to_dateTime.text()
-        comment = self.comment_line.text()
-        sta = self.sta_line.text()
-        from_mag = f'{self.from_Mag.value()}'
-        to_mag = f'{self.to_Mag.value()}'
-        params = from_dt, to_dt, comment, sta, from_mag, to_mag
-        log.info(f'query params: {params}')
-        return params
+    def _get_query_params(self) -> QueryParams:
+        return QueryParams(from_dt=self.from_dateTime.text(),
+                           to_dt=self.to_dateTime.text(),
+                           comment=self.comment_line.text(),
+                           sta=self.sta_line.text(),
+                           from_mag=f'{self.from_Mag.value()}',
+                           to_mag=f'{self.to_Mag.value()}')
 
     def about(self) -> None:
         QMessageBox.about(

+ 21 - 14
quake_storages.py

@@ -16,25 +16,26 @@ from quake_structures import Quake
 class QuakesStorage(Protocol):
     """Interface of any storage for saving info of quakes"""
 
-    def save(self, quakes: Sequence[Quake]) -> None:
+    def save(self, quakes: Iterable[Quake]) -> None:
         raise NotImplementedError
 
 
-def save_quakes(quakes: Sequence[Quake], storage: QuakesStorage) -> None:
+def save_quakes(quakes: Iterable[Quake], storage: QuakesStorage) -> None:
     """Save quakes in the storage"""
     storage.save(quakes)
 
 
-class CatalogStorage:
+class CatalogStorage(QuakesStorage):
     """Store some quakes info as a catalog in an Excel file"""
 
     def __init__(self, file: Path):
         self._file = file
         self._init_storage()
         self.wb = openpyxl.load_workbook(self._file)
+        self._del_init_empty_worksheet()
         self.sheet: Worksheet
 
-    def save(self, quakes: Sequence[Quake]) -> None:
+    def save(self, quakes: Iterable[Quake]) -> None:
         for quake in quakes:
             if quake.lat is None or quake.lon is None:
                 continue
@@ -51,7 +52,7 @@ class CatalogStorage:
         origin_dt, lat, lon, _, avg_ml, avg_mpsp, depth = _format_common_attrs(
             quake)
         origin_d, origin_t = origin_dt.split()
-        stations_name = ', '.join(quake.get_stations_name())
+        stations_name = ', '.join(quake.stations_name)
         row = (origin_d, origin_t, lat, lon, depth, quake.reg, avg_ml,
                avg_mpsp, stations_name)
         self.sheet.append(row)
@@ -72,8 +73,14 @@ class CatalogStorage:
         else:
             self.sheet = self.wb.get_sheet_by_name(sheet_name)
 
+    def _del_init_empty_worksheet(self):
+        if ('Sheet' in self.wb.sheetnames) and (
+                (self.wb['Sheet'].max_row == 1) and
+                (self.wb['Sheet'].max_column == 1)):
+            del self.wb['Sheet']
 
-class BulletinStorage:
+
+class BulletinStorage(QuakesStorage):
     """Store some quakes info as a bulletin in a plain text file"""
 
     def __init__(self, file: Path):
@@ -86,7 +93,7 @@ class BulletinStorage:
         self.avg_mpsp = ''
         self.depth = ''
 
-    def save(self, quakes: Sequence[Quake]) -> None:
+    def save(self, quakes: Iterable[Quake]) -> None:
         with self._file.open('w', encoding='utf8') as f:
             amnt_quakes = 0
             for quake in quakes:
@@ -116,7 +123,7 @@ class BulletinStorage:
                               config.AMNT_COLUMN_SYMBOLS['quake_hdr'])
 
     def _get_quake_hdr(self, quake: Quake) -> str:
-        amnt_sta = str(len(quake.get_stations_name()))
+        amnt_sta = str(len(quake.stations_name))
         return _format_to_str(
             columns_data=(self.origin_dt, self.lat, self.lon, self.depth,
                           amnt_sta, self.mag, quake.reg),
@@ -137,7 +144,7 @@ class BulletinStorage:
         return res + '\n'
 
 
-class NASBulletinStorage:
+class NASBulletinStorage(QuakesStorage):
     """Store some info of each quake as a bulletin for NAS program
     in a separate plain text file with ext (*.bltn)"""
 
@@ -145,7 +152,7 @@ class NASBulletinStorage:
         self._path = path.joinpath(*path.parts[:-1])
         self.bltn_strings: List[str, ] = []
 
-    def save(self, quakes: Sequence[Quake]) -> None:
+    def save(self, quakes: Iterable[Quake]) -> None:
         for quake in quakes:
             self._get_rows(quake)
             if self.bltn_strings:
@@ -157,7 +164,7 @@ class NASBulletinStorage:
     def _get_rows(self, quake: Quake) -> None:
         self.bltn_strings.clear()
         if (quake.lat is not None and quake.lon is not None) \
-                or len(quake.get_stations_name()) > 4:
+                or len(quake.stations_name) > 4:
             dt = datetime.strftime(quake.origin_dt, '%Y %m %d %H %M %S.%f')[:-3]
             lat = f'{quake.lat:.2f}' if quake.lat else '-'
             lon = f'{quake.lon:.2f}' if quake.lon else '-'
@@ -169,14 +176,14 @@ class NASBulletinStorage:
                     f'{sta.name}    {sta.phase}={phase_dt}')
 
 
-class ArcGisStorage:
+class ArcGisStorage(QuakesStorage):
     """Store some quakes info in a plain text file
     for further processing in ArcGis program"""
 
     def __init__(self, file: Path):
         self._file = file
 
-    def save(self, quakes: Sequence[Quake]) -> None:
+    def save(self, quakes: Iterable[Quake]) -> None:
         with self._file.open('w', encoding='utf8') as f:
             f.write(' '.join(config.ArcGIS_HEADER) + '\n')
             for quake in quakes:
@@ -201,7 +208,7 @@ def _format_common_attrs(quake: Quake) -> Tuple[str, ...]:
     origin_dt = datetime.strftime(quake.origin_dt, '%d.%m.%Y %H:%M:%S.%f')[:-3]
     lat = f'{quake.lat:.2f}' if quake.lat else '-'
     lon = f'{quake.lon:.2f}' if quake.lon else '-'
-    mag = quake.get_magnitude()
+    mag = quake.magnitude
     avg_ml = f'{mag.ML:.1f}' if mag.ML else '-'
     avg_mpsp = f'{mag.MPSP:.1f}' if mag.MPSP else '-'
     preferred_mag = avg_ml if avg_ml != '-' else avg_mpsp

+ 5 - 3
quake_structures.py

@@ -7,12 +7,12 @@ from typing import NamedTuple, Tuple, Set
 
 @dataclass(slots=True)
 class Sta:
+    phase_dt: datetime
     name: str
     dist: float
     azimuth: float
     phase: str
     entry: str
-    phase_dt: datetime
     ampl: Decimal
     period: float
     mag_ML: float
@@ -35,13 +35,15 @@ class Quake:
     reg: str
     stations: Tuple[Sta, ...]
 
-    def get_stations_name(self) -> Set[str]:
+    @property
+    def stations_name(self) -> Set[str]:
         stations_name = set()
         for sta in self.stations:
             stations_name.add(sta.name)
         return stations_name
 
-    def get_magnitude(self) -> Magnitude:
+    @property
+    def magnitude(self) -> Magnitude:
         ml = n_ml = mpsp = n_mpsp = 0.0
         avg_ml = avg_mpsp = 0.0
         for sta in self.stations:

+ 76 - 44
quakes_from_db.py

@@ -1,68 +1,100 @@
 # -*- coding: utf-8 -*-
-from typing import Iterable, Tuple, List
+from typing import Tuple, List, NamedTuple
 from mysql.connector import connect, Error
-from mysql.connector.abstracts import MySQLConnectionAbstract
 import config
 from exceptions import ConnectDatabaseError
 from quake_structures import Quake, Sta
 from datetime import datetime
 
 
-def connect_decorator(func):
-    
-    def wrapper(args):
-        try:
-            with connect(**config.DB, connection_timeout=2) as conn:
-                return func(*args, conn=conn)
-        except Error as exc:
-            raise ConnectDatabaseError(exc.msg)
+class QueryParams(NamedTuple):
+    from_dt: str
+    to_dt: str
+    comment: str
+    sta: str
+    from_mag: str
+    to_mag: str
 
-    return wrapper
 
-
-def get_sql_query(from_dt, to_dt, comment, sta, from_mag, to_mag: str) -> str:
-    sta = '' if sta.lower() == 'all' else sta
+def _get_sql_query(params: QueryParams) -> str:
+    sta = '' if params.sta.lower() == 'all' else params.sta
+    from_dt = datetime.strptime(params.from_dt, '%Y-%m-%d %H:%M:%S').timestamp()
+    to_dt = datetime.strptime(params.to_dt, '%Y-%m-%d %H:%M:%S').timestamp()
     return f"SELECT" \
-           f" o.EVENTID, FROM_UNIXTIME(o.ORIGINTIME), o.LAT, o.LON," \
-           f" o.`DEPTH`, SUBSTR(o.COMMENTS, 20), a.STA, ROUND(a.DIST, 3)," \
+           f" o.EVENTID, o.ORIGINTIME, o.LAT, o.LON," \
+           f" o.`DEPTH`," \
+           f" CONCAT(SUBSTR(o.COMMENTS, 1, INSTR(o.COMMENTS, '.') - 3),"\
+           f"        SUBSTR(o.COMMENTS, 20))," \
+           f" a.ITIME, a.STA, ROUND(a.DIST, 3)," \
            f" ROUND(a.AZIMUTH, 3), a.IPHASE, CONCAT(a.IM_EM, a.FM)," \
-           f" FROM_UNIXTIME(a.ITIME), ROUND(a.AMPL, 3), ROUND(a.PER, 2)," \
-           f" ROUND(a.ML, 1), ROUND(a.MPSP, 1) " \
+           f" ROUND(a.AMPL, 3), ROUND(a.PER, 2)," \
+           f" ROUND(a.ML, 1), ROUND(a.MPSP, 1)" \
            f"FROM origin o " \
            f"INNER JOIN arrival a ON a.EVENTID = o.EVENTID " \
            f"WHERE" \
-           f" (o.COMMENTS LIKE '%{comment}%')" \
+           f" (o.COMMENTS LIKE '%{params.comment}%')" \
            f" AND" \
-           f" (FROM_UNIXTIME(o.ORIGINTIME) BETWEEN '{from_dt}' AND '{to_dt}')" \
+           f" (o.ORIGINTIME BETWEEN '{from_dt}' AND " \
+           f"                                       '{to_dt}')" \
            f" AND (a.STA LIKE '%{sta}%')" \
-           f" AND ((a.ML BETWEEN {from_mag} AND {to_mag}) OR" \
-           f"    (a.MPSP BETWEEN {from_mag} AND {to_mag}))" \
-           f" ORDER BY o.ORIGINTIME"
+           f" ORDER BY a.ITIME"
 
 
-@connect_decorator
-def get_data(from_dt, to_dt, comment, sta, from_mag, to_mag: str,
-             conn: MySQLConnectionAbstract) -> List[tuple]:
+def get_data(params: QueryParams) -> List[tuple]:
     """Returns data of quakes from DB"""
-    sql = get_sql_query(from_dt, to_dt, comment, sta, from_mag, to_mag)
-    with conn.cursor() as cursor:
-        cursor.execute(sql)
-        return cursor.fetchall()
+    sql = _get_sql_query(params)
+    try:
+        with connect(**config.DB, connection_timeout=2) as conn:
+            with conn.cursor() as cursor:
+                cursor.execute(sql)
+                return cursor.fetchall()
+    except Error as exc:
+        raise ConnectDatabaseError(exc.msg)
 
 
-def get_quakes(data_lst: Iterable[tuple]) -> Tuple[Quake, ...]:
-    """Return tuple of Quake data structures from db records"""
+def get_quakes(params: QueryParams) -> Tuple[Quake, ...]:
+    """Return tuple of Quake from db records"""
     quakes = []
-    _id, origin_dt, lat, lon, depth, reg =\
+    stations: List[Sta] = []
+    _id, origin_dt, lat, lon, depth, reg = \
         '', datetime(year=1, month=1, day=1), 0.0, 0.0, 0.0, ''
-    sta_lst: List[Sta, ] = []
-    for data in data_lst:
-        if data[0] != _id:
-            if len(sta_lst) != 0:
-                quakes.append(
-                    Quake(_id, origin_dt, lat, lon, depth, reg, tuple(sta_lst)))
-                sta_lst.clear()
-            _id, origin_dt, lat, lon, depth, reg = data[:6]
-        sta_lst.append(Sta(*data[6:]))
-    quakes.append(Quake(_id, origin_dt, lat, lon, depth, reg, tuple(sta_lst)))
-    return tuple(quakes)
+    quake_records = get_data(params)
+    prev_sta = None
+    for quake_record in quake_records:
+        if quake_record[0] != _id:
+            if len(stations) != 0:
+                quake = Quake(_id, datetime.utcfromtimestamp(origin_dt), lat,
+                              lon, depth, reg, tuple(stations))
+                quakes.append(quake)
+                stations.clear()
+                prev_sta = None
+            _id, origin_dt, lat, lon, depth, reg = quake_record[:6]
+
+        sta_dt = datetime.utcfromtimestamp(quake_record[6])
+        sta = Sta(sta_dt, *quake_record[7:])
+        prev_sta = _add_sta(sta, stations, prev_sta)
+    quakes.append(Quake(_id, datetime.utcfromtimestamp(origin_dt), lat, lon,
+                        depth, reg, tuple(stations)))
+    return tuple(_filter_magnitude(quakes, params))
+
+
+def _add_sta(sta: Sta, stations: List[Sta], prev_sta: Sta | None):
+    if prev_sta is None or (sta.phase_dt != prev_sta.phase_dt):
+        stations.append(sta)
+        out_sta = sta
+    else:
+        if sta.dist is not None: prev_sta.dist = sta.dist
+        if sta.azimuth is not None: prev_sta.azimuth = sta.azimuth
+        if sta.ampl is not None: prev_sta.ampl = sta.ampl
+        if sta.period is not None: prev_sta.period = sta.period
+        if sta.mag_ML is not None: prev_sta.mag_ML = sta.mag_ML
+        if sta.mag_MPSP is not None: prev_sta.mag_MPSP = sta.mag_MPSP
+        out_sta = prev_sta
+    return out_sta
+
+
+def _filter_magnitude(quakes: List[Quake], params: QueryParams) -> List[Quake]:
+    from_mag, to_mag = float(params.from_mag), float(params.to_mag)
+    return [quake for quake in quakes
+            if (from_mag <= quake.magnitude.ML <= to_mag)
+            or (from_mag <= quake.magnitude.MPSP <= to_mag)]

+ 4 - 47
ui/main_window.ui

@@ -330,88 +330,45 @@
          <property name="text">
           <string>ID</string>
          </property>
-         <property name="textAlignment">
-          <set>AlignCenter</set>
-         </property>
         </column>
         <column>
          <property name="text">
           <string>Origin Time</string>
          </property>
-         <property name="textAlignment">
-          <set>AlignCenter</set>
-         </property>
         </column>
         <column>
          <property name="text">
           <string>Lat</string>
          </property>
-         <property name="textAlignment">
-          <set>AlignCenter</set>
-         </property>
         </column>
         <column>
          <property name="text">
           <string>Lon</string>
          </property>
-         <property name="textAlignment">
-          <set>AlignCenter</set>
-         </property>
         </column>
         <column>
          <property name="text">
           <string>Depth</string>
          </property>
-         <property name="textAlignment">
-          <set>AlignCenter</set>
-         </property>
-        </column>
-        <column>
-         <property name="text">
-          <string>STA</string>
-         </property>
-         <property name="textAlignment">
-          <set>AlignCenter</set>
-         </property>
-        </column>
-        <column>
-         <property name="text">
-          <string>Ph</string>
-         </property>
-         <property name="textAlignment">
-          <set>AlignCenter</set>
-         </property>
-        </column>
-        <column>
-         <property name="text">
-          <string>time</string>
-         </property>
-         <property name="textAlignment">
-          <set>AlignCenter</set>
-         </property>
         </column>
         <column>
          <property name="text">
           <string>ML</string>
          </property>
-         <property name="textAlignment">
-          <set>AlignCenter</set>
-         </property>
         </column>
         <column>
          <property name="text">
           <string>MPSP</string>
          </property>
-         <property name="textAlignment">
-          <set>AlignCenter</set>
-         </property>
         </column>
         <column>
          <property name="text">
           <string>Region</string>
          </property>
-         <property name="textAlignment">
-          <set>AlignCenter</set>
+        </column>
+        <column>
+         <property name="text">
+          <string>STA, Ph, time</string>
          </property>
         </column>
        </widget>

+ 7 - 26
ui/main_window_ui.py

@@ -3,7 +3,7 @@
 ################################################################################
 ## Form generated from reading UI file 'main_window.ui'
 ##
-## Created by: Qt User Interface Compiler version 5.15.4
+## Created by: Qt User Interface Compiler version 5.15.5
 ##
 ## WARNING! All changes made in this file will be lost when recompiling UI file!
 ################################################################################
@@ -216,41 +216,26 @@ class Ui_MainWindow(object):
         self.verticalLayout_5.addWidget(self.groupBox)
 
         self.tableWidget = QTableWidget(self.centralwidget)
-        if (self.tableWidget.columnCount() < 11):
-            self.tableWidget.setColumnCount(11)
+        if (self.tableWidget.columnCount() < 9):
+            self.tableWidget.setColumnCount(9)
         __qtablewidgetitem = QTableWidgetItem()
-        __qtablewidgetitem.setTextAlignment(Qt.AlignCenter);
         self.tableWidget.setHorizontalHeaderItem(0, __qtablewidgetitem)
         __qtablewidgetitem1 = QTableWidgetItem()
-        __qtablewidgetitem1.setTextAlignment(Qt.AlignCenter);
         self.tableWidget.setHorizontalHeaderItem(1, __qtablewidgetitem1)
         __qtablewidgetitem2 = QTableWidgetItem()
-        __qtablewidgetitem2.setTextAlignment(Qt.AlignCenter);
         self.tableWidget.setHorizontalHeaderItem(2, __qtablewidgetitem2)
         __qtablewidgetitem3 = QTableWidgetItem()
-        __qtablewidgetitem3.setTextAlignment(Qt.AlignCenter);
         self.tableWidget.setHorizontalHeaderItem(3, __qtablewidgetitem3)
         __qtablewidgetitem4 = QTableWidgetItem()
-        __qtablewidgetitem4.setTextAlignment(Qt.AlignCenter);
         self.tableWidget.setHorizontalHeaderItem(4, __qtablewidgetitem4)
         __qtablewidgetitem5 = QTableWidgetItem()
-        __qtablewidgetitem5.setTextAlignment(Qt.AlignCenter);
         self.tableWidget.setHorizontalHeaderItem(5, __qtablewidgetitem5)
         __qtablewidgetitem6 = QTableWidgetItem()
-        __qtablewidgetitem6.setTextAlignment(Qt.AlignCenter);
         self.tableWidget.setHorizontalHeaderItem(6, __qtablewidgetitem6)
         __qtablewidgetitem7 = QTableWidgetItem()
-        __qtablewidgetitem7.setTextAlignment(Qt.AlignCenter);
         self.tableWidget.setHorizontalHeaderItem(7, __qtablewidgetitem7)
         __qtablewidgetitem8 = QTableWidgetItem()
-        __qtablewidgetitem8.setTextAlignment(Qt.AlignCenter);
         self.tableWidget.setHorizontalHeaderItem(8, __qtablewidgetitem8)
-        __qtablewidgetitem9 = QTableWidgetItem()
-        __qtablewidgetitem9.setTextAlignment(Qt.AlignCenter);
-        self.tableWidget.setHorizontalHeaderItem(9, __qtablewidgetitem9)
-        __qtablewidgetitem10 = QTableWidgetItem()
-        __qtablewidgetitem10.setTextAlignment(Qt.AlignCenter);
-        self.tableWidget.setHorizontalHeaderItem(10, __qtablewidgetitem10)
         self.tableWidget.setObjectName(u"tableWidget")
         sizePolicy1 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
         sizePolicy1.setHorizontalStretch(5)
@@ -365,17 +350,13 @@ class Ui_MainWindow(object):
         ___qtablewidgetitem4 = self.tableWidget.horizontalHeaderItem(4)
         ___qtablewidgetitem4.setText(QCoreApplication.translate("MainWindow", u"Depth", None));
         ___qtablewidgetitem5 = self.tableWidget.horizontalHeaderItem(5)
-        ___qtablewidgetitem5.setText(QCoreApplication.translate("MainWindow", u"STA", None));
+        ___qtablewidgetitem5.setText(QCoreApplication.translate("MainWindow", u"ML", None));
         ___qtablewidgetitem6 = self.tableWidget.horizontalHeaderItem(6)
-        ___qtablewidgetitem6.setText(QCoreApplication.translate("MainWindow", u"Ph", None));
+        ___qtablewidgetitem6.setText(QCoreApplication.translate("MainWindow", u"MPSP", None));
         ___qtablewidgetitem7 = self.tableWidget.horizontalHeaderItem(7)
-        ___qtablewidgetitem7.setText(QCoreApplication.translate("MainWindow", u"time", None));
+        ___qtablewidgetitem7.setText(QCoreApplication.translate("MainWindow", u"Region", None));
         ___qtablewidgetitem8 = self.tableWidget.horizontalHeaderItem(8)
-        ___qtablewidgetitem8.setText(QCoreApplication.translate("MainWindow", u"ML", None));
-        ___qtablewidgetitem9 = self.tableWidget.horizontalHeaderItem(9)
-        ___qtablewidgetitem9.setText(QCoreApplication.translate("MainWindow", u"MPSP", None));
-        ___qtablewidgetitem10 = self.tableWidget.horizontalHeaderItem(10)
-        ___qtablewidgetitem10.setText(QCoreApplication.translate("MainWindow", u"Region", None));
+        ___qtablewidgetitem8.setText(QCoreApplication.translate("MainWindow", u"STA, Ph, time", None));
         self.menuFile.setTitle(QCoreApplication.translate("MainWindow", u"File", None))
         self.menuSettings.setTitle(QCoreApplication.translate("MainWindow", u"Settings", None))
         self.menu_Save_as.setTitle(QCoreApplication.translate("MainWindow", u"&Save as...", None))