Skip to content
RDS_lolo.py 14.2 KiB
Newer Older
Marcelo Luda's avatar
Marcelo Luda committed
import h5py
import matplotlib.pyplot as plt
import numpy as np
import sys
import re
import ast
from scipy.optimize import curve_fit
import os
from scipy import interpolate



from glob import glob

from scipy.signal import savgol_filter as savgol


#%% Funciones auxiliares


# Función para verificar lectura de archivos
def SeeKeys(files):
    for i, fname in enumerate(files):
        data = h5py.File(fname, 'r') # Leo el h5: Recordar que nuestros datos estan en 'datasets'
        print(fname)
        print(list(data['datasets'].keys()))




def clean_jumps_below(frec,amp,umbral=0):
    """
    función para filtrar los spickes menores a un humbral determinado
    """
    
    frec = np.array(frec)
    amp  = np.array(amp)

    return frec[amp>umbral] , amp[amp>umbral]

#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#%% Carga de datos experimentales 


# glob('/home/lolo/tmp/github/artiq_experiments/artiq_master/results/2023-08-16')

DATAFILES = sorted(glob('../../../artiq_master/results/2023-08-*/*/*.h5'))


""" Bitácora Nico:
    
Configuracion +2/+2 descompensando:

Ubicación lateral
DCA: 14506, 14507, 14508
CompOVEN: 14509, 14510, 14511, 14512

Ubicación superior:
DCA: 14513, 14514, 14515
CompOVEN: 14516, 14517, 14518, 14519

Configuración Gaussianos:
DCA: 14557, 14558. 14559
CompOVEN: 14560, 14561, 14562, 14563, 14564


"""

DATAFILES_costado_dcA      = [  aa for aa in DATAFILES for jj in range(14506,14508+1) if f'{jj}' in aa ]

DATAFILES_costado_compOVEN = [  aa for aa in DATAFILES for jj in range(14509,14512+1) if f'{jj}' in aa ]



DATAFILES_arriba_dcA      = [  aa for aa in DATAFILES for jj in range(14513,14515+1) if f'{jj}' in aa ]

DATAFILES_arriba_compOVEN = [  aa for aa in DATAFILES for jj in range(14516,14519+1) if f'{jj}' in aa ]


DATAFILES_gauss_dcA      = [  aa for aa in DATAFILES for jj in range(14557,14559+1) if f'{jj}' in aa ]

DATAFILES_gauss_compOVEN = [  aa for aa in DATAFILES for jj in range(14560,14564+1) if f'{jj}' in aa ]



DATOS_COMPLETOS = []

DATOS_COMPLETOS.append([DATAFILES_costado_dcA,'Configuracion +2/+2 colineales, ion al costado del haz barriendo dcA','conf_+2+2_lateral_dcA.png'])
DATOS_COMPLETOS.append([DATAFILES_costado_compOVEN,'Configuracion +2/+2 colineales, ion al costado del haz barriendo compOven','conf_+2+2_lateral_compOven.png'])
Marcelo Luda's avatar
Marcelo Luda committed
DATOS_COMPLETOS.append([DATAFILES_arriba_dcA,'Configuracion +2/+2 colineales, ion arriba del haz barriendo dcA','conf_+2+2_arriba_dcA.png'])
DATOS_COMPLETOS.append([DATAFILES_arriba_compOVEN,'Configuracion +2/+2 colineales, ion arriba del haz barriendo compOven','conf_+2+2_arriba_compOven.png'])
Marcelo Luda's avatar
Marcelo Luda committed
DATOS_COMPLETOS.append([DATAFILES_gauss_dcA,'Configuracion gaussiana colineales barriendo dcA','conf_gauss_dcA.png'])
DATOS_COMPLETOS.append([DATAFILES_gauss_compOVEN,'Configuracion gaussiana colineales barriendo compOven','conf_gauss_compOven.png'])
Marcelo Luda's avatar
Marcelo Luda committed



#%% inspect

# SeeKeys(DATAFILES_costado_dcA[:1])
# data = h5py.File(DATAFILES_costado_dcA[0], 'r')
# for kk,vv in data['datasets'].items():
#     print(f'{kk}:\t',vv)




#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Marcelo Luda's avatar
Marcelo Luda committed
#%% Configuracion +2/+2 colineales
Marcelo Luda's avatar
Marcelo Luda committed

FACTOR_ESCALA = 10

Marcelo Luda's avatar
Marcelo Luda committed
for ii,DATO in enumerate(DATOS_COMPLETOS[0:]):
Marcelo Luda's avatar
Marcelo Luda committed
    

    VECTOR_DE_DATOS, SUP_TITLE, FILENAME =  DATO
    
    
    
    # Grafico con subplots
    fig,axx = plt.subplots(1,2,figsize=(12,8), constrained_layout=True , sharey=True )
    fig.set_constrained_layout_pads(w_pad=1/72, h_pad=0, hspace=0, wspace=0)
    
    
    
    rango_dr1 = np.array([435,437])
    rango_dr2 = np.array([443,445])
    
    I_base_fit = np.arange(0,50).tolist()+np.arange(230,280).tolist()+np.arange(450,459).tolist()
    I_base_fit = np.array(I_base_fit)
    
    
    
    ax = axx[0]
    
    
    # plt.figure()
    
    # ax = plt.gca()
    
    NORMALIZADO = True
    
    rango_dr1 = np.array([435,437])
    rango_dr2 = np.array([443,446])
    
Marcelo Luda's avatar
Marcelo Luda committed
    picos     = {0:[], 1:[]}
    picos_err = {0:[], 1:[]}
Marcelo Luda's avatar
Marcelo Luda committed
    
    dcA_vec = []
    
    
    
    
    for data in sorted([ h5py.File(DataFile, 'r') for DataFile in VECTOR_DE_DATOS ],key=lambda x: np.array(x['datasets']['initialvoltage_dcA']) ):
        frecuencia = np.array(data['datasets']['IR1_Frequencies'])*2e-6
        voltages   = np.array(data['datasets']['scanning_voltages'])
        for kk, dcA in enumerate( voltages ):
        
            # cuentas    = np.array(data['datasets']['data_array'])
            cuentas   = np.array(data['datasets']['data_array']).reshape(len(voltages),-1)[kk][0:len(frecuencia)]
            amplitudes = np.array(data['datasets']['IR1_Amplitudes'])
            # dcA = np.array(data['datasets']['initialvoltage_dcA'])
            
            dcA_vec.append( dcA.tolist() )
            
            frecuencia,cuentas  = clean_jumps_below(frecuencia,cuentas, 200)
            
Marcelo Luda's avatar
Marcelo Luda committed
            #cuentas_suave    = savgol(cuentas,13,4)
            cuentas_suave    = savgol(cuentas,7,4)
Marcelo Luda's avatar
Marcelo Luda committed
            # cuentas_suave    = cuentas
            
            
            I_base_fit  = np.arange(len(frecuencia))[:50].tolist()
            I_base_fit += np.arange(len(frecuencia))[(frecuencia>=439)&(frecuencia<=442)].tolist()
            # I_base_fit += np.arange(len(frecuencia))[(frecuencia>=500)&(frecuencia<=442)].tolist()
            I_base_fit = np.array(I_base_fit)
           
Marcelo Luda's avatar
Marcelo Luda committed
            mm,cov = np.polyfit(frecuencia[I_base_fit], cuentas[I_base_fit],1, cov=True)
Marcelo Luda's avatar
Marcelo Luda committed
            
            
            
            base = np.polyval(mm,frecuencia)
            
            
            CURVA       = (cuentas/base-1)/FACTOR_ESCALA + dcA
            CURVA_SUAVE = (cuentas_suave/base-1)/FACTOR_ESCALA+ dcA
            ax.plot(frecuencia,CURVA      , '.', alpha=0.1)
            ax.plot(frecuencia,CURVA_SUAVE, '-', alpha=0.9, color=ax.get_lines()[-1].get_color())
            
            
            
            
            for jj,rango in enumerate([rango_dr1,rango_dr2]):
                I = np.arange(len(frecuencia))[(frecuencia>rango.min())&(frecuencia<rango.max())]
                idx = cuentas_suave[I].argmin() + I[0]
                
                ax.plot(frecuencia[idx],(cuentas_suave[idx]/base[idx]-1)/FACTOR_ESCALA+dcA, 'o', ms=6, color=ax.get_lines()[-1].get_color(),zorder=10)
                
                Base = np.polyval(mm,rango.mean())
Marcelo Luda's avatar
Marcelo Luda committed
                Base_err = np.sqrt(np.sum(np.diag(cov)*np.array([frecuencia[idx]**2,1])))
                
Marcelo Luda's avatar
Marcelo Luda committed
                val_pico = cuentas_suave[I].min()
Marcelo Luda's avatar
Marcelo Luda committed
                picos[jj].append(     (Base-val_pico)/Base )
                # picos_err[jj].append( np.sqrt(cuentas[idx])/Base )
                picos_err[jj].append( np.sqrt(cuentas[idx])/Base + cuentas[idx]*np.sqrt(cuentas[idx])/Base**2 )
Marcelo Luda's avatar
Marcelo Luda committed
                print( (Base-val_pico)/Base , end="\t")
            print('')
        #     break
        # break
Marcelo Luda's avatar
Marcelo Luda committed
        # plt.plot(frecuencia,cuentas , label=dcA)
        # plt.plot(frecuencia,base , label=dcA)
        # # cuentas_suave    = savgol(cuentas,7,4)
        # plt.plot(frecuencia,cuentas_suave )
Marcelo Luda's avatar
Marcelo Luda committed
        # plt.pause(2)
        # plt.cla()
        
        
        # ax.plot(cuentas , label=dcA)
        
    # plt.plot(frecuencia,amplitudes )
    # ax.legend()
    
    
    
    ax.axvline(rango_dr1.mean(), color='gray', zorder=-10, lw=3 , alpha=0.5)
    ax.axvline(rango_dr2.mean(), color='gray', zorder=-10, lw=3, ls='--', alpha=0.5)
    
    ax = axx[1]
    
    ax.plot(  picos[0] , dcA_vec , '.-'  , color='gray')
Marcelo Luda's avatar
Marcelo Luda committed
    for pico,pico_err,dcA_val in zip(picos[0],picos_err[0],dcA_vec):
        # ax.plot( pico, dcA_val, '.' ,ms=7)
        ax.errorbar( pico, dcA_val, xerr=pico_err, fmt='.' ,ms=7, capsize=4)
Marcelo Luda's avatar
Marcelo Luda committed
    ax.set_prop_cycle(None)

    ax.plot(  picos[1] , dcA_vec , 'o--' , color='gray')
Marcelo Luda's avatar
Marcelo Luda committed
    for pico,pico_err,dcA_val in zip(picos[1],picos_err[1],dcA_vec):
        # ax.plot( pico, dcA_val, 'o' ,ms=7)
        ax.errorbar( pico, dcA_val, xerr=pico_err, fmt='.' ,ms=7, capsize=4)
Marcelo Luda's avatar
Marcelo Luda committed
    
    
    profundidad_mean = [ np.array(np.array(picos[0])[dcA_vec==val].tolist()+np.array(picos[1])[dcA_vec==val].tolist()).mean() for val in np.unique(dcA_vec) ]
    profundidad_dev  = [ np.array(np.array(picos[0])[dcA_vec==val].tolist()+np.array(picos[1])[dcA_vec==val].tolist()).std() for val in np.unique(dcA_vec) ]
    dcA_uniq         = np.unique(dcA_vec)
    
    

    
    ax.set_xlabel('Profundidad')
    
    axx[0].set_ylabel(f'{SUP_TITLE.split()[-1]} [V]')
    axx[0].set_xlabel('frecuencia [kHz]')
    
    
    
    for ax in axx:
        ax.grid(b=True,linestyle=':',color='lightgray')
    
    
    ax.set_xlim( 0, ax.get_xlim()[1] )
    
    fig.suptitle(SUP_TITLE)
    
    fig.savefig(f"{ii+1:02d}_{FILENAME}")
Marcelo Luda's avatar
Marcelo Luda committed
    
    # break

Marcelo Luda's avatar
Marcelo Luda committed



#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#%% CVersion AREA

FACTOR_ESCALA = 10

for ii,DATO in enumerate(DATOS_COMPLETOS):
    

    VECTOR_DE_DATOS, SUP_TITLE, FILENAME =  DATO
    
    
    
    # Grafico con subplots
    fig,axx = plt.subplots(1,2,figsize=(12,8), constrained_layout=True , sharey=True )
    fig.set_constrained_layout_pads(w_pad=1/72, h_pad=0, hspace=0, wspace=0)
    
    
    
    rango_dr1 = np.array([435,437])
    rango_dr2 = np.array([443,445])
    
    I_base_fit = np.arange(0,50).tolist()+np.arange(230,280).tolist()+np.arange(450,459).tolist()
    I_base_fit = np.array(I_base_fit)
    
    
    
    ax = axx[0]
    
    
    # plt.figure()
    
    # ax = plt.gca()
    
    NORMALIZADO = True
    
    rango_dr1 = np.array([435,437])
    rango_dr2 = np.array([443,446])
    
    picos     = {0:[], 1:[]}
    picos_err = {0:[], 1:[]}
    
    dcA_vec = []
    
    
    
    
    for data in sorted([ h5py.File(DataFile, 'r') for DataFile in VECTOR_DE_DATOS ],key=lambda x: np.array(x['datasets']['initialvoltage_dcA']) ):
        frecuencia = np.array(data['datasets']['IR1_Frequencies'])*2e-6
        voltages   = np.array(data['datasets']['scanning_voltages'])
        for kk, dcA in enumerate( voltages ):
        
            # cuentas    = np.array(data['datasets']['data_array'])
            cuentas   = np.array(data['datasets']['data_array']).reshape(len(voltages),-1)[kk][0:len(frecuencia)]
            amplitudes = np.array(data['datasets']['IR1_Amplitudes'])
            # dcA = np.array(data['datasets']['initialvoltage_dcA'])
            
            dcA_vec.append( dcA.tolist() )
            
            frecuencia,cuentas  = clean_jumps_below(frecuencia,cuentas, 200)
            
            cuentas_suave    = savgol(cuentas,13,4)
            # cuentas_suave    = cuentas
            
            
            I_base_fit  = np.arange(len(frecuencia))[:50].tolist()
            I_base_fit += np.arange(len(frecuencia))[(frecuencia>=439)&(frecuencia<=442)].tolist()
            # I_base_fit += np.arange(len(frecuencia))[(frecuencia>=500)&(frecuencia<=442)].tolist()
            I_base_fit = np.array(I_base_fit)
           
            mm,cov = np.polyfit(frecuencia[I_base_fit], cuentas[I_base_fit],1, cov=True)
            
            
            
            base = np.polyval(mm,frecuencia)
            
            
            CURVA       = (cuentas/base-1)/FACTOR_ESCALA + dcA
            CURVA_SUAVE = (cuentas_suave/base-1)/FACTOR_ESCALA+ dcA
            ax.plot(frecuencia,CURVA      , '.', alpha=0.1)
            ax.plot(frecuencia,CURVA_SUAVE, '-', alpha=0.9, color=ax.get_lines()[-1].get_color())
            
            
            
            
            for jj,rango in enumerate([rango_dr1,rango_dr2]):
                I = np.arange(len(frecuencia))[(frecuencia>rango.min())&(frecuencia<rango.max())]
                idx = cuentas_suave[I].argmin() + I[0]
                
                ax.plot(frecuencia[idx],(cuentas_suave[idx]/base[idx]-1)/FACTOR_ESCALA+dcA, 'o', ms=6, color=ax.get_lines()[-1].get_color(),zorder=10)
                
                Base = np.polyval(mm,rango.mean())
                Base_err = np.sqrt(np.sum(np.diag(cov)*np.array([frecuencia[idx]**2,1])))
                
                val_pico = cuentas_suave[I].min()
                picos[jj].append(     (Base-val_pico)/Base )
                # picos_err[jj].append( np.sqrt(cuentas[idx])/Base )
                picos_err[jj].append( np.sqrt(cuentas[idx])/Base + cuentas[idx]*np.sqrt(cuentas[idx])/Base**2 )
                print( (Base-val_pico)/Base , end="\t")
            print('')
        #     break
        # break
        # ax.plot(frecuencia,cuentas , label=dcA)
        
        # plt.pause(2)
        # plt.cla()
        
        
        # ax.plot(cuentas , label=dcA)
        
    # plt.plot(frecuencia,amplitudes )
    # ax.legend()
    
    
    
    ax.axvline(rango_dr1.mean(), color='gray', zorder=-10, lw=3 , alpha=0.5)
    ax.axvline(rango_dr2.mean(), color='gray', zorder=-10, lw=3, ls='--', alpha=0.5)
    
    ax = axx[1]
    
    dcA_vec = np.array(dcA_vec)
    picos[0] = np.array(picos[0])
    picos[1] = np.array(picos[1])
    picos_err[0] = np.array(picos_err[0])
    picos_err[1] = np.array(picos_err[1])
    
    
    
    ax.fill_betweenx(  dcA_vec, picos[0]+ picos_err[0],picos[0]- picos_err[0] , alpha=0.6)
    
    ax.fill_betweenx(  dcA_vec, picos[1]+ picos_err[1],picos[1]- picos_err[1]  , alpha=0.6)
    
    # for pico,pico_err,dcA_val in zip(picos[0],picos_err[0],dcA_vec):
    #     # ax.plot( pico, dcA_val, '.' ,ms=7)
    #     ax.errorbar( pico, dcA_val, xerr=pico_err, fmt='.' ,ms=7, capsize=4)
    # ax.set_prop_cycle(None)
    ax.plot(  picos[0] , dcA_vec , '.-'  , color='C0')
    ax.plot(  picos[1] , dcA_vec , 'o--' , color='C1')
    # for pico,pico_err,dcA_val in zip(picos[1],picos_err[1],dcA_vec):
    #     # ax.plot( pico, dcA_val, 'o' ,ms=7)
    #     ax.errorbar( pico, dcA_val, xerr=pico_err, fmt='.' ,ms=7, capsize=4)
    
    
    profundidad_mean = [ np.array(np.array(picos[0])[dcA_vec==val].tolist()+np.array(picos[1])[dcA_vec==val].tolist()).mean() for val in np.unique(dcA_vec) ]
    profundidad_dev  = [ np.array(np.array(picos[0])[dcA_vec==val].tolist()+np.array(picos[1])[dcA_vec==val].tolist()).std() for val in np.unique(dcA_vec) ]
    dcA_uniq         = np.unique(dcA_vec)
    
    

    
    ax.set_xlabel('Profundidad')
    
    axx[0].set_ylabel(f'{SUP_TITLE.split()[-1]} [V]')
    axx[0].set_xlabel('frecuencia [kHz]')
    
    
    
    for ax in axx:
        ax.grid(b=True,linestyle=':',color='lightgray')
    
    
    ax.set_xlim( 0, ax.get_xlim()[1] )
    
    fig.suptitle(SUP_TITLE)
    
Marcelo Luda's avatar
Marcelo Luda committed
    fig.savefig(f"area_{ii+1:02d}_{FILENAME}")
Marcelo Luda's avatar
Marcelo Luda committed
    
    
Marcelo Luda's avatar
Marcelo Luda committed
    # break
Marcelo Luda's avatar
Marcelo Luda committed