#!/usr/bin/python2 # -*- coding: utf-8 -*- #THE SIMPLEST VERSION !!!! #### Microwaves 2.0 #This algorithm calculate transformation of the sin signal from microwaves density measurement to the phase/amplitude space. # First step of the calculation is estimate of the base frequency and calculation of the complex exponential #with the same frequency.In the second step is signal multiplied by this exponential #and resulting low frequency signal is smoothed over Gaussian window. Finally complex phase and amplitude are calculated. # Authors: Tomas Odstrcil, Ondrej Grover from time import time t = time() from numpy import * from numpy.fft import fft, ifft from scipy.signal import fftconvolve from scipy.constants import c,m_e,epsilon_0,e from pygolem_lite.modules import save_adv,load_adv,saveconst from pygolem_lite import Shot import os import sys print 'include time ',time()-t def Demodulation(data,win): y = data-mean(data) t = time() n = len(y) fourier = fft(y) #calulcate the fourier transfrom for the sine data max_frequency_index = argmax(abs(fourier)) max_frequency = abs(fourier[max_frequency_index]) fourier[:] = 0 #cancel out all other frequencies fourier[max_frequency_index] = max_frequency cmpl_exp = ifft(fourier) gauss = exp(-arange(-3*win,3*win)**2/win**2) signal = fftconvolve(y*cmpl_exp ,gauss,mode='same' ) amplitude = abs(signal) phase = angle(signal) #remove jumps in the signal #for i in range(3): #diff_phase = diff(phase) #phase[1:] -= cumsum(where(abs(abs(diff_phase) - 2*pi) < 1, diff_phase, 0), out = diff_phase) phase = unwrap(phase) print 'demodulated ',time()-t return amplitude,phase def LoadData(): Data = Shot() gd = Shot().get_data tvec, density1 = gd('any', 'density') tvec, density2 = gd('any', 'density_2') return tvec,density1,density2 def graphs(): import matplotlib matplotlib.rcParams['backend'] = 'Agg' matplotlib.rc('font', size='10') matplotlib.rc('text', usetex=True) # FIXME !! nicer but slower !!! import matplotlib.pyplot as plt class MyFormatter(plt.ScalarFormatter): def __call__(self, x, pos=None): if pos==0: return '' else: return plt.ScalarFormatter.__call__(self, x, pos) tvec, phase_pila = load_adv('results/phase_saw') tvec, phase_sinus = load_adv('results/phase_sinus') tvec, phase = load_adv('results/phase_substracted') tvec, amplitude = load_adv('results/amplitude_sinus') tvec, n_e = load_adv('results/electron_density') fig = plt.figure(num=None, figsize=(10, 6), dpi=80, facecolor='w', edgecolor='k') plt.subplots_adjust(hspace=0, wspace = 0) ax = fig.add_subplot(2,1,1) ax.xaxis.set_major_formatter( plt.NullFormatter() ) ax.yaxis.set_major_formatter( MyFormatter() ) plt.plot(tvec*1000,-phase_pila+mean(phase_pila),'--', label = 'saw phase' ) plt.plot(tvec*1000,-phase_sinus+mean(phase_sinus),'--', label = 'signal phase') plt.plot(tvec*1000,phase, 'k',label = 'substracted phase') plt.axis('tight') plt.xlim(0,None) plt.xlabel('time [ms]') plt.ylabel('phase [rad]') leg = plt.legend(loc='best', fancybox=True) leg.get_frame().set_alpha(0.5) ax = fig.add_subplot(2,1,2) plt.plot(tvec*1000,amplitude,label = 'amplitude') plt.xlim(0,None) plt.ylim(0,None) leg = plt.legend(loc='best', fancybox=True) leg.get_frame().set_alpha(0.5) plt.ylabel('amplitude [a.u.]') plt.savefig('graphs/demodulation.png',bbox_inches='tight') plt.close() Data = Shot() plasma_start = Data['plasma_start'] plasma_end = Data['plasma_end'] fig = plt.figure(num=None, figsize=(10, 3), dpi=80, facecolor='w', edgecolor='k') plt.plot(tvec*1000,n_e/1e19,label = '$n_e$') plt.ylabel('$$ [$10^{19}\,m^{-3}$]') plt.xlabel('time [ms]') plt.xlim(0,20) plt.ylim(0,None) plt.axvline(x = 1000*plasma_start,linestyle = '--') plt.axvline(x = 1000*plasma_end, linestyle = '--') plt.savefig('graphs/electron_density.png',bbox_inches='tight') plt.close() def main(): for path in ['graphs', 'results' ]: if not os.path.exists(path): os.mkdir(path) if sys.argv[1] == "analysis": win = 30e-6 #[s] t = time() tvec,density1,density2 = LoadData() dt = (tvec[-1]-tvec[0])/len(tvec) print 'load time ', time()-t (amplitude2,phase_pila) = Demodulation(density2,win/dt) (amplitude,phase_sinus) = Demodulation(density1,win/dt) downsample = int(win/dt/2) amplitude = amplitude[::downsample] phase_pila = phase_pila[::downsample] phase_sinus = phase_sinus[::downsample] tvec = tvec[::downsample] phase = phase_pila-phase_sinus phase -= median(phase) save_adv('results/phase_saw', tvec, phase_pila) save_adv('results/phase_sinus', tvec, phase_sinus) save_adv('results/phase_substracted', tvec, phase) save_adv('results/amplitude_sinus', tvec, amplitude) a = 0.01 #[m] f_0 = 75e9 #[Hz] lambda_0 = c/f_0 n_e = 4*pi*m_e*epsilon_0*c**2/(e**2*lambda_0*2*a)*phase save_adv('results/electron_density', tvec, n_e) if sys.argv[1] == "plots": graphs() saveconst('status', 0) if __name__ == "__main__": main()