77 lines
3.1 KiB
Python
77 lines
3.1 KiB
Python
from math import pi
|
|
|
|
from django.shortcuts import render
|
|
from django.utils.safestring import mark_safe
|
|
import re
|
|
|
|
|
|
from isotopapp.models import Isotope
|
|
# Create your views here.
|
|
|
|
def home(request):
|
|
isotopes = [i for i in Isotope.objects.all() if (i.gamma != 0 or i.stable)]
|
|
return render(request, 'home.html', {'isotopes': [[f"{i.n_nucleons}{i.symbol}", mark_safe(f"<sup>{i.n_nucleons}</sup>{i.symbol}")] for i in isotopes]})
|
|
|
|
def extract_isotope_parts(isotope_str):
|
|
"""Extracts the number and element from an isotope string (e.g., '23Na')."""
|
|
print(isotope_str)
|
|
match = re.match(r"(\d+)([A-Za-z]+)", isotope_str)
|
|
if not match:
|
|
raise ValueError("Invalid isotope format")
|
|
return int(match.group(1)), match.group(2)
|
|
|
|
def isotope_info(isotope, field):
|
|
f_larmor = field*isotope.gamma
|
|
if isotope.spin_quantum_number.as_integer_ratio()[1]==1:
|
|
spin = int(isotope.spin_quantum_number)
|
|
else:
|
|
spin = mark_safe(f"<sup>{isotope.spin_quantum_number.as_integer_ratio()[0]}</sup>⁄<sub>{isotope.spin_quantum_number.as_integer_ratio()[1]}</sub>")
|
|
return [isotope.n_nucleons,
|
|
mark_safe(f"<sup>{isotope.n_nucleons}</sup>{isotope.symbol}"),
|
|
isotope.name.capitalize(),
|
|
f"{f_larmor:.3f}",
|
|
spin,
|
|
f"{isotope.natural_abundance:.1f}",
|
|
f"{isotope.gamma:.5f}"]
|
|
|
|
def result(request):
|
|
n1, element1 = extract_isotope_parts(request.GET.get('isotope1'))
|
|
isotope1 = Isotope.objects.filter(symbol=element1, n_nucleons=n1).get()
|
|
|
|
freq = float(request.GET.get('freq'))
|
|
|
|
field_T = freq / isotope1.gamma
|
|
|
|
close_isotopes = []
|
|
|
|
if request.GET.get('search') == "":
|
|
freq_range = float(request.GET.get('freq_range'))
|
|
Isotope.objects.filter()
|
|
# calculate the frequency for all isotopes and compile a list of close by isotopes
|
|
for isotope in Isotope.objects.all():
|
|
if isotope.gamma == 0: continue
|
|
if not isotope.stable: continue
|
|
f_Larmor = field_T*isotope.gamma
|
|
if abs(f_Larmor - freq) <= freq_range:
|
|
close_isotopes.append(isotope_info(isotope, field_T))
|
|
ans = sorted(close_isotopes, key=lambda x: -float(x[3]))
|
|
|
|
elif request.GET.get('calculate') == "":
|
|
sample_diameter = 5e-3
|
|
gradient = float(request.GET.get('gradient'))
|
|
freq_range = sample_diameter/2 * gradient * isotope1.gamma
|
|
for isotope in Isotope.objects.all():
|
|
if isotope.gamma == 0: continue
|
|
if not isotope.stable: continue
|
|
f_Larmor = field_T*isotope.gamma
|
|
if abs(f_Larmor - freq) <= freq_range:
|
|
close_isotopes.append(isotope_info(isotope, field_T))
|
|
ans = sorted(close_isotopes, key=lambda x: x[3])
|
|
elif request.GET.get('transform') == "":
|
|
n2, element2 = extract_isotope_parts(request.GET.get('isotope2'))
|
|
isotope2 = Isotope.objects.filter(symbol=element2, n_nucleons=n2).get()
|
|
#isotope_info(isotope2, field_T)
|
|
ans = [isotope_info(isotope2, field_T)]
|
|
|
|
return render(request, 'result.html', {'ans': ans})
|