diff --git a/analisis/plots/20230920_CPT_TemperatureSens_v2/Data/EITfit/MM_eightLevel_2repumps_AnalysisFunctions.py b/analisis/plots/20230920_CPT_TemperatureSens_v2/Data/EITfit/MM_eightLevel_2repumps_AnalysisFunctions.py index 28457ff3d0661ec59fb448a745787f8bf0d34d34..03fe1fc644a49d1775d703669d332922f6d3b402 100644 --- a/analisis/plots/20230920_CPT_TemperatureSens_v2/Data/EITfit/MM_eightLevel_2repumps_AnalysisFunctions.py +++ b/analisis/plots/20230920_CPT_TemperatureSens_v2/Data/EITfit/MM_eightLevel_2repumps_AnalysisFunctions.py @@ -18,6 +18,16 @@ from scipy.optimize import curve_fit import random from scipy.signal import savgol_filter as sf from scipy.stats import norm + + +def prob_energia(E,T): + kboltz = 1.380649e-23 + mcalcio = 6.655e-23*1e-3 + prob = np.exp(-E/(kboltz*T)) #*E**2 + return prob + + + def PerformExperiment_8levels(sg, sp, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe, betag, betap, drivefreq, freqMin, freqMax, freqStep, circularityprobe=1, plot=False, solvemode=1, detpvec=None, dephasing = False, boltzmann = False): """ @@ -37,8 +47,9 @@ def PerformExperiment_8levels(sg, sp, gPS, gPD, DetDoppler, u, DopplerLaserLinew velvec = np.linspace(-4*sigmaT,4*sigmaT,100) MBprobVec = norm.pdf(velvec,loc = 0, scale = sigmaT) + MBprobVec = MBprobVec/np.trapz(MBprobVec,velvec) for i in range(len(velvec)): - detVel = (detpvec - kp*velvec[i])/(2*np.pi*1e6) + detVel = detpvec - kp*velvec[i]/(2*np.pi*1e6) _, Fluorescence = CPTspectrum8levels( sg, sp, gPS, gPD, DetDoppler-kg*velvec[i]/(2*np.pi*1e6),u, DopplerLaserLinewidth, ProbeLaserLinewidth, 0,alpha, phidoppler, titadoppler, phiprobe, titaprobe,circularityprobe, betag, betap, drivefreq, freqMin=freqMin, freqMax=freqMax, freqStep=freqStep, plot=False,detpvec=detVel) FluorescencesVel.append(Fluorescence) @@ -54,21 +65,29 @@ def PerformExperiment_8levels(sg, sp, gPS, gPD, DetDoppler, u, DopplerLaserLinew else: - drivefreq =2*np.pi* 1e3 + drivefreq =2*np.pi* 0.6e6 FluorescencesVel = [] sigmaT = np.sqrt(T*kboltz/m) velvec = np.linspace(-4*sigmaT,4*sigmaT,100) MBprobVec = norm.pdf(velvec,loc = 0, scale = sigmaT) + + Evec = np.linspace(0,8*kboltz*T,100) + velvec = np.zeros(2*len(Evec)) + velvec= np.sqrt(2 * Evec/m) + + MBprobVec = prob_energia(Evec, T) + MBprobVec = MBprobVec/np.trapz(MBprobVec,Evec) + betagVec = velvec*kg/drivefreq betapVec = velvec*kp/drivefreq for i in range(len(betagVec)): betag,betap = betagVec[i],betapVec[i] - Frequencies, Fluorescence = CPTspectrum8levels( sg, sp, gPS, gPD, DetDoppler,u, DopplerLaserLinewidth, ProbeLaserLinewidth, 0,alpha, phidoppler, titadoppler, phiprobe, titaprobe,circularityprobe, betag, betap, drivefreq, freqMin=freqMin, freqMax=freqMax, freqStep=freqStep, plot=False,detpvec=None) + Frequencies, Fluorescence = CPTspectrum8levels( sg, sp, gPS, gPD, DetDoppler,u, DopplerLaserLinewidth, ProbeLaserLinewidth, 0,alpha, phidoppler, titadoppler, phiprobe, titaprobe,circularityprobe, betag, betap, drivefreq, freqMin=freqMin, freqMax=freqMax, freqStep=freqStep, plot=False,detpvec=detpvec) FluorescencesVel.append(Fluorescence) FluorescencesVel = np.array(FluorescencesVel) MBprobMat = np.tile(MBprobVec,(FluorescencesVel.shape[1],1)).T - Fluorescence = np.trapz(FluorescencesVel*MBprobMat,velvec,axis = 0) + Fluorescence = np.trapz(FluorescencesVel*MBprobMat,Evec,axis = 0) ProbeDetuningVectorL = Frequencies #print('Done, Total time: ', round((tfinal-tinicial), 2), "s") @@ -106,15 +125,25 @@ def SmoothNoisyCPT(Fluo, window=11, poly=3): -def fitCPT_8levels(Freq,Fluo,sg,sp,gPS,gPD,DetDoppler,u,DopplerLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe,beta, drivefreq, freqMin, freqMax, freqStep, circularityprobe=1, plot=False,dephasing = False, boltzmann = False ): - - def SpectrumForFit(Freq,sg,sp,T,DetDoppler): - freq,spectra = PerformExperiment_8levels(sg, sp, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe, beta, drivefreq, freqMin, freqMax, freqStep, circularityprobe=1, plot=False, solvemode=1, detpvec=Freq) - return spectra +def fitCPT_8levels(Freq,Fluo,sg,sp,gPS,gPD,DetDoppler,u,DopplerLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe,betag,betar, drivefreq, freqMin, freqMax, freqStep, circularityprobe=1, plot=False,dephasing = False, boltzmann = False ): + + def SpectrumForFit(Freq,sg,sp,T,DetDoppler,A,bgnd,f0): + Freq = Freq - f0 + freq,spectra = PerformExperiment_8levels(sg, sp, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe, betag,betar, drivefreq, freqMin, freqMax, freqStep,circularityprobe=1, plot=False, detpvec=Freq, dephasing = dephasing, boltzmann = boltzmann) + return spectra*A + bgnd - popt,pcov = curve_fit(SpectrumForFit,Freq,Fluo,p0 = [sg,sp,T,DetDoppler],bounds = ([0.01,0.01,0.00001,-50e6],[1,20,1,30e6])) + popt,pcov = curve_fit(SpectrumForFit,Freq,Fluo,p0 = [sg,sp,T,DetDoppler,20000,800,432],bounds = ([0.1,1,0.5e-3,-30,10000,0,420],[0.8,10,10e-3,0,100000,1000,500])) fitted_spectra = SpectrumForFit(Freq,*popt) return Freq, fitted_spectra,popt,pcov +def try_fitCPT_8levels(A,bgnd,f0,Freq,Fluo,sg,sp,gPS,gPD,DetDoppler,u,DopplerLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe,betag,betar, drivefreq, freqMin, freqMax, freqStep, circularityprobe=1, plot=False,dephasing = False, boltzmann = False ): + def SpectrumForFit(Freq,sg,sp,T,DetDoppler,A,bgnd,f0): + Freq = Freq - f0 + freq,spectra = PerformExperiment_8levels(sg, sp, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe, betag,betar, drivefreq, freqMin, freqMax, freqStep,circularityprobe=1, plot=False, detpvec=Freq, dephasing = dephasing, boltzmann = boltzmann) + return spectra*A + bgnd + return SpectrumForFit(Freq, sg, sp, T, DetDoppler, A, bgnd, f0) + + + \ No newline at end of file diff --git a/analisis/plots/20230920_CPT_TemperatureSens_v2/Data/EITfit/MM_eightLevel_2repumps_CPTPlotter.py b/analisis/plots/20230920_CPT_TemperatureSens_v2/Data/EITfit/MM_eightLevel_2repumps_CPTPlotter.py index 22ee5b763d3a2f3882c6e4249de5c90d8a40070b..19d1c291228e5f0ffdb3edd8f6b01aac875bceea 100644 --- a/analisis/plots/20230920_CPT_TemperatureSens_v2/Data/EITfit/MM_eightLevel_2repumps_CPTPlotter.py +++ b/analisis/plots/20230920_CPT_TemperatureSens_v2/Data/EITfit/MM_eightLevel_2repumps_CPTPlotter.py @@ -10,24 +10,106 @@ Created on Tue Sep 1 17:58:39 2020 import os import numpy as np -from MM_eightLevel_2repumps_AnalysisFunctions import PerformExperiment_8levels, GenerateNoisyCPT_vel, SmoothNoisyCPT, PerformExperiment_8levels_vel +from MM_eightLevel_2repumps_AnalysisFunctions import PerformExperiment_8levels, GenerateNoisyCPT_vel, SmoothNoisyCPT, PerformExperiment_8levels_vel,fitCPT_8levels,try_fitCPT_8levels import matplotlib.pyplot as plt import time import h5py -def MB_prob(vel,T): - return (m/(2*np.pi*kboltz*T))**(3/2)*2* vel**2 *np.exp(-vel**2 * m/(2*kboltz*T)) +os.chdir('/home/muri/nubeDF/Documents/codigos/artiq_experiments/analisis/plots/20231218_CPT_muri/Data') + +CPT_FILES = """000016262-IR_Scan_withcal_optimized +000016239-IR_Scan_withcal_optimized +000016240-IR_Scan_withcal_optimized +000016241-IR_Scan_withcal_optimized +000016244-IR_Scan_withcal_optimized +000016255-IR_Scan_withcal_optimized +000016256-IR_Scan_withcal_optimized +000016257-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(CPT_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 = [] +Voltages = [] + +for i, fname in enumerate(CPT_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']['IR1_Frequencies'])) + Counts.append(np.array(data['datasets']['data_array'])) + #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'])) + Voltages.append(np.array(data['datasets']['scanning_voltages'])) + +def Split(array,n): + length=len(array)/n + splitlist = [] + jj = 0 + while jj<length: + partial = [] + ii = 0 + while ii < n: + partial.append(array[jj*n+ii]) + ii = ii + 1 + splitlist.append(partial) + jj = jj + 1 + return splitlist +CountsSplit = [] +CountsSplit.append(Split(Counts[0],len(Freqs[0]))) -def MB_prob_1d(vel,T): - return np.sqrt(m/(2*np.pi*kboltz*T))*np.exp(-vel**2 * m/(2*kboltz*T)) -#plt.rcParams.update({ -# "text.usetex": True, -# "font.family": "CM Roman" -#}) +CountsSplit_2ions = [] +CountsSplit_2ions.append(Split(Counts[4],len(Freqs[4]))) +#%% + +""" +Para distintos valores de j hay curvas CPT variando compensación. +Las que valen la pena son de la 1 a la 9. +En particular, la 4 tiene poca micromoción: +""" + +jvec = [4] # de la 1 a la 9 vale la pena, despues no + +drive=22.1 + +Frequencies = Freqs[0] + +plt.figure() +i = 0 +for j in jvec: + #plt.errorbar([2*f*1e-6-419-13 for f in Frequencies], CountsSplit[0][j], yerr=np.sqrt(CountsSplit[0][j]), fmt='o', capsize=2, markersize=2) + i = i + 1 +plt.xlabel('Frecuencia (MHz)') +plt.ylabel('counts') +plt.grid() +#for dr in drs: +# plt.axvline(dr) + #plt.axvline(dr+drive) +plt.legend() plt.rcParams["axes.prop_cycle"] = plt.cycler('color', ['#DBAD1F', '#C213DB', '#DB4F2A', '#0500DB', '#09DB9B', '#B4001B', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf']) @@ -46,10 +128,10 @@ B = (u/(2*np.pi))/c gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 #anchos de linea de las transiciones -lw = 0.1 #ancho de linea de los laseres en MHz +lw = 0.5 #ancho de linea de los laseres en MHz DopplerLaserLinewidth, ProbeLaserLinewidth = lw, lw #ancho de linea de los laseres -DetDoppler = -15 #detuning doppler en MHz +DetDoppler = -24.5 #detuning doppler en MHz T = 0.1e-3 #temperatura en K alpha = 0 #angulo entre los láseres @@ -64,18 +146,18 @@ CircPr = 1 #Parametros de la simulacion cpt todo en MHz center = -15 -span = 30 +span = 80 freqMin = center-span*0.5 freqMax = center+span*0.5 -freqStep = 0.5 +freqStep = 0.25 print(freqMin,freqMax,freqStep) noiseamplitude = 0 #parametros de saturacion de los laseres. g: doppler. p: probe (un rebombeo que scanea), r: repump (otro rebombeo fijo) -sg = 0.3 -sp = 3 +sg = 0.25 +sp = 5.0 drivefreq=2*np.pi*22.135*1e6 @@ -97,17 +179,17 @@ Tvec = np.linspace(0.5e-3,100e-3,15) #Tvec = np.linspace(0.001,0.1,20) s12vec = np.linspace(0.2,0.6,20) #s12vec = [s12vec[2],s12vec[4],s12vec[10],s12vec[18]] -s12vec = [0.28] +s12vec = [0.51] s23vec = np.linspace(0.5,15,20) #s23vec = [s23vec[2],s23vec[6],s23vec[10],s23vec[18]] -s23vec = [10] +s23vec = [3.5] Tmat = np.zeros((len(s12vec),len(s23vec))) Tvec_ajuste = np.zeros(len(Tvec)) phivect = 0 -T = 10e-3 +T = 8e-3 titavect = np.linspace(0,2*np.pi,100) @@ -115,58 +197,134 @@ betag = 0 betap = 0 alpha = 0 +SCALE = 5.60485992e+04 +SCALE = 1 + + +OFFSET = 0 +OFFSET = 1.55401398e+02 + + + Freq,Fluo_sb = PerformExperiment_8levels(sg, sp, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe, betag, betap, drivefreq, freqMin, freqMax, freqStep, circularityprobe=1, plot=False, solvemode=1, detpvec=None, dephasing = False, boltzmann = False) Freq,Fluo_boltz = PerformExperiment_8levels(sg, sp, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe, betag, betap, drivefreq, freqMin, freqMax, freqStep, circularityprobe=1, plot=False, solvemode=1, detpvec=None, dephasing = False, boltzmann = True) +T = 0.8e-3 Freq,Fluo_deph = PerformExperiment_8levels(sg, sp, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe, betag, betap, drivefreq, freqMin, freqMax, freqStep, circularityprobe=1, plot=False, solvemode=1, detpvec=None, dephasing = True, boltzmann = False) -#%% -plt.plot(Freq,Fluo_boltz,label = 'Velocities') -plt.plot(Freq,Fluo_sb,label = 'Sideband') -plt.plot(Freq,Fluo_deph, label = 'Dephasing') + +plt.plot(Freq,SCALE*Fluo_boltz+OFFSET,label = 'Semiclassic') +plt.plot(Freq,SCALE*Fluo_sb+OFFSET,label = 'Sideband') +plt.plot(Freq,SCALE*Fluo_deph+OFFSET, label = 'Dephasing') plt.legend() + + + #%% -os.chdir('/home/muri/nubeDF/Documents/codigos/artiq_experiments/analisis/plots/20230920_CPT_TemperatureSens_v2/Data/') +from scipy.optimize import curve_fit + +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.5 +DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth = lw, lw, lw #ancho de linea de los laseres + + +u = 32.5e6 + +#B = (u/(2*np.pi))/c + +correccion = 13 + +offsetxpi = 419+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 + + +selectedcurve = 4 + +FreqsDR = [2*f*1e-6-offsetxpi for f in Freqs[0]] +CountsDR = CountsSplit[0][selectedcurve] +CountsDR[100]=0.5*(CountsDR[99]+CountsDR[101]) +CountsDR[105]=0.5*(CountsDR[104]+CountsDR[106]) + +freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + +CircPr = 1 +alpha = 0 + + +def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, TEMP,f0): +#def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1): + #BETA = 1.8 + # SG = 0.6 + # SP = 8.1 + # TEMP = 0.2e-3 + BETA1 = 0 + BETA2 = 0 + Detunings, Fluorescence1 = PerformExperiment_8levels(SG, SP, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, TEMP, alpha, phidoppler, titadoppler, phiprobe, titaprobe, BETA1, BETA2, drivefreq, min(freqs), max(freqs)+(freqs[1]-freqs[0]), freqs[1]-freqs[0], circularityprobe=CircPr, plot=False, solvemode=1, detpvec=np.array(freqs)-f0) + + ScaledFluo1 = np.array([f*SCALE1 + OFFSET for f in Fluorescence1]) + return ScaledFluo1 + #return ScaledFluo1 + +popt_1 = [4.82483692e-01, 8.18685518e+00, 6.48238914e+04, 1.54835760e+02, 5.56566519e-03, 5.24515673e-18] + +do_fit = True +if do_fit: + #popt_1, pcov_1 = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[0.2, 5, 6.89e4, 1.2723, 8e-3,1], bounds=((0, 0, 0, 0, 0, 0), (2, 20, 7e4, 5e4, 15e-3,5))) + FittedEITpi_1 = FitEIT_MM_single(freqslong, *popt_1) + +beta1 = popt_1[4] +errorbeta1 = np.sqrt(pcov_1[4,4]) +temp1 = popt_1[5] +errortemp1 = np.sqrt(pcov_1[5,5]) + +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_1, color='darkolivegreen', linewidth=3, label='med 1') +#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() + + + + + + + + + + + -CPT_FILES = """000011345-IR_Scan_withcal_optimized -000011331-IR_Scan_withcal_optimized -""" -for i in range(0,9): - CPT_FILES = CPT_FILES + f'0000153{19 + i}-IR_Scan_withcal_optimized\n' -CPT_FILES = CPT_FILES -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(CPT_FILES)) -Counts = [] -Freqs = [] -AmpTisa = [] -UVCPTAmp = [] -No_measures = [] -for i, fname in enumerate(CPT_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']['IR1_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'])) diff --git a/analisis/plots/20230920_CPT_TemperatureSens_v2/Data/EITfit/MM_eightLevel_2repumps_python_scripts.py b/analisis/plots/20230920_CPT_TemperatureSens_v2/Data/EITfit/MM_eightLevel_2repumps_python_scripts.py index 9b01fd47f43523d30bd33eb6737617d075eab434..8fd9fb56ae5099a66570f35d0232c9452bbcdb52 100644 --- a/analisis/plots/20230920_CPT_TemperatureSens_v2/Data/EITfit/MM_eightLevel_2repumps_python_scripts.py +++ b/analisis/plots/20230920_CPT_TemperatureSens_v2/Data/EITfit/MM_eightLevel_2repumps_python_scripts.py @@ -250,7 +250,7 @@ def dopplerBroadening(wlg, wlp, alpha, T, mcalcio = 6.655e-23*1e-3): kboltzmann = 1.38e-23 #J/K - gammaD = (2*np.pi)*np.sqrt((1/(wlg*wlg)) + (1/(wlp*wlp)) - 2*(1/(wlg*wlp))*np.cos(alpha))*np.sqrt(kboltzmann*T/(2*mcalcio)) + gammaD = (2*np.pi)*np.sqrt((1/(wlg*wlg)) + (1/(wlp*wlp)) - 2*(1/(wlg*wlp))*np.cos(alpha))*np.sqrt(kboltzmann*T/(mcalcio)) return gammaD @@ -264,10 +264,16 @@ def FullL(rabG, rabP, gPS = 0, gPD = 0, Detg = 0, Detp = 0, u = 0, lwg = 0, lwp """ + kg = 397e9 + kp = 866e9 + + fg = kg**2/(kg**2+kp**2) + fp = kp**2/(kg**2+kp**2) + db = dopplerBroadening(0.397e-6, 0.866e-6, alpha, T) - lwg = np.sqrt(lwg**2 + (db/2)**2)/2 - lwp = np.sqrt(lwp**2 + (db/2)**2)/2 + lwg = np.sqrt(lwg**2 + (fg*db)**2) + lwp = np.sqrt(lwp**2 + (fp*db)**2) @@ -306,15 +312,18 @@ def FullL(rabG, rabP, gPS = 0, gPD = 0, Detg = 0, Detp = 0, u = 0, lwg = 0, lwp M = CalculateSingleMmatrix(gPS, gPD, lwg, lwp) L0 = np.array(np.matrix(Lfullpartial) + M) - #ESTA PARTE ES CUANDO AGREGAS MICROMOCION - nmax = 7 - #print(nmax) - Ltemp, Omega = LtempCalculus(betag,betap, drivefreq) - #print(factor) - L1 = GetL1(Ltemp, L0, Omega, nmax) - Lfull = L0 + L1 #ESA CORRECCION ESTA EN L1 - #HASTA ACA + if betag !=0 and betap !=0: + #ESTA PARTE ES CUANDO AGREGAS MICROMOCION + nmax = 2*int(betag) + #print(nmax) + Ltemp, Omega = LtempCalculus(betag,betap, drivefreq) + #print(factor) + L1 = GetL1(Ltemp, L0, Omega, nmax) + Lfull = L0 + L1 #ESA CORRECCION ESTA EN L1 + #HASTA ACA + else: + Lfull = L0 #NORMALIZACION DE RHO i = 0 while i < 64: @@ -422,6 +431,9 @@ def CPTspectrum8levels(sg, sp, gPS, gPD, Detg, u, lwg, lwp, Temp, alpha, phidopp else: DetProbeVector = detpvec*1e6 * 2*np.pi + + + Detg = 2*np.pi*Detg*1e6 #lwg, lwr, lwp = 2*np.pi*lwg*1e6, 2*np.pi*lwr*1e6, 2*np.pi*lwp*1e6 @@ -463,7 +475,7 @@ def CPTspectrum8levels(sg, sp, gPS, gPD, Detg, u, lwg, lwp, Temp, alpha, phidopp plt.plot(DetProbeVectorMHz, [100*f for f in Fluovector], label=str(titaprobe) + 'º, T: ' + str(Temp*1e3) + ' mK') plt.legend() - return DetProbeVectorMHz, Fluovector + return DetProbeVectorMHz, np.array(Fluovector) def CPTspectrum8levels_vel(velvect,titavec,phivec,probvel,sg, sp, gPS, gPD, Detg, u, lwg, lwp, Temp, alpha, phidoppler, titadoppler, phiprobe, titaprobe, Circularityprobe, beta, drivefreq, freqMin=-100, freqMax=100, freqStep=1e-1, plot=False, solvemode=1): @@ -613,7 +625,7 @@ def CPTspectrum8levels_vel(velvect,titavec,phivec,probvel,sg, sp, gPS, gPD, Detg plt.plot(DetProbeVectorMHz, [100*f for f in Fluovector], label=str(titaprobe) + 'º, T: ' + str(Temp*1e3) + ' mK') plt.legend() - return DetProbeVectorMHz, Fluovector + return DetProbeVectorMHz, np.array(Fluovector) if __name__ == "__main__": diff --git a/analisis/plots/20231123_CPTconmicromocion3/CPT_plotter_20231123.py b/analisis/plots/20231123_CPTconmicromocion3/CPT_plotter_20231123.py index 7c9319d4bfc461a162ebaea714ea5431004a4acd..49def9d22f2642a6e40097acb948f8c0ea1a807e 100644 --- a/analisis/plots/20231123_CPTconmicromocion3/CPT_plotter_20231123.py +++ b/analisis/plots/20231123_CPTconmicromocion3/CPT_plotter_20231123.py @@ -24,7 +24,7 @@ CPT_FILES = """000016262-IR_Scan_withcal_optimized 000016255-IR_Scan_withcal_optimized 000016256-IR_Scan_withcal_optimized 000016257-IR_Scan_withcal_optimized -""" +""" def SeeKeys(files): @@ -147,7 +147,7 @@ correccion = 13 offsetxpi = 419+correccion+3*0.8 DetDoppler = -11.5-correccion -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -173,7 +173,7 @@ def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): # 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]) @@ -234,7 +234,7 @@ correccion = 13 offsetxpi = 419+correccion+1.6 DetDoppler = -11.5-correccion -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -259,7 +259,7 @@ def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): # 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]) @@ -323,7 +323,7 @@ DetDoppler = -11.5-correccion print(offsetxpi,DetDoppler) -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -347,7 +347,7 @@ def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): # 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]) @@ -409,7 +409,7 @@ correccion = 13 offsetxpi = 419+correccion DetDoppler = -11.5-correccion -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -433,7 +433,7 @@ def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): # 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]) @@ -496,7 +496,7 @@ correccion = 13 offsetxpi = 419+correccion-1 DetDoppler = -11.5-correccion -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -520,7 +520,7 @@ def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): # 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]) @@ -578,10 +578,10 @@ u = 32.5e6 correccion = 13 -offsetxpi = 419+correccion-2.2 +offsetxpi = 419+correccion-2.2 DetDoppler = -11.5-correccion -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -607,7 +607,7 @@ def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): # 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]) @@ -669,7 +669,7 @@ correccion = 13 offsetxpi = 419+correccion-3.7 DetDoppler = -11.5-correccion -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -693,7 +693,7 @@ def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): # 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]) @@ -755,7 +755,7 @@ correccion = 13 offsetxpi = 419+correccion-4.9 DetDoppler = -11.5-correccion -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -779,7 +779,7 @@ def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): # 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]) @@ -843,7 +843,7 @@ correccion = 16 offsetxpi = 419+correccion-6 DetDoppler = -11.5-correccion -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -867,7 +867,7 @@ def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): # 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]) @@ -938,7 +938,7 @@ correccion = 13 #DetDoppler = -11.5-correccion -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -963,7 +963,7 @@ ErrorTemp_vec = [] DetuningsUV_vec = [] ErrorDetuningsUV_vec = [] -for selectedcurve in SelectedCurveVec: +for selectedcurve in SelectedCurveVec: #selectedcurve = 2 #IMPORTANTE: SELECCIONA LA MEDICION @@ -982,11 +982,11 @@ for selectedcurve in SelectedCurveVec: CountsDR[76]=0.5*(CountsDR[75]+CountsDR[77]) if selectedcurve==7: CountsDR[117]=0.5*(CountsDR[116]+CountsDR[118]) - + freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) CircPr = 1 alpha = 0 - + def FitEIT_MM_single(Freqs, offset, DetDoppler, SG, SP, SCALE1, OFFSET, BETA1, TEMP, U, plot=False): #def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1): @@ -994,44 +994,49 @@ for selectedcurve in SelectedCurveVec: # SG = 0.6 # SP = 8.1 # TEMP = 0.2e-3 - + freqs = [2*f*1e-6-offset for f in Freqs] - + 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]) if plot: return ScaledFluo1, Detunings else: return ScaledFluo1 #return ScaledFluo1 - + do_fit = True if do_fit: +<<<<<<< HEAD print(1) popt_3_SA, pcov_3_SA = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[430, -25, 0.9, 6.2, 3e4, 1.34e3, 2, (np.pi**2)*1e-3, 32e6], bounds=((0, -50, 0, 0, 0, 0, 0, 0, 31e6), (1000, 0, 2, 20, 5e4, 5e4, 10, (np.pi**2)*10e-3, 34e6))) print(2) +======= + popt_3_SA, pcov_3_SA = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[430, -25, 0.9, 6.2, 3e4, 1.34e3, 2, (np.pi**2)*1e-3, 32e6], bounds=((0, -50, 0, 0, 0, 0, 0, 0, 25e6), (1000, 0, 2, 20, 5e4, 5e4, 10, (np.pi**2)*10e-3, 40e6))) + +>>>>>>> f197671e6d2f5bc2c74f8d1e8fb4a89fb518ddbe popt_SA_vec.append(popt_3_SA) pcov_SA_vec.append(pcov_3_SA) - + FittedEITpi_3_SA_short, Detunings_3_SA_short = FitEIT_MM_single(FreqsDR, *popt_3_SA, plot=True) freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) FittedEITpi_3_SA_long, Detunings_3_SA_long = FitEIT_MM_single(freqslong, *popt_3_SA, plot=True) - + DetuningsUV_vec.append(popt_3_SA[1]) ErrorDetuningsUV_vec.append(np.sqrt(pcov_3_SA[1,1])) - + Betas_vec.append(popt_3_SA[6]) ErrorBetas_vec.append(np.sqrt(pcov_3_SA[6,6])) Temp_vec.append(popt_3_SA[7]) ErrorTemp_vec.append(np.sqrt(pcov_3_SA[7,7])) - + Detuningsshort_vec.append(Detunings_3_SA_short) Counts_vec.append(CountsDR) Detuningslong_vec.append(Detunings_3_SA_long) FittedCounts_vec.append(FittedEITpi_3_SA_long) - - + + plt.figure() plt.errorbar(Detunings_3_SA_short, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', color='darkgreen', alpha=0.5, capsize=2, markersize=2) plt.plot(Detunings_3_SA_long, FittedEITpi_3_SA_long, color='darkolivegreen', linewidth=3, label=f'med {selectedcurve}') @@ -1040,11 +1045,11 @@ for selectedcurve in SelectedCurveVec: plt.ylabel('Counts') plt.legend(loc='upper left', fontsize=20) plt.grid() - + print(f'listo med {selectedcurve}') print(popt_3_SA) - + #%% """ Grafico distintas variables que salieron del SUper ajuste @@ -1067,10 +1072,17 @@ def hiperbola(x,a,b,c,x0): hiperbola_or_linear = True if hiperbola_or_linear: +<<<<<<< HEAD popthip,pcovhip = curve_fit(hiperbola,voltages_dcA[0:9],Betas_vec[0:9],p0=(100,0.1,1,-0.15)) xhip = np.linspace(-0.23,0.055,200) +======= + popthip,pcovhip = curve_fit(hiperbola,voltages_dcA,Betas_vec[:medfin-1],p0=(100,0.1,1,-0.15)) + + xhip = np.linspace(-0.23,0.005,200) + +>>>>>>> f197671e6d2f5bc2c74f8d1e8fb4a89fb518ddbe plt.figure() plt.errorbar(voltages_dcA,Betas_vec[0:medfin-1],yerr=ErrorBetas_vec[:medfin-1],fmt='o',capsize=5,markersize=5,color=paleta[1]) plt.plot(xhip,hiperbola(xhip,*popthip)) @@ -1081,13 +1093,13 @@ if hiperbola_or_linear: else: poptini,pcovini = curve_fit(lineal,voltages_dcA[0:3],Betas_vec[0:3]) poptfin,pcovfin = curve_fit(lineal,voltages_dcA[4:],Betas_vec[4:]) - + minimum_voltage = -(poptini[1]-poptfin[1])/(poptini[0]-poptfin[0]) #voltaje donde se intersectan las rectas, es decir, donde deberia estar el minimo de micromocion minimum_modulationfactor = lineal(minimum_voltage,*poptini) #es lo mismo si pongo *poptfin - + xini = np.linspace(-0.23,-0.13,100) xfin = np.linspace(-0.15,0.005,100) - + plt.figure() plt.errorbar(voltages_dcA,Betas_vec,yerr=ErrorBetas_vec,fmt='o',capsize=5,markersize=5,color=paleta[1]) plt.plot(xini,lineal(xini,*poptini)) @@ -1168,13 +1180,18 @@ def MicromotionSpectra(beta,det, gamma): P = (jv(0, beta)**2)/(((det)**2)+(0.5*gamma)**2) i = 1 #print(P) - while i <= 2: + while i <= 5: P = P + ((jv(i, beta))**2)/((((det)+i*ftrap)**2)+(0.5*gamma)**2) + ((jv(-i, beta))**2)/((((det)-i*ftrap)**2)+(0.5*gamma)**2) i = i + 1 #print(P) return P +def polynomial(x,a,b,c,d,e): + b=0 + d=0 + return a+b*x+c*x*x+d*x*x*x+e*x*x*x*x + def InverseDerivMicromotionSpectra(beta, det, gamma): ftrap=22.1 #gamma=23 @@ -1182,7 +1199,7 @@ def InverseDerivMicromotionSpectra(beta, det, gamma): P = ((jv(0, beta)**2)/((((det)**2)+(0.5*gamma)**2)**2))*(-2*(det)) i = 1 #print(P) - while i <= 2: + while i <= 5: P = P + (-2*(det))*((jv(i, beta))**2)/(((((det)+i*ftrap)**2)+(0.5*gamma)**2)**2) + (-2*(det))*(((jv(-i, beta))**2)/((((det)-i*ftrap)**2)+(0.5*gamma)**2)**2) i = i + 1 #print(P) @@ -1190,7 +1207,7 @@ def InverseDerivMicromotionSpectra(beta, det, gamma): def FinalTemp(beta,det, C,D): - gamma = 22 + gamma = 21 #det=-11 #D=-0.8 #C = 1.68656122e-03 @@ -1201,6 +1218,9 @@ def FinalTemp(beta,det, C,D): return (C*MicromotionSpectra(beta,det,gamma)+D*beta**2)*InverseDerivMicromotionSpectra(beta, det, gamma) #return (C*MicromotionSpectra(beta,det,gamma))*InverseDerivMicromotionSpectra(beta, det, gamma) +""" +Temperatura vs beta con un ajuste exponencial +""" popt_exp, pcov_exp = curve_fit(expo,Betas_vec[:9],[t*1e3 for t in Temp_vec[:9]]) @@ -1209,6 +1229,8 @@ popt_exp, pcov_exp = curve_fit(expo,Betas_vec[:9],[t*1e3 for t in Temp_vec[:9]]) #popt_rho22, pcov_rho22 = curve_fit(InverseMicromotionSpectra,Betas_vec, [t*1e3 for t in Temp_vec],p0=(-10,-10,10,1,20)) #esto ajusta muy bien #popt_rho22_raw, pcov_rho22_raw = curve_fit(InverseMicromotionSpectra_raw,Betas_vec[:7], [t*1e3 for t in Temp_vec[:7]],p0=(-0.1, -10, 1)) #esto ajusta muy bien popt_rho22_balance, pcov_rho22_balance = curve_fit(FinalTemp,Betas_vec[:9], [t*1e3 for t in Temp_vec[:9]],p0=(-10, 10,1)) #esto ajusta muy bien +popt_rho22_poly, pcov_rho22_poly = curve_fit(polynomial,Betas_vec[:9], [t*1e3 for t in Temp_vec[:9]],p0=(1,2,3,4,10)) #esto ajusta muy bien + print(popt_rho22_balance) @@ -1222,11 +1244,16 @@ print(f'betasquared coeff: {popt_rho22_balance[2]}') print(f'cociente de los coeff: {popt_rho22_balance[2]/popt_rho22_balance[1]}') + +print(f'params: {popt_rho22_balance}') +print(f'errores: {np.sqrt(np.diag(pcov_rho22_balance))}') + k_plot = 9 plt.figure() plt.errorbar(Betas_vec[:k_plot],[t*1e3 for t in Temp_vec[:k_plot]],xerr=ErrorBetas_vec[:k_plot], yerr=[t*1e3 for t in ErrorTemp_vec[:k_plot]],fmt='o',capsize=5,markersize=5,color=paleta[3]) #plt.plot(betaslong,expo(betaslong,*popt_exp),label='Ajuste exponencial') +plt.plot(betaslong,polynomial(betaslong,*popt_rho22_poly),label='Ajuste exponencial') #plt.plot(betaslong,cuadratica(betaslong,*popt_quad),label='Ajuste cuadratico') #plt.plot(betaslong,InverseMicromotionSpectra(betaslong,*popt_rho22),label='Ajuste cuadratico') plt.plot(betaslong,FinalTemp(betaslong,popt_rho22_balance[0],popt_rho22_balance[1],popt_rho22_balance[2]*1),label='Ajuste con espectro modulado') @@ -1411,8 +1438,8 @@ for j in jvec: plt.plot([f-f_2 for f in Freqs6[0:i_2]], [scale_2*c for c in Counts6[0:i_2]],'o') plt.plot(Freqs7, Counts7,'o') plt.errorbar(Merged_freqs, Merged_counts, yerr=np.sqrt(Merged_counts), fmt='o', capsize=2, markersize=2) - - + + i = i + 1 plt.xlabel('Frecuencia (MHz)') plt.ylabel('counts') @@ -1421,7 +1448,7 @@ for dr in drs: plt.axvline(dr) plt.axvline(dr+drive, color='red', linestyle='dashed', alpha=0.3) plt.axvline(dr-drive, color='red', linestyle='dashed', alpha=0.3) - + plt.legend() #%% @@ -1456,7 +1483,7 @@ offsetxpi = 438+correccion DetDoppler = -35-correccion-22 -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -1478,14 +1505,14 @@ def FitEIT_MM(freqs, SG, SP, SCALE1, SCALE2, SCALE3, OFFSET, BETA1, BETA2, BETA3 # SP = 8.1 TEMP = 0.1e-3 - + #BETA1, BETA2, BETA3 = 0, 0, 2 - + 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) Detunings, Fluorescence3 = PerformExperiment_8levels_MM(SG, SP, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, TEMP, alpha, phidoppler, titadoppler, phiprobe, titaprobe, BETA3, 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 for f in Fluorescence1]) ScaledFluo2 = np.array([f*SCALE2 for f in Fluorescence2]) ScaledFluo3 = np.array([f*SCALE3 for f in Fluorescence3]) @@ -1583,7 +1610,7 @@ offsetxpi = 421+correccion DetDoppler = -16-correccion+5 -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -1604,9 +1631,9 @@ def FitEIT_MM(freqs, SG, SP, SCALE1, SCALE2, OFFSET): # SG = 0.6 # SP = 8.1 TEMP = 0.1e-3 - + BETA1, BETA2 = 3, 0 - + 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) @@ -1697,7 +1724,7 @@ correccion = 13 #DetDoppler = -11.5-correccion -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -1709,29 +1736,29 @@ SelectedCurveVec = [3] popt_SA_vec_2ions = [] pcov_SA_vec_2ions = [] -for selectedcurve in SelectedCurveVec: +for selectedcurve in SelectedCurveVec: FreqsDR = Freqs[selectedcurve] CountsDR = Counts[selectedcurve] - + freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) - + CircPr = 1 alpha = 0 - - + + def FitEIT_MM_single(Freqs, offset, DetDoppler, SG, SP, SCALE1, SCALE2, OFFSET, BETA1, BETA2, TEMP, plot=False): #def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1): #BETA = 1.8 #SG = 0.6 #SP = 8.1 # TEMP = 0.2e-3 - + freqs = [2*f*1e-6-offset for f in Freqs] - + 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 for f in Fluorescence2]) if plot: @@ -1739,22 +1766,22 @@ for selectedcurve in SelectedCurveVec: else: return ScaledFluo1+ScaledFluo2 #return ScaledFluo1 - + do_fit = True if do_fit: popt_3_SA_2ions, pcov_3_SA_2ions = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[448, -42, 0.6, 8.1, 4e4, 4e4, 6e3, 1, 1.2, 0.5e-3], bounds=((0, -100,0, 0, 0,0,0,0,0, 0), (1000, 0, 2, 20,5e6, 5e6,5e4, 10, 10,10e-3))) - + #popt_3_SA_2ions = [448, -42, 8e4, 6e3, 2, 0.5e-3] - - + + popt_SA_vec_2ions.append(popt_3_SA_2ions) pcov_SA_vec_2ions.append(pcov_3_SA_2ions) - + FittedEITpi_3_SA_short, Detunings_3_SA_short = FitEIT_MM_single(FreqsDR, *popt_3_SA_2ions, plot=True) freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) FittedEITpi_3_SA_long, Detunings_3_SA_long = FitEIT_MM_single(freqslong, *popt_3_SA_2ions, plot=True) - - + + plt.figure() plt.errorbar(Detunings_3_SA_short, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', color='darkgreen', alpha=0.5, capsize=2, markersize=2) plt.plot(Detunings_3_SA_long, FittedEITpi_3_SA_long, color='darkolivegreen', linewidth=3, label=f'med {selectedcurve}') @@ -1763,7 +1790,7 @@ for selectedcurve in SelectedCurveVec: plt.ylabel('Counts') plt.legend(loc='upper left', fontsize=20) plt.grid() - + print(f'listo med {selectedcurve}') print(popt_3_SA_2ions) #print(f'Detdop:{popt_3_SA[1]},popt_3_SA:{popt[0]}') @@ -1805,7 +1832,7 @@ offsetxpi = 421+correccion DetDoppler = -16-correccion+5 -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -1826,9 +1853,9 @@ def FitEIT_MM(freqs, SG, SP, SCALE1, SCALE2, OFFSET): # SG = 0.6 # SP = 8.1 TEMP = 0.1e-3 - + BETA1, BETA2 = 3, 0 - + 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) @@ -1924,7 +1951,7 @@ correccion = 13 #DetDoppler = -11.5-correccion -gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 alpha = 0 @@ -1949,7 +1976,7 @@ SelectedCurveVec = [0] # DetuningsUV_vec = [] # ErrorDetuningsUV_vec = [] -for selectedcurve in SelectedCurveVec: +for selectedcurve in SelectedCurveVec: #selectedcurve = 2 #IMPORTANTE: SELECCIONA LA MEDICION @@ -1968,11 +1995,11 @@ for selectedcurve in SelectedCurveVec: CountsDR[76]=0.5*(CountsDR[75]+CountsDR[77]) if selectedcurve==7: CountsDR[117]=0.5*(CountsDR[116]+CountsDR[118]) - + freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) CircPr = 1 alpha = 0 - + def FitEIT_MM_single(Freqs, offset, DetDoppler, SG, SP, SCALE1, OFFSET, BETA1, TEMP, U, plot=False): #def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1): @@ -1980,43 +2007,43 @@ for selectedcurve in SelectedCurveVec: # SG = 0.6 # SP = 8.1 # TEMP = 0.2e-3 - + freqs = [2*f*1e-6-offset for f in Freqs] - + 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]) if plot: return ScaledFluo1, Detunings else: return ScaledFluo1 #return ScaledFluo1 - + do_fit = True if do_fit: popt_3_SA, pcov_3_SA = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[430, -25, 0.9, 6.2, 3e4, 1.34e3, 2, (np.pi**2)*1e-3, 32e6], bounds=((0, -50, 0, 0, 0, 0, 0, 0, 25e6), (1000, 0, 2, 20, 5e4, 5e4, 10, (np.pi**2)*10e-3, 40e6))) - + # popt_SA_vec.append(popt_3_SA) # pcov_SA_vec.append(pcov_3_SA) - + FittedEITpi_3_SA_short, Detunings_3_SA_short = FitEIT_MM_single(FreqsDR, *popt_3_SA, plot=True) freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) FittedEITpi_3_SA_long, Detunings_3_SA_long = FitEIT_MM_single(freqslong, *popt_3_SA, plot=True) - + # DetuningsUV_vec.append(popt_3_SA[1]) # ErrorDetuningsUV_vec.append(np.sqrt(pcov_3_SA[1,1])) - + # Betas_vec.append(popt_3_SA[6]) # ErrorBetas_vec.append(np.sqrt(pcov_3_SA[6,6])) # Temp_vec.append(popt_3_SA[7]) # ErrorTemp_vec.append(np.sqrt(pcov_3_SA[7,7])) - + # Detuningsshort_vec.append(Detunings_3_SA_short) # Counts_vec.append(CountsDR) # Detuningslong_vec.append(Detunings_3_SA_long) # FittedCounts_vec.append(FittedEITpi_3_SA_long) - - + + plt.figure() plt.errorbar(Detunings_3_SA_short, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', color='darkgreen', alpha=0.5, capsize=2, markersize=2) plt.plot(Detunings_3_SA_long, FittedEITpi_3_SA_long, color='darkolivegreen', linewidth=3, label=f'med {selectedcurve}') @@ -2025,13 +2052,6 @@ for selectedcurve in SelectedCurveVec: plt.ylabel('Counts') plt.legend(loc='upper left', fontsize=20) plt.grid() - + print(f'listo med {selectedcurve}') print(popt_3_SA) - - - - - - - diff --git a/analisis/plots/20231123_CPTconmicromocion3/analisis_superajuste.py b/analisis/plots/20231123_CPTconmicromocion3/analisis_superajuste.py new file mode 100644 index 0000000000000000000000000000000000000000..8152e0c1dbf8cc2203f4b87db436e65dc5af9bb5 --- /dev/null +++ b/analisis/plots/20231123_CPTconmicromocion3/analisis_superajuste.py @@ -0,0 +1,520 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Ploteo de datos y ajustes +@author: lolo +""" + + +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 + + + + +#%% Importaciones extra + +# /home/lolo/Dropbox/marce/LIAF/Trampa_anular/artiq_experiments/analisis/plots/20231123_CPTconmicromocion3/Data/EITfit/MM_eightLevel_2repumps_AnalysisFunctions.py + +from Data.EITfit.lolo_modelo_full_8niveles import PerformExperiment_8levels_MM + + +PARAMETROS = np.load('PARAMETROS.npz',allow_pickle=True) +for var_name in PARAMETROS.keys(): + globals()[var_name] = PARAMETROS[var_name] + print(f'loaded: {var_name}') + + +#%% + +""" +Primero tengo mediciones de espectros cpt de un ion variando la tension dc_A +""" + +#C:\Users\Usuario\Documents\artiq\artiq_experiments\analisis\plots\20220106_CPT_DosLaseres_v08_TISA_DR\Data + +folder = '../20231123_CPTconmicromocion3/Data/' +CPT_FILES = f""" +{folder}/000016262-IR_Scan_withcal_optimized +{folder}/000016239-IR_Scan_withcal_optimized +{folder}/000016240-IR_Scan_withcal_optimized +{folder}/000016241-IR_Scan_withcal_optimized +{folder}/000016244-IR_Scan_withcal_optimized +{folder}/000016255-IR_Scan_withcal_optimized +{folder}/000016256-IR_Scan_withcal_optimized +{folder}/000016257-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(CPT_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 = [] +Voltages = [] + +for i, fname in enumerate(CPT_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']['IR1_Frequencies'])) + Counts.append(np.array(data['datasets']['data_array'])) + #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'])) + Voltages.append(np.array(data['datasets']['scanning_voltages'])) + +def Split(array,n): + length=len(array)/n + splitlist = [] + jj = 0 + while jj<length: + partial = [] + ii = 0 + while ii < n: + partial.append(array[jj*n+ii]) + ii = ii + 1 + splitlist.append(partial) + jj = jj + 1 + return splitlist + + +CountsSplit = [] +CountsSplit.append(Split(Counts[0],len(Freqs[0]))) + + +CountsSplit_2ions = [] +CountsSplit_2ions.append(Split(Counts[4],len(Freqs[4]))) + + + +#%% +""" +AHORA INTENTO SUPER AJUSTES O SEA CON OFFSETXPI Y DETDOPPLER INCLUIDOS + +La 0 no ajusta bien incluso con todos los parametros libres +De la 1 a la 11 ajustan bien +""" + + +#from EITfit.MM_eightLevel_2repumps_AnalysisFunctions import PerformExperiment_8levels +from scipy.optimize import curve_fit +import time + +""" +SUPER AJUSTE (SA) +""" + +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 = 13 + +#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 + + +SelectedCurveVec = [1,2,3,4,5,6,7,8,9,10,11] +#SelectedCurveVec = [10] + +# if not 'popt_SA_vec' in globals().keys() or len(popt_SA_vec)==0: + +popt_SA_vec = [] +pcov_SA_vec = [] +Detuningsshort_vec = [] +Counts_vec = [] +Detuningslong_vec = [] +FittedCounts_vec = [] + +Betas_vec = [] +ErrorBetas_vec = [] +Temp_vec = [] +ErrorTemp_vec = [] + +DetuningsUV_vec = [] +ErrorDetuningsUV_vec = [] + +for selectedcurve in SelectedCurveVec: + +#selectedcurve = 2 #IMPORTANTE: SELECCIONA LA MEDICION + + FreqsDR = Freqs[0] + CountsDR = CountsSplit[0][selectedcurve] + + + if selectedcurve==1: + CountsDR[100]=0.5*(CountsDR[99]+CountsDR[101]) + CountsDR[105]=0.5*(CountsDR[104]+CountsDR[106]) + if selectedcurve==2: + CountsDR[67]=0.5*(CountsDR[66]+CountsDR[68]) + CountsDR[71]=0.5*(CountsDR[70]+CountsDR[72]) + if selectedcurve==6: + CountsDR[1]=0.5*(CountsDR[0]+CountsDR[2]) + CountsDR[76]=0.5*(CountsDR[75]+CountsDR[77]) + if selectedcurve==7: + CountsDR[117]=0.5*(CountsDR[116]+CountsDR[118]) + + freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + CircPr = 1 + alpha = 0 + + + def FitEIT_MM_single(Freqs, offset, DetDoppler, SG, SP, SCALE1, OFFSET, BETA1, TEMP, U, plot=False): + #def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1): + #BETA = 1.8 + # SG = 0.6 + # SP = 8.1 + # TEMP = 0.2e-3 + + freqs = [2*f*1e-6-offset for f in Freqs] + + 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]) + if plot: + return ScaledFluo1, Detunings + else: + return ScaledFluo1 + #return ScaledFluo1 + + do_fit = True + if do_fit: + popt_3_SA, pcov_3_SA = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[430, -25, 0.9, 6.2, 3e4, 1.34e3, 2, (np.pi**2)*1e-3, 32e6], bounds=((0, -50, 0, 0, 0, 0, 0, 0, 25e6), (1000, 0, 2, 20, 5e4, 5e4, 10, (np.pi**2)*10e-3, 40e6))) + + popt_SA_vec.append(popt_3_SA) + pcov_SA_vec.append(pcov_3_SA) + + FittedEITpi_3_SA_short, Detunings_3_SA_short = FitEIT_MM_single(FreqsDR, *popt_3_SA, plot=True) + freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + FittedEITpi_3_SA_long, Detunings_3_SA_long = FitEIT_MM_single(freqslong, *popt_3_SA, plot=True) + + DetuningsUV_vec.append(popt_3_SA[1]) + ErrorDetuningsUV_vec.append(np.sqrt(pcov_3_SA[1,1])) + + Betas_vec.append(popt_3_SA[6]) + ErrorBetas_vec.append(np.sqrt(pcov_3_SA[6,6])) + Temp_vec.append(popt_3_SA[7]) + ErrorTemp_vec.append(np.sqrt(pcov_3_SA[7,7])) + + Detuningsshort_vec.append(Detunings_3_SA_short) + Counts_vec.append(CountsDR) + Detuningslong_vec.append(Detunings_3_SA_long) + FittedCounts_vec.append(FittedEITpi_3_SA_long) + + + plt.figure() + plt.errorbar(Detunings_3_SA_short, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', color='darkgreen', alpha=0.5, capsize=2, markersize=2) + plt.plot(Detunings_3_SA_long, FittedEITpi_3_SA_long, color='darkolivegreen', linewidth=3, label=f'med {selectedcurve}') + #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() + + print(f'listo med {selectedcurve}') + print(popt_3_SA) + + +#%% +""" +Grafico distintas variables que salieron del SUper ajuste +""" + +import seaborn as sns +paleta = sns.color_palette("rocket") + +medfin = 12 + + +voltages_dcA = Voltages[0][1:medfin] + +def lineal(x,a,b): + return a*x+b + +def hiperbola(x,a,b,c,x0): + return a*np.sqrt(((x-x0)**2+c**2))+b + +hiperbola_or_linear = True + +if hiperbola_or_linear: + popthip,pcovhip = curve_fit(hiperbola,voltages_dcA,Betas_vec[:medfin-1],p0=(100,0.1,1,-0.15)) + + xhip = np.linspace(-0.23,0.005,200) + + plt.figure() + plt.errorbar(voltages_dcA,Betas_vec[0:medfin-1],yerr=ErrorBetas_vec[:medfin-1],fmt='o',capsize=5,markersize=5,color=paleta[1]) + plt.plot(xhip,hiperbola(xhip,*popthip)) + plt.xlabel('Endcap voltage (V)') + plt.ylabel('Modulation factor') + plt.grid() + +else: + poptini,pcovini = curve_fit(lineal,voltages_dcA[0:3],Betas_vec[0:3]) + poptfin,pcovfin = curve_fit(lineal,voltages_dcA[4:],Betas_vec[4:]) + + minimum_voltage = -(poptini[1]-poptfin[1])/(poptini[0]-poptfin[0]) #voltaje donde se intersectan las rectas, es decir, donde deberia estar el minimo de micromocion + minimum_modulationfactor = lineal(minimum_voltage,*poptini) #es lo mismo si pongo *poptfin + + xini = np.linspace(-0.23,-0.13,100) + xfin = np.linspace(-0.15,0.005,100) + + plt.figure() + plt.errorbar(voltages_dcA,Betas_vec,yerr=ErrorBetas_vec,fmt='o',capsize=5,markersize=5,color=paleta[1]) + plt.plot(xini,lineal(xini,*poptini)) + plt.plot(xfin,lineal(xfin,*poptfin)) + plt.axvline(minimum_voltage,linestyle='dashed',color='grey') + plt.xlabel('Endcap voltage (V)') + plt.ylabel('Modulation factor') + plt.grid() + + +print([t*1e3 for t in Temp_vec]) + +plt.figure() +plt.errorbar(voltages_dcA,[t*1e3 for t in Temp_vec[:medfin-1]],yerr=[t*1e3 for t in ErrorTemp_vec[:medfin-1]],fmt='o',capsize=5,markersize=5,color=paleta[3]) +#plt.axvline(minimum_voltage,linestyle='dashed',color='grey') +plt.axhline(0.538) +plt.xlabel('Endcap voltage (V)') +plt.ylabel('Temperature (mK)') +plt.grid() +#plt.ylim(0,2) + +#%% +""" +Ahora hago un ajuste con una hiperbola porque tiene mas sentido, por el hecho +de que en el punto optimo el ion no esta en el centro de la trampa +sino que esta a una distancia d +""" +def hiperbola(x,a,b,c,x0): + return a*np.sqrt(((x-x0)**2+c**2))+b + +popthip,pcovhip = curve_fit(hiperbola,voltages_dcA,Betas_vec[:10],p0=(100,0.1,1,-0.15)) + +xhip = np.linspace(-0.23,0.005,200) + +plt.figure() +plt.errorbar(voltages_dcA,Betas_vec[:10],yerr=ErrorBetas_vec[:10],fmt='o',capsize=5,markersize=5,color=paleta[1]) +plt.plot(xhip,hiperbola(xhip,*popthip)) +plt.xlabel('Endcap voltage (V)') +plt.ylabel('Modulation factor') +plt.grid() + + + + +#%% +from scipy.special import jv + + +def expo(x,tau,A,B): + return A*np.exp(x/tau)+B + +def cuadratica(x,a,c): + return a*(x**2)+c + +def InverseMicromotionSpectra(beta, A, det, x0, gamma, B): + ftrap=22.1 + #gamma=30 + P = ((jv(0, beta)**2)/((((det-x0)**2)+(0.5*gamma)**2)**2))*(-2*(det-x0)) + i = 1 + #print(P) + while i <= 5: + P = P + (-2*(det-x0))*((jv(i, beta))**2)/(((((det-x0)+i*ftrap)**2)+(0.5*gamma)**2)**2) + (-2*(det-x0))*(((jv(-i, beta))**2)/((((det-x0)-i*ftrap)**2)+(0.5*gamma)**2)**2) + i = i + 1 + #print(P) + #return 1/(A*P+B) + return 1/(A*P+B) + + +def InverseMicromotionSpectra_raw(beta, A, det, B): + ftrap=22.1 + gamma=21 + P = ((jv(0, beta)**2)/((((det)**2)+(0.5*gamma)**2)**2))*(-2*(det)) + i = 1 + #print(P) + while i <= 3: + P = P + (-2*(det))*((jv(i, beta))**2)/(((((det)+i*ftrap)**2)+(0.5*gamma)**2)**2) + (-2*(det))*(((jv(-i, beta))**2)/((((det)-i*ftrap)**2)+(0.5*gamma)**2)**2) + i = i + 1 + #print(P) + return A/P+B + + +""" +Temperatura vs beta con un ajuste exponencial +""" + +popt_exp, pcov_exp = curve_fit(expo,Betas_vec[:10],[t*1e3 for t in Temp_vec[:10]]) +popt_quad, pcov_quad = curve_fit(cuadratica,Betas_vec[:10],[t*1e3 for t in Temp_vec[:10]],p0=(1,10)) +#popt_rho22, pcov_rho22 = curve_fit(InverseMicromotionSpectra,Betas_vec,[t*1e3 for t in Temp_vec],p0=(10,10,-10,1,20)) #esto ajusta muy bien +#popt_rho22, pcov_rho22 = curve_fit(InverseMicromotionSpectra,Betas_vec, [t*1e3 for t in Temp_vec],p0=(-10,-10,10,1,20)) #esto ajusta muy bien +popt_rho22_raw, pcov_rho22_raw = curve_fit(InverseMicromotionSpectra_raw,Betas_vec[:10], [t*1e3 for t in Temp_vec[:10]],p0=(-10, -10, 1)) #esto ajusta muy bien + + +print(popt_rho22_raw) + +betaslong = np.arange(0,2*2.7,0.01) + +print(f'Min temp predicted: {InverseMicromotionSpectra_raw(betaslong,*popt_rho22_raw)[100]}') + +plt.figure() +plt.errorbar(Betas_vec[:10],[t*1e3 for t in Temp_vec[:10]],xerr=ErrorBetas_vec[:10], yerr=[t*1e3 for t in ErrorTemp_vec[:10]],fmt='o',capsize=5,markersize=5,color=paleta[3]) +#plt.plot(betaslong,expo(betaslong,*popt_exp),label='Ajuste exponencial') +#plt.plot(betaslong,cuadratica(betaslong,*popt_quad),label='Ajuste cuadratico') +#plt.plot(betaslong,InverseMicromotionSpectra(betaslong,*popt_rho22),label='Ajuste cuadratico') +plt.plot(betaslong,InverseMicromotionSpectra_raw(betaslong,*popt_rho22_raw),label='Ajuste cuadratico') + +#plt.axvline(minimum_voltage,linestyle='dashed',color='grey') +#plt.axhline(0.538) +plt.xlabel('Modulation factor') +plt.ylabel('Temperature (mK)') +plt.grid() + + +#%% +""" +Esto no es del super ajuste sino de los ajustes anteriores en donde DetDoppler y offset son puestos a mano +Aca grafico los betas con su error en funcion de la tension variada. +Ademas, hago ajuste lineal para primeros y ultimos puntos, ya que espero que +si la tension hace que la posicion del ion varie linealmente, el beta varia proporcional a dicha posicion. +""" + +import seaborn as sns + +def lineal(x,a,b): + return a*x+b + +paleta = sns.color_palette("rocket") + +betavector = [beta1,beta2,beta3,beta4,beta5,beta6,beta7,beta8,beta9] +errorbetavector = [errorbeta1,errorbeta2,errorbeta3,errorbeta4,errorbeta5,errorbeta6,errorbeta7,errorbeta8,errorbeta9] +voltages_dcA = Voltages[0][1:10] + +poptini,pcovini = curve_fit(lineal,voltages_dcA[0:3],betavector[0:3]) +poptfin,pcovfin = curve_fit(lineal,voltages_dcA[4:],betavector[4:]) + +minimum_voltage = -(poptini[1]-poptfin[1])/(poptini[0]-poptfin[0]) #voltaje donde se intersectan las rectas, es decir, donde deberia estar el minimo de micromocion +minimum_modulationfactor = lineal(minimum_voltage,*poptini) #es lo mismo si pongo *poptfin + +xini = np.linspace(-0.23,-0.13,100) +xfin = np.linspace(-0.15,0.005,100) + +plt.figure() +plt.errorbar(voltages_dcA,betavector,yerr=errorbetavector,fmt='o',capsize=5,markersize=5,color=paleta[1]) +plt.plot(xini,lineal(xini,*poptini)) +plt.plot(xfin,lineal(xfin,*poptfin)) +plt.axvline(minimum_voltage,linestyle='dashed',color='grey') +plt.xlabel('Endcap voltage (V)') +plt.ylabel('Modulation factor') +plt.grid() + + +#%% +""" +Aca veo la temperatura del ion en funcion del voltaje del endcap, ya que +al cambiar la cantidad de micromocion, cambia la calidad del enfriado +""" +tempvector = np.array([temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8,temp9])*1e3 +errortempvector = np.array([errortemp1,errortemp2,errortemp3,errortemp4,errortemp5,errortemp6,errortemp7,errortemp8,errortemp9])*1e3 + +voltages_dcA = Voltages[0][1:10] + +plt.figure() +plt.errorbar(voltages_dcA,tempvector,yerr=errortempvector,fmt='o',capsize=5,markersize=5,color=paleta[3]) +plt.axvline(minimum_voltage,linestyle='dashed',color='grey') +plt.xlabel('Endcap voltage (V)') +plt.ylabel('Temperature (mK)') +plt.grid() +plt.ylim(0,2) + + +#%% +""" +Por las dudas, temperatura en funcion de beta +""" +plt.figure() +plt.errorbar(betavector,tempvector,yerr=errortempvector,xerr=errorbetavector,fmt='o',capsize=5,markersize=5) +plt.xlabel('Modulation factor') +plt.ylabel('Temperature (mK)') +plt.grid() + + + +#%% +""" +Si quiero ver algun parametro del ajuste puntual. el orden es: 0:SG, 1:SP, 2:SCALE1, 3:OFFSET +""" +ki=2 +plt.errorbar(np.arange(0,9,1),[popt_1[ki],popt_2[ki],popt_3[ki],popt_4[ki],popt_5[ki],popt_6[ki],popt_7[ki],popt_8[ki],popt_9[ki]],yerr=[np.sqrt(pcov_1[ki,ki]),np.sqrt(pcov_2[ki,ki]),np.sqrt(pcov_3[ki,ki]),np.sqrt(pcov_4[ki,ki]),np.sqrt(pcov_5[ki,ki]),np.sqrt(pcov_6[ki,ki]),np.sqrt(pcov_7[ki,ki]),np.sqrt(pcov_8[ki,ki]),np.sqrt(pcov_9[ki,ki])], fmt='o',capsize=3,markersize=3) + + +#%% + +if False: + GUARDAR = {} + for var in [ kk for kk in globals().keys() if kk.startswith('pop') ]: + print(var) + GUARDAR[var] = globals()[var] + print('') + for var in [ kk for kk in globals().keys() if kk.startswith('pcov') ]: + print(var) + GUARDAR[var] = globals()[var] + + print('') + for var in [ kk for kk in globals().keys() if kk.startswith('Fitted') ]: + print(var) + GUARDAR[var] = globals()[var] + print('') + for var in [ kk for kk in globals().keys() if kk.endswith('_vec') ]: + print(var) + GUARDAR[var] = globals()[var] + + + np.savez('PARAMETROS.npz', **GUARDAR ) + + diff --git a/analisis/plots/20231123_CPTconmicromocion3/analisis_superajuste_PARAMETROS.npz b/analisis/plots/20231123_CPTconmicromocion3/analisis_superajuste_PARAMETROS.npz new file mode 100644 index 0000000000000000000000000000000000000000..94bcf635fc49e24b9a4442e4531c1743dc5eaae0 Binary files /dev/null and b/analisis/plots/20231123_CPTconmicromocion3/analisis_superajuste_PARAMETROS.npz differ diff --git a/analisis/plots/20231123_CPTconmicromocion3/lolo_CPT_plotter_20231123.py b/analisis/plots/20231123_CPTconmicromocion3/lolo_CPT_plotter_20231123.py index a8b1e6c58b120e68d29be492e136fcb2ab0ea3f1..abd34ed3bc070cb6bca36248bd1edcfa991c6df6 100644 --- a/analisis/plots/20231123_CPTconmicromocion3/lolo_CPT_plotter_20231123.py +++ b/analisis/plots/20231123_CPTconmicromocion3/lolo_CPT_plotter_20231123.py @@ -920,6 +920,9 @@ plt.grid() #%% """ AHORA INTENTO SUPER AJUSTES O SEA CON OFFSETXPI Y DETDOPPLER INCLUIDOS + +La 0 no ajusta bien incluso con todos los parametros libres +De la 1 a la 11 ajustan bien """ @@ -963,8 +966,8 @@ alpha = 0 drivefreq = 2*np.pi*22.135*1e6 -SelectedCurveVec = [1,2,3,4,5,6,7,8,9] -#SelectedCurveVec = [9] +SelectedCurveVec = [1,2,3,4,5,6,7,8,9,10,11] +#SelectedCurveVec = [10] if not 'popt_SA_vec' in globals().keys() or len(popt_SA_vec)==0: @@ -1152,9 +1155,42 @@ plt.grid() #%% +from scipy.special import jv + + def expo(x,tau,A,B): return A*np.exp(x/tau)+B +def cuadratica(x,a,c): + return a*(x**2)+c + +def InverseMicromotionSpectra(beta, A, det, x0, gamma, B): + ftrap=22.1 + #gamma=30 + P = ((jv(0, beta)**2)/((((det-x0)**2)+(0.5*gamma)**2)**2))*(-2*(det-x0)) + i = 1 + #print(P) + while i <= 5: + P = P + (-2*(det-x0))*((jv(i, beta))**2)/(((((det-x0)+i*ftrap)**2)+(0.5*gamma)**2)**2) + (-2*(det-x0))*(((jv(-i, beta))**2)/((((det-x0)-i*ftrap)**2)+(0.5*gamma)**2)**2) + i = i + 1 + #print(P) + #return 1/(A*P+B) + return 1/(A*P+B) + + +def InverseMicromotionSpectra_raw(beta, A, det, B): + ftrap=22.1 + gamma=21 + P = ((jv(0, beta)**2)/((((det)**2)+(0.5*gamma)**2)**2))*(-2*(det)) + i = 1 + #print(P) + while i <= 3: + P = P + (-2*(det))*((jv(i, beta))**2)/(((((det)+i*ftrap)**2)+(0.5*gamma)**2)**2) + (-2*(det))*(((jv(-i, beta))**2)/((((det)-i*ftrap)**2)+(0.5*gamma)**2)**2) + i = i + 1 + #print(P) + return A/P+B + + """ Temperatura vs """ @@ -1818,7 +1854,7 @@ if False: for var in [ kk for kk in globals().keys() if kk.startswith('pcov') ]: print(var) GUARDAR[var] = globals()[var] - + print('') for var in [ kk for kk in globals().keys() if kk.startswith('Fitted') ]: print(var) @@ -1827,8 +1863,6 @@ if False: for var in [ kk for kk in globals().keys() if kk.endswith('_vec') ]: print(var) GUARDAR[var] = globals()[var] - - - np.savez('PARAMETROS.npz', **GUARDAR ) - + + np.savez('PARAMETROS.npz', **GUARDAR ) diff --git a/analisis/plots/20231123_CPTconmicromocion3/lolo_analisis_superajuste.py b/analisis/plots/20231123_CPTconmicromocion3/lolo_analisis_superajuste.py new file mode 100644 index 0000000000000000000000000000000000000000..013b0bb203a2c56e90fbcdde053827fbb0b59bfb --- /dev/null +++ b/analisis/plots/20231123_CPTconmicromocion3/lolo_analisis_superajuste.py @@ -0,0 +1,707 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Ploteo de datos y ajustes +@author: lolo +""" + + +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 numba import jit,njit + +from time import time + +#%% Importaciones extra + +# /home/lolo/Dropbox/marce/LIAF/Trampa_anular/artiq_experiments/analisis/plots/20231123_CPTconmicromocion3/Data/EITfit/MM_eightLevel_2repumps_AnalysisFunctions.py + +from Data.EITfit.lolo_modelo_full_8niveles import PerformExperiment_8levels_MM + + +# PARAMETROS = np.load('PARAMETROS.npz',allow_pickle=True) +# for var_name in PARAMETROS.keys(): +# globals()[var_name] = PARAMETROS[var_name] +# print(f'loaded: {var_name}') + + +# Funciones auxiliares + +from scipy.stats.distributions import t,chi2 + +def estadistica(datos_x,datos_y,modelo,pcov,parametros,nombres=None,alpha=0.05): + + if nombres is None: + nombres = [ f'{j}' for j in range(len(parametros)) ] + + # Cantidad de parámetros + P = len(parametros) + + # Número de datos + N = len(datos_x) + + # Grados de libertas (Degrees Of Freedom) + dof = N-P-1 + + # Cauculamos coordenadas del modelo + # modelo_x = datos_x if modelo_x_arr is None else modelo_x_arr + # modelo_y = modelo( modelo_x, *parametros ) + + # Predicción del modelo para los datos_x medidos + prediccion_modelo = modelo( datos_x, *parametros ) + + # Calculos de cantidades estadísticas relevantes + COV = pcov # Matriz de Covarianza + SE = np.sqrt(np.diag( COV )) # Standar Error / Error estandar de los parámetros + residuos = datos_y - prediccion_modelo # diferencia enrte el modelo y los datos + + SSE = sum(( residuos )**2 ) # Resitual Sum of Squares + SST = sum(( datos_y - np.mean(datos_y))**2) # Total Sum of Squares + + # http://en.wikipedia.org/wiki/Coefficient_of_determination + # Expresa el porcentaje de la varianza que logra explicar el modelos propuesto + Rsq = 1 - SSE/SST # Coeficiente de determinación + Rsq_adj = 1-(1-Rsq) * (N-1)/(N-P-1) # Coeficiente de determinación Ajustado + + # https://en.wikipedia.org/wiki/Pearson_correlation_coefficient#In_least_squares_regression_analysis + # Expresa la correlación que hay entre los datos y la predicción del modelo + r_pearson = np.corrcoef( datos_y , prediccion_modelo )[0,1] + + # Reduced chi squared + # https://en.wikipedia.org/wiki/Reduced_chi-squared_statistic + chi2_ = sum( residuos**2 )/N + chi2_red = sum( residuos**2 )/(N-P) + + # Chi squared test + chi2_test = sum( residuos**2 / abs(prediccion_modelo) ) + # p-value del ajuste + p_val = chi2(dof).cdf( chi2_test ) + + + sT = t.ppf(1.0 - alpha/2.0, N - P ) # student T multiplier + CI = sT * SE # Confidence Interval + + print('R-squared ',Rsq) + print('R-sq_adjusted',Rsq_adj) + print('chi2 ',chi2_) + print('chi2_reduced ',chi2_red) + print('chi2_test ',chi2_test) + print('r-pearson ',r_pearson) + print('p-value ',p_val) + print('') + print('Error Estandard (SE):') + for i in range(P): + print(f'parametro[{nombres[i]:>5s}]: ' , parametros[i], ' ± ' , SE[i]) + print('') + print('Intervalo de confianza al '+str((1-alpha)*100)+'%:') + for i in range(P): + print(f'parametro[{nombres[i]:>5s}]: ' , parametros[i], ' ± ' , CI[i]) + + return dict(R2=Rsq,R2_adj=Rsq_adj,chi2=chi2_,chi2_red=chi2_red, + chi2_test=chi2_test,r=r_pearson,pvalue=p_val, + SE=SE,CI=CI) + + + + + + +#%% + +""" +Primero tengo mediciones de espectros cpt de un ion variando la tension dc_A +""" + +#C:\Users\Usuario\Documents\artiq\artiq_experiments\analisis\plots\20220106_CPT_DosLaseres_v08_TISA_DR\Data +# os.chdir('../20231123_CPTconmicromocion3/Data/') + +folder = '../20231123_CPTconmicromocion3/Data/' +CPT_FILES = f""" +{folder}/000016262-IR_Scan_withcal_optimized +{folder}/000016239-IR_Scan_withcal_optimized +{folder}/000016240-IR_Scan_withcal_optimized +{folder}/000016241-IR_Scan_withcal_optimized +{folder}/000016244-IR_Scan_withcal_optimized +{folder}/000016255-IR_Scan_withcal_optimized +{folder}/000016256-IR_Scan_withcal_optimized +{folder}/000016257-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(CPT_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 = [] +Voltages = [] + +for i, fname in enumerate(CPT_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']['IR1_Frequencies'])) + Counts.append(np.array(data['datasets']['data_array'])) + #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'])) + Voltages.append(np.array(data['datasets']['scanning_voltages'])) + +def Split(array,n): + length=len(array)/n + splitlist = [] + jj = 0 + while jj<length: + partial = [] + ii = 0 + while ii < n: + partial.append(array[jj*n+ii]) + ii = ii + 1 + splitlist.append(partial) + jj = jj + 1 + return splitlist + + +CountsSplit = [] +CountsSplit.append(Split(Counts[0],len(Freqs[0]))) + + +CountsSplit_2ions = [] +CountsSplit_2ions.append(Split(Counts[4],len(Freqs[4]))) + + +#%% Cargo parámetros fiteados de antes + + +PARAMETROS = np.load('analisis_superajuste_PARAMETROS.npz',allow_pickle=True) +for var_name in PARAMETROS.keys(): + globals()[var_name] = PARAMETROS[var_name] + print(f'loaded: {var_name}') + + +if False: + # Esto es para correr en caso de necesidad de limpiar todos los vectores de parametros + print('Limpio los vectores de parámetros') + for var in [ kk for kk in globals().keys() if kk.endswith('_vec') ]: + print(f'del {var}') + del(globals()[var]) + + +#%% Definiciones de Numba + +@jit +def FitEIT_MM_single_plot(Freqs, offset, DetDoppler, SG, SP, SCALE1, OFFSET, BETA1, TEMP): + #BETA = 1.8 + # SG = 0.6 + # SP = 8.1 + # TEMP = 0.2e-3 + + freqs = [2*f*1e-6-offset for f in Freqs] + + 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, Detunings + + + +@jit +def FitEIT_MM_single(Freqs, offset, DetDoppler, SG, SP, SCALE1, OFFSET, BETA1, TEMP): + "Esta verison de la función devuelve sólo el eje y, para usar de modelo en un ajuste" + return FitEIT_MM_single_plot(Freqs, offset, DetDoppler, SG, SP, SCALE1, OFFSET, BETA1, TEMP)[0] + + + +param_names = 'offset DetDoppler SG SP SCALE1 OFFSET BETA1 TEMP'.split() + +#%% +""" +AHORA INTENTO SUPER AJUSTES O SEA CON OFFSETXPI Y DETDOPPLER INCLUIDOS + +La 0 no ajusta bien incluso con todos los parametros libres +De la 1 a la 11 ajustan bien +""" + + +#from EITfit.MM_eightLevel_2repumps_AnalysisFunctions import PerformExperiment_8levels +from scipy.optimize import curve_fit + +""" +SUPER AJUSTE (SA) +""" + +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 = 13 + +#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 + + +SelectedCurveVec = [1,2,3,4,5,6,7,8,9,10,11] +#SelectedCurveVec = [10] + +CircPr = 1 +alpha = 0 + +t0 = time() + +if not 'popt_SA_vec' in globals().keys() or len(popt_SA_vec)==0: + + popt_SA_vec = [] + pcov_SA_vec = [] + Detuningsshort_vec = [] + Counts_vec = [] + Detuningslong_vec = [] + FittedCounts_vec = [] + + Betas_vec = [] + ErrorBetas_vec = [] + Temp_vec = [] + ErrorTemp_vec = [] + + DetuningsUV_vec = [] + ErrorDetuningsUV_vec = [] + + Estadistica_vec = [] + + for selectedcurve in SelectedCurveVec: + print(f"{round(time()-t0,1):6.1f}: Procesando la curva {selectedcurve}") + #selectedcurve = 2 #IMPORTANTE: SELECCIONA LA MEDICION + + FreqsDR = Freqs[0] + CountsDR = CountsSplit[0][selectedcurve] + + + if selectedcurve==1: + CountsDR[100]=0.5*(CountsDR[99]+CountsDR[101]) + CountsDR[105]=0.5*(CountsDR[104]+CountsDR[106]) + if selectedcurve==2: + CountsDR[67]=0.5*(CountsDR[66]+CountsDR[68]) + CountsDR[71]=0.5*(CountsDR[70]+CountsDR[72]) + if selectedcurve==6: + CountsDR[1]=0.5*(CountsDR[0]+CountsDR[2]) + CountsDR[76]=0.5*(CountsDR[75]+CountsDR[77]) + if selectedcurve==7: + CountsDR[117]=0.5*(CountsDR[116]+CountsDR[118]) + + freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + + + if True: + popt_3_SA, pcov_3_SA = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[430, -25, 0.9, 6.2, 3e4, 1.34e3, 2, (np.pi**2)*1e-3], bounds=((0, -50, 0, 0, 0, 0, 0, 0), (1000, 0, 2, 20, 5e4, 5e4, 10, (np.pi**2)*10e-3))) + + popt_SA_vec.append(popt_3_SA) + pcov_SA_vec.append(pcov_3_SA) + + FittedEITpi_3_SA_short, Detunings_3_SA_short = FitEIT_MM_single_plot(FreqsDR, *popt_3_SA) + freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + FittedEITpi_3_SA_long, Detunings_3_SA_long = FitEIT_MM_single_plot(freqslong, *popt_3_SA) + + + # estadistica(datos_x,datos_y,modelo,pcov,parametros,nombres=None,alpha=0.05) + est_tmp = estadistica(FreqsDR,CountsDR,FitEIT_MM_single,pcov_3_SA,popt_3_SA, + nombres=param_names,alpha=0.05) + Estadistica_vec.append(est_tmp) + + DetuningsUV_vec.append(popt_3_SA[1]) + ErrorDetuningsUV_vec.append(np.sqrt(pcov_3_SA[1,1])) + + Betas_vec.append(popt_3_SA[6]) + ErrorBetas_vec.append(np.sqrt(pcov_3_SA[6,6])) + Temp_vec.append(popt_3_SA[7]) + ErrorTemp_vec.append(np.sqrt(pcov_3_SA[7,7])) + + Detuningsshort_vec.append(Detunings_3_SA_short) + Counts_vec.append(CountsDR) + Detuningslong_vec.append(Detunings_3_SA_long) + FittedCounts_vec.append(FittedEITpi_3_SA_long) + + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +#%% Graficamos todos los fiteos + +# tmp_datos=(Detuningsshort_vec,Counts_vec,Detuningslong_vec,FittedCounts_vec,SelectedCurveVec) + +# for Detunings_3_SA_short,CountsDR,Detunings_3_SA_long,FittedEITpi_3_SA_long,selectedcurve in zip(*tmp_datos): +# plt.figure() +# plt.errorbar(Detunings_3_SA_short, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', color='darkgreen', alpha=0.5, capsize=2, markersize=2) +# plt.plot(Detunings_3_SA_long, FittedEITpi_3_SA_long, color='darkolivegreen', linewidth=3, label=f'med {selectedcurve}') +# #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() + +# print(f'listo med {selectedcurve}') +# print(popt_3_SA) + + +fig, axx = plt.subplots( 3,4, figsize=(13,8) , constrained_layout=True, sharex=True , sharey=True ) +fig.set_constrained_layout_pads(w_pad=2/72, h_pad=2/72, hspace=0, wspace=0) + +tmp_datos=(Detuningsshort_vec,Counts_vec,Detuningslong_vec,FittedCounts_vec,SelectedCurveVec,axx.flatten()) + +for Detunings_3_SA_short,CountsDR,Detunings_3_SA_long,FittedEITpi_3_SA_long,selectedcurve,ax in zip(*tmp_datos): + ax.errorbar(Detunings_3_SA_short, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', color='darkgreen', alpha=0.3, capsize=2, markersize=2) + ax.plot(Detunings_3_SA_long, FittedEITpi_3_SA_long, color='black', linewidth=2, label=f'med {selectedcurve}', alpha=0.7) + #plt.title(f'Sdop: {round(popt[0], 2)}, Spr: {round(popt[1], 2)}, T: {round(popt[2]*1e3, 2)} mK, detDop: {DetDoppler} MHz') + # ax.set_xlabel('Detuning (MHz)') + # ax.set_ylabel('Counts') + ax.legend(loc='upper left', fontsize=12) + ax.grid(True, ls=":") + + print(f'listo med {selectedcurve}') + print(popt_3_SA) + + +for ax in axx[:,0]: + ax.set_ylabel('Counts') + +for ax in axx[-1,:]: + ax.set_xlabel('Detuning (MHz)') + + + + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +#%% Inspección de parámetros + +param_names = 'offset DetDoppler SG SP SCALE1 OFFSET BETA1 TEMP'.split() + +err_vecs = np.array([ np.sqrt(np.diag(el)) for el in pcov_SA_vec ]) +num_med = np.arange(len(pcov_SA_vec)) +1 + +r2_values = np.array([ el['R2_adj'] for el in Estadistica_vec ]) + + +fig, axx = plt.subplots( len(popt_SA_vec[0])+1,1, figsize=(13,8) , constrained_layout=True, sharex=True , sharey=False ) +fig.set_constrained_layout_pads(w_pad=2/72, h_pad=2/72, hspace=0, wspace=0) + +for ax,param_vec,err_vec,par_name in zip(axx,popt_SA_vec.T,err_vecs.T,param_names) : + ax.plot(num_med, param_vec, '.-') + ax.errorbar( num_med, param_vec, yerr=err_vec, + fmt='s', mfc='none', elinewidth = 1, capsize=3, ms=1) + + ax.grid(True, ls=":", color='lightgray') + ax.set_ylabel(par_name) + + +ax=axx[-1] +ax.plot( num_med , r2_values, '.-') +ax.set_ylabel(r'$R^2$') +ax.grid(True, ls=":", color='lightgray') + + + +fig.align_ylabels() +ax.set_xticks(num_med) +ax.set_xlabel('Num. de medición') + + +#%% +""" +Grafico distintas variables que salieron del SUper ajuste +""" + +import seaborn as sns +paleta = sns.color_palette("rocket") + +voltages_dcA = Voltages[0][1:10] + +def lineal(x,a,b): + return a*x+b + +def hiperbola(x,a,b,c,x0): + return a*np.sqrt(((x-x0)**2+c**2))+b + +hiperbola_or_linear = True + +if hiperbola_or_linear: + popthip,pcovhip = curve_fit(hiperbola,voltages_dcA,Betas_vec,p0=(100,0.1,1,-0.15)) + + xhip = np.linspace(-0.23,0.005,200) + + plt.figure() + plt.errorbar(voltages_dcA,Betas_vec,yerr=ErrorBetas_vec,fmt='o',capsize=5,markersize=5,color=paleta[1]) + plt.plot(xhip,hiperbola(xhip,*popthip)) + plt.xlabel('Endcap voltage (V)') + plt.ylabel('Modulation factor') + plt.grid() + +else: + poptini,pcovini = curve_fit(lineal,voltages_dcA[0:3],Betas_vec[0:3]) + poptfin,pcovfin = curve_fit(lineal,voltages_dcA[4:],Betas_vec[4:]) + + minimum_voltage = -(poptini[1]-poptfin[1])/(poptini[0]-poptfin[0]) #voltaje donde se intersectan las rectas, es decir, donde deberia estar el minimo de micromocion + minimum_modulationfactor = lineal(minimum_voltage,*poptini) #es lo mismo si pongo *poptfin + + xini = np.linspace(-0.23,-0.13,100) + xfin = np.linspace(-0.15,0.005,100) + + plt.figure() + plt.errorbar(voltages_dcA,Betas_vec,yerr=ErrorBetas_vec,fmt='o',capsize=5,markersize=5,color=paleta[1]) + plt.plot(xini,lineal(xini,*poptini)) + plt.plot(xfin,lineal(xfin,*poptfin)) + plt.axvline(minimum_voltage,linestyle='dashed',color='grey') + plt.xlabel('Endcap voltage (V)') + plt.ylabel('Modulation factor') + plt.grid() + + +print([t*1e3 for t in Temp_vec]) + +plt.figure() +plt.errorbar(voltages_dcA,[t*1e3 for t in Temp_vec],yerr=[t*1e3 for t in ErrorTemp_vec],fmt='o',capsize=5,markersize=5,color=paleta[3]) +# plt.axvline(minimum_voltage,linestyle='dashed',color='grey') +print(f'\n\nTE FALTA DEFINIR LA VARIABLE minimum_voltage\n\n') +plt.axhline(0.538) +plt.xlabel('Endcap voltage (V)') +plt.ylabel('Temperature (mK)') +plt.grid() +#plt.ylim(0,2) + +#%% +""" +Ahora hago un ajuste con una hiperbola porque tiene mas sentido, por el hecho +de que en el punto optimo el ion no esta en el centro de la trampa +sino que esta a una distancia d +""" +def hiperbola(x,a,b,c,x0): + return a*np.sqrt(((x-x0)**2+c**2))+b + +popthip,pcovhip = curve_fit(hiperbola,voltages_dcA,Betas_vec,p0=(100,0.1,1,-0.15)) + +xhip = np.linspace(-0.23,0.005,200) + +plt.figure() +plt.errorbar(voltages_dcA,Betas_vec,yerr=ErrorBetas_vec,fmt='o',capsize=5,markersize=5,color=paleta[1]) +plt.plot(xhip,hiperbola(xhip,*popthip)) +plt.xlabel('Endcap voltage (V)') +plt.ylabel('Modulation factor') +plt.grid() + + + + +#%% +from scipy.special import jv + + +def expo(x,tau,A,B): + return A*np.exp(x/tau)+B + +def cuadratica(x,a,c): + return a*(x**2)+c + +def InverseMicromotionSpectra(beta, A, det, x0, gamma, B): + ftrap=22.1 + #gamma=30 + P = ((jv(0, beta)**2)/((((det-x0)**2)+(0.5*gamma)**2)**2))*(-2*(det-x0)) + i = 1 + #print(P) + while i <= 5: + P = P + (-2*(det-x0))*((jv(i, beta))**2)/(((((det-x0)+i*ftrap)**2)+(0.5*gamma)**2)**2) + (-2*(det-x0))*(((jv(-i, beta))**2)/((((det-x0)-i*ftrap)**2)+(0.5*gamma)**2)**2) + i = i + 1 + #print(P) + #return 1/(A*P+B) + return 1/(A*P+B) + + +def InverseMicromotionSpectra_raw(beta, A, det, B): + ftrap=22.1 + gamma=21 + P = ((jv(0, beta)**2)/((((det)**2)+(0.5*gamma)**2)**2))*(-2*(det)) + i = 1 + #print(P) + while i <= 3: + P = P + (-2*(det))*((jv(i, beta))**2)/(((((det)+i*ftrap)**2)+(0.5*gamma)**2)**2) + (-2*(det))*(((jv(-i, beta))**2)/((((det)-i*ftrap)**2)+(0.5*gamma)**2)**2) + i = i + 1 + #print(P) + return A/P+B + + +""" +Temperatura vs beta con un ajuste exponencial +""" + +popt_exp, pcov_exp = curve_fit(expo,Betas_vec[:10],[t*1e3 for t in Temp_vec[:10]]) +popt_quad, pcov_quad = curve_fit(cuadratica,Betas_vec[:10],[t*1e3 for t in Temp_vec[:10]],p0=(1,10)) +#popt_rho22, pcov_rho22 = curve_fit(InverseMicromotionSpectra,Betas_vec,[t*1e3 for t in Temp_vec],p0=(10,10,-10,1,20)) #esto ajusta muy bien +#popt_rho22, pcov_rho22 = curve_fit(InverseMicromotionSpectra,Betas_vec, [t*1e3 for t in Temp_vec],p0=(-10,-10,10,1,20)) #esto ajusta muy bien +popt_rho22_raw, pcov_rho22_raw = curve_fit(InverseMicromotionSpectra_raw,Betas_vec[:10], [t*1e3 for t in Temp_vec[:10]],p0=(-10, -10, 1)) #esto ajusta muy bien + + +print(popt_rho22_raw) + +betaslong = np.arange(0,2*2.7,0.01) + +print(f'Min temp predicted: {InverseMicromotionSpectra_raw(betaslong,*popt_rho22_raw)[100]}') + +plt.figure() +plt.errorbar(Betas_vec[:10],[t*1e3 for t in Temp_vec[:10]],xerr=ErrorBetas_vec[:10], yerr=[t*1e3 for t in ErrorTemp_vec[:10]],fmt='o',capsize=5,markersize=5,color=paleta[3]) +#plt.plot(betaslong,expo(betaslong,*popt_exp),label='Ajuste exponencial') +#plt.plot(betaslong,cuadratica(betaslong,*popt_quad),label='Ajuste cuadratico') +#plt.plot(betaslong,InverseMicromotionSpectra(betaslong,*popt_rho22),label='Ajuste cuadratico') +plt.plot(betaslong,InverseMicromotionSpectra_raw(betaslong,*popt_rho22_raw),label='Ajuste cuadratico') + +#plt.axvline(minimum_voltage,linestyle='dashed',color='grey') +#plt.axhline(0.538) +plt.xlabel('Modulation factor') +plt.ylabel('Temperature (mK)') +plt.grid() + + +#%% +""" +Esto no es del super ajuste sino de los ajustes anteriores en donde DetDoppler y offset son puestos a mano +Aca grafico los betas con su error en funcion de la tension variada. +Ademas, hago ajuste lineal para primeros y ultimos puntos, ya que espero que +si la tension hace que la posicion del ion varie linealmente, el beta varia proporcional a dicha posicion. +""" + +import seaborn as sns + +def lineal(x,a,b): + return a*x+b + +paleta = sns.color_palette("rocket") + +betavector = [beta1,beta2,beta3,beta4,beta5,beta6,beta7,beta8,beta9] +errorbetavector = [errorbeta1,errorbeta2,errorbeta3,errorbeta4,errorbeta5,errorbeta6,errorbeta7,errorbeta8,errorbeta9] +voltages_dcA = Voltages[0][1:10] + +poptini,pcovini = curve_fit(lineal,voltages_dcA[0:3],betavector[0:3]) +poptfin,pcovfin = curve_fit(lineal,voltages_dcA[4:],betavector[4:]) + +minimum_voltage = -(poptini[1]-poptfin[1])/(poptini[0]-poptfin[0]) #voltaje donde se intersectan las rectas, es decir, donde deberia estar el minimo de micromocion +minimum_modulationfactor = lineal(minimum_voltage,*poptini) #es lo mismo si pongo *poptfin + +xini = np.linspace(-0.23,-0.13,100) +xfin = np.linspace(-0.15,0.005,100) + +plt.figure() +plt.errorbar(voltages_dcA,betavector,yerr=errorbetavector,fmt='o',capsize=5,markersize=5,color=paleta[1]) +plt.plot(xini,lineal(xini,*poptini)) +plt.plot(xfin,lineal(xfin,*poptfin)) +plt.axvline(minimum_voltage,linestyle='dashed',color='grey') +plt.xlabel('Endcap voltage (V)') +plt.ylabel('Modulation factor') +plt.grid() + + +#%% +""" +Aca veo la temperatura del ion en funcion del voltaje del endcap, ya que +al cambiar la cantidad de micromocion, cambia la calidad del enfriado +""" +tempvector = np.array([temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8,temp9])*1e3 +errortempvector = np.array([errortemp1,errortemp2,errortemp3,errortemp4,errortemp5,errortemp6,errortemp7,errortemp8,errortemp9])*1e3 + +voltages_dcA = Voltages[0][1:10] + +plt.figure() +plt.errorbar(voltages_dcA,tempvector,yerr=errortempvector,fmt='o',capsize=5,markersize=5,color=paleta[3]) +plt.axvline(minimum_voltage,linestyle='dashed',color='grey') +plt.xlabel('Endcap voltage (V)') +plt.ylabel('Temperature (mK)') +plt.grid() +plt.ylim(0,2) + + +#%% +""" +Por las dudas, temperatura en funcion de beta +""" +plt.figure() +plt.errorbar(betavector,tempvector,yerr=errortempvector,xerr=errorbetavector,fmt='o',capsize=5,markersize=5) +plt.xlabel('Modulation factor') +plt.ylabel('Temperature (mK)') +plt.grid() + + + +#%% +""" +Si quiero ver algun parametro del ajuste puntual. el orden es: 0:SG, 1:SP, 2:SCALE1, 3:OFFSET +""" +ki=2 +plt.errorbar(np.arange(0,9,1),[popt_1[ki],popt_2[ki],popt_3[ki],popt_4[ki],popt_5[ki],popt_6[ki],popt_7[ki],popt_8[ki],popt_9[ki]],yerr=[np.sqrt(pcov_1[ki,ki]),np.sqrt(pcov_2[ki,ki]),np.sqrt(pcov_3[ki,ki]),np.sqrt(pcov_4[ki,ki]),np.sqrt(pcov_5[ki,ki]),np.sqrt(pcov_6[ki,ki]),np.sqrt(pcov_7[ki,ki]),np.sqrt(pcov_8[ki,ki]),np.sqrt(pcov_9[ki,ki])], fmt='o',capsize=3,markersize=3) + + +#%% + +if False: + GUARDAR = {} + # for var in [ kk for kk in globals().keys() if kk.startswith('pop') ]: + # print(var) + # GUARDAR[var] = globals()[var] + # print('') + # for var in [ kk for kk in globals().keys() if kk.startswith('pcov') ]: + # print(var) + # GUARDAR[var] = globals()[var] + + # print('') + # for var in [ kk for kk in globals().keys() if kk.startswith('Fitted') ]: + # print(var) + # GUARDAR[var] = globals()[var] + # print('') + for var in [ kk for kk in globals().keys() if kk.endswith('_vec') ]: + print(var) + GUARDAR[var] = globals()[var] + + + np.savez('analisis_superajuste_PARAMETROS.npz', **GUARDAR ) diff --git a/analisis/plots/20231218_CPT_muri/CPT_plotter_20231123.py b/analisis/plots/20231218_CPT_muri/CPT_plotter_20231123.py new file mode 100644 index 0000000000000000000000000000000000000000..82775ed204dd3a5ab8233c51f5b2f8ad53b1df8f --- /dev/null +++ b/analisis/plots/20231218_CPT_muri/CPT_plotter_20231123.py @@ -0,0 +1,1788 @@ +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 + +""" +Primero tengo mediciones de espectros cpt de un ion variando la tension dc_A +""" + +#C:\Users\Usuario\Documents\artiq\artiq_experiments\analisis\plots\20220106_CPT_DosLaseres_v08_TISA_DR\Data + +os.chdir('/home/nico/Documents/artiq_experiments/analisis/plots/20231123_CPTconmicromocion3/Data/') + +CPT_FILES = """000016262-IR_Scan_withcal_optimized +000016239-IR_Scan_withcal_optimized +000016240-IR_Scan_withcal_optimized +000016241-IR_Scan_withcal_optimized +000016244-IR_Scan_withcal_optimized +000016255-IR_Scan_withcal_optimized +000016256-IR_Scan_withcal_optimized +000016257-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(CPT_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 = [] +Voltages = [] + +for i, fname in enumerate(CPT_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']['IR1_Frequencies'])) + Counts.append(np.array(data['datasets']['data_array'])) + #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'])) + Voltages.append(np.array(data['datasets']['scanning_voltages'])) + +def Split(array,n): + length=len(array)/n + splitlist = [] + jj = 0 + while jj<length: + partial = [] + ii = 0 + while ii < n: + partial.append(array[jj*n+ii]) + ii = ii + 1 + splitlist.append(partial) + jj = jj + 1 + return splitlist + + +CountsSplit = [] +CountsSplit.append(Split(Counts[0],len(Freqs[0]))) + + +CountsSplit_2ions = [] +CountsSplit_2ions.append(Split(Counts[4],len(Freqs[4]))) + +#%% + +""" +Ploteo la cpt de referencia / plotting the reference CPT +""" + +jvec = [4] # de la 1 a la 9 vale la pena, despues no + +drs = [390.5, 399.5, 406, 413.5] + +drive=22.1 + +Frequencies = Freqs[0] + +plt.figure() +i = 0 +for j in jvec: + plt.errorbar([2*f*1e-6 for f in Frequencies], CountsSplit[0][j], yerr=np.sqrt(CountsSplit[0][j]), fmt='o', capsize=2, markersize=2) + i = i + 1 +plt.xlabel('Frecuencia (MHz)') +plt.ylabel('counts') +plt.grid() +#for dr in drs: +# plt.axvline(dr) + #plt.axvline(dr+drive) +plt.legend() + + + +#%% +#from EITfit.MM_eightLevel_2repumps_AnalysisFunctions import PerformExperiment_8levels +from scipy.optimize import curve_fit +import time + +""" +MEDICION 1 +""" + +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 = 13 + +offsetxpi = 419+correccion+3*0.8 +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 + + +selectedcurve = 1 + +FreqsDR = [2*f*1e-6-offsetxpi for f in Freqs[0]] +CountsDR = CountsSplit[0][selectedcurve] +CountsDR[100]=0.5*(CountsDR[99]+CountsDR[101]) +CountsDR[105]=0.5*(CountsDR[104]+CountsDR[106]) + +freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + +CircPr = 1 +alpha = 0 + + +def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): +#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 + +do_fit = False +if do_fit: + popt_1, pcov_1 = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[0.9, 6.2, 3e4, 1.34e3, 2, 1e-3], bounds=((0, 0, 0, 0, 0, 0), (2, 20, 5e4, 5e4, 10, 10e-3))) + FittedEITpi_1 = FitEIT_MM_single(freqslong, *popt_1) + +beta1 = popt_1[4] +errorbeta1 = np.sqrt(pcov_1[4,4]) +temp1 = popt_1[5] +errortemp1 = np.sqrt(pcov_1[5,5]) + +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_1, color='darkolivegreen', linewidth=3, label='med 1') +#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 + +""" +MEDICION 2 +""" + +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 = 13 + +offsetxpi = 419+correccion+1.6 +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 + + + +selectedcurve = 2 + +FreqsDR = [2*f*1e-6-offsetxpi for f in Freqs[0]] +CountsDR = CountsSplit[0][selectedcurve] + +freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + +CircPr = 1 +alpha = 0 + + +def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): +#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 + +do_fit = False +if do_fit: + popt_2, pcov_2 = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[0.9, 6.2, 3e4, 1.34e3, 2, 1e-3], bounds=((0, 0, 0, 0, 0, 0), (2, 20, 5e4, 5e4, 10, 10e-3))) + FittedEITpi_2 = FitEIT_MM_single(freqslong, *popt_2) + +beta2 = popt_2[4] +errorbeta2 = np.sqrt(pcov_2[4,4]) +temp2 = popt_2[5] +errortemp2 = np.sqrt(pcov_2[5,5]) + +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_2, color='darkolivegreen', linewidth=3, label='med 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 + +""" +MEDICION 3 +""" + +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 = 13 + +offsetxpi = 419+correccion+0.8 +DetDoppler = -11.5-correccion + +print(offsetxpi,DetDoppler) + +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +alpha = 0 + + +drivefreq = 2*np.pi*22.135*1e6 + + +selectedcurve = 3 + +FreqsDR = [2*f*1e-6-offsetxpi for f in Freqs[0]] +CountsDR = CountsSplit[0][selectedcurve] + +freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + +CircPr = 1 +alpha = 0 + + +def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): +#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 + +do_fit = True +if do_fit: + popt_3, pcov_3 = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[0.9, 6.2, 3e4, 1.34e3, 2, 1e-3], bounds=((0, 0, 0, 0, 0, 0), (2, 20, 5e4, 5e4, 10, 10e-3))) + FittedEITpi_3 = FitEIT_MM_single(freqslong, *popt_3) + +beta3 = popt_3[4] +errorbeta3 = np.sqrt(pcov_3[4,4]) +temp3 = popt_3[5] +errortemp3 = np.sqrt(pcov_3[5,5]) + +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_3, color='darkolivegreen', linewidth=3, label='med 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.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 + +""" +MEDICION 4 +""" + +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 = 13 + +offsetxpi = 419+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 + + +selectedcurve = 4 + +FreqsDR = [2*f*1e-6-offsetxpi for f in Freqs[0]] +CountsDR = CountsSplit[0][selectedcurve] + +freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + +CircPr = 1 +alpha = 0 + + +def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): +#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 + +do_fit = False +if do_fit: + popt_4, pcov_4 = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[0.9, 6.2, 3e4, 1.34e3, 2, 1e-3], bounds=((0, 0, 0, 0, 0, 0), (2, 20, 5e4, 5e4, 10, 10e-3))) + FittedEITpi_4 = FitEIT_MM_single(freqslong, *popt_4) + +beta4 = popt_4[4] +errorbeta4 = np.sqrt(pcov_4[4,4]) +temp4 = popt_4[5] +errortemp4 = np.sqrt(pcov_4[5,5]) + + +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_4, color='darkolivegreen', linewidth=3, label='med 4') +#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 + +""" +MEDICION 5 +""" + +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 = 13 + +offsetxpi = 419+correccion-1 +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 + + +selectedcurve = 5 + +FreqsDR = [2*f*1e-6-offsetxpi for f in Freqs[0]] +CountsDR = CountsSplit[0][selectedcurve] + +freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + +CircPr = 1 +alpha = 0 + + +def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): +#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 + +do_fit = False +if do_fit: + popt_5, pcov_5 = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[0.9, 6.2, 3e4, 1.34e3, 2, 1e-3], bounds=((0, 0, 0, 0, 0, 0), (2, 20, 5e4, 5e4, 10, 10e-3))) + FittedEITpi_5 = FitEIT_MM_single(freqslong, *popt_5) + +beta5 = popt_5[4] +errorbeta5 = np.sqrt(pcov_5[4,4]) +temp5 = popt_5[5] +errortemp5 = np.sqrt(pcov_5[5,5]) + +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_5, color='darkolivegreen', linewidth=3, label='med 5') +#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 + +""" +MEDICION 6 +""" + +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 = 13 + +offsetxpi = 419+correccion-2.2 +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 + + +selectedcurve = 6 + +FreqsDR = [2*f*1e-6-offsetxpi for f in Freqs[0]] +CountsDR = CountsSplit[0][selectedcurve] +CountsDR[76]=0.5*(CountsDR[75]+CountsDR[77]) +CountsDR[1]=0.5*(CountsDR[0]+CountsDR[2]) + +freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + +CircPr = 1 +alpha = 0 + + +def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): +#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 + +do_fit = True +if do_fit: + popt_6, pcov_6 = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[0.9, 6.2, 5e4, 1e3, 2, 1e-3], bounds=((0, 0, 0, 0, 0, 0), (2, 20, 5e4, 5e4, 10, 10e-3))) + FittedEITpi_6 = FitEIT_MM_single(freqslong, *popt_6) + +beta6 = popt_6[4] +errorbeta6 = np.sqrt(pcov_6[4,4]) +temp6 = popt_6[5] +errortemp6 = np.sqrt(pcov_6[5,5]) + +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_6, color='darkolivegreen', linewidth=3, label='med 6') +#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 + +""" +MEDICION 7 +""" + +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 = 13 + +offsetxpi = 419+correccion-3.7 +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 + + +selectedcurve = 7 + +FreqsDR = [2*f*1e-6-offsetxpi for f in Freqs[0]] +CountsDR = CountsSplit[0][selectedcurve] + +freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + +CircPr = 1 +alpha = 0 + + +def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): +#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 + +do_fit = False +if do_fit: + popt_7, pcov_7 = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[0.9, 6.2, 3e4, 1.34e3, 2, 1e-3], bounds=((0, 0, 0, 0, 0, 0), (2, 20, 5e4, 5e4, 10, 10e-3))) + FittedEITpi_7 = FitEIT_MM_single(freqslong, *popt_7) + +beta7 = popt_7[4] +errorbeta7 = np.sqrt(pcov_7[4,4]) +temp7 = popt_7[5] +errortemp7 = np.sqrt(pcov_7[5,5]) + +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_7, color='darkolivegreen', linewidth=3, label='med 7') +#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 + +""" +MEDICION 8 +""" + +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 = 13 + +offsetxpi = 419+correccion-4.9 +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 + + +selectedcurve = 8 + +FreqsDR = [2*f*1e-6-offsetxpi for f in Freqs[0]] +CountsDR = CountsSplit[0][selectedcurve] + +freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + +CircPr = 1 +alpha = 0 + + +def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): +#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 + +do_fit = False +if do_fit: + popt_8, pcov_8 = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[0.9, 6.2, 3e4, 1.34e3, 2, 1e-3], bounds=((0, 0, 0, 0, 0, 0), (2, 20, 5e4, 5e4, 10, 10e-3))) + FittedEITpi_8 = FitEIT_MM_single(freqslong, *popt_8) + +beta8 = popt_8[4] +errorbeta8 = np.sqrt(pcov_8[4,4]) +temp8 = popt_8[5] +errortemp8 = np.sqrt(pcov_8[5,5]) + +print() + +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_8, color='darkolivegreen', linewidth=3, label='med 8') +#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 + +""" +MEDICION 9 +""" + +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 = 16 + +offsetxpi = 419+correccion-6 +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 + + +selectedcurve = 9 + +FreqsDR = [2*f*1e-6-offsetxpi for f in Freqs[0]] +CountsDR = CountsSplit[0][selectedcurve] + +freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + +CircPr = 1 +alpha = 0 + + +def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): +#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 + +do_fit = True +if do_fit: + popt_9, pcov_9 = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[0.9, 6.2, 3e4, 1.34e3, 2, 1e-3], bounds=((0, 0, 0, 0, 0, 0), (2, 20, 5e4, 5e4, 10,10e-3))) + + FittedEITpi_9 = FitEIT_MM_single(freqslong, *popt_9) + +beta9 = popt_9[4] +errorbeta9 = np.sqrt(pcov_9[4,4]) +temp9 = popt_9[5] +errortemp9 = np.sqrt(pcov_9[5,5]) + + +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_9, color='darkolivegreen', linewidth=3, label='med 9') +#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() + + +#%% +""" +AHORA INTENTO SUPER AJUSTES O SEA CON OFFSETXPI Y DETDOPPLER INCLUIDOS +""" + + +#from EITfit.MM_eightLevel_2repumps_AnalysisFunctions import PerformExperiment_8levels +from scipy.optimize import curve_fit +import time + +""" +SUPER AJUSTE (SA) +""" + +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 = 13 + +#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 + + +SelectedCurveVec = [1,2,3,4,5,6,7,8,9] +#SelectedCurveVec = [9] + +popt_SA_vec = [] +pcov_SA_vec = [] +Detuningsshort_vec = [] +Counts_vec = [] +Detuningslong_vec = [] +FittedCounts_vec = [] + +Betas_vec = [] +ErrorBetas_vec = [] +Temp_vec = [] +ErrorTemp_vec = [] + +DetuningsUV_vec = [] +ErrorDetuningsUV_vec = [] + +for selectedcurve in SelectedCurveVec: + +#selectedcurve = 2 #IMPORTANTE: SELECCIONA LA MEDICION + + FreqsDR = Freqs[0] + CountsDR = CountsSplit[0][selectedcurve] + + + if selectedcurve==1: + CountsDR[100]=0.5*(CountsDR[99]+CountsDR[101]) + CountsDR[105]=0.5*(CountsDR[104]+CountsDR[106]) + if selectedcurve==2: + CountsDR[67]=0.5*(CountsDR[66]+CountsDR[68]) + CountsDR[71]=0.5*(CountsDR[70]+CountsDR[72]) + if selectedcurve==6: + CountsDR[1]=0.5*(CountsDR[0]+CountsDR[2]) + CountsDR[76]=0.5*(CountsDR[75]+CountsDR[77]) + if selectedcurve==7: + CountsDR[117]=0.5*(CountsDR[116]+CountsDR[118]) + + freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + CircPr = 1 + alpha = 0 + + + def FitEIT_MM_single(Freqs, offset, DetDoppler, SG, SP, SCALE1, OFFSET, BETA1, TEMP, plot=False): + #def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1): + #BETA = 1.8 + # SG = 0.6 + # SP = 8.1 + # TEMP = 0.2e-3 + + freqs = [2*f*1e-6-offset for f in Freqs] + + 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]) + if plot: + return ScaledFluo1, Detunings + else: + return ScaledFluo1 + #return ScaledFluo1 + + do_fit = True + if do_fit: + popt_3_SA, pcov_3_SA = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[430, -25, 0.9, 6.2, 3e4, 1.34e3, 2, (np.pi**2)*1e-3], bounds=((0, -50, 0, 0, 0, 0, 0, 0), (1000, 0, 2, 20, 5e4, 5e4, 10, (np.pi**2)*10e-3))) + + popt_SA_vec.append(popt_3_SA) + pcov_SA_vec.append(pcov_3_SA) + + FittedEITpi_3_SA_short, Detunings_3_SA_short = FitEIT_MM_single(FreqsDR, *popt_3_SA, plot=True) + freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + FittedEITpi_3_SA_long, Detunings_3_SA_long = FitEIT_MM_single(freqslong, *popt_3_SA, plot=True) + + DetuningsUV_vec.append(popt_3_SA[1]) + ErrorDetuningsUV_vec.append(np.sqrt(pcov_3_SA[1,1])) + + Betas_vec.append(popt_3_SA[6]) + ErrorBetas_vec.append(np.sqrt(pcov_3_SA[6,6])) + Temp_vec.append(popt_3_SA[7]) + ErrorTemp_vec.append(np.sqrt(pcov_3_SA[7,7])) + + Detuningsshort_vec.append(Detunings_3_SA_short) + Counts_vec.append(CountsDR) + Detuningslong_vec.append(Detunings_3_SA_long) + FittedCounts_vec.append(FittedEITpi_3_SA_long) + + + plt.figure() + plt.errorbar(Detunings_3_SA_short, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', color='darkgreen', alpha=0.5, capsize=2, markersize=2) + plt.plot(Detunings_3_SA_long, FittedEITpi_3_SA_long, color='darkolivegreen', linewidth=3, label=f'med {selectedcurve}') + #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() + + print(f'listo med {selectedcurve}') + print(popt_3_SA) + + +#%% +""" +Grafico distintas variables que salieron del SUper ajuste +""" + +import seaborn as sns +paleta = sns.color_palette("rocket") + +voltages_dcA = Voltages[0][1:10] + +def lineal(x,a,b): + return a*x+b + +def hiperbola(x,a,b,c,x0): + return a*np.sqrt(((x-x0)**2+c**2))+b + +hiperbola_or_linear = True + +if hiperbola_or_linear: + popthip,pcovhip = curve_fit(hiperbola,voltages_dcA,Betas_vec,p0=(100,0.1,1,-0.15)) + + xhip = np.linspace(-0.23,0.005,200) + + plt.figure() + plt.errorbar(voltages_dcA,Betas_vec,yerr=ErrorBetas_vec,fmt='o',capsize=5,markersize=5,color=paleta[1]) + plt.plot(xhip,hiperbola(xhip,*popthip)) + plt.xlabel('Endcap voltage (V)') + plt.ylabel('Modulation factor') + plt.grid() + +else: + poptini,pcovini = curve_fit(lineal,voltages_dcA[0:3],Betas_vec[0:3]) + poptfin,pcovfin = curve_fit(lineal,voltages_dcA[4:],Betas_vec[4:]) + + minimum_voltage = -(poptini[1]-poptfin[1])/(poptini[0]-poptfin[0]) #voltaje donde se intersectan las rectas, es decir, donde deberia estar el minimo de micromocion + minimum_modulationfactor = lineal(minimum_voltage,*poptini) #es lo mismo si pongo *poptfin + + xini = np.linspace(-0.23,-0.13,100) + xfin = np.linspace(-0.15,0.005,100) + + plt.figure() + plt.errorbar(voltages_dcA,Betas_vec,yerr=ErrorBetas_vec,fmt='o',capsize=5,markersize=5,color=paleta[1]) + plt.plot(xini,lineal(xini,*poptini)) + plt.plot(xfin,lineal(xfin,*poptfin)) + plt.axvline(minimum_voltage,linestyle='dashed',color='grey') + plt.xlabel('Endcap voltage (V)') + plt.ylabel('Modulation factor') + plt.grid() + + +print([t*1e3 for t in Temp_vec]) + +plt.figure() +plt.errorbar(voltages_dcA,[t*1e3 for t in Temp_vec],yerr=[t*1e3 for t in ErrorTemp_vec],fmt='o',capsize=5,markersize=5,color=paleta[3]) +plt.axvline(minimum_voltage,linestyle='dashed',color='grey') +plt.axhline(0.538) +plt.xlabel('Endcap voltage (V)') +plt.ylabel('Temperature (mK)') +plt.grid() +#plt.ylim(0,2) + +#%% +""" +Ahora hago un ajuste con una hiperbola porque tiene mas sentido, por el hecho +de que en el punto optimo el ion no esta en el centro de la trampa +sino que esta a una distancia d +""" +def hiperbola(x,a,b,c,x0): + return a*np.sqrt(((x-x0)**2+c**2))+b + +popthip,pcovhip = curve_fit(hiperbola,voltages_dcA,Betas_vec,p0=(100,0.1,1,-0.15)) + +xhip = np.linspace(-0.23,0.005,200) + +plt.figure() +plt.errorbar(voltages_dcA,Betas_vec,yerr=ErrorBetas_vec,fmt='o',capsize=5,markersize=5,color=paleta[1]) +plt.plot(xhip,hiperbola(xhip,*popthip)) +plt.xlabel('Endcap voltage (V)') +plt.ylabel('Modulation factor') +plt.grid() + + + + +#%% +def expo(x,tau,A,B): + return A*np.exp(x/tau)+B + +def cuadratica(x,a,c): + return a*(x**2)+c + +""" +Temperatura vs beta con un aju8ste exponencial +""" + +popt_exp, pcov_exp = curve_fit(expo,Betas_vec,[t*1e3 for t in Temp_vec]) +popt_quad, pcov_quad = curve_fit(cuadratica,Betas_vec,[t*1e3 for t in Temp_vec],p0=(1,10)) + + +betaslong = np.arange(0,2.7,0.01) + +plt.figure() +plt.errorbar(Betas_vec,[t*1e3 for t in Temp_vec],xerr=ErrorBetas_vec, yerr=[t*1e3 for t in ErrorTemp_vec],fmt='o',capsize=5,markersize=5,color=paleta[3]) +plt.plot(betaslong,expo(betaslong,*popt_exp),label='Ajuste exponencial') +plt.plot(betaslong,cuadratica(betaslong,*popt_quad),label='Ajuste cuadratico') +#plt.axvline(minimum_voltage,linestyle='dashed',color='grey') +#plt.axhline(0.538) +plt.xlabel('Modulation factor') +plt.ylabel('Temperature (mK)') +plt.grid() + + +#%% +""" +Esto no es del super ajuste sino de los ajustes anteriores en donde DetDoppler y offset son puestos a mano +Aca grafico los betas con su error en funcion de la tension variada. +Ademas, hago ajuste lineal para primeros y ultimos puntos, ya que espero que +si la tension hace que la posicion del ion varie linealmente, el beta varia proporcional a dicha posicion. +""" + +import seaborn as sns + +def lineal(x,a,b): + return a*x+b + +paleta = sns.color_palette("rocket") + +betavector = [beta1,beta2,beta3,beta4,beta5,beta6,beta7,beta8,beta9] +errorbetavector = [errorbeta1,errorbeta2,errorbeta3,errorbeta4,errorbeta5,errorbeta6,errorbeta7,errorbeta8,errorbeta9] +voltages_dcA = Voltages[0][1:10] + +poptini,pcovini = curve_fit(lineal,voltages_dcA[0:3],betavector[0:3]) +poptfin,pcovfin = curve_fit(lineal,voltages_dcA[4:],betavector[4:]) + +minimum_voltage = -(poptini[1]-poptfin[1])/(poptini[0]-poptfin[0]) #voltaje donde se intersectan las rectas, es decir, donde deberia estar el minimo de micromocion +minimum_modulationfactor = lineal(minimum_voltage,*poptini) #es lo mismo si pongo *poptfin + +xini = np.linspace(-0.23,-0.13,100) +xfin = np.linspace(-0.15,0.005,100) + +plt.figure() +plt.errorbar(voltages_dcA,betavector,yerr=errorbetavector,fmt='o',capsize=5,markersize=5,color=paleta[1]) +plt.plot(xini,lineal(xini,*poptini)) +plt.plot(xfin,lineal(xfin,*poptfin)) +plt.axvline(minimum_voltage,linestyle='dashed',color='grey') +plt.xlabel('Endcap voltage (V)') +plt.ylabel('Modulation factor') +plt.grid() + + +#%% +""" +Aca veo la temperatura del ion en funcion del voltaje del endcap, ya que +al cambiar la cantidad de micromocion, cambia la calidad del enfriado +""" +tempvector = np.array([temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8,temp9])*1e3 +errortempvector = np.array([errortemp1,errortemp2,errortemp3,errortemp4,errortemp5,errortemp6,errortemp7,errortemp8,errortemp9])*1e3 + +voltages_dcA = Voltages[0][1:10] + +plt.figure() +plt.errorbar(voltages_dcA,tempvector,yerr=errortempvector,fmt='o',capsize=5,markersize=5,color=paleta[3]) +plt.axvline(minimum_voltage,linestyle='dashed',color='grey') +plt.xlabel('Endcap voltage (V)') +plt.ylabel('Temperature (mK)') +plt.grid() +plt.ylim(0,2) + + +#%% +""" +Por las dudas, temperatura en funcion de beta +""" +plt.figure() +plt.errorbar(betavector,tempvector,yerr=errortempvector,xerr=errorbetavector,fmt='o',capsize=5,markersize=5) +plt.xlabel('Modulation factor') +plt.ylabel('Temperature (mK)') +plt.grid() + + + +#%% +""" +Si quiero ver algun parametro del ajuste puntual. el orden es: 0:SG, 1:SP, 2:SCALE1, 3:OFFSET +""" +ki=2 +plt.errorbar(np.arange(0,9,1),[popt_1[ki],popt_2[ki],popt_3[ki],popt_4[ki],popt_5[ki],popt_6[ki],popt_7[ki],popt_8[ki],popt_9[ki]],yerr=[np.sqrt(pcov_1[ki,ki]),np.sqrt(pcov_2[ki,ki]),np.sqrt(pcov_3[ki,ki]),np.sqrt(pcov_4[ki,ki]),np.sqrt(pcov_5[ki,ki]),np.sqrt(pcov_6[ki,ki]),np.sqrt(pcov_7[ki,ki]),np.sqrt(pcov_8[ki,ki]),np.sqrt(pcov_9[ki,ki])], fmt='o',capsize=3,markersize=3) + +#%% +""" +AHORA VAMOS A MEDICIONES CON MAS DE UN ION!!! +""" + +""" +Ploteo la cpt de referencia / plotting the reference CPT + +1: 2 iones, -100 mV dcA +2: 2 iones, -150 mV dcA +3: 2 iones, -50 mV dcA +4: 2 iones, 5 voltajes (el ion se va en la 4ta medicion y en la 5ta ni esta) +5, 6 y 7: 3 iones en donde el scaneo esta centrado en distintos puntos + +""" + +jvec = [3] # desde la 1, pero la 4 no porque es un merge de curvitas + +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) + i = i + 1 +plt.xlabel('Frecuencia (MHz)') +plt.ylabel('counts') +plt.grid() +#for dr in drs: +# plt.axvline(dr) + #plt.axvline(dr+drive) +plt.legend() + + +#%% +""" +Mergeo la 5, 6 y 7 +""" + +Freqs5 = [2*f*1e-6 for f in Freqs[5]] +Freqs6 = [2*f*1e-6 for f in Freqs[6]] +Freqs7 = [2*f*1e-6 for f in Freqs[7]] + +Counts5 = Counts[5] +Counts6 = Counts[6] +Counts7 = Counts[7] + +i_1_ini = 0 +i_1 = 36 +i_2_ini = 0 +i_2 = 24 + +f_1 = 18 +f_2 = 30 + + +scale_1 = 0.92 +scale_2 = 0.98 + +#Merged_freqs_test = [f-f_2 for f in Freqs6[i_2_ini:i_2]]+[f-f_1 for f in Freqs5[i_1_ini:i_1]]+Freqs7 + +#plt.plot(Merged_freqs_test,'o') + + + +Merged_freqs = [f-f_2 for f in Freqs6[0:i_2]]+[f-f_1 for f in Freqs5[0:i_1]]+Freqs7 +Merged_counts = [scale_2*c for c in Counts6[0:i_2]]+[scale_1*c for c in Counts5[0:i_1]]+list(Counts7) + +Merged_freqs_rescaled = np.linspace(np.min(Merged_freqs),np.max(Merged_freqs),len(Merged_freqs)) + +#drs = [391.5, 399.5, 405.5, 414] +drs = [370,379,385,391.5] + +plt.figure() +i = 0 +for j in jvec: + plt.plot([f-f_1 for f in Freqs5[0:i_1]], [scale_1*c for c in Counts5[0:i_1]],'o') + plt.plot([f-f_2 for f in Freqs6[0:i_2]], [scale_2*c for c in Counts6[0:i_2]],'o') + plt.plot(Freqs7, Counts7,'o') + plt.errorbar(Merged_freqs, Merged_counts, yerr=np.sqrt(Merged_counts), fmt='o', capsize=2, markersize=2) + + + i = i + 1 +plt.xlabel('Frecuencia (MHz)') +plt.ylabel('counts') +plt.grid() +for dr in drs: + plt.axvline(dr) + plt.axvline(dr+drive, color='red', linestyle='dashed', alpha=0.3) + plt.axvline(dr-drive, color='red', linestyle='dashed', alpha=0.3) + +plt.legend() + +#%% +""" +ajusto la mergeada de 3 iones +""" + +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 = -20 + +offsetxpi = 438+correccion +DetDoppler = -35-correccion-22 + + +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +alpha = 0 + + +drivefreq = 2*np.pi*22.135*1e6 + +FreqsDR = [f-offsetxpi for f in Merged_freqs] +CountsDR = Merged_counts + +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, SCALE2, SCALE3, OFFSET, BETA1, BETA2, BETA3): +#def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1): + #BETA = 1.8 + # SG = 0.6 + # SP = 8.1 + TEMP = 0.1e-3 + + + #BETA1, BETA2, BETA3 = 0, 0, 2 + + 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) + Detunings, Fluorescence3 = PerformExperiment_8levels_MM(SG, SP, gPS, gPD, DetDoppler, u, DopplerLaserLinewidth, ProbeLaserLinewidth, TEMP, alpha, phidoppler, titadoppler, phiprobe, titaprobe, BETA3, 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 for f in Fluorescence1]) + ScaledFluo2 = np.array([f*SCALE2 for f in Fluorescence2]) + ScaledFluo3 = np.array([f*SCALE3 for f in Fluorescence3]) + return ScaledFluo1+ScaledFluo2+ScaledFluo3+OFFSET + #return ScaledFluo1 + + +do_fit = True +if do_fit: + popt_3ions, pcov_3ions = curve_fit(FitEIT_MM, FreqsDR, CountsDR, p0=[0.6, 6.2, 3.5e5, 3.5e5, 3.5e5, 2e3, 1, 1, 1], bounds=((0, 0, 0, 0, 0, 0, 0, 0, 0), (2, 20, 5e8, 5e8, 5e8, 7e3, 10, 10, 10))) +#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))) + +#array([7.12876797e-01, 7.92474752e+00, 4.29735308e+04, 1.74240582e+04, + #1.53401696e+03, 1.17073206e-06, 2.53804151e+00]) + + +FittedEITpi_3ions = FitEIT_MM(freqslong, *popt_3ions) +#FittedEITpi_3ions = FitEIT_MM(freqslong, popt_3ions[0],popt_3ions[1],popt_3ions[2],popt_3ions[3],popt_3ions[4],popt_3ions[5],4,2,0) + +#FittedEITpi_3ions = FitEIT_MM(freqslong, *popt_3ions) + + +print(popt_3ions) + +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_3ions, 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.title(f'Corr:{correccion},DetD:{DetDoppler}') +plt.grid() + + + + + +#%% +""" +Veo la medicion de varios voltajes uno atras de otro +Se va en medio de la medicion 4, y en la 5 ni esta +""" + +jvec = [2] # desde la 1, pero la 4 no porque es un merge de curvitas + +Freqs + +plt.figure() +i = 0 +for j in jvec: + plt.errorbar([2*f*1e-6 for f in Freqs[4]], CountsSplit_2ions[0][j], yerr=np.sqrt(CountsSplit_2ions[0][j]), fmt='o', capsize=2, markersize=2) + i = i + 1 +plt.xlabel('Frecuencia (MHz)') +plt.ylabel('counts') +plt.grid() +#for dr in drs: +# plt.axvline(dr) + #plt.axvline(dr+drive) +plt.legend() + + +#%% +#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 + +correccion = 27 + +offsetxpi = 421+correccion +DetDoppler = -16-correccion+5 + + +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[1]] +CountsDR = Counts[1] + +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, SCALE2, OFFSET): +#def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1): + #BETA = 1.8 + # SG = 0.6 + # SP = 8.1 + TEMP = 0.1e-3 + + BETA1, BETA2 = 3, 0 + + 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 + #return ScaledFluo1 + + +do_fit = True +if do_fit: + popt_2ions_1, pcov_2ions_1 = curve_fit(FitEIT_MM, FreqsDR, CountsDR, p0=[0.9, 6.2, 3.5e3, 2.9e3, 3e3], bounds=((0, 0, 0, 0, 0), (2, 20, 5e8, 5e8, 8e3))) +#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))) + +#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_2ions_1) +#FittedEITpi = FitEIT_MM(freqslong, 0.8, 8, 4e4, 3.5e3, 0) + +# beta1_2ions = popt_2ions_1[5] +# beta2_2ions = popt_2ions_1[6] + +# errbeta1_2ions = np.sqrt(pcov_2ions_1[5,5]) +# errbeta2_2ions = np.sqrt(pcov_2ions_1[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]) +""" + +#arreglito = np.array([8.52685426e-01, 7.42939084e+00, 3.61998310e+04, 3.40160472e+04, 8.62651715e+02, 3.89756335e+00, 7.64867601e-01]) + +FittedEITpi_2ions_1 = FitEIT_MM(freqslong, *popt_2ions_1) + + +print(popt_2ions_1) + +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_2ions_1, 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.title(f'Corr:{correccion},DetD:{DetDoppler}') +plt.grid() + + +#%% +""" +SUPER AJUSTE PARA MED DE 2 IONES +""" + + +#from EITfit.MM_eightLevel_2repumps_AnalysisFunctions import PerformExperiment_8levels +from scipy.optimize import curve_fit +import time + + +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 = 13 + +#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 + + +SelectedCurveVec = [3] + +popt_SA_vec_2ions = [] +pcov_SA_vec_2ions = [] + +for selectedcurve in SelectedCurveVec: + + FreqsDR = Freqs[selectedcurve] + CountsDR = Counts[selectedcurve] + + freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + + CircPr = 1 + alpha = 0 + + + def FitEIT_MM_single(Freqs, offset, DetDoppler, SG, SP, SCALE1, SCALE2, OFFSET, BETA1, BETA2, TEMP, plot=False): + #def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1): + #BETA = 1.8 + #SG = 0.6 + #SP = 8.1 + # TEMP = 0.2e-3 + + freqs = [2*f*1e-6-offset for f in Freqs] + + 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 for f in Fluorescence2]) + if plot: + return ScaledFluo1+ScaledFluo2, Detunings + else: + return ScaledFluo1+ScaledFluo2 + #return ScaledFluo1 + + do_fit = True + if do_fit: + popt_3_SA_2ions, pcov_3_SA_2ions = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[448, -42, 0.6, 8.1, 4e4, 4e4, 6e3, 1, 1.2, 0.5e-3], bounds=((0, -100,0, 0, 0,0,0,0,0, 0), (1000, 0, 2, 20,5e6, 5e6,5e4, 10, 10,10e-3))) + + #popt_3_SA_2ions = [448, -42, 8e4, 6e3, 2, 0.5e-3] + + + popt_SA_vec_2ions.append(popt_3_SA_2ions) + pcov_SA_vec_2ions.append(pcov_3_SA_2ions) + + FittedEITpi_3_SA_short, Detunings_3_SA_short = FitEIT_MM_single(FreqsDR, *popt_3_SA_2ions, plot=True) + freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + FittedEITpi_3_SA_long, Detunings_3_SA_long = FitEIT_MM_single(freqslong, *popt_3_SA_2ions, plot=True) + + + plt.figure() + plt.errorbar(Detunings_3_SA_short, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', color='darkgreen', alpha=0.5, capsize=2, markersize=2) + plt.plot(Detunings_3_SA_long, FittedEITpi_3_SA_long, color='darkolivegreen', linewidth=3, label=f'med {selectedcurve}') + #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() + + print(f'listo med {selectedcurve}') + print(popt_3_SA_2ions) + #print(f'Detdop:{popt_3_SA[1]},popt_3_SA:{popt[0]}') + + +#%% +#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 + +correccion = 27 + +offsetxpi = 421+correccion +DetDoppler = -16-correccion+5 + + +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[1]] +CountsDR = Counts[1] + +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, SCALE2, OFFSET): +#def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1): + #BETA = 1.8 + # SG = 0.6 + # SP = 8.1 + TEMP = 0.1e-3 + + BETA1, BETA2 = 3, 0 + + 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 + #return ScaledFluo1 + + +do_fit = True +if do_fit: + popt_2ions_1, pcov_2ions_1 = curve_fit(FitEIT_MM, FreqsDR, CountsDR, p0=[0.9, 6.2, 3.5e3, 2.9e3, 3e3], bounds=((0, 0, 0, 0, 0), (2, 20, 5e8, 5e8, 8e3))) +#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))) + +#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_2ions_1) +#FittedEITpi = FitEIT_MM(freqslong, 0.8, 8, 4e4, 3.5e3, 0) + +# beta1_2ions = popt_2ions_1[5] +# beta2_2ions = popt_2ions_1[6] + +# errbeta1_2ions = np.sqrt(pcov_2ions_1[5,5]) +# errbeta2_2ions = np.sqrt(pcov_2ions_1[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]) +""" + +#arreglito = np.array([8.52685426e-01, 7.42939084e+00, 3.61998310e+04, 3.40160472e+04, 8.62651715e+02, 3.89756335e+00, 7.64867601e-01]) + +FittedEITpi_2ions_1 = FitEIT_MM(freqslong, *popt_2ions_1) + + +print(popt_2ions_1) + +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_2ions_1, 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.title(f'Corr:{correccion},DetD:{DetDoppler}') +plt.grid() + + + + + + + + + diff --git a/analisis/plots/20231218_CPT_muri/CPT_plotter_20231218.py b/analisis/plots/20231218_CPT_muri/CPT_plotter_20231218.py new file mode 100644 index 0000000000000000000000000000000000000000..92e7cf7e9819be8dac8a89a56ab4a536192daee9 --- /dev/null +++ b/analisis/plots/20231218_CPT_muri/CPT_plotter_20231218.py @@ -0,0 +1,202 @@ +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 + +""" +CPT con tres laseres pero lso dos IR son el mismo entonces las DD son mas finas +""" + +#C:\Users\Usuario\Documents\artiq\artiq_experiments\analisis\plots\20211223_CPT_DosLaseres_v07_ChristmasSpecial\Data + +ALL_FILES = """000016420-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']['IR1_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'])) + + + +#%% + +#Barriendo angulo del IR con tisa apagado + +jvec = [0] + +jselected = jvec + +plt.figure() +i = 0 +for j in jvec: + if j in jselected: + 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.xlabel('Frecuencia (MHz)') +plt.ylabel('counts') +plt.grid() +plt.legend() + +#%% +from scipy.optimize import curve_fit +import time + + +phidoppler, titadoppler = 0, 90 +phirepump, titarepump = 0, 90 +phiprobe = 0 +titaprobe = 0.1 + +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 + +gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 +alpha = 0 + + +drivefreq = 2*np.pi*22.135*1e6 +noiseamplitude = 0 + +selectedcurve=0 + +FreqsDR = Freqs[selectedcurve] +CountsDR = Counts[selectedcurve] + +freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) +CircPr = 1 +alpha = 0 + +def FitEIT_MM_1ion(Freqs, offset, DetDoppler, DetRepump, SG, SP, SR, SCALE1, OFFSET, TEMP, U, plot=False): +#def FitEIT_MM(freqs, SG, SP, SCALE1, OFFSET, BETA1): + # BETA1 = 0 + # SG = 0.6 + # SP = 8.1 + # TEMP = 0.2e-3 + # U = 32.5e6 + freqs = [2*f*1e-6-offset for f in Freqs] + + #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, Fluorescence1 = GenerateNoisyCPT_fit(SG, SR, SP, gPS, gPD, DetDoppler, DetRepump, U, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, TEMP, alpha, phidoppler, titadoppler, phiprobe, [titaprobe], phirepump, titarepump, freqs, plot=False, solvemode=1, detpvec=None, noiseamplitude=noiseamplitude) + + ScaledFluo1 = np.array([f*SCALE1 + OFFSET for f in Fluorescence1]) + if plot: + return ScaledFluo1, Detunings + else: + return ScaledFluo1 + #return ScaledFluo1 + +do_fit = True +if do_fit: + popt_1, pcov_1 = curve_fit(FitEIT_MM_1ion, FreqsDR, CountsDR, p0=[430, -25, 12, 0.9, 6.2, 3, 3e4, 2e3, 0.5e-3, 32e6], bounds=((0, -100, -20, 0, 0, 0, 0, 0, 0,20e6), (1000, 0, 50, 2, 20, 20, 5e6, 5e4, 15e-3,40e6))) + + FittedEITpi_1_short, Detunings_1_short = FitEIT_MM_1ion(FreqsDR, *popt_1, plot=True) + freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + FittedEITpi_1_long, Detunings_1_long = FitEIT_MM_1ion(freqslong, *popt_1, plot=True) + +#%% + +plt.figure() +plt.errorbar(Detunings_1_short, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', color='red', alpha=0.5, capsize=2, markersize=2) +plt.plot(Detunings_1_long, FittedEITpi_1_long, color='darkolivegreen', linewidth=3, label='med 1') +#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.xlim(-20,0) +plt.legend(loc='upper left', fontsize=20) +plt.grid() + +#%% +u = 32.5e6 + +B = (u/(2*np.pi))/c + +correccion = 8 #con 8 fitea bien + +offsetxpi = 440+1+correccion +DetDoppler = -5.0-correccion + +FreqsDRpi_3 = [2*f*1e-6-offsetxpi+14 for f in Freqs_B[5]] +CountsDRpi_3 = Counts_B[5] + +freqslongpi_3 = np.arange(min(FreqsDRpi_3), max(FreqsDRpi_3)+FreqsDRpi_3[1]-FreqsDRpi_3[0], 0.1*(FreqsDRpi_3[1]-FreqsDRpi_3[0])) + +#[1.71811842e+04 3.34325038e-17] + +def FitEITpi(freqs, SG, SP): + temp = 2e-3 + MeasuredFreq, MeasuredFluo = GenerateNoisyCPT_fit(SG, sr, SP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, temp, alpha, phidoppler, titadoppler, phiprobe, [titaprobe], phirepump, titarepump, freqs, plot=False, solvemode=1, detpvec=None, noiseamplitude=noiseamplitude) + FinalFluo = [f*6.554e4 + 1.863e3 for f in MeasuredFluo] + return FinalFluo + +popt_tisaoff, pcov_tisaoff = curve_fit(FitEITpi, FreqsDRpi_3, CountsDRpi_3, p0=[0.5, 4.5], bounds=((0, 0), (2, 10))) + +print(popt_tisaoff) + +Sat_3 = popt_tisaoff[0] +Det_3 = popt_tisaoff[1] + +FittedEITpi_3 = FitEITpi(freqslongpi_3, *popt_tisaoff) + +plt.figure() +plt.errorbar(FreqsDRpi_3, CountsDRpi_3, yerr=2*np.sqrt(CountsDRpi_3), fmt='o', capsize=2, markersize=2) +plt.plot(freqslongpi_3, FittedEITpi_3) +#plt.title(f'Sdop: {round(popt[0], 2)}, Spr: {round(popt[1], 2)}, T: {round(popt[2]*1e3, 2)} mK, detDop: {DetDoppler} MHz') + +FreqsCalibradas_B = FreqsDRpi_3 + + + + + + + + + + diff --git a/analisis/plots/20231218_CPT_muri/CPT_plotter_20231218_muri.py b/analisis/plots/20231218_CPT_muri/CPT_plotter_20231218_muri.py index 539c6c4064ea7db31315e150007ec807d82f55f3..3378b220b826ebda10c6e8d1adc426aee331da0f 100644 --- a/analisis/plots/20231218_CPT_muri/CPT_plotter_20231218_muri.py +++ b/analisis/plots/20231218_CPT_muri/CPT_plotter_20231218_muri.py @@ -14,7 +14,7 @@ Primero tengo mediciones de espectros cpt de un ion variando la tension dc_A #C:\Users\Usuario\Documents\artiq\artiq_experiments\analisis\plots\20220106_CPT_DosLaseres_v08_TISA_DR\Data -os.chdir('/home/nico/Documents/artiq_experiments/analisis/plots/20231123_CPTconmicromocion3/Data/') +os.chdir('/home/muri/nubeDF/Documents/codigos/artiq_experiments/analisis/plots/20231218_CPT_muri/Data') CPT_FILES = """000016262-IR_Scan_withcal_optimized 000016239-IR_Scan_withcal_optimized @@ -111,7 +111,84 @@ plt.grid() plt.legend() +#%% +from EITfit.MM_eightLevel_2repumps_AnalysisFunctions import PerformExperiment_8levels_MM + +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 = 13 + +offsetxpi = 419+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 +selectedcurve = 4 + +FreqsDR = [2*f*1e-6-offsetxpi for f in Freqs[0]] +CountsDR = CountsSplit[0][selectedcurve] +CountsDR[100]=0.5*(CountsDR[99]+CountsDR[101]) +CountsDR[105]=0.5*(CountsDR[104]+CountsDR[106]) + +freqslong = np.arange(min(FreqsDR), max(FreqsDR)+FreqsDR[1]-FreqsDR[0], 0.1*(FreqsDR[1]-FreqsDR[0])) + +CircPr = 1 +alpha = 0 + + +def FitEIT_MM_single(freqs, SG, SP, SCALE1, OFFSET, BETA1, TEMP): +#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 + +do_fit = True +if do_fit: + popt_1, pcov_1 = curve_fit(FitEIT_MM_single, FreqsDR, CountsDR, p0=[0.9, 6.2, 3e4, 1.34e3, 0, 1e-3], bounds=((0, 0, 0, 0, 0, 0), (2, 20, 7e4, 5e4, 0.000001, 15e-3))) + FittedEITpi_1 = FitEIT_MM_single(freqslong, *popt_1) + +beta1 = popt_1[4] +errorbeta1 = np.sqrt(pcov_1[4,4]) +temp1 = popt_1[5] +errortemp1 = np.sqrt(pcov_1[5,5]) + +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_1, color='darkolivegreen', linewidth=3, label='med 1') +#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() + diff --git a/analisis/plots/20231218_CPT_muri/Data/EITfit/MM_eightLevel_2repumps_AnalysisFunctions.py b/analisis/plots/20231218_CPT_muri/Data/EITfit/MM_eightLevel_2repumps_AnalysisFunctions.py index bffaeeaaa99fc7f9a1b0d2d07ac1fd3bb7e7c74b..1a6c29dd7e6a5612d2bb3746f07fac8947def88b 100644 --- a/analisis/plots/20231218_CPT_muri/Data/EITfit/MM_eightLevel_2repumps_AnalysisFunctions.py +++ b/analisis/plots/20231218_CPT_muri/Data/EITfit/MM_eightLevel_2repumps_AnalysisFunctions.py @@ -15,7 +15,7 @@ import numpy as np import time import matplotlib.pyplot as plt from scipy.signal import argrelextrema -#from EITfit.MM_eightLevel_2repumps_python_scripts import CPTspectrum8levels_MM +from EITfit.MM_eightLevel_2repumps_python_scripts import CPTspectrum8levels_MM import random from scipy.signal import savgol_filter as sf diff --git a/analisis/plots/20231218_CPT_muri/Data/EITfit/MM_eightLevel_2repumps_python_scripts.py b/analisis/plots/20231218_CPT_muri/Data/EITfit/MM_eightLevel_2repumps_python_scripts.py index 61bc4d75b68facd5d98d78990e09fdca019d8be2..d9204478484e04086fb64ff48802fb4356cc2dbb 100644 --- a/analisis/plots/20231218_CPT_muri/Data/EITfit/MM_eightLevel_2repumps_python_scripts.py +++ b/analisis/plots/20231218_CPT_muri/Data/EITfit/MM_eightLevel_2repumps_python_scripts.py @@ -233,7 +233,7 @@ def dopplerBroadening(wlg, wlp, alpha, T, mcalcio = 6.655e-23*1e-3): kboltzmann = 1.38e-23 #J/K - gammaD = (2*np.pi)*np.sqrt((1/(wlg*wlg)) + (1/(wlp*wlp)) - 2*(1/(wlg*wlp))*np.cos(alpha))*np.sqrt(kboltzmann*T/(2*mcalcio)) + gammaD = (2*np.pi)*np.sqrt((1/(wlg*wlg)) + (1/(wlp*wlp)) - 2*(1/(wlg*wlp))*np.cos(alpha))*np.sqrt(kboltzmann*T/(mcalcio)) return gammaD @@ -249,8 +249,14 @@ def FullL_MM(rabG, rabP, gPS = 0, gPD = 0, Detg = 0, Detp = 0, u = 0, lwg = 0, l db = dopplerBroadening(0.397e-6, 0.866e-6, alpha, T) - lwg = np.sqrt(lwg**2 + db**2) - lwp = np.sqrt(lwp**2 + db**2) + kg = 1/397 + kp = 1/866 + + fg = kg**2/(kg**2+kp**2) + fp = kp**2/(kg**2+kp**2) + + lwg = np.sqrt(lwg**2 + (fg*db)**2) + lwp = np.sqrt(lwp**2 + (fp*db)**2) CC = EffectiveL(gPS, gPD, lwg, lwp)