#!/usr/bin/env python
# -*- coding: utf-8 -*-
###########################################################################################################
############# Algorithm which from ion intensities calculate the coefitients to estimate electron t
############# temperature and impurity density.
###########################################################################################################
names = ['HI','OI','OII', 'OIII', 'HeI', 'CII', 'CIII', 'NI','NII', 'NIII','Mystery1', 'CIV+NIV+OIV' ]
ion_names = ['H','O','He','C','N','M1','M2']
ions_index = [[0], [1,2,3], [4], [5,6], [7,8,9], [10],[11]]
from numpy import *
from numpy.fft import fft,rfft
from matplotlib.pyplot import *
from numpy.linalg import norm,lstsq
from scipy.linalg import qr,inv,pinv,eig,cholesky,svd,cho_factor,solve_triangular
from scipy.stats.stats import pearsonr
from scipy.sparse import block_diag
from scipy.optimize import fmin_cg,leastsq,fmin_ncg,fmin_bfgs,fmin_powell,anneal
from scipy.stats.mstats import mquantiles
from scipy.stats import nanmedian
from numpy.matlib import repmat
from time import time
from scipy.signal import medfilt,order_filter
#Load data
name = 'vylepseny odhad y0'
n_ions = 12
n_elemets = 7
k = 2 #polynome order
def _sparseness(x):
"""Hoyer's measure of sparsity for a vector"""
x = np.ravel(x)
sqrt_n = np.sqrt(len(x))
spars = (sqrt_n - norm(x, 1) / norm(x)) / (sqrt_n - 1)
if np.isnan(spars):
return 1
else:
return spars
M1 = matrix([1,]) #H 0
M2 = matrix([[1,-1,0],[0,1,-1],[1,0,-1],[1,0,0]]) #O 1
M3 = matrix([1,]) #He 2
M4 = matrix([[1,-1],[-1,1],[1,0]]) #C 3
M5 = matrix([[1,-1,0],[0,1,-1],[1,0,-1],[0,1,0]]) #N 4
M6 = matrix([1,]) #M1 5
M7 = matrix([1,]) #MIV 6
M = block_diag((M1,M2,M3,M4,M5,M6,M7))
M = M.todense()
bound_inter_i = [1,2,3,5,6,7,8,9]
bound_inter_j = [1,2,3,6,7,9,10,11]
M_limited = (M[:,bound_inter_i])[bound_inter_j,:]
iM = linalg.pinv(M)
eigval,eigvec = eig(M_limited,left = True, right = False)
null_ind = abs(eigval) < 1e-6
null_space = eigvec[:,null_ind] #optimalizaion constraion
#load the data from old shots
try:
data = load('projection.npz')
p = data['projections']
pE = data['projectionsErr']
shots = data['shotnum']
except:
p = zeros((1,12))
pE = zeros((1,12))
shots = zeros(1)
for shot in xrange(7136,10300):
try:
c = load('./data/projection'+str(shot)+'.npy')
ce = load('./data/projectionError'+str(shot)+'.npy')
except:
continue
n_specta = size(c,0)
shot_space = shot + linspace(0,1,n_specta, endpoint = False)
p = vstack((p,c))
pE = vstack((pE,ce))
shots = hstack((shots,shot_space))
s = sum(p[:,(1,2,3,5,6,7,8,9)],axis = 1) > 0.1 #remove dark and very weak spectra
p = p[s,:]
pE = pE[s,:]
shots = shots[s]
savez_compressed('projection', projections = p, projectionErr = pE, shotnum = shots)
pE[pE <= 0] = infty
pE[pE < 0.01] = 0.01 #změna intenzity během vývoje záření je mnohem větší
#CALCULATE INITIAL GUESS OF THE TEMPERATURE
n_ions = size(p,1)
p_ = p[:,(1,2,3,5,6,7,8,9)]
pE_ = pE[:,(1,2,3,5,6,7,8,9)]
wp = (p_ == 0.0 ) | (isnan(p_))
p_[wp] = 1
divE = pE_/p_
#log ratios
R = vstack((p_[:,0]/p_[:,1],p_[:,1]/p_[:,2],p_[:,0]/p_[:,2],p_[:,3]/p_[:,4],p_[:,4]/p_[:,3], p_[:,5]/p_[:,6],p_[:,6]/p_[:,7],p_[:,5]/p_[:,7]))
R = log(R)
#ratio log error
Re = vstack((hypot(divE[:,0],divE[:,1]),hypot(divE[:,1],divE[:,2]),hypot(divE[:,2],divE[:,0]),hypot(divE[:,3],divE[:,4]),hypot(divE[:,3],divE[:,4]),
hypot(divE[:,5],divE[:,6]),hypot(divE[:,6],divE[:,7]),hypot(divE[:,7],divE[:,5])))
#wrong points
wp = vstack((wp[:,0]|wp[:,1],wp[:,1]|wp[:,2],wp[:,2]|wp[:,0],wp[:,3]|wp[:,4],wp[:,3]|wp[:,4],wp[:,5]|wp[:,6],wp[:,6]|wp[:,7],wp[:,7]|wp[:,5]))
rnames = ('OI/OII','OII/OIII','OI/OIII','CII/CIII','CIII/CII', 'NI/NII','NII/NIII','NI/NIII')
Re[wp] = inf
n = size(R,1)
m = size(R,0)
print ' m ',m,' n ',n, ' k ', k
#estimate polynom coeffitients of the temperature polynome
def CalcCoeff(R,Re,T,Te):
coeff = zeros((m,k))
coeff_error = zeros((m,k))
N = vstack([T**i for i in range(k)]).T
q,r = qr(N,mode = 'economic')
F = matrix(dot(inv(r),q.T))
total_res = 0
for (f,e,x,xe) in zip(R,Re,coeff,coeff_error):
x[:],res,_,_ = lstsq(dot(diag(1/e/Te),N),f/e/Te)
chi2 = float(res/len(e))
q,r = qr(dot(diag(1/e),N),mode = 'economic')
F = matrix(dot(inv(r),q.T))
xe[:] = sqrt(diag( chi2*(F*F.T)))
total_res+=res
print total_res/(size(R)-size(T)-size(coeff))
return coeff,coeff_error
#def CalcT(R,Re,coeff):
#I = matrix(ones(n))
#R = R-dot(matrix(A).T,I)
#R = array(R)
#B = array(B)
#T = zeros(n)
#total_res = 0
#for i in xrange(n): #jak to udělat vektorově?
#x = R[:,i]/Re[:,i]
#y = B/Re[:,i]
#y/=norm(y)
#T[i] = dot(x,y).T
#total_res += norm(x-T[i]*y)**2
#print total_res/size(R)
#return T
Te = ones(n)
Te[Re[2,:] == inf] = inf
I = (ones(n))
iterator = 0
def f_optim1(x):
global iterator
iterator+=1
x = double(x)
coeff = reshape(x[:k*m], (m,k))
T = x[-n:]
a = mean(coeff[:,0])-1
b = mean(coeff[:,1])
T = (1+a)+T*b
coeff[:,0]-=mean(coeff[:,0])
coeff[:,1]/=mean(coeff[:,1])
N = vstack([T**i for i in range(k)]).T
Resid = (R-dot(coeff,N.T))/Re
#robust least squares estimator
Resid **= 2
chi2 = sum(Resid/sqrt(1+Resid))/(size(Resid)-size(x))
##boundary condition
boundary = norm(dot(coeff.T,null_space))**2
if iterator%1000 == 0:
print chi2, boundary
if iterator%200000 == 0:
for i in range(m):
normal = (Re[i,:] != inf)
plot(T[normal],R[i,normal],'.',markersize = 0.5)
plot(T[normal],dot(coeff, N.T)[i,normal].T,'.',markersize = 0.3,label = rnames[i])
xlabel('f(T)')
ylabel('ln('+rnames[i]+')')
xlim(-1.5,4)
ylim(-2,6)
savefig('grafy_advance/_'+str(i)+name+'.png')
clf()
return chi2 + boundary
try:
#x
x = load('X'+name+'.npy')
except:
print 'temperature initial guess'
T = R[2,:] #počáteční odhad
coeff,_= CalcCoeff(R,Re,T,Te)
#využívám volnosti v definici, abych to zafixoval mena A = 0, mean B = -1, a ostatní na nulu
a = mean(coeff[:,0])-1
b = mean(coeff[:,1])
T = (1+a)+T*b
coeff[:,0]-=mean(coeff[:,0])
coeff[:,1]/=mean(coeff[:,1])
x0 = hstack((ravel(coeff),T))
x = fmin_powell(f_optim1, x0)
coeff = reshape(x[:k*m], (m,k))
T = x[k*m:]
N = vstack([T**i for i in range(k)]).T
Resid = R-dot(coeff,N.T)
Resid /=Re
wrong_shots = median(abs(Resid), axis = 0) > 4 #hodně nadhodnocené aby tam něco i zbylo
print 'part of the wrongly identified shots', sum(wrong_shots)/float(n)
T[wrong_shots] = median(T[~wrong_shots])
T = medfilt(T,11)
x[k*m:] = T
x = fmin_powell(f_optim1, x)
save('X'+name,x)
coeff = reshape(x[:k*m], (m,k))
T = x[k*m:]
a = mean(coeff[:,0])-1
b = mean(coeff[:,1])
T = (1+a)+T*b
coeff[:,0]-=mean(coeff[:,0])
coeff[:,1]/=mean(coeff[:,1])
N = vstack([T**i for i in range(k)]).T
Resid = R-dot(coeff,N.T)
Resid /= Re
#robust least squares estimator
Resid[abs(Resid) < 0.01] = 0.01
Resid **= 2
chi2 = sum(1/sqrt(1/Resid+1/Resid**2))/(size(Resid)-size(x))
print 'vypočtené chi2 ', chi2
Resid[Resid == 0] = nan #body s nekonečnou chybou
_,coeff_err = CalcCoeff(R,Re,T,Te)
###plot resultes
#chi2_tot = 0
#ind_sort = argsort(T)
#for i in range(m):
#normal = (Re[i,:] != inf) #& (Re[2,:] != inf)
#ind_sort_i = ind_sort[normal]
#errorbar(-T[ind_sort_i],R[i,ind_sort_i],Re[i,ind_sort_i], fmt='.',capsize = 0,linewidth = 0.1,markersize = 0.5)
#plot(-T[ind_sort_i],dot(coeff, N.T)[i,ind_sort_i].T,'-' ,markersize = 0.3,label = rnames[i])
#xlabel('f(T)')
#ylabel('ln('+rnames[i]+')')
#xlim(-4,1.5)
#ylim(-2,6)
#chi2 = norm(((R-dot(coeff, N.T))/Re)[i,:])**2/size(R[i,:])
#title('chi2 = %1.3f A = %1.3f$\pm$ %1.3f B = %1.3f$\pm$%1.3f '%(chi2,coeff[i,0],coeff_err[i,0],coeff[i,1],coeff_err[i,1]))
#legend(loc = 'best')
#chi2_tot+=chi2
#savefig(str(i)+name+'.pdf')
#clf()
#print 'chi2_tot',chi2_tot/m
#######Druhý stupeň optimalizace, odhad hustoty##################
#TODO normovat dlouhodobý harmonický průměr hustoty na jedničku (log na nulu)?? nebo to udělat až v postporocessingu??
name = 'density estimate '
print 'name: ', name
single_ion = [0,2,5,6]
multi_ion = [1,3,4]
N = vstack([T**i for i in range(k)]).T
bound_inter = zeros(15, dtype = 'bool')
bound_inter[bound_inter_j] = True
#prepare initila guess for the optimalization
density0 = (p[:,[0,2,4,5,8,10,11]]+1e-3)
density0 = order_filter(density0, ones((101,1)), 90)
density0 = log(density0)
T0 = array([1,0.5,0.5,-0.25,-0.4,-0.5,-0.5])
a0 = -ones(n_elemets)
def CalcIntensity(T,density,N,T0,a,coeff,index):
density[density>10] = 10
coeff[:,0]-=mean(coeff[:,0])
coeff[:,1]/=mean(coeff[:,1])
n = size(density,1)
F = empty((15,n), dtype= 'double')
F[bound_inter,:] = dot(coeff,N.T)
T =T[:,newaxis]- T0[newaxis,:]
T **= 2
T *= a
T = T.T
T += density
F[~bound_inter,:] = T
C = exp(iM[index,:]*F-1).T
C[C > 1e5] = 0
return array(C, copy = False)
def plotTprofiles(T0, a, density, T, coeff,p,pE,i):
density_model = ones((n_elemets,100))
T_model = linspace(-3,3,100)
N_model = vstack((ones(100),T_model)).T
#print shape(T), shape(density), shape(T0), shape(a)
c2 = CalcIntensity(T_model,density_model,N_model,T0,a,coeff,ions_index[i])/e
C = CalcIntensity(T,density,N,T0,a,coeff,ions_index[i])
#print shape(p), shape(ions_index[i]),i
Resid = (p[:,ions_index[i]]-C)/pE[:,ions_index[i]]
ax = subplot(1,1,1)
r_tot,_ = pearsonr(ravel(p[:,ions_index[i]]), ravel(C))
#max_Resid je aby se zabránilo přetečení
chi2 = norm(Resid)**2/(size(Resid))
max_Resid = double(amax(abs(Resid)))
Resid/= max_Resid
Resid **= 2
chi2_robust = max_Resid*sum(Resid/sqrt((1/max_Resid)**2 + Resid))/(size(Resid))
colour = ['b', 'r','k', 'y']
for k in range(len(ions_index[i])):
x = -T
y = squeeze(p[:,(ions_index[i])[k]]/exp(density[i,:]))
y_err = squeeze(pE[:,(ions_index[i])[k]]/exp(density[i,:]))
noisy = y_err > y*2
errorbar(x[~noisy],y[~noisy],y_err[~noisy], fmt=colour[k]+'.',capsize = 0,linewidth = 0.1,markersize = 0.5)
plot(-T_model, c2[:,k], colour[k],label = names[(ions_index[i])[k]])
xlabel('f(T) [-]')
ylabel('intensity [a.u.]')
leg = legend(loc='upper left', fancybox=True)
leg.get_frame().set_alpha(0.7)
title(ion_names[i])
ax.text(-1.9,1,'$\\chi^2$ = %2.1f \n$\\chi^2$ robust = %2.1f \n$r$ = %1.2f'
% (chi2,chi2_robust,r_tot),horizontalalignment='left',verticalalignment='bottom')
ylim(0,1.5)
xlim(-2,1)
#show()
savefig('grafy_advance/_'+ion_names[i]+' '+name+'.png')
clf()
for k in range(len(ions_index[i])):
ax = subplot(1,1,1)
r,_ = pearsonr(p[:,(ions_index[i])[k]] , C[:,k])
x = C[:,k]
y = p[:,(ions_index[i])[k]]
y_err = pE[:,(ions_index[i])[k]]
noisy = y_err > y*2
chi2 = norm((x-y)/y_err)**2/(size(Resid))
plot(x[~noisy],y[~noisy],'.'+colour[k],markersize = 0.5)
plot(arange(-10,10),arange(-10,10), colour[k])
ax.text(0.2,0.8,'$\\chi^2$ = %2.1f \n $r$ = %1.2f'% (chi2,r),horizontalalignment='left',verticalalignment='bottom')
title(names[(ions_index[i])[k]])
ylim(0,1)
xlim(0,1)
#show()
savefig('grafy_advance/correl_'+names[(ions_index[i])[k]]+' '+name+'.png')
clf()
density_all = zeros((n_elemets,n))
for i,index in enumerate(ions_index):
#if i != 0:
#continue
density0_ = density0[:,i]
print 'iont '+ion_names[i]
a0_ = a0[i]
T0_ = T0[i]
p_ = array(p[:,index], ndmin = 2)
pE_ = array(pE[:,index], ndmin = 2)
#pE_[pE_ > p_] = inf #exteramly bad points
name_ = [names[j] for j in index]
x0 = hstack((T0_,a0_,ravel(density0_)))
x0 = single(x0)
#n_elemets = 1
n_ions = len(index)
def f_optim2(x):
x = double(x)
global iterator,t0
T0 = x[:1] #basic temperature shift
a = x[1:2]#width of the gaussian
density = reshape(x[2:],(n,1)).T#logarithm density
#print shape(density), shape(p)
C = CalcIntensity(T,density,N,T0,a,coeff,index)
#print where(~isfinite(C))
#exit()
Resid = (p_-C)/pE_
max_Resid = double(amax(abs(Resid)))
#max_Resid je aby se zabránilo přetečení
Resid/= max_Resid
#print amax(C)
#exit()
Resid **= 2
chi2 = max_Resid*sum(Resid/sqrt((1/max_Resid)**2 + Resid))/(size(Resid))
boundary = norm(a[a > -0.5]+0.5)
boundary += norm(a[a < -3]+3)**2
boundary += norm(T0[T0 > 2]-2)**2
d = diff(exp(density),1)
new_shots = diff(floor(shots)) > 0
d[:,new_shots] = 0
d = norm(d)
if iterator%1000 == 0:
t2 = time()
print chi2,d,boundary
t0 = t2
if iterator%10000 == 0:
plot(exp(density.T), linewidth = 0.1)
title(ion_names[i])
ylim([0,5])
savefig('grafy_advance/density'+ion_names[i]+'.pdf')
clf()
print 'a: %2.2f, T0: %2.2f' %(a,T0)
print 'profile plots', ion_names[i]
density_all[i,:] = density
a_all = zeros(n_elemets)
T0_all = zeros(n_elemets)
a_all[i] = a
T0_all[i] = T0
plotTprofiles(T0_all, a_all, density_all, T, coeff,p,pE,i)
save('y'+name+str(i)+'.npy',x)
iterator+=1
return chi2+d*lam+ boundary
try:
y = load('y'+name+str(i)+'.npy')
except:
print 'density initial guess'
lam = 0.01
iterator = 0
L = len(x0)
t0 = time()
y = fmin_powell(f_optim2, x0)
try:
y = fmin_powell(f_optim2, x0)
except:
try:
y = load('y'+name+str(i)+'.npy')
except:
pass
lam = 0.2
#try:
y = fmin_powell(f_optim2, y)
#except:
#y = load('y'+name+str(i)+'.npy')
save('y'+name+str(i)+'.npy',y)
#######Třetí stupeň optimalizace, nový odhad teploty ##################
n_elemets = len(ion_names)
for i in range(n_elemets):
y = load('y'+name+str(i)+'.npy')
T0[i] = y[:1] #basic temperature shift
a0[i] = y[1:2]#width of the gaussian
#print shape(y[2:]),n
density0[:,i] = reshape(y[2:],(n,1)).T#logarithm density
density0 = density0.T
density0[density0<-3] = -3
name = '3. cyklus'
print 'name: ', name
x0 = hstack((ravel(coeff),T0,a0,T))
x0 = single(x0)
def f_optim3(x):
x = double(x)
global iterator,t0
coeff = reshape(x[:k*m], (m,k))
T0 = x[k*m:k*m+n_elemets] #basic temperature shift
a = x[k*m+n_elemets:k*m+2*n_elemets]#width of the gaussian
T = x[-n:]
N = vstack([T**j for j in range(k)]).T
A = mean(coeff[:,0])-1
B = mean(coeff[:,1])
T = (1+A)+T*B
coeff[:,0]-=mean(coeff[:,0])
coeff[:,1]/=mean(coeff[:,1])
#exit()
C = CalcIntensity(T,density0,N,T0,a,coeff,range(12))
Resid = (p-C)/pE
max_Resid = double(amax(abs(Resid)))
#max_Resid je aby se zabránilo přetečení
Resid/= max_Resid
#exit()
Resid **= 2
chi2 = max_Resid*sum(Resid/sqrt((1/max_Resid)**2 + Resid))/(size(Resid)-size(x)-size(density0))
#chi2 = norm(Resid)**2/(size(Resid)-size(x))
boundary = norm(a[a > -0.5]+0.5)
boundary += norm(a[a < -3]+3)**2
boundary += norm(T0[T0 > 2]-2)**2
boundary += norm(dot(coeff.T,null_space))**2
if iterator%1000 == 0:
t2 = time()
print chi2,boundary
t0 = t2
if iterator%50000 == 0:
plot(-T, linewidth = 0.1)
ylim(-2, None)
savefig('grafy_advance/T '+name+'.pdf')
clf()
for i in range(n_elemets):
plotTprofiles(T0, a, density0, T, coeff,p,pE,i)
save('y'+name+'.npy',x)
iterator+=1
return chi2 + boundary
try:
y = load('y'+name+'.npy')
except:
print 'temperatute second guess'
lam = 0.01
iterator = 0
L = len(x0)
A = eye(L, dtype = 'single')
A = A[::-1,:]
t0 = time()
try:
y = fmin_powell(f_optim3, x0, direc = A)
except:
y = load('y'+name+'.npy')
lam = 0.01
try:
y = fmin_powell(f_optim3, y, direc = A)
except:
y = load('y'+name+'.npy')
save('y'+name+'.npy',y)
#######Poslední stupeň optimalizace, globání optimalizace ##################
#final stage -- full optimalization
#prepare initial guess
#name = '_4. cyklus'
x = load('y'+name+'.npy')
#stary
#coeff = reshape(x[:k*m], (m,k))
#T0 = x[k*m:k*m+n_elemets] #basic temperature shift
#a = x[k*m+n_elemets:k*m+2*n_elemets]#width of the gaussian
#T = x[-n:]
#print shape(x), shape(density0)
x0 = r_[x,ravel(density0.T)]
#print shape(density0), (n,n_elemets)
#novy
#coeff = reshape(x[:k*m], (m,k))
#T0 = x[k*m:k*m+n_elemets] #basic temperature shift
#a = x[k*m+n_elemets:k*m+2*n_elemets]#width of the gaussian
#T = x[-(1+n_elemets)*n:-n_elemets*n]# temperature
#print shape(x[-n*n_elemets:]), n_elemets*n
#density = reshape(x[-n*n_elemets:],(n,n_elemets)).T#logarithm density
#exit()
name = '4. cyklus 2 norm'
print 'name: ', name
x0 = single(x0)
def f_optim4(x):
x = double(x)
global iterator,t0
coeff = reshape(x[:k*m], (m,k))
T0 = x[k*m:k*m+n_elemets] #basic temperature shift
a = x[k*m+n_elemets:k*m+2*n_elemets]#width of the gaussian
T = x[-(1+n_elemets)*n:-n_elemets*n]# temperature
density = reshape(x[-n*n_elemets:],(n,n_elemets)).T#logarithm density
N = vstack([T**j for j in range(k)]).T
C = CalcIntensity(T,density,N,T0,a,coeff,range(12))
Resid = (p-C)/pE
max_Resid = double(amax(abs(Resid)))
#max_Resid je aby se zabránilo přetečení
#Resid/= max_Resid
#Resid **= 2
#chi2 = max_Resid*sum(Resid/sqrt((1/max_Resid)**2 + Resid))/(size(Resid)-size(x))
chi2 = norm(Resid)**2/(size(p)-size(x))
#boundary = norm(a[a > -0.5]+0.5)
boundary = norm(a[a < -3]+3)**2
boundary += norm(T0[T0 > 2]-2)**2
boundary += norm(dot(coeff.T,null_space))**2
boundary += abs(mean(coeff[:,0]))*10 + abs(mean(coeff[:,1])-1)*10
d = diff((density),1, axis = 1)
new_shots = diff(floor(shots)) > 0
d[:,new_shots] = 0
d = norm(d)
spars = norm(ravel(exp(density)/10))/100
density[density<-5] = -5
if iterator%1000 == 0:
t2 = time()
print chi2,d,spars,boundary,mean(coeff[:,0]),mean(coeff[:,1])-1
t0 = t2
if iterator%50000 == 0:
plot(-T, linewidth = 0.1)
ylim(-2, None)
savefig('grafy_advance/T '+name+'.pdf')
clf()
#print 'profile plots'
for i in range(n_elemets):
plot(exp(density[i,:]), linewidth = 0.1)
ylim(0, 10)
title(ion_names[i])
savefig('grafy_advance/dens'+str(i)+name+'.pdf')
clf()
plotTprofiles(T0, a, density, T, coeff,p,pE,i)
save('y'+name+'.npy',x)
iterator+=1
return chi2 + boundary+lam*d+spars
try:
ss
y = load('y'+name+'.npy')
except:
print 'final step temperature+density'
lam = 0.06
iterator = 0
L = len(x0)
print L
A = eye(L, dtype = 'single')
A = A[::-1,:]
t0 = time()
y = fmin_powell(f_optim4, x0, direc = A)
try:
x0 = load('y'+name+'.npy')
y = fmin_powell(f_optim4, x0, direc = A)
except:
y = load('y'+name+'.npy')
lam = 0.07
try:
y = fmin_powell(f_optim4, y, direc = A)
except:
y = load('y'+name+'.npy')
save('y'+name+'.npy',y)
x = load('y'+name+'.npy')
#estimate statistical errors:
def RetrofitFunction(x):
coeff = reshape(x[:k*m], (m,k))
T0 = x[k*m:k*m+n_elemets] #basic temperature shift
a = x[k*m+n_elemets:k*m+2*n_elemets]#width of the gaussian
T = x[-(1+n_elemets)*n:-n_elemets*n]# temperature
density = reshape(x[-n*n_elemets:],(n,n_elemets)).T#logarithm density
C = CalcIntensity(T,density,N,T0,a,coeff,range(12))
return ravel(C)
def CalcJacobi(x0,fun): #Bude se tu muset udělat něco jako pseudoimverze??
n2 = size(p)
N = len(x0)
dx = 1e-6
J = zeros((N,n2), dtype = 'float32')
for i in range(N):
xl = copy(x0)
xl[i]-= dx
xr = copy(x0)
xr[i]+= dx
J[i,:] = (fun(xl)-fun(xr))/(2*dx)
print i, N
return J
#first step - calc jacobi matrix
try:
J = load('J.npy', mmap_mode='r')
except:
J = CalcJacobi(x0,RetrofitFunction)
save('J.npy',J)
try:
JJ = load('JJ.npy',mmap_mode = 'r')
except:
N = size(J,0)
JJ = zeros((N,N), dtype = 'float32')
#chi2 = array([1,3,3,3,1,3,3,13,13,13,10,1]) #BUG must by set by hand
correctedPE = copy(pE)
#correctedPE *= sqrt(chi2)
err = ravel(correctedPE)
J/= err
intervals = array_split(range(N), 100)
for i,inter in enumerate(intervals): #teoreticky by se tu dalo využít symetrie matice JJ
print i, 100
A = dot(J,J[inter,:].T)
JJ[:,inter] = A
del J
save('JJ.npy',JJ)
#calc cholesky decomposition of the L*L.H = J.T*J
try:
#hh
L = load('ires_L.npy', mmap_mode='r')
except:
N = size(J,0)
JJ.flat[::N+1]+= 1e-4 #regularization of the singular matrix
JJ = JJ[-(1+n_elemets)*n:, -(1+n_elemets)*n:]
L = cholesky(JJ, lower=False,overwrite_a=True) #vytvoří to asi dollní trojúhelníkovu matici rezkladu
save('ires_L.npy',L)
#invert L
try:
iL = load('iL.npy', mmap_mode='r')
except:
N = L.shape[0]
I = identity(N, dtype = 'float32')
intervals = array_split(range(N), 100)
#I= solve_triangular(L,I , trans=0, lower=True, overwrite_b=True)
for i,inter in enumerate(intervals):
print i, 100
I[:,inter] = solve_triangular(L,I[:,inter] , trans=0, lower=True, overwrite_b=True)
save('iL', I)
try:
err = load('err.npy')
except:
iL = absolute(iL, out = iL)
iL **= 2
err = sqrt(sum(iL, 0))
save('err.npy',err)
coeff = reshape(x[:k*m], (m,k))
T0 = x[k*m:k*m+n_elemets] #basic temperature shift
a = x[k*m+n_elemets:k*m+2*n_elemets]#width of the gaussian
T = x[-(1+n_elemets)*n:-n_elemets*n]# temperature
density = reshape(x[-n*n_elemets:],(n,n_elemets)).T#logarithm density
N = vstack([T**j for j in range(k)]).T
C = CalcIntensity(T,density,N,T0,a,coeff,range(12))
#save final resultes
savetxt('model_constants/B.txt',mean(density, axis = 1),fmt = '%.4f')
savetxt('model_constants/C.txt',coeff,fmt = '%.4f')
savetxt('model_constants/A.txt',a,fmt = '%.4f')
savetxt('model_constants/T0.txt',T0,fmt = '%.4f')
#BUG!!!!
err/= 3
#BUG!!!!
errT = err[-(1+n_elemets)*n:-n_elemets*n]
errDensity = reshape(err[-n*n_elemets:],(n,n_elemets)).T
for i in range(n_elemets):
y = exp( density[i,:])
y_err_up = (exp( errDensity[i,:])-1)*y
y_err_down = -(exp(-errDensity[i,:])-1)*y
errorbar(arange(n), y,yerr=[y_err_down,y_err_up],markersize = 0.5)
title(ion_names[i])
ylim(0,10)
show()
errorbar(arange(n), -T, errT,markersize = 0.5)
ylim(-3,1.5)
show()
coeffE = reshape(err[:k*m], (m,k))
T0E = err[k*m:k*m+n_elemets] #basic temperature shift
aE = err[k*m+n_elemets:k*m+2*n_elemets]#width of the gaussian
TE = err[-(1+n_elemets)*n:-n_elemets*n]# temperature
densityE = reshape(err[-n*n_elemets:],(n,n_elemets)).T#logarithm density
#print shape(shots), shape
x = arange(len(T))
save('shots', shots)
save('density', density)
save('temperature', T)