#Use venv

import numpy as np

from scipy.optimize import curve_fit

import matplotlib.pyplot as plt

# importing module
from pandas import *
 
# reading CSV file
data = read_csv("20240423_EC_Calibration.csv")
 
# converting column data to list
solutionAdded = data['solutionAdded'].tolist() #in ml
tempReservoir = data['tempReservoir'].tolist() #in C
adc = data['ECadcAdjusted_A'].tolist() #adc reading



#solutionEC=5924.8 #mg/L NaCl
solutionEC=5690 #mg/L NaCl
startWaterAmount=300 #mL (same unit as solutionAded)

ppmToECfactor=1/0.46


## EC Calutation
'''
concentration = [x*solutionConcentration/(startWaterAmount+x) for x in solutionAdded]
ECcalculated = [x*ppmToECfactor for x in concentration] #uS/cm
'''
### OR
## EC of solution given
ECcalculated = [x*solutionEC/(startWaterAmount+x) for x in solutionAdded] #uS/cm


#ECmeasured = data['ecMeasured'].tolist() #in C

#print("Concentration")
#print(concentration)
print("")
print("ECcalculated")
print(ECcalculated)

 

x = adc

y = ECcalculated
#y = ECmeasured



'''
def model(x, a, b, c, d, e):
	y = a * x**4 + b *x**3 + c*x**2 + d*x + e
	return y


popt, pcov = curve_fit(model, x, y)

#y1 = a * numpy.exp(b * x)

#print("popt="+str(popt))
for p in popt:
	print(p)
'''

plt.plot(x, y, 'ok')



xstart = np.min(adc)
xstop = np.max(adc)
increment = 10
xmodel = np.arange(xstart,xstop,increment)


#ymodel = model(xmodel, *popt)
#plt.plot(xmodel,ymodel, 'r')




for model_order in [3,4,5,6]:
	print("model order="+str(model_order))
	# Finding the Model
	p = np.polyfit(x, y, model_order)
	#print(p)
	polystring=""
	for i in np.arange(model_order+1):
		_c=str(p[i])
		if p[i]>=0:
			_c="+"+_c #add leading +
		polystring+=_c+"*x^"+str(model_order-i)+" "
	print(polystring)
	print("Excel:")
	for i in np.arange(model_order+1):
		print(str(p[i]))
	print("Array:")
	arraystring="{"
	for i in np.arange(model_order+1):
		arraystring+=str(p[model_order-i])
		arraystring+=","
	arraystring=arraystring[:-1]+"}"
	print(arraystring)
	# Plot the Model
	ymodel = np.polyval(p, xmodel)
	plt.plot(xmodel,ymodel,label="order="+str(model_order))
	print()

plt.legend()
plt.grid()
plt.show()