From 7008031859ca1c3865f324f83a252f20d2467110 Mon Sep 17 00:00:00 2001 From: rskoupy Date: Fri, 15 Dec 2023 18:39:02 +0100 Subject: [PATCH] layout --- .../ptychoScopy-checkpoint.ipynb | 134 +++++++++++------- calibrations.xlsx | Bin 33465 -> 33456 bytes ptychoScopy.ipynb | 134 +++++++++++------- 3 files changed, 170 insertions(+), 98 deletions(-) diff --git a/.ipynb_checkpoints/ptychoScopy-checkpoint.ipynb b/.ipynb_checkpoints/ptychoScopy-checkpoint.ipynb index 1b4f582..f46d062 100644 --- a/.ipynb_checkpoints/ptychoScopy-checkpoint.ipynb +++ b/.ipynb_checkpoints/ptychoScopy-checkpoint.ipynb @@ -28,7 +28,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 137, "id": "7425242d-3c91-4c1e-a424-08625a38ee7a", "metadata": {}, "outputs": [], @@ -277,7 +277,7 @@ " return beam_res.value\n", " \n", " def show_probe_angle(self,caller):\n", - " aperture_res.value = f'Probe semi-angle (mrad) {\"{:.1f}\".format(pty.get_angle(caller.new))}' \n", + " aperture_res.value = f'Semi-angle (mrad) {\"{:.1f}\".format(pty.get_angle(caller.new))}' \n", " return aperture_res.value\n", " \n", " def show_corrprobe_angle(self,caller):\n", @@ -301,7 +301,23 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, + "id": "66e552e4-5954-4f3f-a59f-66c5affb69b6", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "125969b5-b128-4869-ae27-4aa7d8949d48", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 213, "id": "8055b802-cf83-4250-aea9-54e3e6b73db0", "metadata": {}, "outputs": [ @@ -315,34 +331,42 @@ ], "source": [ "### CONTROLS ##########################################\n", - "ali = dict(style = {'description_width': '80px','button_width': '55px', 'font_weight': 'bold'}, button_style='',disabled = False)\n", + "ali = dict(style = {'description_width': '110px','button_width': '55px', 'font_weight': 'bold'}, button_style='',disabled = False)\n", "ali2 = dict(style = {'description_width': '60px','button_width': '90px', 'font_weight': 'bold'}, button_style='',disabled = False)\n", - "\n", + "ali3 = dict(style = {'description_width': '110px','button_width': '45px', 'font_weight': 'bold'}, button_style='',disabled = False)\n", "# header = Button(description='Control panel',layout=Layout(width='auto', grid_area='header'), style=ButtonStyle(button_color='navy', font_weight= 'bold',font_size= '20px',font_variant='small-caps',text_color='white'),disabled = False)\n", "\n", - "beam_set = Button(description='Electron beam settings',layout=Layout(width='auto', grid_area='beam_set'), style=ButtonStyle(button_color='navy', font_weight= 'bold',font_size= '16px',font_variant='small-caps',text_color='white'),disabled = False) \n", - "beam = ToggleButtons(options=opt.energies(), value=200,description='Beam energy (keV)', layout=Layout(width='auto', grid_area='beam_set1'), **ali )\n", - "aperture = ToggleButtons(options=opt.apertures(), value='30um', description='Aperture', layout=Layout(width='auto', grid_area='beam_set2'), **ali)\n", - "probe = ToggleButtons(options=opt.probes(), value='8C', description='Probe', layout=Layout(width='auto', grid_area='beam_set3'), **ali)\n", - "defocus = IntSlider(description='Defocus (nm)', value=0, min=0, max=1000, step=1, continuous_update=False, layout=Layout(width='auto', grid_area='beam_set4'), **ali)\n", + "beam_set = Button(description='Electron beam settings',layout=Layout(width='95%', grid_area='beam_set'), style=ButtonStyle(button_color='#0d48a1', font_weight= 'bold',font_size= '16px',font_variant='small-caps',text_color='white'),disabled = False) \n", + "beam = Dropdown(options=opt.energies(), value=200,description='Beam energy (keV)', layout=Layout(width='95%', grid_area='beam_set1'), **ali )\n", + "aperture_name = Label(value = 'Aperture',layout=Layout(width='95%', grid_area='aperture_name'),)\n", + "if len(opt.apertures())>5:\n", + " aperture = Dropdown(options=opt.apertures(), description='', layout=Layout(width='95%', grid_area='beam_set2'), **ali)\n", + "else:\n", + " aperture = ToggleButtons(options=opt.apertures(), description='', layout=Layout(width='95%', grid_area='beam_set2'), **ali3)\n", "\n", - "scanning_set = Button(description='Scanning parameters',layout=Layout(width='auto', grid_area='scanning_set'),style=ButtonStyle(button_color='navy', font_weight= 'bold',font_size= '16px',font_variant='small-caps',text_color='white'),disabled = False)\n", - "mag = ToggleButtons(options=opt.magnifications(),value=3,description='Magnification Mx', layout=Layout(width='auto', grid_area='scanning_set1'), **ali)\n", - "matrix = ToggleButtons(options=opt.mappings(), value=2048, description='Matrix', layout=Layout(width='auto', grid_area='scanning_set2'), **ali)\n", - "dwell_time = ToggleButtons(options=opt.dwelltimes(), value=10, description='Dwell time (μs)', layout=Layout(width='auto', grid_area='scanning_set3'), **ali)\n", + "probe = Dropdown(options=opt.probes(), value='8C', description='Probe', layout=Layout(width='95%', grid_area='beam_set3'), **ali)\n", + "defocus = IntSlider(description='Defocus (nm)', value=0, min=0, max=1000, step=1, continuous_update=False, layout=Layout(width='95%', grid_area='beam_set4'), **ali)\n", + "\n", + "scanning_set = Button(description='Scanning parameters',layout=Layout(width='95%', grid_area='scanning_set'),style=ButtonStyle(button_color='#0d48a1', font_weight= 'bold',font_size= '16px',font_variant='small-caps',text_color='white'),disabled = False)\n", + "mag = Dropdown(options=opt.magnifications(),value=3,description='Magnification Mx', layout=Layout(width='95%', grid_area='scanning_set1'), **ali)\n", + "matrix = Dropdown(options=opt.mappings(), value=2048, description='Matrix', layout=Layout(width='95%', grid_area='scanning_set2'), **ali)\n", + "dwell_time = Dropdown(options=opt.dwelltimes(), value=10, description='Dwell time (μs)', layout=Layout(width='95%', grid_area='scanning_set3'), **ali)\n", "print(len(opt.detectors()))\n", "\n", "\n", "\n", - "camera_set = Button(description='Detection',layout=Layout(width='auto', grid_area='camera_set'),style=ButtonStyle(button_color='navy', font_weight= 'bold',font_size= '16px',font_variant='small-caps',text_color='white'),disabled = False)\n", - "cl = ToggleButtons(options=opt.cameralengths(), value=12, description='Nominal camera length (cm)', layout=Layout(width='auto', grid_area='cl_set1'), **ali)\n", - "camera = ToggleButtons(options=opt.detectors(), description='Detector', layout=Layout(width='auto', grid_area='camera_set1'), style = {'description_width': '60px','button_width': str(100/len(opt.detectors())-len(opt.detectors()))+'%', 'font_weight': 'bold'})\n", - "restriction = ToggleButtons(options=[('.',False), ('..',True)], value = False, description='PAAR',icons = ['times','check'], layout=Layout(width='auto', grid_area='camera_set2'),style = {'description_width': '80px','button_width': '48%', 'font_weight': 'bold'})\n", - "binning = ToggleButtons(options=[('.',1), ('2×2',2), ('4×4',4), ('3×3',3), ('6×6',6), ('8×8',8), ('12×12',12), ('16×16',16), ('24×24',24), ('32×32',32), ('48×48',48)], value=1, description='Binning', icons = ['times','',''], layout=Layout(width='auto', grid_area='camera_set3'), **ali)\n", + "camera_set = Button(description='Detection',layout=Layout(width='95%', grid_area='camera_set'),style=ButtonStyle(button_color='#0d48a1', font_weight= 'bold',font_size= '16px',font_variant='small-caps',text_color='white'),disabled = False)\n", + "cl = Dropdown(options=opt.cameralengths(), value=12, description='Nominal CL (cm)', layout=Layout(width='95%', grid_area='cl_set1'), **ali3)\n", + "camera_name = Label(value = 'Detector',layout=Layout(width='95%', grid_area='camera_name'),)\n", + "camera = ToggleButtons(options=opt.detectors(), description='', layout=Layout(width='95%', grid_area='camera_set1'), style = {'description_width': '60px','button_width': str(100/len(opt.detectors())-len(opt.detectors()))+'%', 'font_weight': 'bold'}, button_style='')\n", + "restriction_name = Label(value = 'PAAR',layout=Layout(width='95%', grid_area='restriction_name'),)\n", + "restriction = ToggleButtons(options=[('.',False), ('..',True)], value = False, description='',icons = ['times','check'], layout=Layout(width='95%', grid_area='camera_set2'),style = {'description_width': '80px','button_width': '48%', 'font_weight': 'bold'}, button_style='')\n", + "binning_name = Label(value = 'Binning',layout=Layout(width='95%', grid_area='binning_name'),)\n", + "binning = ToggleButtons(options=[('.',1), ('2',2), ('4',4), ('8',8), ('16',16)], value=1, description='', icons = ['times','',''], layout=Layout(width='auto', grid_area='camera_set3'), **ali3)\n", "\n", "beam_res = Label(value = f'λ (pm) '+ str(\"{:.1f}\".format(pty.get_wavelength(beam.value)*1e12)),layout=Layout(width='auto', grid_area='sidebar1'),)\n", "beam.observe(inte.show_wavelength, names='value') \n", - "aperture_res = Label(value = f'Probe semi-angle (mrad) '+ str(\"{:.1f}\".format(pty.get_angle(aperture.value))), layout=Layout(width='auto', grid_area='sidebar2'),)\n", + "aperture_res = Label(value = f'Semi-angle (mrad) '+ str(\"{:.1f}\".format(pty.get_angle(aperture.value))), layout=Layout(width='auto', grid_area='sidebar2'),)\n", "aperture.observe(inte.show_probe_angle, names='value') \n", "aperture_res2 = Label(value = f'corr. '+ str(\"{:.2f}\".format(pty.get_angle_corr(aperture.value))),layout=Layout(width='auto', grid_area='sidebar5'),)\n", "aperture.observe(inte.show_corrprobe_angle, names='value') \n", @@ -353,38 +377,37 @@ "\n", "footer = Button(description='',layout=Layout(width='auto', grid_area='footer'),style=ButtonStyle(button_color='navy', font_weight= 'bold',font_size= '16px',font_variant='small-caps',text_color='white'))\n", "\n", - "controls = GridBox(children=[beam_set, beam, aperture, probe, defocus, scanning_set, mag,matrix,dwell_time, cl,camera_set, camera, restriction, binning, beam_res, aperture_res,aperture_res2,fov_res, dwell_time_res,footer],\n", - " layout=Layout(width='15%', grid_template_rows='auto auto auto', grid_template_columns='30% 30% 20% 20%', grid_template_areas='''\n", + "\n", + "\n", + "controls = GridBox(children=[beam_set, beam,aperture_name, aperture, probe, defocus, scanning_set, mag,matrix,dwell_time, cl,camera_set, camera,camera_name, restriction_name, restriction, binning_name, binning, beam_res, aperture_res,aperture_res2,fov_res, dwell_time_res],\n", + " layout=Layout(width='325px', grid_template_rows='35px 35px 35px 35px 30px 30px 35px 35px 35px 35px 35px 35px 35px 35px 35px 35px', grid_template_columns='20% 40% 15% 25%', grid_template_areas='''\n", " \"beam_set beam_set beam_set beam_set \" \n", " \"beam_set1 beam_set1 beam_set1 beam_set1 \"\n", - " \"beam_set2 beam_set2 beam_set2 beam_set2 \"\n", - " \"sidebar2 sidebar2 sidebar5 sidebar5 \"\n", " \"beam_set3 beam_set3 beam_set3 beam_set3 \"\n", " \"beam_set4 beam_set4 beam_set4 beam_set4 \"\n", + " \"aperture_name beam_set2 beam_set2 beam_set2 \"\n", + " \". sidebar2 sidebar2 sidebar5 \"\n", " \"scanning_set scanning_set scanning_set scanning_set \" \n", " \"scanning_set1 scanning_set1 scanning_set1 scanning_set1 \"\n", " \"scanning_set2 scanning_set2 scanning_set2 scanning_set2 \"\n", " \"scanning_set3 scanning_set3 scanning_set3 scanning_set3 \"\n", " \"camera_set camera_set camera_set camera_set \"\n", " \"cl_set1 cl_set1 cl_set1 cl_set1 \"\n", - " \"camera_set1 camera_set1 camera_set1 camera_set1 \"\n", - " \"camera_set3 camera_set3 camera_set3 camera_set3 \"\n", - " \"camera_set2 camera_set2 camera_set2 camera_set2 \"\n", - " \"footer footer footer footer \"\n", + " \"camera_name camera_set1 camera_set1 camera_set1 \"\n", + " \"restriction_name camera_set2 camera_set2 camera_set2 \"\n", + " \"binning_name camera_set3 camera_set3 camera_set3 \"\n", " '''))\n", "\n", "# SMALL CONTROLS\n", - "descr = '100px'\n", + "descr = '75px'\n", "butt = '100px'\n", "butt2 = '150px'\n", "\n", - "header1 = Button(description='Graph selection',layout=Layout(width='auto', grid_area='header1'),style=ButtonStyle(button_color='lightgray', font_weight= 'bold',text_color='black'), disabled = False)\n", - "header2 = Button(description='CTF graph',layout=Layout(width='auto', grid_area='header2'),style=ButtonStyle(button_color='lightgray', font_weight= 'bold',text_color='black'),disabled = False)\n", - "header3 = Button(description='CL limitations',layout=Layout(width='auto', grid_area='header3'),style=ButtonStyle(button_color='lightgray', font_weight= 'bold',text_color='black'),disabled = False)\n", + "header3 = Button(description='CL limitations',layout=Layout(width='auto', grid_area='header3'),style=ButtonStyle(button_color='white', font_weight= 'bold',text_color='black'),disabled = False)\n", "method = ToggleButtons(options=[('SSB','direct'), ('Reconstruction ','iterative')], description='', icons = ['','refresh'], tooltips=['Single side band ptychography', 'Iterative reconstruction methods (PIE, ML, DM)'],\n", " layout=Layout(width='auto', grid_area='methods'), style = {'description_width': descr, 'button_width': '48.5%', 'font_weight': 'bold'}, button_style='',disabled=False,)\n", - "graph_size = IntSlider(value=100,min=50,max=150,step=5, description='Graphs size', layout=Layout(width='auto', grid_area='gr_size'), style = {'description_width': descr,'button_width': butt}, button_style='',disabled=False,)\n", - "ctf_xaxis = RadioButtons(options=['α','mrad', 'A'], description='x-axis:', layout=Layout(width='auto', grid_area='ctxaxis'), style = {'description_width': descr,'button_width': butt}, disabled=False)\n", + "\n", + "ctf_xaxis = RadioButtons(options=['α','mrad', 'A'], description='CTF graph x-axis:', layout=Layout(width='auto', grid_area='ctxaxis'), style = {'description_width': descr,'button_width': butt}, disabled=False)\n", "\n", "cl_check_laa = Checkbox(value=True, description='Low anlge approximation', indent=False, layout=Layout(width='auto', grid_area='check1'), disabled=False,) # Low angle approximation check - scattering angle < 10 deg\n", "cl_check_pix = Checkbox(value=True, description='Ptycho pixel < step size',indent=False, layout=Layout(width='auto', grid_area='check2'), disabled=False,) # Reconstructed pixel size < scanning step size \n", @@ -392,23 +415,36 @@ "cl_check_1bf = Checkbox(value=True, description='Detector cover < 1α', indent=False, layout=Layout(width='auto', grid_area='check4'), disabled=False,) # Detector cover is lower than 1 α\n", "cl_check_nbf = Checkbox(value=True, description='Detector cover > 6α', indent=False, layout=Layout(width='auto', grid_area='check5'), disabled=False,) # Detector cover is higher than 6 α\n", "\n", + "\n", + "\n", + "\n", + "small_controls1 = GridBox(children=[header3, method, ctf_xaxis, cl_check_laa,cl_check_pix,cl_check_def, cl_check_1bf, cl_check_nbf],\n", + " layout=Layout(width='100%',\n", + " grid_template_rows='auto auto auto auto',\n", + " grid_template_columns='2.5% 25% 2.5% 10% 20% 20% 20%',\n", + " grid_template_areas='''\n", + " \". methods . ctxaxis header3 header3 header3 \"\n", + " \". . . ctxaxis check1 check2 check3\"\n", + " \". . . ctxaxis check4 check5 . \"\n", + " '''))\n", + "header1 = Button(description='Graph selection',layout=Layout(width='auto', grid_area='header1'),style=ButtonStyle(button_color='white', font_weight= 'bold',text_color='black'), disabled = False)\n", "chart = ToggleButtons(options=[('Scheme ','micr'), ('Charts ','dedic'),('Both ','both')],value = 'both',icons = ['eye','eye','eye'], description='',\n", " layout=Layout(width='auto', grid_area='charts'), style = {'description_width': descr,'button_width': '32%', 'font_weight': 'bold'}, button_style='',disabled=False,)\n", - "footer = Button(description='Interactive results',layout=Layout(width='auto', grid_area='footer'),style=ButtonStyle(button_color='lightgray', font_weight= 'bold',text_color='black'),disabled = False)\n", "\n", - "small_controls = GridBox(children=[header1,header2,header3, method, chart, graph_size, ctf_xaxis, cl_check_laa,cl_check_pix,cl_check_def, cl_check_1bf, cl_check_nbf, footer],\n", + "name1 = Button(description='Graphs size (%)',layout=Layout(width='auto', grid_area='name1'),style=ButtonStyle(button_color='white', font_weight= 'bold',text_color='black'), disabled = False)\n", + "\n", + "graph_size = IntSlider(value=100,min=50,max=150,step=5, description='', layout=Layout(width='auto', grid_area='gr_size'), style = {'description_width': descr,'button_width': butt}, button_style='primary',disabled=False,)\n", + "\n", + "\n", + "\n", + "small_controls2 = GridBox(children=[header1, chart, name1, graph_size],\n", " layout=Layout(width='100%',\n", - " grid_template_rows='auto auto auto auto auto',\n", - " grid_template_columns='2% 38% 10% 25% 25%',\n", + " grid_template_rows='auto auto auto auto',\n", + " grid_template_columns='15% 30% 15% 30%',\n", " grid_template_areas='''\n", - " \". header1 header2 header3 header3 \"\n", - " \". methods ctxaxis check1 check4\"\n", - " \". charts ctxaxis check2 check5\"\n", - " \". gr_size ctxaxis check3 .\"\n", - " \". footer footer footer footer\"\n", + " \"header1 charts name1 gr_size \"\n", " '''))\n", "\n", - "\n", "def ptycho_interact(beam, aperture, aperture_res, aperture_res2, probe, cl, matrix, defocus, mag, camera, binning, dwell_time, restriction, method, ctf_xaxis, cl_check_laa, cl_check_pix, cl_check_def, cl_check_1bf, cl_check_nbf, graph_size, chart):\n", " \n", " ### SINGLE SETTING PARAMETERS ###\n", @@ -664,7 +700,7 @@ " left_column = VBox([go.FigureWidget(fig8)])\n", " total = HBox([left_column, right_column])\n", " \n", - " total.layout = Layout(border='solid 0px gray',margin='10px 10px 10px 40px', padding='10px 10px 10px 10px') \n", + " total.layout = Layout(border='solid 0px gray',margin='0px 0px 0px 20px', padding='0px 0px 0px 0px') \n", " display(total)\n", "\n", " \n", @@ -794,7 +830,7 @@ " left_column = go.FigureWidget(fig8)\n", " total = HBox([left_column, right_column]) \n", " \n", - " total.layout = Layout(border='solid 0px gray',margin='10px 10px 10px 40px', padding='10px 10px 10px 10px') \n", + " total.layout = Layout(border='solid 0px gray',margin='0px 0px 0px 10px', padding='0px 0px 0px 10px') \n", " display(total)\n", "\n", " \n", @@ -835,14 +871,14 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 214, "id": "7937f054-fcd0-4e67-a20f-7696f5903a94", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "0a48e2bb85fd41a5931e183508ad4aa4", + "model_id": "59e5c62c96044e0c8cc325a6e1686415", "version_major": 2, "version_minor": 0 }, @@ -855,7 +891,7 @@ } ], "source": [ - "display(HBox([controls, VBox([small_controls, gui])]))" + "display(HBox([controls, VBox([small_controls1, gui, small_controls2])]))" ] } ], diff --git a/calibrations.xlsx b/calibrations.xlsx index 60ed35e8d07cece7c5bb446b2976b12ac919f2ae..34848f8304620f892c4e766e72c176792d4a5d4b 100644 GIT binary patch delta 11953 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 CsFr*H delta 12100 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

ol&9~ux9w1cg_sUC~1T{vf6ch z(q>A^4&J%!B?j=J7>F74q1bH`19IZljR4A~9FBgtP*q{D#joi}Hkz2-t+pf)<1cLj z-?KHzra740Vo8%am5Xw<#sTSo#j9aA;vs#aPMTw zk#XhV;Is8cLKpCVySKh7Wc(JxtWs(q5oqwu#$;t>Q^~rF@8rE5S})SKKnA9?*T&fy zu0mZutI6c;XpYrPmZoJjc47gmC|*n7Cirwrmrry8gT;B@VZ(eVbGhSdpo=lS?m?%& zEfNoM!S7R#Zf`}8t_9F92K$*p?dy)+V%}J}dSD}7PegY7pdPS)HdbC zEm_2a)!I(C9ENhQW7569%U)ayb)j+<#%`k1nQkgry_SV)cLKaC-Nz&k?bFwOz*4Zj znfcD>wA;1e6F3+`Yb$T{R&v%NsfRX-fnxbwY`ZzT5XBq)l;X8Yr@&!2#8&nz%`bSh z?VCN<1k=B0-SqZ?{nrg|$XkC6=pIO|KO5=a_eY_i2wx6L|9#1As~Lw|IquLi;XqFG)Jc+DB#>E>poI}I2Z=(jLOuo2AT0X*DfmC@x(Pf0 diff --git a/ptychoScopy.ipynb b/ptychoScopy.ipynb index 1b4f582..f46d062 100644 --- a/ptychoScopy.ipynb +++ b/ptychoScopy.ipynb @@ -28,7 +28,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 137, "id": "7425242d-3c91-4c1e-a424-08625a38ee7a", "metadata": {}, "outputs": [], @@ -277,7 +277,7 @@ " return beam_res.value\n", " \n", " def show_probe_angle(self,caller):\n", - " aperture_res.value = f'Probe semi-angle (mrad) {\"{:.1f}\".format(pty.get_angle(caller.new))}' \n", + " aperture_res.value = f'Semi-angle (mrad) {\"{:.1f}\".format(pty.get_angle(caller.new))}' \n", " return aperture_res.value\n", " \n", " def show_corrprobe_angle(self,caller):\n", @@ -301,7 +301,23 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, + "id": "66e552e4-5954-4f3f-a59f-66c5affb69b6", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "125969b5-b128-4869-ae27-4aa7d8949d48", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 213, "id": "8055b802-cf83-4250-aea9-54e3e6b73db0", "metadata": {}, "outputs": [ @@ -315,34 +331,42 @@ ], "source": [ "### CONTROLS ##########################################\n", - "ali = dict(style = {'description_width': '80px','button_width': '55px', 'font_weight': 'bold'}, button_style='',disabled = False)\n", + "ali = dict(style = {'description_width': '110px','button_width': '55px', 'font_weight': 'bold'}, button_style='',disabled = False)\n", "ali2 = dict(style = {'description_width': '60px','button_width': '90px', 'font_weight': 'bold'}, button_style='',disabled = False)\n", - "\n", + "ali3 = dict(style = {'description_width': '110px','button_width': '45px', 'font_weight': 'bold'}, button_style='',disabled = False)\n", "# header = Button(description='Control panel',layout=Layout(width='auto', grid_area='header'), style=ButtonStyle(button_color='navy', font_weight= 'bold',font_size= '20px',font_variant='small-caps',text_color='white'),disabled = False)\n", "\n", - "beam_set = Button(description='Electron beam settings',layout=Layout(width='auto', grid_area='beam_set'), style=ButtonStyle(button_color='navy', font_weight= 'bold',font_size= '16px',font_variant='small-caps',text_color='white'),disabled = False) \n", - "beam = ToggleButtons(options=opt.energies(), value=200,description='Beam energy (keV)', layout=Layout(width='auto', grid_area='beam_set1'), **ali )\n", - "aperture = ToggleButtons(options=opt.apertures(), value='30um', description='Aperture', layout=Layout(width='auto', grid_area='beam_set2'), **ali)\n", - "probe = ToggleButtons(options=opt.probes(), value='8C', description='Probe', layout=Layout(width='auto', grid_area='beam_set3'), **ali)\n", - "defocus = IntSlider(description='Defocus (nm)', value=0, min=0, max=1000, step=1, continuous_update=False, layout=Layout(width='auto', grid_area='beam_set4'), **ali)\n", + "beam_set = Button(description='Electron beam settings',layout=Layout(width='95%', grid_area='beam_set'), style=ButtonStyle(button_color='#0d48a1', font_weight= 'bold',font_size= '16px',font_variant='small-caps',text_color='white'),disabled = False) \n", + "beam = Dropdown(options=opt.energies(), value=200,description='Beam energy (keV)', layout=Layout(width='95%', grid_area='beam_set1'), **ali )\n", + "aperture_name = Label(value = 'Aperture',layout=Layout(width='95%', grid_area='aperture_name'),)\n", + "if len(opt.apertures())>5:\n", + " aperture = Dropdown(options=opt.apertures(), description='', layout=Layout(width='95%', grid_area='beam_set2'), **ali)\n", + "else:\n", + " aperture = ToggleButtons(options=opt.apertures(), description='', layout=Layout(width='95%', grid_area='beam_set2'), **ali3)\n", "\n", - "scanning_set = Button(description='Scanning parameters',layout=Layout(width='auto', grid_area='scanning_set'),style=ButtonStyle(button_color='navy', font_weight= 'bold',font_size= '16px',font_variant='small-caps',text_color='white'),disabled = False)\n", - "mag = ToggleButtons(options=opt.magnifications(),value=3,description='Magnification Mx', layout=Layout(width='auto', grid_area='scanning_set1'), **ali)\n", - "matrix = ToggleButtons(options=opt.mappings(), value=2048, description='Matrix', layout=Layout(width='auto', grid_area='scanning_set2'), **ali)\n", - "dwell_time = ToggleButtons(options=opt.dwelltimes(), value=10, description='Dwell time (μs)', layout=Layout(width='auto', grid_area='scanning_set3'), **ali)\n", + "probe = Dropdown(options=opt.probes(), value='8C', description='Probe', layout=Layout(width='95%', grid_area='beam_set3'), **ali)\n", + "defocus = IntSlider(description='Defocus (nm)', value=0, min=0, max=1000, step=1, continuous_update=False, layout=Layout(width='95%', grid_area='beam_set4'), **ali)\n", + "\n", + "scanning_set = Button(description='Scanning parameters',layout=Layout(width='95%', grid_area='scanning_set'),style=ButtonStyle(button_color='#0d48a1', font_weight= 'bold',font_size= '16px',font_variant='small-caps',text_color='white'),disabled = False)\n", + "mag = Dropdown(options=opt.magnifications(),value=3,description='Magnification Mx', layout=Layout(width='95%', grid_area='scanning_set1'), **ali)\n", + "matrix = Dropdown(options=opt.mappings(), value=2048, description='Matrix', layout=Layout(width='95%', grid_area='scanning_set2'), **ali)\n", + "dwell_time = Dropdown(options=opt.dwelltimes(), value=10, description='Dwell time (μs)', layout=Layout(width='95%', grid_area='scanning_set3'), **ali)\n", "print(len(opt.detectors()))\n", "\n", "\n", "\n", - "camera_set = Button(description='Detection',layout=Layout(width='auto', grid_area='camera_set'),style=ButtonStyle(button_color='navy', font_weight= 'bold',font_size= '16px',font_variant='small-caps',text_color='white'),disabled = False)\n", - "cl = ToggleButtons(options=opt.cameralengths(), value=12, description='Nominal camera length (cm)', layout=Layout(width='auto', grid_area='cl_set1'), **ali)\n", - "camera = ToggleButtons(options=opt.detectors(), description='Detector', layout=Layout(width='auto', grid_area='camera_set1'), style = {'description_width': '60px','button_width': str(100/len(opt.detectors())-len(opt.detectors()))+'%', 'font_weight': 'bold'})\n", - "restriction = ToggleButtons(options=[('.',False), ('..',True)], value = False, description='PAAR',icons = ['times','check'], layout=Layout(width='auto', grid_area='camera_set2'),style = {'description_width': '80px','button_width': '48%', 'font_weight': 'bold'})\n", - "binning = ToggleButtons(options=[('.',1), ('2×2',2), ('4×4',4), ('3×3',3), ('6×6',6), ('8×8',8), ('12×12',12), ('16×16',16), ('24×24',24), ('32×32',32), ('48×48',48)], value=1, description='Binning', icons = ['times','',''], layout=Layout(width='auto', grid_area='camera_set3'), **ali)\n", + "camera_set = Button(description='Detection',layout=Layout(width='95%', grid_area='camera_set'),style=ButtonStyle(button_color='#0d48a1', font_weight= 'bold',font_size= '16px',font_variant='small-caps',text_color='white'),disabled = False)\n", + "cl = Dropdown(options=opt.cameralengths(), value=12, description='Nominal CL (cm)', layout=Layout(width='95%', grid_area='cl_set1'), **ali3)\n", + "camera_name = Label(value = 'Detector',layout=Layout(width='95%', grid_area='camera_name'),)\n", + "camera = ToggleButtons(options=opt.detectors(), description='', layout=Layout(width='95%', grid_area='camera_set1'), style = {'description_width': '60px','button_width': str(100/len(opt.detectors())-len(opt.detectors()))+'%', 'font_weight': 'bold'}, button_style='')\n", + "restriction_name = Label(value = 'PAAR',layout=Layout(width='95%', grid_area='restriction_name'),)\n", + "restriction = ToggleButtons(options=[('.',False), ('..',True)], value = False, description='',icons = ['times','check'], layout=Layout(width='95%', grid_area='camera_set2'),style = {'description_width': '80px','button_width': '48%', 'font_weight': 'bold'}, button_style='')\n", + "binning_name = Label(value = 'Binning',layout=Layout(width='95%', grid_area='binning_name'),)\n", + "binning = ToggleButtons(options=[('.',1), ('2',2), ('4',4), ('8',8), ('16',16)], value=1, description='', icons = ['times','',''], layout=Layout(width='auto', grid_area='camera_set3'), **ali3)\n", "\n", "beam_res = Label(value = f'λ (pm) '+ str(\"{:.1f}\".format(pty.get_wavelength(beam.value)*1e12)),layout=Layout(width='auto', grid_area='sidebar1'),)\n", "beam.observe(inte.show_wavelength, names='value') \n", - "aperture_res = Label(value = f'Probe semi-angle (mrad) '+ str(\"{:.1f}\".format(pty.get_angle(aperture.value))), layout=Layout(width='auto', grid_area='sidebar2'),)\n", + "aperture_res = Label(value = f'Semi-angle (mrad) '+ str(\"{:.1f}\".format(pty.get_angle(aperture.value))), layout=Layout(width='auto', grid_area='sidebar2'),)\n", "aperture.observe(inte.show_probe_angle, names='value') \n", "aperture_res2 = Label(value = f'corr. '+ str(\"{:.2f}\".format(pty.get_angle_corr(aperture.value))),layout=Layout(width='auto', grid_area='sidebar5'),)\n", "aperture.observe(inte.show_corrprobe_angle, names='value') \n", @@ -353,38 +377,37 @@ "\n", "footer = Button(description='',layout=Layout(width='auto', grid_area='footer'),style=ButtonStyle(button_color='navy', font_weight= 'bold',font_size= '16px',font_variant='small-caps',text_color='white'))\n", "\n", - "controls = GridBox(children=[beam_set, beam, aperture, probe, defocus, scanning_set, mag,matrix,dwell_time, cl,camera_set, camera, restriction, binning, beam_res, aperture_res,aperture_res2,fov_res, dwell_time_res,footer],\n", - " layout=Layout(width='15%', grid_template_rows='auto auto auto', grid_template_columns='30% 30% 20% 20%', grid_template_areas='''\n", + "\n", + "\n", + "controls = GridBox(children=[beam_set, beam,aperture_name, aperture, probe, defocus, scanning_set, mag,matrix,dwell_time, cl,camera_set, camera,camera_name, restriction_name, restriction, binning_name, binning, beam_res, aperture_res,aperture_res2,fov_res, dwell_time_res],\n", + " layout=Layout(width='325px', grid_template_rows='35px 35px 35px 35px 30px 30px 35px 35px 35px 35px 35px 35px 35px 35px 35px 35px', grid_template_columns='20% 40% 15% 25%', grid_template_areas='''\n", " \"beam_set beam_set beam_set beam_set \" \n", " \"beam_set1 beam_set1 beam_set1 beam_set1 \"\n", - " \"beam_set2 beam_set2 beam_set2 beam_set2 \"\n", - " \"sidebar2 sidebar2 sidebar5 sidebar5 \"\n", " \"beam_set3 beam_set3 beam_set3 beam_set3 \"\n", " \"beam_set4 beam_set4 beam_set4 beam_set4 \"\n", + " \"aperture_name beam_set2 beam_set2 beam_set2 \"\n", + " \". sidebar2 sidebar2 sidebar5 \"\n", " \"scanning_set scanning_set scanning_set scanning_set \" \n", " \"scanning_set1 scanning_set1 scanning_set1 scanning_set1 \"\n", " \"scanning_set2 scanning_set2 scanning_set2 scanning_set2 \"\n", " \"scanning_set3 scanning_set3 scanning_set3 scanning_set3 \"\n", " \"camera_set camera_set camera_set camera_set \"\n", " \"cl_set1 cl_set1 cl_set1 cl_set1 \"\n", - " \"camera_set1 camera_set1 camera_set1 camera_set1 \"\n", - " \"camera_set3 camera_set3 camera_set3 camera_set3 \"\n", - " \"camera_set2 camera_set2 camera_set2 camera_set2 \"\n", - " \"footer footer footer footer \"\n", + " \"camera_name camera_set1 camera_set1 camera_set1 \"\n", + " \"restriction_name camera_set2 camera_set2 camera_set2 \"\n", + " \"binning_name camera_set3 camera_set3 camera_set3 \"\n", " '''))\n", "\n", "# SMALL CONTROLS\n", - "descr = '100px'\n", + "descr = '75px'\n", "butt = '100px'\n", "butt2 = '150px'\n", "\n", - "header1 = Button(description='Graph selection',layout=Layout(width='auto', grid_area='header1'),style=ButtonStyle(button_color='lightgray', font_weight= 'bold',text_color='black'), disabled = False)\n", - "header2 = Button(description='CTF graph',layout=Layout(width='auto', grid_area='header2'),style=ButtonStyle(button_color='lightgray', font_weight= 'bold',text_color='black'),disabled = False)\n", - "header3 = Button(description='CL limitations',layout=Layout(width='auto', grid_area='header3'),style=ButtonStyle(button_color='lightgray', font_weight= 'bold',text_color='black'),disabled = False)\n", + "header3 = Button(description='CL limitations',layout=Layout(width='auto', grid_area='header3'),style=ButtonStyle(button_color='white', font_weight= 'bold',text_color='black'),disabled = False)\n", "method = ToggleButtons(options=[('SSB','direct'), ('Reconstruction ','iterative')], description='', icons = ['','refresh'], tooltips=['Single side band ptychography', 'Iterative reconstruction methods (PIE, ML, DM)'],\n", " layout=Layout(width='auto', grid_area='methods'), style = {'description_width': descr, 'button_width': '48.5%', 'font_weight': 'bold'}, button_style='',disabled=False,)\n", - "graph_size = IntSlider(value=100,min=50,max=150,step=5, description='Graphs size', layout=Layout(width='auto', grid_area='gr_size'), style = {'description_width': descr,'button_width': butt}, button_style='',disabled=False,)\n", - "ctf_xaxis = RadioButtons(options=['α','mrad', 'A'], description='x-axis:', layout=Layout(width='auto', grid_area='ctxaxis'), style = {'description_width': descr,'button_width': butt}, disabled=False)\n", + "\n", + "ctf_xaxis = RadioButtons(options=['α','mrad', 'A'], description='CTF graph x-axis:', layout=Layout(width='auto', grid_area='ctxaxis'), style = {'description_width': descr,'button_width': butt}, disabled=False)\n", "\n", "cl_check_laa = Checkbox(value=True, description='Low anlge approximation', indent=False, layout=Layout(width='auto', grid_area='check1'), disabled=False,) # Low angle approximation check - scattering angle < 10 deg\n", "cl_check_pix = Checkbox(value=True, description='Ptycho pixel < step size',indent=False, layout=Layout(width='auto', grid_area='check2'), disabled=False,) # Reconstructed pixel size < scanning step size \n", @@ -392,23 +415,36 @@ "cl_check_1bf = Checkbox(value=True, description='Detector cover < 1α', indent=False, layout=Layout(width='auto', grid_area='check4'), disabled=False,) # Detector cover is lower than 1 α\n", "cl_check_nbf = Checkbox(value=True, description='Detector cover > 6α', indent=False, layout=Layout(width='auto', grid_area='check5'), disabled=False,) # Detector cover is higher than 6 α\n", "\n", + "\n", + "\n", + "\n", + "small_controls1 = GridBox(children=[header3, method, ctf_xaxis, cl_check_laa,cl_check_pix,cl_check_def, cl_check_1bf, cl_check_nbf],\n", + " layout=Layout(width='100%',\n", + " grid_template_rows='auto auto auto auto',\n", + " grid_template_columns='2.5% 25% 2.5% 10% 20% 20% 20%',\n", + " grid_template_areas='''\n", + " \". methods . ctxaxis header3 header3 header3 \"\n", + " \". . . ctxaxis check1 check2 check3\"\n", + " \". . . ctxaxis check4 check5 . \"\n", + " '''))\n", + "header1 = Button(description='Graph selection',layout=Layout(width='auto', grid_area='header1'),style=ButtonStyle(button_color='white', font_weight= 'bold',text_color='black'), disabled = False)\n", "chart = ToggleButtons(options=[('Scheme ','micr'), ('Charts ','dedic'),('Both ','both')],value = 'both',icons = ['eye','eye','eye'], description='',\n", " layout=Layout(width='auto', grid_area='charts'), style = {'description_width': descr,'button_width': '32%', 'font_weight': 'bold'}, button_style='',disabled=False,)\n", - "footer = Button(description='Interactive results',layout=Layout(width='auto', grid_area='footer'),style=ButtonStyle(button_color='lightgray', font_weight= 'bold',text_color='black'),disabled = False)\n", "\n", - "small_controls = GridBox(children=[header1,header2,header3, method, chart, graph_size, ctf_xaxis, cl_check_laa,cl_check_pix,cl_check_def, cl_check_1bf, cl_check_nbf, footer],\n", + "name1 = Button(description='Graphs size (%)',layout=Layout(width='auto', grid_area='name1'),style=ButtonStyle(button_color='white', font_weight= 'bold',text_color='black'), disabled = False)\n", + "\n", + "graph_size = IntSlider(value=100,min=50,max=150,step=5, description='', layout=Layout(width='auto', grid_area='gr_size'), style = {'description_width': descr,'button_width': butt}, button_style='primary',disabled=False,)\n", + "\n", + "\n", + "\n", + "small_controls2 = GridBox(children=[header1, chart, name1, graph_size],\n", " layout=Layout(width='100%',\n", - " grid_template_rows='auto auto auto auto auto',\n", - " grid_template_columns='2% 38% 10% 25% 25%',\n", + " grid_template_rows='auto auto auto auto',\n", + " grid_template_columns='15% 30% 15% 30%',\n", " grid_template_areas='''\n", - " \". header1 header2 header3 header3 \"\n", - " \". methods ctxaxis check1 check4\"\n", - " \". charts ctxaxis check2 check5\"\n", - " \". gr_size ctxaxis check3 .\"\n", - " \". footer footer footer footer\"\n", + " \"header1 charts name1 gr_size \"\n", " '''))\n", "\n", - "\n", "def ptycho_interact(beam, aperture, aperture_res, aperture_res2, probe, cl, matrix, defocus, mag, camera, binning, dwell_time, restriction, method, ctf_xaxis, cl_check_laa, cl_check_pix, cl_check_def, cl_check_1bf, cl_check_nbf, graph_size, chart):\n", " \n", " ### SINGLE SETTING PARAMETERS ###\n", @@ -664,7 +700,7 @@ " left_column = VBox([go.FigureWidget(fig8)])\n", " total = HBox([left_column, right_column])\n", " \n", - " total.layout = Layout(border='solid 0px gray',margin='10px 10px 10px 40px', padding='10px 10px 10px 10px') \n", + " total.layout = Layout(border='solid 0px gray',margin='0px 0px 0px 20px', padding='0px 0px 0px 0px') \n", " display(total)\n", "\n", " \n", @@ -794,7 +830,7 @@ " left_column = go.FigureWidget(fig8)\n", " total = HBox([left_column, right_column]) \n", " \n", - " total.layout = Layout(border='solid 0px gray',margin='10px 10px 10px 40px', padding='10px 10px 10px 10px') \n", + " total.layout = Layout(border='solid 0px gray',margin='0px 0px 0px 10px', padding='0px 0px 0px 10px') \n", " display(total)\n", "\n", " \n", @@ -835,14 +871,14 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 214, "id": "7937f054-fcd0-4e67-a20f-7696f5903a94", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "0a48e2bb85fd41a5931e183508ad4aa4", + "model_id": "59e5c62c96044e0c8cc325a6e1686415", "version_major": 2, "version_minor": 0 }, @@ -855,7 +891,7 @@ } ], "source": [ - "display(HBox([controls, VBox([small_controls, gui])]))" + "display(HBox([controls, VBox([small_controls1, gui, small_controls2])]))" ] } ],