Spaces:
Running
Running
| import marimo | |
| __generated_with = "0.11.9" | |
| app = marimo.App(width="medium") | |
| def _(): | |
| import marimo as mo | |
| import pycek_public as cek | |
| lab = cek.surface_adsorption(make_plots=True) | |
| return cek, lab, mo | |
| def _(mo): | |
| mo.md( | |
| """ | |
| # Surface Adsorption Lab | |
| In the virtual laboratory below, we will be looking at the adsorption of the dye Acid Blue 158 on chitin in water. | |
| The simulated experiments mimic different conditions and will be used to determine the enthalpy of adsorption of the dye on the substrate. | |
| The output file contains the concentration of the dye left in solution, as a function of the amount that was added to the beaker with the kitin powder. | |
| ## Objectives | |
| 1. Calculation of the Langmuir constant ($K_L$) and the monolayer coverage ($Q$) at different temperatures | |
| 2. Compare the fitted values obtained from fitting both forms of the Langmuir isotherm (linear and non-linear) | |
| 3. alculation of the adsorption enthalpy | |
| 4. Comparison with the provided experimental value | |
| ## Instructions | |
| 1. Type your student ID | |
| 2. Select the temperature of the experiment | |
| 3. Click "Run Experiment" | |
| 4. Perform experiments at 5 different temperatures | |
| ___ | |
| """ | |
| ) | |
| return | |
| def _(cek, lab, mo): | |
| def set_ID(value): | |
| return cek.set_ID(mo, lab, value) | |
| student_ID = mo.ui.text(value="", label="Student ID:", on_change=set_ID) | |
| def set_fname(value): | |
| lab.output_file = value | |
| exp_ID = mo.ui.text(value="Automatic", label="Output file:", on_change=set_fname) | |
| temperature = mo.ui.number( | |
| start=0, stop=100, step=1, value=25, label="Temperature (C)" | |
| ) | |
| run_button = mo.ui.run_button(label="Run Experiment") | |
| reset_button = mo.ui.run_button(label="Reset Counter") | |
| # Create download button using marimo's download function | |
| mo.vstack([student_ID, exp_ID, temperature, run_button, reset_button]) | |
| return ( | |
| exp_ID, | |
| reset_button, | |
| run_button, | |
| set_ID, | |
| set_fname, | |
| student_ID, | |
| temperature, | |
| ) | |
| def _(cek, lab, mo, reset_button, run_button, student_ID, temperature): | |
| if reset_button.value: | |
| lab.ID = 0 | |
| lab.output_file = None | |
| image = "" | |
| message = "" | |
| download_button = "" | |
| if run_button.value: | |
| mo.stop( | |
| not student_ID.value.isdigit(), | |
| mo.md(f"### Invalid Student ID: {student_ID.value}"), | |
| ) | |
| lab.set_parameters(temperature=temperature.value + 273.15) | |
| data = lab.create_data_for_lab() | |
| file_content = lab.write_data_to_string() | |
| fname = lab.output_file | |
| if not fname: | |
| fname = lab.filename_gen.random | |
| if not fname.endswith('.csv'): | |
| fname += '.csv' | |
| message = f"### Running Experiment\n" | |
| for k, v in lab.metadata.items(): | |
| message += f"####{k} = {v}\n" | |
| message += f"#### File created = {fname}\n" | |
| download_button = mo.download( | |
| file_content, | |
| filename=fname, | |
| label=f"Download {fname}", | |
| ) | |
| plot = cek.plotting() | |
| image = plot.quick_plot(scatter=data, output="marimo") | |
| mo.hstack([mo.vstack([mo.md(message), download_button]), image]) | |
| return ( | |
| data, | |
| download_button, | |
| file_content, | |
| fname, | |
| image, | |
| k, | |
| message, | |
| plot, | |
| v, | |
| ) | |
| if __name__ == "__main__": | |
| app.run() | |