def __init__(self, parent=None, datastore=None, plin=None): """ inicijalizacija prozora uz instancu dokumenta i slajs frejma sa podacima """ super(BASE_TAB_ODAZIV, self).__init__(parent) self.setupUi(self) #zadani memberi self.datastore = datastore self.plin = plin #'komponenta-odaziv' self.naziv = plin[:-7] #'komponenta' #inicijalni kriterij za vrijeme uspona i pada self.tr = self.datastore.get_uredjaj().get_analitickaMetoda().get_tr() #time rise self.tf = self.datastore.get_uredjaj().get_analitickaMetoda().get_tf() #time fall #granice self.highLimit = self.datastore.tabData[self.plin].get_maxlimit() self.lowLimit = self.datastore.tabData[self.plin].get_minlimit() #metapodaci za graf self.meta = {'xlabel':'vrijeme', 'ylabel':'koncentracija', 'title':'Vrijeme uspona i pada'} #kriteriji prihvatljivosti kriterijRise = ['Vrijeme odaziva (uspon)', '', 't<sub>r</sub> = ', np.NaN, '<{0} s'.format(self.tr), 'NE'] kriterijFall = ['Vrijeme odaziva (pad)', '', 't<sub>f</sub> = ', np.NaN, '<{0} s'.format(self.tf), 'NE'] self.reportKriterijValue = {'rise':kriterijRise, 'fall':kriterijFall} #rezultati self.rezultatStupci = ['Naziv', 'Pocetak', 'Kraj', 'Delta'] self.rezultat = pd.DataFrame(columns=self.rezultatStupci) self.model = OdazivModel(slajs=None, naziv=self.naziv) frejm = self.datastore.tabData[self.plin].get_frejm() if isinstance(frejm, pd.core.frame.DataFrame): self.model.set_frejm(frejm) self.model.set_high_limit(self.highLimit) self.model.set_low_limit(self.lowLimit) self.doubleSpinBoxHigh.setValue(self.highLimit) self.doubleSpinBoxLow.setValue(self.lowLimit) self.modelRezultata = RiseFallResultModel() self.modelRezultata.set_frejm(self.rezultat) #postavljanje elemenata u layout: self.tableViewRezultati.setModel(self.modelRezultata) self.tableViewRezultati.setColumnWidth(0,45) self.tableViewRezultati.setColumnWidth(1,135) self.tableViewRezultati.setColumnWidth(2,135) self.tableViewRezultati.setColumnWidth(3,45) self.graf = canvas.RiseFallKanvas(meta=self.meta) self.tablicaKriterija = pomocni.ReportTablicaKriterijaRiseFall() self.kriterijLayout.addWidget(self.tablicaKriterija) self.grafLayout.addWidget(self.graf) self.setup_connections() self.update_rezultate()
class TabOdaziv(BASE_TAB_ODAZIV, FORM_TAB_ODAZIV): """ prozor provjeru vremena uspona i pada za pojedini plin """ def __init__(self, parent=None, datastore=None, plin=None): """ inicijalizacija prozora uz instancu dokumenta i slajs frejma sa podacima """ super(BASE_TAB_ODAZIV, self).__init__(parent) self.setupUi(self) #zadani memberi self.datastore = datastore self.plin = plin #'komponenta-odaziv' self.naziv = plin[:-7] #'komponenta' #inicijalni kriterij za vrijeme uspona i pada self.tr = self.datastore.get_uredjaj().get_analitickaMetoda().get_tr() #time rise self.tf = self.datastore.get_uredjaj().get_analitickaMetoda().get_tf() #time fall #granice self.highLimit = self.datastore.tabData[self.plin].get_maxlimit() self.lowLimit = self.datastore.tabData[self.plin].get_minlimit() #metapodaci za graf self.meta = {'xlabel':'vrijeme', 'ylabel':'koncentracija', 'title':'Vrijeme uspona i pada'} #kriteriji prihvatljivosti kriterijRise = ['Vrijeme odaziva (uspon)', '', 't<sub>r</sub> = ', np.NaN, '<{0} s'.format(self.tr), 'NE'] kriterijFall = ['Vrijeme odaziva (pad)', '', 't<sub>f</sub> = ', np.NaN, '<{0} s'.format(self.tf), 'NE'] self.reportKriterijValue = {'rise':kriterijRise, 'fall':kriterijFall} #rezultati self.rezultatStupci = ['Naziv', 'Pocetak', 'Kraj', 'Delta'] self.rezultat = pd.DataFrame(columns=self.rezultatStupci) self.model = OdazivModel(slajs=None, naziv=self.naziv) frejm = self.datastore.tabData[self.plin].get_frejm() if isinstance(frejm, pd.core.frame.DataFrame): self.model.set_frejm(frejm) self.model.set_high_limit(self.highLimit) self.model.set_low_limit(self.lowLimit) self.doubleSpinBoxHigh.setValue(self.highLimit) self.doubleSpinBoxLow.setValue(self.lowLimit) self.modelRezultata = RiseFallResultModel() self.modelRezultata.set_frejm(self.rezultat) #postavljanje elemenata u layout: self.tableViewRezultati.setModel(self.modelRezultata) self.tableViewRezultati.setColumnWidth(0,45) self.tableViewRezultati.setColumnWidth(1,135) self.tableViewRezultati.setColumnWidth(2,135) self.tableViewRezultati.setColumnWidth(3,45) self.graf = canvas.RiseFallKanvas(meta=self.meta) self.tablicaKriterija = pomocni.ReportTablicaKriterijaRiseFall() self.kriterijLayout.addWidget(self.tablicaKriterija) self.grafLayout.addWidget(self.graf) self.setup_connections() self.update_rezultate() def set_model(self, x): self.model = x def get_model(self): return self.model def setup_connections(self): self.doubleSpinBoxHigh.valueChanged.connect(self.modify_high_limit) self.doubleSpinBoxLow.valueChanged.connect(self.modify_low_limit) self.pushButtonSetPrag.clicked.connect(self.postavi_predlozene_pragove) self.connect(self.graf, QtCore.SIGNAL('izabrano_vrijeme(PyQt_PyObject)'), self.selektiraj_najblizi_indeks) def postavi_predlozene_pragove(self, x): """ Metoda postavlja pragove iz trenutnih podataka iz funnkcije prilagodbe prema formuli: rise = (span * 0.9 - B) / A fall = (span * 0.1 - B) / A rise : gornji prag fall : donji prag span : trenutni opseg mjerenja B : prilagodbaB (odsjecak na y osi pravca kroz tocku zero i tocku span) A : prilagodbaA (nagib pravca kroz tocku zero i tocku span) """ try: rezultatiUmjeravanja = self.datastore.tabData[self.naziv].get_rezultat() prilagodbaA = rezultatiUmjeravanja['prilagodba']['prilagodbaA'] prilagodbaB = rezultatiUmjeravanja['prilagodba']['prilagodbaB'] #opseg spana... tocke = self.datastore.tabData[self.naziv].get_tocke() zeroTocka, spanTocka = pomocni.pronadji_zero_span_tocke(tocke) spanOpseg = self.datastore.get_izabraniOpseg() * spanTocka.get_crefFaktor() print(spanOpseg) r = (spanOpseg*0.9 - prilagodbaB) / prilagodbaA f = (spanOpseg*0.1 - prilagodbaB) / prilagodbaA self.doubleSpinBoxHigh.setValue(r) self.doubleSpinBoxLow.setValue(f) except Exception as err: logging.error(str(err), exc_info=True) def selektiraj_najblizi_indeks(self, x): """Ulaz je pandas timestamp. Metoda sluzi za scroll tablice podataka na najblizi indeks""" #find index... frejm = self.model.get_frejm() if len(frejm): rez = frejm[frejm.index >= x] if len(rez): prviVeciIndex = rez.index[0] lista1 = list(frejm.index) red = lista1.index(prviVeciIndex) else: red = frejm.index[-1] indeks = self.model.index(red, 2) self.emit(QtCore.SIGNAL('scroll_to_index(PyQt_PyObject)'), indeks) def modify_high_limit(self, x): value = float(x) self.highLimit = value self.model.set_high_limit(value) self.datastore.tabData[self.plin].set_maxlimit(value) self.update_rezultate() def modify_low_limit(self, x): value = float(x) self.lowLimit = value self.model.set_low_limit(value) self.datastore.tabData[self.plin].set_minlimit(value) self.update_rezultate() def nadji_kraj_uspona(self, frejm, ts): frejm = frejm.iloc[:,2] frejm = frejm[frejm.index >= ts] frejm = frejm[frejm >= self.highLimit] if len(frejm): return frejm.index[0] else: return pd.NaT def nadji_kraj_pada(self, frejm, ts): frejm = frejm.iloc[:,2] frejm = frejm[frejm.index >= ts] frejm = frejm[frejm <= self.lowLimit] if len(frejm): return frejm.index[0] else: return pd.NaT def get_reportKriterijValue(self): return self.reportKriterijValue def update_rezultate(self): self.make_rezultat_from_model_data() self.modelRezultata.set_frejm(self.rezultat) #set novi frejm u datastore... self.datastore.tabData[self.plin].set_frejm(self.model.get_frejm()) #nacrtaj rezultat slajs = self.model.get_slajs() self.graf.crtaj(podaci=slajs, rezultati=self.rezultat, high=self.highLimit, low=self.lowLimit) #provjeri kriterij self.set_reportValue() mapa = {} mapa['kriterij'] = self.reportKriterijValue s = self.rezultat.loc[:,'Pocetak'] if len(s): mapa['start'] = min(s) else: mapa['start'] = 'n/a' k = self.rezultat.loc[:,'Kraj'] if len(k): mapa['kraj'] = max(k) else: mapa['kraj'] = 'n/a' self.datastore.tabData[self.plin].set_rezultat(mapa) def make_rezultat_from_model_data(self): """Metoda generira frejm rezultata iz modela""" self.rezultat = pd.DataFrame(columns=self.rezultatStupci) frejm = self.model.get_frejm() #usponi r = frejm[frejm.iloc[:,0] == QtCore.Qt.Checked] for i in r.index: start = i kraj = self.nadji_kraj_uspona(frejm, i) if not isinstance(kraj, pd.tslib.NaTType): delta = (kraj - start).total_seconds() else: delta = np.NaN self.dodaj_red_u_rezultat_frejm('RISE', start, kraj, delta) #padovi f = frejm[frejm.iloc[:,1] == QtCore.Qt.Checked] for i in f.index: start = i kraj = self.nadji_kraj_pada(frejm, i) if not isinstance(kraj, pd.tslib.NaTType): delta = (kraj - start).total_seconds() else: delta = np.NaN self.dodaj_red_u_rezultat_frejm('FALL', start, kraj, delta) def dodaj_red_u_rezultat_frejm(self, nazivStupca, start, kraj, delta): indeks = len(self.rezultat) #provjeri da li postoji vec isto vrijeme prije dodavanja startovi = list(self.rezultat['Pocetak']) if start not in startovi: df = pd.DataFrame({'Naziv':nazivStupca, 'Pocetak':start, 'Kraj':kraj, 'Delta':delta}, index=[indeks], columns=self.rezultatStupci) self.rezultat = self.rezultat.append(df) def set_reportValue(self): frejm = self.rezultat.copy() frejmRise = frejm[frejm.loc[:,'Naziv'] == 'RISE'] frejmFall = frejm[frejm.loc[:,'Naziv'] == 'FALL'] #time rise if len(frejmRise) >= 4: deltaRise = np.average(frejmRise.loc[:,'Delta']) if deltaRise <= self.tr: self.reportKriterijValue['rise'][5] = 'DA' else: self.reportKriterijValue['rise'][5] = 'NE' else: deltaRise = np.NaN self.reportKriterijValue['rise'][5] = 'NE' self.reportKriterijValue['rise'][3] = deltaRise #time fall if len(frejmFall): deltaFall = np.average(frejmFall.loc[:,'Delta']) if deltaFall <= self.tf: self.reportKriterijValue['fall'][5] = 'DA' else: self.reportKriterijValue['fall'][5] = 'NE' else: deltaFall = np.NaN self.reportKriterijValue['fall'][5] = 'NE' self.reportKriterijValue['fall'][3] = deltaFall self.tablicaKriterija.set_values(self.reportKriterijValue)