# PYTHOSKOLE: Titrering
# Versjon: 07.10.2021
# Kontakt: post@pythonskole.no
from pylab import *

# Importering av data
volum_data = []
pH_data = []
# Innlesing av data
with open('titrering.csv') as file: # Åpner datafil
    next(file) # Hopper over overskrift-linjen
    # Les en linje av gangen
    for line in file:
        # Klargjør data for lagring i lister
        line = line.replace(",",".")      
        line = line.replace("\n","")      
        line = line.split(";")
        # Lagrer verdier fra fil til liste
        volum_data.append(float(line[0])) #Tilsatt volum
        pH_data.append(float(line[1]))  # Målt pH

# Beregn den deriverte numerisk
derivert_data = []              # Lag en liste for lagring
i = 0                           # Indeks for iterering 
while i <= len(volum_data)-2:   # Siste indeks er nest siste
    #Beregn den deriverte i punkt i (OBS linjeskift "\")
    derivert = (pH_data[i+1] - pH_data[i]) / \
         (volum_data[i+1] - volum_data[i])
    derivert_data.append(derivert) # Lagre verdien i listen
    i += 1                         # Øker indeksen med 1

# Finner indeksen til den maksimale verdien til den deriverte.
ekvivalens = derivert_data.index(max(derivert_data))
print('Halvtitreringspunktet nås etter at',
      round(volum_data[ekvivalens],2),'mL base er tilsatt')

# Plotting av data og den deriverte.
# I plottet, legg merke til at den høyeste 
# toppen i den deriverte samsvarer
# med halvtitreringspunktet
subplot(2,1,1)                              # Første plot:
plot(volum_data[0:-1], pH_data[0:-1],'go-') # Måledata (pH)
xticks(list(range(14)))                     # Låser x-aksen
title('pH som funksjon av tilført base')    # Tittel første plot
xlabel('mL tilført base')                   # Navn førsteaksen
ylabel('pH')                                # Navn andreaksen
grid()                                      # Rutenett

subplot(2,1,2)                              # Andre plot
plot(volum_data[0:-1], derivert_data,'go-') # Deriverte
xticks(list(range(14)))                     # Låser x-aksen
title('Endring i pH per mL tilført base')   # Tittel andre plot
xlabel('mL tilført base')                   # Navn førsteakse
ylabel('$\Delta$pH / $\Delta$mL')           # Navn andreakse
grid()                                      # Rutenett
tight_layout()                              # Ryddig tekst
show()                                      # Viser plott
