Skip to content
Snippets Groups Projects
Commit f2aedb6d authored by JOSSOUD Olivier's avatar JOSSOUD Olivier
Browse files

PumpCalib. Replace CFA-Analysis provider by cfatool Reader.

parent 1640fb27
No related branches found
No related tags found
No related merge requests found
import pandas as pd
import os
import re
from config import Config
class PumpCalibProvider:
def __init__(self, pump_id: str, config: Config):
self.pump_id = pump_id
self.data_dir = config.read("DATA_SOURCE", "absolute_root_dir") + "/pump_calibration/" + pump_id + "/"
# Get all files in Pump's calib data directory
self.all_files = os.listdir(self.data_dir)
def get_runs_df(self) -> pd.DataFrame:
# Keep only runs-related files (like: 20191010-064649_COLPUMP_calib_runs.csv)
regex = re.compile(r'^[0-9]{8}-[0-9]{6}_' + self.pump_id + '_calib_runs.csv$')
runs_files = list(filter(regex.search, self.all_files))
runs_files.sort()
runs_df = pd.DataFrame()
calib_id_int = 0
for filename in runs_files:
df = pd.read_csv(filepath_or_buffer=self.data_dir + filename,
sep=",",
parse_dates=["start_time", "end_time"])
df["calib_id_str"] = df["start_time"].iloc[0].strftime("%Y%m%d-%H%M")
df["calib_id_int"] = calib_id_int
calib_id_int += 1
runs_df = runs_df.append(df)
return runs_df
def get_coef_df(self) -> pd.DataFrame:
df = pd.read_csv(filepath_or_buffer=self.data_dir + self.pump_id + "_calib_coef.csv",
sep=",",
parse_dates=["first_run_datetime", "apply_datetime"])
df["calib_id_str"] = df["first_run_datetime"].dt.strftime("%Y%m%d-%H%M")
df["calib_id_int"] = df.index
return df
def get_turning_df(self) -> pd.DataFrame:
# Keep only state-change-related files (like: 20190911_COMPUMP_state_changes.csv)
regex = re.compile(r'^[0-9]{8}_' + self.pump_id + '_state_changes.csv$')
state_files = list(filter(regex.search, self.all_files))
state_files.sort()
turning_df = pd.DataFrame()
for filename in state_files:
df = pd.read_csv(filepath_or_buffer=self.data_dir + filename,
sep=",",
parse_dates=["datetime"])
turning_df = turning_df.append(df)
turning_df = turning_df[turning_df["name"] != "direction"]
turning_df["value"] = pd.to_numeric(turning_df["value"])
# raw_rpm_df contains only the "change rpm" command values, at the time they were originally sent,
# not the moment they were applied.
raw_rpm_df = turning_df[turning_df["name"] == "rpm"]
raw_rpm_df = raw_rpm_df.drop(columns=["name"])
raw_rpm_df.rename(columns={"value": 'rpm'}, inplace=True)
# rpm_df contains the rpm value, timestamped at the moment they were applied, i.e. when the pump was actually
# turning.
rpm_df = pd.DataFrame()
last_start = None
for index, row in turning_df[turning_df["name"] == "turning"].iterrows():
if row["value"] == 1:
last_start = row["datetime"]
try:
previous_rpm = turning_df.loc[(turning_df["name"] == "rpm")
& (turning_df["datetime"] < row["datetime"])].iloc[-1]["value"]
except IndexError:
# Happens when the first line is turning=True, so RPM at that time is not known.
previous_rpm = 0.0
rpm_df = rpm_df.append({"datetime": row["datetime"],
"rpm": previous_rpm},
ignore_index=True)
else:
rpm_df = rpm_df.append(raw_rpm_df.loc[(raw_rpm_df["datetime"] >= last_start)
& (raw_rpm_df["datetime"] <= row["datetime"])])
rpm_df = rpm_df.append({"datetime": row["datetime"],
"rpm": 0},
ignore_index=True)
# Integrate to get the number of turns
rpm_df["turns"] = rpm_df["rpm"].shift(1) * rpm_df["datetime"].diff().dt.total_seconds() / 60
rpm_df["total_turns"] = rpm_df["turns"].cumsum()
return rpm_df
def get_mlmin_to_rpm_evol_df(self):
turning_df = self.get_turning_df()
runs_df = self.get_runs_df()
runs_df = runs_df[["start_time", "rpm", "flow"]]
runs_df["total_turns"] = 0
runs_df = runs_df.reset_index(drop=True)
for index, row in runs_df.iterrows():
last_known_total_turns = turning_df.loc[turning_df["datetime"] < row["start_time"]].iloc[-1]["total_turns"]
runs_df.at[index, 'total_turns'] = last_known_total_turns
return runs_df
\ No newline at end of file
#!../venv/bin/python3.7 #!../venv/bin/python3.7
import sys import sys
from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QThread
from config import Config from config import Config
...@@ -10,7 +9,6 @@ from gui.mainwindow import MainWindow ...@@ -10,7 +9,6 @@ from gui.mainwindow import MainWindow
from dataprovider.conductcalibprovider import ConductCalibProvider from dataprovider.conductcalibprovider import ConductCalibProvider
from dataprovider.exploprovider import ExploProvider from dataprovider.exploprovider import ExploProvider
from dataprovider.picarroprovider import PicarroProvider from dataprovider.picarroprovider import PicarroProvider
from dataprovider.pumpcalibprovider import PumpCalibProvider
from uim.conductcalibuim import ConductCalibUim from uim.conductcalibuim import ConductCalibUim
from uim.explouim import ExploUim from uim.explouim import ExploUim
...@@ -35,9 +33,6 @@ main_window_ui = main_window.main_ui ...@@ -35,9 +33,6 @@ main_window_ui = main_window.main_ui
conduct_prvd = ConductCalibProvider() conduct_prvd = ConductCalibProvider()
picarro_prvd = PicarroProvider(config) picarro_prvd = PicarroProvider(config)
explo_prvd = ExploProvider(picarro_prvd) explo_prvd = ExploProvider(picarro_prvd)
compump_prvd = PumpCalibProvider("COMPUMP", config)
colpump_prvd = PumpCalibProvider("COLPUMP", config)
picpump_prvd = PumpCalibProvider("PICPUMP", config)
######################################################################################################################## ########################################################################################################################
# GUI MANAGERS # GUI MANAGERS
...@@ -45,7 +40,7 @@ picpump_prvd = PumpCalibProvider("PICPUMP", config) ...@@ -45,7 +40,7 @@ picpump_prvd = PumpCalibProvider("PICPUMP", config)
conductcalib_uim = ConductCalibUim(conduct_prvd, main_window_ui, config) conductcalib_uim = ConductCalibUim(conduct_prvd, main_window_ui, config)
explo_uim = ExploUim(explo_prvd, main_window_ui, config, main_window.stab_windows) explo_uim = ExploUim(explo_prvd, main_window_ui, config, main_window.stab_windows)
pump_uim = PumpCalibUim(compump_prvd, colpump_prvd, picpump_prvd, main_window_ui, config) pump_uim = PumpCalibUim(main_window_ui, config)
######################################################################################################################## ########################################################################################################################
# LAUNCH APPLICATION # LAUNCH APPLICATION
......
import datetime
import re
from math import atan, degrees from math import atan, degrees
import pyqtgraph as pg import pyqtgraph as pg
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QColor
from PyQt5.QtCore import * from PyQt5.QtCore import *
import pandas as pd import pandas as pd
import numpy as np from cfatools.logreader.pump_calib import PumpCalibReader
from pandas.api.types import is_numeric_dtype import cfatools.processor.pump as pump_proc
from cfatools.provider.pump_calib import PumpCalibReader
import utils
from config import Config from config import Config
from dataprovider.pumpcalibprovider import PumpCalibProvider
from gui.uimainwindow import Ui_MainWindow from gui.uimainwindow import Ui_MainWindow
class PumpCalibUim: class PumpCalibUim:
def __init__(self, def __init__(self, main_ui: Ui_MainWindow, config: Config):
compump_prvd: PumpCalibProvider, colpump_prvd: PumpCalibProvider, picpump_prvd: PumpCalibProvider,
main_ui: Ui_MainWindow, config: Config):
self.main_ui = main_ui self.main_ui = main_ui
self.compump_prvd = compump_prvd
self.colpump_prvd = colpump_prvd
self.picpump_prvd = picpump_prvd
self.config = config self.config = config
self.pump_prvd = self.set_current_pump_prvd() self.pump_reader = self.set_current_pump_reader()
self.main_ui.pump_combobox_pump.currentTextChanged.connect(self.change_pump) self.main_ui.pump_combobox_pump.currentTextChanged.connect(self.change_pump)
self.change_pump(self.main_ui.pump_combobox_pump.currentText()) self.change_pump(self.main_ui.pump_combobox_pump.currentText())
self.runs_df = pd.DataFrame() self.runs_df = pd.DataFrame()
self.coef_df = pd.DataFrame() self.coef_df = pd.DataFrame()
def set_current_pump_prvd(self, pump_text: str = None) -> PumpCalibProvider: def set_current_pump_reader(self, pump_text: str = None) -> PumpCalibReader:
if pump_text is None: if pump_text is None:
pump_text = self.main_ui.pump_combobox_pump.currentText() pump_text = self.main_ui.pump_combobox_pump.currentText()
if pump_text == "Common pump": if pump_text == "Common pump":
self.pump_prvd = self.compump_prvd
self.pump_reader = PumpCalibReader(self.config.read("DATA_SOURCE", "absolute_root_dir"), "COMPUMP") self.pump_reader = PumpCalibReader(self.config.read("DATA_SOURCE", "absolute_root_dir"), "COMPUMP")
elif pump_text == "Collector pump": elif pump_text == "Collector pump":
self.pump_prvd = self.colpump_prvd
self.pump_reader = PumpCalibReader(self.config.read("DATA_SOURCE", "absolute_root_dir"), "COLPUMP") self.pump_reader = PumpCalibReader(self.config.read("DATA_SOURCE", "absolute_root_dir"), "COLPUMP")
elif pump_text == "Picarro pump": elif pump_text == "Picarro pump":
self.pump_prvd = self.picpump_prvd
self.pump_reader = PumpCalibReader(self.config.read("DATA_SOURCE", "absolute_root_dir"), "PICPUMP") self.pump_reader = PumpCalibReader(self.config.read("DATA_SOURCE", "absolute_root_dir"), "PICPUMP")
else: else:
raise ValueError("Impossible to assign a Provider from text [" + pump_text + "]") raise ValueError("Impossible to assign a Provider from text [" + pump_text + "]")
return self.pump_prvd return self.pump_reader
def change_pump(self, pump_text: str = None): def change_pump(self, pump_text: str = None):
self.set_current_pump_prvd(pump_text) self.set_current_pump_reader(pump_text)
self.runs_df = self.pump_reader.get_runs_df() self.runs_df = self.pump_reader.get_runs_df()
self.coef_df = self.pump_reader.get_coef_df() self.coef_df = self.pump_reader.get_coef_df()
self.__update_runs_plot__(self.runs_df, self.coef_df) self.__update_runs_plot__(self.runs_df, self.coef_df)
self.__update_evol_plot__(self.pump_prvd.get_mlmin_to_rpm_evol_df())
turns_history_df = pump_proc.get_turns_history_df(
rpm_history_df=self.pump_reader.get_state_changes_df("rpm"),
turning_history_df=self.pump_reader.get_state_changes_df("turning")
)
evol_df = pump_proc.get_mlmin_to_rpm_evol_df(turns_history_df=turns_history_df, runs_df=self.runs_df)
self.__update_evol_plot__(evol_df)
#################################################################### ####################################################################
# Plot # Plot
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment