From 5622f04501dce7ecf11868b983755c9fc663f572 Mon Sep 17 00:00:00 2001 From: KushanManahara Date: Wed, 17 Apr 2024 15:59:31 +0530 Subject: [PATCH] Added Web UI for RNA seq pipeline --- Web UI/.gitignore | 3 + Web UI/README.md | 96 ++++++++++++++++++++++ Web UI/app.py | 177 ++++++++++++++++++++++++++++++++++++++++ Web UI/requirements.txt | 3 + 4 files changed, 279 insertions(+) create mode 100644 Web UI/.gitignore create mode 100644 Web UI/README.md create mode 100644 Web UI/app.py create mode 100644 Web UI/requirements.txt diff --git a/Web UI/.gitignore b/Web UI/.gitignore new file mode 100644 index 0000000..09639e0 --- /dev/null +++ b/Web UI/.gitignore @@ -0,0 +1,3 @@ +/venv +cre.txt +exports.zip \ No newline at end of file diff --git a/Web UI/README.md b/Web UI/README.md new file mode 100644 index 0000000..42691f9 --- /dev/null +++ b/Web UI/README.md @@ -0,0 +1,96 @@ +# Oxford Nanopore | RNA Analysis Tool +### Welcome to the Oxford Nanopore RNA Analysis Tool repository! + +## Overview +This repository contains the source code for our web application designed to simplify RNA sequence analysis using Oxford Nanopore sequencing data. Our goal is to provide a user-friendly interface that enables researchers, regardless of their programming background, to analyze RNA data efficiently and effectively. +## Features + +- **User-Friendly Interface:** Our web application offers an intuitive interface designed for ease of use. +- **Nanopore Sequencing Support:** Analyze RNA data generated from Oxford Nanopore sequencing technology. +- **Simple Workflow:** Perform various analyses and visualizations with just a few clicks. +- **Accessible to Non-Programmers:** No programming knowledge required. Anyone can analyze RNA data effortlessly. +- **Interactive Visualizations:** Explore your RNA data through interactive charts and graphs. + + +## Getting Started + +To get started with our RNA Analysis Tool, follow these steps: + +1. Clone this repository to your local machine. + ``` + git clone https://github.com/KushanManahara/Oxford-Nanopore-RNA-Analysis-Tool.git + ``` +3. Navigate into the project repository. + ``` + cd Oxford-Nanopore-RNA-Analysis-Tool + ``` +4. Create a virtual environment (not necessary) + + In Windows + ``` + python -m venv venv + ``` + + In Linux/MacOS + ``` + python3 -m venv venv + ``` +6. Install the necessary dependencies as specified in the `requirements.txt` file. + ``` + pip install -r requirements.txt + ``` +7. Run the web application using your preferred web server. + ``` + streamlit run app.py + ``` +## Usage Instructions +- Log in to your server using the provided `host` `username` and `password`. +- Navigate to the **blasting page**. +- Upload your `raw files` as a `.zip` file. The zip file should contain two files, one starting with `'pass_'` and the other with `'fail_'`. +- The pipeline will run, generating the final blasting output as a zip file, which includes the **final blasting report**, **Venn diagram**, and **quality analysis report**. +## Contributing + +We welcome contributions from the community! If you'd like to contribute to the development of the Oxford Nanopore RNA Analysis Tool, please fork this repository, make your changes, and submit a pull request. +## Support + +If you encounter any issues or have any questions about using the Oxford Nanopore RNA Analysis Tool, please [open an issue](https://github.com/example/repository/issues) on this repository.## License + + +This project is licensed under the [MIT License](LICENSE). + +## Tech Stack + +- Python +- Streamlit + + +## 🚀 About Me +### Kushan Manahara + +I'm a final year undergraduate student pursuing Computer Engineering at the University of Peradeniya. My passion lies in research, AI development, and automation. I thrive on exploring new technologies and pushing the boundaries of what's possible in the realm of artificial intelligence. + +Whether it's diving into the intricacies of machine learning algorithms or crafting seamless user experiences through full stack development, I'm driven by a relentless curiosity and a desire to make meaningful contributions to the field of technology. + +Feel free to reach out if you'd like to collaborate on exciting projects or discuss ideas at the intersection of technology and innovation. + +Connect with me on [LinkedIn](Your_LinkedIn_Profile_URL) | Follow me on [Twitter](Your_Twitter_Profile_URL) + +## 🛠 Skills +- **Full Stack Development** +- **LLM Development** (Large Language Models) +- **ML Development** (Machine Learning) +## Authors + +- [@KushanManahara](https://github.com/KushanManahara/) +## Badges +[![MIT License](https://img.shields.io/badge/License-MIT-green.svg)](https://choosealicense.com/licenses/mit/) + +## 🔗 Links +[![portfolio](https://img.shields.io/badge/my_portfolio-000?style=for-the-badge&logo=ko-fi&logoColor=white)](https://vercel.com/kushan-manaharas-projects/) +[![linkedin](https://img.shields.io/badge/linkedin-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/kushan-manahara/) + +## Screenshots + +- ### Login Page ![App Screenshot](https://github.com/KushanManahara/Oxford-Nanopore-RNA-Analysis-Tool/assets/73605929/4f9939fa-db98-435b-a109-1a31945a5f02) + +- ### Blasting Page ![blasting page](https://github.com/KushanManahara/Oxford-Nanopore-RNA-Analysis-Tool/assets/73605929/7a41c018-5716-4b2f-9b76-31fd2ed239e2) diff --git a/Web UI/app.py b/Web UI/app.py new file mode 100644 index 0000000..f841b1c --- /dev/null +++ b/Web UI/app.py @@ -0,0 +1,177 @@ +import paramiko +import streamlit as st +import time + + +def login(): + def on_login(): + try: + ssh_client = create_ssh_connection(host, username, password) + + toast_placeholder = st.empty() + toast_placeholder.success("Login successful!") + ssh_client.close() + time.sleep(2) + toast_placeholder.empty() + + title_placeholder.empty() + host_placeholder.empty() + username_placeholder.empty() + password_placeholder.empty() + st.session_state.logged_in = True + st.session_state.host = host + st.session_state.username = username + st.session_state.password = password + st.session_state.ssh_client = ssh_client + + except Exception as e: + st.error(f"Login failed: {e}") + + title_placeholder = st.empty() + host_placeholder = st.empty() + username_placeholder = st.empty() + password_placeholder = st.empty() + login_button_placeholder = st.empty() + + title_placeholder.title("Login Page") + + host = host_placeholder.text_input("Host") + username = username_placeholder.text_input("Username") + password = password_placeholder.text_input("Password", type="password") + + if host and username and password: + print(host) + print(username) + print(password) + if not login_button_placeholder.button("Login", on_click=on_login): + st.error("Invalid hostname, username or password, . Please try again.") + + +def create_ssh_connection(host, username, password): + ssh_client = paramiko.SSHClient() + ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh_client.connect(hostname=host, username=username, password=password) + return ssh_client + + +def create_project_dir(ssh_client, folder_name): + ssh_client.exec_command(f"mkdir -p WebApp/{folder_name}") + ssh_client.exec_command(f"mkdir -p WebApp/{folder_name}/test-dir") + ssh_client.exec_command(f"mkdir -p WebApp/{folder_name}/EXPORTS") + ssh_client.exec_command( + f'echo "Hello World" > WebApp/{folder_name}/hello-world.txt' + ) + + +def download_file(ssh_client, remote_path, local_path): + sftp_client = ssh_client.open_sftp() + sftp_client.get(remote_path, local_path) + sftp_client.close() + + +def create_zip_folder(ssh_client, folder_path, zip_file_path): + # Execute the zip command remotely to create the zip file + ssh_client.exec_command(f"zip -r {zip_file_path} {folder_path}") + + +def project_init(): + st.title("Project Init Page") + st.write("Welcome to the Project Init Page! You can start project init here.") + + +def blasting(host, username, password): + if not st.button("Back", on_click=logout): + st.title("Blasting Page") + folder_name = st.text_input("Project Name") + uploaded_file = st.file_uploader("Upload FAST5 file as a zip", type=["zip"]) + + project_status = st.empty() + + if st.button("Start Blasting"): + try: + project_status.info("Project initializing started...") + ssh_client = create_ssh_connection(host, username, password) + create_project_dir(ssh_client, folder_name) + project_status.success( + f"Project '{folder_name}' is initiated successfully!" + ) + time.sleep(1) + project_status.empty() + + ssh_client.close() + except Exception as e: + project_status.error(f"An error occurred: {e}") + time.sleep(3) + project_status.empty() + + if uploaded_file is not None: + project_status.empty() + try: + project_status.info("Uploading project files...") + ssh_client = create_ssh_connection(host, username, password) + with ssh_client.open_sftp() as sftp: + with sftp.file( + f"WebApp/{folder_name}/{uploaded_file.name}", "wb" + ) as f: + f.write(uploaded_file.getvalue()) + project_status.success("Project file are uploaded successfully!") + + # blasting is started + time.sleep(1) + project_status.info("Blasting started...") + time.sleep(2) + project_status.success("Blasting Completed...") + time.sleep(2) + project_status.empty() + + # TODO: + + # create a zip file of whole final project + create_zip_folder( + ssh_client, + f"WebApp/{folder_name}", + f"WebApp/{folder_name}/EXPORTS/exports.zip", + ) + + project_status.info("Completed project files are Downloading...") + + # Download the project export file from the remote server + download_file( + ssh_client, + f"WebApp/{folder_name}/EXPORTS/exports.zip", + "exports.zip", + ) + + project_status.success( + "Completed project files are Downloaded successfully!" + ) + + except Exception as e: + project_status.error(f"An error occurred while uploading file: {e}") + ssh_client.close() + + +# Main function +def logout(): + st.session_state.logged_in = False + + +def main(): + global ssh_client, host, username, password + + if "logged_in" not in st.session_state: + host = "localhost" + st.session_state.logged_in = False + + if not st.session_state.logged_in: + login() + + else: + blasting( + st.session_state.host, st.session_state.username, st.session_state.password + ) + + +# Run the main function +if __name__ == "__main__": + main() diff --git a/Web UI/requirements.txt b/Web UI/requirements.txt new file mode 100644 index 0000000..016d140 --- /dev/null +++ b/Web UI/requirements.txt @@ -0,0 +1,3 @@ +paramiko==3.4.0 +streamlit==1.32.2 +pyscp==1.1.20