#!/usr/bin/python2
# -*- coding: utf-8 -*-
import matplotlib
matplotlib.rcParams['backend'] = 'Agg'
matplotlib.rc('font', size='10')
matplotlib.rc('text', usetex=True) # FIXME !! nicer but slower !!!
#import pygolem_lite
from scipy.signal import fftconvolve
from numpy import *
#from pygolem_lite.config import *
from pygolem_lite.modules import *
from matplotlib.pyplot import *
import time
#from shutil import copy, move
import os, sys
from pygolem_lite import Shot
#calibration = 662 / 0.891186 #[keV] Cs 137 662 keV ... X V at 400 V on scintilator
#calibration = 662 / 0.841186 #[keV] Cs 137 662 keV ... X V at 400 V on scintilator (podle mě to blo blbě => o 5% zvýšeno)
#calibration = 662 / 1.3# [keV] Cs 137 662 keV ... novy Vrbuv scintilator
calibration = 662 / 1.15# [keV] Cs 137 662 keV ... X V at 800 V, different amplifier
maximum_energy = 1e3 #[keV] maximum to plot in detail
maximum_DAS_voltage = 10 #[V] maximum possible measured voltage
bins = 500 #bins in histogram
calibration_surface = 5.57 #keV/ms
#min_reliable_intensity = 1000
min_reliable_intensity = 0.5 * calibration # above 0.5 V
def prepare_data():
data = Shot()
if data.exist('nistandard'):
print data['tektronix3014']
tvec, signal_0 = data['tektronix3014'] # 3. channel
signal_0 = signal_0[:,-1]
#tvec, signal_0 = data['ScintProbeNaITl']
#tvec, signals = data['HXR']
if -amin(signal_0) > amax(signal_0):
signal_0 *= -1
else:
raise IOError('Missing nistandard')
start = data['plasma_start']
end = data['plasma_end']
plasma = data['plasma']
maximum_DAS_voltage = amax(signal_0)
signal_0[signal_0 >= maximum_DAS_voltage] = nan
t = time.time()
win = 100
lam = 0.1
signal, chi2 = GapsFilling(signal_0,win,lam) # recontruct cutoffs in the signal_0
print 'filling time', time.time()-t
save_adv('HXR', tvec, signal)
save_adv('HXR_orig', tvec, signal_0)
if plasma:
saveconst('HXR_mean', mean(signal[(tvec > start) & (tvec < end)]))
else:
saveconst('HXR_mean', nan )
sigma = len(tvec)/200 # !!! smoothing parameter !!!!
ker = linspace(-4,4, sigma)
ker = exp( - ker**2)
ker /= sum(ker)
signal[signal < 0 ] = 0
signal_smooth = fftconvolve(signal, ker, mode="same")
signal_smooth*= calibration_surface #calculate detected HXR power (not the total HXR power)
save_adv('HXR_smooth', tvec, signal_smooth)
omit_peaks = range(25) #low intensity noise
peaks = zeros(len(signal) - 2) #empty array for peaks
d_data = diff(signal) #first derivative
d2_data = diff(d_data) #second derivative
location = (d_data[1:] * d2_data < 0) & (d2_data < 0) #location of data where there are peaks
peaks[location] = signal[2:][location] #copy only the peaks
peaks *= calibration #calibrate volatage to get energy
#import IPython
#IPython.embed()
ind_peaks = where(peaks > min_reliable_intensity)[0]
if len(ind_peaks)>1:
first_peak = tvec[ind_peaks[0] ]
saveconst('first_peak', first_peak)
last_peak = tvec[ind_peaks[-1] ]
saveconst('last_peak', last_peak)
#plot histogram from 0.1 to max with 1e3 bins
peaks = peaks[peaks > 0] # remove negative peaks
savetxt('peaks', peaks)
hist, edges = histogram(peaks, bins = bins, range = [0.1, maximum_DAS_voltage * calibration])
#counts, bins, patches = hist(peaks, )
#ylabel("Impulse count")
#xlabel("Energy [keV]")
#savefig("HXR_spectrum_full.png")
#xlim(xmax=maximum_energy) #detail plot
#savefig("HXR_spectrum_zoom.png")
#clf()
hist[omit_peaks] = 0 #omit the first Be peak
max_indx = argmax( hist )
max_peak = edges[1:][max_indx] / calibration
saveconst( "max_peak", max_peak )
print "done"
def graphs(file_type):
data = Shot()
if data['plasma']:
start = data['plasma_start']*1e3-1
end = data['plasma_end']*1e3+1
#last_peak = loadconst('last_peak')*1e3
#end = max(end, last_peak)
else:
start= 0; end = 40
#print "end", end, last_peak, data['plasma_end']*1e3
out = [
[get_data('hxr_signal', 'HXR recalculated', "HXR [a.u.]", xlim=[start, end]),
get_data('HXR_orig', 'HXR', "HXR [a.u.]", xlim=[start, end])],
get_data('HXR_smooth', 'HXR smooth', "HXR power [keV/ms]" , xlim=[start, end], ylim=[0,None]),
get_data('loop_voltage', "Loop voltage" , 'U[V]', xlim=[start, end], ylim=[0,None])
]
print 'multiplot'
multiplot(out, 'Hard-X ray signal' , 'graph', (9,6), 100, 'vertical', file_type)
# icona
os.system('convert -resize 150x120\! graph.png icon.png')
clf()
print '1. hist'
try:
peaks = loadtxt('peaks')
bins = sqrt(len(peaks)) # empirical rule
except:
print "No Xrays were deteced in the signal"
return
#my "intelligent" historogram -- it will make a smaller bins if there are higher points
#density and larger bins if there are only a few points to keep statistical error on the constant value
#fig = figure(num=None, figsize=(10, 3), dpi=80, facecolor='w', edgecolor='k')
peaks.sort()
x = hstack((peaks[::int(bins)],peaks[-1]))
y = bins/(diff(x)+1)
#TODO vylapšená verze, otestovat včerně renormalizace
#x = (val[bins/2:]+val[:-(bins)/2])/2
#y = bins/((val[bins/2:]-val[:-(bins)/2]))/2
#y/= sum(diff(x)*y[:-1])
#y[0] = 0
fig = plt.figure(num=None, figsize=(10, 3), dpi=80, facecolor='w', edgecolor='k')
semilogx(x[:-1], y, drawstyle = 'steps-post')
axvline(17, color='r', label=r"Molybden K$\alpha$")
axvline(20, color='g', label=r"Molybden K$\beta$")
axvline(662, color='g', label=r"Cesium 662 KeV")
legend(loc = 'best')
ylabel("Impulse count/dE [1/keV]")
xlabel("Energy [keV]")
xlim(10,maximum_DAS_voltage*calibration)
savefig("HXR_spectrum_full.png", bbox_inches='tight', dpi= 100)
clf()
#print '2. hist'
#fig = figure(num=None, figsize=(10, 3), dpi=80, facecolor='w', edgecolor='k')
#bins = sqrt(sum(peaks < maximum_energy)) # empirical rule
#hist_range = linspace(0.1, maximum_energy)
#hist(peaks, hist_range)
#axvline(17, color='r', label=r"Molybden K$\alpha$")
#axvline(20, color='g', label=r"Molybden K$\beta")
#axvline(662, color='g', label=r"Cesium 662 KeV")
#legend(loc = 'best')
#ylabel("Impulse count")
#xlabel("Energy [keV]")
#savefig("HXR_spectrum_zoom.png", bbox_inches='tight', dpi= 100)
#clf()
#print '3. hist'
#scipy.signal.parzen
def postanalysis(file_type):
data = Shot()
if data['plasma']:
start = data['plasma_start']*1e3
end = data['plasma_end']*1e3
else:
start= 0; end = 40
out = [
[get_data('HXR_signal', 'HXR recalculated', "HXR [a.u.]", xlim=[start, end]),
get_data('HXR_orig', 'HXR', "HXR [a.u.]", xlim=[start, end])],
get_data('HXR_smooth', 'HXR smooth', "HXR power [keV/ms]" , xlim=[start, end], ylim=[0,None]),
get_data('loop_voltage', "Loop voltage" , 'U[V]', xlim=[start, end], ylim=[0,None])
]
print 'multiplot'
multiplot(out, 'Hard-X ray signal' , 'graph', (9,6), 100, 'vertical', file_type)
def main():
if sys.argv[1] == "acquisition":
prepare_data()
if sys.argv[1] == "plots":
graphs('png')
saveconst('status', 0)
if sys.argv[1] == "postanalysis":
print "plotting svgz "
postanalysis('svgz')
if __name__ == "__main__":
main()