Commit 81139a56 authored by Nicolas Nunez Barreto's avatar Nicolas Nunez Barreto
parents ca6af67a 7f468d59
...@@ -47,6 +47,7 @@ for i, fname in enumerate(MOTIONAL_FILES.split()): ...@@ -47,6 +47,7 @@ for i, fname in enumerate(MOTIONAL_FILES.split()):
Counts_roi2.append(np.array(data['datasets']['counts_roi2'])) Counts_roi2.append(np.array(data['datasets']['counts_roi2']))
IR1_amp_vec.append(np.array(data['datasets']['IR1_amp'])) IR1_amp_vec.append(np.array(data['datasets']['IR1_amp']))
Potencias_IR = [0,20,50]
#%% #%%
...@@ -54,7 +55,7 @@ for i, fname in enumerate(MOTIONAL_FILES.split()): ...@@ -54,7 +55,7 @@ for i, fname in enumerate(MOTIONAL_FILES.split()):
Ploteo una curva para buscar su minimo Ploteo una curva para buscar su minimo
""" """
jvec = [0,1,2] jvec = [2,1,0]
plt.figure() plt.figure()
i = 0 i = 0
...@@ -62,75 +63,15 @@ i = 0 ...@@ -62,75 +63,15 @@ i = 0
kmin = 106 kmin = 106
for j in jvec: for j in jvec:
plt.errorbar([1*f*1e-3 for f in RealFreqs[j]], Counts_roi1[j], yerr=np.sqrt(Counts[j]), fmt='o', capsize=2, markersize=2, label=f'IR1_amp: {IR1_amp[j]}') plt.errorbar([1*f*1e-3 for f in RealFreqs[j]], Counts_roi1[j], yerr=0.1*np.sqrt(Counts_roi1[j]), fmt='o', capsize=2, markersize=2, label=f'IR1 power: {Potencias_IR[j]} uW')
#plt.plot([1*f*1e-3 for f in RealFreqs[j]][kmin], Counts[j][kmin], 'o', markersize=15) #plt.plot([1*f*1e-3 for f in RealFreqs[j]][kmin], Counts[j][kmin], 'o', markersize=15)
i = i + 1 i = i + 1
plt.xlabel('Frecuencia (kHz)') plt.xlabel('Frecuencia mod IR2 (kHz)')
plt.ylabel('counts') plt.ylabel('Cuentas/400 ms')
#plt.xlim(782,787) plt.xlim(780,810)
#plt.ylim(2000,5000) plt.ylim(18680,19650)
plt.grid() plt.grid()
plt.legend(loc='upper left') plt.legend(loc='lower left')
#%%
"""
Ploteo las curvas de referencia
"""
jvec = [0, 1, 2, 3, 8]
plt.figure()
i = 0
for j in jvec:
plt.errorbar([1*f*1e-3 for f in RealFreqs[j]], Counts[j], yerr=np.sqrt(Counts[j]), fmt='o', capsize=2, markersize=2, label=f"Pot: {Potencias[j]} uW")
i = i + 1
plt.xlabel('Frecuencia (kHz)')
plt.ylabel('counts')
#plt.xlim(782,787)
plt.ylim(2000,5000)
plt.grid()
plt.legend(loc='upper left')
#%%
"""
Busco el cociente entre el minimo y el maximo
"""
kmins = [106, 106, 106, 106, 110, 110, 110, 112, 108]
minabs = np.min(Counts[2])
MinimosFluos = []
MaximosFluos = []
CocientesFluos = []
ErrorCocientesFluos = []
for m in range(9):
mini = Counts[m][kmins[m]]-minabs
maxi = Counts[m][0]-minabs
MinimosFluos.append(mini)
MaximosFluos.append(maxi)
CocientesFluos.append(mini/maxi)
ErrorCocientesFluos.append((mini/maxi)*(np.sqrt(mini)/mini + np.sqrt(maxi)/maxi))
plt.figure()
plt.errorbar(PotenciasUsadas, CocientesFluos, yerr=ErrorCocientesFluos, fmt='o', capsize=5, markersize=15)
plt.axhline(1)
plt.xlabel('Potencia IR (uW)')
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 2 16:30:09 2020
@author: oem
"""
import os
import numpy as np
import time
import matplotlib.pyplot as plt
from scipy.signal import argrelextrema
from EITfit.threeLevel_2repumps_linealpol_python_scripts import CPTspectrum8levels, CPTspectrum8levels_fixedRabi
import random
from scipy.signal import savgol_filter as sf
def CalculoTeoricoDarkResonances_8levels(u, titadoppler, detuningdoppler, detuningrepump):
if titadoppler==0:
NegativeDR = [(-7/5)*u, (-3/5)*u, (-1/5)*u, (1/5)*u, (3/5)*u, (7/5)*u]
elif titadoppler==90:
NegativeDR = [(-11/5)*u, (-7/5)*u, (-3/5)*u, (3/5)*u, (7/5)*u, (11/5)*u]
else:
NegativeDR = [(-11/5)*u, (-7/5)*u, (-3/5)*u, (-1/5)*u, (1/5)*u, (3/5)*u, (7/5)*u, (11/5)*u]
PositiveDR = [(-8/5)*u, (-4/5)*u, 0, (4/5)*u, (8/5)*u]
return [detuningdoppler + dr for dr in NegativeDR], [detuningrepump + dr for dr in PositiveDR]
def GetClosestIndex(Vector, value, tolerance=1e-3):
i = 0
while i<len(Vector):
if abs(Vector[i] - value) < tolerance:
return i
else:
i = i + 1
return GetClosestIndex(Vector, value, tolerance=2*tolerance)
def FindDRFrequencies(Freq, Fluo, TeoDR, entorno=3):
"""
Busca los indices y la frecuencia de los minimos en un entorno cercano al de la DR.
Si no encuentra, devuelve el valor teórico.
"""
IndiceDRteo1, IndiceEntornoinicialDRteo1, IndiceEntornofinalDRteo1 = GetClosestIndex(Freq, TeoDR[0]), GetClosestIndex(Freq, TeoDR[0]-entorno), GetClosestIndex(Freq, TeoDR[0]+entorno)
IndiceDRteo2, IndiceEntornoinicialDRteo2, IndiceEntornofinalDRteo2 = GetClosestIndex(Freq, TeoDR[1]), GetClosestIndex(Freq, TeoDR[1]-entorno), GetClosestIndex(Freq, TeoDR[1]+entorno)
IndiceDRteo3, IndiceEntornoinicialDRteo3, IndiceEntornofinalDRteo3 = GetClosestIndex(Freq, TeoDR[2]), GetClosestIndex(Freq, TeoDR[2]-entorno), GetClosestIndex(Freq, TeoDR[2]+entorno)
IndiceDRteo4, IndiceEntornoinicialDRteo4, IndiceEntornofinalDRteo4 = GetClosestIndex(Freq, TeoDR[3]), GetClosestIndex(Freq, TeoDR[3]-entorno), GetClosestIndex(Freq, TeoDR[3]+entorno)
IndiceDRteo5, IndiceEntornoinicialDRteo5, IndiceEntornofinalDRteo5 = GetClosestIndex(Freq, TeoDR[4]), GetClosestIndex(Freq, TeoDR[4]-entorno), GetClosestIndex(Freq, TeoDR[4]+entorno)
IndiceDRteo6, IndiceEntornoinicialDRteo6, IndiceEntornofinalDRteo6 = GetClosestIndex(Freq, TeoDR[5]), GetClosestIndex(Freq, TeoDR[5]-entorno), GetClosestIndex(Freq, TeoDR[5]+entorno)
EntornoFreqDR1, EntornoFreqDR2 = Freq[IndiceEntornoinicialDRteo1:IndiceEntornofinalDRteo1], Freq[IndiceEntornoinicialDRteo2:IndiceEntornofinalDRteo2]
EntornoFreqDR3, EntornoFreqDR4 = Freq[IndiceEntornoinicialDRteo3:IndiceEntornofinalDRteo3], Freq[IndiceEntornoinicialDRteo4:IndiceEntornofinalDRteo4]
EntornoFreqDR5, EntornoFreqDR6 = Freq[IndiceEntornoinicialDRteo5:IndiceEntornofinalDRteo5], Freq[IndiceEntornoinicialDRteo6:IndiceEntornofinalDRteo6]
EntornoFluoDR1, EntornoFluoDR2 = Fluo[IndiceEntornoinicialDRteo1:IndiceEntornofinalDRteo1], Fluo[IndiceEntornoinicialDRteo2:IndiceEntornofinalDRteo2]
EntornoFluoDR3, EntornoFluoDR4 = Fluo[IndiceEntornoinicialDRteo3:IndiceEntornofinalDRteo3], Fluo[IndiceEntornoinicialDRteo4:IndiceEntornofinalDRteo4]
EntornoFluoDR5, EntornoFluoDR6 = Fluo[IndiceEntornoinicialDRteo5:IndiceEntornofinalDRteo5], Fluo[IndiceEntornoinicialDRteo6:IndiceEntornofinalDRteo6]
IndiceFluoMinimaEntorno1, IndiceFluoMinimaEntorno2 = argrelextrema(np.array(EntornoFluoDR1), np.less)[0], argrelextrema(np.array(EntornoFluoDR2), np.less)[0]
IndiceFluoMinimaEntorno3, IndiceFluoMinimaEntorno4 = argrelextrema(np.array(EntornoFluoDR3), np.less)[0], argrelextrema(np.array(EntornoFluoDR4), np.less)[0]
IndiceFluoMinimaEntorno5, IndiceFluoMinimaEntorno6 = argrelextrema(np.array(EntornoFluoDR5), np.less)[0], argrelextrema(np.array(EntornoFluoDR6), np.less)[0]
try:
FreqDR1 = EntornoFreqDR1[int(IndiceFluoMinimaEntorno1)]
IndiceDR1 = GetClosestIndex(Freq, FreqDR1)
except:
FreqDR1 = TeoDR[0]
IndiceDR1 = IndiceDRteo1
try:
FreqDR2 = EntornoFreqDR2[int(IndiceFluoMinimaEntorno2)]
IndiceDR2 = GetClosestIndex(Freq, FreqDR2)
except:
FreqDR2 = TeoDR[1]
IndiceDR2 = IndiceDRteo2
try:
FreqDR3 = EntornoFreqDR3[int(IndiceFluoMinimaEntorno3)]
IndiceDR3 = GetClosestIndex(Freq, FreqDR3)
except:
FreqDR3 = TeoDR[2]
IndiceDR3 = IndiceDRteo3
try:
FreqDR4 = EntornoFreqDR4[int(IndiceFluoMinimaEntorno4)]
IndiceDR4 = GetClosestIndex(Freq, FreqDR4)
except:
FreqDR4 = TeoDR[3]
IndiceDR4 = IndiceDRteo4
try:
FreqDR5 = EntornoFreqDR5[int(IndiceFluoMinimaEntorno5)]
IndiceDR5 = GetClosestIndex(Freq, FreqDR5)
except:
FreqDR5 = TeoDR[4]
IndiceDR5 = IndiceDRteo5
try:
FreqDR6 = EntornoFreqDR6[int(IndiceFluoMinimaEntorno6)]
IndiceDR6 = GetClosestIndex(Freq, FreqDR6)
except:
FreqDR6 = TeoDR[5]
IndiceDR6 = IndiceDRteo6
return [IndiceDR1, IndiceDR2, IndiceDR3, IndiceDR4, IndiceDR5, IndiceDR6], [FreqDR1, FreqDR2, FreqDR3, FreqDR4, FreqDR5, FreqDR6]
def FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=1, frecuenciareferenciacriterioasintotico=-100, getindices=False):
"""
Toma los indices donde estan las DR y evalua su fluorescencia. Esos indices son minimos locales en un entorno
cercano a las DR teoricas y, si no hay ningun minimo, toma la teorica.
Luego, hace el cociente de esa fluorescencia y un factor de normalización segun NormalizationCriterium:
1: Devuelve la fluorescencia absoluta de los minimos
2: Devuelve el cociente entre la fluorescencia del minimo y un valor medio entre dos puntos lejanos, como si no
hubiera una resonancia oscura y hubiera una recta. Ese valor esta a DistanciaFrecuenciaCociente del detuning del azul (el punto medio entre las dos DR en este caso)
3: Devuelve el cociente entre la fluorescencia del minimo y el valor a -100 MHz (si se hizo de -100 a 100),
o el valor limite por izquierda de la curva
4: Deuelve el cociente entre la fluorescencia del minimo y el valor de fluorescencia a detuning 0 MHz
"""
IndiceDR1, IndiceDR2, IndiceDR3, IndiceDR4, IndiceDR5, IndiceDR6 = IndicesDR[0], IndicesDR[1], IndicesDR[2], IndicesDR[3], IndicesDR[4], IndicesDR[5]
FluorescenceOfMinimums = [Fluo[IndiceDR1], Fluo[IndiceDR2], Fluo[IndiceDR3], Fluo[IndiceDR4], Fluo[IndiceDR5], Fluo[IndiceDR6]]
FrequencyOfMinimums = [Freq[IndiceDR1], Freq[IndiceDR2], Freq[IndiceDR3], Freq[IndiceDR4], Freq[IndiceDR5], Freq[IndiceDR6]]
DistanciaFrecuenciaCociente = 25
if NormalizationCriterium==0:
print('che')
return FrequencyOfMinimums, FluorescenceOfMinimums
if NormalizationCriterium==1:
Fluorescenciacerodetuning = Fluo[GetClosestIndex(Freq, 0)]
Fluorescenciaasintotica = Fluo[GetClosestIndex(Freq, frecuenciareferenciacriterioasintotico)]
return FrequencyOfMinimums, np.array([Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica])
if NormalizationCriterium==2:
k = 0
while k < len(Freq):
if Freq[k] < detuningdoppler-DistanciaFrecuenciaCociente + 2 and Freq[k] > detuningdoppler-DistanciaFrecuenciaCociente - 2:
FluoIzquierda = Fluo[k]
indiceizquierda = k
print('Izq:', Freq[k])
break
else:
k = k + 1
l = 0
while l < len(Freq):
if Freq[l] < detuningdoppler+DistanciaFrecuenciaCociente + 2 and Freq[l] > detuningdoppler+DistanciaFrecuenciaCociente - 2:
FluoDerecha = Fluo[l]
indicederecha = l
print('Der: ', Freq[l])
break
else:
l = l + 1
FluoNormDivisor = 0.5*(FluoDerecha+FluoIzquierda)
print(FluoNormDivisor)
if NormalizationCriterium==3:
#asintotico
FluoNormDivisor = Fluo[GetClosestIndex(Freq, frecuenciareferenciacriterioasintotico)]
if NormalizationCriterium==4:
#este te tira la fluorescencia de detuning 0
FluoNormDivisor = Fluo[GetClosestIndex(Freq, 0)]
RelativeFluorescenceOfMinimums = np.array([Fluore/FluoNormDivisor for Fluore in FluorescenceOfMinimums])
print('Esto: ', RelativeFluorescenceOfMinimums)
if NormalizationCriterium==2 and getindices==True:
return FrequencyOfMinimums, RelativeFluorescenceOfMinimums, indiceizquierda, indicederecha
return FrequencyOfMinimums, RelativeFluorescenceOfMinimums
def GetFinalMaps(MapasDR1, MapasDR2, MapasDR3, MapasDR4, MapasDR5, MapasDR6):
"""
Nota: esto vale para polarizacion del 397 sigma+ + sigma-. Sino hay que cambiar los coeficientes.
La estructura es:
MapasDRi = [MapaMedido_criterio1_DRi, MapaMedido_criterio2_DRi, MapaMedido_criterio3_DRi, MapaMedido_criterio4_DRi]
"""
Mapa1 = MapasDR1[0]
Mapa2pi = np.sqrt(3)*(MapasDR2[1] + MapasDR5[1])
Mapa2smas = np.sqrt(12/2)*MapasDR3[1] + (2/np.sqrt(2))*MapasDR6[1]
Mapa2smenos = (2/np.sqrt(2))*MapasDR1[1] + np.sqrt(12/2)*MapasDR4[1]
Mapa3pi = np.sqrt(3)*(MapasDR2[2] + MapasDR5[2])
Mapa3smas = np.sqrt(12/2)*MapasDR3[2] + (2/np.sqrt(2))*MapasDR6[2]
Mapa3smenos = (2/np.sqrt(2))*MapasDR1[2] + np.sqrt(12/2)*MapasDR4[2]
return Mapa1, [Mapa2pi, Mapa2smas, Mapa2smenos], [Mapa3pi, Mapa3smas, Mapa3smenos]
def CombinateDRwithCG(RelMinMedido1, RelMinMedido2, RelMinMedido3, RelMinMedido4):
Fluo1 = RelMinMedido1[0]
Fluo2pi = np.sqrt(3)*(RelMinMedido2[1] + RelMinMedido2[4])
Fluo2smas = np.sqrt(12/2)*RelMinMedido2[2] + (2/np.sqrt(2))*RelMinMedido2[5]
Fluo2smenos = (2/np.sqrt(2))*RelMinMedido2[0] + np.sqrt(12/2)*RelMinMedido2[3]
Fluo3pi = np.sqrt(3)*(RelMinMedido3[1] + RelMinMedido3[4])
Fluo3smas = np.sqrt(12/2)*RelMinMedido3[2] + (2/np.sqrt(2))*RelMinMedido3[5]
Fluo3smenos = (2/np.sqrt(2))*RelMinMedido3[0] + np.sqrt(12/2)*RelMinMedido3[3]
return Fluo1, [Fluo2pi, Fluo2smas, Fluo2smenos], [Fluo3pi, Fluo3smas, Fluo3smenos]
def IdentifyPolarizationCoincidences(theoricalmap, target, tolerance=1e-1):
"""
Busca en un mapa 2D la presencia de un valor target (medido) con tolerancia tolerance.
Si lo encuentra, pone un 1. Sino, un 0. Al plotear con pcolor se verá
en blanco la zona donde el valor medido se puede hallar.
"""
CoincidenceMatrix = np.zeros((len(theoricalmap), len(theoricalmap[0])))
i = 0
while i<len(theoricalmap):
j = 0
while j<len(theoricalmap[0]):
if abs(theoricalmap[i][j]-target) < tolerance:
CoincidenceMatrix[i][j] = 1
j=j+1
i=i+1
return CoincidenceMatrix
def RetrieveAbsoluteCoincidencesBetweenMaps(MapsVectors):
MatrixSum = np.zeros((len(MapsVectors[0]), len(MapsVectors[0][0])))
AbsoluteCoincidencesMatrix = np.zeros((len(MapsVectors[0]), len(MapsVectors[0][0])))
MatrixMapsVectors = []
for i in range(len(MapsVectors)):
MatrixMapsVectors.append(np.matrix(MapsVectors[i]))
for i in range(len(MatrixMapsVectors)):
MatrixSum = MatrixSum + MatrixMapsVectors[i]
MaxNumberOfCoincidences = np.max(MatrixSum)
ListMatrixSum = [list(i) for i in list(np.array(MatrixSum))]
for i in range(len(ListMatrixSum)):
for j in range(len(ListMatrixSum[0])):
if ListMatrixSum[i][j] == MaxNumberOfCoincidences:
AbsoluteCoincidencesMatrix[i][j] = 1
return AbsoluteCoincidencesMatrix, MaxNumberOfCoincidences
def MeasureMeanValueOfEstimatedArea(AbsoluteCoincidencesMap, X, Y):
NonZeroIndices = np.nonzero(AbsoluteCoincidencesMap)
Xsum = 0
Xvec = []
Ysum = 0
Yvec = []
N = len(NonZeroIndices[0])
for i in range(N):
Xsum = Xsum + X[NonZeroIndices[1][i]]
Xvec.append(X[NonZeroIndices[1][i]])
Ysum = Ysum + Y[NonZeroIndices[0][i]]
Yvec.append(Y[NonZeroIndices[0][i]])
Xaverage = Xsum/N
Yaverage = Ysum/N
Xspread = np.std(Xvec)
Yspread = np.std(Yvec)
return Xaverage, Yaverage, N, Xspread, Yspread
def MeasureRelativeFluorescenceFromCPT(Freq, Fluo, u, titadoppler, detuningrepump, detuningdoppler, frefasint=-100, entorno=3):
ResonanciasTeoricas, ResonanciasPositivas = CalculoTeoricoDarkResonances_8levels(u, titadoppler, detuningdoppler, detuningrepump)
IndicesDR, FreqsDR = FindDRFrequencies(Freq, Fluo, ResonanciasTeoricas, entorno=entorno)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums0 = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=0, frecuenciareferenciacriterioasintotico=frefasint)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums1 = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=1, frecuenciareferenciacriterioasintotico=frefasint)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums2, indiceizquierda, indicederecha = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=2, frecuenciareferenciacriterioasintotico=frefasint, getindices=True)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums3 = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=3, frecuenciareferenciacriterioasintotico=frefasint)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums4 = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=4, frecuenciareferenciacriterioasintotico=frefasint)
print('hola')
print(RelativeFluorescenceOfMinimums0)
return RelativeFluorescenceOfMinimums0, RelativeFluorescenceOfMinimums1, RelativeFluorescenceOfMinimums2, RelativeFluorescenceOfMinimums3, RelativeFluorescenceOfMinimums4, IndicesDR, [indiceizquierda, indicederecha]
def GenerateNoisyCPT(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None, noiseamplitude=0.001):
Frequencyvector, Fluovector = PerformExperiment_8levels(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None)
NoisyFluovector = [fluo+noiseamplitude*(2*random.random()-1) for fluo in Fluovector]
return Frequencyvector, NoisyFluovector
def GenerateNoisyCPT_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None, noiseamplitude=0.001):
Frequencyvector, Fluovector = PerformExperiment_8levels_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None)
NoisyFluovector = [fluo+noiseamplitude*(2*random.random()-1) for fluo in Fluovector]
return Frequencyvector, NoisyFluovector
def GenerateNoisyCPT_fit(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqs, plot=False, solvemode=1, detpvec=None, noiseamplitude=0.001):
Frequencyvector, Fluovector = PerformExperiment_8levels_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, min(freqs), max(freqs) + freqs[1]-freqs[0], freqs[1]-freqs[0], plot=False, solvemode=1, detpvec=None)
NoisyFluovector = [fluo+noiseamplitude*(2*random.random()-1) for fluo in Fluovector]
return Frequencyvector, NoisyFluovector
def AddNoiseToCPT(Fluo, noisefactor):
return [f+noisefactor*(2*random.random()-1) for f in Fluo]
def SmoothNoisyCPT(Fluo, window=11, poly=3):
SmoothenFluo = sf(Fluo, window, poly)
return SmoothenFluo
def GetMinimaInfo(Freq, Fluo, u, titadoppler, detuningdoppler, detuningrepump, MinimumCriterium=2, NormalizationCriterium=1):
"""
FUNCION VIEJA
Esta funcion devuelve valores de frecuencias y fluorescencia relativa de los minimos.
Minimumcriterion:
1: Saca los minimos con funcion argelextrema
2: Directamente con las frecuencias teoricas busca las fluorescencias
Normalizationcriterium:
1: Devuelve la fluorescencia absoluta de los minimos
2: Devuelve el cociente entre la fluorescencia del minimo y un valor medio entre dos puntos lejanos, como si no
hubiera una resonancia oscura y hubiera una recta. Ese valor esta a DistanciaFrecuenciaCociente del detuning del azul (el punto medio entre las dos DR en este caso)
3: Devuelve el cociente entre la fluorescencia del minimo y el valor a -100 MHz (si se hizo de -100 a 100),
o el valor limite por izquierda de la curva
"""
FluorescenceOfMaximum = max(Fluo)
FrequencyOfMaximum = Freq[Fluo.index(FluorescenceOfMaximum)]
#criterio para encontrar los minimos
#criterio usando minimos de la fluorescencia calculados con la curva
if MinimumCriterium == 1:
LocationOfMinimums = argrelextrema(np.array(Fluo), np.less)[0]
FluorescenceOfMinimums = np.array([Fluo[i] for i in LocationOfMinimums])
FrequencyOfMinimums = np.array([Freq[j] for j in LocationOfMinimums])
#criterio con las DR teoricas
if MinimumCriterium == 2:
FrecuenciasDRTeoricas, FrecuenciasDRTeoricasPositivas = [darkresonance for darkresonance in CalculoTeoricoDarkResonances_8levels(u, titadoppler, detuningdoppler, detuningrepump)[0]]
FrequencyOfMinimums = []
FluorescenceOfMinimums =[]
print(FrecuenciasDRTeoricas)
k=0
ventanita = 0.001
while k < len(Freq):
if Freq[k] < FrecuenciasDRTeoricas[0] + ventanita and Freq[k] > FrecuenciasDRTeoricas[0] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[1] + ventanita and Freq[k] > FrecuenciasDRTeoricas[1] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[2] + ventanita and Freq[k] > FrecuenciasDRTeoricas[2] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[3] + ventanita and Freq[k] > FrecuenciasDRTeoricas[3] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[4] + ventanita and Freq[k] > FrecuenciasDRTeoricas[4] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[5] + ventanita and Freq[k] > FrecuenciasDRTeoricas[5] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
k = k + 1
print(FrequencyOfMinimums)
if len(FrequencyOfMinimums) != len(FrecuenciasDRTeoricas):
print('NO ANDA BIEN ESTO PAPI, revisalo')
#esto es para establecer un criterio para la fluorescencia relativa
DistanciaFrecuenciaCociente = 15
if NormalizationCriterium==1:
FluoNormDivisor = 1
if NormalizationCriterium==2:
k = 0
while k < len(Freq):
if Freq[k] < detuningdoppler-DistanciaFrecuenciaCociente + 2 and Freq[k] > detuningdoppler-DistanciaFrecuenciaCociente - 2:
FluoIzquierda = Fluo[k]
print('Izq:', Freq[k])
break
else:
k = k + 1
l = 0
while l < len(Freq):
if Freq[l] < detuningdoppler+DistanciaFrecuenciaCociente + 2 and Freq[l] > detuningdoppler+DistanciaFrecuenciaCociente - 2:
FluoDerecha = Fluo[l]
print('Der: ', Freq[l])
break
else:
l = l + 1
FluoNormDivisor = 0.5*(FluoDerecha+FluoIzquierda)
print(FluoNormDivisor)
if NormalizationCriterium==3:
FluoNormDivisor = Fluo[0]
RelativeFluorescenceOfMinimums = np.array([Fluore/FluoNormDivisor for Fluore in FluorescenceOfMinimums])
return FrequencyOfMinimums, RelativeFluorescenceOfMinimums
def GetPlotsofFluovsAngle_8levels(FrequencyOfMinimumsVector, RelativeFluorescenceOfMinimumsVector, u, titadoppler, detuningdoppler, detuningrepump, ventana=0.25, taketheoricalDR=False):
#primero buscamos las frecuencias referencia que se parezcan a las 6:
i = 0
FrecuenciasReferenciaBase = FrequencyOfMinimumsVector[0]
FrecuenciasDRTeoricas = [darkresonance for darkresonance in CalculoTeoricoDarkResonances_8levels(u, titadoppler, detuningdoppler, detuningrepump)[0]]
while i < len(FrequencyOfMinimumsVector):
if len(FrequencyOfMinimumsVector[i])==len(FrecuenciasDRTeoricas):
FrecuenciasReferenciaBase = FrequencyOfMinimumsVector[i]
print('Cool! Taking the DR identified with any curve')
break
else:
i = i + 1
if i==len(FrequencyOfMinimumsVector):
print('No hay ningun plot con 5 resonancias oscuras. Tomo las teóricas')
FrecuenciasReferenciaBase = FrecuenciasDRTeoricas
if taketheoricalDR:
FrecuenciasReferenciaBase = FrecuenciasDRTeoricas
Ventana = abs(ventana*(FrecuenciasReferenciaBase[1] - FrecuenciasReferenciaBase[0])) #ventana separadora de resonancias
print('Ventana = ', Ventana)
DarkResonance1Frequency = []
DarkResonance1Fluorescence = []
DarkResonance2Frequency = []
DarkResonance2Fluorescence = []
DarkResonance3Frequency = []
DarkResonance3Fluorescence = []
DarkResonance4Frequency = []
DarkResonance4Fluorescence = []
DarkResonance5Frequency = []
DarkResonance5Fluorescence = []
DarkResonance6Frequency = []
DarkResonance6Fluorescence = []
i = 0
while i < len(FrequencyOfMinimumsVector):
j = 0
FrecuenciasReferencia = [i for i in FrecuenciasReferenciaBase]
while j < len(FrequencyOfMinimumsVector[i]):
if abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[0])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[0])-Ventana):
DarkResonance1Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance1Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[0] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[1])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[1])-Ventana):
DarkResonance2Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance2Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[1] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[2])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[2])-Ventana):
DarkResonance3Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance3Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[2] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[3])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[3])-Ventana):
DarkResonance4Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance4Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[3] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[4])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[4])-Ventana):
DarkResonance5Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance5Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[4] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[5])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[5])-Ventana):
DarkResonance6Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance6Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[5] = 0
else:
#print('Algo anduvo mal, por ahi tenes que cambiar la ventana che')
pass
j = j + 1
if np.count_nonzero(FrecuenciasReferencia) > 0:
if FrecuenciasReferencia[0] != 0:
DarkResonance1Frequency.append(FrecuenciasReferencia[0])
DarkResonance1Fluorescence.append()
if FrecuenciasReferencia[1] != 0:
DarkResonance2Frequency.append(FrecuenciasReferencia[1])
DarkResonance2Fluorescence.append(0)
if FrecuenciasReferencia[2] != 0:
DarkResonance3Frequency.append(FrecuenciasReferencia[2])
DarkResonance3Fluorescence.append(0)
if FrecuenciasReferencia[3] != 0:
DarkResonance4Frequency.append(FrecuenciasReferencia[3])
DarkResonance4Fluorescence.append(0)
if FrecuenciasReferencia[4] != 0:
DarkResonance5Frequency.append(FrecuenciasReferencia[4])
DarkResonance5Fluorescence.append(0)
if FrecuenciasReferencia[5] != 0:
DarkResonance6Frequency.append(FrecuenciasReferencia[5])
DarkResonance6Fluorescence.append(0)
i = i + 1
return DarkResonance1Frequency, DarkResonance1Fluorescence, DarkResonance2Frequency, DarkResonance2Fluorescence, DarkResonance3Frequency, DarkResonance3Fluorescence, DarkResonance4Frequency, DarkResonance4Fluorescence, DarkResonance5Frequency, DarkResonance5Fluorescence, DarkResonance6Frequency, DarkResonance6Fluorescence, FrecuenciasReferenciaBase
def PerformExperiment_8levels(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None):
"""
Hace un experimento barriendo ángulos de repump con el angulo de doppler fijo.
solvemode=1: resuelve con np.linalg.solve
solvemode=2: resuelve invirtiendo L con la funcion np.linalg.inv
"""
Fluovectors = []
for titaprobe in titaprobeVec:
tinicial = time.time()
ProbeDetuningVectorL, Fluovector = CPTspectrum8levels(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, freqMin=freqMin, freqMax=freqMax, freqStep=freqStep, plot=False, solvemode=1)
tfinal = time.time()
print('Done angle ', titarepump, ' Total time: ', round((tfinal-tinicial), 2), "s")
if plot:
plt.figure()
plt.xlabel('Repump detuning (MHz')
plt.ylabel('Fluorescence (A.U.)')
plt.plot(ProbeDetuningVectorL, Fluovector, label=str(titarepump)+'º tita repump, T: ' + str(T*1e3) + ' mK')
plt.legend()
Fluovectors.append(Fluovector)
if len(titaprobeVec) == 1: #esto es para que no devuelva un vector de vectores si solo fijamos un angulo
Fluovectors = Fluovector
return ProbeDetuningVectorL, Fluovectors
def PerformExperiment_8levels_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None):
"""
Hace un experimento barriendo ángulos de repump con el angulo de doppler fijo.
solvemode=1: resuelve con np.linalg.solve
solvemode=2: resuelve invirtiendo L con la funcion np.linalg.inv
"""
Fluovectors = []
for titaprobe in titaprobeVec:
tinicial = time.time()
ProbeDetuningVectorL, Fluovector = CPTspectrum8levels_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, freqMin=freqMin, freqMax=freqMax, freqStep=freqStep, plot=False, solvemode=1)
tfinal = time.time()
print('Done angle ', titarepump, ' Total time: ', round((tfinal-tinicial), 2), "s")
if plot:
plt.figure()
plt.xlabel('Repump detuning (MHz')
plt.ylabel('Fluorescence (A.U.)')
plt.plot(ProbeDetuningVectorL, Fluovector, label=str(titarepump)+'º tita repump, T: ' + str(T*1e3) + ' mK')
plt.legend()
Fluovectors.append(Fluovector)
if len(titaprobeVec) == 1: #esto es para que no devuelva un vector de vectores si solo fijamos un angulo
Fluovectors = Fluovector
return ProbeDetuningVectorL, Fluovectors
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 1 17:58:39 2020
@author: oem
"""
import os
import numpy as np
#os.chdir('/home/oem/Nextcloud/G_liaf/liaf-TrampaAnular/Código General/EIT-CPT/Buenos Aires/Experiment Simulations/CPT scripts/Eight Level 2 repumps')
from threeLevel_2repumps_AnalysisFunctions import CalculoTeoricoDarkResonances_8levels, GetMinimaInfo, GetPlotsofFluovsAngle_8levels, PerformExperiment_8levels, FindDRFrequencies, FindRelativeFluorescencesOfDR, GenerateNoisyCPT, SmoothNoisyCPT, GetFinalMaps, GenerateNoisyCPT_fixedRabi, GenerateNoisyCPT_fit
import matplotlib.pyplot as plt
import time
from threeLevel_2repumps_AnalysisFunctions import MeasureRelativeFluorescenceFromCPT, IdentifyPolarizationCoincidences, RetrieveAbsoluteCoincidencesBetweenMaps, GetClosestIndex
#C:\Users\Usuario\Nextcloud\G_liaf\liaf-TrampaAnular\Código General\EIT-CPT\Buenos Aires\Experiment Simulations\CPT scripts\Eight Level 2 repumps
ub = 9.27e-24
h = 6.63e-34
c = (ub/h)*1e-4 #en unidades de MHz/G
#u = 1e6
u = 33.5e6
B = (u/(2*np.pi))/c
#sg, sp = 0.6, 5 #parámetros de control, saturación del doppler y repump
#rabG, rabP = sg*gPS, sp*gPD #frecuencias de rabi
gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 #anchos de linea de las transiciones
lw = 0.1
DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth = lw, lw, lw #ancho de linea de los laseres
DetDoppler = -36 #42
DetRepumpVec = [DetDoppler+29.6]
Tvec = [0.7] #temperatura en mK
alpha = 0*(np.pi/180) #angulo entre los láseres
phidoppler, titadoppler = 0, 90
phirepump, titarepump = 0, 0
phiprobe = 0
titaprobe = 90
#Calculo las resonancias oscuras teóricas
#ResonanciasTeoricas, DRPositivas = CalculoTeoricoDarkResonances_8levels(u/(2*np.pi*1e6), titadoppler, DetDoppler, DetRepump)
#Parametros de la simulacion cpt
center = -45
span = 80
freqMin = center-span*0.5
freqMax = center+span*0.5
""" parametros para tener espectros coherentes
freqMin = -56
freqMax = 14
"""
freqStep = 1e-1
noiseamplitude = 0
RelMinMedido0Vector = []
RelMinMedido1Vector = []
RelMinMedido2Vector = []
RelMinMedido3Vector = []
RelMinMedido4Vector = []
#Sr = np.arange(0, 10, 0.2)
#Sg = np.arange(0.01, 1, 0.05)
#Sp = np.arange(0.1, 6.1, 1)
#Sg = [0.6**2]
#Sp = [2.3**2]
Sg = [1.4]
Sp = [6]
Sr = [11]
i = 0
save = False
showFigures = True
if not showFigures:
plt.ioff()
else:
plt.ion()
fig1, ax1 = plt.subplots()
offsetx = 464
ax1.plot([f-offsetx for f in FreqsDR], CountsDR, 'o')
run = True
Scale = 730
Offset = 600 #600 para 20k cuentas aprox
MaxCoherenceValue = []
for sg in Sg:
for sp in Sp:
rabG, rabP = sg*gPS, sp*gPD
for Ti in Tvec:
T = Ti*1e-3
for DetRepump in DetRepumpVec:
print(T)
for sr in Sr:
rabR = sr*gPD
#MeasuredFreq, MeasuredFluo = GenerateNoisyCPT(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, [titaprobe], phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None, noiseamplitude=noiseamplitude)
if run:
MeasuredFreq4, MeasuredFluo4 = GenerateNoisyCPT_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, [titaprobe], phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None, noiseamplitude=noiseamplitude)
#SmoothFluo = SmoothNoisyCPT(MeasuredFluo, window=9, poly=2)
SmoothFluo4 = MeasuredFluo4
#Scale = max(BestC)/max([100*s for s in SmoothFluo4])
ax1.plot(MeasuredFreq4, [Scale*100*f + Offset for f in SmoothFluo4], label=f'Sr = {sr}')
ax1.axvline(DetDoppler, linestyle='--', linewidth=1)
#if sr != 0:
#ax1.axvline(DetRepump, linestyle='--', linewidth=1)
MaxCoherenceValue.append(np.max(SmoothFluo4))
#print(titaprobe)
ax1.set_xlabel('Detuning Rebombeo (MHz)')
ax1.set_ylabel('Fluorescencia (AU)')
ax1.set_title(f'B: {round(B, 2)} G, Sdop: {round(sg, 2)}, Sp: {round(sp, 2)}, Sr: {round(sr, 2)}, lw: {lw} MHz, T: {Ti} mK')
#ax1.set_ylim(0, 8)
#ax1.axvline(DetDoppler, linestyle='dashed', color='red', linewidth=1)
#ax1.axvline(DetRepump, linestyle='dashed', color='black', linewidth=1)
#ax1.set_title('Pol Doppler y Repump: Sigma+ Sigma-, Pol Probe: PI')
#ax1.legend()
ax1.grid()
print (f'{i+1}/{len(Sg)*len(Sp)}')
i = i + 1
if save:
plt.savefig(f'Mapa_plots_100k_1mk/CPT_SMSM_sdop{round(sg, 2)}_sp{round(sp, 2)}_sr{round(sr, 2)}.jpg')
ax1.legend()
"""
plt.figure()
plt.plot(Sr, MaxCoherenceValue, 'o')
plt.xlabel('Sr')
plt.ylabel('Coherence')
"""
"""
plt.figure()
plt.plot(MeasuredFreq, [100*f for f in SmoothFluo], color='darkred')
plt.xlabel('Desintonía 866 (MHz)')
plt.ylabel('Fluorescencia (A.U.)')
plt.axvline(-30, color='darkblue', linewidth=1.2, linestyle='--')
plt.yticks(np.arange(0.4, 1.8, 0.2))
plt.ylim(0.5, 1.6)
plt.grid()
plt.figure()
plt.plot(MeasuredFreq4, [100*f for f in SmoothFluo4], color='darkred')
plt.xlabel('Desintonía 866 (MHz)')
plt.ylabel('Fluorescencia (A.U.)')
plt.axvline(-30, color='darkblue', linewidth=1.2, linestyle='--')
plt.yticks(np.arange(0.8, 2.4, 0.4))
plt.grid()
"""
#%%
from scipy.optimize import curve_fit
T = 0.5e-3
sg = 0.7
sp = 6
sr = 0
DetDoppler = -14
DetRepump = 0
FitsSp = []
FitsOffset = []
Sg = [0.87]
def FitEIT(freqs, SP, offset):
MeasuredFreq, MeasuredFluo = GenerateNoisyCPT_fit(0.87, sr, SP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, [titaprobe], phirepump, titarepump, freqs, plot=False, solvemode=1, detpvec=None, noiseamplitude=noiseamplitude)
FinalFluo = [f*43000 + 2685 for f in MeasuredFluo]
return FinalFluo
freqs = [f-offsetx+32 for f in FreqsDR]
freqslong = np.arange(min(freqs), max(freqs)+freqs[1]-freqs[0], 0.1*(freqs[1]-freqs[0]))
popt, pcov = curve_fit(FitEIT, freqs, CountsDR, p0=[5, 700], bounds=(0, [10, 1e6]))
FitsSp.append(popt[0])
FitsOffset.append(popt[1])
print(popt)
FittedEIT = FitEIT(freqslong, *popt)
plt.figure()
plt.errorbar(freqs, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', capsize=2, markersize=2)
plt.plot(freqslong, FitEIT(freqslong, *popt))
plt.title(f'Sdop: {round(popt[0], 2)}, Spr: {round(popt[1], 2)}, T: {T*1e3} mK, detDop: {DetDoppler} MHz')
np.savetxt('CPT_measured.txt', np.transpose([freqs, CountsDR]))
np.savetxt('CPT_fitted.txt', np.transpose([freqslong, FittedEIT]))
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 7 22:30:01 2020
@author: nico
"""
import numpy as np
import time
import matplotlib.pyplot as plt
from scipy.signal import argrelextrema
"""
Scripts para el calculo de la curva CPT
"""
def H0matrix(Detg, Detp, u):
"""
Calcula la matriz H0 en donde dr es el detuning del doppler, dp es el retuning del repump y u es el campo magnético en Hz/Gauss.
Para esto se toma la energía del nivel P como 0
"""
eigenEnergies = (Detg-u, Detg+u, -u/3, u/3, Detp-6*u/5, Detp-2*u/5, Detp+2*u/5, Detp+6*u/5) #pagina 26 de Oberst. los lande del calcio son iguales a Bario.
H0 = np.diag(eigenEnergies)
return H0
def HImatrix(rabG, rabP, phidoppler, titadoppler, phiprobe, titaprobe):
"""
Calcula la matriz de interacción Hsp + Hpd, en donde rabR es la frecuencia de rabi de la transición Doppler SP,
rabP es la frecuencia de rabi de la transición repump DP, y las componentes ei_r y ei_p son las componentes de la polarización
del campo eléctrico incidente de doppler y repump respectivamente. Deben estar normalizadas a 1
"""
HI = np.zeros((8, 8), dtype=np.complex_)
i, j = 1, 3
HI[i-1, j-1] = (rabG/np.sqrt(3)) * np.cos(titadoppler)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 1, 4
HI[i-1, j-1] = -(rabG/np.sqrt(3)) * np.sin(titadoppler)*np.exp(1j*phidoppler)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 2, 3
HI[i-1, j-1] = -(rabG/np.sqrt(3)) * np.sin(titadoppler)*np.exp(-1j*phidoppler)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 2, 4
HI[i-1, j-1] = -(rabG/np.sqrt(3)) * np.cos(titadoppler)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 3, 5
HI[i-1, j-1] = -(rabP/2) * np.sin(titaprobe)*np.exp(-1j*phiprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 3, 6
HI[i-1, j-1] = -(rabP/np.sqrt(3)) * np.cos(titaprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 3, 7
HI[i-1, j-1] = rabP/np.sqrt(12) * np.sin(titaprobe)*np.exp(1j*phiprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 4, 6
HI[i-1, j-1] = -(rabP/np.sqrt(12)) * np.sin(titaprobe)*np.exp(-1j*phiprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 4, 7
HI[i-1, j-1] = -(rabP/np.sqrt(3)) * np.cos(titaprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 4, 8
HI[i-1, j-1] = (rabP/2) * np.sin(titaprobe)*np.exp(1j*phiprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
return HI
def Lplusminus(detr, detp, phirepump, titarepump, forma=1):
Hintplus = np.zeros((8, 8), dtype=np.complex_)
Hintminus = np.zeros((8, 8), dtype=np.complex_)
Hintplus[4, 2] = (-1/2)*np.sin(titarepump)*np.exp(1j*phirepump)
Hintplus[5, 2] = (-1/np.sqrt(3))*np.cos(titarepump)
Hintplus[6, 2] = (1/(2*np.sqrt(3)))*np.sin(titarepump)*np.exp(-1j*phirepump)
Hintplus[5, 3] = (-1/(2*np.sqrt(3)))*np.sin(titarepump)*np.exp(1j*phirepump)
Hintplus[6, 3] = (-1/np.sqrt(3))*np.cos(titarepump)
Hintplus[7, 3] = (1/2)*np.sin(titarepump)*np.exp(-1j*phirepump)
Hintminus[2, 4] = (-1/2)*np.sin(titarepump)*np.exp(-1j*phirepump)
Hintminus[2, 5] = (-1/np.sqrt(3))*np.cos(titarepump)
Hintminus[2, 6] = (1/(2*np.sqrt(3)))*np.sin(titarepump)*np.exp(1j*phirepump)
Hintminus[3, 5] = (-1/(2*np.sqrt(3)))*np.sin(titarepump)*np.exp(-1j*phirepump)
Hintminus[3, 6] = (-1/np.sqrt(3))*np.cos(titarepump)
Hintminus[3, 7] = (1/2)*np.sin(titarepump)*np.exp(1j*phirepump)
if forma==1:
Lplus = np.zeros((64, 64), dtype=np.complex_)
Lminus = np.zeros((64, 64), dtype=np.complex_)
DeltaBar = np.zeros((64, 64), dtype=np.complex_)
for r in range(8):
for q in range(8):
for k in range(8):
for j in range(8):
if j==q:
if (k==2 or k==3) and r > 3:
Lplus[r*8+q][k*8+j] = (-1j)*(Hintplus[r,k])
if (r==2 or r==3) and k > 3:
Lminus[r*8+q][k*8+j] = (-1j)*(Hintminus[r,k])
elif r==k:
if (q==2 or q==3) and j > 3:
Lplus[r*8+q][k*8+j] = (-1j)*(- Hintplus[j,q])
if (j==2 or j==3) and q > 3:
Lminus[r*8+q][k*8+j] = (-1j)*(- Hintminus[j,q])
if forma==2:
deltaKro = np.diag([1, 1, 1, 1, 1, 1, 1, 1])
Lplus = (-1j)*(np.kron(Hintplus, deltaKro) - np.kron(deltaKro, Hintplus))
Lminus = (-1j)*(np.kron(Hintminus, deltaKro) - np.kron(deltaKro, Hintminus))
DeltaBar = np.zeros((64, 64), dtype=np.complex_)
for i in range(64):
DeltaBar[i, i] = (1j)*(detr - detp)
return np.matrix(Lminus), np.matrix(Lplus), np.matrix(DeltaBar)
def GetL1(Lplus, Lminus, DeltaBar, L0, rabR, nmax):
"""
Devuelve Splus0 y Sminus0
"""
Sp = (-1)*(0.5*rabR)*(np.matrix(np.linalg.inv(L0 - (nmax+1)*DeltaBar))*np.matrix(Lplus))
Sm = (-1)*(0.5*rabR)*(np.matrix(np.linalg.inv(L0 + (nmax+1)*DeltaBar))*np.matrix(Lminus))
for n in list(range(nmax+1))[(nmax+1)::-1][0:len(list(range(nmax+1))[(nmax+1)::-1])-1]: #jaja esto solo es para que vaya de nmax a 1 bajando. debe haber algo mas facil pero kcio
Sp = (-1)*(rabR)*(np.matrix(np.linalg.inv(L0 - n*DeltaBar + rabR*(Lminus*np.matrix(Sp))))*np.matrix(Lplus))
Sm = (-1)*(rabR)*(np.matrix(np.linalg.inv(L0 + n*DeltaBar + rabR*(Lplus*np.matrix(Sm))))*np.matrix(Lminus))
L1 = 0.5*rabR*(np.matrix(Lminus)*np.matrix(Sp) + np.matrix(Lplus)*np.matrix(Sm))
return L1
def EffectiveL(gPS, gPD, lwg, lwr, lwp):
"""
Siendo Heff = H + EffectiveL, calcula dicho EffectiveL que es (-0.5j)*sumatoria(CmDaga*Cm) que luego sirve para calcular el Liouvilliano
"""
Leff = np.zeros((8, 8), dtype=np.complex_)
Leff[0, 0] = 2*lwg
Leff[1, 1] = 2*lwg
Leff[2, 2] = ((2/3)+(1/3))*gPS + ((1/2) + (1/6) + (1/3))*gPD
Leff[3, 3] = ((2/3)+(1/3))*gPS + ((1/2) + (1/6) + (1/3))*gPD
Leff[4, 4] = 2*(lwr + lwp)
Leff[5, 5] = 2*(lwr + lwp)
Leff[6, 6] = 2*(lwr + lwp)
Leff[7, 7] = 2*(lwr + lwp)
return (-0.5j)*Leff
def CalculateSingleMmatrix(gPS, gPD, lwg, lwr, lwp):
"""
Si tomamos el Liuvilliano como L = (-j)*(Heff*deltak - Heffdaga*deltak) + sum(Mm),
esta funcion calcula dichos Mm, que tienen dimensión 64x64 ya que esa es la dimensión del L. Estas componentes
salen de hacer la cuenta a mano conociendo los Cm y considerando que Mm[8*(r-1)+s, 8*(k-1)+j] = Cm[r,l] + Cmdaga[j,s] = Cm[r,l] + Cm[s,j]
ya que los componentes de Cm son reales.
Esta M es la suma de las 8 matrices M.
"""
M = np.matrix(np.zeros((64, 64), dtype=np.complex_))
M[0,27] = (2/3)*gPS
M[9,18] = (2/3)*gPS
M[0,18] = (1/3)*gPS
M[1,19] = -(1/3)*gPS
M[8,26] = -(1/3)*gPS
M[9,27] = (1/3)*gPS
M[36,18] = (1/2)*gPD
M[37,19] = (1/np.sqrt(12))*gPD
M[44,26] = (1/np.sqrt(12))*gPD
M[45,27] = (1/6)*gPD
M[54,18] = (1/6)*gPD
M[55,19] = (1/np.sqrt(12))*gPD
M[62,26] = (1/np.sqrt(12))*gPD
M[63,27] = (1/2)*gPD
M[45,18] = (1/3)*gPD
M[46,19] = (1/3)*gPD
M[53,26] = (1/3)*gPD
M[54,27] = (1/3)*gPD
M[0,0] = 2*lwg
M[1,1] = 2*lwg
M[8,8] = 2*lwg
M[9,9] = 2*lwg
factor1 = 1
factor2 = 1
factor3 = 1
factor4 = 1
#M[36, 45] = lwp
M[36,36] = 2*(lwr + factor1*lwp)
M[37,37] = 2*(lwr + factor1*lwp)
M[38,38] = 2*(lwr + factor1*lwp)
M[39,39] = 2*(lwr + factor1*lwp)
M[44,44] = 2*(lwr + factor2*lwp)
M[45,45] = 2*(lwr + factor2*lwp)
M[46,46] = 2*(lwr + factor2*lwp)
M[47,47] = 2*(lwr + factor2*lwp)
M[52,52] = 2*(lwr + factor3*lwp)
M[53,53] = 2*(lwr + factor3*lwp)
M[54,54] = 2*(lwr + factor3*lwp)
M[55,55] = 2*(lwr + factor3*lwp)
M[60,60] = 2*(lwr + factor4*lwp)
M[61,61] = 2*(lwr + factor4*lwp)
M[62,62] = 2*(lwr + factor4*lwp)
M[63,63] = 2*(lwr + factor4*lwp)
return M
def dopplerBroadening(wlg, wlp, alpha, T, mcalcio = 6.655e-23*1e-3):
"""
Calcula el broadening extra semiclásico por temperatura considerando que el ion atrapado se mueve.
wlg es la longitud de onda doppler, wlp la longitud de onda repump, T la temperatura del ion en kelvin, y alpha (en rads) el ángulo
que forman ambos láseres.
"""
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))
return gammaD
def FullL_efficient(rabG, rabR, rabP, gPS = 0, gPD = 0, Detg = 0, Detr = 0, Detp = 0, u = 0, lwg = 0, lwr=0, lwp = 0,
phidoppler=0, titadoppler=0, phiprobe=0, titaprobe=0, phirepump=0, titarepump=0, T = 0, alpha = 0):
"""
Calcula el Liouvilliano total de manera explícita índice a índice. Suma aparte las componentes de las matrices M.
Es la más eficiente hasta ahora.
"""
db = dopplerBroadening(0.397e-6, 0.866e-6, alpha, T)
#lwr = np.sqrt(lwr**2 + dopplerBroadening(0.397e-6, 0.866e-6, alpha, T)**2)
lwg = np.sqrt(lwg**2 + db**2)
lwr = np.sqrt(lwr**2 + db**2)
CC = EffectiveL(gPS, gPD, lwg, lwr, lwp)
Heff = H0matrix(Detg, Detp, u) + HImatrix(rabG, rabP, phidoppler, titadoppler, phiprobe, titaprobe) + CC
Heffdaga = np.matrix(Heff).getH()
Lfullpartial = np.zeros((64, 64), dtype=np.complex_)
for r in range(8):
for q in range(8):
for k in range(8):
for j in range(8):
if j!=q and r!=k:
pass
elif j==q and r!=k:
if (r < 2 and k > 3) or (k < 2 and r > 3) or (r > 3 and k > 3) or (r==0 and k==1) or (r==1 and k==0) or (r==2 and k==3) or (r==3 and k==2): #todo esto sale de analizar explicitamente la matriz y tratar de no calcular cosas de más que dan cero
pass
else:
Lfullpartial[r*8+q][k*8+j] = (-1j)*(Heff[r,k])
elif j!=q and r==k:
if (j < 2 and q > 3) or (q < 2 and j > 3) or (j > 3 and q > 3) or (j==0 and q==1) or (j==1 and q==0) or (j==2 and q==3) or (j==3 and q==2):
pass
else:
Lfullpartial[r*8+q][k*8+j] = (-1j)*(-Heffdaga[j,q])
else:
if Heff[r,k] == Heffdaga[j,q]:
pass
else:
Lfullpartial[r*8+q][k*8+j] = (-1j)*(Heff[r,k]-Heffdaga[j,q])
M = CalculateSingleMmatrix(gPS, gPD, lwg, lwr, lwp)
L0 = np.array(np.matrix(Lfullpartial) + M)
nmax = 1
Lminus, Lplus, DeltaBar = Lplusminus(Detr, Detp, phirepump, titarepump)
factor1 = np.exp(1j*0.2*np.pi)
factor2 = np.exp(-1j*0.2*np.pi)
#print(factor)
L1 = GetL1(factor1*Lplus, factor2*Lminus, DeltaBar, L0, rabR, nmax)
Lfull = L0 + L1
#NORMALIZACION DE RHO
i = 0
while i < 64:
if i%9 == 0:
Lfull[0, i] = 1
else:
Lfull[0, i] = 0
i = i + 1
return Lfull
"""
Scripts para correr un experimento y hacer el análisis de los datos
"""
def CalculoTeoricoDarkResonances(u, titadoppler):
if titadoppler==0:
NegativeDR = [(-7/5)*u, (-3/5)*u, (-1/5)*u, (1/5)*u, (3/5)*u, (7/5)*u]
elif titadoppler==90:
NegativeDR = [(-11/5)*u, (-7/5)*u, (-3/5)*u, (3/5)*u, (7/5)*u, (11/5)*u]
PositiveDR = [(-8/5)*u, (-4/5)*u, 0, (4/5)*u, (8/5)*u]
return NegativeDR, PositiveDR
def CPTspectrum8levels(rabG, rabR, rabP, gPS, gPD, Detg, Detr, u, lwg, lwr, lwp, Temp, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump,
freqMin=-100, freqMax=100, freqStep=1e-1, plot=False, solvemode=1):
"""
Hace un experimento barriendo ángulos de repump con el angulo de doppler fijo.
solvemode=1: resuelve con np.linalg.solve
solvemode=2: resuelve invirtiendo L con la funcion np.linalg.inv
"""
phidoppler, titadoppler = phidoppler*(np.pi/180), titadoppler*(np.pi/180)
phiprobe, titaprobe = phiprobe*(np.pi/180), titaprobe*(np.pi/180)
phirepump, titarepump = phirepump*(np.pi/180), titarepump*(np.pi/180)
DetProbeVector = 2*np.pi*np.arange(freqMin*1e6, freqMax*1e6, freqStep*1e6)
Detg, Detr = 2*np.pi*Detg*1e6, 2*np.pi*Detr*1e6
lwg, lwr, lwp = 2*np.pi*lwg*1e6, 2*np.pi*lwr*1e6, 2*np.pi*lwp*1e6
#u = 2*np.pi*u*1e6
Fluovector = []
tinicial = time.time()
for Detp in DetProbeVector:
L = FullL_efficient(rabG, rabR, rabP, gPS, gPD, Detg, Detr, Detp, u, lwg, lwr, lwp, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, Temp, alpha)
if solvemode == 1:
rhovectorized = np.linalg.solve(L, np.array([int(i==0) for i in range(64)]))
Fluo = np.real(rhovectorized[18] + np.real(rhovectorized[27])) #estos son los rho33 + rho44
Fluovector.append(Fluo)
if solvemode == 2:
Linv = np.linalg.inv(L)
rhovectorized = [Linv[j][0] for j in range(len(Linv))]
Fluo = np.real(rhovectorized[18] + np.real(rhovectorized[27])) #estos son los rho33 + rho44
Fluovector.append(Fluo)
tfinal = time.time()
print('Done, Total time: ', round((tfinal-tinicial), 2), "s")
DetProbeVectorMHz = np.arange(freqMin, freqMax, freqStep)
if plot:
plt.xlabel('Probe detuning (MHz)')
plt.ylabel('Fluorescence (A.U.)')
plt.plot(DetProbeVectorMHz, [100*f for f in Fluovector], label=str(titaprobe) + 'º, T: ' + str(Temp*1e3) + ' mK')
plt.legend()
return DetProbeVectorMHz, Fluovector
def CPTspectrum8levels_fixedRabi(sg, sr, sp, gPS, gPD, Detg, Detr, u, lwg, lwr, lwp, Temp, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump,
freqMin=-100, freqMax=100, freqStep=1e-1, plot=False, solvemode=1):
"""
Hace un experimento barriendo ángulos de repump con el angulo de doppler fijo.
solvemode=1: resuelve con np.linalg.solve
solvemode=2: resuelve invirtiendo L con la funcion np.linalg.inv
"""
phidoppler, titadoppler = phidoppler*(np.pi/180), titadoppler*(np.pi/180)
phiprobe, titaprobe = phiprobe*(np.pi/180), titaprobe*(np.pi/180)
phirepump, titarepump = phirepump*(np.pi/180), titarepump*(np.pi/180)
DetProbeVector = 2*np.pi*np.arange(freqMin*1e6, freqMax*1e6, freqStep*1e6)
Detg, Detr = 2*np.pi*Detg*1e6, 2*np.pi*Detr*1e6
#lwg, lwr, lwp = 2*np.pi*lwg*1e6, 2*np.pi*lwr*1e6, 2*np.pi*lwp*1e6
lwg, lwr, lwp = lwg*1e6, lwr*1e6, lwp*1e6
rabG = sg*gPS
rabR = sr*gPD
rabP = sp*gPD
#u = 2*np.pi*u*1e6
Fluovector = []
tinicial = time.time()
for Detp in DetProbeVector:
L = FullL_efficient(rabG, rabR, rabP, gPS, gPD, Detg, Detr, Detp, u, lwg, lwr, lwp, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, Temp, alpha)
if solvemode == 1:
coh = 5
rhovectorized = np.linalg.solve(L, np.array([int(i==0) for i in range(64)]))
#Fluo = np.abs(rhovectorized[coh])
Fluo = np.real(rhovectorized[18] + np.real(rhovectorized[27])) #estos son los rho33 + rho44
Fluovector.append(Fluo)
if solvemode == 2:
Linv = np.linalg.inv(L)
rhovectorized = [Linv[j][0] for j in range(len(Linv))]
Fluo = np.real(rhovectorized[18] + np.real(rhovectorized[27])) #estos son los rho33 + rho44
Fluovector.append(Fluo)
tfinal = time.time()
print('Done, Total time: ', round((tfinal-tinicial), 2), "s")
DetProbeVectorMHz = np.arange(freqMin, freqMax, freqStep)
if plot:
plt.xlabel('Probe detuning (MHz)')
plt.ylabel('Fluorescence (A.U.)')
plt.plot(DetProbeVectorMHz, [100*f for f in Fluovector], label=str(titaprobe) + 'º, T: ' + str(Temp*1e3) + ' mK')
plt.legend()
return DetProbeVectorMHz, Fluovector
#%%
if __name__ == "__main__":
ub = 9.27e-24
h = 6.63e-34
c = (ub/h)*1e-4 #en unidades de MHz/G
B = 25 #campo magnetico en gauss
u = c*B
sg, sr, sp = 0.5, 1.5, 4 #parámetros de saturación del doppler y repump
gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 #anchos de linea de las transiciones
rabG, rabR, rabP = sg*gPS, sr*gPD, sp*gPD #frecuencias de rabi
lwg, lwr, lwp = 0.3, 0.3, 0.3 #ancho de linea de los laseres
Detg = -25
Detr = 20 #detuning del doppler y repump
Temp = 0.0e-3 #temperatura en K
alpha = 0*(np.pi/180) #angulo entre los láseres
phidoppler, titadoppler = 0, 90
phirepump, titarepump = 0, 90
phiprobe, titaprobe = 0, 90
plotCPT = False
freqMin = -50
freqMax = 50
freqStep = 5e-2
Frequencyvector, Fluovector = CPTspectrum8levels(rabG, rabR, rabP, gPS, gPD, Detg, Detr, u, lwg, lwr, lwp, Temp, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, freqMin=freqMin, freqMax=freqMax, freqStep=freqStep, plot=plotCPT, solvemode=1)
NegativeDR, PositiveDR = CalculoTeoricoDarkResonances(u/(2*np.pi*1e6), titadoppler)
plt.plot(Frequencyvector, [100*f for f in Fluovector], label=str(titaprobe) + 'º, T: ' + str(Temp*1e3) + ' mK')
plt.xlabel('Probe detuning (MHz)')
plt.ylabel('Fluorescence (A.U.)')
for PDR in PositiveDR:
plt.axvline(Detr+PDR, linestyle='--', linewidth=0.5, color='red')
for NDR in NegativeDR:
plt.axvline(Detg+NDR, linestyle='--', linewidth=0.5, color='blue')
#parametros que andan piola:
"""
ub = 9.27e-24
h = 6.63e-34
c = (ub/h)*1e-4 #en unidades de MHz/G
B = 17 #campo magnetico en gauss
u = c*B
#u = 80e6
sr, sp = 0.53, 4.2
gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6
rabR, rabP = sr*gPS, sp*gPD
lw = 2*np.pi * 0.33e6
lwr, lwp = lw, lw #ancho de linea de los laseres
dr_spec = - 2*np.pi* 26e6
freqSteps = 500
freqMin = -100e6
freqMax = 100e6
dps = 2*np.pi*np.linspace(freqMin, freqMax, freqSteps)
#dps = [-30e6]
alfar = 90*(np.pi/180)
ex_r, ey_r, ez_r = np.sin(alfar)*np.cos(0), np.sin(alfar)*np.sin(0), np.cos(alfar)
alfap = 90*(np.pi/180)
ex_p, ey_p, ez_p = np.sin(alfap)*np.cos(0), np.sin(alfap)*np.sin(0), np.cos(alfap)
"""
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="309.89169mm"
height="246.71114mm"
viewBox="0 0 309.89169 246.71113"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
sodipodi:docname="Dibujoconespectroseiones.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.69664703"
inkscape:cx="694.03871"
inkscape:cy="543.31675"
inkscape:window-width="1846"
inkscape:window-height="1016"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(76.095078,48.989001)">
<circle
style="fill:#00ffff;stroke:#808080;stroke-width:0.465;stroke-linejoin:round"
id="path31"
cx="89.419563"
cy="44.529404"
r="4.4136381" />
<circle
style="fill:#00ffff;stroke:#808080;stroke-width:0.465;stroke-linejoin:round"
id="path31-3"
cx="108.53767"
cy="58.236534"
r="4.4136381" />
<circle
style="fill:#00ffff;stroke:#808080;stroke-width:0.465;stroke-linejoin:round"
id="path31-6"
cx="61.067684"
cy="45.801949"
r="4.4136381" />
<circle
style="fill:#00ffff;stroke:#808080;stroke-width:0.465;stroke-linejoin:round"
id="path31-7"
cx="80.536278"
cy="65.300217"
r="4.4136381" />
<circle
style="fill:#00ffff;stroke:#808080;stroke-width:0.465;stroke-linejoin:round"
id="path31-5"
cx="103.87627"
cy="81.574669"
r="4.4136381" />
<circle
style="fill:#00ffff;stroke:#808080;stroke-width:0.465;stroke-linejoin:round"
id="path31-35"
cx="46.963703"
cy="66.363197"
r="4.4136381" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.71292px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="44.822308"
y="69.246071"
id="text6992"><tspan
sodipodi:role="line"
id="tspan6990"
style="stroke-width:0.264583"
x="44.822308"
y="69.246071">2</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.71292px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="59.07151"
y="48.27179"
id="text6992-6"><tspan
sodipodi:role="line"
id="tspan6990-2"
style="stroke-width:0.264583"
x="59.07151"
y="48.27179">3</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.71292px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="87.072014"
y="47.188446"
id="text6992-6-9"><tspan
sodipodi:role="line"
id="tspan6990-2-1"
style="stroke-width:0.264583"
x="87.072014"
y="47.188446">4</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.71292px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="106.24758"
y="61.080338"
id="text6992-6-2"><tspan
sodipodi:role="line"
id="tspan6990-2-7"
style="stroke-width:0.264583"
x="106.24758"
y="61.080338">5</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.71292px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="101.70933"
y="83.80732"
id="text6992-6-0"><tspan
sodipodi:role="line"
id="tspan6990-2-9"
style="stroke-width:0.264583"
x="101.70933"
y="83.80732">6</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.71292px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="78.262543"
y="68.211586"
id="text6992-6-3"><tspan
sodipodi:role="line"
id="tspan6990-2-6"
style="stroke-width:0.264583"
x="78.262543"
y="68.211586">7</tspan></text>
<ellipse
style="fill:none;stroke:#ff0000;stroke-width:0.465063;stroke-linejoin:round"
id="path22811"
cx="7.103251"
cy="107.58765"
rx="10.555157"
ry="47.827599"
transform="matrix(0.64934741,-0.76049191,0.74524775,0.66678766,0,0)" />
<ellipse
style="fill:none;stroke:#008000;stroke-width:0.465166;stroke-linejoin:round"
id="path22811-0"
cx="24.88133"
cy="108.60269"
rx="6.5458894"
ry="29.90551"
transform="matrix(0.67220939,-0.74036108,0.76517273,0.64382505,0,0)" />
<ellipse
style="fill:none;stroke:#0000ff;stroke-width:0.465162;stroke-linejoin:round"
id="path22811-0-6"
cx="-17.490559"
cy="79.897964"
rx="4.4231157"
ry="20.004084"
transform="matrix(0.64401099,-0.76501624,0.74052609,0.67202761,0,0)" />
<image
width="106.3625"
height="69.320831"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,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
5+cdvfDCC8iRjI2NfeuttwBg6dKl+/fvD/KFwwyN0VNKjRkZTCYTuvPHjRu3c+fO2tra//3f//3j
H/94/Pjxurq68+fPkyS5ZMmSb775hs/nHzx4sLq62m63T5061deqB3v27BGJRBcuXLBYLLNnz374
4YcBoLq6+tq1a0lJSbNnzz5z5syMGTNWrlx56NCh6dOnd3d3c7ncF1544ZNPPvnggw9u3rxpsVhy
c3OpF7x48aLriI8giAULFlRUVOh0uiVLljQ2NlJPrV69msvlAoDVaqXRaADw5z//GQBu375dVFS0
du1aACgoKHjzzTeH4UJiAgfLFmZwoEEi2m5qakpNTb3//vsB4Pjx48ePH8/PzwcAg8FQV1en1+uf
eOIJHo8HAEuWLPH1gsePH798+TKKN+l0urq6OhaLNWPGDLlcDgAogiYSiRITE6dPnw4AqAHDk08+
+dvf/rakpOTjjz9G+kKhVCrdFj1++umn/+d//ken07333ntvv/02tX///v0FBQXojTz22GNop9ls
fvLJJz/88MPU1FQAiIuLa21tHeJFwwQXLFuYIcHn89EGSZKvv/76T3/6U+qpDz74wLMVCYPBQFEw
s9lMnfj73/++qKiIOqayshI1kwMAOp2OKmzdXorH4y1cuLC8vPzw4cNuSxxzuVzqxREzZsy4evUq
l8udMGFCv+/oxRdfXLZs2YIFC9BDs9mMPDJM+IBjW5jgUFRU9PHHHxsMBgBQKBQdHR1z5sw5evSo
yWTS6/V///vf0WFpaWlVVVUAgNwrdOJHH31ks9kA4ObNm0aj0fPFs7KyWltbUW85vV5vt9sB4IUX
XvjlL385ffp0tw632dnZ9fX1bq+wY8cOVz/LF3/4wx/0ev1rr71G7bl586bXSUZMCMHeFiY4PPzw
w9evX581axYAREVF/d///d/UqVNXrlyZl5eXmpr64IMPosNeffXVp5566tNPP503bx7a88ILLzQ1
NaGeObGxsaj5shssFuvQoUO/+MUvTCYTl8v96quvoqKipk2bJhQK161b53ZwVlaWTqfT6/UCgYDa
iXqQ9su7777LZDJR8O7FF1988cUXT5069eijjw7+emCGEdwBAjMSbNu2LSoq6tVXXw3ia7a2thYW
Ft64cQNF013ZuXOnQCBAqVtDZM6cOeXl5RKJZOgvhQkWeJCIiUj27ds3c+bM7du3e2oWALz00ktU
dGwoqFSql19+GWtWuIG9LQwGE2FgbwuDwUQYWLYwGEyEgWULg8FEGFi2MBhMhIFlC4PBRBj/H2ES
RucF54dtAAAAAElFTkSuQmCC
"
id="image23249"
x="-67.637215"
y="76.273842" />
<image
width="106.3625"
height="69.320831"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,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
gg==
"
id="image23261"
x="121.43412"
y="99.117989" />
<image
width="106.3625"
height="69.320831"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,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
VE91AgAAAABJRU5ErkJggg==
"
id="image23273"
x="112.91544"
y="-20.134825" />
<rect
style="fill:none;stroke:#ff0000;stroke-width:2.00001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect23299"
width="114.33821"
height="72.985252"
x="120.37579"
y="96.511902" />
<rect
style="fill:none;stroke:#008000;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect23299-2"
width="111.48605"
height="72.3106"
x="111.85711"
y="-21.007927" />
<rect
style="fill:none;stroke:#0000ff;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect23299-6"
width="110.77615"
height="73.072784"
x="-70.463364"
y="74.686356" />
</g>
</svg>
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
#Mediciones barriendo angulo del TISA y viendo kicking de resonancias oscuras
#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/20230713_EspectrosCristal6iones/Data/')
MOTIONAL_FILES = """000013259-UV_Scan_withcal_optimized_andor
000013260-UV_Scan_withcal_optimized_andor
000013261-UV_Scan_withcal_optimized_andor
000013262-UV_Scan_withcal_optimized_andor
000013263-UV_Scan_withcal_optimized_andor
000013264-UV_Scan_withcal_optimized_andor
000013266-UV_Scan_withcal_optimized_andor
000013267-UV_Scan_withcal_optimized_andor
000013268-UV_Scan_withcal_optimized_andor
000013269-UV_Scan_withcal_optimized_andor
000013270-UV_Scan_withcal_optimized_andor
000013271-UV_Scan_withcal_optimized_andor
000013272-UV_Scan_withcal_optimized_andor
"""
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(MOTIONAL_FILES))
#%%
#carpeta pc nico labo escritorio:
#C:\Users\Usuario\Documents\artiq\artiq_experiments\analisis\plots\20211101_CPT_DosLaseres_v03\Data
CountsRoi1 = []
CountsRoi2 = []
CountsRoi3 = []
CountsRoi4 = []
CountsRoi5 = []
CountsRoi6 = []
CountsRoi7 = []
#Amplitudes = []
UV_Freqs = []
#IR_amps = []
for i, fname in enumerate(MOTIONAL_FILES.split()):
print(str(i) + ' - ' + fname)
data = h5py.File(fname+'.h5', 'r')
#Amplitudes.append(np.array(data['datasets']['amplitudes']))
CountsRoi1.append(np.array(data['datasets']['counts_roi1']))
CountsRoi2.append(np.array(data['datasets']['counts_roi2']))
CountsRoi3.append(np.array(data['datasets']['counts_roi3']))
CountsRoi4.append(np.array(data['datasets']['counts_roi4']))
CountsRoi5.append(np.array(data['datasets']['counts_roi5']))
CountsRoi6.append(np.array(data['datasets']['counts_roi6']))
CountsRoi7.append(np.array(data['datasets']['counts_roi7']))
UV_Freqs.append(np.array(data['datasets']['UV_Frequencies']))
#IR_amps.append(np.array(data['datasets']['IR1_measurement_amp']))
#%%
"""
En cristal de 7 iones (uno de ellos oscuro) veo espectros. Primero espectros uv.
La roi1 es la general. Las demas son de cada uno de los 6 ioens brillantes del cristal.
"""
i = 0
jvec=[0,1,2,3,5]
step=0.1e8
Desplazamientos = [0, 0.8*step, 1*step, -1*step, -2*step]
plt.figure()
for j in jvec:
if i in [2,4]:
#plt.errorbar(Amplitudes[j], CountsRoi1[j], yerr=np.sqrt(CountsRoi1[j]), color='red', fmt='-o', capsize=2, markersize=2)
#plt.plot(Amplitudes[j][1:], CountsRoi1[j][1:], 'o',color='red', markersize=2,label=f'UVamp: {UV_amps[j]}')
plt.plot([Desplazamientos[i]+f for f in UV_Freqs[j][1:]], CountsRoi3[j][1:], '-o', markersize=2)
i = i + 1
plt.xlabel('Frecuencia')
plt.ylabel('Cuentas ROI')
#plt.xlim(0.05,0.23)
#plt.ylim(7800,8550)
plt.grid()
plt.legend()
#%%
#mergeo mediciones porque medi variando el piezoB para tener mas rango
Frequencies_vector = []
Counts_vector = []
kfin1 = 37
kin2 = 9
for counts in [CountsRoi1, CountsRoi2, CountsRoi3, CountsRoi4, CountsRoi5, CountsRoi6, CountsRoi7]:
Frequencies_vector.append([1e-6*2*f for f in [Desplazamientos[4]+f for f in UV_Freqs[5][1:kfin1]]+list(UV_Freqs[2][kin2:])])
Counts_vector.append(list(counts[5][1:kfin1])+list(counts[2][kin2:]))
ivecs = [3,4]
#ivecs = [2, 5, 6]
#ivecs = [1]
plt.figure()
for i in range(len(Frequencies_vector)):
if i in ivecs:
plt.plot(Frequencies_vector[i], Counts_vector[i],'-o')
plt.grid()
plt.xlabel('Frequency (MHz)')
plt.ylabel('Counts')
#%%
ftrap=22.1
#ahora intento ajustarlos con modelo con micromocion
from scipy.special import jv
from scipy.optimize import curve_fit
def MicromotionSpectra(det, A, beta, x0, gamma, offset):
ftrap=22.1
#gamma=30
P = A*(jv(0, beta)**2)/(((det-x0)**2)+(0.5*gamma)**2)+offset
i = 1
#print(P)
while i <= 1:
P = P + A*((jv(i, beta))**2)/((((det-x0)+i*ftrap)**2)+(0.5*gamma)**2) + A*((jv(-i, beta))**2)/((((det-x0)-i*ftrap)**2)+(0.5*gamma)**2)
i = i + 1
#print(P)
return P
popt_vec = []
pcov_vec = []
#uso como refe k=3
jref=3
popt_ref, pcov_ref = curve_fit(MicromotionSpectra, Frequencies_vector[jref], Counts_vector[jref], p0=[1000, 2, 274, 90, 14000], bounds=((0,0,200,20,0),(1e7,100,600,1000,25650)))
freqslong = np.arange(min(Frequencies_vector[jref]), max(Frequencies_vector[jref])+100, (Frequencies_vector[jref][1]-Frequencies_vector[jref][0])*0.01)
print(popt_ref)
plt.figure()
for j in range(1,len(Frequencies_vector)):
plt.plot(Frequencies_vector[j], Counts_vector[j])
if j == jref:
plt.plot(freqslong, MicromotionSpectra(freqslong, *popt_ref))
for i in range(5):
plt.axvline(popt_ref[2]-i*ftrap, linestyle='dashed', color='black', linewidth=1, zorder=0)
plt.grid()
#%%
for i in range(len(Frequencies_vector)):
if i != jref:
popt, pcov = curve_fit(MicromotionSpectra, Frequencies_vector[i], Counts_vector[i], p0=[popt_ref[0], 5, popt_ref[2], 60, popt_ref[4]], bounds=((popt_ref[0]-0.001*popt_ref[0],0,popt_ref[2]-0.001*popt_ref[2],0,popt_ref[4]-0.001*popt_ref[4]),(popt_ref[0]+0.001*popt_ref[0],100,popt_ref[2]+0.001*popt_ref[2],300, popt_ref[4]+0.001*popt_ref[4])))
popt_vec.append(popt)
pcov_vec.append(pcov)
else:
popt_vec.append(popt_ref)
pcov_vec.append(pcov_ref)
ftrap=22.1
jeval=1
freqslong = np.arange(min(Frequencies_vector[jeval]), max(Frequencies_vector[jeval])+100, (Frequencies_vector[jeval][1]-Frequencies_vector[jeval][0])*0.01)
print(popt_vec[jeval])
plt.figure()
plt.plot(Frequencies_vector[jeval], Counts_vector[jeval])
plt.plot(freqslong, MicromotionSpectra(freqslong, *popt_ref))
plt.axvline(popt_ref[2], linestyle='dashed')
plt.axvline(popt_ref[2]-ftrap, linestyle='dashed')
plt.axvline(popt_ref[2]+ftrap, linestyle='dashed')
plt.axvline(popt_ref[2]-2*ftrap, linestyle='dashed')
plt.axvline(popt_ref[2]+2*ftrap, linestyle='dashed')
plt.axvline(popt_ref[2]-3*ftrap, linestyle='dashed')
plt.axvline(popt_ref[2]+3*ftrap, linestyle='dashed')
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 2 16:30:09 2020
@author: oem
"""
import os
import numpy as np
import time
import matplotlib.pyplot as plt
from scipy.signal import argrelextrema
from EITfit.threeLevel_2repumps_linealpol_python_scripts import CPTspectrum8levels, CPTspectrum8levels_fixedRabi
import random
from scipy.signal import savgol_filter as sf
def CalculoTeoricoDarkResonances_8levels(u, titadoppler, detuningdoppler, detuningrepump):
if titadoppler==0:
NegativeDR = [(-7/5)*u, (-3/5)*u, (-1/5)*u, (1/5)*u, (3/5)*u, (7/5)*u]
elif titadoppler==90:
NegativeDR = [(-11/5)*u, (-7/5)*u, (-3/5)*u, (3/5)*u, (7/5)*u, (11/5)*u]
else:
NegativeDR = [(-11/5)*u, (-7/5)*u, (-3/5)*u, (-1/5)*u, (1/5)*u, (3/5)*u, (7/5)*u, (11/5)*u]
PositiveDR = [(-8/5)*u, (-4/5)*u, 0, (4/5)*u, (8/5)*u]
return [detuningdoppler + dr for dr in NegativeDR], [detuningrepump + dr for dr in PositiveDR]
def GetClosestIndex(Vector, value, tolerance=1e-3):
i = 0
while i<len(Vector):
if abs(Vector[i] - value) < tolerance:
return i
else:
i = i + 1
return GetClosestIndex(Vector, value, tolerance=2*tolerance)
def FindDRFrequencies(Freq, Fluo, TeoDR, entorno=3):
"""
Busca los indices y la frecuencia de los minimos en un entorno cercano al de la DR.
Si no encuentra, devuelve el valor teórico.
"""
IndiceDRteo1, IndiceEntornoinicialDRteo1, IndiceEntornofinalDRteo1 = GetClosestIndex(Freq, TeoDR[0]), GetClosestIndex(Freq, TeoDR[0]-entorno), GetClosestIndex(Freq, TeoDR[0]+entorno)
IndiceDRteo2, IndiceEntornoinicialDRteo2, IndiceEntornofinalDRteo2 = GetClosestIndex(Freq, TeoDR[1]), GetClosestIndex(Freq, TeoDR[1]-entorno), GetClosestIndex(Freq, TeoDR[1]+entorno)
IndiceDRteo3, IndiceEntornoinicialDRteo3, IndiceEntornofinalDRteo3 = GetClosestIndex(Freq, TeoDR[2]), GetClosestIndex(Freq, TeoDR[2]-entorno), GetClosestIndex(Freq, TeoDR[2]+entorno)
IndiceDRteo4, IndiceEntornoinicialDRteo4, IndiceEntornofinalDRteo4 = GetClosestIndex(Freq, TeoDR[3]), GetClosestIndex(Freq, TeoDR[3]-entorno), GetClosestIndex(Freq, TeoDR[3]+entorno)
IndiceDRteo5, IndiceEntornoinicialDRteo5, IndiceEntornofinalDRteo5 = GetClosestIndex(Freq, TeoDR[4]), GetClosestIndex(Freq, TeoDR[4]-entorno), GetClosestIndex(Freq, TeoDR[4]+entorno)
IndiceDRteo6, IndiceEntornoinicialDRteo6, IndiceEntornofinalDRteo6 = GetClosestIndex(Freq, TeoDR[5]), GetClosestIndex(Freq, TeoDR[5]-entorno), GetClosestIndex(Freq, TeoDR[5]+entorno)
EntornoFreqDR1, EntornoFreqDR2 = Freq[IndiceEntornoinicialDRteo1:IndiceEntornofinalDRteo1], Freq[IndiceEntornoinicialDRteo2:IndiceEntornofinalDRteo2]
EntornoFreqDR3, EntornoFreqDR4 = Freq[IndiceEntornoinicialDRteo3:IndiceEntornofinalDRteo3], Freq[IndiceEntornoinicialDRteo4:IndiceEntornofinalDRteo4]
EntornoFreqDR5, EntornoFreqDR6 = Freq[IndiceEntornoinicialDRteo5:IndiceEntornofinalDRteo5], Freq[IndiceEntornoinicialDRteo6:IndiceEntornofinalDRteo6]
EntornoFluoDR1, EntornoFluoDR2 = Fluo[IndiceEntornoinicialDRteo1:IndiceEntornofinalDRteo1], Fluo[IndiceEntornoinicialDRteo2:IndiceEntornofinalDRteo2]
EntornoFluoDR3, EntornoFluoDR4 = Fluo[IndiceEntornoinicialDRteo3:IndiceEntornofinalDRteo3], Fluo[IndiceEntornoinicialDRteo4:IndiceEntornofinalDRteo4]
EntornoFluoDR5, EntornoFluoDR6 = Fluo[IndiceEntornoinicialDRteo5:IndiceEntornofinalDRteo5], Fluo[IndiceEntornoinicialDRteo6:IndiceEntornofinalDRteo6]
IndiceFluoMinimaEntorno1, IndiceFluoMinimaEntorno2 = argrelextrema(np.array(EntornoFluoDR1), np.less)[0], argrelextrema(np.array(EntornoFluoDR2), np.less)[0]
IndiceFluoMinimaEntorno3, IndiceFluoMinimaEntorno4 = argrelextrema(np.array(EntornoFluoDR3), np.less)[0], argrelextrema(np.array(EntornoFluoDR4), np.less)[0]
IndiceFluoMinimaEntorno5, IndiceFluoMinimaEntorno6 = argrelextrema(np.array(EntornoFluoDR5), np.less)[0], argrelextrema(np.array(EntornoFluoDR6), np.less)[0]
try:
FreqDR1 = EntornoFreqDR1[int(IndiceFluoMinimaEntorno1)]
IndiceDR1 = GetClosestIndex(Freq, FreqDR1)
except:
FreqDR1 = TeoDR[0]
IndiceDR1 = IndiceDRteo1
try:
FreqDR2 = EntornoFreqDR2[int(IndiceFluoMinimaEntorno2)]
IndiceDR2 = GetClosestIndex(Freq, FreqDR2)
except:
FreqDR2 = TeoDR[1]
IndiceDR2 = IndiceDRteo2
try:
FreqDR3 = EntornoFreqDR3[int(IndiceFluoMinimaEntorno3)]
IndiceDR3 = GetClosestIndex(Freq, FreqDR3)
except:
FreqDR3 = TeoDR[2]
IndiceDR3 = IndiceDRteo3
try:
FreqDR4 = EntornoFreqDR4[int(IndiceFluoMinimaEntorno4)]
IndiceDR4 = GetClosestIndex(Freq, FreqDR4)
except:
FreqDR4 = TeoDR[3]
IndiceDR4 = IndiceDRteo4
try:
FreqDR5 = EntornoFreqDR5[int(IndiceFluoMinimaEntorno5)]
IndiceDR5 = GetClosestIndex(Freq, FreqDR5)
except:
FreqDR5 = TeoDR[4]
IndiceDR5 = IndiceDRteo5
try:
FreqDR6 = EntornoFreqDR6[int(IndiceFluoMinimaEntorno6)]
IndiceDR6 = GetClosestIndex(Freq, FreqDR6)
except:
FreqDR6 = TeoDR[5]
IndiceDR6 = IndiceDRteo6
return [IndiceDR1, IndiceDR2, IndiceDR3, IndiceDR4, IndiceDR5, IndiceDR6], [FreqDR1, FreqDR2, FreqDR3, FreqDR4, FreqDR5, FreqDR6]
def FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=1, frecuenciareferenciacriterioasintotico=-100, getindices=False):
"""
Toma los indices donde estan las DR y evalua su fluorescencia. Esos indices son minimos locales en un entorno
cercano a las DR teoricas y, si no hay ningun minimo, toma la teorica.
Luego, hace el cociente de esa fluorescencia y un factor de normalización segun NormalizationCriterium:
1: Devuelve la fluorescencia absoluta de los minimos
2: Devuelve el cociente entre la fluorescencia del minimo y un valor medio entre dos puntos lejanos, como si no
hubiera una resonancia oscura y hubiera una recta. Ese valor esta a DistanciaFrecuenciaCociente del detuning del azul (el punto medio entre las dos DR en este caso)
3: Devuelve el cociente entre la fluorescencia del minimo y el valor a -100 MHz (si se hizo de -100 a 100),
o el valor limite por izquierda de la curva
4: Deuelve el cociente entre la fluorescencia del minimo y el valor de fluorescencia a detuning 0 MHz
"""
IndiceDR1, IndiceDR2, IndiceDR3, IndiceDR4, IndiceDR5, IndiceDR6 = IndicesDR[0], IndicesDR[1], IndicesDR[2], IndicesDR[3], IndicesDR[4], IndicesDR[5]
FluorescenceOfMinimums = [Fluo[IndiceDR1], Fluo[IndiceDR2], Fluo[IndiceDR3], Fluo[IndiceDR4], Fluo[IndiceDR5], Fluo[IndiceDR6]]
FrequencyOfMinimums = [Freq[IndiceDR1], Freq[IndiceDR2], Freq[IndiceDR3], Freq[IndiceDR4], Freq[IndiceDR5], Freq[IndiceDR6]]
DistanciaFrecuenciaCociente = 25
if NormalizationCriterium==0:
print('che')
return FrequencyOfMinimums, FluorescenceOfMinimums
if NormalizationCriterium==1:
Fluorescenciacerodetuning = Fluo[GetClosestIndex(Freq, 0)]
Fluorescenciaasintotica = Fluo[GetClosestIndex(Freq, frecuenciareferenciacriterioasintotico)]
return FrequencyOfMinimums, np.array([Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica])
if NormalizationCriterium==2:
k = 0
while k < len(Freq):
if Freq[k] < detuningdoppler-DistanciaFrecuenciaCociente + 2 and Freq[k] > detuningdoppler-DistanciaFrecuenciaCociente - 2:
FluoIzquierda = Fluo[k]
indiceizquierda = k
print('Izq:', Freq[k])
break
else:
k = k + 1
l = 0
while l < len(Freq):
if Freq[l] < detuningdoppler+DistanciaFrecuenciaCociente + 2 and Freq[l] > detuningdoppler+DistanciaFrecuenciaCociente - 2:
FluoDerecha = Fluo[l]
indicederecha = l
print('Der: ', Freq[l])
break
else:
l = l + 1
FluoNormDivisor = 0.5*(FluoDerecha+FluoIzquierda)
print(FluoNormDivisor)
if NormalizationCriterium==3:
#asintotico
FluoNormDivisor = Fluo[GetClosestIndex(Freq, frecuenciareferenciacriterioasintotico)]
if NormalizationCriterium==4:
#este te tira la fluorescencia de detuning 0
FluoNormDivisor = Fluo[GetClosestIndex(Freq, 0)]
RelativeFluorescenceOfMinimums = np.array([Fluore/FluoNormDivisor for Fluore in FluorescenceOfMinimums])
print('Esto: ', RelativeFluorescenceOfMinimums)
if NormalizationCriterium==2 and getindices==True:
return FrequencyOfMinimums, RelativeFluorescenceOfMinimums, indiceizquierda, indicederecha
return FrequencyOfMinimums, RelativeFluorescenceOfMinimums
def GetFinalMaps(MapasDR1, MapasDR2, MapasDR3, MapasDR4, MapasDR5, MapasDR6):
"""
Nota: esto vale para polarizacion del 397 sigma+ + sigma-. Sino hay que cambiar los coeficientes.
La estructura es:
MapasDRi = [MapaMedido_criterio1_DRi, MapaMedido_criterio2_DRi, MapaMedido_criterio3_DRi, MapaMedido_criterio4_DRi]
"""
Mapa1 = MapasDR1[0]
Mapa2pi = np.sqrt(3)*(MapasDR2[1] + MapasDR5[1])
Mapa2smas = np.sqrt(12/2)*MapasDR3[1] + (2/np.sqrt(2))*MapasDR6[1]
Mapa2smenos = (2/np.sqrt(2))*MapasDR1[1] + np.sqrt(12/2)*MapasDR4[1]
Mapa3pi = np.sqrt(3)*(MapasDR2[2] + MapasDR5[2])
Mapa3smas = np.sqrt(12/2)*MapasDR3[2] + (2/np.sqrt(2))*MapasDR6[2]
Mapa3smenos = (2/np.sqrt(2))*MapasDR1[2] + np.sqrt(12/2)*MapasDR4[2]
return Mapa1, [Mapa2pi, Mapa2smas, Mapa2smenos], [Mapa3pi, Mapa3smas, Mapa3smenos]
def CombinateDRwithCG(RelMinMedido1, RelMinMedido2, RelMinMedido3, RelMinMedido4):
Fluo1 = RelMinMedido1[0]
Fluo2pi = np.sqrt(3)*(RelMinMedido2[1] + RelMinMedido2[4])
Fluo2smas = np.sqrt(12/2)*RelMinMedido2[2] + (2/np.sqrt(2))*RelMinMedido2[5]
Fluo2smenos = (2/np.sqrt(2))*RelMinMedido2[0] + np.sqrt(12/2)*RelMinMedido2[3]
Fluo3pi = np.sqrt(3)*(RelMinMedido3[1] + RelMinMedido3[4])
Fluo3smas = np.sqrt(12/2)*RelMinMedido3[2] + (2/np.sqrt(2))*RelMinMedido3[5]
Fluo3smenos = (2/np.sqrt(2))*RelMinMedido3[0] + np.sqrt(12/2)*RelMinMedido3[3]
return Fluo1, [Fluo2pi, Fluo2smas, Fluo2smenos], [Fluo3pi, Fluo3smas, Fluo3smenos]
def IdentifyPolarizationCoincidences(theoricalmap, target, tolerance=1e-1):
"""
Busca en un mapa 2D la presencia de un valor target (medido) con tolerancia tolerance.
Si lo encuentra, pone un 1. Sino, un 0. Al plotear con pcolor se verá
en blanco la zona donde el valor medido se puede hallar.
"""
CoincidenceMatrix = np.zeros((len(theoricalmap), len(theoricalmap[0])))
i = 0
while i<len(theoricalmap):
j = 0
while j<len(theoricalmap[0]):
if abs(theoricalmap[i][j]-target) < tolerance:
CoincidenceMatrix[i][j] = 1
j=j+1
i=i+1
return CoincidenceMatrix
def RetrieveAbsoluteCoincidencesBetweenMaps(MapsVectors):
MatrixSum = np.zeros((len(MapsVectors[0]), len(MapsVectors[0][0])))
AbsoluteCoincidencesMatrix = np.zeros((len(MapsVectors[0]), len(MapsVectors[0][0])))
MatrixMapsVectors = []
for i in range(len(MapsVectors)):
MatrixMapsVectors.append(np.matrix(MapsVectors[i]))
for i in range(len(MatrixMapsVectors)):
MatrixSum = MatrixSum + MatrixMapsVectors[i]
MaxNumberOfCoincidences = np.max(MatrixSum)
ListMatrixSum = [list(i) for i in list(np.array(MatrixSum))]
for i in range(len(ListMatrixSum)):
for j in range(len(ListMatrixSum[0])):
if ListMatrixSum[i][j] == MaxNumberOfCoincidences:
AbsoluteCoincidencesMatrix[i][j] = 1
return AbsoluteCoincidencesMatrix, MaxNumberOfCoincidences
def MeasureMeanValueOfEstimatedArea(AbsoluteCoincidencesMap, X, Y):
NonZeroIndices = np.nonzero(AbsoluteCoincidencesMap)
Xsum = 0
Xvec = []
Ysum = 0
Yvec = []
N = len(NonZeroIndices[0])
for i in range(N):
Xsum = Xsum + X[NonZeroIndices[1][i]]
Xvec.append(X[NonZeroIndices[1][i]])
Ysum = Ysum + Y[NonZeroIndices[0][i]]
Yvec.append(Y[NonZeroIndices[0][i]])
Xaverage = Xsum/N
Yaverage = Ysum/N
Xspread = np.std(Xvec)
Yspread = np.std(Yvec)
return Xaverage, Yaverage, N, Xspread, Yspread
def MeasureRelativeFluorescenceFromCPT(Freq, Fluo, u, titadoppler, detuningrepump, detuningdoppler, frefasint=-100, entorno=3):
ResonanciasTeoricas, ResonanciasPositivas = CalculoTeoricoDarkResonances_8levels(u, titadoppler, detuningdoppler, detuningrepump)
IndicesDR, FreqsDR = FindDRFrequencies(Freq, Fluo, ResonanciasTeoricas, entorno=entorno)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums0 = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=0, frecuenciareferenciacriterioasintotico=frefasint)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums1 = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=1, frecuenciareferenciacriterioasintotico=frefasint)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums2, indiceizquierda, indicederecha = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=2, frecuenciareferenciacriterioasintotico=frefasint, getindices=True)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums3 = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=3, frecuenciareferenciacriterioasintotico=frefasint)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums4 = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=4, frecuenciareferenciacriterioasintotico=frefasint)
print('hola')
print(RelativeFluorescenceOfMinimums0)
return RelativeFluorescenceOfMinimums0, RelativeFluorescenceOfMinimums1, RelativeFluorescenceOfMinimums2, RelativeFluorescenceOfMinimums3, RelativeFluorescenceOfMinimums4, IndicesDR, [indiceizquierda, indicederecha]
def GenerateNoisyCPT(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None, noiseamplitude=0.001):
Frequencyvector, Fluovector = PerformExperiment_8levels(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None)
NoisyFluovector = [fluo+noiseamplitude*(2*random.random()-1) for fluo in Fluovector]
return Frequencyvector, NoisyFluovector
def GenerateNoisyCPT_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None, noiseamplitude=0.001):
Frequencyvector, Fluovector = PerformExperiment_8levels_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None)
NoisyFluovector = [fluo+noiseamplitude*(2*random.random()-1) for fluo in Fluovector]
return Frequencyvector, NoisyFluovector
def GenerateNoisyCPT_fit(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqs, plot=False, solvemode=1, detpvec=None, noiseamplitude=0.001):
Frequencyvector, Fluovector = PerformExperiment_8levels_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, min(freqs), max(freqs) + freqs[1]-freqs[0], freqs[1]-freqs[0], plot=False, solvemode=1, detpvec=None)
NoisyFluovector = [fluo+noiseamplitude*(2*random.random()-1) for fluo in Fluovector]
return Frequencyvector, NoisyFluovector
def AddNoiseToCPT(Fluo, noisefactor):
return [f+noisefactor*(2*random.random()-1) for f in Fluo]
def SmoothNoisyCPT(Fluo, window=11, poly=3):
SmoothenFluo = sf(Fluo, window, poly)
return SmoothenFluo
def GetMinimaInfo(Freq, Fluo, u, titadoppler, detuningdoppler, detuningrepump, MinimumCriterium=2, NormalizationCriterium=1):
"""
FUNCION VIEJA
Esta funcion devuelve valores de frecuencias y fluorescencia relativa de los minimos.
Minimumcriterion:
1: Saca los minimos con funcion argelextrema
2: Directamente con las frecuencias teoricas busca las fluorescencias
Normalizationcriterium:
1: Devuelve la fluorescencia absoluta de los minimos
2: Devuelve el cociente entre la fluorescencia del minimo y un valor medio entre dos puntos lejanos, como si no
hubiera una resonancia oscura y hubiera una recta. Ese valor esta a DistanciaFrecuenciaCociente del detuning del azul (el punto medio entre las dos DR en este caso)
3: Devuelve el cociente entre la fluorescencia del minimo y el valor a -100 MHz (si se hizo de -100 a 100),
o el valor limite por izquierda de la curva
"""
FluorescenceOfMaximum = max(Fluo)
FrequencyOfMaximum = Freq[Fluo.index(FluorescenceOfMaximum)]
#criterio para encontrar los minimos
#criterio usando minimos de la fluorescencia calculados con la curva
if MinimumCriterium == 1:
LocationOfMinimums = argrelextrema(np.array(Fluo), np.less)[0]
FluorescenceOfMinimums = np.array([Fluo[i] for i in LocationOfMinimums])
FrequencyOfMinimums = np.array([Freq[j] for j in LocationOfMinimums])
#criterio con las DR teoricas
if MinimumCriterium == 2:
FrecuenciasDRTeoricas, FrecuenciasDRTeoricasPositivas = [darkresonance for darkresonance in CalculoTeoricoDarkResonances_8levels(u, titadoppler, detuningdoppler, detuningrepump)[0]]
FrequencyOfMinimums = []
FluorescenceOfMinimums =[]
print(FrecuenciasDRTeoricas)
k=0
ventanita = 0.001
while k < len(Freq):
if Freq[k] < FrecuenciasDRTeoricas[0] + ventanita and Freq[k] > FrecuenciasDRTeoricas[0] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[1] + ventanita and Freq[k] > FrecuenciasDRTeoricas[1] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[2] + ventanita and Freq[k] > FrecuenciasDRTeoricas[2] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[3] + ventanita and Freq[k] > FrecuenciasDRTeoricas[3] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[4] + ventanita and Freq[k] > FrecuenciasDRTeoricas[4] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[5] + ventanita and Freq[k] > FrecuenciasDRTeoricas[5] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
k = k + 1
print(FrequencyOfMinimums)
if len(FrequencyOfMinimums) != len(FrecuenciasDRTeoricas):
print('NO ANDA BIEN ESTO PAPI, revisalo')
#esto es para establecer un criterio para la fluorescencia relativa
DistanciaFrecuenciaCociente = 15
if NormalizationCriterium==1:
FluoNormDivisor = 1
if NormalizationCriterium==2:
k = 0
while k < len(Freq):
if Freq[k] < detuningdoppler-DistanciaFrecuenciaCociente + 2 and Freq[k] > detuningdoppler-DistanciaFrecuenciaCociente - 2:
FluoIzquierda = Fluo[k]
print('Izq:', Freq[k])
break
else:
k = k + 1
l = 0
while l < len(Freq):
if Freq[l] < detuningdoppler+DistanciaFrecuenciaCociente + 2 and Freq[l] > detuningdoppler+DistanciaFrecuenciaCociente - 2:
FluoDerecha = Fluo[l]
print('Der: ', Freq[l])
break
else:
l = l + 1
FluoNormDivisor = 0.5*(FluoDerecha+FluoIzquierda)
print(FluoNormDivisor)
if NormalizationCriterium==3:
FluoNormDivisor = Fluo[0]
RelativeFluorescenceOfMinimums = np.array([Fluore/FluoNormDivisor for Fluore in FluorescenceOfMinimums])
return FrequencyOfMinimums, RelativeFluorescenceOfMinimums
def GetPlotsofFluovsAngle_8levels(FrequencyOfMinimumsVector, RelativeFluorescenceOfMinimumsVector, u, titadoppler, detuningdoppler, detuningrepump, ventana=0.25, taketheoricalDR=False):
#primero buscamos las frecuencias referencia que se parezcan a las 6:
i = 0
FrecuenciasReferenciaBase = FrequencyOfMinimumsVector[0]
FrecuenciasDRTeoricas = [darkresonance for darkresonance in CalculoTeoricoDarkResonances_8levels(u, titadoppler, detuningdoppler, detuningrepump)[0]]
while i < len(FrequencyOfMinimumsVector):
if len(FrequencyOfMinimumsVector[i])==len(FrecuenciasDRTeoricas):
FrecuenciasReferenciaBase = FrequencyOfMinimumsVector[i]
print('Cool! Taking the DR identified with any curve')
break
else:
i = i + 1
if i==len(FrequencyOfMinimumsVector):
print('No hay ningun plot con 5 resonancias oscuras. Tomo las teóricas')
FrecuenciasReferenciaBase = FrecuenciasDRTeoricas
if taketheoricalDR:
FrecuenciasReferenciaBase = FrecuenciasDRTeoricas
Ventana = abs(ventana*(FrecuenciasReferenciaBase[1] - FrecuenciasReferenciaBase[0])) #ventana separadora de resonancias
print('Ventana = ', Ventana)
DarkResonance1Frequency = []
DarkResonance1Fluorescence = []
DarkResonance2Frequency = []
DarkResonance2Fluorescence = []
DarkResonance3Frequency = []
DarkResonance3Fluorescence = []
DarkResonance4Frequency = []
DarkResonance4Fluorescence = []
DarkResonance5Frequency = []
DarkResonance5Fluorescence = []
DarkResonance6Frequency = []
DarkResonance6Fluorescence = []
i = 0
while i < len(FrequencyOfMinimumsVector):
j = 0
FrecuenciasReferencia = [i for i in FrecuenciasReferenciaBase]
while j < len(FrequencyOfMinimumsVector[i]):
if abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[0])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[0])-Ventana):
DarkResonance1Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance1Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[0] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[1])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[1])-Ventana):
DarkResonance2Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance2Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[1] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[2])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[2])-Ventana):
DarkResonance3Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance3Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[2] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[3])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[3])-Ventana):
DarkResonance4Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance4Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[3] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[4])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[4])-Ventana):
DarkResonance5Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance5Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[4] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[5])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[5])-Ventana):
DarkResonance6Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance6Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[5] = 0
else:
#print('Algo anduvo mal, por ahi tenes que cambiar la ventana che')
pass
j = j + 1
if np.count_nonzero(FrecuenciasReferencia) > 0:
if FrecuenciasReferencia[0] != 0:
DarkResonance1Frequency.append(FrecuenciasReferencia[0])
DarkResonance1Fluorescence.append()
if FrecuenciasReferencia[1] != 0:
DarkResonance2Frequency.append(FrecuenciasReferencia[1])
DarkResonance2Fluorescence.append(0)
if FrecuenciasReferencia[2] != 0:
DarkResonance3Frequency.append(FrecuenciasReferencia[2])
DarkResonance3Fluorescence.append(0)
if FrecuenciasReferencia[3] != 0:
DarkResonance4Frequency.append(FrecuenciasReferencia[3])
DarkResonance4Fluorescence.append(0)
if FrecuenciasReferencia[4] != 0:
DarkResonance5Frequency.append(FrecuenciasReferencia[4])
DarkResonance5Fluorescence.append(0)
if FrecuenciasReferencia[5] != 0:
DarkResonance6Frequency.append(FrecuenciasReferencia[5])
DarkResonance6Fluorescence.append(0)
i = i + 1
return DarkResonance1Frequency, DarkResonance1Fluorescence, DarkResonance2Frequency, DarkResonance2Fluorescence, DarkResonance3Frequency, DarkResonance3Fluorescence, DarkResonance4Frequency, DarkResonance4Fluorescence, DarkResonance5Frequency, DarkResonance5Fluorescence, DarkResonance6Frequency, DarkResonance6Fluorescence, FrecuenciasReferenciaBase
def PerformExperiment_8levels(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None):
"""
Hace un experimento barriendo ángulos de repump con el angulo de doppler fijo.
solvemode=1: resuelve con np.linalg.solve
solvemode=2: resuelve invirtiendo L con la funcion np.linalg.inv
"""
Fluovectors = []
for titaprobe in titaprobeVec:
tinicial = time.time()
ProbeDetuningVectorL, Fluovector = CPTspectrum8levels(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, freqMin=freqMin, freqMax=freqMax, freqStep=freqStep, plot=False, solvemode=1)
tfinal = time.time()
print('Done angle ', titarepump, ' Total time: ', round((tfinal-tinicial), 2), "s")
if plot:
plt.figure()
plt.xlabel('Repump detuning (MHz')
plt.ylabel('Fluorescence (A.U.)')
plt.plot(ProbeDetuningVectorL, Fluovector, label=str(titarepump)+'º tita repump, T: ' + str(T*1e3) + ' mK')
plt.legend()
Fluovectors.append(Fluovector)
if len(titaprobeVec) == 1: #esto es para que no devuelva un vector de vectores si solo fijamos un angulo
Fluovectors = Fluovector
return ProbeDetuningVectorL, Fluovectors
def PerformExperiment_8levels_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None):
"""
Hace un experimento barriendo ángulos de repump con el angulo de doppler fijo.
solvemode=1: resuelve con np.linalg.solve
solvemode=2: resuelve invirtiendo L con la funcion np.linalg.inv
"""
Fluovectors = []
for titaprobe in titaprobeVec:
tinicial = time.time()
ProbeDetuningVectorL, Fluovector = CPTspectrum8levels_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, freqMin=freqMin, freqMax=freqMax, freqStep=freqStep, plot=False, solvemode=1)
tfinal = time.time()
print('Done angle ', titarepump, ' Total time: ', round((tfinal-tinicial), 2), "s")
if plot:
plt.figure()
plt.xlabel('Repump detuning (MHz')
plt.ylabel('Fluorescence (A.U.)')
plt.plot(ProbeDetuningVectorL, Fluovector, label=str(titarepump)+'º tita repump, T: ' + str(T*1e3) + ' mK')
plt.legend()
Fluovectors.append(Fluovector)
if len(titaprobeVec) == 1: #esto es para que no devuelva un vector de vectores si solo fijamos un angulo
Fluovectors = Fluovector
return ProbeDetuningVectorL, Fluovectors
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 1 17:58:39 2020
@author: oem
"""
import os
import numpy as np
#os.chdir('/home/oem/Nextcloud/G_liaf/liaf-TrampaAnular/Código General/EIT-CPT/Buenos Aires/Experiment Simulations/CPT scripts/Eight Level 2 repumps')
from threeLevel_2repumps_AnalysisFunctions import CalculoTeoricoDarkResonances_8levels, GetMinimaInfo, GetPlotsofFluovsAngle_8levels, PerformExperiment_8levels, FindDRFrequencies, FindRelativeFluorescencesOfDR, GenerateNoisyCPT, SmoothNoisyCPT, GetFinalMaps, GenerateNoisyCPT_fixedRabi, GenerateNoisyCPT_fit
import matplotlib.pyplot as plt
import time
from threeLevel_2repumps_AnalysisFunctions import MeasureRelativeFluorescenceFromCPT, IdentifyPolarizationCoincidences, RetrieveAbsoluteCoincidencesBetweenMaps, GetClosestIndex
#C:\Users\Usuario\Nextcloud\G_liaf\liaf-TrampaAnular\Código General\EIT-CPT\Buenos Aires\Experiment Simulations\CPT scripts\Eight Level 2 repumps
ub = 9.27e-24
h = 6.63e-34
c = (ub/h)*1e-4 #en unidades de MHz/G
#u = 1e6
u = 33.5e6
B = (u/(2*np.pi))/c
#sg, sp = 0.6, 5 #parámetros de control, saturación del doppler y repump
#rabG, rabP = sg*gPS, sp*gPD #frecuencias de rabi
gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 #anchos de linea de las transiciones
lw = 0.1
DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth = lw, lw, lw #ancho de linea de los laseres
DetDoppler = -36 #42
DetRepumpVec = [DetDoppler+29.6]
Tvec = [0.7] #temperatura en mK
alpha = 0*(np.pi/180) #angulo entre los láseres
phidoppler, titadoppler = 0, 90
phirepump, titarepump = 0, 0
phiprobe = 0
titaprobe = 90
#Calculo las resonancias oscuras teóricas
#ResonanciasTeoricas, DRPositivas = CalculoTeoricoDarkResonances_8levels(u/(2*np.pi*1e6), titadoppler, DetDoppler, DetRepump)
#Parametros de la simulacion cpt
center = -45
span = 80
freqMin = center-span*0.5
freqMax = center+span*0.5
""" parametros para tener espectros coherentes
freqMin = -56
freqMax = 14
"""
freqStep = 1e-1
noiseamplitude = 0
RelMinMedido0Vector = []
RelMinMedido1Vector = []
RelMinMedido2Vector = []
RelMinMedido3Vector = []
RelMinMedido4Vector = []
#Sr = np.arange(0, 10, 0.2)
#Sg = np.arange(0.01, 1, 0.05)
#Sp = np.arange(0.1, 6.1, 1)
#Sg = [0.6**2]
#Sp = [2.3**2]
Sg = [1.4]
Sp = [6]
Sr = [11]
i = 0
save = False
showFigures = True
if not showFigures:
plt.ioff()
else:
plt.ion()
fig1, ax1 = plt.subplots()
offsetx = 464
ax1.plot([f-offsetx for f in FreqsDR], CountsDR, 'o')
run = True
Scale = 730
Offset = 600 #600 para 20k cuentas aprox
MaxCoherenceValue = []
for sg in Sg:
for sp in Sp:
rabG, rabP = sg*gPS, sp*gPD
for Ti in Tvec:
T = Ti*1e-3
for DetRepump in DetRepumpVec:
print(T)
for sr in Sr:
rabR = sr*gPD
#MeasuredFreq, MeasuredFluo = GenerateNoisyCPT(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, [titaprobe], phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None, noiseamplitude=noiseamplitude)
if run:
MeasuredFreq4, MeasuredFluo4 = GenerateNoisyCPT_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, [titaprobe], phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None, noiseamplitude=noiseamplitude)
#SmoothFluo = SmoothNoisyCPT(MeasuredFluo, window=9, poly=2)
SmoothFluo4 = MeasuredFluo4
#Scale = max(BestC)/max([100*s for s in SmoothFluo4])
ax1.plot(MeasuredFreq4, [Scale*100*f + Offset for f in SmoothFluo4], label=f'Sr = {sr}')
ax1.axvline(DetDoppler, linestyle='--', linewidth=1)
#if sr != 0:
#ax1.axvline(DetRepump, linestyle='--', linewidth=1)
MaxCoherenceValue.append(np.max(SmoothFluo4))
#print(titaprobe)
ax1.set_xlabel('Detuning Rebombeo (MHz)')
ax1.set_ylabel('Fluorescencia (AU)')
ax1.set_title(f'B: {round(B, 2)} G, Sdop: {round(sg, 2)}, Sp: {round(sp, 2)}, Sr: {round(sr, 2)}, lw: {lw} MHz, T: {Ti} mK')
#ax1.set_ylim(0, 8)
#ax1.axvline(DetDoppler, linestyle='dashed', color='red', linewidth=1)
#ax1.axvline(DetRepump, linestyle='dashed', color='black', linewidth=1)
#ax1.set_title('Pol Doppler y Repump: Sigma+ Sigma-, Pol Probe: PI')
#ax1.legend()
ax1.grid()
print (f'{i+1}/{len(Sg)*len(Sp)}')
i = i + 1
if save:
plt.savefig(f'Mapa_plots_100k_1mk/CPT_SMSM_sdop{round(sg, 2)}_sp{round(sp, 2)}_sr{round(sr, 2)}.jpg')
ax1.legend()
"""
plt.figure()
plt.plot(Sr, MaxCoherenceValue, 'o')
plt.xlabel('Sr')
plt.ylabel('Coherence')
"""
"""
plt.figure()
plt.plot(MeasuredFreq, [100*f for f in SmoothFluo], color='darkred')
plt.xlabel('Desintonía 866 (MHz)')
plt.ylabel('Fluorescencia (A.U.)')
plt.axvline(-30, color='darkblue', linewidth=1.2, linestyle='--')
plt.yticks(np.arange(0.4, 1.8, 0.2))
plt.ylim(0.5, 1.6)
plt.grid()
plt.figure()
plt.plot(MeasuredFreq4, [100*f for f in SmoothFluo4], color='darkred')
plt.xlabel('Desintonía 866 (MHz)')
plt.ylabel('Fluorescencia (A.U.)')
plt.axvline(-30, color='darkblue', linewidth=1.2, linestyle='--')
plt.yticks(np.arange(0.8, 2.4, 0.4))
plt.grid()
"""
#%%
from scipy.optimize import curve_fit
T = 0.5e-3
sg = 0.7
sp = 6
sr = 0
DetDoppler = -14
DetRepump = 0
FitsSp = []
FitsOffset = []
Sg = [0.87]
def FitEIT(freqs, SP, offset):
MeasuredFreq, MeasuredFluo = GenerateNoisyCPT_fit(0.87, sr, SP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, [titaprobe], phirepump, titarepump, freqs, plot=False, solvemode=1, detpvec=None, noiseamplitude=noiseamplitude)
FinalFluo = [f*43000 + 2685 for f in MeasuredFluo]
return FinalFluo
freqs = [f-offsetx+32 for f in FreqsDR]
freqslong = np.arange(min(freqs), max(freqs)+freqs[1]-freqs[0], 0.1*(freqs[1]-freqs[0]))
popt, pcov = curve_fit(FitEIT, freqs, CountsDR, p0=[5, 700], bounds=(0, [10, 1e6]))
FitsSp.append(popt[0])
FitsOffset.append(popt[1])
print(popt)
FittedEIT = FitEIT(freqslong, *popt)
plt.figure()
plt.errorbar(freqs, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', capsize=2, markersize=2)
plt.plot(freqslong, FitEIT(freqslong, *popt))
plt.title(f'Sdop: {round(popt[0], 2)}, Spr: {round(popt[1], 2)}, T: {T*1e3} mK, detDop: {DetDoppler} MHz')
np.savetxt('CPT_measured.txt', np.transpose([freqs, CountsDR]))
np.savetxt('CPT_fitted.txt', np.transpose([freqslong, FittedEIT]))
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 7 22:30:01 2020
@author: nico
"""
import numpy as np
import time
import matplotlib.pyplot as plt
from scipy.signal import argrelextrema
"""
Scripts para el calculo de la curva CPT
"""
def H0matrix(Detg, Detp, u):
"""
Calcula la matriz H0 en donde dr es el detuning del doppler, dp es el retuning del repump y u es el campo magnético en Hz/Gauss.
Para esto se toma la energía del nivel P como 0
"""
eigenEnergies = (Detg-u, Detg+u, -u/3, u/3, Detp-6*u/5, Detp-2*u/5, Detp+2*u/5, Detp+6*u/5) #pagina 26 de Oberst. los lande del calcio son iguales a Bario.
H0 = np.diag(eigenEnergies)
return H0
def HImatrix(rabG, rabP, phidoppler, titadoppler, phiprobe, titaprobe):
"""
Calcula la matriz de interacción Hsp + Hpd, en donde rabR es la frecuencia de rabi de la transición Doppler SP,
rabP es la frecuencia de rabi de la transición repump DP, y las componentes ei_r y ei_p son las componentes de la polarización
del campo eléctrico incidente de doppler y repump respectivamente. Deben estar normalizadas a 1
"""
HI = np.zeros((8, 8), dtype=np.complex_)
i, j = 1, 3
HI[i-1, j-1] = (rabG/np.sqrt(3)) * np.cos(titadoppler)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 1, 4
HI[i-1, j-1] = -(rabG/np.sqrt(3)) * np.sin(titadoppler)*np.exp(1j*phidoppler)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 2, 3
HI[i-1, j-1] = -(rabG/np.sqrt(3)) * np.sin(titadoppler)*np.exp(-1j*phidoppler)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 2, 4
HI[i-1, j-1] = -(rabG/np.sqrt(3)) * np.cos(titadoppler)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 3, 5
HI[i-1, j-1] = -(rabP/2) * np.sin(titaprobe)*np.exp(-1j*phiprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 3, 6
HI[i-1, j-1] = -(rabP/np.sqrt(3)) * np.cos(titaprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 3, 7
HI[i-1, j-1] = rabP/np.sqrt(12) * np.sin(titaprobe)*np.exp(1j*phiprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 4, 6
HI[i-1, j-1] = -(rabP/np.sqrt(12)) * np.sin(titaprobe)*np.exp(-1j*phiprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 4, 7
HI[i-1, j-1] = -(rabP/np.sqrt(3)) * np.cos(titaprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 4, 8
HI[i-1, j-1] = (rabP/2) * np.sin(titaprobe)*np.exp(1j*phiprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
return HI
def Lplusminus(detr, detp, phirepump, titarepump, forma=1):
Hintplus = np.zeros((8, 8), dtype=np.complex_)
Hintminus = np.zeros((8, 8), dtype=np.complex_)
Hintplus[4, 2] = (-1/2)*np.sin(titarepump)*np.exp(1j*phirepump)
Hintplus[5, 2] = (-1/np.sqrt(3))*np.cos(titarepump)
Hintplus[6, 2] = (1/(2*np.sqrt(3)))*np.sin(titarepump)*np.exp(-1j*phirepump)
Hintplus[5, 3] = (-1/(2*np.sqrt(3)))*np.sin(titarepump)*np.exp(1j*phirepump)
Hintplus[6, 3] = (-1/np.sqrt(3))*np.cos(titarepump)
Hintplus[7, 3] = (1/2)*np.sin(titarepump)*np.exp(-1j*phirepump)
Hintminus[2, 4] = (-1/2)*np.sin(titarepump)*np.exp(-1j*phirepump)
Hintminus[2, 5] = (-1/np.sqrt(3))*np.cos(titarepump)
Hintminus[2, 6] = (1/(2*np.sqrt(3)))*np.sin(titarepump)*np.exp(1j*phirepump)
Hintminus[3, 5] = (-1/(2*np.sqrt(3)))*np.sin(titarepump)*np.exp(-1j*phirepump)
Hintminus[3, 6] = (-1/np.sqrt(3))*np.cos(titarepump)
Hintminus[3, 7] = (1/2)*np.sin(titarepump)*np.exp(1j*phirepump)
if forma==1:
Lplus = np.zeros((64, 64), dtype=np.complex_)
Lminus = np.zeros((64, 64), dtype=np.complex_)
DeltaBar = np.zeros((64, 64), dtype=np.complex_)
for r in range(8):
for q in range(8):
for k in range(8):
for j in range(8):
if j==q:
if (k==2 or k==3) and r > 3:
Lplus[r*8+q][k*8+j] = (-1j)*(Hintplus[r,k])
if (r==2 or r==3) and k > 3:
Lminus[r*8+q][k*8+j] = (-1j)*(Hintminus[r,k])
elif r==k:
if (q==2 or q==3) and j > 3:
Lplus[r*8+q][k*8+j] = (-1j)*(- Hintplus[j,q])
if (j==2 or j==3) and q > 3:
Lminus[r*8+q][k*8+j] = (-1j)*(- Hintminus[j,q])
if forma==2:
deltaKro = np.diag([1, 1, 1, 1, 1, 1, 1, 1])
Lplus = (-1j)*(np.kron(Hintplus, deltaKro) - np.kron(deltaKro, Hintplus))
Lminus = (-1j)*(np.kron(Hintminus, deltaKro) - np.kron(deltaKro, Hintminus))
DeltaBar = np.zeros((64, 64), dtype=np.complex_)
for i in range(64):
DeltaBar[i, i] = (1j)*(detr - detp)
return np.matrix(Lminus), np.matrix(Lplus), np.matrix(DeltaBar)
def GetL1(Lplus, Lminus, DeltaBar, L0, rabR, nmax):
"""
Devuelve Splus0 y Sminus0
"""
Sp = (-1)*(0.5*rabR)*(np.matrix(np.linalg.inv(L0 - (nmax+1)*DeltaBar))*np.matrix(Lplus))
Sm = (-1)*(0.5*rabR)*(np.matrix(np.linalg.inv(L0 + (nmax+1)*DeltaBar))*np.matrix(Lminus))
for n in list(range(nmax+1))[(nmax+1)::-1][0:len(list(range(nmax+1))[(nmax+1)::-1])-1]: #jaja esto solo es para que vaya de nmax a 1 bajando. debe haber algo mas facil pero kcio
Sp = (-1)*(rabR)*(np.matrix(np.linalg.inv(L0 - n*DeltaBar + rabR*(Lminus*np.matrix(Sp))))*np.matrix(Lplus))
Sm = (-1)*(rabR)*(np.matrix(np.linalg.inv(L0 + n*DeltaBar + rabR*(Lplus*np.matrix(Sm))))*np.matrix(Lminus))
L1 = 0.5*rabR*(np.matrix(Lminus)*np.matrix(Sp) + np.matrix(Lplus)*np.matrix(Sm))
return L1
def EffectiveL(gPS, gPD, lwg, lwr, lwp):
"""
Siendo Heff = H + EffectiveL, calcula dicho EffectiveL que es (-0.5j)*sumatoria(CmDaga*Cm) que luego sirve para calcular el Liouvilliano
"""
Leff = np.zeros((8, 8), dtype=np.complex_)
Leff[0, 0] = 2*lwg
Leff[1, 1] = 2*lwg
Leff[2, 2] = ((2/3)+(1/3))*gPS + ((1/2) + (1/6) + (1/3))*gPD
Leff[3, 3] = ((2/3)+(1/3))*gPS + ((1/2) + (1/6) + (1/3))*gPD
Leff[4, 4] = 2*(lwr + lwp)
Leff[5, 5] = 2*(lwr + lwp)
Leff[6, 6] = 2*(lwr + lwp)
Leff[7, 7] = 2*(lwr + lwp)
return (-0.5j)*Leff
def CalculateSingleMmatrix(gPS, gPD, lwg, lwr, lwp):
"""
Si tomamos el Liuvilliano como L = (-j)*(Heff*deltak - Heffdaga*deltak) + sum(Mm),
esta funcion calcula dichos Mm, que tienen dimensión 64x64 ya que esa es la dimensión del L. Estas componentes
salen de hacer la cuenta a mano conociendo los Cm y considerando que Mm[8*(r-1)+s, 8*(k-1)+j] = Cm[r,l] + Cmdaga[j,s] = Cm[r,l] + Cm[s,j]
ya que los componentes de Cm son reales.
Esta M es la suma de las 8 matrices M.
"""
M = np.matrix(np.zeros((64, 64), dtype=np.complex_))
M[0,27] = (2/3)*gPS
M[9,18] = (2/3)*gPS
M[0,18] = (1/3)*gPS
M[1,19] = -(1/3)*gPS
M[8,26] = -(1/3)*gPS
M[9,27] = (1/3)*gPS
M[36,18] = (1/2)*gPD
M[37,19] = (1/np.sqrt(12))*gPD
M[44,26] = (1/np.sqrt(12))*gPD
M[45,27] = (1/6)*gPD
M[54,18] = (1/6)*gPD
M[55,19] = (1/np.sqrt(12))*gPD
M[62,26] = (1/np.sqrt(12))*gPD
M[63,27] = (1/2)*gPD
M[45,18] = (1/3)*gPD
M[46,19] = (1/3)*gPD
M[53,26] = (1/3)*gPD
M[54,27] = (1/3)*gPD
M[0,0] = 2*lwg
M[1,1] = 2*lwg
M[8,8] = 2*lwg
M[9,9] = 2*lwg
factor1 = 1
factor2 = 1
factor3 = 1
factor4 = 1
#M[36, 45] = lwp
M[36,36] = 2*(lwr + factor1*lwp)
M[37,37] = 2*(lwr + factor1*lwp)
M[38,38] = 2*(lwr + factor1*lwp)
M[39,39] = 2*(lwr + factor1*lwp)
M[44,44] = 2*(lwr + factor2*lwp)
M[45,45] = 2*(lwr + factor2*lwp)
M[46,46] = 2*(lwr + factor2*lwp)
M[47,47] = 2*(lwr + factor2*lwp)
M[52,52] = 2*(lwr + factor3*lwp)
M[53,53] = 2*(lwr + factor3*lwp)
M[54,54] = 2*(lwr + factor3*lwp)
M[55,55] = 2*(lwr + factor3*lwp)
M[60,60] = 2*(lwr + factor4*lwp)
M[61,61] = 2*(lwr + factor4*lwp)
M[62,62] = 2*(lwr + factor4*lwp)
M[63,63] = 2*(lwr + factor4*lwp)
return M
def dopplerBroadening(wlg, wlp, alpha, T, mcalcio = 6.655e-23*1e-3):
"""
Calcula el broadening extra semiclásico por temperatura considerando que el ion atrapado se mueve.
wlg es la longitud de onda doppler, wlp la longitud de onda repump, T la temperatura del ion en kelvin, y alpha (en rads) el ángulo
que forman ambos láseres.
"""
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))
return gammaD
def FullL_efficient(rabG, rabR, rabP, gPS = 0, gPD = 0, Detg = 0, Detr = 0, Detp = 0, u = 0, lwg = 0, lwr=0, lwp = 0,
phidoppler=0, titadoppler=0, phiprobe=0, titaprobe=0, phirepump=0, titarepump=0, T = 0, alpha = 0):
"""
Calcula el Liouvilliano total de manera explícita índice a índice. Suma aparte las componentes de las matrices M.
Es la más eficiente hasta ahora.
"""
db = dopplerBroadening(0.397e-6, 0.866e-6, alpha, T)
#lwr = np.sqrt(lwr**2 + dopplerBroadening(0.397e-6, 0.866e-6, alpha, T)**2)
lwg = np.sqrt(lwg**2 + db**2)
lwr = np.sqrt(lwr**2 + db**2)
CC = EffectiveL(gPS, gPD, lwg, lwr, lwp)
Heff = H0matrix(Detg, Detp, u) + HImatrix(rabG, rabP, phidoppler, titadoppler, phiprobe, titaprobe) + CC
Heffdaga = np.matrix(Heff).getH()
Lfullpartial = np.zeros((64, 64), dtype=np.complex_)
for r in range(8):
for q in range(8):
for k in range(8):
for j in range(8):
if j!=q and r!=k:
pass
elif j==q and r!=k:
if (r < 2 and k > 3) or (k < 2 and r > 3) or (r > 3 and k > 3) or (r==0 and k==1) or (r==1 and k==0) or (r==2 and k==3) or (r==3 and k==2): #todo esto sale de analizar explicitamente la matriz y tratar de no calcular cosas de más que dan cero
pass
else:
Lfullpartial[r*8+q][k*8+j] = (-1j)*(Heff[r,k])
elif j!=q and r==k:
if (j < 2 and q > 3) or (q < 2 and j > 3) or (j > 3 and q > 3) or (j==0 and q==1) or (j==1 and q==0) or (j==2 and q==3) or (j==3 and q==2):
pass
else:
Lfullpartial[r*8+q][k*8+j] = (-1j)*(-Heffdaga[j,q])
else:
if Heff[r,k] == Heffdaga[j,q]:
pass
else:
Lfullpartial[r*8+q][k*8+j] = (-1j)*(Heff[r,k]-Heffdaga[j,q])
M = CalculateSingleMmatrix(gPS, gPD, lwg, lwr, lwp)
L0 = np.array(np.matrix(Lfullpartial) + M)
nmax = 1
Lminus, Lplus, DeltaBar = Lplusminus(Detr, Detp, phirepump, titarepump)
factor1 = np.exp(1j*0.2*np.pi)
factor2 = np.exp(-1j*0.2*np.pi)
#print(factor)
L1 = GetL1(factor1*Lplus, factor2*Lminus, DeltaBar, L0, rabR, nmax)
Lfull = L0 + L1
#NORMALIZACION DE RHO
i = 0
while i < 64:
if i%9 == 0:
Lfull[0, i] = 1
else:
Lfull[0, i] = 0
i = i + 1
return Lfull
"""
Scripts para correr un experimento y hacer el análisis de los datos
"""
def CalculoTeoricoDarkResonances(u, titadoppler):
if titadoppler==0:
NegativeDR = [(-7/5)*u, (-3/5)*u, (-1/5)*u, (1/5)*u, (3/5)*u, (7/5)*u]
elif titadoppler==90:
NegativeDR = [(-11/5)*u, (-7/5)*u, (-3/5)*u, (3/5)*u, (7/5)*u, (11/5)*u]
PositiveDR = [(-8/5)*u, (-4/5)*u, 0, (4/5)*u, (8/5)*u]
return NegativeDR, PositiveDR
def CPTspectrum8levels(rabG, rabR, rabP, gPS, gPD, Detg, Detr, u, lwg, lwr, lwp, Temp, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump,
freqMin=-100, freqMax=100, freqStep=1e-1, plot=False, solvemode=1):
"""
Hace un experimento barriendo ángulos de repump con el angulo de doppler fijo.
solvemode=1: resuelve con np.linalg.solve
solvemode=2: resuelve invirtiendo L con la funcion np.linalg.inv
"""
phidoppler, titadoppler = phidoppler*(np.pi/180), titadoppler*(np.pi/180)
phiprobe, titaprobe = phiprobe*(np.pi/180), titaprobe*(np.pi/180)
phirepump, titarepump = phirepump*(np.pi/180), titarepump*(np.pi/180)
DetProbeVector = 2*np.pi*np.arange(freqMin*1e6, freqMax*1e6, freqStep*1e6)
Detg, Detr = 2*np.pi*Detg*1e6, 2*np.pi*Detr*1e6
lwg, lwr, lwp = 2*np.pi*lwg*1e6, 2*np.pi*lwr*1e6, 2*np.pi*lwp*1e6
#u = 2*np.pi*u*1e6
Fluovector = []
tinicial = time.time()
for Detp in DetProbeVector:
L = FullL_efficient(rabG, rabR, rabP, gPS, gPD, Detg, Detr, Detp, u, lwg, lwr, lwp, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, Temp, alpha)
if solvemode == 1:
rhovectorized = np.linalg.solve(L, np.array([int(i==0) for i in range(64)]))
Fluo = np.real(rhovectorized[18] + np.real(rhovectorized[27])) #estos son los rho33 + rho44
Fluovector.append(Fluo)
if solvemode == 2:
Linv = np.linalg.inv(L)
rhovectorized = [Linv[j][0] for j in range(len(Linv))]
Fluo = np.real(rhovectorized[18] + np.real(rhovectorized[27])) #estos son los rho33 + rho44
Fluovector.append(Fluo)
tfinal = time.time()
print('Done, Total time: ', round((tfinal-tinicial), 2), "s")
DetProbeVectorMHz = np.arange(freqMin, freqMax, freqStep)
if plot:
plt.xlabel('Probe detuning (MHz)')
plt.ylabel('Fluorescence (A.U.)')
plt.plot(DetProbeVectorMHz, [100*f for f in Fluovector], label=str(titaprobe) + 'º, T: ' + str(Temp*1e3) + ' mK')
plt.legend()
return DetProbeVectorMHz, Fluovector
def CPTspectrum8levels_fixedRabi(sg, sr, sp, gPS, gPD, Detg, Detr, u, lwg, lwr, lwp, Temp, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump,
freqMin=-100, freqMax=100, freqStep=1e-1, plot=False, solvemode=1):
"""
Hace un experimento barriendo ángulos de repump con el angulo de doppler fijo.
solvemode=1: resuelve con np.linalg.solve
solvemode=2: resuelve invirtiendo L con la funcion np.linalg.inv
"""
phidoppler, titadoppler = phidoppler*(np.pi/180), titadoppler*(np.pi/180)
phiprobe, titaprobe = phiprobe*(np.pi/180), titaprobe*(np.pi/180)
phirepump, titarepump = phirepump*(np.pi/180), titarepump*(np.pi/180)
DetProbeVector = 2*np.pi*np.arange(freqMin*1e6, freqMax*1e6, freqStep*1e6)
Detg, Detr = 2*np.pi*Detg*1e6, 2*np.pi*Detr*1e6
#lwg, lwr, lwp = 2*np.pi*lwg*1e6, 2*np.pi*lwr*1e6, 2*np.pi*lwp*1e6
lwg, lwr, lwp = lwg*1e6, lwr*1e6, lwp*1e6
rabG = sg*gPS
rabR = sr*gPD
rabP = sp*gPD
#u = 2*np.pi*u*1e6
Fluovector = []
tinicial = time.time()
for Detp in DetProbeVector:
L = FullL_efficient(rabG, rabR, rabP, gPS, gPD, Detg, Detr, Detp, u, lwg, lwr, lwp, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, Temp, alpha)
if solvemode == 1:
coh = 5
rhovectorized = np.linalg.solve(L, np.array([int(i==0) for i in range(64)]))
#Fluo = np.abs(rhovectorized[coh])
Fluo = np.real(rhovectorized[18] + np.real(rhovectorized[27])) #estos son los rho33 + rho44
Fluovector.append(Fluo)
if solvemode == 2:
Linv = np.linalg.inv(L)
rhovectorized = [Linv[j][0] for j in range(len(Linv))]
Fluo = np.real(rhovectorized[18] + np.real(rhovectorized[27])) #estos son los rho33 + rho44
Fluovector.append(Fluo)
tfinal = time.time()
print('Done, Total time: ', round((tfinal-tinicial), 2), "s")
DetProbeVectorMHz = np.arange(freqMin, freqMax, freqStep)
if plot:
plt.xlabel('Probe detuning (MHz)')
plt.ylabel('Fluorescence (A.U.)')
plt.plot(DetProbeVectorMHz, [100*f for f in Fluovector], label=str(titaprobe) + 'º, T: ' + str(Temp*1e3) + ' mK')
plt.legend()
return DetProbeVectorMHz, Fluovector
#%%
if __name__ == "__main__":
ub = 9.27e-24
h = 6.63e-34
c = (ub/h)*1e-4 #en unidades de MHz/G
B = 25 #campo magnetico en gauss
u = c*B
sg, sr, sp = 0.5, 1.5, 4 #parámetros de saturación del doppler y repump
gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 #anchos de linea de las transiciones
rabG, rabR, rabP = sg*gPS, sr*gPD, sp*gPD #frecuencias de rabi
lwg, lwr, lwp = 0.3, 0.3, 0.3 #ancho de linea de los laseres
Detg = -25
Detr = 20 #detuning del doppler y repump
Temp = 0.0e-3 #temperatura en K
alpha = 0*(np.pi/180) #angulo entre los láseres
phidoppler, titadoppler = 0, 90
phirepump, titarepump = 0, 90
phiprobe, titaprobe = 0, 90
plotCPT = False
freqMin = -50
freqMax = 50
freqStep = 5e-2
Frequencyvector, Fluovector = CPTspectrum8levels(rabG, rabR, rabP, gPS, gPD, Detg, Detr, u, lwg, lwr, lwp, Temp, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, freqMin=freqMin, freqMax=freqMax, freqStep=freqStep, plot=plotCPT, solvemode=1)
NegativeDR, PositiveDR = CalculoTeoricoDarkResonances(u/(2*np.pi*1e6), titadoppler)
plt.plot(Frequencyvector, [100*f for f in Fluovector], label=str(titaprobe) + 'º, T: ' + str(Temp*1e3) + ' mK')
plt.xlabel('Probe detuning (MHz)')
plt.ylabel('Fluorescence (A.U.)')
for PDR in PositiveDR:
plt.axvline(Detr+PDR, linestyle='--', linewidth=0.5, color='red')
for NDR in NegativeDR:
plt.axvline(Detg+NDR, linestyle='--', linewidth=0.5, color='blue')
#parametros que andan piola:
"""
ub = 9.27e-24
h = 6.63e-34
c = (ub/h)*1e-4 #en unidades de MHz/G
B = 17 #campo magnetico en gauss
u = c*B
#u = 80e6
sr, sp = 0.53, 4.2
gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6
rabR, rabP = sr*gPS, sp*gPD
lw = 2*np.pi * 0.33e6
lwr, lwp = lw, lw #ancho de linea de los laseres
dr_spec = - 2*np.pi* 26e6
freqSteps = 500
freqMin = -100e6
freqMax = 100e6
dps = 2*np.pi*np.linspace(freqMin, freqMax, freqSteps)
#dps = [-30e6]
alfar = 90*(np.pi/180)
ex_r, ey_r, ez_r = np.sin(alfar)*np.cos(0), np.sin(alfar)*np.sin(0), np.cos(alfar)
alfap = 90*(np.pi/180)
ex_p, ey_p, ez_p = np.sin(alfap)*np.cos(0), np.sin(alfap)*np.sin(0), np.cos(alfap)
"""
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="309.89169mm"
height="246.71114mm"
viewBox="0 0 309.89169 246.71113"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
sodipodi:docname="Dibujoconespectroseiones.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.69664703"
inkscape:cx="694.03871"
inkscape:cy="543.31675"
inkscape:window-width="1846"
inkscape:window-height="1016"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(76.095078,48.989001)">
<circle
style="fill:#00ffff;stroke:#808080;stroke-width:0.465;stroke-linejoin:round"
id="path31"
cx="89.419563"
cy="44.529404"
r="4.4136381" />
<circle
style="fill:#00ffff;stroke:#808080;stroke-width:0.465;stroke-linejoin:round"
id="path31-3"
cx="108.53767"
cy="58.236534"
r="4.4136381" />
<circle
style="fill:#00ffff;stroke:#808080;stroke-width:0.465;stroke-linejoin:round"
id="path31-6"
cx="61.067684"
cy="45.801949"
r="4.4136381" />
<circle
style="fill:#00ffff;stroke:#808080;stroke-width:0.465;stroke-linejoin:round"
id="path31-7"
cx="80.536278"
cy="65.300217"
r="4.4136381" />
<circle
style="fill:#00ffff;stroke:#808080;stroke-width:0.465;stroke-linejoin:round"
id="path31-5"
cx="103.87627"
cy="81.574669"
r="4.4136381" />
<circle
style="fill:#00ffff;stroke:#808080;stroke-width:0.465;stroke-linejoin:round"
id="path31-35"
cx="46.963703"
cy="66.363197"
r="4.4136381" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.71292px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="44.822308"
y="69.246071"
id="text6992"><tspan
sodipodi:role="line"
id="tspan6990"
style="stroke-width:0.264583"
x="44.822308"
y="69.246071">2</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.71292px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="59.07151"
y="48.27179"
id="text6992-6"><tspan
sodipodi:role="line"
id="tspan6990-2"
style="stroke-width:0.264583"
x="59.07151"
y="48.27179">3</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.71292px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="87.072014"
y="47.188446"
id="text6992-6-9"><tspan
sodipodi:role="line"
id="tspan6990-2-1"
style="stroke-width:0.264583"
x="87.072014"
y="47.188446">4</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.71292px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="106.24758"
y="61.080338"
id="text6992-6-2"><tspan
sodipodi:role="line"
id="tspan6990-2-7"
style="stroke-width:0.264583"
x="106.24758"
y="61.080338">5</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.71292px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="101.70933"
y="83.80732"
id="text6992-6-0"><tspan
sodipodi:role="line"
id="tspan6990-2-9"
style="stroke-width:0.264583"
x="101.70933"
y="83.80732">6</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.71292px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="78.262543"
y="68.211586"
id="text6992-6-3"><tspan
sodipodi:role="line"
id="tspan6990-2-6"
style="stroke-width:0.264583"
x="78.262543"
y="68.211586">7</tspan></text>
<ellipse
style="fill:none;stroke:#ff0000;stroke-width:0.465063;stroke-linejoin:round"
id="path22811"
cx="7.103251"
cy="107.58765"
rx="10.555157"
ry="47.827599"
transform="matrix(0.64934741,-0.76049191,0.74524775,0.66678766,0,0)" />
<ellipse
style="fill:none;stroke:#008000;stroke-width:0.465166;stroke-linejoin:round"
id="path22811-0"
cx="24.88133"
cy="108.60269"
rx="6.5458894"
ry="29.90551"
transform="matrix(0.67220939,-0.74036108,0.76517273,0.64382505,0,0)" />
<ellipse
style="fill:none;stroke:#0000ff;stroke-width:0.465162;stroke-linejoin:round"
id="path22811-0-6"
cx="-17.490559"
cy="79.897964"
rx="4.4231157"
ry="20.004084"
transform="matrix(0.64401099,-0.76501624,0.74052609,0.67202761,0,0)" />
<image
width="106.3625"
height="69.320831"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,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
5+cdvfDCC8iRjI2NfeuttwBg6dKl+/fvD/KFwwyN0VNKjRkZTCYTuvPHjRu3c+fO2tra//3f//3j
H/94/Pjxurq68+fPkyS5ZMmSb775hs/nHzx4sLq62m63T5061deqB3v27BGJRBcuXLBYLLNnz374
4YcBoLq6+tq1a0lJSbNnzz5z5syMGTNWrlx56NCh6dOnd3d3c7ncF1544ZNPPvnggw9u3rxpsVhy
c3OpF7x48aLriI8giAULFlRUVOh0uiVLljQ2NlJPrV69msvlAoDVaqXRaADw5z//GQBu375dVFS0
du1aACgoKHjzzTeH4UJiAgfLFmZwoEEi2m5qakpNTb3//vsB4Pjx48ePH8/PzwcAg8FQV1en1+uf
eOIJHo8HAEuWLPH1gsePH798+TKKN+l0urq6OhaLNWPGDLlcDgAogiYSiRITE6dPnw4AqAHDk08+
+dvf/rakpOTjjz9G+kKhVCrdFj1++umn/+d//ken07333ntvv/02tX///v0FBQXojTz22GNop9ls
fvLJJz/88MPU1FQAiIuLa21tHeJFwwQXLFuYIcHn89EGSZKvv/76T3/6U+qpDz74wLMVCYPBQFEw
s9lMnfj73/++qKiIOqayshI1kwMAOp2OKmzdXorH4y1cuLC8vPzw4cNuSxxzuVzqxREzZsy4evUq
l8udMGFCv+/oxRdfXLZs2YIFC9BDs9mMPDJM+IBjW5jgUFRU9PHHHxsMBgBQKBQdHR1z5sw5evSo
yWTS6/V///vf0WFpaWlVVVUAgNwrdOJHH31ks9kA4ObNm0aj0fPFs7KyWltbUW85vV5vt9sB4IUX
XvjlL385ffp0tw632dnZ9fX1bq+wY8cOVz/LF3/4wx/0ev1rr71G7bl586bXSUZMCMHeFiY4PPzw
w9evX581axYAREVF/d///d/UqVNXrlyZl5eXmpr64IMPosNeffXVp5566tNPP503bx7a88ILLzQ1
NaGeObGxsaj5shssFuvQoUO/+MUvTCYTl8v96quvoqKipk2bJhQK161b53ZwVlaWTqfT6/UCgYDa
iXqQ9su7777LZDJR8O7FF1988cUXT5069eijjw7+emCGEdwBAjMSbNu2LSoq6tVXXw3ia7a2thYW
Ft64cQNF013ZuXOnQCBAqVtDZM6cOeXl5RKJZOgvhQkWeJCIiUj27ds3c+bM7du3e2oWALz00ktU
dGwoqFSql19+GWtWuIG9LQwGE2FgbwuDwUQYWLYwGEyEgWULg8FEGFi2MBhMhIFlC4PBRBj/H2ES
RucF54dtAAAAAElFTkSuQmCC
"
id="image23249"
x="-67.637215"
y="76.273842" />
<image
width="106.3625"
height="69.320831"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,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
gg==
"
id="image23261"
x="121.43412"
y="99.117989" />
<image
width="106.3625"
height="69.320831"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZIAAAEGCAIAAADAF4T4AAAAA3NCSVQICAjb4U/gAAAgAElEQVR4
nO2de0CUZfbHv+9cYAbkjhgwJNqUioKoCJKliBdCNyQvqD/TCI1iV90lr9VqaBfbzNXKjaR0U2tF
NIVaSy11TC1SSSKtBEQ2ZsALCIPIMMzl/f3x4jDMDBdhuJ/PXzPPPO87Zwbn63nOc55zGJZlQRAE
0X3gdbYBBEEQ9wfJFkEQ3QySLYIguhkkWwRBdDNItgiC6GYIOtuA1uDu7u7r69v0nLt379rb23eI
OfcHGdYKuqxtZFgruC/bCgsLS0tLTUfZbsioUaOanXPy5Mn2N6Q1kGGtoMvaRoa1gvuyzeKPnRaJ
BEF0M0i2CILoZpBsEQTRzSDZIgiim0GyRRBEN6NbJkAQBNEdSb+o2HT0iqJC5Z15YmXEoOgR3q27
D8kWQRAdQfpFxUsHf1FpdAAUFaqXDv4CoHXKRYtEgiA6gk1Hr3CaxaHS6DYdvdK6W5FsEQTRERRX
qJodaSEkWwRBdARezuJmR1oIyRZBEB3BXyc+bPxULOSvjBjUultRSJ4gCOvDbRoWV6i8nMXcpqGt
kAfAvY9NaVWt973B1t2cZIsgCOtgkConsfBurVajY2G0afj5T3JvZ/HpVRO+++5UWFhYW96IZIsg
CCtgnN9QodIYv6TS6N76+vebd2r+MkHK4zFtfy+SLYIgrIBJfoMJ1ytrADiKhFZ5LyuE5OPi4jw8
PIYNG2YYef/99wcNGjR06NBVq1YBKCsrmzBhQp8+fZYsWWKYk5WV5e/vL5VKly1bxrIsALVaPWfO
HKlUGhISUlhY2HbDCILoMFqSzfDPb3LTLyra/l5WkK3Y2NgjR44Ynp48eTIjIyMnJ+fy5csrVqwA
IBKJXnvttXfeecf4qoSEhJSUlLy8vLy8PO7yHTt2uLi45OfnJyYmrl69uu2GEQTRYbQkm6EtKabG
WEG2xo0b5+rqanianJy8Zs0aW1tbAB4eHgDs7e0fe+wxkUhkmFNSUlJZWRkaGsowzMKFC9PT0wFk
ZGQ888wzAGbNmnX8+HGW+s4SRPdhZcQgkbBeT4Q8xsXOwpKw1Smmxlg/tpWbm3v69OlXXnlFJBK9
8847o0ePNp+jUCgkEgn3WCKRKBQKbtDHxweAQCBwcnIqKytzd3c3violJSUlJQWAXC6XyWRNm1FV
VdXsnE6BDGsFXdY2MsyAMzC1P+9gvh6Am4iZ+YjwUS/hcpm2rKaB/+EqYtpum/VlS6vVlpeXZ2Zm
nj9/PiYmpqCggGFM9w5MPClugsVBY+Lj4+Pj4wEEBQU1u4Eqk8nauMnaTpBhraDL2kaGGVMk+t/B
/EunV03wcbXjRtY61W8vAhAL+Wun+/dR5rXRNutnyUskkhkzZjAMExwczOPxLHTdACQSiVwu5x7L
5XIvLy9usKioCIBWq1UqlcYLT4Iguj4/F1W497GRuNQHuaJHeG+c4e/tLGYAb2fxxhn+rU4xNcb6
3lZ0dPSJEyfCwsJyc3Nra2tNFnocnp6eDg4OmZmZISEhu3fvXrp0KYCoqKhdu3aFhoYeOHAgPDzc
3NsiCKIr83NRxXCJs8kvN3qEt1WkyhgryNa8efNkMllpaalEIlm/fn1cXFxcXNywYcNsbGx27drF
fQZfX9/Kysra2tr09PRjx475+fklJyfHxsaqVKrIyMjIyEgAixYtWrBggVQqdXV1TU1NbbthBEF0
GHdqNPm3qp4c7tUB72UF2dq7d6/JyKeffmoyYp6HFRQUdOnSJeMRkUi0f//+tttDEETH84tcybIY
7uPcAe9FFSAIgrAC2fIKAMMlTh3wXiRbBEFYgZ+LKnzd7JztbDrgvUi2CIKwAtlFFYEdskIEyRZB
EG3nurLmRqW6YwJbINkiCKKNpF9UTH3vNIAPTl61yknpZqHCNQRBtB7jMlu3qtRtaSPWcsjbIgii
9VixjVjLIdkiCKL1WLGNWMuhRSJBEC3FvLGFl7NY0VCnWt1GrOWQbBEEYQFzhTIOYxkaW6yMGPRi
Wrb+XvWWtrQRazkkWwRBmGJRoSyGsY4ljmMAe1t+tVrn1bY2Yi2HZIsgCFPMFWp52s86s4LDxRUq
2ZVbOhY7nxkdMtCtw8yjkDxBEKaYh9XNNQuAl7P4yOXrbvY2Qb6NV8fLScOWYUhyxpZhyEmzinnk
bREEYYp5oN0cWwHvb5MeTvriclSgF9+8+2FOGo5vgLIIYAAWAJRF+HIZAMCjjeaRt0UQhCl/nfhw
0xN4DBxs+W99/fvdWt2xyzdMk+Nz0vDlMiiLANRpFodGheMb2m4eeVsEQdTDbSByrpaDraBKreUx
jMkK0dtZPFbqlnahrq562d1a0+T44xugacRZU8rbbiR5WwRB1MFtIBqWh1o9u2VO4OaY4WIh3zCH
S3E4k9+gR4RpcnwT2sTwxsui2xjnItkiCKIOiykOFttYlFTUmFzbIIrvJGn0PVgdA7YuztVa5aJF
IkEQdTR2Use8jUUzyfFj/oyjLxm9yAAsGD7Yek2si3MFxLTCTvK2CIKow/xcTmMndVZGDDJfOda/
XKkAGDh4AgycfDAjBUlKsHrTu7Q2zmUF2YqLi/Pw8Bg2bJhh5P333x80aNDQoUNXrVrFjWzcuFEq
lQ4aNOjo0aPcSFZWlr+/v1QqXbZsGdfYVa1Wz5kzRyqVhoSEmLfMIAiivZk5qoFL1cRJnaYaIKrv
4Kc9GDYDy39HUgUSL9W5VOYrxybWkk1ihUVibGzskiVLFi5cyD09efJkRkZGTk6Ora3tzZs3Afz6
66+pqamXL18uLi6eNGlSbm4un89PSEhISUkZM2bM1KlTjxw5EhkZuWPHDhcXl/z8/NTU1NWrV+/b
t6/tthEE0SyG44cCPiMSMC72tteVNc2e1LHQALE+Vwtwf8T0gonr8OWy+h1GoRgT17XOYCt4W+PG
jTPuIJ2cnLxmzRpbW1sAHh4eADIyMubOnWtraztgwACpVHru3LmSkpLKysrQ0FCGYRYuXJiens5N
e+aZZwDMmjXr+PHjrKWsXIIgrIth95AFNDpWx2L1E4OvvTXt7Jrw+ztd2CBXCzi71TTiHhCDJ9+D
kw/LrRyffK91gS20R0g+Nzf39OnTr7zyikgkeuedd0aPHq1QKMaMGcO9KpFIFAqFUCiUSCTGIwAU
CoWPjw8AgUDg5ORUVlZm0tE6JSUlJSUFgFwul8lkTZtRVVXV7JxOgQxrBV3Wth5g2GuyapWm3kXQ
6NjXMn52Vubd7zuO+eFlkXGulkZVc/jlzNsmCfEeGLGtqqqqT58+uA209quzvmxptdry8vLMzMzz
58/HxMQUFBSY+E0Mw5iPALA4aEx8fHx8fDyAoKCgsLCwps2QyWTNzukUyLBW0GVt6wGG3T5y2HSk
hm3Nh5KVmgyI1KUW79P2L836O4kSiWTGjBkMwwQHB/N4vNLSUolEUlRU5zrK5XIvLy+JRCKXy41H
uAu5aVqtVqlUGi88CYJoJ1q+e9gM1ou4N4v1ZSs6OvrEiRMAcnNza2tr3d3do6KiUlNT1Wr1tWvX
8vLygoODPT09HRwcMjMzWZbdvXv39OnTAURFRe3atQvAgQMHwsPDzb0tgiCszsqIQQKjg9Ctr/M3
cR2Mf7NtiLg3ixUWifPmzZPJZJxXtX79+ri4uLi4uGHDhtnY2OzatYthmKFDh8bExPj5+QkEgn/9
6198Ph9AcnJybGysSqWKjIyMjIwEsGjRogULFkilUldX19TU1LYbRhBEs4QN6stnIBDy1Bp9m+r8
iV3BshC7QFUBJwkmrmt1xL1ZrCBbe/fuNRn59NNPTUZeeeWVV155xXgkKCjo0qVLxiMikWj//v1t
t4cgiJZgfGp61eRH/hwmbeWNDHkPDB8RbyLw/6xppSXocA9B9EaMyy4DeP94vpeTuDV+Fpf3wO0h
sjocfhE8Qfv5WRx0uIcgeiNW629oUqPGShW1moa8LYLoXRivDY1pZX9D83OF1qio1TTkbRFEL8Kk
opYxXT/vwQDJFkH0IkzWhgZan/cQ/negg/IeDJBsEUQvwuJK0LSEw31h7w6wsHNDm08athyKbRFE
L8LTSVSsbFCY1NtZfHZNeDOX1aU4yC0kZF38FGJXvPgbBLbtYK9lyNsiiF7ExCENzja3aG1YX9rB
rJhy9W38fhgBczpSs0CyRRC9B5Zlf5Yr+zrYeDmLLJT3a4zGUhxy0vDeCOhqcfmgtfq2thBaJBJE
byHrf+U5cuVr0cMWjOl/H5dZSHEowj8GoLYKuloAqLpR17e1/aNaHCRbBNHzMeRqMQxs+fdZpMBJ
Ul/8z4DqdoOnbehn0QpokUgQPRzjXC2Wxatf/GraRLppgha1aFr7Z5kaINkiiB5OW8/xFGeBL4Jj
cyGw9s8yNUCLRILoURjWg96ZJ7gqNI11P2wGQ9IDWAyJwpw92DLMwmqRo0OyTA2Qt0UQPQfj9aCi
QvXSwV/SLyq8nEUm05o/x2Oc9AAg7xvkpGHiOgiNLuQJIXbtyCxTA+RtEUTPwXw9uDztZ13DLg3N
5GoZNw0zoFXh+AYkXgLQaN5pB0KyRRA9B/PVn0GzGIAFvJuuX2pcPMsELuIeENNZUmUMyRZB9By8
nMUWqzvgnmY1c47HJLPUmA6MuDcLxbYIouewMmKQDb/RH3XzkfjGkhg6NuLeLCRbBNFziB7hPcSz
D9eIh2/W+6r5SLxFl6rDI+7NYgXZiouL8/DwGDZsGPc0KSnJ29s7MDAwMDDwq6++AlBbW/vss8/6
+/sPHz7c0Ck3KyvL399fKpUuW7aMa+yqVqvnzJkjlUpDQkIKCwvbbhhB9DZKq9S/ltx5duyAT56w
3xwzXCzkG15q0alpv+gGT4VizPgIiZe6lGbBKrIVGxt75MgR45HExMTs7Ozs7OypU6cC+OijjwD8
8ssv33zzzfLly/V6PYCEhISUlJS8vLy8vDzu8h07dri4uOTn5ycmJq5evbrthhFEb+PzLLlGx84L
9gEQPcJ74wx/b2dx86emc9KwZRiSnJH5AWyd4CTplLSGlmOFkPy4ceOado5+/fXXiRMnAvDw8HB2
dr5w4YKPj09lZWVoaCiAhQsXpqenR0ZGZmRkJCUlAZg1a9aSJUtYlqUOrwTRQtIvKjYd/V1RUWPD
511SVDoDAKJHeDdf4MGk9Y62BhPf6ZpqZaBddhK3bdu2e/fuoKCgzZs3u7i4DB8+PCMjY+7cuUVF
RVlZWUVFRTweTyKpW0VLJBKFQgFAoVD4+PgAEAgETk5OZWVl7u7uxrdNSUlJSUkBIJfLDYvNxqiq
qmp2TqdAhrWCLmtbFzHs+2LNJ5dqa/UAUKvTr9qfPU/KArKWXDvmh5dFxruHOnXN4Zczb3s0fkVb
afuXZn3ZSkhIWLt2LcMwa9euXb58+c6dO+Pi4n777begoKD+/fs/+uijAoGAbZj/xnlVFgeNiY+P
j4+PBxAUFBQWFta0GTKZrNk5nQIZ1gq6rG1dxLBX3jrBaRZHrR7//YO3Pi6sRRfLSk0GROrSdv1Q
bf/SrC9b/fr14x4899xzf/rTnwAIBIItW7Zwg48++ujDDz/s4uIil9dttcrlci8vLwASiaSoqEgi
kWi1WqVS6erqanXbCKJHYp7ZUFbDWpxpAfO6NF0pRcsi1k+AKCkp4R4cOnSI216srq6+e/cugG++
+UYgEPj5+Xl6ejo4OGRmZrIsu3v37unTpwOIioratWsXgAMHDoSHh1NgiyCaJf2iYuxbJ8wlyk3U
4p+PyUnDLpaiZREreFvz5s2TyWSlpaUSiWT9+vUymSw7O5thGF9f3+3btwO4efNmREQEj8fz9vbe
s2cPd1VycnJsbKxKpYqMjIyMjASwaNGiBQsWSKVSV1fX1NTUthtGED0b7uC0eQMxsZA/8xG+xUss
EBADXS0y/gIATj6deNKw5VhBtvbu3Wv8dNEi06Jivr6+V66Y1vcJCgq6dOmS8YhIJNq/f3/b7SGI
XoLFpofcqUNnZV6jl5m34ek7GADmfIohT7anvVaDziQSRDeDq6hVXKEyXxsyAHfqUCZrRLaM0x24
NjwA1JUA4Dm8vSy2NiRbBNGdaGxhyNH88R2LbXgGhkHsCicfq1nZztCZRILoTlhcGHK06PiOhTY8
cpT8DM/h6D6bYCRbBNGdsFjF4T6aHponNzh54+Zv8Aq0koEdAckWQXQnPM0qLHs7i6+9Ne3smvDm
NQvA+DUNngrFGPkM9JpuFNgCxbYIortwLxJfYzzYooWhMXYuAGDnjupSCO3x5FbU3gUAT/K2CIKw
Ksa9LQBwUajmF4aG0g5bhtX1u//9MEROWP47/GdDYIOhT6EkGyInuPi2+2ewHuRtEUQ3wCQS36IK
y+a5Dno9rnyNhyPAF8IvGr/sR+GZbhePB3lbBNEtaE2vQ/Nch2/WQnUbg6cBgHQihPb45QBuXO5e
K0SQt0UQXRlDZqn5S82naJnnOty9Cb4tpBMBQCiGxxBkfwoAFz/DA/5d/0yPgRZ5W+Xl5Tk5Oe1t
CkEQxhjiWWxdk9V6WhSJt1jIgWFw5WsAyEnD9Xs/alUZvlxWF/zqDjQlW2FhYZWVlbdv3x4+fPiz
zz774osvdphZBEGYZ5byGeY+UrSGz7UwqK2pU6jjG6CrrR/n0uW7CU0tEpVKpaOj48cff/zss8+u
X78+ICCgw8wiCMJ8bahn2WtvTbM82+SANNsXBadg6whbR1Q2XC1yCmUxXb6b0JS3pdVqS0pK0tLS
uGp/BEF0JObRq0bjWdymobIIYKEswsH48aeiIT8Hv+l48fK9fAkjOHUzoctXBzTQlGy9+uqrERER
Uql09OjRBQUFDz/8cIeZRRC9Ga74n0l/6abiWabdpNk6obp0ADlplhWqG1YHNNDUItHT09MQiR84
cCDFtgiiA7BY44GrotVoPKux9R23Hpy4rj6BC/cUits3NCm81U1oSraWLl36008/NfaUIIj2wDwS
33xmqXk9eANKeaMKFRDTjaTKGMuy9cMPP3z//fe3bt365z//yY1UVlbqdJbLZRAEYUVak1k6cR0O
vQDW0i+UWyF2W4WyiGXZqq2traqq0mq1d+7c4UYcHR0PHDjQgYYRRO/CkFnKMGjYe68FmaV+05Gx
FDwRNHcBpj7Nq1tFrFqOZdkaP378+PHjY2Nj+/fv3+wt4uLi/vvf/3p4eHC14ZOSkj766KO+ffsC
ePPNN6dOnarRaBYvXvzTTz9ptdqFCxe+9NJLALKysrgWGFOnTn333XcZhlGr1QsXLszKynJzc9u3
b5+vr681PyhBdGGM41kmmtWizNICGXQ1mHsAD0/mMiFYpZzpbhGrltPUTqJarY6Pj58yZUr4PSxO
i42NPXLkiPFIYmJidnZ2dnb21KlTAezfv1+tVv/yyy9ZWVnbt28vLCwEkJCQkJKSkpeXl5eXx12+
Y8cOFxeX/Pz8xMTE1atXW+sTEkTXp62Zpb9mwNYJA8YDQEAMEi+dCktH4qUeqVloOiQ/e/bsF154
YfHixXx+U82Lxo0bxylRYzAMc/fuXa1Wq1KpbGxsHB0dS0pKKisrQ0NDASxcuDA9PT0yMjIjIyMp
KQnArFmzlixZwrIstUokegn3l1lqgrYWv/8Xg6dCYGN9y7okTXlbAoEgISEhODh41D1aeNNt27YF
BATExcWVl5cDmDVrlr29vaen54MPPrhixQpXV1eFQiGR1OWSSCQShUIBQKFQ+Pj4cO/r5ORUVlbW
pk9GEN2H+8gsNefad6hRwi/ayjZ1YZrytp588skPPvjgqaeesrW15UZa0uA+ISFh7dq1DMOsXbt2
+fLlO3fuPHfuHJ/PLy4uLi8vf/zxxydNmsQ2XL5zXpXFQWNSUlJSUlIAyOVymUzWtBlVVVXNzukU
yLBW0GVta7th3xdrPs/VlNU0+Mdvw8O0B3WN3dnjxqmBBXts1aVqW/dSt6AHrp/kA+qDfykYuPBm
v/HWMqz9aLttTckW19p+06ZN3FOGYQoKCpq9Y79+/bgHzz33HHcq6D//+c8TTzwhFAo9PDzGjh17
4cKFxx9/XC6vS5CTy+VeXl4AJBJJUVGRRCLRarVKpdJcIuPj4+Pj4wEEBQWFhYU1bYZMJmt2TqdA
hrWCLmtbGw1Lv6jYc/wXlaaBZjWTWZqThrPJXO6oSH1LUvw1NyxSl/rlJ/sNGcLFs7rsNwZr2NbU
IvFaQ1qiWQBKSkq4B4cOHRo2bBiABx988MSJEyzL3r17NzMzc/DgwZ6eng4ODpmZmSzL7t69e/r0
6QCioqI4oTxw4EB4eDgFtogeT2OZpU3F4E3P8RjRrao4tIWmvK3du3ebjCxcuNB82rx582QyWWlp
qUQiWb9+vUwmy87OZhjG19d3+/btAP7yl788++yzw4YNY1n22Wef5SpJJCcncwkQkZGRkZGRABYt
WrRgwQKpVOrq6pqammq1j0gQXZX7yyytq/HQSDY8R/ep4tAWmpKt8+fPcw9qamqOHz8+cuRIi7K1
d+9e46eLFi0ymdCnT5/9+/ebDAYFBXF5XgZEIpH5NILo7hjySL3MVn9eziJFw048zdR4aMzPMtB9
qji0haZk6/333zc8ViqVCxYsaH97CKJHYZxHqqhQvXTwFwDRI7w5LVO0vHtYE2tDAz00J96cltaS
t7Ozy8vLa1dTCKLnYRK9Uml0m45eAWBc44G514mn3hczqfkXEGN59efkg4enIO9Yd6zi0BaaSYDg
4uI6ne63336LiekV3whBWBGL0atmuoeZNwqDpRoPTj5IbBBm6T00JVsrVqyomyQQ9O/f35AgShBE
0zRxLpoFFE1H4s0bhR3fgIAYnN5cP9hr1oMWaSoBYvz48YMHD75z5055ebmNTW85N0AQbcS4446e
bX4+TCLxFqu83/wdQns4SgAGTj548r1esh60SFOylZaWFhwcvH///rS0tJCQECpcQxAtweK56Cbm
m0biHT1NZzg8gCtfIfTPePEykip68BnpFtLUIvGNN944f/68h4cHgFu3bk2aNGnWrFkdZRhBdA/M
8xssnotmzHodAmAA86wIuD6EyuIG8+6UAECfflY3vpvSlGzp9XpOswC4ubnp9foOMYkgug3fF2tu
n/hgH1K9bEuLq923HpoL/NnLWWwSveLWgCaDpqWWDbuHYOExDGqlaQz+m7UQOfVyP4ujqUXiE088
ERER8cknn3zyySfTpk3jimcRBGHgbu7JDUyKhFfKYyDhlW5gUrIPp6yMGCQS1v+yuDXgyohBYiHf
ZBAActKwZRiSnHAwvq5jGIDbVzFxHZx8GrxZrzm70yyWva38/PwbN25s2rTp4MGDZ86cYVk2NDR0
/vz5HWwcQXRxEvT77Hj1vZ3tmNrFtZ9KRqz/6Y/y3T/8z3wNaJou3yD33WgRqe32HVjbFcuy9be/
/e3NN98EMGPGjBkzZgC4cOHC3/72ty+//LJDrSOIrkbDRFAvXqnJ6168MgBVaq2LnfDC3yfzefXB
+OgR3vUxrJw0bGnygCH3Fqa5WpSEBDS2SCwsLOQOPBsICgpquoQpQfR8TJo/f7mshudgMqVG/IBe
z566cmv8I32NNauR+zRON+/A2q5Y9rZqamrMB1Wq5o5EEUTPxiwRVMB3qIGtCGpuQA/YoYbd4JKh
d7tuvwoY0aL7mNP9O7C2K5a9rdGjR3/00UfGIzt27Gh5UWaC6JmYhZaEuqpt2ijusYqxY1hAVc6A
lfBKR/38KnLSWnifezAAGmSTBsQg8RLlaplg2dvaunXrU0899dlnn3FSdeHChdra2kOHDnWsbQTR
xTALNlXw3RgNy4JhVuQxyeOYu9WGlxjtvUM5BupTHCze3If8qRZiWbb69ev3/fffnzx5kiuJNW3a
tMa6jRFELyJ8LQ49b9jyU8H2VVXMIsHRchd/1z59be+WmM43VqgmCmYJxb38sM790lS66YQJEyZM
mNBhphBE18SQBx/pePMDsBC7sqrbNazNas2i7/X+7/E+eLcspv9FxRTxA3aqBspVLX7AzvDEPJ7F
8MHqKWjVCppKNyUIwvhc9KPVJ6tZ2y/Dj+7lTxdA94N+2AT+RQBHNYGbjl55WzOnmq2vOMCyEKtK
sGVYXYTLfG3I6ilo1TpaWiaQIHonhnPRAmin8n/8Vj/yH8flourH/882Yxb/O39eQQnr+ivbn6lQ
7ULwbV7tKkGaF1PKAHWnp5sqmEVJWK2EvC2CaArDuejHeJdcmaovdI8qKlRXWa88vddyQVok75wD
qqN4Z72cxV7O4i/0jz1W+14x696g4gN3KGfiOjBGPzdKwmoDVpCtuLg4Dw8PrrcYgKSkJG9v78DA
wMDAwK+++grAZ599FngPHo+XnZ0NICsry9/fXyqVLlu2jGvsqlar58yZI5VKQ0JCKLWV6Hxy0rBl
2FXR/Cyb+J9s4/8tfFvPMo6oAhDFO9OfuSlg9AyDPkzNP4Qfb/XLM5w69GJMU+ehlKP/WLB62DpQ
way2YwXZio2NPXLkiPFIYmJidnZ2dnY2d/p6/vz53NM9e/b4+voGBgYCSEhISElJycvLy8vL4y7f
sWOHi4tLfn5+YmLi6tWr224YQbSee4nsPLBuvCpXpophwGPY14X/juKdWSVIs2G0hrlipnb01fej
R3hvnOHv7SwuZt1N7+YkQfZnAPD8dxTPajtWkK1x48aZd5C2yN69e+fNmwegpKSksrIyNDSUYZiF
Cxemp6cDyMjIeOaZZwDMmjXr+PHjLNuyupAE0Rh1xRWc6+PiLb/k0AsWkxXsmLrolekLSjmA6BHe
Z9eES2ZtbHAoBwwmvIyf9mDAeLgObOVnIYxol5D8tm3bdu/eHRQUtHnzZhcXF8P4vn37MjIyACgU
CkNleolEolAouEEfHx8AAoHAycmprKzM3b3B/1opKSkpKSkA5HK5TCZr2oaqqqpm53QKZFgruC/b
PG6cGliwx1Z9C3VZ54CySJe+5Mpvv93sN77pCwdd+RdfrwYAVtfYNPafeOcAACAASURBVC+mrJh1
lzRUrhpb98x6Cz08pAkDC/bYqks1QgcbTaXui7/y9bW1dyvy961v2gZr0WP+mhaxvmwlJCSsXbuW
YZi1a9cuX758586d3PiPP/5oZ2fHhcBMPCmuP5DFQWPi4+Pj4+MBBAUFhYWFNW2GTCZrdk6nQIa1
gvuwLScNZ5PNHSW+Xu1XvN9vzqumk7m0dbELAKhut+Qdilm3t7Uxbwk/tmPulawRikXT3gwLMLYw
DHgVgE1OGg49z9fXArDRVvrlJ/sNGdIBK8Qe8tdsBOvvJPbr14/P5/N4vOeee+7cuXOG8dTUVG6F
CEAikcjldWkscrncy8uLGywqKgKg1WqVSmULF54E0YAmTimbZE4Zl3NQ3W6hZmn5oo9tnv5S/9jb
wj9Xiz3ZZuPrxzeANSoLTKX+rIH1va2SkhJPT08Ahw4dMmwv6vX6/fv3f/fdd9xTT09PBweHzMzM
kJCQ3bt3L126FEBUVNSuXbtCQ0MPHDgQHh5u7m0RRPM0UUjPJE+qBX2etSyPB7actWcYxoWpYpwk
gonrkgJikgBgGrC+eceBSv21A1aQrXnz5slkstLSUolEsn79eplMlp2dzTCMr6/v9u3buTnfffed
RCIZOLA+HpmcnBwbG6tSqSIjIyMjIwEsWrRowYIFUqnU1dU1NTW17YYRvRHzrE4Ohm+aJ9WcfFSz
Nms0i7/QP8Y99XYWn028/5O5lGXaDlhBtvbu3Wv8dNGiReZzwsLCMjMzjUeCgoK4c9oGRCLR/v37
224P0auZuA6HnjdalzEAC1tHqCtx9BUcjK8/A9iYwAEA5Hr3t7UxBs2Cpf7SLbXH+AQ1ZZlaA8qS
J3oWD4WDZeuzOmekIEmJiDcA4O5NQ1VS5KQhdKnlOwjFmPFRjDjFWLNg0oG15QTE4Mn34ORDWaZW
hM4kEl2bnDQc3zBeKcfFllVKuHwIYBF3FP2G1g+eervBHC4uHhQHAA6euHP93k5iucEXC/g5q1h5
3XCFaQfW+yIghqTKupBsEV2YezWqGBidSW5aAnL2od+wBpqFRuLiP+8tcx0ZVb22uEblJaprpZN+
UbHpqyvF/znMAg+6inV6NGi0Q3QNSLaILoxZ7XbTeqEmlF2F/Dwmm2UYmIex+vRFae67+nhFrQqA
okL10sFfLvzv9udZCq7eA4Ablep/zAwgteqCUGyL6MI0lj1gfmqHG3l/JADwRaZXmbTAAVB1kwXU
2vqMKpVGt/fHIoNmAVBr9ZuOXrHSJyGsCXlbRBfGYvaAcXVjbuX4RyZ+/k+9X3b8Vdi5NHDK6lvg
1N+NAV4V7lZpbAyhd53ZMdhW7h4S7Qx5W0QXZuI68OvrhdZlD5ivHLM+sbCWNIFrgdOwPT13Ltrw
lG+W4dzK3UOinSHZIrowATEYUtfOCyKnuuwBC9WNzY49N5ZKajbuxZRxD8RC/rwQH1tB/S+iTbuH
RHtCskV0bWwdIHa90+cheAytW+uZZ5kzfJOB63AfsObw2LdOpF9UNHjB7NrrjBsAV3ubjTP8X4/2
D3ukLwAG8HYWb5zhT/H4rgnJFtG1uX0VrgPL3Eah6EeoygH85PuccQxKxdpcfXA2eELjkTdrZ7P3
9gcbKFfD2LyasfWIftNRJJgwyINTqKJyVbCv67W3pp1dE06a1WUh2SK6Nrevwe2h266jwOpw9QSA
by8XMwxusk4sCzUrWK1ZvPB6DOzcwLcBmOvou9roIKFKo2uwG3gvZ50FI9e754e8KQicM8mv37e/
3dDo9IoK1a8llZP8PDrlgxIth3YSiS6MpgZKOVwHVrIPQ+yCvG8wbOYTtUd/g09k7VuL+V/9XfjZ
Vdbb585PsLn+unDpjruh5iVxTXYD03VjN6nfU9So+DxmU9+AocATQx84+JPix4LbBaVVACYN6ddR
H49oJSRbRBemvBBg4foQbvMhnYS8b1B8MYB3bZ3mGYBJ04WtEKSm2WywY9Q6lim/q7ZYxtt4N5Br
esglZ+n07Cvpl3g85olhD4iF/K8vlRSVqwa62w/s26eDPh3RWmiRSHRhbl8FALeBAGDriOpSpISx
gJoVAAjjXRSAtWfUDMBn2NeEn0TxzpjcQCzkGe8GGpoecnBLSJGQ/0g/+73n/vgu99bNO2rTKD7R
9SDZIrowZVcBwHWgx41TyP4PN8YArwr3zBVlrhKkCZj6NHeTJCyORY8NMI6sm6ePFleo0i8qfi25
o2cBoEqtNY3iE10Pki2iC3O7AGJXiF0GFuyBtl5x7Jja1/p87s0rM5luSMLydhb//toTLnbCKzeq
uJH0i4qxb50wX0V6OYs3Hb2i0dW/YhrFJ7oeFNsiugyGhhSGSn63r3IdumzVpg2+BFXFN+D+AG4Z
DxazbriXJioS8oP6u3zz640Baw47iYV3a7XG2sTBzUzcl20yTmd6ujjkbRFdA+OGFIZKfrevwe0h
AGpb04apjJNkY+3sarb+6E81a/O2NsaQJpp+UXE6rxQAC1SoNOaaZZhpfoKHzvR0cUi2iK6B+UnD
b9dDKYfrQwAKBi4wThPV8kSYuO6C4+Q1msVyvbueZeR69zWaxVmOkw1popuOXqkxKvBgAgMYZq6M
GCQW1ufZ05merg8tEomugfkpwkoFwF644/zXt04oKoJi+zy/SrxPrLqu0LvZTE7yCIhZqVO8dLD2
i9q6zFKxkL/RSG6aXugZ+1MGmaOKgN0FK3hbcXFxHh4eht5iSUlJ3t7egYGBgYGBX331FTeYk5MT
Gho6dOhQf3//mpoaAFlZWf7+/lKpdNmyZVxjV7VaPWfOHKlUGhISUlhY2HbDiO6E+UlDOzcA/zin
UVSoAHxSFTyqautTff87U7S976NPA4ge4b1xhr+3s9jiEcImFnrm/lT0CO+za8LpTE93wQqyFRsb
e+TIEeORxMTE7Ozs7OzsqVOnAtBqtU8//fSHH354+fJlmUwmFAoBJCQkpKSk5OXl5eXlcZfv2LHD
xcUlPz8/MTFx9erVbTeM6LqY1/mbuK7BiWihGAPDAFzR9DWMqTS67CJlpUqbkV3MjTQhNyZLPyGP
cbET0hnpnoEVFonjxo1r2jk6duxYQEDA8OHDAbi5uQEoKSmprKwMDQ0FsHDhwvT09MjIyIyMjKSk
JACzZs1asmQJy7LU4bWnUbdXWFTXBwxGFeL9piP9LxCKUHsXACa/hhuXb7N9KmGas67S6F46+Avu
Le4ag5Z+PZh2iW1t27Zt9+7dQUFBmzdvdnFxyc3NZRgmIiLi1q1bc+fOXbVqlUKhkEjqFgUSiUSh
UABQKBQ+Pj4ABAKBk5NTWVmZu3uD/aOUlJSUlBQAcrlcJpM1bUNVVVWzczqFXmuYx41Tg678i69X
A6jTLA6Nqubwy1fyFcP1tTmDVteIPILPL82/8ptbWZYcnhZvpdLoXsv42VmZ1/Q7OgNvjOEB9gCg
zJPJmpnfCnrtX7MttN0268tWQkLC2rVrGYZZu3bt8uXLd+7cqdVqz5w5c/78eTs7u4kTJ44aNcrR
0dH4Es6rYhuWxDV3teLj4+Pj4wEEBQU108EcaL7LeSfRew3bsgR1mmWKSF06XFQCgTgg6i8Qiity
k7UFsmq9skA/uLGb3a5hu8LX2Hv/mm2g7bZZPwGiX79+fD6fx+M999xz586dAyCRSMaPH+/u7m5n
Zzd16tSffvpJIpHI5XU7R3K53MvLi5tWVFQEQKvVKpVKV1dXq9tGdCaNN6+/Dvc/Mg+e0vqN2Hja
d83hE2Uug9mr3kxpOO+n6bwzLnZC80sotao3Y33ZKikp4R4cOnSI216MiIjIycmprq7WarWnTp3y
8/Pz9PR0cHDIzMxkWXb37t3Tp08HEBUVtWvXLgAHDhwIDw+nwFYP4V70nYXFAg1Qs4IdmkkP8m4d
1QSWV2uieGci+ee4lxyZ6o3Cj6fzzsYH2FBqFWHACovEefPmyWSy0tJSiUSyfv16mUyWnZ3NMIyv
r+/27dsBuLi4vPjii6NHj2YYZurUqdOmTQOQnJwcGxurUqkiIyMjIyMBLFq0aMGCBVKp1NXVNTU1
te2GEZ2PUZcdBmBZGP4z0rNgAC34NaxgiSADwFL+wSrWdpUgTcxoDDewY2oX136a7zXBb4gfxdcJ
DivI1t69e42fLlq0yHzO008//fTTTxuPBAUFXbp0yXhEJBLt37+/7fYQXYiGue8MAy3L44EtZt3e
1sZ8oX/sZcGn8YK65D5PXvlbwo/FqDW5hxevLB+IHuFNUkVwUJY80Y6wSrnJUp8HdqD6M8PTqbxz
xq/aMbValidAg0M5NeIH2tFEohtCZxKJduQGTI9Ac0UaDHgxpqUdeNAbH5DW8kV2kWZND4neDckW
0Uq4ClaW+3rdY2PtbC1b/2+MK9IAwOCCFbPmuub+tvDP1WJPgIGTj2D6+w36SxMELRKJ1mFclJ3r
6wVLaes/O4yvqdnBY1kRNFw8K8txcuGa8PSLCi6+/rHN039nPxToauouEIolT25MCogB1nfsByK6
EyRbRGuwWJTdXLZe8MzrU6h+pnb1Kf1wGBVpMIqvT0POUNPqgATRJCRbRGuwWJTdZKS6Vuvzx8Gb
cL3qEMQoNY0mLgTEkFQR9wXJFtEavJzFioY6ZZ62vudY5mLdxRsBCWdmTulA04ieD4XkidawMmKQ
cWaDedp60e3qOz9+ymdYr/EW8vgIoi2QbBGtIdDHmQUEPAZAP0db8wpWbx7+9SneqVqvYLhLO8lG
osdCskW0BtmVmwA+mD8SwIopphGr7/NLr/965iGm2CZoQefYR/RoSLaI1nDyyq2B7vaThvRzsRP+
eO228UtanX79l7/G2p9lBWL4RXeWhUQPhkLyRPMY0qy43cCIoQ/8UFD2dEh/Ho8JHuD647UGbVY/
+/GP/90ondrne8ZvOkSOjd2TIFoNyRbRDOkXFWcOfbAPqV62pcXV7lsPzb1cPL9Wq58wuC+AkAFu
Ry/f4BQNQPnd2n9+k7vU63fh7SqMmN/ZthM9E1okEg0wP7KTfThlA5Mi4ZXyGEh4pRuYlIofP7Oz
4QcPcAUQMtAVgMHh2vzNlSq1Ntbuezg/iP6PdeIHIXow5G11H8x7zVsJbg2oqFA5nzpmaDqvqFAl
7sv+277sMzaf2vHqi8nYMbV/ZVO/1D/29S/Xo0d4D37A0VEkyLx6+6kRkl+LK//z4x9LR4nsL51B
2Brw6D9Fol0g2eomGNXbq+92Yw3lMj5dWKHSGL/EVSM1L9LgxZTVaPWGc4jBA9x+vFbGsmzSl5ed
xMIE53MAi+Hz2m4bQViE/j/sJpj3mj9+P+VczPsS3sPkdKE5loo0uOHeOUQAfWz5hWXVA1766ty1
25OH9BVdToXv43Dpfx/mEcT9QLLVTTDvH9F4RwlTOE9NWQSwdZ5aThruhbEUTTadB/C2NkZvVAXe
UHwGQHGFKv2i4utL1w2vXs85gfJCjHgaBNFukGx1E8x7zZuPNIYlT41bGzarWQCusA/yGNyFGEA5
22eNZvEX+rpYu5ezeNPRK2ptfTHSJ1nZXYgxJKqlthHE/UOy1Tm0pMae8bSXlE8Z19tTsTbnH1ra
0jcz88v0Svnf9mVbXBtyTedhVMlvEu8nAKenfK22cTnFjjRoFncO0bjwgx1qpvJ//FI7BjZ2LbWN
IO4fK8hWXFych4cH11sMQFJSkre3d2BgYGBg4FdffQWgsLBQLBZzIy+88AI3LSsry9/fXyqVLlu2
jGvsqlar58yZI5VKQ0JCCgsL225Yy2mhiLTuWvMJBk+Hvbdh52vpcuNpe2vGFLOu3GLtFuu0WrN4
9veSsW+d+Hv6L028O/fWcr2byXix2QiHt7N40+zhF9dNKXxr2pY5gd7OYgaYapN929n/iUdH2D70
2OQ+V7lBb2cxdw7RuPDDNH6mPaM+aUf1Hoj2xQqyFRsbe+TIEeORxMTE7Ozs7OzsqVOnciMPPfQQ
N/Lhhx9yIwkJCSkpKXl5eXl5edzlO3bscHFxyc/PT0xMXL16ddsNayEmIvLSwV9arlwm15459EH1
PwYbR77Nb/59sWbT0SuTdafO2CwrsP2/MzbLnuSdgaW3Ng6W20PlzZR9qpusZ5nd2smcy6OoUH2a
+Udjlhve+m1tjI6tr9egMgpOcUTxzpyxWVYg+r+ztsui+We5wegR3mfXhF97JWgom+s6cjoA9B9r
X604m/DItbemnV0THs0/iy3DztTMOGu7LIp3BsAs/ncFrFfkE7RCJNoXKyRAjBs37n6do5KSksrK
ytDQUAALFy5MT0+PjIzMyMhISkoCMGvWrCVLlrAs2zEdXpst1Gl8tGXC4L4nf79lOOZifG0U78wG
5mM7VS1Qn6Ow6ai7yc0/z9U/Vntio/BjO6YWgIQpfUv4MTT4Qv+YyVsbr78Cefl8hj2uHzmKlxvK
+/V93QzzD2LY2uOs5TGMjmUBVMKez7DlrL0T7vIY/FcXYljocWa/dc8YC6kVuUcA4JFIAOj/KAD8
7wcEzDYkZDCAN1P6D5sdfTXKEN7vl4ckRo9scdCNIFpFu+Rtbdu2bffu3UFBQZs3b3ZxcQFw7dq1
ESNGODo6vv76648//rhCoZBI6v5xSyQShUIBQKFQ+Pj4ABAIBE5OTmVlZe7uDbbeU1JSUlJSAMjl
cplM1rQNVVVVzc7hMA9LKypUhmu/L9Z8cqm2Vl83/mnmH4Y5q/Zn1xp1xlolSKv78XNoVOzB5/bp
3d/mxRjLRFmNfrVtg5l2TO0qQdoXtXUO1Kikr2Y+InzUS+gqYspq6vbwgphcPcv8pH/4B73f0/xv
bVGrRn17G2PLv/t82z5empdtaTHrflwfOJF30Zsp07C8DZoFh/TjPrd5NYT3Ox86HfiNmV1z+OXM
2x4eN04NLNhjq77Fgve77MDNB0rB6h7j2938YX/u7b5jfnhZZBTmF0P9kugQq+Mpnf1b+LXfFy3/
a3YwZFgraLtt1pethISEtWvXMgyzdu3a5cuX79y509PT848//nBzc8vKyoqOjr58+TIXzDLAeVUW
B42Jj4+Pj48HEBQUFBYW1rQZMpms2Tlc3nmBSF6sr+s2yg17O4vDwsK4V8cp5QsFDV41UKsHn4Hu
ntXmaZkMIOHVO1OG4QdgIYHT8Lisht3zm85viN/a6VhzMKdGowcwipd7hfUR2Dll1vgtFnwdyFz9
kR1i/oGieGde59f7cQuZb7lvUQj9G8KdOg0vRfun7TZbztn+2QV3iln3rZjrzSszuYlIXRrmehNn
k+91k9b7Xf3Qz88PATEofsyrvNArLAwy048g0FVDIHrUU4eAMItfdlto0V+zMyDDWkHbbbP+TmK/
fv34fD6Px3vuuefOnTsHwNbW1s3NDcCoUaMeeuih3NxciUQil9dtb8nlci8vLwASiaSoqAiAVqtV
KpWurq5Wt60B97KZeGA5ceECNHWFOnPStBlLzV81QWektOZpmRycM2U80lgCpwHDavEvE6QA+NAF
8fNsB469uG7KU9Gz9SwTyr/MzawLS9n+X5ZN/E+28e8KPzB2nYyVnzNDjBo9CzfmDnfAcBNvG4MG
/1sAAMPDwecsZ7f2fxSlV1B1C/Z9LXxUbY0hKYwg2g/ry1ZJSQn34NChQ9z24q1bt3Q6HYCCgoK8
vLyBAwd6eno6ODhkZmayLLt79+7p06cDiIqK2rVrF4ADBw6Eh4e3e2CrYTYT96uO4p05Z/+36Iyh
+kPP13fBsiQ9xnCGbtbO0pspAIdXQ4/m37oGe201sHlbG2MQoDM2y6J4Z7jAlrNYCOD7Z/vZoWbg
yIkApgUPqXQeMk54hQFi+5x7x3YHd8jZjVflylQ1/Z15MWVrbA7wjOZYns5aSprnsii4b+wdKe7e
svwe95u+TxD3jxUWifPmzZPJZKWlpRKJZP369TKZLDs7m2EYX1/f7du3A/juu+/WrVsnEAj4fP6H
H37IuVHJycmxsbEqlSoyMjIyMhLAokWLFixYIJVKXV1dU1NT226YSZUo054xZtlM3rzSt4Qf29XU
AuCxpgrEreOieGdWCdK8mNJi1t2wcmQBb2exo86Op0Ep6+CGOybywTh5MzX1Xo0XU65lmVussyev
HIBIKNiKD8CCExQuSO8qtAGmXfyjoq+DrUf5RQB4cAx3ubNf+MhzKddeC8e21VCqW/6F8JwlDzSe
W88CDMO3rFkAnCTIScP379VPZ/gQOUF123Rmy9P3CaJVWEG29u7da/x00SLTlgczZ86cOXOmyWBQ
UNClS5eMR0Qi0f79+9tuD8f3xZo9x5vsP2rvbuIyMAzfDrVohGLWLbbPuZd1O2xYNRruAAIorqhO
7Pf11QqvSeq3n+R9X783B2gZG8HEV72+qmt1Y4ea2XzZYX3o2/Yrz04txaHnoanmoYHnY8fUrtO9
h6R3VzHufu6LmaIrcPSGs0/9DF0t3vCE+fquIazxXYViTFyH4xugLGpkOgNWb/kVw7XGK0dWBxt7
2Nib3rDl6fsE0Sp6bJb857ka87SG+pd1WvBsGkiFUMw25mgA1azNxzZPJ9l/zmkWh2FdecZmWYFo
vrPyN37/R72c7b/UP/aydrGcddez0LGM0q4/AmJWRgyaZfP9GZtll23jHBnVH4znyohBOL6hMaXg
sXqAfYC9tejWRlw+CNXtuphRThrO7wDQtGaxAJx8mKBFcPLhutLjyfcQEIOJ6yA07QzGobZ1t6w4
hmstnos0uSEncATRnvTYwjVlNazxgu64PnBidTaSyiB2AcAtba67j9WXXvFkSxkGGj3P/LvQsjw+
9How69nFodPikfGuyQQvptTYsfItPnw2KiJdN3bV57x09WMAlvAPrbi7//gpWbTLzT8JPzbEyxKE
hwX8J1qynqpTVo2qLqPq+AZomzlIqOWLBNPft1zWhhus87mYeu0TigsGLvAbMqS+PA4AobhOsDic
JBYcq/obUltpooPosbI1X3T2FdZCKoBxLMbx1vk1msU86P8p3C7U3TW5QzVrs0azWAXxRzabo8cM
Cx3hjZNeqGyQQM8ADZKetCoc37BJ/V7tvdPFn+omLRUcDD0ZA6iNv2uBrgbHN1gQgibgot2WlY65
J8flcJIImtYOQxfohnUHb9728ONyFxrToInrTEWNc6yorTTRsfRY2Vol2GentZwKYMCwP8hjGiy4
WBYK1v1tbUyW4+SzKx7DPz8JvXMUmA8PP1PZMr+tUl5cU+8NjeP9zAdrC0uBc6UcM1IaCAEYgNWD
x0MjMSZOTUxdHh8kXrI8v2lM5IbLAGxCg8ixIroGPVa2HLWmWZQW8WLKzINELJjHat8TC/kbIwZB
YAPPQPyagSRngIXbI9CqmnKRnCReovpG86sEaQKmEQ1qZIVV8O1Or9OrGzhxxpc05vJ0DORYEV2A
HhuSV9taTv40oZh1s5j8aahwgJw0/I9LNGUBQPkHJq5rLOGJE5GVEYPEwrqjM+ap88YzASAgBomX
kFSBxEucIvhOiF3PPH+T56FnGwoqd0lADJ58zzTQThC9iR7rbRUMXOCXn2zwSljWwoLOUKjTOKwO
oVjy5MazAeF1T49vgNZoiadtPCbl5MPJCtfRlEsZu8n0fQAN0ixYgLk306LlAj4vt29kcFEogAX2
P75kk2anut5gUUYuD9G76bGydbPfeL8hQ7j113W4H9UNn8jL9mLKyll7hoEz7hazbpv1c06Lwiqq
Na5Cm1XCfabqwGFx198kJmWy4wZEj/CuyxHLuWsy8zdpgt+cV5uwPP2i4lKxknu8527IgdpH6/w+
giAA9GDZAuq9ktA1h1nARCq8ncUrIwZtqZODacB6yzdp466/2cybtz38mrR609ErGqOzjuaFdAii
l9OjZeseXs5ik+o03s7is2vCG5vfgLbv+lvcsGucYrNCOuYjBNGb6bEheWOMY+Qw1HhoIR0eAjcu
c9zYCEH0ZnqFt8WtsJo6Vt00HRsCXxkxyNBvFfcrsgTRC+gVsgXjGHmXp60iSxA9nd4iW92LbiSy
BNHx9IrYFkEQPQmSLYIguhkkWwRBdDNItgiC6GaQbBEE0c1gWLNeD10fd3d3X1/fpufcunWrb19L
TbE6GzKsFXRZ28iwVnBfthUWFpaWmnUg7Y6y1RKCgoIuXLjQ2VZYgAxrBV3WNjKsFbTdNlokEgTR
zSDZIgiim8FPSkrqbBvai1GjRnW2CZYhw1pBl7WNDGsFbbStx8a2CILoqdAikSCIbgbJFkEQ3Yzu
LVtxcXEeHh7Dhg0zHnznnXcYhjHkemzcuFEqlQ4aNOjo0aOda9v7778/aNCgoUOHrlq1qhNtMzEs
Ozt7zJgxgYGBQUFB586d60TDioqKJkyYMGTIkKFDh7777rsAbt++PXny5Icffnjy5Mnl5eWdZZu5
YStXrhw8eHBAQMBTTz1VUVHRWYZZtI2j038FFg2z2k+A7c6cOnUqKytr6NChhpE//vhjypQpDz74
4K1bt1iWvXz5ckBAQE1NTUFBwcCBA7VabWfZduLEiYkTJ9bU1LAse+PGjU60zcSwyZMnf/XVVyzL
Hj58ePz48Z1oWHFxcVZWFsuylZWVDz/88OXLl1euXLlx40aWZTdu3Lhq1arOss3csKNHj2o0GpZl
V61a1YmGWbSN7Rq/AnPDrPgT6N7e1rhx41xdXY1HEhMT3377beZec7GMjIy5c+fa2toOGDBAKpUa
vImOty05OXnNmjW2trYAPDw8OtE2E8MYhqmsrASgVCq9vLw60TBPT8+RI0cCcHBwGDJkiEKhyMjI
eOaZZwA888wz6enpnWWbuWFTpkwRCAQAxowZI5fLO8swi7aha/wKzA2z4k+ge8uWCV988YW3t/fw
4cMNIwqFwsfHh3sskUi4P2qnkJube/r06ZCQkPHjx58/f77r2LZ169aVK1f6+PisWLFi48aNXcGw
wsLCixcvhoSE3Lhxw9PTE4Cnp+fNmzc73TaDYYaRnTt3RkZGST8S+wAABylJREFUdrphxrZ1tV+B
wTAr/gR6TnXT6urqN95449ixY8aDbMP0Dsa8xWtHodVqy8vLMzMzz58/HxMTU1BQ0EVsS05O3rJl
y8yZM9PS0hYtWvTtt992rmFVVVUzZ87cunWro6Oj+audaJu5YW+88YZAIJg/f37nGmZsm0Ag6FK/
AuMvzYo/gZ7jbV29evXatWvDhw/39fWVy+UjR468fv26RCIpKqrrciiXy7lFUKcgkUhmzJjBMExw
cDCPxystLe0itu3atWvGjBkAZs+ezXnpnWiYRqOZOXPm/PnzOZP69etXUlICoKSkhFtWdJZtJoYB
2LVr13//+9/PPvuM+7F1kS+tS/0KTL40a/4E2iEY16Fcu3bNOCTP0b9/fy4YeenSJUPMb8CAAR0Z
kjexLTk5ee3atSzLXrlyRSKR6PX6TrTN2LDBgwefPHmSZdlvv/125MiRbOd9aXq9fsGCBX/9618N
I9y6lWXZjRs3rly5srNsMzfs66+/HjJkyM2bNw0jXedLM9C5vwJzw6z4E+jesjV37twHHnhAIBB4
e3t//PHHhnHDH4xl2ddff33gwIGPPPIIt1/WWbap1er58+cPHTp0xIgRx48f70TbTAw7ffr0yJEj
AwICgoODL1y40ImGnT59GoC/v//w4cOHDx9++PDh0tLS8PBwqVQaHh5eVlbWWbaZG/bQQw9JJBLu
6fPPP99Zhlm0zfBS5/4KzA2z4k+ADvcQBNHN6DmxLYIgegkkWwRBdDNItgiC6GaQbBEE0c0g2SII
optBskXcH3w+P/AehYWFnW2OZS5evLh48WIAn3zyCcMwx48f58YPHTrEMMyBAwcAhIWFGRoxFBYW
mtQR4bh169YTTzzRUVYTLYVki7g/xGJx9j0Mbd9YltXr9Z1qVwPefPPNpUuXco/9/f337t3LPU5N
TTU+rNcsffv29fT0PHv2rPVNJNoAyRbRegoLC4cMGfLnP/955MiRRUVFmzZtGj16dEBAwKuvvspN
eOONNwYNGjRp0qR58+a98847MPJxSktLOdXT6XQrV67kLty+fTsAmUwWFhY2a9aswYMHz58/n0st
PH/+/KOPPjp8+PDg4OA7d+48/vjj2dnZ3LuMHTs2JyfHYNWdO3dycnIM8vT444+fO3dOo9FUVVXl
5+cHBgY28YkWL17MOZJ9+/Zdv349gOjo6M8++8zKXxzRNnrOUWqiY1CpVNwvf8CAAVu2bLly5cq/
//3vDz744NixY3l5eefOnWNZNioq6rvvvrO3t09NTb148aJWqx05cmRjXQ927Njh5OR0/vx5tVo9
duzYKVOmALh48eLly5e9vLzGjh179uzZ4ODgOXPm7Nu3b/To0ZWVlWKxePHixZ988snWrVtzc3PV
anVAQIDhhhcuXDBe8TEMM2nSpKNHjyqVyqioqGvXrhlemj9/vlgsBlBbW8vj8QB8/PHHAP73v/9F
RETExsYCCAoK+vvf/94OXyTReki2iPuDWyRyjwsLC/v37z9mzBgAx44dO3bs2IgRIwBUVVXl5eXd
uXPnqaeesrOzAxAVFdXYDY8dO5aTk8PFm5RKZV5eno2NTXBwsEQiAcBF0JycnDw9PUePHg2AK8Aw
e/bs1157bdOmTTt37uT0xUBJSYlJ0+O5c+e+9957SqVy8+bNb775pmH8s88+CwoK4j7In/70J26w
pqZm9uzZ27Zt69+/PwAPD4/i4uI2fmmEdSHZItqEvb0994Bl2Zdeeun55583vLR161bzUiQCgYCL
gtXU1BgufP/99yMiIgxzZDIZV0wOAJ/P507YmtzKzs5u8uTJGRkZaWlpJi2OxWKx4eYcwcHBly5d
EovFjzzySLOf6IUXXpgxY8akSZO4pzU1NZxHRnQdKLZFWIeIiIidO3dWVVUBUCgUN2/eHDdu3KFD
h1Qq1Z07d7788ktumq+vb1ZWFgDOveIuTE5O1mg0AHJzc+/evWt+88GDBxcXF3O15e7cuaPVagEs
Xrx42bJlo0ePNqlwO2TIkPz8fJM7bNy40djPaox//etfd+7cWbNmjWEkNzfX4iYj0YmQt0VYhylT
pvz222+hoaEA+vTp8+mnn44cOXLOnDmBgYH9+/d//PHHuWkrVqyIiYnZs2dPeHg4N7J48eLCwkKu
Zk7fvn254ssm2NjY7Nu3b+nSpSqVSiwWf/vtt3369Bk1apSjo+Ozzz5rMnnw4MFKpfLOnTsODg6G
Qa4GabO88847QqGQC9698MILL7zwwsmTJ6dNm3b/3wfRjlAFCKIjSEpK6tOnz4oVK6x4z+Li4rCw
sN9//52LphuzZcsWBwcHLnWrjYwbNy4jI8PFxaXttyKsBS0SiW7J7t27Q0JC3njjDXPNApCQkGCI
jrWFW7duvfjii6RZXQ3ytgiC6GaQt0UQRDeDZIsgiG4GyRZBEN0Mki2CILoZJFsEQXQz/h/+Ihl3
VE91AgAAAABJRU5ErkJggg==
"
id="image23273"
x="112.91544"
y="-20.134825" />
<rect
style="fill:none;stroke:#ff0000;stroke-width:2.00001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect23299"
width="114.33821"
height="72.985252"
x="120.37579"
y="96.511902" />
<rect
style="fill:none;stroke:#008000;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect23299-2"
width="111.48605"
height="72.3106"
x="111.85711"
y="-21.007927" />
<rect
style="fill:none;stroke:#0000ff;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect23299-6"
width="110.77615"
height="73.072784"
x="-70.463364"
y="74.686356" />
</g>
</svg>
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
#Mediciones barriendo angulo del TISA y viendo kicking de resonancias oscuras
#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/20230714_EspectrosCristal4iones/Data/')
MOTIONAL_FILES = """000013292-UV_Scan_withcal_optimized_andor
000013293-UV_Scan_withcal_optimized_andor
000013295-UV_Scan_withcal_optimized_andor"""
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(MOTIONAL_FILES))
#%%
#carpeta pc nico labo escritorio:
#C:\Users\Usuario\Documents\artiq\artiq_experiments\analisis\plots\20211101_CPT_DosLaseres_v03\Data
CountsRoi1 = []
CountsRoi2 = []
CountsRoi3 = []
CountsRoi4 = []
CountsRoi5 = []
#Amplitudes = []
UV_Freqs = []
#IR_amps = []
for i, fname in enumerate(MOTIONAL_FILES.split()):
print(str(i) + ' - ' + fname)
data = h5py.File(fname+'.h5', 'r')
#Amplitudes.append(np.array(data['datasets']['amplitudes']))
CountsRoi1.append(np.array(data['datasets']['counts_roi1']))
CountsRoi2.append(np.array(data['datasets']['counts_roi2']))
CountsRoi3.append(np.array(data['datasets']['counts_roi3']))
CountsRoi4.append(np.array(data['datasets']['counts_roi4']))
CountsRoi5.append(np.array(data['datasets']['counts_roi5']))
UV_Freqs.append(np.array(data['datasets']['UV_Frequencies']))
#IR_amps.append(np.array(data['datasets']['IR1_measurement_amp']))
#%%
"""
En cristal de 4 iones veo espectros. Primero espectros uv.
La roi1 es la general. Las demas son de cada uno de los 4 iones brillantes del cristal.
"""
i = 0
jvec=[0,2]
step=0.1e8
Desplazamientos = [0, -2.5*step, 1.2*step]
plt.figure()
for j in jvec:
#plt.errorbar(Amplitudes[j], CountsRoi1[j], yerr=np.sqrt(CountsRoi1[j]), color='red', fmt='-o', capsize=2, markersize=2)
#plt.plot(Amplitudes[j][1:], CountsRoi1[j][1:], 'o',color='red', markersize=2,label=f'UVamp: {UV_amps[j]}')
plt.plot([Desplazamientos[j]+f for f in UV_Freqs[j][1:]], CountsRoi2[j][1:], '-o', markersize=2)
i = i + 1
plt.xlabel('Frecuencia')
plt.ylabel('Cuentas ROI')
#plt.xlim(0.05,0.23)
#plt.ylim(7800,8550)
plt.grid()
plt.legend()
#%%
#mergeo mediciones porque medi variando el piezoB para tener mas rango
Frequencies_vector = []
Counts_vector = []
kk = 2
for counts in [CountsRoi1, CountsRoi2, CountsRoi3, CountsRoi4, CountsRoi5]:
Frequencies_vector.append([1e-6*2*f for f in [Desplazamientos[kk]+f for f in UV_Freqs[kk][1:]]])
Counts_vector.append(list(counts[kk][1:]))
ivecs = [1,2,3,4]
#ivecs = [2, 5, 6]
#ivecs = [1]
plt.figure()
for i in range(len(Frequencies_vector)):
if i in ivecs:
plt.plot(Frequencies_vector[i], Counts_vector[i],'-o')
plt.grid()
plt.xlabel('Frequency (MHz)')
plt.ylabel('Counts')
#%%
ftrap=22.1
#ahora intento ajustarlos con modelo con micromocion
from scipy.special import jv
from scipy.optimize import curve_fit
def MicromotionSpectra(det, A, beta, x0, gamma, offset):
ftrap=22.1
#gamma=30
P = A*(jv(0, beta)**2)/(((det-x0)**2)+(0.5*gamma)**2)+offset
i = 1
#print(P)
while i <= 1:
P = P + A*((jv(i, beta))**2)/((((det-x0)+i*ftrap)**2)+(0.5*gamma)**2) + A*((jv(-i, beta))**2)/((((det-x0)-i*ftrap)**2)+(0.5*gamma)**2)
i = i + 1
#print(P)
return P
popt_vec = []
pcov_vec = []
#uso como refe k=3
jref=3
popt_ref, pcov_ref = curve_fit(MicromotionSpectra, Frequencies_vector[jref], Counts_vector[jref], p0=[1000, 2, 274, 90, 14000], bounds=((0,0,200,20,0),(1e7,100,600,1000,25650)))
freqslong = np.arange(min(Frequencies_vector[jref]), max(Frequencies_vector[jref])+100, (Frequencies_vector[jref][1]-Frequencies_vector[jref][0])*0.01)
print(popt_ref)
plt.figure()
for j in range(1,len(Frequencies_vector)):
plt.plot(Frequencies_vector[j], Counts_vector[j])
if j == jref:
plt.plot(freqslong, MicromotionSpectra(freqslong, *popt_ref))
for i in range(5):
plt.axvline(popt_ref[2]-i*ftrap, linestyle='dashed', color='black', linewidth=1, zorder=0)
plt.grid()
#%%
for i in range(len(Frequencies_vector)):
if i != jref:
popt, pcov = curve_fit(MicromotionSpectra, Frequencies_vector[i], Counts_vector[i], p0=[popt_ref[0], 5, popt_ref[2], 60, popt_ref[4]], bounds=((popt_ref[0]-0.001*popt_ref[0],0,popt_ref[2]-0.001*popt_ref[2],0,popt_ref[4]-0.001*popt_ref[4]),(popt_ref[0]+0.001*popt_ref[0],100,popt_ref[2]+0.001*popt_ref[2],300, popt_ref[4]+0.001*popt_ref[4])))
popt_vec.append(popt)
pcov_vec.append(pcov)
else:
popt_vec.append(popt_ref)
pcov_vec.append(pcov_ref)
ftrap=22.1
jeval=1
freqslong = np.arange(min(Frequencies_vector[jeval]), max(Frequencies_vector[jeval])+100, (Frequencies_vector[jeval][1]-Frequencies_vector[jeval][0])*0.01)
print(popt_vec[jeval])
plt.figure()
plt.plot(Frequencies_vector[jeval], Counts_vector[jeval])
plt.plot(freqslong, MicromotionSpectra(freqslong, *popt_ref))
plt.axvline(popt_ref[2], linestyle='dashed')
plt.axvline(popt_ref[2]-ftrap, linestyle='dashed')
plt.axvline(popt_ref[2]+ftrap, linestyle='dashed')
plt.axvline(popt_ref[2]-2*ftrap, linestyle='dashed')
plt.axvline(popt_ref[2]+2*ftrap, linestyle='dashed')
plt.axvline(popt_ref[2]-3*ftrap, linestyle='dashed')
plt.axvline(popt_ref[2]+3*ftrap, linestyle='dashed')
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 2 16:30:09 2020
@author: oem
"""
import os
import numpy as np
import time
import matplotlib.pyplot as plt
from scipy.signal import argrelextrema
from EITfit.threeLevel_2repumps_linealpol_python_scripts import CPTspectrum8levels, CPTspectrum8levels_fixedRabi
import random
from scipy.signal import savgol_filter as sf
def CalculoTeoricoDarkResonances_8levels(u, titadoppler, detuningdoppler, detuningrepump):
if titadoppler==0:
NegativeDR = [(-7/5)*u, (-3/5)*u, (-1/5)*u, (1/5)*u, (3/5)*u, (7/5)*u]
elif titadoppler==90:
NegativeDR = [(-11/5)*u, (-7/5)*u, (-3/5)*u, (3/5)*u, (7/5)*u, (11/5)*u]
else:
NegativeDR = [(-11/5)*u, (-7/5)*u, (-3/5)*u, (-1/5)*u, (1/5)*u, (3/5)*u, (7/5)*u, (11/5)*u]
PositiveDR = [(-8/5)*u, (-4/5)*u, 0, (4/5)*u, (8/5)*u]
return [detuningdoppler + dr for dr in NegativeDR], [detuningrepump + dr for dr in PositiveDR]
def GetClosestIndex(Vector, value, tolerance=1e-3):
i = 0
while i<len(Vector):
if abs(Vector[i] - value) < tolerance:
return i
else:
i = i + 1
return GetClosestIndex(Vector, value, tolerance=2*tolerance)
def FindDRFrequencies(Freq, Fluo, TeoDR, entorno=3):
"""
Busca los indices y la frecuencia de los minimos en un entorno cercano al de la DR.
Si no encuentra, devuelve el valor teórico.
"""
IndiceDRteo1, IndiceEntornoinicialDRteo1, IndiceEntornofinalDRteo1 = GetClosestIndex(Freq, TeoDR[0]), GetClosestIndex(Freq, TeoDR[0]-entorno), GetClosestIndex(Freq, TeoDR[0]+entorno)
IndiceDRteo2, IndiceEntornoinicialDRteo2, IndiceEntornofinalDRteo2 = GetClosestIndex(Freq, TeoDR[1]), GetClosestIndex(Freq, TeoDR[1]-entorno), GetClosestIndex(Freq, TeoDR[1]+entorno)
IndiceDRteo3, IndiceEntornoinicialDRteo3, IndiceEntornofinalDRteo3 = GetClosestIndex(Freq, TeoDR[2]), GetClosestIndex(Freq, TeoDR[2]-entorno), GetClosestIndex(Freq, TeoDR[2]+entorno)
IndiceDRteo4, IndiceEntornoinicialDRteo4, IndiceEntornofinalDRteo4 = GetClosestIndex(Freq, TeoDR[3]), GetClosestIndex(Freq, TeoDR[3]-entorno), GetClosestIndex(Freq, TeoDR[3]+entorno)
IndiceDRteo5, IndiceEntornoinicialDRteo5, IndiceEntornofinalDRteo5 = GetClosestIndex(Freq, TeoDR[4]), GetClosestIndex(Freq, TeoDR[4]-entorno), GetClosestIndex(Freq, TeoDR[4]+entorno)
IndiceDRteo6, IndiceEntornoinicialDRteo6, IndiceEntornofinalDRteo6 = GetClosestIndex(Freq, TeoDR[5]), GetClosestIndex(Freq, TeoDR[5]-entorno), GetClosestIndex(Freq, TeoDR[5]+entorno)
EntornoFreqDR1, EntornoFreqDR2 = Freq[IndiceEntornoinicialDRteo1:IndiceEntornofinalDRteo1], Freq[IndiceEntornoinicialDRteo2:IndiceEntornofinalDRteo2]
EntornoFreqDR3, EntornoFreqDR4 = Freq[IndiceEntornoinicialDRteo3:IndiceEntornofinalDRteo3], Freq[IndiceEntornoinicialDRteo4:IndiceEntornofinalDRteo4]
EntornoFreqDR5, EntornoFreqDR6 = Freq[IndiceEntornoinicialDRteo5:IndiceEntornofinalDRteo5], Freq[IndiceEntornoinicialDRteo6:IndiceEntornofinalDRteo6]
EntornoFluoDR1, EntornoFluoDR2 = Fluo[IndiceEntornoinicialDRteo1:IndiceEntornofinalDRteo1], Fluo[IndiceEntornoinicialDRteo2:IndiceEntornofinalDRteo2]
EntornoFluoDR3, EntornoFluoDR4 = Fluo[IndiceEntornoinicialDRteo3:IndiceEntornofinalDRteo3], Fluo[IndiceEntornoinicialDRteo4:IndiceEntornofinalDRteo4]
EntornoFluoDR5, EntornoFluoDR6 = Fluo[IndiceEntornoinicialDRteo5:IndiceEntornofinalDRteo5], Fluo[IndiceEntornoinicialDRteo6:IndiceEntornofinalDRteo6]
IndiceFluoMinimaEntorno1, IndiceFluoMinimaEntorno2 = argrelextrema(np.array(EntornoFluoDR1), np.less)[0], argrelextrema(np.array(EntornoFluoDR2), np.less)[0]
IndiceFluoMinimaEntorno3, IndiceFluoMinimaEntorno4 = argrelextrema(np.array(EntornoFluoDR3), np.less)[0], argrelextrema(np.array(EntornoFluoDR4), np.less)[0]
IndiceFluoMinimaEntorno5, IndiceFluoMinimaEntorno6 = argrelextrema(np.array(EntornoFluoDR5), np.less)[0], argrelextrema(np.array(EntornoFluoDR6), np.less)[0]
try:
FreqDR1 = EntornoFreqDR1[int(IndiceFluoMinimaEntorno1)]
IndiceDR1 = GetClosestIndex(Freq, FreqDR1)
except:
FreqDR1 = TeoDR[0]
IndiceDR1 = IndiceDRteo1
try:
FreqDR2 = EntornoFreqDR2[int(IndiceFluoMinimaEntorno2)]
IndiceDR2 = GetClosestIndex(Freq, FreqDR2)
except:
FreqDR2 = TeoDR[1]
IndiceDR2 = IndiceDRteo2
try:
FreqDR3 = EntornoFreqDR3[int(IndiceFluoMinimaEntorno3)]
IndiceDR3 = GetClosestIndex(Freq, FreqDR3)
except:
FreqDR3 = TeoDR[2]
IndiceDR3 = IndiceDRteo3
try:
FreqDR4 = EntornoFreqDR4[int(IndiceFluoMinimaEntorno4)]
IndiceDR4 = GetClosestIndex(Freq, FreqDR4)
except:
FreqDR4 = TeoDR[3]
IndiceDR4 = IndiceDRteo4
try:
FreqDR5 = EntornoFreqDR5[int(IndiceFluoMinimaEntorno5)]
IndiceDR5 = GetClosestIndex(Freq, FreqDR5)
except:
FreqDR5 = TeoDR[4]
IndiceDR5 = IndiceDRteo5
try:
FreqDR6 = EntornoFreqDR6[int(IndiceFluoMinimaEntorno6)]
IndiceDR6 = GetClosestIndex(Freq, FreqDR6)
except:
FreqDR6 = TeoDR[5]
IndiceDR6 = IndiceDRteo6
return [IndiceDR1, IndiceDR2, IndiceDR3, IndiceDR4, IndiceDR5, IndiceDR6], [FreqDR1, FreqDR2, FreqDR3, FreqDR4, FreqDR5, FreqDR6]
def FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=1, frecuenciareferenciacriterioasintotico=-100, getindices=False):
"""
Toma los indices donde estan las DR y evalua su fluorescencia. Esos indices son minimos locales en un entorno
cercano a las DR teoricas y, si no hay ningun minimo, toma la teorica.
Luego, hace el cociente de esa fluorescencia y un factor de normalización segun NormalizationCriterium:
1: Devuelve la fluorescencia absoluta de los minimos
2: Devuelve el cociente entre la fluorescencia del minimo y un valor medio entre dos puntos lejanos, como si no
hubiera una resonancia oscura y hubiera una recta. Ese valor esta a DistanciaFrecuenciaCociente del detuning del azul (el punto medio entre las dos DR en este caso)
3: Devuelve el cociente entre la fluorescencia del minimo y el valor a -100 MHz (si se hizo de -100 a 100),
o el valor limite por izquierda de la curva
4: Deuelve el cociente entre la fluorescencia del minimo y el valor de fluorescencia a detuning 0 MHz
"""
IndiceDR1, IndiceDR2, IndiceDR3, IndiceDR4, IndiceDR5, IndiceDR6 = IndicesDR[0], IndicesDR[1], IndicesDR[2], IndicesDR[3], IndicesDR[4], IndicesDR[5]
FluorescenceOfMinimums = [Fluo[IndiceDR1], Fluo[IndiceDR2], Fluo[IndiceDR3], Fluo[IndiceDR4], Fluo[IndiceDR5], Fluo[IndiceDR6]]
FrequencyOfMinimums = [Freq[IndiceDR1], Freq[IndiceDR2], Freq[IndiceDR3], Freq[IndiceDR4], Freq[IndiceDR5], Freq[IndiceDR6]]
DistanciaFrecuenciaCociente = 25
if NormalizationCriterium==0:
print('che')
return FrequencyOfMinimums, FluorescenceOfMinimums
if NormalizationCriterium==1:
Fluorescenciacerodetuning = Fluo[GetClosestIndex(Freq, 0)]
Fluorescenciaasintotica = Fluo[GetClosestIndex(Freq, frecuenciareferenciacriterioasintotico)]
return FrequencyOfMinimums, np.array([Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica, Fluorescenciacerodetuning/Fluorescenciaasintotica])
if NormalizationCriterium==2:
k = 0
while k < len(Freq):
if Freq[k] < detuningdoppler-DistanciaFrecuenciaCociente + 2 and Freq[k] > detuningdoppler-DistanciaFrecuenciaCociente - 2:
FluoIzquierda = Fluo[k]
indiceizquierda = k
print('Izq:', Freq[k])
break
else:
k = k + 1
l = 0
while l < len(Freq):
if Freq[l] < detuningdoppler+DistanciaFrecuenciaCociente + 2 and Freq[l] > detuningdoppler+DistanciaFrecuenciaCociente - 2:
FluoDerecha = Fluo[l]
indicederecha = l
print('Der: ', Freq[l])
break
else:
l = l + 1
FluoNormDivisor = 0.5*(FluoDerecha+FluoIzquierda)
print(FluoNormDivisor)
if NormalizationCriterium==3:
#asintotico
FluoNormDivisor = Fluo[GetClosestIndex(Freq, frecuenciareferenciacriterioasintotico)]
if NormalizationCriterium==4:
#este te tira la fluorescencia de detuning 0
FluoNormDivisor = Fluo[GetClosestIndex(Freq, 0)]
RelativeFluorescenceOfMinimums = np.array([Fluore/FluoNormDivisor for Fluore in FluorescenceOfMinimums])
print('Esto: ', RelativeFluorescenceOfMinimums)
if NormalizationCriterium==2 and getindices==True:
return FrequencyOfMinimums, RelativeFluorescenceOfMinimums, indiceizquierda, indicederecha
return FrequencyOfMinimums, RelativeFluorescenceOfMinimums
def GetFinalMaps(MapasDR1, MapasDR2, MapasDR3, MapasDR4, MapasDR5, MapasDR6):
"""
Nota: esto vale para polarizacion del 397 sigma+ + sigma-. Sino hay que cambiar los coeficientes.
La estructura es:
MapasDRi = [MapaMedido_criterio1_DRi, MapaMedido_criterio2_DRi, MapaMedido_criterio3_DRi, MapaMedido_criterio4_DRi]
"""
Mapa1 = MapasDR1[0]
Mapa2pi = np.sqrt(3)*(MapasDR2[1] + MapasDR5[1])
Mapa2smas = np.sqrt(12/2)*MapasDR3[1] + (2/np.sqrt(2))*MapasDR6[1]
Mapa2smenos = (2/np.sqrt(2))*MapasDR1[1] + np.sqrt(12/2)*MapasDR4[1]
Mapa3pi = np.sqrt(3)*(MapasDR2[2] + MapasDR5[2])
Mapa3smas = np.sqrt(12/2)*MapasDR3[2] + (2/np.sqrt(2))*MapasDR6[2]
Mapa3smenos = (2/np.sqrt(2))*MapasDR1[2] + np.sqrt(12/2)*MapasDR4[2]
return Mapa1, [Mapa2pi, Mapa2smas, Mapa2smenos], [Mapa3pi, Mapa3smas, Mapa3smenos]
def CombinateDRwithCG(RelMinMedido1, RelMinMedido2, RelMinMedido3, RelMinMedido4):
Fluo1 = RelMinMedido1[0]
Fluo2pi = np.sqrt(3)*(RelMinMedido2[1] + RelMinMedido2[4])
Fluo2smas = np.sqrt(12/2)*RelMinMedido2[2] + (2/np.sqrt(2))*RelMinMedido2[5]
Fluo2smenos = (2/np.sqrt(2))*RelMinMedido2[0] + np.sqrt(12/2)*RelMinMedido2[3]
Fluo3pi = np.sqrt(3)*(RelMinMedido3[1] + RelMinMedido3[4])
Fluo3smas = np.sqrt(12/2)*RelMinMedido3[2] + (2/np.sqrt(2))*RelMinMedido3[5]
Fluo3smenos = (2/np.sqrt(2))*RelMinMedido3[0] + np.sqrt(12/2)*RelMinMedido3[3]
return Fluo1, [Fluo2pi, Fluo2smas, Fluo2smenos], [Fluo3pi, Fluo3smas, Fluo3smenos]
def IdentifyPolarizationCoincidences(theoricalmap, target, tolerance=1e-1):
"""
Busca en un mapa 2D la presencia de un valor target (medido) con tolerancia tolerance.
Si lo encuentra, pone un 1. Sino, un 0. Al plotear con pcolor se verá
en blanco la zona donde el valor medido se puede hallar.
"""
CoincidenceMatrix = np.zeros((len(theoricalmap), len(theoricalmap[0])))
i = 0
while i<len(theoricalmap):
j = 0
while j<len(theoricalmap[0]):
if abs(theoricalmap[i][j]-target) < tolerance:
CoincidenceMatrix[i][j] = 1
j=j+1
i=i+1
return CoincidenceMatrix
def RetrieveAbsoluteCoincidencesBetweenMaps(MapsVectors):
MatrixSum = np.zeros((len(MapsVectors[0]), len(MapsVectors[0][0])))
AbsoluteCoincidencesMatrix = np.zeros((len(MapsVectors[0]), len(MapsVectors[0][0])))
MatrixMapsVectors = []
for i in range(len(MapsVectors)):
MatrixMapsVectors.append(np.matrix(MapsVectors[i]))
for i in range(len(MatrixMapsVectors)):
MatrixSum = MatrixSum + MatrixMapsVectors[i]
MaxNumberOfCoincidences = np.max(MatrixSum)
ListMatrixSum = [list(i) for i in list(np.array(MatrixSum))]
for i in range(len(ListMatrixSum)):
for j in range(len(ListMatrixSum[0])):
if ListMatrixSum[i][j] == MaxNumberOfCoincidences:
AbsoluteCoincidencesMatrix[i][j] = 1
return AbsoluteCoincidencesMatrix, MaxNumberOfCoincidences
def MeasureMeanValueOfEstimatedArea(AbsoluteCoincidencesMap, X, Y):
NonZeroIndices = np.nonzero(AbsoluteCoincidencesMap)
Xsum = 0
Xvec = []
Ysum = 0
Yvec = []
N = len(NonZeroIndices[0])
for i in range(N):
Xsum = Xsum + X[NonZeroIndices[1][i]]
Xvec.append(X[NonZeroIndices[1][i]])
Ysum = Ysum + Y[NonZeroIndices[0][i]]
Yvec.append(Y[NonZeroIndices[0][i]])
Xaverage = Xsum/N
Yaverage = Ysum/N
Xspread = np.std(Xvec)
Yspread = np.std(Yvec)
return Xaverage, Yaverage, N, Xspread, Yspread
def MeasureRelativeFluorescenceFromCPT(Freq, Fluo, u, titadoppler, detuningrepump, detuningdoppler, frefasint=-100, entorno=3):
ResonanciasTeoricas, ResonanciasPositivas = CalculoTeoricoDarkResonances_8levels(u, titadoppler, detuningdoppler, detuningrepump)
IndicesDR, FreqsDR = FindDRFrequencies(Freq, Fluo, ResonanciasTeoricas, entorno=entorno)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums0 = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=0, frecuenciareferenciacriterioasintotico=frefasint)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums1 = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=1, frecuenciareferenciacriterioasintotico=frefasint)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums2, indiceizquierda, indicederecha = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=2, frecuenciareferenciacriterioasintotico=frefasint, getindices=True)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums3 = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=3, frecuenciareferenciacriterioasintotico=frefasint)
FrequencyOfMinimums, RelativeFluorescenceOfMinimums4 = FindRelativeFluorescencesOfDR(Freq, Fluo, IndicesDR, detuningdoppler, NormalizationCriterium=4, frecuenciareferenciacriterioasintotico=frefasint)
print('hola')
print(RelativeFluorescenceOfMinimums0)
return RelativeFluorescenceOfMinimums0, RelativeFluorescenceOfMinimums1, RelativeFluorescenceOfMinimums2, RelativeFluorescenceOfMinimums3, RelativeFluorescenceOfMinimums4, IndicesDR, [indiceizquierda, indicederecha]
def GenerateNoisyCPT(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None, noiseamplitude=0.001):
Frequencyvector, Fluovector = PerformExperiment_8levels(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None)
NoisyFluovector = [fluo+noiseamplitude*(2*random.random()-1) for fluo in Fluovector]
return Frequencyvector, NoisyFluovector
def GenerateNoisyCPT_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None, noiseamplitude=0.001):
Frequencyvector, Fluovector = PerformExperiment_8levels_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None)
NoisyFluovector = [fluo+noiseamplitude*(2*random.random()-1) for fluo in Fluovector]
return Frequencyvector, NoisyFluovector
def GenerateNoisyCPT_fit(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqs, plot=False, solvemode=1, detpvec=None, noiseamplitude=0.001):
Frequencyvector, Fluovector = PerformExperiment_8levels_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, min(freqs), max(freqs) + freqs[1]-freqs[0], freqs[1]-freqs[0], plot=False, solvemode=1, detpvec=None)
NoisyFluovector = [fluo+noiseamplitude*(2*random.random()-1) for fluo in Fluovector]
return Frequencyvector, NoisyFluovector
def AddNoiseToCPT(Fluo, noisefactor):
return [f+noisefactor*(2*random.random()-1) for f in Fluo]
def SmoothNoisyCPT(Fluo, window=11, poly=3):
SmoothenFluo = sf(Fluo, window, poly)
return SmoothenFluo
def GetMinimaInfo(Freq, Fluo, u, titadoppler, detuningdoppler, detuningrepump, MinimumCriterium=2, NormalizationCriterium=1):
"""
FUNCION VIEJA
Esta funcion devuelve valores de frecuencias y fluorescencia relativa de los minimos.
Minimumcriterion:
1: Saca los minimos con funcion argelextrema
2: Directamente con las frecuencias teoricas busca las fluorescencias
Normalizationcriterium:
1: Devuelve la fluorescencia absoluta de los minimos
2: Devuelve el cociente entre la fluorescencia del minimo y un valor medio entre dos puntos lejanos, como si no
hubiera una resonancia oscura y hubiera una recta. Ese valor esta a DistanciaFrecuenciaCociente del detuning del azul (el punto medio entre las dos DR en este caso)
3: Devuelve el cociente entre la fluorescencia del minimo y el valor a -100 MHz (si se hizo de -100 a 100),
o el valor limite por izquierda de la curva
"""
FluorescenceOfMaximum = max(Fluo)
FrequencyOfMaximum = Freq[Fluo.index(FluorescenceOfMaximum)]
#criterio para encontrar los minimos
#criterio usando minimos de la fluorescencia calculados con la curva
if MinimumCriterium == 1:
LocationOfMinimums = argrelextrema(np.array(Fluo), np.less)[0]
FluorescenceOfMinimums = np.array([Fluo[i] for i in LocationOfMinimums])
FrequencyOfMinimums = np.array([Freq[j] for j in LocationOfMinimums])
#criterio con las DR teoricas
if MinimumCriterium == 2:
FrecuenciasDRTeoricas, FrecuenciasDRTeoricasPositivas = [darkresonance for darkresonance in CalculoTeoricoDarkResonances_8levels(u, titadoppler, detuningdoppler, detuningrepump)[0]]
FrequencyOfMinimums = []
FluorescenceOfMinimums =[]
print(FrecuenciasDRTeoricas)
k=0
ventanita = 0.001
while k < len(Freq):
if Freq[k] < FrecuenciasDRTeoricas[0] + ventanita and Freq[k] > FrecuenciasDRTeoricas[0] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[1] + ventanita and Freq[k] > FrecuenciasDRTeoricas[1] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[2] + ventanita and Freq[k] > FrecuenciasDRTeoricas[2] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[3] + ventanita and Freq[k] > FrecuenciasDRTeoricas[3] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[4] + ventanita and Freq[k] > FrecuenciasDRTeoricas[4] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
elif Freq[k] < FrecuenciasDRTeoricas[5] + ventanita and Freq[k] > FrecuenciasDRTeoricas[5] - ventanita:
FrequencyOfMinimums.append(Freq[k])
FluorescenceOfMinimums.append(Fluo[k])
k = k + 1
print(FrequencyOfMinimums)
if len(FrequencyOfMinimums) != len(FrecuenciasDRTeoricas):
print('NO ANDA BIEN ESTO PAPI, revisalo')
#esto es para establecer un criterio para la fluorescencia relativa
DistanciaFrecuenciaCociente = 15
if NormalizationCriterium==1:
FluoNormDivisor = 1
if NormalizationCriterium==2:
k = 0
while k < len(Freq):
if Freq[k] < detuningdoppler-DistanciaFrecuenciaCociente + 2 and Freq[k] > detuningdoppler-DistanciaFrecuenciaCociente - 2:
FluoIzquierda = Fluo[k]
print('Izq:', Freq[k])
break
else:
k = k + 1
l = 0
while l < len(Freq):
if Freq[l] < detuningdoppler+DistanciaFrecuenciaCociente + 2 and Freq[l] > detuningdoppler+DistanciaFrecuenciaCociente - 2:
FluoDerecha = Fluo[l]
print('Der: ', Freq[l])
break
else:
l = l + 1
FluoNormDivisor = 0.5*(FluoDerecha+FluoIzquierda)
print(FluoNormDivisor)
if NormalizationCriterium==3:
FluoNormDivisor = Fluo[0]
RelativeFluorescenceOfMinimums = np.array([Fluore/FluoNormDivisor for Fluore in FluorescenceOfMinimums])
return FrequencyOfMinimums, RelativeFluorescenceOfMinimums
def GetPlotsofFluovsAngle_8levels(FrequencyOfMinimumsVector, RelativeFluorescenceOfMinimumsVector, u, titadoppler, detuningdoppler, detuningrepump, ventana=0.25, taketheoricalDR=False):
#primero buscamos las frecuencias referencia que se parezcan a las 6:
i = 0
FrecuenciasReferenciaBase = FrequencyOfMinimumsVector[0]
FrecuenciasDRTeoricas = [darkresonance for darkresonance in CalculoTeoricoDarkResonances_8levels(u, titadoppler, detuningdoppler, detuningrepump)[0]]
while i < len(FrequencyOfMinimumsVector):
if len(FrequencyOfMinimumsVector[i])==len(FrecuenciasDRTeoricas):
FrecuenciasReferenciaBase = FrequencyOfMinimumsVector[i]
print('Cool! Taking the DR identified with any curve')
break
else:
i = i + 1
if i==len(FrequencyOfMinimumsVector):
print('No hay ningun plot con 5 resonancias oscuras. Tomo las teóricas')
FrecuenciasReferenciaBase = FrecuenciasDRTeoricas
if taketheoricalDR:
FrecuenciasReferenciaBase = FrecuenciasDRTeoricas
Ventana = abs(ventana*(FrecuenciasReferenciaBase[1] - FrecuenciasReferenciaBase[0])) #ventana separadora de resonancias
print('Ventana = ', Ventana)
DarkResonance1Frequency = []
DarkResonance1Fluorescence = []
DarkResonance2Frequency = []
DarkResonance2Fluorescence = []
DarkResonance3Frequency = []
DarkResonance3Fluorescence = []
DarkResonance4Frequency = []
DarkResonance4Fluorescence = []
DarkResonance5Frequency = []
DarkResonance5Fluorescence = []
DarkResonance6Frequency = []
DarkResonance6Fluorescence = []
i = 0
while i < len(FrequencyOfMinimumsVector):
j = 0
FrecuenciasReferencia = [i for i in FrecuenciasReferenciaBase]
while j < len(FrequencyOfMinimumsVector[i]):
if abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[0])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[0])-Ventana):
DarkResonance1Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance1Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[0] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[1])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[1])-Ventana):
DarkResonance2Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance2Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[1] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[2])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[2])-Ventana):
DarkResonance3Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance3Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[2] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[3])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[3])-Ventana):
DarkResonance4Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance4Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[3] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[4])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[4])-Ventana):
DarkResonance5Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance5Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[4] = 0
elif abs(FrequencyOfMinimumsVector[i][j]) < (abs(FrecuenciasReferencia[5])+Ventana) and abs(FrequencyOfMinimumsVector[i][j]) >= (abs(FrecuenciasReferencia[5])-Ventana):
DarkResonance6Frequency.append(FrequencyOfMinimumsVector[i][j])
DarkResonance6Fluorescence.append(RelativeFluorescenceOfMinimumsVector[i][j])
FrecuenciasReferencia[5] = 0
else:
#print('Algo anduvo mal, por ahi tenes que cambiar la ventana che')
pass
j = j + 1
if np.count_nonzero(FrecuenciasReferencia) > 0:
if FrecuenciasReferencia[0] != 0:
DarkResonance1Frequency.append(FrecuenciasReferencia[0])
DarkResonance1Fluorescence.append()
if FrecuenciasReferencia[1] != 0:
DarkResonance2Frequency.append(FrecuenciasReferencia[1])
DarkResonance2Fluorescence.append(0)
if FrecuenciasReferencia[2] != 0:
DarkResonance3Frequency.append(FrecuenciasReferencia[2])
DarkResonance3Fluorescence.append(0)
if FrecuenciasReferencia[3] != 0:
DarkResonance4Frequency.append(FrecuenciasReferencia[3])
DarkResonance4Fluorescence.append(0)
if FrecuenciasReferencia[4] != 0:
DarkResonance5Frequency.append(FrecuenciasReferencia[4])
DarkResonance5Fluorescence.append(0)
if FrecuenciasReferencia[5] != 0:
DarkResonance6Frequency.append(FrecuenciasReferencia[5])
DarkResonance6Fluorescence.append(0)
i = i + 1
return DarkResonance1Frequency, DarkResonance1Fluorescence, DarkResonance2Frequency, DarkResonance2Fluorescence, DarkResonance3Frequency, DarkResonance3Fluorescence, DarkResonance4Frequency, DarkResonance4Fluorescence, DarkResonance5Frequency, DarkResonance5Fluorescence, DarkResonance6Frequency, DarkResonance6Fluorescence, FrecuenciasReferenciaBase
def PerformExperiment_8levels(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None):
"""
Hace un experimento barriendo ángulos de repump con el angulo de doppler fijo.
solvemode=1: resuelve con np.linalg.solve
solvemode=2: resuelve invirtiendo L con la funcion np.linalg.inv
"""
Fluovectors = []
for titaprobe in titaprobeVec:
tinicial = time.time()
ProbeDetuningVectorL, Fluovector = CPTspectrum8levels(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, freqMin=freqMin, freqMax=freqMax, freqStep=freqStep, plot=False, solvemode=1)
tfinal = time.time()
print('Done angle ', titarepump, ' Total time: ', round((tfinal-tinicial), 2), "s")
if plot:
plt.figure()
plt.xlabel('Repump detuning (MHz')
plt.ylabel('Fluorescence (A.U.)')
plt.plot(ProbeDetuningVectorL, Fluovector, label=str(titarepump)+'º tita repump, T: ' + str(T*1e3) + ' mK')
plt.legend()
Fluovectors.append(Fluovector)
if len(titaprobeVec) == 1: #esto es para que no devuelva un vector de vectores si solo fijamos un angulo
Fluovectors = Fluovector
return ProbeDetuningVectorL, Fluovectors
def PerformExperiment_8levels_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobeVec, phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None):
"""
Hace un experimento barriendo ángulos de repump con el angulo de doppler fijo.
solvemode=1: resuelve con np.linalg.solve
solvemode=2: resuelve invirtiendo L con la funcion np.linalg.inv
"""
Fluovectors = []
for titaprobe in titaprobeVec:
tinicial = time.time()
ProbeDetuningVectorL, Fluovector = CPTspectrum8levels_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, freqMin=freqMin, freqMax=freqMax, freqStep=freqStep, plot=False, solvemode=1)
tfinal = time.time()
print('Done angle ', titarepump, ' Total time: ', round((tfinal-tinicial), 2), "s")
if plot:
plt.figure()
plt.xlabel('Repump detuning (MHz')
plt.ylabel('Fluorescence (A.U.)')
plt.plot(ProbeDetuningVectorL, Fluovector, label=str(titarepump)+'º tita repump, T: ' + str(T*1e3) + ' mK')
plt.legend()
Fluovectors.append(Fluovector)
if len(titaprobeVec) == 1: #esto es para que no devuelva un vector de vectores si solo fijamos un angulo
Fluovectors = Fluovector
return ProbeDetuningVectorL, Fluovectors
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 1 17:58:39 2020
@author: oem
"""
import os
import numpy as np
#os.chdir('/home/oem/Nextcloud/G_liaf/liaf-TrampaAnular/Código General/EIT-CPT/Buenos Aires/Experiment Simulations/CPT scripts/Eight Level 2 repumps')
from threeLevel_2repumps_AnalysisFunctions import CalculoTeoricoDarkResonances_8levels, GetMinimaInfo, GetPlotsofFluovsAngle_8levels, PerformExperiment_8levels, FindDRFrequencies, FindRelativeFluorescencesOfDR, GenerateNoisyCPT, SmoothNoisyCPT, GetFinalMaps, GenerateNoisyCPT_fixedRabi, GenerateNoisyCPT_fit
import matplotlib.pyplot as plt
import time
from threeLevel_2repumps_AnalysisFunctions import MeasureRelativeFluorescenceFromCPT, IdentifyPolarizationCoincidences, RetrieveAbsoluteCoincidencesBetweenMaps, GetClosestIndex
#C:\Users\Usuario\Nextcloud\G_liaf\liaf-TrampaAnular\Código General\EIT-CPT\Buenos Aires\Experiment Simulations\CPT scripts\Eight Level 2 repumps
ub = 9.27e-24
h = 6.63e-34
c = (ub/h)*1e-4 #en unidades de MHz/G
#u = 1e6
u = 33.5e6
B = (u/(2*np.pi))/c
#sg, sp = 0.6, 5 #parámetros de control, saturación del doppler y repump
#rabG, rabP = sg*gPS, sp*gPD #frecuencias de rabi
gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 #anchos de linea de las transiciones
lw = 0.1
DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth = lw, lw, lw #ancho de linea de los laseres
DetDoppler = -36 #42
DetRepumpVec = [DetDoppler+29.6]
Tvec = [0.7] #temperatura en mK
alpha = 0*(np.pi/180) #angulo entre los láseres
phidoppler, titadoppler = 0, 90
phirepump, titarepump = 0, 0
phiprobe = 0
titaprobe = 90
#Calculo las resonancias oscuras teóricas
#ResonanciasTeoricas, DRPositivas = CalculoTeoricoDarkResonances_8levels(u/(2*np.pi*1e6), titadoppler, DetDoppler, DetRepump)
#Parametros de la simulacion cpt
center = -45
span = 80
freqMin = center-span*0.5
freqMax = center+span*0.5
""" parametros para tener espectros coherentes
freqMin = -56
freqMax = 14
"""
freqStep = 1e-1
noiseamplitude = 0
RelMinMedido0Vector = []
RelMinMedido1Vector = []
RelMinMedido2Vector = []
RelMinMedido3Vector = []
RelMinMedido4Vector = []
#Sr = np.arange(0, 10, 0.2)
#Sg = np.arange(0.01, 1, 0.05)
#Sp = np.arange(0.1, 6.1, 1)
#Sg = [0.6**2]
#Sp = [2.3**2]
Sg = [1.4]
Sp = [6]
Sr = [11]
i = 0
save = False
showFigures = True
if not showFigures:
plt.ioff()
else:
plt.ion()
fig1, ax1 = plt.subplots()
offsetx = 464
ax1.plot([f-offsetx for f in FreqsDR], CountsDR, 'o')
run = True
Scale = 730
Offset = 600 #600 para 20k cuentas aprox
MaxCoherenceValue = []
for sg in Sg:
for sp in Sp:
rabG, rabP = sg*gPS, sp*gPD
for Ti in Tvec:
T = Ti*1e-3
for DetRepump in DetRepumpVec:
print(T)
for sr in Sr:
rabR = sr*gPD
#MeasuredFreq, MeasuredFluo = GenerateNoisyCPT(rabG, rabR, rabP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, [titaprobe], phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None, noiseamplitude=noiseamplitude)
if run:
MeasuredFreq4, MeasuredFluo4 = GenerateNoisyCPT_fixedRabi(sg, sr, sp, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, [titaprobe], phirepump, titarepump, freqMin, freqMax, freqStep, plot=False, solvemode=1, detpvec=None, noiseamplitude=noiseamplitude)
#SmoothFluo = SmoothNoisyCPT(MeasuredFluo, window=9, poly=2)
SmoothFluo4 = MeasuredFluo4
#Scale = max(BestC)/max([100*s for s in SmoothFluo4])
ax1.plot(MeasuredFreq4, [Scale*100*f + Offset for f in SmoothFluo4], label=f'Sr = {sr}')
ax1.axvline(DetDoppler, linestyle='--', linewidth=1)
#if sr != 0:
#ax1.axvline(DetRepump, linestyle='--', linewidth=1)
MaxCoherenceValue.append(np.max(SmoothFluo4))
#print(titaprobe)
ax1.set_xlabel('Detuning Rebombeo (MHz)')
ax1.set_ylabel('Fluorescencia (AU)')
ax1.set_title(f'B: {round(B, 2)} G, Sdop: {round(sg, 2)}, Sp: {round(sp, 2)}, Sr: {round(sr, 2)}, lw: {lw} MHz, T: {Ti} mK')
#ax1.set_ylim(0, 8)
#ax1.axvline(DetDoppler, linestyle='dashed', color='red', linewidth=1)
#ax1.axvline(DetRepump, linestyle='dashed', color='black', linewidth=1)
#ax1.set_title('Pol Doppler y Repump: Sigma+ Sigma-, Pol Probe: PI')
#ax1.legend()
ax1.grid()
print (f'{i+1}/{len(Sg)*len(Sp)}')
i = i + 1
if save:
plt.savefig(f'Mapa_plots_100k_1mk/CPT_SMSM_sdop{round(sg, 2)}_sp{round(sp, 2)}_sr{round(sr, 2)}.jpg')
ax1.legend()
"""
plt.figure()
plt.plot(Sr, MaxCoherenceValue, 'o')
plt.xlabel('Sr')
plt.ylabel('Coherence')
"""
"""
plt.figure()
plt.plot(MeasuredFreq, [100*f for f in SmoothFluo], color='darkred')
plt.xlabel('Desintonía 866 (MHz)')
plt.ylabel('Fluorescencia (A.U.)')
plt.axvline(-30, color='darkblue', linewidth=1.2, linestyle='--')
plt.yticks(np.arange(0.4, 1.8, 0.2))
plt.ylim(0.5, 1.6)
plt.grid()
plt.figure()
plt.plot(MeasuredFreq4, [100*f for f in SmoothFluo4], color='darkred')
plt.xlabel('Desintonía 866 (MHz)')
plt.ylabel('Fluorescencia (A.U.)')
plt.axvline(-30, color='darkblue', linewidth=1.2, linestyle='--')
plt.yticks(np.arange(0.8, 2.4, 0.4))
plt.grid()
"""
#%%
from scipy.optimize import curve_fit
T = 0.5e-3
sg = 0.7
sp = 6
sr = 0
DetDoppler = -14
DetRepump = 0
FitsSp = []
FitsOffset = []
Sg = [0.87]
def FitEIT(freqs, SP, offset):
MeasuredFreq, MeasuredFluo = GenerateNoisyCPT_fit(0.87, sr, SP, gPS, gPD, DetDoppler, DetRepump, u, DopplerLaserLinewidth, RepumpLaserLinewidth, ProbeLaserLinewidth, T, alpha, phidoppler, titadoppler, phiprobe, [titaprobe], phirepump, titarepump, freqs, plot=False, solvemode=1, detpvec=None, noiseamplitude=noiseamplitude)
FinalFluo = [f*43000 + 2685 for f in MeasuredFluo]
return FinalFluo
freqs = [f-offsetx+32 for f in FreqsDR]
freqslong = np.arange(min(freqs), max(freqs)+freqs[1]-freqs[0], 0.1*(freqs[1]-freqs[0]))
popt, pcov = curve_fit(FitEIT, freqs, CountsDR, p0=[5, 700], bounds=(0, [10, 1e6]))
FitsSp.append(popt[0])
FitsOffset.append(popt[1])
print(popt)
FittedEIT = FitEIT(freqslong, *popt)
plt.figure()
plt.errorbar(freqs, CountsDR, yerr=2*np.sqrt(CountsDR), fmt='o', capsize=2, markersize=2)
plt.plot(freqslong, FitEIT(freqslong, *popt))
plt.title(f'Sdop: {round(popt[0], 2)}, Spr: {round(popt[1], 2)}, T: {T*1e3} mK, detDop: {DetDoppler} MHz')
np.savetxt('CPT_measured.txt', np.transpose([freqs, CountsDR]))
np.savetxt('CPT_fitted.txt', np.transpose([freqslong, FittedEIT]))
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 7 22:30:01 2020
@author: nico
"""
import numpy as np
import time
import matplotlib.pyplot as plt
from scipy.signal import argrelextrema
"""
Scripts para el calculo de la curva CPT
"""
def H0matrix(Detg, Detp, u):
"""
Calcula la matriz H0 en donde dr es el detuning del doppler, dp es el retuning del repump y u es el campo magnético en Hz/Gauss.
Para esto se toma la energía del nivel P como 0
"""
eigenEnergies = (Detg-u, Detg+u, -u/3, u/3, Detp-6*u/5, Detp-2*u/5, Detp+2*u/5, Detp+6*u/5) #pagina 26 de Oberst. los lande del calcio son iguales a Bario.
H0 = np.diag(eigenEnergies)
return H0
def HImatrix(rabG, rabP, phidoppler, titadoppler, phiprobe, titaprobe):
"""
Calcula la matriz de interacción Hsp + Hpd, en donde rabR es la frecuencia de rabi de la transición Doppler SP,
rabP es la frecuencia de rabi de la transición repump DP, y las componentes ei_r y ei_p son las componentes de la polarización
del campo eléctrico incidente de doppler y repump respectivamente. Deben estar normalizadas a 1
"""
HI = np.zeros((8, 8), dtype=np.complex_)
i, j = 1, 3
HI[i-1, j-1] = (rabG/np.sqrt(3)) * np.cos(titadoppler)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 1, 4
HI[i-1, j-1] = -(rabG/np.sqrt(3)) * np.sin(titadoppler)*np.exp(1j*phidoppler)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 2, 3
HI[i-1, j-1] = -(rabG/np.sqrt(3)) * np.sin(titadoppler)*np.exp(-1j*phidoppler)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 2, 4
HI[i-1, j-1] = -(rabG/np.sqrt(3)) * np.cos(titadoppler)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 3, 5
HI[i-1, j-1] = -(rabP/2) * np.sin(titaprobe)*np.exp(-1j*phiprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 3, 6
HI[i-1, j-1] = -(rabP/np.sqrt(3)) * np.cos(titaprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 3, 7
HI[i-1, j-1] = rabP/np.sqrt(12) * np.sin(titaprobe)*np.exp(1j*phiprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 4, 6
HI[i-1, j-1] = -(rabP/np.sqrt(12)) * np.sin(titaprobe)*np.exp(-1j*phiprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 4, 7
HI[i-1, j-1] = -(rabP/np.sqrt(3)) * np.cos(titaprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
i, j = 4, 8
HI[i-1, j-1] = (rabP/2) * np.sin(titaprobe)*np.exp(1j*phiprobe)
HI[j-1, i-1] = np.conjugate(HI[i-1, j-1])
return HI
def Lplusminus(detr, detp, phirepump, titarepump, forma=1):
Hintplus = np.zeros((8, 8), dtype=np.complex_)
Hintminus = np.zeros((8, 8), dtype=np.complex_)
Hintplus[4, 2] = (-1/2)*np.sin(titarepump)*np.exp(1j*phirepump)
Hintplus[5, 2] = (-1/np.sqrt(3))*np.cos(titarepump)
Hintplus[6, 2] = (1/(2*np.sqrt(3)))*np.sin(titarepump)*np.exp(-1j*phirepump)
Hintplus[5, 3] = (-1/(2*np.sqrt(3)))*np.sin(titarepump)*np.exp(1j*phirepump)
Hintplus[6, 3] = (-1/np.sqrt(3))*np.cos(titarepump)
Hintplus[7, 3] = (1/2)*np.sin(titarepump)*np.exp(-1j*phirepump)
Hintminus[2, 4] = (-1/2)*np.sin(titarepump)*np.exp(-1j*phirepump)
Hintminus[2, 5] = (-1/np.sqrt(3))*np.cos(titarepump)
Hintminus[2, 6] = (1/(2*np.sqrt(3)))*np.sin(titarepump)*np.exp(1j*phirepump)
Hintminus[3, 5] = (-1/(2*np.sqrt(3)))*np.sin(titarepump)*np.exp(-1j*phirepump)
Hintminus[3, 6] = (-1/np.sqrt(3))*np.cos(titarepump)
Hintminus[3, 7] = (1/2)*np.sin(titarepump)*np.exp(1j*phirepump)
if forma==1:
Lplus = np.zeros((64, 64), dtype=np.complex_)
Lminus = np.zeros((64, 64), dtype=np.complex_)
DeltaBar = np.zeros((64, 64), dtype=np.complex_)
for r in range(8):
for q in range(8):
for k in range(8):
for j in range(8):
if j==q:
if (k==2 or k==3) and r > 3:
Lplus[r*8+q][k*8+j] = (-1j)*(Hintplus[r,k])
if (r==2 or r==3) and k > 3:
Lminus[r*8+q][k*8+j] = (-1j)*(Hintminus[r,k])
elif r==k:
if (q==2 or q==3) and j > 3:
Lplus[r*8+q][k*8+j] = (-1j)*(- Hintplus[j,q])
if (j==2 or j==3) and q > 3:
Lminus[r*8+q][k*8+j] = (-1j)*(- Hintminus[j,q])
if forma==2:
deltaKro = np.diag([1, 1, 1, 1, 1, 1, 1, 1])
Lplus = (-1j)*(np.kron(Hintplus, deltaKro) - np.kron(deltaKro, Hintplus))
Lminus = (-1j)*(np.kron(Hintminus, deltaKro) - np.kron(deltaKro, Hintminus))
DeltaBar = np.zeros((64, 64), dtype=np.complex_)
for i in range(64):
DeltaBar[i, i] = (1j)*(detr - detp)
return np.matrix(Lminus), np.matrix(Lplus), np.matrix(DeltaBar)
def GetL1(Lplus, Lminus, DeltaBar, L0, rabR, nmax):
"""
Devuelve Splus0 y Sminus0
"""
Sp = (-1)*(0.5*rabR)*(np.matrix(np.linalg.inv(L0 - (nmax+1)*DeltaBar))*np.matrix(Lplus))
Sm = (-1)*(0.5*rabR)*(np.matrix(np.linalg.inv(L0 + (nmax+1)*DeltaBar))*np.matrix(Lminus))
for n in list(range(nmax+1))[(nmax+1)::-1][0:len(list(range(nmax+1))[(nmax+1)::-1])-1]: #jaja esto solo es para que vaya de nmax a 1 bajando. debe haber algo mas facil pero kcio
Sp = (-1)*(rabR)*(np.matrix(np.linalg.inv(L0 - n*DeltaBar + rabR*(Lminus*np.matrix(Sp))))*np.matrix(Lplus))
Sm = (-1)*(rabR)*(np.matrix(np.linalg.inv(L0 + n*DeltaBar + rabR*(Lplus*np.matrix(Sm))))*np.matrix(Lminus))
L1 = 0.5*rabR*(np.matrix(Lminus)*np.matrix(Sp) + np.matrix(Lplus)*np.matrix(Sm))
return L1
def EffectiveL(gPS, gPD, lwg, lwr, lwp):
"""
Siendo Heff = H + EffectiveL, calcula dicho EffectiveL que es (-0.5j)*sumatoria(CmDaga*Cm) que luego sirve para calcular el Liouvilliano
"""
Leff = np.zeros((8, 8), dtype=np.complex_)
Leff[0, 0] = 2*lwg
Leff[1, 1] = 2*lwg
Leff[2, 2] = ((2/3)+(1/3))*gPS + ((1/2) + (1/6) + (1/3))*gPD
Leff[3, 3] = ((2/3)+(1/3))*gPS + ((1/2) + (1/6) + (1/3))*gPD
Leff[4, 4] = 2*(lwr + lwp)
Leff[5, 5] = 2*(lwr + lwp)
Leff[6, 6] = 2*(lwr + lwp)
Leff[7, 7] = 2*(lwr + lwp)
return (-0.5j)*Leff
def CalculateSingleMmatrix(gPS, gPD, lwg, lwr, lwp):
"""
Si tomamos el Liuvilliano como L = (-j)*(Heff*deltak - Heffdaga*deltak) + sum(Mm),
esta funcion calcula dichos Mm, que tienen dimensión 64x64 ya que esa es la dimensión del L. Estas componentes
salen de hacer la cuenta a mano conociendo los Cm y considerando que Mm[8*(r-1)+s, 8*(k-1)+j] = Cm[r,l] + Cmdaga[j,s] = Cm[r,l] + Cm[s,j]
ya que los componentes de Cm son reales.
Esta M es la suma de las 8 matrices M.
"""
M = np.matrix(np.zeros((64, 64), dtype=np.complex_))
M[0,27] = (2/3)*gPS
M[9,18] = (2/3)*gPS
M[0,18] = (1/3)*gPS
M[1,19] = -(1/3)*gPS
M[8,26] = -(1/3)*gPS
M[9,27] = (1/3)*gPS
M[36,18] = (1/2)*gPD
M[37,19] = (1/np.sqrt(12))*gPD
M[44,26] = (1/np.sqrt(12))*gPD
M[45,27] = (1/6)*gPD
M[54,18] = (1/6)*gPD
M[55,19] = (1/np.sqrt(12))*gPD
M[62,26] = (1/np.sqrt(12))*gPD
M[63,27] = (1/2)*gPD
M[45,18] = (1/3)*gPD
M[46,19] = (1/3)*gPD
M[53,26] = (1/3)*gPD
M[54,27] = (1/3)*gPD
M[0,0] = 2*lwg
M[1,1] = 2*lwg
M[8,8] = 2*lwg
M[9,9] = 2*lwg
factor1 = 1
factor2 = 1
factor3 = 1
factor4 = 1
#M[36, 45] = lwp
M[36,36] = 2*(lwr + factor1*lwp)
M[37,37] = 2*(lwr + factor1*lwp)
M[38,38] = 2*(lwr + factor1*lwp)
M[39,39] = 2*(lwr + factor1*lwp)
M[44,44] = 2*(lwr + factor2*lwp)
M[45,45] = 2*(lwr + factor2*lwp)
M[46,46] = 2*(lwr + factor2*lwp)
M[47,47] = 2*(lwr + factor2*lwp)
M[52,52] = 2*(lwr + factor3*lwp)
M[53,53] = 2*(lwr + factor3*lwp)
M[54,54] = 2*(lwr + factor3*lwp)
M[55,55] = 2*(lwr + factor3*lwp)
M[60,60] = 2*(lwr + factor4*lwp)
M[61,61] = 2*(lwr + factor4*lwp)
M[62,62] = 2*(lwr + factor4*lwp)
M[63,63] = 2*(lwr + factor4*lwp)
return M
def dopplerBroadening(wlg, wlp, alpha, T, mcalcio = 6.655e-23*1e-3):
"""
Calcula el broadening extra semiclásico por temperatura considerando que el ion atrapado se mueve.
wlg es la longitud de onda doppler, wlp la longitud de onda repump, T la temperatura del ion en kelvin, y alpha (en rads) el ángulo
que forman ambos láseres.
"""
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))
return gammaD
def FullL_efficient(rabG, rabR, rabP, gPS = 0, gPD = 0, Detg = 0, Detr = 0, Detp = 0, u = 0, lwg = 0, lwr=0, lwp = 0,
phidoppler=0, titadoppler=0, phiprobe=0, titaprobe=0, phirepump=0, titarepump=0, T = 0, alpha = 0):
"""
Calcula el Liouvilliano total de manera explícita índice a índice. Suma aparte las componentes de las matrices M.
Es la más eficiente hasta ahora.
"""
db = dopplerBroadening(0.397e-6, 0.866e-6, alpha, T)
#lwr = np.sqrt(lwr**2 + dopplerBroadening(0.397e-6, 0.866e-6, alpha, T)**2)
lwg = np.sqrt(lwg**2 + db**2)
lwr = np.sqrt(lwr**2 + db**2)
CC = EffectiveL(gPS, gPD, lwg, lwr, lwp)
Heff = H0matrix(Detg, Detp, u) + HImatrix(rabG, rabP, phidoppler, titadoppler, phiprobe, titaprobe) + CC
Heffdaga = np.matrix(Heff).getH()
Lfullpartial = np.zeros((64, 64), dtype=np.complex_)
for r in range(8):
for q in range(8):
for k in range(8):
for j in range(8):
if j!=q and r!=k:
pass
elif j==q and r!=k:
if (r < 2 and k > 3) or (k < 2 and r > 3) or (r > 3 and k > 3) or (r==0 and k==1) or (r==1 and k==0) or (r==2 and k==3) or (r==3 and k==2): #todo esto sale de analizar explicitamente la matriz y tratar de no calcular cosas de más que dan cero
pass
else:
Lfullpartial[r*8+q][k*8+j] = (-1j)*(Heff[r,k])
elif j!=q and r==k:
if (j < 2 and q > 3) or (q < 2 and j > 3) or (j > 3 and q > 3) or (j==0 and q==1) or (j==1 and q==0) or (j==2 and q==3) or (j==3 and q==2):
pass
else:
Lfullpartial[r*8+q][k*8+j] = (-1j)*(-Heffdaga[j,q])
else:
if Heff[r,k] == Heffdaga[j,q]:
pass
else:
Lfullpartial[r*8+q][k*8+j] = (-1j)*(Heff[r,k]-Heffdaga[j,q])
M = CalculateSingleMmatrix(gPS, gPD, lwg, lwr, lwp)
L0 = np.array(np.matrix(Lfullpartial) + M)
nmax = 1
Lminus, Lplus, DeltaBar = Lplusminus(Detr, Detp, phirepump, titarepump)
factor1 = np.exp(1j*0.2*np.pi)
factor2 = np.exp(-1j*0.2*np.pi)
#print(factor)
L1 = GetL1(factor1*Lplus, factor2*Lminus, DeltaBar, L0, rabR, nmax)
Lfull = L0 + L1
#NORMALIZACION DE RHO
i = 0
while i < 64:
if i%9 == 0:
Lfull[0, i] = 1
else:
Lfull[0, i] = 0
i = i + 1
return Lfull
"""
Scripts para correr un experimento y hacer el análisis de los datos
"""
def CalculoTeoricoDarkResonances(u, titadoppler):
if titadoppler==0:
NegativeDR = [(-7/5)*u, (-3/5)*u, (-1/5)*u, (1/5)*u, (3/5)*u, (7/5)*u]
elif titadoppler==90:
NegativeDR = [(-11/5)*u, (-7/5)*u, (-3/5)*u, (3/5)*u, (7/5)*u, (11/5)*u]
PositiveDR = [(-8/5)*u, (-4/5)*u, 0, (4/5)*u, (8/5)*u]
return NegativeDR, PositiveDR
def CPTspectrum8levels(rabG, rabR, rabP, gPS, gPD, Detg, Detr, u, lwg, lwr, lwp, Temp, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump,
freqMin=-100, freqMax=100, freqStep=1e-1, plot=False, solvemode=1):
"""
Hace un experimento barriendo ángulos de repump con el angulo de doppler fijo.
solvemode=1: resuelve con np.linalg.solve
solvemode=2: resuelve invirtiendo L con la funcion np.linalg.inv
"""
phidoppler, titadoppler = phidoppler*(np.pi/180), titadoppler*(np.pi/180)
phiprobe, titaprobe = phiprobe*(np.pi/180), titaprobe*(np.pi/180)
phirepump, titarepump = phirepump*(np.pi/180), titarepump*(np.pi/180)
DetProbeVector = 2*np.pi*np.arange(freqMin*1e6, freqMax*1e6, freqStep*1e6)
Detg, Detr = 2*np.pi*Detg*1e6, 2*np.pi*Detr*1e6
lwg, lwr, lwp = 2*np.pi*lwg*1e6, 2*np.pi*lwr*1e6, 2*np.pi*lwp*1e6
#u = 2*np.pi*u*1e6
Fluovector = []
tinicial = time.time()
for Detp in DetProbeVector:
L = FullL_efficient(rabG, rabR, rabP, gPS, gPD, Detg, Detr, Detp, u, lwg, lwr, lwp, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, Temp, alpha)
if solvemode == 1:
rhovectorized = np.linalg.solve(L, np.array([int(i==0) for i in range(64)]))
Fluo = np.real(rhovectorized[18] + np.real(rhovectorized[27])) #estos son los rho33 + rho44
Fluovector.append(Fluo)
if solvemode == 2:
Linv = np.linalg.inv(L)
rhovectorized = [Linv[j][0] for j in range(len(Linv))]
Fluo = np.real(rhovectorized[18] + np.real(rhovectorized[27])) #estos son los rho33 + rho44
Fluovector.append(Fluo)
tfinal = time.time()
print('Done, Total time: ', round((tfinal-tinicial), 2), "s")
DetProbeVectorMHz = np.arange(freqMin, freqMax, freqStep)
if plot:
plt.xlabel('Probe detuning (MHz)')
plt.ylabel('Fluorescence (A.U.)')
plt.plot(DetProbeVectorMHz, [100*f for f in Fluovector], label=str(titaprobe) + 'º, T: ' + str(Temp*1e3) + ' mK')
plt.legend()
return DetProbeVectorMHz, Fluovector
def CPTspectrum8levels_fixedRabi(sg, sr, sp, gPS, gPD, Detg, Detr, u, lwg, lwr, lwp, Temp, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump,
freqMin=-100, freqMax=100, freqStep=1e-1, plot=False, solvemode=1):
"""
Hace un experimento barriendo ángulos de repump con el angulo de doppler fijo.
solvemode=1: resuelve con np.linalg.solve
solvemode=2: resuelve invirtiendo L con la funcion np.linalg.inv
"""
phidoppler, titadoppler = phidoppler*(np.pi/180), titadoppler*(np.pi/180)
phiprobe, titaprobe = phiprobe*(np.pi/180), titaprobe*(np.pi/180)
phirepump, titarepump = phirepump*(np.pi/180), titarepump*(np.pi/180)
DetProbeVector = 2*np.pi*np.arange(freqMin*1e6, freqMax*1e6, freqStep*1e6)
Detg, Detr = 2*np.pi*Detg*1e6, 2*np.pi*Detr*1e6
#lwg, lwr, lwp = 2*np.pi*lwg*1e6, 2*np.pi*lwr*1e6, 2*np.pi*lwp*1e6
lwg, lwr, lwp = lwg*1e6, lwr*1e6, lwp*1e6
rabG = sg*gPS
rabR = sr*gPD
rabP = sp*gPD
#u = 2*np.pi*u*1e6
Fluovector = []
tinicial = time.time()
for Detp in DetProbeVector:
L = FullL_efficient(rabG, rabR, rabP, gPS, gPD, Detg, Detr, Detp, u, lwg, lwr, lwp, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, Temp, alpha)
if solvemode == 1:
coh = 5
rhovectorized = np.linalg.solve(L, np.array([int(i==0) for i in range(64)]))
#Fluo = np.abs(rhovectorized[coh])
Fluo = np.real(rhovectorized[18] + np.real(rhovectorized[27])) #estos son los rho33 + rho44
Fluovector.append(Fluo)
if solvemode == 2:
Linv = np.linalg.inv(L)
rhovectorized = [Linv[j][0] for j in range(len(Linv))]
Fluo = np.real(rhovectorized[18] + np.real(rhovectorized[27])) #estos son los rho33 + rho44
Fluovector.append(Fluo)
tfinal = time.time()
print('Done, Total time: ', round((tfinal-tinicial), 2), "s")
DetProbeVectorMHz = np.arange(freqMin, freqMax, freqStep)
if plot:
plt.xlabel('Probe detuning (MHz)')
plt.ylabel('Fluorescence (A.U.)')
plt.plot(DetProbeVectorMHz, [100*f for f in Fluovector], label=str(titaprobe) + 'º, T: ' + str(Temp*1e3) + ' mK')
plt.legend()
return DetProbeVectorMHz, Fluovector
#%%
if __name__ == "__main__":
ub = 9.27e-24
h = 6.63e-34
c = (ub/h)*1e-4 #en unidades de MHz/G
B = 25 #campo magnetico en gauss
u = c*B
sg, sr, sp = 0.5, 1.5, 4 #parámetros de saturación del doppler y repump
gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6 #anchos de linea de las transiciones
rabG, rabR, rabP = sg*gPS, sr*gPD, sp*gPD #frecuencias de rabi
lwg, lwr, lwp = 0.3, 0.3, 0.3 #ancho de linea de los laseres
Detg = -25
Detr = 20 #detuning del doppler y repump
Temp = 0.0e-3 #temperatura en K
alpha = 0*(np.pi/180) #angulo entre los láseres
phidoppler, titadoppler = 0, 90
phirepump, titarepump = 0, 90
phiprobe, titaprobe = 0, 90
plotCPT = False
freqMin = -50
freqMax = 50
freqStep = 5e-2
Frequencyvector, Fluovector = CPTspectrum8levels(rabG, rabR, rabP, gPS, gPD, Detg, Detr, u, lwg, lwr, lwp, Temp, alpha, phidoppler, titadoppler, phiprobe, titaprobe, phirepump, titarepump, freqMin=freqMin, freqMax=freqMax, freqStep=freqStep, plot=plotCPT, solvemode=1)
NegativeDR, PositiveDR = CalculoTeoricoDarkResonances(u/(2*np.pi*1e6), titadoppler)
plt.plot(Frequencyvector, [100*f for f in Fluovector], label=str(titaprobe) + 'º, T: ' + str(Temp*1e3) + ' mK')
plt.xlabel('Probe detuning (MHz)')
plt.ylabel('Fluorescence (A.U.)')
for PDR in PositiveDR:
plt.axvline(Detr+PDR, linestyle='--', linewidth=0.5, color='red')
for NDR in NegativeDR:
plt.axvline(Detg+NDR, linestyle='--', linewidth=0.5, color='blue')
#parametros que andan piola:
"""
ub = 9.27e-24
h = 6.63e-34
c = (ub/h)*1e-4 #en unidades de MHz/G
B = 17 #campo magnetico en gauss
u = c*B
#u = 80e6
sr, sp = 0.53, 4.2
gPS, gPD, = 2*np.pi*21.58e6, 2*np.pi*1.35e6
rabR, rabP = sr*gPS, sp*gPD
lw = 2*np.pi * 0.33e6
lwr, lwp = lw, lw #ancho de linea de los laseres
dr_spec = - 2*np.pi* 26e6
freqSteps = 500
freqMin = -100e6
freqMax = 100e6
dps = 2*np.pi*np.linspace(freqMin, freqMax, freqSteps)
#dps = [-30e6]
alfar = 90*(np.pi/180)
ex_r, ey_r, ez_r = np.sin(alfar)*np.cos(0), np.sin(alfar)*np.sin(0), np.cos(alfar)
alfap = 90*(np.pi/180)
ex_p, ey_p, ez_p = np.sin(alfap)*np.cos(0), np.sin(alfap)*np.sin(0), np.cos(alfap)
"""
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
#Mediciones barriendo angulo del TISA y viendo kicking de resonancias oscuras
#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/20230713_EspectrosCristal6iones/Data/')
MOTIONAL_FILES = """000013216-IR_Scan_withcal_optimized_andor
"""
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(MOTIONAL_FILES))
#carpeta pc nico labo escritorio:
#C:\Users\Usuario\Documents\artiq\artiq_experiments\analisis\plots\20211101_CPT_DosLaseres_v03\Data
CountsRoi1 = []
CountsRoi2 = []
CountsRoi3 = []
CountsRoi4 = []
CountsRoi5 = []
CountsRoi6 = []
CountsRoi7 = []
#Amplitudes = []
IR1_Freqs = []
#IR_amps = []
for i, fname in enumerate(MOTIONAL_FILES.split()):
print(str(i) + ' - ' + fname)
data = h5py.File(fname+'.h5', 'r')
#Amplitudes.append(np.array(data['datasets']['amplitudes']))
CountsRoi1.append(np.array(data['datasets']['counts_roi1']))
CountsRoi2.append(np.array(data['datasets']['counts_roi2']))
IR1_Freqs.append(np.array(data['datasets']['IR1_Frequencies']))
#%%
"""
En cristal de 2 iones veo espectros cpt.
"""
i = 0
CountsRois = [CountsRoi1, CountsRoi2]
plt.figure()
f=[1]
for counts in CountsRois:
plt.plot(IR1_Freqs[0][1:], [c for c in counts[0][1:]], '-o', markersize=2)
i=i+1
plt.xlabel('Frecuencia')
plt.ylabel('Cuentas ROI')
#plt.xlim(0.05,0.23)
#plt.ylim(15550,16400)
plt.grid()
plt.legend()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment