Handling/CompAlgSystems4GolemUpToShotNo31150/python/Depot/1018PlasmaPosition_JIMC/LocalPlasmaPosition.py

import numpy as np
#rom pygolem_lite import Shot
import pylab as pl
pl.ion()
import matplotlib.pyplot as plt

#plasma_start
#plasma_end

#For testing, the shot will be the following:
shot= 24867

#shot = 28305

# create data cache in the 'golem_cache' folder
ds = np.DataSource('golem_cache')

#Create a path to data and download and open the file
base_url = "http://golem.fjfi.cvut.cz/utils/data/"

##--------------------------------------------------

def Shot(number, identifier):
    dat = ds.open(base_url+ str(number) + '/' + identifier)
    sig = np.loadtxt(dat)
    return sig

def get_mirnov(shotn):
    '''Return signals from all Mirnov coils from given shot.
    Call signature:
        t, coils = get_mirnov(shot)'''
    signal = Shot(shotn, "papouch_st")
    return np.array(signal[:,0]), np.array(signal[:,1:7]).T
    #return np.array(signal[0]), np.array(signal[1:]).T[0:6]

def get_vacuum_shot(current):
    return int(21354)
    for i in range(1,20):
        vacuum = int (Shot(current-i, 'shotno'))
        if (compare_shots(current, vacuum)):
                return int(Shot(vacuum, 'shotno'))
    return None    

def compare_shots(current, vacuum):
    if (Shot (vacuum, 'plasma')):
        return 0
    diagnostics = ('reversed_bfield', 'reversed_efield', 'tb', 'tcd', 'ub', 'ucd')
    for diag in diagnostics:
        if Shot(shot, diag)!=Shot(vacuum, diag):
            return 0
    return 1

##----------------------------------------------------
    

def integrate_coil(t, coil, coeff):
    '''Return integrated signals from given coils from given shot.
    Call signature:
        t, coils = get_integrated_mirnov(shot, array_of_coil_signals)
    Note: Unit of signal is T.'''
    coil -= coil[0:4500].mean() #subtract drift
    coil[4990:5060] = 0 #remove jump caused by thyristors
    integrated_data = np.array([np.cumsum(coil)])
    integrated_data *= (t[1] - t[0]) / coeff * (-1)
    return integrated_data
    


def compute_plasma_position(mc):
    
    #the following variables need to be added or substracted depending on the amount of MC working:
    
    m1, m2, m3, m4, mSadd,  m5 = mc 
    
    
    #vertical position
    mirnDiam = 0.093 #radial position of Mirnov coils
    denominator = m2 + m4
    denominator[abs(denominator) < 1e-3] *= np.nan
    x_vert = mirnDiam * (m2 - m4) / denominator
    
    #horizontal position
    Bz = m5 / -0.1052
    a_L = 0.085
    x_horiz = []
    iterations = []
    for i in np.arange(0, len(m1)):
        a = 0.085
        iteration = 0
        if abs(m1[i] + m2[i] + m3[i] + m4[i]) < 1e-3:
            x_horiz.append(np.nan)
            iterations.append(0)
            continue
        while (a > 0) and (iteration<100):
            Lambda = np.log(a/mirnDiam) - (2/(denominator[i]*0.2325))*(Bz[i] + (m1[i] - m3[i])/2) - 1
            dr = (m3[i] - m1[i]) * mirnDiam / denominator[i] - (mirnDiam**2/(2*0.4)) * (np.log(a/mirnDiam) + (a**2/(mirnDiam**2) + 1)*(Lambda + 0.5) + 1)
            epsilon = a - a_L +  np.sqrt(dr**2 + x_vert[i]**2)
            if abs(epsilon) < 1e-6:
                break
            a = a_L - np.sqrt(dr**2 + x_vert[i]**2)
            iteration += 1
        x_horiz.append(dr)
        iterations.append(iteration)
    return x_vert, x_horiz, iterations




def main():
    coeff = (3.8e-3,)*4 + (1,)*2
    t, mc_vac = get_mirnov(get_vacuum_shot(shot))
    t, mc_pl = get_mirnov(shot)
    mc = []
    for i in range(0, mc_vac.shape[0]):
        mc_vac[i] = integrate_coil(t, mc_vac[i], coeff[i])
        mc_pl[i] = integrate_coil(t, mc_pl[i], coeff[i])
        mc.append(mc_pl[i] - mc_vac[i])
        np.savetxt('mc' + str(i) + '.txt', np.array((t, mc_vac[i], mc_pl[i], mc[i])).T, fmt='%s')

    x_vert, x_horiz, iterations = compute_plasma_position(mc)
    for i in range(len(x_vert)):
        if (x_vert[i] > 0.1):
            x_vert[i] = 0.1
        if (x_vert[i] < -0.1):
            x_vert[i] = -0.1
        if (x_horiz[i] > 0.1):
            x_horiz[i] = 0.1
        if (x_horiz[i] < -0.1):
            x_horiz[i] = -0.1
    np.savetxt('plasma_position.txt', np.array((t, x_vert, x_horiz, iterations)).T, fmt='%s')
   
#    #----------------------Plot----------------------------------------------
#    
    x_horiz= np.array(x_horiz)
    
    plt.figure(1)
    plt.subplot(211)
    plt.plot(t, x_horiz, 'b-', label = 'R')
    
    plt.subplot(212)
    plt.plot(t, x_vert, 'r-', label = 'Z')
    
    plt.legend()
    plt.savefig('basicgraph.pdf')
    plt.savefig('basicgraph.png')
    
    plt.show()
    

    
    '''t, x_vert, x_horiz = compute_plasma_position(0)'''
    #header = 'time[s]\tvertical position [m]\thorizontal position [m]'
    return

if __name__ == '__main__':
    main()