import%20marimo%0A%0A__generated_with%20%3D%20%220.19.11%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Example%3A%20Mode%20search%20in%20an%20SXS%20waveform%0A%0A%20%20%20%20In%20this%20example%20we%20will%20be%20using%20the%20procedure%20listed%20out%20in%20the%20methods%20paper%20to%20search%20for%20QNMs%20within%20a%20waveform.%0A%20%20%20%20The%20two-stage%20procedure%20starts%20by%20identifing%20potential%20modes%20via%20a%20frequency-agnostic%20fits%2C%20then%20checks%20their%20stability%20with%20frequency-fixed%20fits.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Import%20modules%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20jaxqualin.selection%20import%20ModeSearchAllFreeVaryingNSXS%0A%20%20%20%20from%20jaxqualin.utils%20import%20load_pickle_file%0A%20%20%20%20from%20jaxqualin.plot%20import%20plot_mode_searcher_results%0A%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20ModeSearchAllFreeVaryingNSXS%2C%0A%20%20%20%20%20%20%20%20load_pickle_file%2C%0A%20%20%20%20%20%20%20%20np%2C%0A%20%20%20%20%20%20%20%20plot_mode_searcher_results%2C%0A%20%20%20%20%20%20%20%20plt%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Settings%20for%20mode-searcher%20object%0A%0A%20%20%20%20These%20are%20the%20default%20settings%20used%20in%20the%20methods%20paper%20(cf.%20Table%20I).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20settings%20%3D%20dict(alpha_r%20%3D%200.05%2C%20alpha_i%20%3D%200.05%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tau_agnostic%20%3D%2010%2C%20p_agnostic%20%3D%200.95%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20beta_A%20%3D%201.0%2C%20beta_phi%20%3D%201.5%2C%20A_tol%20%3D%201e-3%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tau_stable%20%3D%2010%2C%20p_stable%20%3D%200.95)%0A%20%20%20%20return%20(settings%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Prepare%20mode-searcher%20object%0A%0A%20%20%20%20%60N_list%60%20is%20a%20list%20of%20%24N_f%24%20free%20QNMs%20to%20include%20in%20the%20frequency%20agnostic%20fit.%0A%20%20%20%20A%20frequency%20agnoistic%20fit%20will%20be%20performed%20for%20each%20%24N_f%24%20in%20%60N_list%60%2C%20and%20a%20list%20of%20potential%20modes%20will%20be%20compiled%20from%20the%20best%20run%20among%20them.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ModeSearchAllFreeVaryingNSXS%2C%20np%2C%20settings)%3A%0A%20%20%20%20mode_searcher_load_pickle%20%3D%20False%20%23%20whether%20or%20not%20to%20load%20the%20mode-searcher%20from%20a%20cached%20run%0A%0A%20%20%20%20SXS_num%20%3D%20'0305'%0A%20%20%20%20l%2C%20m%20%3D%202%2C%202%0A%20%20%20%20N_list%20%3D%20%5B3%2C%204%5D%0A%20%20%20%20t0_arr%20%3D%20np.linspace(0%2C%2050%2C%20501)%0A%0A%20%20%20%20%23%20mode-searcher%20object%0A%20%20%20%20mode_search_sxs%20%3D%20ModeSearchAllFreeVaryingNSXS(SXS_num%2C%20l%2C%20m%2C%20N_list%20%3D%20N_list%2C%20initial_num%20%3D%2010%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20random_initial%20%3D%20True%2C%20load_pickle%20%3D%20False%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20t0_arr%20%3D%20t0_arr%2C%20postfix_string%20%3D%20'example'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20**settings)%0A%20%20%20%20return%20mode_search_sxs%2C%20mode_searcher_load_pickle%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Run%20mode-searcher%0A%0A%20%20%20%20If%20%60mode_searcher_load_pickle%60%20is%20%60True%60%20and%20a%20pickle%20file%20from%20a%20previous%20run%20with%20the%20same%20%60postfix_string%60%20exists%2C%20the%20mode-searcher%20object%20will%20load%20the%20results%20from%20it.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(load_pickle_file%2C%20mo%2C%20mode_search_sxs%2C%20mode_searcher_load_pickle)%3A%0A%20%20%20%20if%20mode_search_sxs.pickle_exists()%20and%20mode_searcher_load_pickle%3A%0A%20%20%20%20%20%20%20%20_file_path%20%3D%20mode_search_sxs.file_path%0A%20%20%20%20%20%20%20%20mode_search_sxs_result%20%3D%20load_pickle_file(_file_path)%0A%20%20%20%20%20%20%20%20_status_msg%20%3D%20%22Loaded%20mode%20search%20results%20from%20pickle.%22%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20with%20mo.status.spinner(%22Running%20mode%20search...%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20mode_search_sxs.do_mode_search_varying_N()%0A%20%20%20%20%20%20%20%20mode_search_sxs_result%20%3D%20mode_search_sxs%0A%20%20%20%20%20%20%20%20_status_msg%20%3D%20%22Mode%20search%20complete.%22%0A%20%20%20%20mo.md(f%22**%7B_status_msg%7D**%22)%0A%20%20%20%20return%20(mode_search_sxs_result%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Plotting%20the%20results%0A%0A%20%20%20%20The%20left%20panel%20shows%20the%20result%20of%20the%20best%20instance%20of%20the%20frequency-agnostic%20fits%20among%20%60N_list%60.%0A%20%20%20%20The%20center%20and%20right%20panels%20are%20the%20amplitudes%20and%20phases%20obtained%20for%20all%20the%20modes%20within%20the%20potential%20mode%20list%20that%20passed%20the%20stability%20test.%0A%20%20%20%20The%20bolded%20line%20segments%20are%20the%20regions%20where%20the%20amplitude%20and%20phase%20are%20the%20flattest%2C%20and%20the%20circle%20marks%20the%20time%20at%20which%20the%20mode%20has%20begun%20to%20stabilize.%0A%20%20%20%20Please%20consult%20the%20methods%20paper%20for%20the%20details.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mode_search_sxs_result%2C%20plot_mode_searcher_results%2C%20plt)%3A%0A%20%20%20%20plot_mode_searcher_results(mode_search_sxs_result.mode_searcher_vary_N)%0A%20%20%20%20plt.gcf()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Summary%20of%20per-mode%20results%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20mode_search_sxs_result%2C%20np)%3A%0A%20%20%20%20_summary%20%3D%20mode_search_sxs_result.summarize_final_modes()%0A%20%20%20%20_lines%20%3D%20%5Bf%22Final%20modes%20present%3A%20%7B'%2C%20'.join(_summary.keys())%7D%22%2C%20%22%22%5D%0A%20%20%20%20for%20_mode_string_ms%2C%20_info%20in%20_summary.items()%3A%0A%20%20%20%20%20%20%20%20_earliest%20%3D%20_info%5B%22earliest_flat_start_time%22%5D%0A%20%20%20%20%20%20%20%20if%20np.isnan(_earliest)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_earliest_txt%20%3D%20%22nan%20(no%20qualifying%20window)%22%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_earliest_txt%20%3D%20f%22%7B_earliest%3A.2f%7D%22%0A%20%20%20%20%20%20%20%20_lines.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22-%20%60%7B_mode_string_ms%7D%60%3A%20flattest%20window%20%5B%7B_info%5B'flattest_start_time'%5D%3A.2f%7D%2C%20%7B_info%5B'flattest_end_time'%5D%3A.2f%7D%5D%20M%2C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22A%3D%7B_info%5B'flattest_amplitude_median'%5D%3A.4g%7D%20(%2B%7B_info%5B'flattest_amplitude_plus'%5D%3A.3g%7D%2F-%7B_info%5B'flattest_amplitude_minus'%5D%3A.3g%7D)%2C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22phi%3D%7B_info%5B'flattest_phase_median'%5D%3A.4g%7D%20(%2B%7B_info%5B'flattest_phase_plus'%5D%3A.3g%7D%2F-%7B_info%5B'flattest_phase_minus'%5D%3A.3g%7D)%2C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22earliest%20flat%20start%3D%7B_earliest_txt%7D%20M%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20mo.md(%22%5Cn%22.join(_lines))%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
d2cb5f3c49abf0b49e3cea66bffe0cff