"""
Autor: Borek Leitl FJFI CVUT
last update 5.11.2017
"""
#from pygolem_lite import Shot
import numpy as np
import os, sys
import urllib
import matplotlib
matplotlib.rcParams['backend'] = 'Agg'
matplotlib.rc('font', size='10')
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
from scipy.ndimage import median_filter
from matplotlib.pyplot import axvline
import time
from scipy.optimize import curve_fit
def download(url, fileData = False):
"""
downloads data to file if given = want to save data and work with it later or to numpy table if the filename missing
substitutes all previous download functions
"""
if fileData:
try:
urllib.request.urlretrieve(url, fileData)
except:
print("can not get data")
return -1
#download value
else:
try:
with urllib.request.urlopen(url) as response:
val = response.read().splitlines()
val = float(val[0].decode(encoding="utf-8", errors="strict"))
return val
except:
print("can not get data")
return -1
#============================================================== FIT AXUV DATA IN SPECIFIC TIME - RESULT IS ESTIMATED PLASMA POSITION
def Gauss_function(x, a, x0, sigma,c):
return a * np.exp(-(x - x0)**2 / (2 * sigma**2)) +c
def Gauss_fit(x,y,baseMean):
"""
fit given data with gauss function - standart least square method is implicitly used by curve_fit from scipy.optimize
for test if the fit is appropriate, the use of student test or so is necessary
"""
#test if x,y have same dimension
if len(x) != len(y):
return print("Gauss_fit problem - wrong dimmensions of fitting data")
mean = sum(x * y) / sum(y)
sigma = np.sqrt(sum(y * (x - mean)**2) / sum(y))
popt, pcov = curve_fit(Gauss_function, x, y, p0=[max(y), mean, sigma,baseMean])
return popt, pcov
def get_verticalPosition(data,plasmaStart):
"""
"""
yCalib = -np.loadtxt("y_calibration.txt")/10 #midplane distance from detector axis to crossection of detector chord and midplane
x = np.linspace(-10,10,len(data[0,:]))
stampnum = 100
dataCh = data[::stampnum,:] #reduces data to 100 timepoints
time = np.linspace(0,len(data[0,:]),len(dataCh[:,0]))+plasmaStart*1e3
z = np.zeros(len(dataCh[:,0]))
for i in range(len(dataCh[:,0])):
try:
popt, pcov = Gauss_fit(yCalib,dataCh[i,:],baseMean = 0)
except:
popt = [0,0,0,0]
xmax = yCalib[np.argmax(dataCh[i,:])]
if abs(popt[1]) > 10:
popt[1] = 10*abs(popt[1])/popt[1]
z[i] = popt[1]
return [time, z]
#def fitAllData(data)
#"""
#fit all given data and return matrix of fit parameters
#"""
##TODO - nejaky jiny zpusob animace - bylo by dost sileny ukladat tolik obrazku na disk
#fitParMatrix =
#return fitParMatrix
#TODO rozhodovac� kriterium spravnost fitovani
#============================================================== FIT
def make_img(data, fname, interpolation, start, end,shotno, label,title):
plt.figure(figsize=[20, 8]) #size in inches
plt.imshow(data,
aspect='auto',
extent = [start * 1e3, end * 1e3, #time extents in ms
20, 1,], #channel idx
interpolation=interpolation,
cmap=plt.cm.hot,
)
hx = plt.colorbar()
hx.set_label(label)
plt.xlabel('time [ms]')
plt.ylabel('AXUV1 CHANNEL NUMBER')
plt.text(1, 2, 'TOP', backgroundcolor = "w") #TODO white background of the text - same for bottom
plt.text(1, 18, 'BOTTOM', backgroundcolor = "w")
#cx = axvline(x = 16,linewidth=5, color='black')
#cx.set_label('16 ms')
plt.title(title)
plt.yticks(np.arange(1, 19+1))
plt.savefig(fname)
plt.close() #close this figure
def make_multiplot(data,dataUloop,plasmaCurrent,plasmaPosition,plasmaPositionAXUV1,DataLight, fname, interpolation, start, end,shotno, label,title1, cam):
"""
plot bolo and fast camera image
"""
#AXUV1, H-alpha, Camera image , plasma position Mirnov vs plasma position bolo
plot_num = 5
if cam == -1:
plot_num =plot_num-1
plot_numAct = 1
fig = plt.figure(figsize=[20, 4*plot_num])
t = np.arange(len(dataUloop))/1e3
index_start = np.where(start*1e3 <= t)[0][0]
index_end = np.where(end*1e3 <= t)[0][0]
#plot AXUV1
ax=fig.add_subplot(plot_num,1,1)
#plt.figure(figsize=[100, 20]) #TODO size in inches try to change text size,...
imgplot = plt.imshow(data,
aspect='auto',
extent = [start * 1e3, end * 1e3, #time extents in ms
20, 1,], #channel idx
interpolation=interpolation,
cmap=plt.cm.hot,
)
ax.set_title('Before')
hx = plt.colorbar()
hx.set_label(label)
plt.xlabel('time [ms]')
plt.ylabel('CHANNEL NUMBER')
plt.text(1, 2, 'TOP', backgroundcolor = "w") #white background of the text - same for bottom
plt.text(1, 18, 'BOTTOM', backgroundcolor = "w")
#cx = axvline(t = 16,linewidth=5, color='black')
#cx.set_label('16 ms')
plt.title(title1)
plt.yticks(np.arange(1, 19+1))
fig.subplots_adjust(hspace=0.30)
plot_numAct +=1
#plot cam
if cam != -1:
ax=fig.add_subplot(plot_num,1,plot_numAct)
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
img2 = mpimg.imread('PLOTS/0211FastCamera.png')
imgplot = plt.imshow(img2,aspect='auto',extent = [start * 1e3, end * 1e3, 20, 1,]) #need to be extended same way as bolo pic
ax.set_title('Fast Camera - corrected image')
plt.axis("off")
plot_numAct +=1
#plot Uloop, Plasma current
#index_min = np.where(0.1 <= dataUloop)[0][0]
#index_max = np.where(dataUloop >= 0.1)[0][-1]
#t = index_min/1e3 + np.arange(len(dataUloop))/1000
ax=fig.add_subplot(plot_num,1,plot_numAct)
ax.set_title('Uloop - SHOT: %s' %shotno)
box = ax.get_position()
plt.ylim((0,np.max(dataUloop)))
ax.plot(t[index_start:index_end],dataUloop[index_start:index_end], "r-", label = "Uloop")
ax.plot(np.nan, "b-", label = "Plasma current") #agent for ax2 label for legend all in one
plt.legend(loc = 2)
#plt.axvline(start*1e3, color = "black", linestyle = "dashed")
#plt.axvline(end*1e3, color = "black", linestyle = "dashed")
plt.xlabel("time [ms]")
ax.set_ylabel("U [V]")
ax2 = ax.twinx()
ax2.plot(t[index_start:index_end],plasmaCurrent[index_start:index_end]/1e3, "b-", label = "Plasma current") #/1e3 to kA
ax2.set_ylabel("I [kA]")
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
ax2.set_position([box.x0, box.y0, box.width * 0.8, box.height])
plt.xlim(start*1e3,end*1e3)
plot_numAct +=1
#add position - comparison of fitted position-bolo with estimation from Mirnov coils data
ax=fig.add_subplot(plot_num,1,plot_numAct)
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
plt.xlabel("time [ms]")
plt.ylabel("z [cm]")
z = plasmaPositionAXUV1[1]
time = plasmaPositionAXUV1[0]
plt.plot(time,-z,"rx", label = "Z - AXUV1")
ax.set_title('Plasma vertical position AXUV1 - SHOT: %s' %shotno)
if type(plasmaPosition) != int: #added only if data from Mirnov coils exists
plt.plot(plasmaPosition[:,0]*1e3,plasmaPosition[:,1]*1e2, label = "Z - MirnovJK")
ax.set_title('Plasma vertical position from Mirnov coils JK script vs AXUV1 - SHOT: %s' %shotno)
plt.legend(loc = 1)
plt.xlim(start*1e3,end*1e3)
plt.ylim(-10,10)
plot_numAct +=1
#plot H-alpha and Visible light
ax = fig.add_subplot(plot_num,1,plot_numAct)
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
plt.plot(DataLight[:,0],-DataLight[:,1],"g-",label = "HAlpha")
plt.plot(DataLight[:,0],-DataLight[:,2],"b-",label = "Visible light")
plt.legend(loc = 1)
ax.set_label("time [ms]")
ax.set_ylabel("intensity [a.u.]")
ax.set_title('H-alpha and Visible light - SHOT: %s' %shotno)
#plt.axvline(start*1e3, color = "black", linestyle = "dashed")
#plt.axvline(end*1e3, color = "black", linestyle = "dashed")
plt.xlim(start*1e3,end*1e3)
#TODO - pridat ohraniceni shotu pro kazde zobrazeni
plt.savefig(fname)
plt.close() #close this figure
#Optional:
#vertical line - if whole graph wtht data restrictions is used:
#plt.axvline(start*1e3, color = "black", linestyle = "dashed")
#plt.axvline(end*1e3, color = "black", linestyle = "dashed")
def plot_cut(data, fname,shotno):
plt.plot(data[:,5000],'r+',markersize = 10)
plt.savefig(fname)
plt.xlabel('CHANNEL NUMBER')
plt.ylabel('P[W/sr/m$^2$]')
plt.title('SHOT NUMBER ' '%d'%shotno)
def make_plots():
#shot = Shot()
#t, data_ko = shot['papouch_ko']
#t, data_ja = shot['papouch_ja']
shotno = "0"
#shotno = "16131"
url_shotno = "http://golem.fjfi.cvut.cz/utils/data/%s/shotno" %(shotno)
shotNum = int(download(url_shotno))
shotno = str(shotNum)
url_shotno = "http://golem.fjfi.cvut.cz/utils/data/%s/shotno" %(shotno)
url_start = "http://golem.fjfi.cvut.cz/utils/data/%s/plasma_start" %(shotno)
url_end = "http://golem.fjfi.cvut.cz/utils/data/%s/plasma_end" %(shotno)
url_Cam = "http://golem.fjfi.cvut.cz/shots/%s/diagnostics/Radiation/0211FastCamera.ON/1/CorrectedRGB.png" %shotno
#url_Ko = "http://golem.fjfi.cvut.cz/shots/%s//DAS/%s.ON/Papouch_All.npz" %(shotno,"1113Papouch_Za")
#url_Ja = "http://golem.fjfi.cvut.cz/shots/%s//DAS/%s.ON/Papouch_All.npz" %(shotno,"0314Papouch_Ko")
url_Ko = "http://golem.fjfi.cvut.cz/shots/%s//DAS/%s.ON/Papouch_All.npz" %(shotno,"1113Papouch_Ko")
url_Ja = "http://golem.fjfi.cvut.cz/shots/%s//DAS/%s.ON/Papouch_All.npz" %(shotno,"0314Papouch_Ja")
url_Uloop = "http://golem.fjfi.cvut.cz/utils/data/%s/loop_voltage" %(shotno)
url_PlasmaCurrent = "http://golem.fjfi.cvut.cz/utils/data/%s/plasma_current" %(shotno)
url_PlasmaPosJK = "http://golem.fjfi.cvut.cz/shots/%s/diagnostics/Magnetic/0316PlasmaPosition_JK.ON/plasma_position.txt" %(shotno) #vertical plasma position
url_Halpha = "http://golem.fjfi.cvut.cz/utils/data/%s/haphoto" %(shotno)
url_Visible = "http://golem.fjfi.cvut.cz/utils/data/%s/photo" %(shotno)
#url_HXR = http://golem.fjfi.cvut.cz/shots/24869/diagnostics/Magnetic/0316PlasmaPosition_JK.ON/plasma_position.txt
start = download(url_start)
end = download(url_end)
#shotNum = int(download(url_shotno))
fileData = "DATA/"
filePlots = "PLOTS/"
try:
os.mkdir("DATA/")
except: pass
try:
os.mkdir("PLOTS/")
except: pass
download(url_Ko, fileData + "Papouch_Ko_All.npz")
download(url_Ja, fileData + "Papouch_Ja_All.npz")
download(url_Uloop, fileData + "Uloop_%s" %shotno)
download(url_PlasmaCurrent, fileData + "PlasmaCurrent_%s" %shotno)
download(url_PlasmaPosJK, fileData + "PlasmaPosJK_%s" %shotno)
download(url_Halpha, fileData + "Halpha_%s" %shotno)
download(url_Visible, fileData + "Visible_%s" %shotno)
cam = download(url_Cam,filePlots + "0211FastCamera.png")
data_ko = np.load(fileData + "Papouch_Ko_All.npz")["data"]
data_ja = np.load(fileData + "Papouch_Ja_All.npz")["data"]
dataUloop = np.loadtxt(fileData + "Uloop_%s" %shotno)[:,1]
plasmaCurrent = np.loadtxt(fileData + "PlasmaCurrent_%s" %shotno)[:,1]
halpha = np.loadtxt(fileData + "Halpha_%s" %shotno)
halpha[:,0] = halpha[:,0]*1e3
visible = np.loadtxt(fileData + "Visible_%s" %shotno)
DataLight = np.hstack((halpha,np.array([visible[:,1]]).T)) #time, halpha, visible
try:
plasmaPosition = np.loadtxt(fileData + "PlasmaPosJK_%s" %shotno)
except:
plasmaPosition = -1
#t = np.load(fileData + "Papouch_Ja_All.npz")["data"][:,0]
#start = np.load("Papouch_Ja_All.npz")["t_start"]
#end = np.load("Papouch_Ja_All.npz")["t_end"]
t = np.linspace(0,len(data_ko[:,0])/1e6, len(data_ko[:,0]))
#vector_coef = np.genfromtxt('coeficients_AXUV2.txt') #TODO set after calibration is done
start_idx = np.where(start <= t)[0][0]
end_idx = np.where(t <= end)[0][-1]
data = np.hstack([data_ko,data_ja]) # NOTE: make sure this is the right order
data = data[start_idx:end_idx,0:20]
data = np.delete(data,18,axis = 1) #if Jakoubek is used - 7th channel malfunction
#from calibration AMP channels meets photodiodes in this way: 1 = 1, 2 <> 3, 4<>5,...
a = np.arange(0,17,2)
for i in a:
pom = data[:,i+1]*1
data[:,i+1] = data[:,i+2]*1
data[:,i+2] = pom
plasmaPositionAXUV1 = get_verticalPosition(data,start)
data = data.T#/100*np.max(data) # transpose to have time as x axis;
data_calib = data
make_multiplot(median_filter(data, size=(3, 333)),dataUloop,plasmaCurrent,plasmaPosition,plasmaPositionAXUV1,DataLight, filePlots+ 'AXUV1_compare_all.png', 'bicubic', start, end,shotno, 'Amplified signal filtered [V]','AXUV1 data - hot, median_filter (3,333), SHOT NUMBER: %d' %shotNum, cam)
make_img(data_calib,filePlots+ 'AXUV1.png', 'none', start, end,shotno, 'U[V]', "AXUV1 - raw data, SHOT NUMBER: %d" %shotNum)
make_img(median_filter(data, size=(3, 333)),filePlots+ 'AXUV1_medfit-bicubic.png', 'bicubic', start, end,shotno, 'U[V]', "AXUV1_medfit")
#make_multiplot(median_filter(data_calib, size=(3, 333)),filePlots+ 'AXUV1_calib_medfit.png', 'bicubic', start, end,shotno, 'P[W/sr/m$^2$]')
for i in range(60):
cam = download(url_Cam,filePlots + "0211FastCamera.png")
time.sleep(1)
if cam != -1:
break
make_multiplot(median_filter(data, size=(3, 333)),dataUloop,plasmaCurrent,plasmaPosition,plasmaPositionAXUV1,DataLight, filePlots+ 'AXUV1_compare_all.png', 'bicubic', start, end,shotno, 'Amplified signal filtered [V]','AXUV1 data - hot, median_filter (3,333), SHOT NUMBER: %d' %shotNum, cam)
def print_shotno(shotno):
print(shotno)
if __name__ == '__main__':
make_plots()