def abundance_window(abundance_dict, ab_type): """Create window to view and adjust element abundances. Args: abundance_dict (dict): dictionary with default/current element abundances ab_type (str): type of abundance window, "ejecta" or "ISM" """ if ab_window_open[ab_type]: # Give focus to existing window rather than opening a second window ab_window_open[ab_type].root.focus() else: window = gui.ScrollWindow() ab_window_open[ab_type] = window window.root.focus() window.root.geometry("%dx%d+%d+%d" %(200, 290, APP.root.winfo_x(), APP.root.winfo_y())) frame = window.container gui.SectionTitle(frame, "Element", size=10) if window.os == "Linux": title = "log(X/H)+12" else: title = "log(X/H)\u200a+\a200a12" gui.SectionTitle(gui.LayoutFrame(frame, column=1, row=0), title, size=10) for element in ELEMENT_ORDER: entry = gui.InputEntry(frame, element, ELEMENT_NAMES[element], "{0:.2f}".format(abundance_dict[element]), condition=lambda value: 0 < value < 100, padding=(0, 0, 5, 0)) entry.input.bind( "<Key>", lambda *args: gui.InputParam.instances[str(window.root)]["ab_type"].value_var.set("Custom")) button_frame = gui.LayoutFrame(frame, columnspan=2, padding=(0, 10)) if ab_type == "ISM": types = ("LMC", "Solar") default_type = ism_ab_type #gui.InputDropdown(gui.LayoutFrame(button_frame, row=0, column=0, padding=(2, 1, 2, 0)), "ab_type", None, # ism_ab_type, lambda: reset_ab(str(window.root)), ("LMC", "Solar"), width=7) else: types = ("CC", "Type Ia") default_type = ej_ab_type #gui.SubmitButton(gui.LayoutFrame(button_frame, row=0, column=0), "Reset", # lambda: reset_ab(str(window.root), ab_type)) gui.InputDropdown(gui.LayoutFrame(button_frame, row=0, column=0, padding=(2, 1, 2, 0)), "ab_type", None, default_type, lambda: reset_ab(str(window.root)), types, width=7) gui.SubmitButton(gui.LayoutFrame(button_frame, row=0, column=1), "Submit", lambda: ab_window_close(window.root, abundance_dict, ab_type)) window.root.bind("<1>", lambda event: event.widget.focus_set()) window.root.bind("<Return>", lambda event: ab_window_close(window.root, abundance_dict, ab_type, event)) window.root.protocol("WM_DELETE_WINDOW", lambda: ab_window_close(window.root, abundance_dict, ab_type)) window.root.update() window.canvas.config(scrollregion=(0, 0, window.container.winfo_reqwidth(), window.container.winfo_reqheight()))
def emissivity_window(): """Create window to display emissivity data for an SNR with input parameters from the main window.""" window = gui.ScrollWindow() window.root.focus() if window.os == "Linux": window.root.config(cursor="watch") else: window.root.config(cursor="wait") window.root.geometry("%dx%d+%d+%d" %(880, 650, (ws-880)/2, (hs-700)/2)) window.root.update() window.canvas.grid_remove() left_frame = gui.LayoutFrame(window.container, 5) right_frame = gui.LayoutFrame(window.container, 5, column=1, row=0) root_id = str(window.root) SNR_EM = calc.SNREmissivity(SNR, root_id) gui.InputParam.instances[root_id] = {} widgets = gui.InputParam.instances[root_id] gui.SectionTitle(right_frame, "Output Plots:") energy_frame = gui.LayoutFrame(right_frame, 0, columnspan=2) gui.InputEntry(energy_frame, "energy", "Energy for specific intensity plot (keV):", 1, SNR_EM.update_specific_intensity, gt_zero) SNR_EM.plots["Inu"] = plt.OutputPlot(gui.LayoutFrame(right_frame, (0, 5)), (5, 2.6), "Normalized impact parameter", "Specific intensity/\nerg cm$^{-2}$ s$^{-1}$ Hz$^{-1}$ sr$^{-1}$") range_frame = gui.LayoutFrame(right_frame, (0, 5, 0, 0), columnspan=4) gui.InputParam(gui.LayoutFrame(range_frame), None, "Energy range (keV):", None) gui.InputEntry(gui.LayoutFrame(range_frame, row=0, column=1), "emin", "", 0.3, SNR_EM.update_luminosity_spectrum, lambda value: 0 < value < widgets["emax"].get_value(), padding=(0, 5)) #gui.Text(gui.LayoutFrame(range_frame, row=0, column=2), "to", padding=(4, 5, 0, 0)) gui.InputEntry(gui.LayoutFrame(range_frame, row=0, column=3), "emax", "to", 8, SNR_EM.update_luminosity_spectrum, lambda value: value > widgets["emin"].get_value(), padding=(5, 5)) SNR_EM.plots["Lnu"] = plt.OutputPlot(gui.LayoutFrame(right_frame), (5, 2.6), "Energy/keV", "Luminosity/\nerg s$^{-1}$ Hz$^{-1}$") gui.SectionTitle(left_frame, "SNR Properties:") gui.DisplayValue(left_frame, "Age", "yr", SNR.data["t"]) gui.DisplayValue(left_frame, "Radius", "pc", SNR.calc["r"]) gui.InputParam(left_frame, label="Model type: \u200a{}".format(get_model_name(SNR.data["model"], SNR_EM)), padding=(5, 2)) if SNR_EM.data["model"] == "chev": gui.OutputValue(left_frame, "em", "Emission measure:", "cm\u207B\u00B3", 3, padding=(5, 1, 5, 0)) em_frame = gui.LayoutFrame(left_frame, columnspan=2) gui.OutputValue(gui.LayoutFrame(em_frame, column=0, row=0), "em_f", "(Forward:", "cm\u207B\u00B3,", 3, padding=(5, 0, 0, 0), font="-size 9") gui.OutputValue(gui.LayoutFrame(em_frame, column=1, row=0), "em_r", "reverse:", "cm\u207B\u00B3)", 3, padding=(5, 0, 0, 0), font="-size 9") gui.OutputValue(left_frame, "Tem", "Emission weighted temperature:", "K", 3, padding=(5, 1, 5, 0)) Tem_frame = gui.LayoutFrame(left_frame, columnspan=2) gui.OutputValue(gui.LayoutFrame(Tem_frame, column=0, row=0), "Tem_f", "(Forward:", "K,", 3, padding=(5, 0, 0, 0), font="-size 9") gui.OutputValue(gui.LayoutFrame(Tem_frame, column=1, row=0), "Tem_r", "reverse:", "K)", 3, padding=(5, 0, 0, 0), font="-size 9") else: gui.OutputValue(left_frame, "em", "Emission measure:", "cm\u207B\u00B3", 3) gui.OutputValue(left_frame, "Tem", "Emission weighted temperature:", "K", 3) gui.SectionTitle(left_frame, "Radial Profiles:", padding=(0, 10, 0, 0)) SNR_EM.plots["temp"] = plt.OutputPlot(gui.LayoutFrame(left_frame, (0, 5, 0, 10), columnspan=5), (4.5, 2.3), "Normalized radius", "Temperature/K") SNR_EM.plots["density"] = plt.OutputPlot(gui.LayoutFrame(left_frame, 0, columnspan=5), (4.5, 2.3), "Normalized radius", "Density/g cm$^{-3}$", sharex=SNR_EM.plots["temp"].graph) if SNR_EM.data["model"] == "chev": gui.OutputValue(right_frame, "lum", "Luminosity over energy range:", "erg s\u207B\u00B9", 3, padding=(5, 5, 5, 0)) lum_frame = gui.LayoutFrame(right_frame, columnspan=2) gui.OutputValue(gui.LayoutFrame(lum_frame, column=0, row=0), "lum_f", "(Forward:", "erg s\u207B\u00B9,", 3, padding=(5, 0, 0, 0), font="-size 9") gui.OutputValue(gui.LayoutFrame(lum_frame, column=1, row=0), "lum_r", "reverse:", "erg s\u207B\u00B9)", 3, padding=(5, 0, 0, 0), font="-size 9") else: gui.OutputValue(right_frame, "lum", "Luminosity over energy range:", "erg s\u207B\u00B9", 3, padding=(5, 5)) SNR_EM.plots["Lnu"].properties = {"function": SNR_EM.luminosity_spectrum, "color": "g"} SNR_EM.plots["Inu"].properties = {"function": SNR_EM.specific_intensity, "color": "m"} SNR_EM.plots["temp"].properties = {"function": lambda x: SNR_EM.vector_temperature(x) * SNR_EM.data["T_s"], "color": "b"} SNR_EM.plots["density"].properties = {"function": lambda x: SNR_EM.vector_density(x) * 4 * SNR_EM.data["n_0"] * SNR_EM.data["mu_H"] * calc.M_H, "color": "r"} #print(timeit.timeit(SNR_EM.update_output, number=1)) #profile.runctx("SNR_EM.update_output()", None, locals()) SNR_EM.update_output() window.canvas.grid() window.root.bind("<1>", lambda event: event.widget.focus_set()) window.root.bind("<Return>", enter_pressed) window.root.update() window.root.config(cursor="") window.canvas.config(scrollregion=(0, 0, window.container.winfo_reqwidth(), window.container.winfo_reqheight()))
# Uncomment line before using pyinstaller in --onefile mode #ICON = sys._MEIPASS+"/Crab_Nebula.ico" APP.root.tk.call("wm", "iconbitmap", APP.root._w, "-default", ICON) ws = APP.root.winfo_screenwidth() hs = APP.root.winfo_screenheight() if APP.os == "Linux": width = 1000 else: width = 880 APP.root.geometry("%dx%d+%d+%d" %(width, 650, (ws-width)/2, (hs-700)/2)) APP.root.bind("<1>", lambda event: event.widget.focus_set()) APP.input = gui.LayoutFrame(APP.container, 2, row=0, column=0) gui.SectionTitle(APP.input, "Input parameters:", 2) # Note time isn't restricted to less than t_mrg - this is accounted for in snr_calc.py # If time was restricted, users could become confused due to rounding of displayed t_mrg gui.InputEntry(APP.input, "t", "Age (yr):", 100, SNR.update_output, gt_zero) gui.InputEntry(APP.input, "e_51", "Energy (x 10\u2075\u00B9 erg):", 1.0, SNR.update_output, gt_zero) gui.InputEntry(APP.input, "temp_ism", "ISM Temperature (K):", 100, SNR.update_output, gt_zero) gui.InputEntry(APP.input, "m_ej", "Ejected mass (Msun):", 1.4, SNR.update_output, gt_zero) gui.InputDropdown(APP.input, "n", "Ejecta power-law index, n:", 0, SNR.update_output, (0, 2, 4, 6, 7, 8, 9, 10, 12, 14)) gui.InputDropdown(APP.input, "s", "Ambient media power-law index, s:", 0, s_change, (0, 2), state="disabled") gui.InputEntry(APP.input, "n_0", "ISM number density (cm\u207B\u00B3):", 2.0, SNR.update_output, gt_zero) if APP.os == "Linux": ratio_label = "Electron to ion temperature ratio Te/Ti:" else: ratio_label = "Electron to ion temperature ratio T\u2091\u200a/\u200aT\u1d62\u200a:" gui.InputDropdown(APP.input, "T_ratio", ratio_label, "Default", update_ratio, "Custom") gui.InputEntry(APP.input, "zeta_m", "Cooling adjustment factor:", 1.0, SNR.update_output, gt_zero) gui.InputEntry(APP.input, "sigma_v", "ISM turbulence/random speed (km/s):", 7.0, SNR.update_output) gui.InputEntry(APP.input, "m_w", "Stellar wind mass loss (Msun/yr):", 1e-7, SNR.update_output, gt_zero)