from math import sqrt

h=6.62607015e-34
light=299792458
me=9.1093837e-31
charge=1.602176634e-19
R=1.0973731568e7

def duckiedai_intro(program_name,wait=True):
 title=program_name[:16]
 empty=16-len(title)
 left=empty//2
 right=empty-left
 print("+----------------------+")
 print("|   "+" "*left+title+" "*right+"   |")
 print("|                      |")
 print("|       __             |")
 print("|   ___(o )>  quack!   |")
 print("|   \\ <_. )           |")
 print("|    `---'             |")
 print("|     by DuckieDai     |")
 print("+----------------------+")
 print("Loading...")
 if wait:
  input("Press enter to start ")
  print("\n"*6)

def pos(s):
 while 1:
  try:
   x=float(input(s))
   if x>0:return x
  except:pass
  print("Enter a positive #")

def whole(s):
 while 1:
  try:
   x=int(input(s))
   if x>0:return x
  except:pass
  print("Enter a whole #")

def menu(s,top):
 while 1:
  try:
   x=int(input(s))
   if x>0 and x<=top:return x
  except:pass
  print("Invalid choice")

def wave(w):
 print("lambda m =",w)
 print("lambda nm =",w*1e9)
 print("lambda pm =",w*1e12)

def photon(w):
 f=light/w
 e=h*f
 print("Frequency Hz =",f)
 print("Energy J =",e)
 print("Energy eV =",e/charge)

duckiedai_intro("QUANTUM WAVE")
print("QUANTUM WAVELENGTH")
print("1 lambda from m,v")
print("2 lambda from p")
print("3 Find momentum")
print("4 Electron voltage")
print("5 Rydberg lambda")
print("6 Transition info")
c=menu("Choose 1-6: ",6)

if c==1:
 m=pos("Mass kg: ")
 v=pos("Velocity m/s: ")
 p=m*v
 wave(h/p)
 print("p kg*m/s =",p)

elif c==2:
 p=pos("Momentum kg*m/s: ")
 wave(h/p)

elif c==3:
 print("1 meters 2 nm 3 pm")
 u=menu("Choose unit: ",3)
 w=pos("lambda: ")
 if u==2:w=w*1e-9
 elif u==3:w=w*1e-12
 print("p kg*m/s =",h/w)

elif c==4:
 v=pos("Voltage V: ")
 p=sqrt(2*me*charge*v)
 wave(h/p)
 print("p kg*m/s =",p)
 if v>10000:print("High V: relativity matters")

elif c==5:
 z=whole("Atomic Z: ")
 n1=whole("Lower n1: ")
 n2=whole("Upper n2: ")
 if n2<=n1:print("n2 must exceed n1")
 else:
  w=1/(R*z**2*(1/n1**2-1/n2**2))
  wave(w)
  photon(w)

else:
 z=whole("Atomic Z: ")
 n1=whole("Initial n: ")
 n2=whole("Final n: ")
 if n1==n2:print("No transition")
 else:
  w=1/(R*z**2*abs(1/n2**2-1/n1**2))
  if n1>n2:print("EMISSION")
  else:print("ABSORPTION")
  print("n",n1,"to",n2)
  wave(w)
  photon(w)
  if z==1:
   low=min(n1,n2)
   if low==1:print("Lyman: UV")
   elif low==2:print("Balmer: visible")
   elif low==3:print("Paschen: infrared")
   else:print("Higher H series")

input("ENTER for guide: ")
print("QUICK GUIDE")
print("lambda=h/p")
print("More p: shorter lambda")
print("High n to low n: emit")
print("Low n to high n: absorb")
print("DuckieDai: done!")
input("ENTER to exit: ")
