from math import sin,asin,radians,degrees

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 angle(s,top=90):
 while 1:
  x=pos(s)
  if x<=top:return x
  print("Angle is too large")

def menu():
 while 1:
  try:
   x=int(input("Choose 1-5: "))
   if x>0 and x<6:return x
  except:pass
  print("Choose 1 to 5")

duckiedai_intro("BRAGGS LAW")
print("BRAGG'S LAW")
print("n*lambda=2*d*sin(t)")
print("1 Find d")
print("2 Find theta")
print("3 Find lambda")
print("4 Find order n")
print("5 d from 2theta")
c=menu()

if c==1:
 n=whole("Order n: ")
 w=pos("Lambda: ")
 t=angle("Theta deg: ")
 d=n*w/(2*sin(radians(t)))
 print("d =",d)
 print("2theta =",2*t)

elif c==2:
 n=whole("Order n: ")
 w=pos("Lambda: ")
 d=pos("d: ")
 r=n*w/(2*d)
 if r>1:print("No Bragg angle")
 else:
  t=degrees(asin(r))
  print("theta =",t)
  print("2theta =",2*t)

elif c==3:
 n=whole("Order n: ")
 d=pos("d: ")
 t=angle("Theta deg: ")
 print("lambda =",2*d*sin(radians(t))/n)

elif c==4:
 w=pos("Lambda: ")
 d=pos("d: ")
 t=angle("Theta deg: ")
 n=2*d*sin(radians(t))/w
 near=round(n)
 print("Calculated n =",n)
 print("Nearest order =",near)
 if near<1:print("No positive order")
 elif abs(n-near)<.001:print("Matches integer order")
 else:print("Not an integer order")

else:
 n=whole("Order n: ")
 w=pos("Lambda: ")
 t=angle("2theta deg: ",180)/2
 print("theta =",t)
 print("d =",n*w/(2*sin(radians(t))))

input("ENTER for guide: ")
print("QUICK GUIDE")
print("n=1,2,3,...")
print("d and lambda: same")
print("Bragg uses theta")
print("XRD often gives 2theta")
print("DuckieDai: done!")
input("ENTER to exit: ")
