Skip to content
CPT_plotter_20220615.py 12 KiB
Newer Older
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

"""
Ajustes de un espectro cpt global de dos iones.
Ajustamos con la contribucion de dos espectros individuales y da muy bien.
"""

#/home/nico/Documents/artiq_experiments/analisis/plots/20220615_CPTvariandocompensacion/Data

ALL_FILES = """000007971-IR_Scan_withcal_optimized
000007972-IR_Scan_withcal_optimized
000007973-IR_Scan_withcal_optimized
000007976-IR_Scan_withcal_optimized
000007980-IR_Scan_withcal_optimized
000007981-IR_Scan_withcal_optimized
000007982-IR_Scan_withcal_optimized
000007983-IR_Scan_withcal_optimized
000007984-IR_Scan_withcal_optimized
000007985-IR_Scan_withcal_optimized
000008063-IR_Scan_withcal_optimized
""" 


def SeeKeys(files):
    for i, fname in enumerate(files.split()):
        data = h5py.File(fname+'.h5', 'r') # Leo el h5: Recordar que nuestros datos estan en 'datasets'
        print(fname)
        print(list(data['datasets'].keys()))

print(SeeKeys(ALL_FILES))
#carpeta pc nico labo escritorio:
#C:\Users\Usuario\Documents\artiq\artiq_experiments\analisis\plots\20211101_CPT_DosLaseres_v03\Data

Counts = []
Freqs = []

AmpTisa = []
UVCPTAmp = []
No_measures = []

for i, fname in enumerate(ALL_FILES.split()):
    print(str(i) + ' - ' + fname)
    #print(fname)
    data = h5py.File(fname+'.h5', 'r') # Leo el h5: Recordar que nuestros datos estan en 'datasets'

    # Aca hago algo repugnante para poder levantar los strings que dejamos
    # que además tenian un error de tipeo al final. Esto no deberá ser necesario
    # cuando se solucione el error este del guardado.
    Freqs.append(np.array(data['datasets']['IR_Frequencies']))
    Counts.append(np.array(data['datasets']['counts_spectrum']))
    AmpTisa.append(np.array(data['datasets']['TISA_CPT_amp']))
    UVCPTAmp.append(np.array(data['datasets']['UV_CPT_amp']))
    No_measures.append(np.array(data['datasets']['no_measures']))

Counts_B = []
Freqs_B = []


for i, fname in enumerate(ALL_FILES.split()):
    print(str(i) + ' - ' + fname)
    #print(fname)
    data = h5py.File(fname+'.h5', 'r') # Leo el h5: Recordar que nuestros datos estan en 'datasets'

    # Aca hago algo repugnante para poder levantar los strings que dejamos
    # que además tenian un error de tipeo al final. Esto no deberá ser necesario
    # cuando se solucione el error este del guardado.
    Freqs_B.append(np.array(data['datasets']['IR_Frequencies']))
    Counts_B.append(np.array(data['datasets']['counts_spectrum']))



#%%

#barriendo posicion radial del ion en la trampa
jvec = [0, 1, 2, 3]

plt.figure()
i = 0
for j in jvec:
    plt.errorbar([2*f*1e-6 for f in Freqs[j]], Counts[j], yerr=np.sqrt(Counts[j]), fmt='o', capsize=2, markersize=2)
    #plt.plot([2*f*1e-6 for f in Freqs[j]], Counts[j], 'o-', label=f'Amp Tisa: {AmpTisa[i]}', mb  arkersize=3)
    i = i + 1
plt.grid()
plt.xlabel('Frecuencia (MHz)')
plt.ylabel('counts')
#plt.legend()


#%%
import seaborn as sns

#Barriendo angulo del IR con tisa apagado
palette = sns.color_palette("rocket", 8)

jvec = [4,5,6]

plt.figure()
i = 0
for j in jvec:
    plt.errorbar([2*f*1e-6 for f in Freqs[j]], Counts[j], yerr=np.sqrt(Counts[j]), color=palette[j-4], fmt='o', capsize=2, markersize=2)
    #plt.plot([2*f*1e-6 for f in Freqs[j]], Counts[j], 'o-', label=f'Amp Tisa: {AmpTisa[i]}', mb  arkersize=3)
    i = i + 1
plt.grid()
plt.xlabel('Frecuencia (MHz)')
plt.ylabel('counts')
plt.ylim(2000, 8000)
#plt.legend()

jvec = [7,8,9]

plt.figure()
i = 0
for j in jvec:
    plt.errorbar([2*f*1e-6 for f in Freqs[j]], Counts[j], yerr=np.sqrt(Counts[j]), color=palette[j-4], fmt='o', capsize=2, markersize=2)
    #plt.plot([2*f*1e-6 for f in Freqs[j]], Counts[j], 'o-', label=f'Amp Tisa: {AmpTisa[i]}', mb  arkersize=3)
    i = i + 1
plt.grid()
plt.xlabel('Frecuencia (MHz)')
plt.ylabel('counts')
plt.ylim(2000, 8000)
#plt.legend()

#%%

#CPT con dos iones
jvec = [10]

plt.figure()
i = 0
for j in jvec:
    plt.errorbar([2*f*1e-6 for f in Freqs[j]], Counts[j], yerr=np.sqrt(Counts[j]), color='purple',fmt='o', capsize=2, markersize=2)
    #plt.plot([2*f*1e-6 for f in Freqs[j]], Counts[j], 'o-', label=f'Amp Tisa: {AmpTisa[i]}', mb  arkersize=3)
    i = i + 1
plt.grid()
plt.xlabel('Frecuencia (MHz)')
plt.ylabel('Cuentas')

DR = [403.5,412.5,418,426.5]

for dr in DR:
    plt.axvline(dr,color='blue',linestyle='--',alpha=0.3)
Nicolas Nunez Barreto's avatar
Nicolas Nunez Barreto committed
    plt.axvline(dr+22,color='crimson',linestyle='--',alpha=0.3)
    plt.axvline(dr-22,color='red',linestyle='--')    
Nicolas Nunez Barreto's avatar
Nicolas Nunez Barreto committed
    plt.axvline(dr+44,color='red',linestyle='--')
#from EITfit.MM_eightLevel_2repumps_AnalysisFunctions import PerformExperiment_8levels
from scipy.optimize import curve_fit
import time
"""
AJUSTO LA CPT DE 2 IONES CON UN MODELO EN DONDE SUMO DOS ESPECTROS CON BETAS DISTINTOS
"""

phidoppler, titadoppler = 0, 90
phirepump, titarepump = 0,  0
phiprobe = 0
titaprobe = 90

Temp = 0.5e-3

sg = 0.544
sp = 4.5
sr = 0
DetRepump = 0


lw = 0.1
DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth = lw, lw, lw #ancho de linea de los laseres


u = 32.5e6

#B = (u/(2*np.pi))/c

offsetxpi = 427+correccion
DetDoppler = -11.5-correccion

gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 
alpha = 0


drivefreq = 2*np.pi*22.135*1e6

FreqsDR = [2*f*1e-6-offsetxpi for f in Freqs[10]]
CountsDR = Counts[10]

freqslong = np.arange(min(FreqsDR)-20, max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0]))
CircPr = 1
alpha = 0

Nicolas Nunez Barreto's avatar
Nicolas Nunez Barreto committed
def FitEIT_MM(freqs, SG, SP, SCALE1, SCALE2, OFFSET, BETA1, BETA2):
#def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1):
Nicolas Nunez Barreto's avatar
Nicolas Nunez Barreto committed
    #BETA = 1.8
    # SG = 0.6
    # SP = 8.1
    TEMP = 0.2e-3
    
    Detunings, Fluorescence1 = PerformExperiment_8levels_MM(SG, SP, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, TEMP, alpha, phidoppler, titadoppler, phiprobe, titaprobe,  BETA1, drivefreq, min(freqs), max(freqs)+(freqs[1]-freqs[0]), freqs[1]-freqs[0], circularityprobe=CircPr, plot=False, solvemode=1, detpvec=None)
    Detunings, Fluorescence2 = PerformExperiment_8levels_MM(SG, SP, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, TEMP, alpha, phidoppler, titadoppler, phiprobe, titaprobe,  BETA2, drivefreq, min(freqs), max(freqs)+(freqs[1]-freqs[0]), freqs[1]-freqs[0], circularityprobe=CircPr, plot=False, solvemode=1, detpvec=None)
Nicolas Nunez Barreto's avatar
Nicolas Nunez Barreto committed
    ScaledFluo1 = np.array([f*SCALE1 + OFFSET for f in Fluorescence1])
    ScaledFluo2 = np.array([f*SCALE2 + OFFSET for f in Fluorescence2])
    return ScaledFluo1+ScaledFluo2
    #return ScaledFluo1
popt_2sp, pcov_2sp = curve_fit(FitEIT_MM, FreqsDR, CountsDR, p0=[0.9, 6.2, 3.5e4, 2.9e4, 1.34e3, 3.5, 0.1], bounds=((0, 0, 0, 0, 0, 0, 0), (2, 10, 5e4, 5e4, 4e3, 10, 2)))
#popt, pcov = curve_fit(FitEIT_MM, FreqsDR, CountsDR, p0=[0.8, 8, 4e4, 3.5e3, 0], bounds=((0, 0, 0, 0, 0), (2, 15, 1e5, 1e5, 10)))
Nicolas Nunez Barreto's avatar
Nicolas Nunez Barreto committed

#array([7.12876797e-01, 7.92474752e+00, 4.29735308e+04, 1.74240582e+04,
       #1.53401696e+03, 1.17073206e-06, 2.53804151e+00])
#%%
FittedEITpi_2sp = FitEIT_MM(freqslong, *popt_2sp)
#FittedEITpi = FitEIT_MM(freqslong, 0.8, 8, 4e4, 3.5e3, 0)

beta1 = popt_2sp[5]
beta2 = popt_2sp[6]

errbeta1 = np.sqrt(pcov_2sp[5,5])
errbeta2 = np.sqrt(pcov_2sp[6,6])

"""
Estos params dan bien poniendo beta2=0 y correccion=0 y son SG, SP, SCALE1, SCALE2, OFFSET, BETA1
#array([9.03123248e-01, 6.25865542e+00, 3.47684055e+04, 2.92076804e+04, 1.34556420e+03, 3.55045904e+00])
"""

"""
Ahora considerando ambos betas, con los parametros iniciales dados por los que se obtuvieron con beta2=0
y correccion=0 dan estos parametros que son los de antes pero con BETA2 incluido:
array([8.52685426e-01, 7.42939084e+00, 3.61998310e+04, 3.40160472e+04, 8.62651715e+02, 3.89756335e+00, 7.64867601e-01])
"""


plt.figure()
plt.errorbar(FreqsDR, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', color='darkgreen', alpha=0.5, capsize=2, markersize=2)
plt.plot(freqslong, FittedEITpi_2sp, color='darkgreen', linewidth=3)
#plt.title(f'Sdop: {round(popt[0], 2)}, Spr: {round(popt[1], 2)}, T: {round(popt[2]*1e3, 2)} mK, detDop: {DetDoppler} MHz')
plt.xlabel('Detuning (MHz)')
plt.ylabel('Counts')
plt.grid()

#%%
"""
Vemos la contribucion de cada ion
"""

def SinglespectraFitEIT_MM(freqs, SG, SP, SCALE1, SCALE2, OFFSET, BETA1, BETA2):
#def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1):
    #BETA = 1.8
    # SG = 0.6
    # SP = 8.1
    TEMP = 0.2e-3
    
    Detunings, Fluorescence1 = PerformExperiment_8levels_MM(SG, SP, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, TEMP, alpha, phidoppler, titadoppler, phiprobe, titaprobe,  BETA1, drivefreq, min(freqs), max(freqs)+(freqs[1]-freqs[0]), freqs[1]-freqs[0], circularityprobe=CircPr, plot=False, solvemode=1, detpvec=None)
    Detunings, Fluorescence2 = PerformExperiment_8levels_MM(SG, SP, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, TEMP, alpha, phidoppler, titadoppler, phiprobe, titaprobe,  BETA2, drivefreq, min(freqs), max(freqs)+(freqs[1]-freqs[0]), freqs[1]-freqs[0], circularityprobe=CircPr, plot=False, solvemode=1, detpvec=None)

    ScaledFluo1 = np.array([f*SCALE1 + OFFSET for f in Fluorescence1])
    ScaledFluo2 = np.array([f*SCALE2 + OFFSET for f in Fluorescence2])
    return ScaledFluo1, ScaledFluo2


FittedEITpi_2sp_ion1, FittedEITpi_2sp_ion2 = SinglespectraFitEIT_MM(freqslong, *popt_2sp)

#%%
#plt.errorbar(FreqsDR, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', color='darkgreen', alpha=0.5, capsize=2, markersize=2)
plt.plot(freqslong, FittedEITpi_2sp_ion2, color='darkolivegreen', linewidth=3, label='ion 1')
plt.plot(freqslong, FittedEITpi_2sp_ion1,  color='lawngreen', linewidth=3, label='ion 2')
#plt.title(f'Sdop: {round(popt[0], 2)}, Spr: {round(popt[1], 2)}, T: {round(popt[2]*1e3, 2)} mK, detDop: {DetDoppler} MHz')
plt.xlabel('Detuning (MHz)')
plt.ylabel('Counts')
plt.legend(loc='upper left', fontsize=20)
plt.grid()


#%%
#from EITfit.MM_eightLevel_2repumps_AnalysisFunctions import PerformExperiment_8levels
from scipy.optimize import curve_fit
import time

"""
AHORA AJUSTO LA CPT DE 2 IONES CON UN SOLO ESPECTRO PARA VER QUE
EFECTIVAMENTE DOS ESPECTROS SUMADOS DAN MEJOR
"""
phidoppler, titadoppler = 0, 90
phirepump, titarepump = 0,  0
phiprobe = 0
titaprobe = 90

Temp = 0.5e-3

sg = 0.544
sp = 4.5
sr = 0
DetRepump = 0


lw = 0.1
DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth = lw, lw, lw #ancho de linea de los laseres


u = 32.5e6

#B = (u/(2*np.pi))/c

correccion = -1

offsetxpi = 427+correccion
DetDoppler = -11.5-correccion

gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 
alpha = 0


drivefreq = 2*np.pi*22.135*1e6

FreqsDR = [2*f*1e-6-offsetxpi for f in Freqs[10]]
CountsDR = Counts[10]

freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0]))

CircPr = 1
alpha = 0


def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1):
#def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1):
    #BETA = 1.8
    # SG = 0.6
    # SP = 8.1
    TEMP = 0.2e-3
    
    Detunings, Fluorescence1 = PerformExperiment_8levels_MM(SG, SP, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, TEMP, alpha, phidoppler, titadoppler, phiprobe, titaprobe,  BETA1, drivefreq, min(freqs), max(freqs)+(freqs[1]-freqs[0]), freqs[1]-freqs[0], circularityprobe=CircPr, plot=False, solvemode=1, detpvec=None)

    ScaledFluo1 = np.array([f*SCALE1 + OFFSET for f in Fluorescence1])
    return ScaledFluo1
    #return ScaledFluo1


popt_1sp, pcov_1sp = curve_fit(FitEIT_MM, FreqsDR, CountsDR, p0=[0.9, 6.2, 3e4, 1.34e3, 2], bounds=((0, 0, 0, 0, 0), (2, 10, 5e4, 5e4, 10)))

#array([7.12876797e-01, 7.92474752e+00, 4.29735308e+04, 1.74240582e+04,
       #1.53401696e+03, 1.17073206e-06, 2.53804151e+00])

FittedEITpi_1sp = FitEIT_MM(freqslong, *popt_1sp)
#FittedEITpi_1sp = FitEIT_MM(freqslong, 0.9, 6.2, 4e4, 2.9e3, 2)


plt.figure()
plt.errorbar(FreqsDR, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', color='darkgreen', alpha=0.5, capsize=2, markersize=2)
plt.plot(freqslong, FittedEITpi_1sp, color='darkgreen', linewidth=3)
#plt.title(f'Sdop: {round(popt[0], 2)}, Spr: {round(popt[1], 2)}, T: {round(popt[2]*1e3, 2)} mK, detDop: {DetDoppler} MHz')
plt.xlabel('Detuning (MHz)')
plt.ylabel('Counts')
plt.grid()