from qutip import tensor, Qobj, qeye, destroy
import numpy as np
def fluorescence_hamiltonian(N, g21, g10, wa0, wa1, wa2):
a10 = tensor(destroy(N), qeye(N),qeye(3))
a21 = tensor(qeye(N), destroy(N), qeye(3))
sm21 = tensor(qeye(N), qeye(N),Qobj([[0,0,0],[0,0,1],[0,0,0]])) #Transition from second to first excited state
sm10 = tensor(qeye(N), qeye(N),Qobj([[0,1,0],[0,0,0],[0,0,0]])) #Transition from first excited state to ground state
# Hamiltonian without light-matter interaction
H = (wa1-wa0) * a10.dag() * a10 + + (wa2-wa1)*a21.dag()*a21+tensor(qeye(N), qeye(N),Qobj([[0,0,0],[0,wa1,0],[0,0,wa2]]))
# Light-atom interaction
Hi = g21*(a21.dag()*sm21+sm21.dag()*a21) #Emission from second exited state, absorbsion from second exited state
Hi += g10*(a10.dag()*sm10+sm10.dag()*a10)
# Transform to interaction picture
h=[[1,0,0],[0,np.exp(1j*wa1),0],[0,0,np.exp(1j*wa2)]]
EH=tensor(qeye(N),qeye(N),Qobj(h))
H=EH*Hi*EH.dag()
# It has to be Hermitian
assert H.isherm
return H