From 76a13d06e1173e8babf2876c6c20d1a028c21b8e Mon Sep 17 00:00:00 2001 From: Ute Becker <ute.becker@ptb.de> Date: Wed, 20 Mar 2024 11:55:12 +0100 Subject: [PATCH] Auswerteprogramme TL1 und TL2 --- attachment_bur.py | 116 +++++++ attachment_cer.py | 69 ++++ file-to-couchdb_tl1_cL.py | 669 ++++++++++++++++++++++++++++++++++++++ testplot.py | 68 ++++ writeLaTex-ks-TL1.py | 435 +++++++++++++++++++++++++ 5 files changed, 1357 insertions(+) create mode 100644 attachment_bur.py create mode 100644 attachment_cer.py create mode 100644 file-to-couchdb_tl1_cL.py create mode 100644 testplot.py create mode 100644 writeLaTex-ks-TL1.py diff --git a/attachment_bur.py b/attachment_bur.py new file mode 100644 index 0000000..7aa6b23 --- /dev/null +++ b/attachment_bur.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- +""" +Created on Tue Mar 19 15:11:54 2024 + +@author: becker07 +""" + +import pathlib +import os + +import couchdb + + +couch = couchdb.Server('http://a73434.berlin.ptb.de:5984') +db = couch['vl_db'] # existing + + +########## Vorgangsnummer und Jahr angeben ######### +vn = "10" +year = "24" + + +bur = "bur-7.5-1V-" + year + "-" + vn +print(bur) + +doc = db.get(bur) + +sign = doc["Bureaucracy"]["Customer"]["Sign"] +sign = sign.lower() + + +########### Schedule Date finden ############## + +n = 1000 +i = 0 +while i <= n: + date_type=doc["Bureaucracy"]["Date"][i]["Type"] + date=doc["Bureaucracy"]["Date"][i]["Value"] + if date_type == 'schedule': + i=n + i = i + 1 +print (date_type,date ) +i = 0 + + +################################################################## + +vn_np=float(vn) +if vn_np < 100: + if vn_np < 10: + vn_str = '00'+ vn + else: + vn_str = '0'+ vn +else: + vn_str = vn + +print(vn_str) + +vs= 'shipping-' + sign + '-' + vn_str + '-' + date +dang= 'dangerousgoods-' + sign + '-' + vn_str + '-' + date + +print(vs,dang) + + +#dangerousgoods-alc-010-2024-01-22 + +vs_pdf= vs + ".pdf" +vs_tex= vs + ".tex" +#print(cer_pdf, cer_tex) +ship_pdf = "C:\\Users\\becker07\\ptb-latex\\versandauftrag\\" + vs_pdf +ship_tex = "C:\\Users\\becker07\\ptb-latex\\versandauftrag\\" + vs_tex + + +dg_pdf= dang + ".pdf" +dg_tex= dang + ".tex" +#print(cer_pdf, cer_tex) +dang_pdf = "C:\\Users\\becker07\\ptb-latex\\gefahrgutformular\\" + dg_pdf +dang_tex = "C:\\Users\\becker07\\ptb-latex\\gefahrgutformular\\" + dg_tex + + +################### Versand, Gefahrenstoffe werden an das bur-json-dokument angehangen ################## + +content_ship_pdf=pathlib.Path(ship_pdf).read_bytes() +content_ship_tex=pathlib.Path(ship_tex).read_bytes() +db.put_attachment(doc, content_ship_pdf, vs_pdf , content_type='application/pdf') +db.put_attachment(doc, content_ship_tex, vs_tex , content_type='text/plain') + +content_dang_pdf=pathlib.Path(dang_pdf).read_bytes() +content_dang_tex=pathlib.Path(dang_tex).read_bytes() +db.put_attachment(doc, content_dang_pdf, dg_pdf , content_type='application/pdf') +db.put_attachment(doc, content_dang_tex, dg_tex , content_type='text/plain') + + + + +################### die Kalibrierscheine werden im Ordner Kalibrierscheine gelöscht ################## + +#cer_pdf= "ks-" +cers[i] + "-" + year + ".pdf" +#cer_tex= "ks-" +cers[i] + "-" + year + ".tex" +#cer_aux= "ks-" +cers[i] + "-" + year + ".aux" +#cer_log= "ks-" +cers[i] + "-" + year + ".log" +#cer_gz= "ks-" +cers[i] + "-" + year + ".synctex.gz" +#print(cer_pdf, cer_tex) +#ks_pdf = "C:\\Users\\becker07\\kalibrierschein\\" + cer_pdf +#ks_tex = "C:\\Users\\becker07\\kalibrierschein\\" + cer_tex +#ks_aux = "C:\\Users\\becker07\\kalibrierschein\\" + cer_aux +#ks_log = "C:\\Users\\becker07\\kalibrierschein\\" + cer_log +#ks_gz = "C:\\Users\\becker07\\kalibrierschein\\" + cer_gz + +#print(ks_pdf, ks_tex) +#os.remove(ks_pdf) +#os.remove(ks_tex) +#os.remove(ks_aux) +#os.remove(ks_log) +#os.remove(ks_gz) + diff --git a/attachment_cer.py b/attachment_cer.py new file mode 100644 index 0000000..e37ff5e --- /dev/null +++ b/attachment_cer.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +""" +Created on Fri Jan 6 11:14:44 2023 + +@author: becker07 +""" + +import pathlib +import os + +import couchdb + + +couch = couchdb.Server('http://a73434.berlin.ptb.de:5984') +db = couch['vl_db'] # existing + + +year = "2024" + +cers = ["75564","75565","75566","75567","75568","75569","75570","75571","75572","75573"] # Beispiel: cers = ["75511_0001","75512_0001"] +#cers = ["75562","75563"] # Beispiel: cers = ["75511_0001","75512_0001"] + +################### die Kalibrierscheine werden an das cer-json-dokument angehangen ################## +i = 0 +while i < len(cers): + json_file = "cer-" + year + '-' + cers[i] + print(json_file) + doc = db.get(json_file) + cer_pdf= "ks-" +cers[i] + "-" + year + ".pdf" + cer_tex= "ks-" +cers[i] + "-" + year + ".tex" + print(cer_pdf, cer_tex) + ks_pdf = "C:\\Users\\becker07\\kalibrierschein\\" + cer_pdf + ks_tex = "C:\\Users\\becker07\\kalibrierschein\\" + cer_tex + print(ks_pdf, ks_tex) + content_pdf=pathlib.Path(ks_pdf).read_bytes() + content_tex=pathlib.Path(ks_tex).read_bytes() + db.put_attachment(doc, content_pdf, cer_pdf , content_type='application/pdf') + db.put_attachment(doc, content_tex, cer_tex , content_type='text/plain') + + i += 1 + + +################### die Kalibrierscheine werden im Ordner Kalibrierscheine gelöscht ################## + +i = 0 +while i < len(cers): + json_file = "cer-" + year + '-' + cers[i] + print(json_file) + doc = db.get(json_file) + cer_pdf= "ks-" +cers[i] + "-" + year + ".pdf" + cer_tex= "ks-" +cers[i] + "-" + year + ".tex" + cer_aux= "ks-" +cers[i] + "-" + year + ".aux" + cer_log= "ks-" +cers[i] + "-" + year + ".log" + cer_gz= "ks-" +cers[i] + "-" + year + ".synctex.gz" + print(cer_pdf, cer_tex) + ks_pdf = "C:\\Users\\becker07\\kalibrierschein\\" + cer_pdf + ks_tex = "C:\\Users\\becker07\\kalibrierschein\\" + cer_tex + ks_aux = "C:\\Users\\becker07\\kalibrierschein\\" + cer_aux + ks_log = "C:\\Users\\becker07\\kalibrierschein\\" + cer_log + ks_gz = "C:\\Users\\becker07\\kalibrierschein\\" + cer_gz + + print(ks_pdf, ks_tex) + os.remove(ks_pdf) + os.remove(ks_tex) + os.remove(ks_aux) + os.remove(ks_log) + os.remove(ks_gz) + + i += 1 \ No newline at end of file diff --git a/file-to-couchdb_tl1_cL.py b/file-to-couchdb_tl1_cL.py new file mode 100644 index 0000000..7454705 --- /dev/null +++ b/file-to-couchdb_tl1_cL.py @@ -0,0 +1,669 @@ +# -*- coding: utf-8 -*- +""" +Created on Fri Jul 1 12:12:37 2022 + +@author: becker07 +""" +import sys +import numpy as np +import couchdb +import pandas as pd +import json +import csv +import re +from matplotlib import pyplot as plt +import pathlib + +couch = couchdb.Server('http://a73434.berlin.ptb.de:5984') +db = couch['vl_db'] # existing + + +## Eingabe von: +# - Kalibrierscheinnummer +# - Jahr der Kalibrierung +# - laufende Nummer der Kalibrierung + + + +cal_cert = "75573" +year = "2024" +no = "0001" +QMS="ja" ######### ja beim Scan +kk_ik_pn= "kk" ######## kk,ik oder pn + + + +json_file = "cal-" + year + "-fm1-kk-" + cal_cert + "_" + no +doc = db.get(json_file) +print(json_file) + + +dateiTab = cal_cert +#print(dateiTab) + + +dateiTab=pd.read_csv(dateiTab, sep="\t", decimal = ',' ) + +L_ar=dateiTab["L"] +print('Leitwert j= 1, nein = 0 :: ', L_ar) + +L=L_ar[0] +print('Leitwer : ',L) + + +gauge = float(doc["Calibration"]["CustomerObject"]["Setup"]["CDG"]) +print(gauge) + +fileQMS = "QMS" + cal_cert + ".txt" +dateiQMS =fileQMS +ScanQMS="Scan"+cal_cert + ".txt" +ScanOffsQMS="Scan_Offs"+cal_cert + ".txt" +print(ScanQMS) + +# Die Daten aus dem File mit der entsprechenden Kalibrierscheinnummer werden eingelesen: +# datum, time, p_up und alle Temperaturen, + + +#datei = "N:\Abt_7\Fb75\Vakuum\Messplaetze\TL1\Kalibrierungen\\22\\TP7464.txt" + +if L == 1 : + + + m1=dateiTab["m1"] + m2=dateiTab["m2"] + m3=dateiTab["m3"] + m4=dateiTab["m4"] + + t1=dateiTab["t1"] + t2=dateiTab["t2"] + t3=dateiTab["t3"] + t4=dateiTab["t4"] + time1=dateiTab["time1"] + time2=dateiTab["time2"] + time3=dateiTab["time3"] + + pmean=dateiTab["p-mean"]*100 + pmin=dateiTab["p-min"]*100 + pmax=dateiTab["p-max"]*100 + + + h=dateiTab["distance"] + + + print("Constantes Volumen",h) + + + +else: + print("Constanter Leitwert") + + +datum=dateiTab["Datum"] +time=dateiTab["Zeit"] +gas=dateiTab["Gasart"] + +if gauge== 0.01 : + p_offs_01=dateiTab["p-offset"]*100 + p_fill_01=dateiTab["p-fill "]*100 + p_fill_srg=dateiTab["p-max"] + p_offs_srg=dateiTab["p-min"] + +else : + p_offs=dateiTab["p-offset"]*100 + p_fill=dateiTab["p-fill "]*100 +#p_fill=np.genfromtxt(dateiTab,skip_header=1,delimiter='\t',usecols=(5)) + +p_ig=dateiTab["Kommentar"] +T_room=dateiTab["T-Raum"] +T_fm=dateiTab["T-FM"] +T_tl1=dateiTab["T-TL1"] +T_tl2=dateiTab["T-TL2"] +T_tl3=dateiTab["T-TL3"] +T_tl4=dateiTab["T-TL4"] + +#print(T_fm,T_room,T_tl1, T_tl2,T_tl3,T_tl4) + + +I_TL_time=dateiTab["Time-TL"] +I_Offs_time=dateiTab["Time-offset"] +I_FM_time=dateiTab["Time-FM"] + +#print(I_TL_time,I_Offs_time,I_FM_time) + +Valve=dateiTab["Ventil"] + + +if QMS == "ja" : + I_TL_time=dateiTab["Time-TL"] + I_Offs_time=dateiTab["Time-offset"] + I_FM_time=dateiTab["Time-FM"] + + #print(I_TL_time,I_Offs_time,I_FM_time) + + +####################### Der Scan des QMS ############################################################################## + + + +############## die leeren Zeilen und Überschriften werden gelöscht ################### + + with open(ScanQMS, "r") as fp: + tab=fp.read() + + with open('ScanQMS.txt', 'w') as fp: + fp.write(tab) + + with open(ScanOffsQMS, "r") as fp: + tab=fp.read() + + with open('ScanOffsQMS.txt', 'w') as fp: + fp.write(tab) + + + del_def = [] + with open('ScanQMS.txt', "r") as fp: + del_def = fp.readlines() + with open('ScanQMS.txt', "w") as fp: + for number, line in enumerate(del_def): + if number not in [0, 1,6,7,22,23,24,25,47,48]: + fp.write(line) + + del_def = [] + with open('ScanOffsQMS.txt', "r") as fp: + del_def = fp.readlines() + with open('ScanOffsQMS.txt', "w") as fp: + for number, line in enumerate(del_def): + if number not in [0, 1,6,7,22,23,24,25,47,48]: + fp.write(line) + + + + +########### Scan ##################### + + with open('ScanQMS.txt','r') as file: + tab=file.read() + lstdef=tab.rfind("Channel count")+16 + lsttab=tab.rfind("Scan Data (Pressures in mbar)")+32 + filetab=tab[lsttab:] ### Das File wird getrennt und die Tabelle mit den Messwerten in das filetab übergeben + filedef=tab[:lstdef] ### Das File wird getrennt und die Einstellungen und Infos in filedef übergeben + + + with open('QMS-Def.txt', 'w') as f: + f.write(filedef) + + + df_tab = pd.read_csv("QMS-Def.txt", + sep="\t", + #usecols=["Time"] + header=None, + ) + + def_key=np.array(df_tab[0]) + l=len(def_key) + print(l) + #def_key=np.delete(def_key, l-1) + def_value=np.array(df_tab[1], dtype=str) + #def_value=np.delete(def_value, l-1) + + + + with open('QMS-Scan.txt', 'w') as f: + f.write(filetab) + df = pd.read_csv("QMS-Scan.txt", + sep="\t", + #usecols=["Time"] + header=None, + ) + df=df.replace(np.nan, 0) + + + l=len(df) + + print(l) + + mass_no=np.array(df[0:1]) + mass_unit=mass_no[0] + + + + + if l == 3: + mass_value=np.array(df[1:2]) + mass_value=mass_value[0] + print(mass_value()) + else: + mass_value=np.array(df[l-2:l-1]) + mass_value=mass_value[0] + + + +############################################################################################################# +########### Scan Offset ##################### + + with open('ScanOffsQMS.txt','r') as file: + tab_offs=file.read() + lstdef_offs=tab_offs.rfind("Channel count")+16 + lsttab_offs=tab_offs.rfind("Scan Data (Pressures in mbar)")+32 + filetab_offs=tab_offs[lsttab_offs:] ### Das File wird getrennt und die Tabelle mit den Messwerten in das filetab übergeben + filedef_offs=tab_offs[:lstdef_offs] ### Das File wird getrennt und die Einstellungen und Infos in filedef übergeben + + + with open('QMS_Offs-Def.txt', 'w') as f: + f.write(filedef_offs) + + + df_tab_offs = pd.read_csv("QMS_Offs-Def.txt", + sep="\t", + #usecols=["Time"] + header=None, + ) + + def_key_offs=np.array(df_tab_offs[0]) + l=len(def_key_offs) + def_value_offs=np.array(df_tab_offs[1], dtype=str) + #def_value=np.delete(def_value, l-1) + + + + with open('QMS_Offs-Scan.txt', 'w') as f: + f.write(filetab_offs) + df_offs = pd.read_csv("QMS_Offs-Scan.txt", + sep="\t", + #usecols=["Time"] + header=None, + ) + df_offs=df_offs.replace(np.nan, 0) + + + l=len(df_offs) + + print(l) + + + + if l == 3: + mass_value_offs=np.array(df_offs[1:2]) + mass_value_off=mass_value_offs[0] + print(mass_value_offs()) + else: + mass_value_offs=np.array(df_offs[l-2:l-1]) + mass_value_off=mass_value_offs[0] + + +############################################################################################################# + +###################### Plot der Scans werden abgebildet und den json-dokument hinzugefügt ##################### +I_Scan=np.float64(mass_value[2:-2]) +I_Scan_Offs=np.float64(mass_value_off[2:-2]) +Mass_Scan=mass_no[0] +Mass_Scan=Mass_Scan[2:-2] + +for i in range(len(Mass_Scan)): + Mass_Scan[i] = re.sub(r"Mass ", "", Mass_Scan[i]).strip() + + +Mass_Scan=np.float64(Mass_Scan) + +fig=plt.figure() +ax=fig.add_axes([0,0,4,2]) +ax.set_xlabel('Masse') +ax.set_ylabel('QMS-Signal') +ax.set_yscale('log') +#plt.plot(1010,4.65e-10, 'bo') +plt.plot(Mass_Scan,I_Scan, label=r'Floww') +plt.plot(Mass_Scan,I_Scan_Offs,label=r'Offset' ) +plt.legend() + + +plt.grid() + +fig.savefig("Scan.pdf", bbox_inches='tight') + + + +############################################################################################################# + +from collections import OrderedDict + +def getMassAverage(filename, tbegin = None, tend = None, trange = None): + def error_exit(x): + print('ERROR: ', str(x), file=sys.stderr) + sys.exit(1) + if not trange and (not tbegin or not tend): + error_exit('Missing time range') + try: + d = {} + with open(filename, 'r') as f: + line = f.readline() + dataValid = False + while line: + if dataValid: + # Ende der Daten + if line.startswith('"[Annotations/User Records'): + dataValid = False + else: + l = line.strip() + a = l.split('\t')# An Tabulatoren trennen + # a[0] = "Time", a[1] = "Scan", a[2] = "Mass 4", a[3] = "Sum Scanned Masses" + if a[0]: + key = a[0].strip('"') + # Timestamp als key für Dictionary + d[key] = a[2] + else: + # Beginn der Daten + if line.startswith('"Time"'): + dataValid = True + line = f.readline() + except: + error_exit("Can't read file: " + filename) + finally: + f.close() + # Sortieren bei neueren Python-Versionen unnötig? + data = OrderedDict(sorted(d.items())) + + def doAverage(beg, end): + sum = 0.0 + cnt = 0 + for key in data: + if key >= beg and key < end: + #print(key, '-->', data[key]) + cnt += 1 + sum += float(data[key]) + return sum / cnt + + tb = [] + te = [] + res = [] + + if trange: + if not isinstance(trange,list): + trange = [trange]# Einzelwert zu Array machen + for x in trange: + a = x.split(' -') + tb.append(a[0].strip()) + te.append(a[1].strip()) + else: + if not isinstance(tbegin,list): + tb = [tbegin]# Einzelwert zu Array machen + if not isinstance(tend,list): + te = [tend]# Einzelwert zu Array machen + + i = 0 + while i < len(tb): + s = doAverage(tb[i], te[i]) + res.append(s) + i += 1 + if len(res) == 1: + return res[0]# Bei nur einem Wert: kein Array + else: + return res + +trangeArrayTL=list(I_TL_time) +trangeArrayFM=list(I_FM_time) +trangeArrayOff=list(I_Offs_time) + +xtrangeArray = [ + '28.07.2022 09:19:19 -28.07.2022 09:21:18 ' + + ] +#trangeArray = I_TL_time + +x1 = getMassAverage(filename=dateiQMS,trange=trangeArrayTL ) +i = 0 +while i < len(x1): + print(i, 'Mass Avarage: ', x1[i]) + i += 1 +print(x1) + +x2 = getMassAverage(filename=dateiQMS,trange=trangeArrayFM ) +i = 0 +while i < len(x2): + print(i, 'Mass Avarage: ', x2[i]) + i += 1 +print(x2) + +x3 = getMassAverage(filename=dateiQMS,trange=trangeArrayOff) +i = 0 +while i < len(x3): + print(i, 'Mass Avarage: ', x3[i]) + i += 1 +print(x3) +I_TL=np.array(x1) +I_FM=np.array(x2) +I_Offs=np.array(x3) + +######################################################################################################################################## + + +# Temperatur +lis_T_fm = T_fm.tolist() +lis_T_room = T_room.tolist() +lis_T_tl1 = T_tl1.tolist() +lis_T_tl2 = T_tl2.tolist() +lis_T_tl3 = T_tl3.tolist() +lis_T_tl4 = T_tl4.tolist() + + +# Druck + +if gauge == 0.01 : + lis_p_offs_01 = p_offs_01.tolist() + lis_p_fill_01 = p_fill_01.tolist() + lis_p_offs_srg = p_offs_srg.tolist() + lis_p_fill_srg = p_fill_srg.tolist() + + + +else: + lis_p_offs = p_offs.tolist() + lis_p_fill = p_fill.tolist() + + + + + + +lis_p_ig = p_ig.tolist() +# I-QMS +lis_I_TL_time = I_TL_time.tolist() +lis_I_Offs_time = I_Offs_time.tolist() +lis_I_FM_time = I_FM_time.tolist() +# I-QMS +lis_I_TL = I_TL.tolist() +lis_I_Offs = I_Offs.tolist() +lis_I_FM = I_FM.tolist() +# Datum +# Datum +lis_datum = datum.tolist() +lis_time = time.tolist() + +# Ventil +lis_valve = Valve.tolist() + + +datum_meas = lis_datum[0:1] + + + + +if L == 1 : + #Leitwert + lis_c = L_ar.tolist() + + # Steigung SZ + lis_m1 = m1.tolist() + lis_m2 = m2.tolist() + lis_m3 = m3.tolist() + lis_m4 = m4.tolist() + + # Zeitpunkte + lis_t1 = t1.tolist() + lis_t2 = t2.tolist() + lis_t3 = t3.tolist() + lis_t4 = t4.tolist() + + # Zeit pro SZ + lis_time1 = time1.tolist() + lis_time2 = time2.tolist() + lis_time3 = time3.tolist() + + # Druck der SZ + lis_pmean = pmean.tolist() + lis_pmin = pmin.tolist() + lis_pmax= pmax.tolist() + + # Druck der SZ + lis_h = h.tolist() + + + doc["Calibration"]["Measurement"]["Values"]={"Temperature": [{"Unit": "C","Type": "T-FM ","Comment":"Temperatur T ","Value": lis_T_fm}, + {"Unit": "C","Type": "T-Room","Comment":"Temperatur T","Value": lis_T_room}, + {"Unit": "C","Type": "T-TL1 ","Comment":"Temperatur T","Value": lis_T_tl1}, + {"Unit": "C","Type": "T-TL2 ","Comment":"Temperatur T","Value":lis_T_tl2}, + {"Unit": "C","Type": "T-TL2 ","Comment":"Temperatur T","Value":lis_T_tl3}, + {"Unit": "C","Type": "T-TL3 ","Comment":"Temperatur T","Value": lis_T_tl4}], + "Pressure": [{"Unit": "Pa","Type": "Offset pressure ","Value":lis_p_offs}, + {"Unit": "Pa","Type": " pressure mean","Value":lis_p_fill}, + {"Unit": "bar","Type": "TL1 pressure ","Value":lis_p_ig}], + "Date": [{"Unit": "year-month-day","Type": "Datum ","Value":lis_datum}, + {"Unit": "hh:mm:ss","Type": "Messzeit ","Value":lis_time}], + "Valve": [{"Unit": "1","Type": "Connection", "Comment":"Connection of the leak" ,"Value":lis_valve}], + "Current": [{"Unit": "mbar","Type": "I-TL","Value": lis_I_TL}, + {"Unit": "mbar","Type": "I-FM","Value": lis_I_FM}, + {"Unit": "mbar","Type": "I-Offs","Value": lis_I_Offs}], + + "CurrentTime": [{"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-TL","Value": lis_I_TL_time}, + {"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-FM","Value": lis_I_FM_time}, + {"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-Offs","Value": lis_I_Offs_time}] + + } + doc["Calibration"]["Measurement"]["Date"]=[{"Type": "measurement","Value": datum_meas}] + + doc["Calibration"]["Measurement"]["Values"]["Conductance"]={"t": [{"Unit": "s","Type": "t1","Comment":"Zeitpunkt t1 des 1.SZ","Value": lis_t1}, + {"Unit": "s","Type": "t2","Comment":"Zeitpunkt t2 des 2.SZ","Value": lis_t2}, + {"Unit": "s","Type": "t3","Comment":"Zeitpunkt t3 des 3.SZ","Value": lis_t3}, + {"Unit": "s","Type": "t4","Comment":"Zeitpunkt t4 des 4.SZ","Value": lis_t4}], + "time": [{"Unit": "s","Type": "time1","Comment":"Zeit t2-t1 von SZ","Value": lis_time1}, + {"Unit": "s","Type": "time2","Comment":"Zeit t3-t2 von SZ","Value": lis_time2}, + {"Unit": "s","Type": "time3","Comment":"Zeit t4-t3 von SZ","Value": lis_time3}], + "m": [{"Unit": "Pa/s","Type": "m1","Comment":"Steigung m1 des 1.SZ","Value": lis_m1}, + {"Unit": "Pa/s","Type": "m2","Comment":"Steigung m1 des 2.SZ","Value": lis_m2}, + {"Unit": "Pa/s","Type": "m3","Comment":"Steigung m1 des 3.SZ","Value": lis_m3}, + {"Unit": "Pa/s","Type": "m3","Comment":"Steigung m1 des 4.SZ","Value": lis_m3}], + "pressure": [{"Unit": "Pa","Type": "pmean","Comment":"Mittelwert von p","Value": lis_pmean}, + {"Unit": "Pa","Type": "pmin","Comment":"p_min des SZ","Value": lis_pmin}, + {"Unit": "Pa","Type": "pmax","Comment":"p_max des SZ","Value": lis_pmax}], + "l": [{"Unit": "mm","Type": "l","Comment":"Hub des Verdrängers","Value": lis_h}], + "C": [{"Unit": "m^3/s","Type": "Constanter Leitwert ","Value": lis_c}] + + } + + + + + + print("Constantes Volumen") + + + +else: + + lis_c = L_ar.tolist() + if gauge == 0.01 : + doc["Calibration"]["Measurement"]["Values"]={"Temperature": [{"Unit": "C","Type": "T-FM ","Comment":"Temperatur T ","Value": lis_T_fm}, + {"Unit": "C","Type": "T-Room","Comment":"Temperatur T","Value": lis_T_room}, + {"Unit": "C","Type": "T-TL1 ","Comment":"Temperatur T","Value": lis_T_tl1}, + {"Unit": "C","Type": "T-TL2 ","Comment":"Temperatur T","Value":lis_T_tl2}, + {"Unit": "C","Type": "T-TL2 ","Comment":"Temperatur T","Value":lis_T_tl3}, + {"Unit": "C","Type": "T-TL3 ","Comment":"Temperatur T","Value": lis_T_tl4}], + "Pressure": [{"Unit": "DCR","Type": "Offset pressure SRG","Value":lis_p_offs_srg}, + {"Unit": "DCR","Type": "Fill pressure SRG ","Value":lis_p_fill_srg}, + {"Unit": "Pa","Type": "Offset pressure 01Torr","Value":lis_p_offs_01}, + {"Unit": "Pa","Type": "Fill pressure 01Torr","Value":lis_p_fill_01}, + {"Unit": "bar","Type": "TL1 pressure ","Value":lis_p_ig}], + "Date": [{"Unit": "year-month-day","Type": "Datum ","Value":lis_datum}, + {"Unit": "hh:mm:ss","Type": "Messzeit ","Value":lis_time}], + "Valve": [{"Unit": "1","Type": "Connection", "Comment":"Connection of the leak" ,"Value":lis_valve}], + "Current": [{"Unit": "mbar","Type": "I-TL","Value": lis_I_TL}, + {"Unit": "mbar","Type": "I-FM","Value": lis_I_FM}, + {"Unit": "mbar","Type": "I-Offs","Value": lis_I_Offs}], + + "CurrentTime": [{"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-TL","Value": lis_I_TL_time}, + {"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-FM","Value": lis_I_FM_time}, + {"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-Offs","Value": lis_I_Offs_time}] + } + print("SRG") + + else: + doc["Calibration"]["Measurement"]["Values"]={"Temperature": [{"Unit": "C","Type": "T-FM ","Comment":"Temperatur T ","Value": lis_T_fm}, + {"Unit": "C","Type": "T-Room","Comment":"Temperatur T","Value": lis_T_room}, + {"Unit": "C","Type": "T-TL1 ","Comment":"Temperatur T","Value": lis_T_tl1}, + {"Unit": "C","Type": "T-TL2 ","Comment":"Temperatur T","Value":lis_T_tl2}, + {"Unit": "C","Type": "T-TL2 ","Comment":"Temperatur T","Value":lis_T_tl3}, + {"Unit": "C","Type": "T-TL3 ","Comment":"Temperatur T","Value": lis_T_tl4}], + "Pressure": [{"Unit": "Pa","Type": "Offset pressure ","Value":lis_p_offs}, + {"Unit": "Pa","Type": " pressure fill","Value":lis_p_fill}, + + {"Unit": "bar","Type": "TL1 pressure ","Value":lis_p_ig}], + "Date": [{"Unit": "year-month-day","Type": "Datum ","Value":lis_datum}, + {"Unit": "hh:mm:ss","Type": "Messzeit ","Value":lis_time}], + "Valve": [{"Unit": "1","Type": "Connection", "Comment":"Connection of the leak" ,"Value":lis_valve}], + "Current": [{"Unit": "mbar","Type": "I-TL","Value": lis_I_TL}, + {"Unit": "mbar","Type": "I-FM","Value": lis_I_FM}, + {"Unit": "mbar","Type": "I-Offs","Value": lis_I_Offs}], + + "CurrentTime": [{"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-TL","Value": lis_I_TL_time}, + {"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-FM","Value": lis_I_FM_time}, + {"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-Offs","Value": lis_I_Offs_time}] + } + doc["Calibration"]["Measurement"]["Values"]["Conductance"]={ "C": [{"Unit": "m^3/s","Type": "Constanter Leitwert ","Value": lis_c}]} + print("Constanter Leitwert") + + + + + + + +doc["Calibration"]["Measurement"]["Date"]=[{"Type": "measurement","Value": datum_meas}] + + + + + + +lis_mass_no = mass_no.tolist()[0] +lis_mass_value = mass_value.tolist() +lis_mass_value_offs = mass_value_offs.tolist()[0] + + + + +key_value=dict(zip(def_key, def_value)) +key_value_offs=dict(zip(def_key_offs, def_value_offs)) + + + +doc["Calibration"]["Measurement"]["AuxValues"]={"ScanQMS": [{"Unit": "Mass","Type": "QMS ","Comment":"Masse ","Value":lis_mass_no}, + {"Unit": "mbar","Type": "Current","Comment":"Wert / Masse","Value": lis_mass_value}, + {"Unit": "mbar","Type": "Current Offset","Comment":"Wert / Masse","Value": lis_mass_value_offs}], + "DefQMS": [{"Type": "Scan QMS ","Value":key_value}, + {"Type": "Scan Offset QMS","Value": key_value_offs}]} + + +#doc["Calibration"]["Measurement"]["AuxValues"]={"ScanQMS": [{"Unit": "Mass","Type": "QMS ","Comment":"Masse ","Value":lis_mass_no}, +# {"Unit": "mbar","Type": "Current","Comment":"Wert / Masse","Value": lis_mass_value}, +## {"Unit": "mbar","Type": "Current Offset","Comment":"Wert / Masse","Value": lis_mass_value_offs}], +# "DefQMS": [{"Type": "Scan QMS ","Value":key_value}, +# {"Type": "Scan Offset QMS","Value": key_value_offs}]} + +db.save(doc) + +content=pathlib.Path('Scan.pdf').read_bytes() + +db.put_attachment(doc, content, "Scan.pdf" , content_type="'application/pdf") + + + + diff --git a/testplot.py b/testplot.py new file mode 100644 index 0000000..362af10 --- /dev/null +++ b/testplot.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +""" +Created on Thu Feb 22 11:21:17 2024 + +@author: becker07 +""" + +from matplotlib import pyplot as plt +import pathlib +from statistics import mean +from datetime import datetime +from IPython.display import Markdown as md +import numpy as np +import re +import math +import statistics +import pandas as pd +import json +import couchdb +import PyPDF2 + + +couch = couchdb.Server('http://a73434.berlin.ptb.de:5984') +db = couch['vl_db'] # existing +#json_file = "cal-" + year + "-fm1-" + "-" + cal_cert + "_" + no + + +json_file = "cal-2024-fm1-kk-75565_0001" +print(json_file) + + +doc = db.get(json_file) + + + + +I_Scan_Offs=np.array(doc["Calibration"]["Measurement"]["AuxValues"]["ScanQMS"][2]["Value"]) +I_Scan_Offs=np.float64(I_Scan_Offs[2:-2]) +I_Scan=np.array(doc["Calibration"]["Measurement"]["AuxValues"]["ScanQMS"][1]["Value"]) +I_Scan=np.float64(I_Scan[2:-2]) +Mass_Scan=np.array(doc["Calibration"]["Measurement"]["AuxValues"]["ScanQMS"][0]["Value"]) +Mass_Scan=Mass_Scan[2:-2] + +for i in range(len(Mass_Scan)): + Mass_Scan[i] = re.sub(r"Mass ", "", Mass_Scan[i]).strip() + + +Mass_Scan=np.float64(Mass_Scan) + +fig=plt.figure() +ax=fig.add_axes([0,0,4,2]) +ax.set_xlabel('Masse') +ax.set_ylabel('QMS-Signal') +ax.set_yscale('log') +#plt.plot(1010,4.65e-10, 'bo') +plt.plot(Mass_Scan,I_Scan, label=r'Flow') +plt.plot(Mass_Scan,I_Scan_Offs,label=r'Offset' ) +plt.legend() + + +plt.grid() + +fig.savefig("Scan.pdf", bbox_inches='tight') + +content=pathlib.Path('Scan.pdf').read_bytes() + +db.put_attachment(doc, content, "Scan.pdf" , content_type="'application/pdf") + diff --git a/writeLaTex-ks-TL1.py b/writeLaTex-ks-TL1.py new file mode 100644 index 0000000..f9684e3 --- /dev/null +++ b/writeLaTex-ks-TL1.py @@ -0,0 +1,435 @@ +# -*- coding: utf-8 -*- +""" +Created on Tue Aug 23 09:45:09 2022 + +@author: becker07 +""" + +import time +import couchdb +from datetime import date +couch = couchdb.Server('http://a73434.berlin.ptb.de:5984') +db = couch['vl_db'] # existing + + +## Eingabe von: +# - Kalibrierscheinnummer +# - Jahr der Kalibrierung +# - laufende Nummer der Kalibrierung + +cal_cert = "75573" +year = "2024" +year_Mark=year[2:] +print(year_Mark) +no = "0001" +CertificateDate = str(date.today()) + + +json_file_cer = "cer-" + year + "-" + cal_cert + +print(json_file_cer) + + +id_cer = 0 + +mango = {'selector': {'_id':json_file_cer}} +for i in db.find(mango): + id_cer = 1 + +print(id_cer) + + +doc = {'_id': json_file_cer} + +if id_cer == 0: + db.save(doc) + print ( "Warten! 30 Sekunden" ) + time.sleep ( 30 ) + print ( json_file_cer," ist in der Couch angelegt" ) + +else: + print ( json_file_cer," ist bereits in der Couch angelegt" ) + + +id_ = "cal-" + year + "-fm1-kk-" + cal_cert + "_" + no +ks = "C:\\Users\\becker07\\kalibrierschein\\ks-" + cal_cert + "-" + year + ".tex" + +cer = "cer-" + year + "-" + cal_cert + +json_file_cal = id_ +json_file_cer = cer +doc_cal = db.get(json_file_cal) +doc_cer = db.get(json_file_cer) + + +print(json_file_cal) + + + +##### Meta ####### + +kind = doc_cal["Calibration"]["ToDo"]["Type"] +gas = doc_cal["Calibration"]["ToDo"]["Gas"] +lang = doc_cal["Calibration"]["Customer"]["Lang"] +calibration_type = "KK" +last_cert_no = doc_cal["Calibration"]["Presettings"] + + +###### überprüfen ob eine letztes Cal-Zeichen gibt ######################### + +if "LastCalibrationYear" in last_cert_no: + print("\"last_cert_no\" ist vorhanden.") + last_cert_no = doc_cal["Calibration"]["Presettings"]["LastCalibrationCertificate"] + last_cert_year = doc_cal["Calibration"]["Presettings"]["LastCalibrationYear"] + last_cert = last_cert_no + "\\,PTB\\," + last_cert_year[2:] + sectionDiscription_noyes= "yes" + print(last_cert) + +else: + print("\"last_cert_no\" ist nicht vorhanden.") + sectionDiscription_noyes= "no" + last_cert = "" + + + + + + +##### Titlepage ####### + + +MeasurementDateBegin = doc_cal["Calibration"]["Measurement"]["Date"][0]["Value"] +MeasurementDateBegin = MeasurementDateBegin[0] +MeasurementDateEnd = doc_cal["Calibration"]["Measurement"]["Date"][0]["Value"] +MeasurementDateEnd = MeasurementDateEnd[0] + + +CountryCode= lang +DeviceClass= "TLV" + +Standard = doc_cal["Calibration"]["ToDo"]["Standard"] +Land= doc_cal["Calibration"]["Customer"]["Address"]["Land"] + +##### Titlepage ####### +Certificate = str(doc_cal["Calibration"]["Certificate"]) +ReferenceNo = doc_cal["Calibration"]["Presettings"]["ReferenceNo"] +Name= doc_cal["Calibration"]["Customer"]["Name"] +AddName= doc_cal["Calibration"]["Customer"]["AddName"] +Street= doc_cal["Calibration"]["Customer"]["Address"]["Street"] +Town= doc_cal["Calibration"]["Customer"]["Address"]["Town"] +Zipcode= doc_cal["Calibration"]["Customer"]["Address"]["Zipcode"] +ObjectOfCalibration= doc_cal["Calibration"]["CustomerObject"]["Type"] +Producer= doc_cal["Calibration"]["CustomerObject"]["Device"]["Producer"] +Type= doc_cal["Calibration"]["CustomerObject"]["Device"]["Type"] ########## Type +Object= doc_cal["Calibration"]["CustomerObject"]["NameCer"] ########## Gegenstand/Object +Serial= doc_cal["Calibration"]["CustomerObject"]["Name"] ########## Kennummer +Examiner= doc_cal["Calibration"]["Measurement"]["Maintainer"] +ByOrder= "Dr. Matthias Bernien" +MeasurementDate= doc_cal["Calibration"]["Result"]["Formula"]["MeasurementDate"] +QMS= doc_cal["Calibration"]["Result"]["Formula"]["QMS"] + +print(MeasurementDate) + +obj ='\\object{'+ Object + '}\n' +manufacturer = '\\manufacturer{' + Producer +' }\n' +typ = '\\type{' + Type + '}\n' +serialNo = '\\serialNo{' + Serial + '}\n' +applicant = '\\applicant{{' + Name + '}\n {' + Street + '} \n {' + Zipcode +' ' + Town +'}\n {' + Land+'}}\n' +refNo = '\\refNo{ ' + ReferenceNo + '}\n' +calibMark = '\\calibMark{ ' + Certificate + ' PTB ' + year_Mark + '}\n' +print(calibMark) +calibDate = '\\calibDate{' + MeasurementDate + '}\n' +examiner = '\\examiner{' + Examiner + '}\n' +certificateDate = '\\certificateDate{' + CertificateDate + '}\n' + +##################section Beschreibung zum Kalibriergerät + + +if (sectionDiscription_noyes!= 'yes'): + + sectionDiscription_2= " Dies ist die erste von der PTB durchgeführte Kalibrierung." + sectionDiscription_2_en= "This is the first calibration at PTB." + print(" 1. durchgeführte Kalibrierung") + +else: + + sectionDiscription_2= " Die von der PTB zuletzt durchgeführten Kalibrierung ist im Kalibrierschein " + last_cert + " beschrieben." + sectionDiscription_2_en= " The previous calibration at PTB had been carried out " + last_cert_year + ' with the calibration mark ' + last_cert + " ." + + +TextDE= doc_cal["Calibration"]["CustomerObject"]["Text"]["description"]["de"] +TextEN= doc_cal["Calibration"]["CustomerObject"]["Text"]["description"]["en"] + +sectionText_title_de = 'Beschreibung zum Kalibriergerät ' +sectionText_title_en = 'Description relating to calibration device' +sectionTitleText_de = '\\section{' + sectionText_title_de + '\\linebreak {\\small \\emph{' + sectionText_title_en + 'Description relating to calibration device}}}\n' + TextDE + sectionDiscription_2+'\n' + '\\begin{english}' + TextEN + sectionDiscription_2_en +'\\end{english} \n' +sectionTitleText_en = '\\section{' + sectionText_title_en + ' }\n' + TextEN +sectionDiscription_2_en +'\n' + + + + + + + +######################### Messverfahren ######################################################################### + +sectionTitelProcedure = 'Kalibrierverfahren ' +sectionTitelProcedure_en = 'Calibration procedure' +sectionTitelProcedure_text_en = '\\section{' + sectionTitelProcedure_en + '}\n ' +sectionTitelProcedure_text = '\\section{' + sectionTitelProcedure + '\\linebreak {\\small \\emph{' + sectionTitelProcedure_en + '}}}\n ' + +sectionProcedure1='Der aus dem thermostatisierten Testleck TL austretende Gasfluss wird mit Hilfe eines Massenspektrometers mit einem annähernd gleich groß eingestellten Gasfluss \\(q_{\\text{mol, FM}}\\) verglichen, dessen Größe mit einem Durchflussmesser (Flowmeter FM) bestimmt wird. Die Durchflussmessung erfolgt bei konstantem Druck \\(p_\\text{FM}\\) und konstanter Temperatur \\(T_{\\text{FM}}\\).\n ' +sectionProcedure1_en ='The gas flow from the leak TL is compared with a gas flow \\(q_{\\text{mol, FM}}\\) of about the same flow rate from a flow meter FM by a mass spectrometer. The flow measurement is operated at constant pressure \\(p_{\\text{FM}}\\) and constant (absolute) temperature \\(T_{\\text{FM}}\\). \n' +sectionProcedureE1 = ' \\[ q_{\\text{mol, FM}} = p_{\\text{FM}} \\cdot C \\cdot \\frac{1}{R \\cdot T_{\\text{FM}}} \\] ' +sectionProcedure2=' Der Druck \\(p_{\\text{FM}}\\) wurde mit einem kapazitiven Membranvakuummeter gemessen. Dieses Gerät ist durch Vergleich mit einem Primärnormal der PTB kalibriert worden. Der Leitwert \\(C\\) wird aus der zeitlichen Volumenänderung (\\(\\Delta V/\\Delta t\\)) eines zusammendrückbaren, kalibrierten Federbalgs (\\(\\Delta V\\)) und einer elektronischen Uhr (\\(\\Delta t\\)) ermittelt. Die molare Gaskonstante \\(R\\) hat den Wert 83,145~\\(\\text{mbar}\\)~\\(\\text{l}\\)~\\(\\text{mol}^{-1}\\)~\\(\\text{K}^{-1}\\). \n ' +sectionProcedure2_en=' The pressure \\(p_{\\text{FM}}\\) is measured with a capacitance diaphragm gauge. This gauge is calibrated by comparison with a primary standard of PTB. The conductance \\(C\\) of the capillary integrated in the flow meter is obtained from the temporal volume change (\\(\\Delta V/\\Delta t\\)) that is needed to keep \\(p_\\text{FM}\\) constant. It is measured by means of a calibrated bellow and an electronic clock. The molar gas constant \\(R\\) has the value 83.145~\\(\\text{mbar}\\)~\\(\\text{l}\\)~\\(\\text{mol}^{-1}\\)~\\(\\text{K}^{-1}\\). ' +sectionProcedureE3 = ' \\[ q_{\\text{mol, TL}} = q_{\\text{mol, FM}} \\cdot \\frac{S_{\\text{TL}}}{S_{\\text{FM}}} \\] ' +sectionProcedure3=' Die Leckrate \\(q_{\\text{mol, TL}}\\) des Testlecks wird nach folgender Beziehung berechnet:' +sectionProcedure3_en=' The molar leak rate \\(q_{\\text{mol, TL}}\\) of the test leak can be calculated by the following equation:' +sectionProcedure4=' mit \\(S_\\text{TL}\\) dem Signal am Massenspektrometer für den Gasfluss des Testlecks und \\(S_\\text{FM}\\) dem Signal am Massenspektrometer für den eingestellten Vergleichsgasfluss.' +sectionProcedure4_en=' whereby \\(S_{\\text{TL}}\\) is the signal at the mass spectrometer for the gas flow from the test leak and \\(S_{\\text{FM}}\\) the signal at the mass spectrometer for the gas flow from the flow meter.' + + + +sectionProcedure_text= sectionProcedure1 + sectionProcedure2 +'\\begin{english}' + sectionProcedure1_en + sectionProcedure2_en + '\\end{english}' + sectionProcedureE1 + sectionProcedure3 + '\\begin{english}' + sectionProcedure3_en + '\\end{english} '+ sectionProcedureE3 + sectionProcedure4 + '\\begin{english}' + sectionProcedure4_en + '\\end{english} ' +sectionProcedure_text_en= sectionProcedure1_en + sectionProcedure2_en + sectionProcedureE1 + sectionProcedure3_en + sectionProcedureE3 + sectionProcedure4_en + '\n' + + + + +################## Ergebnisse ################################################### + +NoOfMeasurements= doc_cal["Calibration"]["Result"]["Formula"]["NoOfMeasurements"] +FlowMol= doc_cal["Calibration"]["Result"]["Formula"]["FlowMol"] +FlowpV23= doc_cal["Calibration"]["Result"]["Formula"]["FlowpV23"] +FlowpV2X= doc_cal["Calibration"]["Result"]["Formula"]["FlowpV2X"] +TemperatureTL= doc_cal["Calibration"]["Result"]["Formula"]["TemperatureTL"] +TemperatureTLx= doc_cal["Calibration"]["Result"]["Formula"]["TemperatureTLx"] + + +QMS= doc_cal["Calibration"]["Result"]["Formula"]["QMS"] +Gauge= doc_cal["Calibration"]["Result"]["Formula"]["Gauge"] +LeakUncertainty= doc_cal["Calibration"]["Result"]["Formula"]["LeakUncertainty"] +print("TLX= ",TemperatureTLx) + +sectionTitelMeasurement = 'Messergebnis ' +sectionTitelMeasurement_en = 'Measurement results' +sectionTitelMeasurement_text_en = '\\section{' + sectionTitelMeasurement_en + '}\n ' +sectionTitelMeasurement_text = '\\section{' + sectionTitelMeasurement + '\\linebreak {\\small \\emph{' + sectionTitelMeasurement_en + '}}}\n ' + + +sectionResultMol = 'Mit dem thermostatisierten Testleck wurden insgesamt ' + NoOfMeasurements + '~Leckratenbestimmungen bei einer Testlecktemperatur von \\( \\vartheta_\\text{TL}= \\SI{' + TemperatureTL + '}{\\degreeCelsius} \\) durchgeführt. Der Mittelwert ergab die (molare) Leckrate: ' +sectionResultMol_en = NoOfMeasurements + '~measurements were carried out at a leak temperature of \\( \\vartheta_\\text{TL}= \\SI{' + TemperatureTL + '}{\\degreeCelsius} \\) (thermostated). The mean leak rate (molar flow) was determined to: ' +sectionResultMol_pup_en = NoOfMeasurements + '~measurements were carried out at a leak temperature of \\( \\vartheta_\\text{TL}= \\SI{' + TemperatureTL + '}{\\degreeCelsius} \\) (thermostated). The mean leak rate (molar flow) for relativ pressure \\( p_{\\text{up}}=\\SI{0.0}{\\bar} \\) (leak indication) at the upstream pressure side was determined to: ' + +sectionResultMolVal= '\\[ q_\\text{mol}(\\vartheta_\\text{TL}) =\\SI{' + FlowMol + '}{\\mol\\per\\second} \\] ' +sectionResultMolVal_en= '\\( q_\\text{mol}(\\vartheta_\\text{TL}) =\\SI{' + FlowMol + '}{\\mol\\per\\second} \\) ' +sectionResultpV = 'Daraus kann für den Ort mit einer Temperatur \\(\\vartheta_\\text{Ch}\\) in \\si{\\degreeCelsius}, an dem sich der Prüfling befindet und mit \\(T_0 = \\SI{273.15}{\\kelvin}\\), der \\(pV\\)-Durchfluss nach folgender Beziehung berechnet werden.' +sectionResultpV_en = 'From this the \\(pV\\)-flow can be calculated for a place at a temperature \\(\\vartheta_\\text{Ch}\\) (in \\si{\\degreeCelsius}), where a device under test is mounted and \\(T_0 = \\SI{273.15}{\\kelvin}\\), by the equation:' +sectionResultpVVal = '\\[q_{pV}(\\vartheta_\\text{Ch}) = q_{\\text{mol}}(\\vartheta_\\text{TL})\\cdot R \\cdot (\\vartheta_\\text{Ch} + T_0)\\] ' + +sectionResultpV_T = 'Bei einer Kammertemperatur von \\( \\vartheta_\\text{TL}= \\SI{23}{\\degreeCelsius} \\) beträgt die Leckrate \\( q_{pV}(\\SI{23}{\\degreeCelsius}) \\):' +sectionResultpV_T_en = 'At a chamber temperature \\(\\vartheta_\\text{Ch}=\\SI{23}{\\degreeCelsius}\\) the leak rate \\(q_{pV}(\\SI{23}{\\degreeCelsius})\\) will be:' + +sectionResultpV_Tx = 'und bei einer Kammertemperatur von \\( \\vartheta_\\text{TL}= \\SI{'+ TemperatureTLx +'}{\\degreeCelsius} \\) beträgt die Leckrate \\( q_{pV}(\\SI{'+ TemperatureTLx +'}{\\degreeCelsius}) \\):' +sectionResultpV_Tx_en = 'and at a chamber temperature \\(\\vartheta_\\text{Ch}=\\SI{'+ TemperatureTLx +'}{\\degreeCelsius}\\) the leak rate \\(q_{pV}(\\SI{'+ TemperatureTLx +'}{\\degreeCelsius})\\) will be:' + +sectionResultpVVal_T23 = ' \\[q_{pV}(\\SI{23}{\\degreeCelsius})= \\num{' + FlowpV23 + '} ~\\text{Pa}~\\text{m}^3~\\text{s}^{-1}\\]' +sectionResultpVVal_T23_en = '\\( q_{pV}(\\SI{23}{\\degreeCelsius})= \\num{' + FlowpV23 + '} ~\\text{Pa}~\\text{m}^3~\\text{s}^{-1}\\)' +sectionResultpVVal_Tx = ' \\[q_{pV}(\\SI{' + TemperatureTLx + '}{\\degreeCelsius})= \\num{' + FlowpV2X + '} ~\\text{Pa}~\\text{m}^3~\\text{s}^{-1}\\]' +sectionResultpVVal_Tx_en = ' \\( q_{pV}(\\SI{'+ TemperatureTLx +'}{\\degreeCelsius})= \\num{' + FlowpV2X + '} ~\\text{Pa}~\\text{m}^3~\\text{s}^{-1}\\)' + + +sectionResultU = 'Die relative Unsicherheit \\(U\\) der angegebenen Leckraten beträgt \\( \\SI{'+ LeakUncertainty +'}{\\percent} \\).' +sectionResultU_en = 'The relative uncertainty \\(U\\) of the stated leak rate is \\( \\SI{'+ LeakUncertainty +'}{\\percent} \\). ' + + +sectionResult = sectionResultMol + sectionResultMolVal +'\\begin{english}' + sectionResultMol_en + sectionResultMolVal_en + '\\end{english}' + sectionResultpV + '\\begin{english}' + sectionResultpV_en +'\\end{english}' + sectionResultpVVal + '\\linebreak ' + sectionResultpV_T + sectionResultpVVal_T23 + '\\begin{english}' + sectionResultpV_T_en + sectionResultpVVal_T23_en + '\\end{english}' + sectionResultU + '\\begin{english}' + sectionResultU + '\\end{english}' +sectionResult_Tx = sectionResultMol + sectionResultMolVal +'\\begin{english}' + sectionResultMol_en + sectionResultMolVal_en + '\\end{english}' + sectionResultpV + '\\begin{english}' + sectionResultpV_en +'\\end{english}' + sectionResultpVVal + sectionResultpV_T + sectionResultpVVal_T23 + sectionResultpV_Tx + sectionResultpVVal_Tx + '\\begin{english}' + sectionResultpV_T_en + sectionResultpVVal_T23_en + sectionResultpV_Tx_en + sectionResultpVVal_Tx_en + '\\end{english}' + sectionResultU + '\\begin{english}' + sectionResultU + '\\end{english}' + + +sectionResult_en = sectionResultMol_en + sectionResultMolVal + sectionResultpV_en + sectionResultpVVal + sectionResultpV_T_en + sectionResultpVVal_T23 +#sectionResult_en = sectionResultMol_pup_en + sectionResultMolVal + sectionResultpV_en + sectionResultpVVal + sectionResultpV_T_en + sectionResultpVVal_T23 + +######################################## Unsicherheit ###################################################### + +sectionU = 'Angegeben ist die erweiterte Messunsicherheit \\(U\\), die sich aus der Standardmessunsicherheit durch Multiplikation mit dem Erweiterungsfaktor \\(k = 2\\) ergibt. Sie wurde gemäß dem „Guide to the Expression of Uncertainty in Measurement (GUM)“ ermittelt. Der Wert der Messgröße liegt dann im Regelfall mit einer Wahrscheinlichkeit von annähernd \\SI{95}{\\percent} im zugeordneten Überdeckungsintervall.\\n ' +sectionU_en = 'The uncertainty \\(U\\) stated is the expanded measurement uncertainty obtained by multiplying the standard measurement uncertainty by the coverage factor \\(k = 2\\). It has been determined in accordance with the “Guide to the Expression of Uncertainty in Measurement (GUM)”. The value of the measurand then normally lies, with a probability of approximately \\SI{95}{\\percent} within the attributed coverage interval.' + +sectionU_text = sectionU + '\\begin{english} ' + sectionU_en + '\\end{english}' +sectionU_text_en = sectionU_en + +sectionTitelUncertainty = 'Unsicherheit ' +sectionTitelUncertainty_en = 'Uncertainty of Calibration' +sectionTitelUncertainty_text_en = '\\section{' + sectionTitelUncertainty_en + '} ' +sectionTitelUncertainty_text = '\\section{' + sectionTitelUncertainty + '\\linebreak {\\small \\emph{' + sectionTitelUncertainty_en + '}}}' + + + + +if(lang!='en'): + print("de",lang) + with open(ks,'w', encoding='utf-8') as file: + + file.write('\\listfiles\n') + file.write('\\documentclass[de,KK,CMC]{kalibrierschein}\n ') + file.write(obj) + file.write(manufacturer) + file.write(typ) + file.write(serialNo) + file.write(applicant) + file.write(refNo) + file.write(calibMark) + file.write(calibDate) + file.write('\\byOrder{Dr. M.Bernien}\n') + file.write(examiner) + file.write(certificateDate) + + file.write('\\begin{document}\n') + + file.write('\\printFirstPage\n') + + file.write(sectionTitleText_de) + sectionText = sectionTitleText_de + + file.write(sectionTitelProcedure_text) + file.write(sectionProcedure_text) + file.write('\\pagebreak') + file.write(sectionTitelMeasurement_text) + + + if(TemperatureTLx!=23): + file.write(sectionResult_Tx) + print("nicht 23") + + else: + file.write(sectionResult) + print(" 23 ToDo", sectionResult) + + + + + file.write('\\section{Unsicherheit \\linebreak {\\small \\emph{Uncertainty of Calibration}}} ') + file.write(sectionU_text) + + file.write('\\printLastPage') + file.write('\\end{document}\\n') + + + + + + + +else: + print("en Kal",lang) + with open(ks,'w', encoding='utf-8') as file: + + file.write('\\listfiles\n') + file.write('\\documentclass[en,KK,CMC]{kalibrierschein}\n ') + file.write(obj) + file.write(manufacturer) + file.write(typ) + file.write(serialNo) + file.write(applicant) + file.write(refNo) + file.write(calibMark) + file.write(calibDate) + file.write('\\byOrder{Dr. M.Bernien}\n') + file.write(examiner) + file.write(certificateDate) + + file.write('\\begin{document}\n') + + file.write('\\printFirstPage\n') + + file.write(sectionTitleText_en) + sectionText = sectionTitleText_en + + file.write(sectionTitelProcedure_text_en) + file.write(sectionProcedure_text_en) + + file.write(sectionTitelMeasurement_text_en) + file.write(sectionResult_en) + file.write(sectionResultU_en) + + if(TemperatureTLx == 23): + file.write(sectionResult_Tx) + print("nicht 23",TemperatureTLx) + + else: + + print(" 23 ToDo") + + #file.write(sectionTitelUncertainty_text_en) + #file.write(sectionU_text_en) + + file.write('\\printLastPage') + file.write('\\end{document}') + + + + +doc_cer["Certificate"]={"Meta":{"std": ["FM1"], + "id":[id_], + "kind" :[kind], + "gas": [gas], + "lang":lang, + "calibration_type":calibration_type, + }} + + + +doc_cer["Certificate"]["Titlepage"]={"CertificateDate" :CertificateDate, + "FullYear": "2024", + "ShortYear": "24", + "MeasurementDate": MeasurementDate, + "MeasurementDateBegin": MeasurementDateBegin, + "MeasurementDateEnd": MeasurementDateEnd, + "Certificate": Certificate, + "ReferenceNo": ReferenceNo, + "Customer": { + "Name": Name, + "AddName": AddName, + "Street": Street, + "Town": Town, + "Zipcode": Zipcode, + "Land": Land, + "CountryCode": Land }, + "ObjectOfCalibration": ObjectOfCalibration, + "Producer": Producer, + "Type": Type, + "Object": Object, + "Serial": Serial , + "Examiner": Examiner, + "DeviceClass": DeviceClass, + "ByOrder": ByOrder, + } + + + + + +doc_cer["Certificate"]["Section"]= [{"Heading": "Description relating to calibration device","Paragraph":sectionText}, + {"Heading": "Calibration procedure","Paragraph":sectionProcedure_text}, + {"Heading": "Measurement results","Paragraph":sectionResult}, + {"Heading": "Uncertainty of Calibration","Paragraph":sectionU}], + +doc_cer["Certificate"]["Formula"]={"NoOfMeasurements": NoOfMeasurements, + "FlowMol": FlowMol, + "FlowpV23": FlowpV23, + "FlowpV2X":FlowpV2X, + "Gauge": Gauge, + "TemperatureTL": TemperatureTL, + "TemperatureTLx": TemperatureTLx, + "LeakUncertainty": LeakUncertainty, + "MeasurementDate": MeasurementDate, + "QMS": QMS, + + } +db.save(doc_cer) + + + + + -- GitLab