working preliminary POC

This commit is contained in:
2025-03-22 00:32:16 +01:00
parent 0d55853f03
commit 96c23c62d1
5 changed files with 183 additions and 44 deletions

View File

@ -1,25 +1,76 @@
from django.shortcuts import render
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):
return render(request, 'home.html')
def result(request):
num1 = int(request.GET.get('number1'))
num2 = int(request.GET.get('number2'))
if request.GET.get('add') == "":
ans = num1 + num2
elif request.GET.get('subtract') == "":
ans = num1 - num2
elif request.GET.get('multiply') == "":
ans = num1 * num2
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:
ans = num1 / num2
spin = mark_safe(f"<sup>{isotope.spin_quantum_number.as_integer_ratio()[0]}</sup>&frasl;<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*1e6:.5e}"]
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: 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})