From b7a7edfa7bba14f194e31a425c6db2005d83b036 Mon Sep 17 00:00:00 2001 From: Markus Rosenstihl Date: Mon, 31 Mar 2025 22:26:53 +0200 Subject: [PATCH] add column with rel. sensitivity --- isotables/isotopapp/templates/result.html | 8 ++++- isotables/isotopapp/views.py | 43 ++++++++++++++--------- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/isotables/isotopapp/templates/result.html b/isotables/isotopapp/templates/result.html index 13782e3..536fab1 100644 --- a/isotables/isotopapp/templates/result.html +++ b/isotables/isotopapp/templates/result.html @@ -22,6 +22,7 @@ Spin Nat. ab. in % γ in MHz/T + Sens. in %(1H) @@ -39,13 +40,18 @@ {{ div| safe }}
+ - {{ script| safe }} +
diff --git a/isotables/isotopapp/views.py b/isotables/isotopapp/views.py index f5100cb..2fd80a6 100644 --- a/isotables/isotopapp/views.py +++ b/isotables/isotopapp/views.py @@ -5,7 +5,7 @@ from django.shortcuts import render from django.utils.safestring import mark_safe import re -from bokeh.plotting import figure as bokehfig +from bokeh.plotting import figure from bokeh.embed import components from bokeh.models import Label, Node, MathML @@ -36,8 +36,21 @@ def isotope_info(isotope, field): isotope.name.capitalize(), f"{f_larmor:.3f}", spin, - f"{isotope.natural_abundance:.1f}", - f"{isotope.gamma:.5f}"] + f"{isotope.natural_abundance:.3f}", + f"{isotope.gamma:.5f}", + f"{relative_sensitivity(isotope):.4f}"] + +def relative_sensitivity(iso): + riso = Isotope.objects.filter(symbol="H", n_nucleons="1").get() + i1 = riso.spin_quantum_number + g1 = riso.gamma + ab1 = riso.natural_abundance + i2 = float(iso.spin_quantum_number) + g2 = float(iso.gamma) + ab2 = float(iso.natural_abundance) + rel_sens = i2*(i2+1)*g2**3*ab2 / (i1*(i1+1)*g1**3*ab1) + print(rel_sens) + return rel_sens*100 def result(request): n1, element1 = extract_isotope_parts(request.GET.get('isotope1')) @@ -52,7 +65,7 @@ def result(request): print(request.GET) if request.GET.get('range_search') == "": - close_isotopes = [isotope_info(isotope1, field_T)] + close_isotopes = [] 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 @@ -63,12 +76,15 @@ def result(request): 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])) + div = f"Field B0: {field_T:.3f} T" + script = "" elif request.GET.get('gradient_search') == "": sample_diameter = 5e-3 gradient = float(request.GET.get('gradient')) # create a plot (bokeh) - plot = bokehfig(outer_width=400, outer_height=400, match_aspect=True) + + plot = figure(outer_width=400, outer_height=400, match_aspect=True) plot.ellipse(x=[0], y=[0], width=5, height=5, color="#D5D9FF", alpha=0.8, line_width=1, line_color="black") plot.ellipse(x=[0], y= [2.5], width=5, height=5, color="#D5D9FF", alpha=0.4, line_width=1, line_color="black") plot.ellipse(x=[0], y=[-2.5], width=5, height=5, color="#D5D9FF", alpha=0.4, line_width=1, line_color="black") @@ -83,17 +99,8 @@ def result(request): i_info = isotope_info(isotope, field_T) #i_info[3] = f"{z*1e3:.1f} mm" close_isotopes.append(i_info) - mathml = f""" - - - {isotope.n_nucleons} - - {isotope.symbol} - - """ plot.rect(x=[0], y=[z*1e3], width=5, height=0.2, color="black", alpha=0.6) label = Label(x=2.6, y=z*1e3, text=f"{isotope.n_nucleons}{isotope.symbol}", text_baseline="middle", text_align="left", text_font_size="16pt") - #label = Label(x=2.6, y=z*1e3, text=MathML(mathml), text_baseline="middle", text_align="left", text_font_size="16pt") plot.add_layout(label) frame_left = Node(target="frame", symbol="left", offset=5) @@ -102,10 +109,10 @@ def result(request): x=frame_left, y=frame_bottom, anchor="bottom_left", - #text=MathML(text=f"{isotope1.n_nucleons}{isotope1.symbol}: {freq:.1f} MHz\ng={gradient:.1f} T/m\n5 mm sample dia."), + #text=MathML(text=f"{isotope1.n_nucleons}{isotope1.symbol}: {freq:.1f} MHz\ng={gradient:.1f} T/m\n5 mm sample dia."), text=f"{isotope1.n_nucleons}{isotope1.symbol}: {freq:.1f} MHz\ng={gradient:.1f} T/m\n5 mm sample dia.", #text=MathML("tewt"), - padding=10, + padding=5, border_radius=5, border_line_color="black", background_fill_color="white", ) @@ -119,7 +126,9 @@ def result(request): 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)] + ans = [isotope_info(isotope2, field_T), isotope_info(isotope1, field_T) ] + div = f"Field B0: {field_T:.3f} T" + script = "" else: ans = [] return render(request, 'result.html', {'ans': ans, 'script': script, 'div': div})