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