From b134ccfb2af6e115da85ae55ab86cc5c246b0406 Mon Sep 17 00:00:00 2001 From: dzarkV Date: Wed, 8 May 2024 19:43:12 -0500 Subject: [PATCH 1/5] DOC: how to run in Readme --- README.md | 31 ++++++++++++++++++++++++++++++- docker-compose.yml | 7 +++---- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5dd5a09..8ef51f5 100644 --- a/README.md +++ b/README.md @@ -1 +1,30 @@ -# ia-project \ No newline at end of file +# ia-project + +## Our project + +:brain: **Braintracker!** :brain: This innovative web application harnesses the power of machine learning to analyze your brain MRI images and medical history documents. + +Upload your data, and Braintracker springs into action, providing a comprehensive report on the presence of a tumor and offering personalized health recommendations. But remember, while Braintracker is a powerful tool, **it doesn’t replace the need for professional medical advice**. + +More info in our :point_right: [wiki](https://github.com/Sebastian-411/ia-project/wiki) + +### How to run it + +First, open a terminal and clone this project on a folder with + +```bash +git clone https://github.com/Sebastian-411/ia-project.git +cd ia-project +``` + +>[!IMPORTANT] +> Make sure you have Docker and Docker compose installed :whale2: +> + +You can run front-end and backend with + +```bash +docker compose up +``` + +Prepare your MRI and your medical history and try :brain: Braintracker :brain: in `localhost:8080`! diff --git a/docker-compose.yml b/docker-compose.yml index 85f13c2..e8f2a72 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,6 +4,7 @@ services: build: ./backend env_file: - path: ./backend/.env + required: true ports: - 8000:8000 volumes: @@ -15,12 +16,10 @@ services: frontend: depends_on: - backend - build: - ./frontend - # context: ./frontend - # dockerfile: Dockerfile.dev + build: ./frontend env_file: - path: ./frontend/.env + required: true ports: - 8080:80 volumes: From 79e601a7d3ae86134fc690507aafcf012ba26a8c Mon Sep 17 00:00:00 2001 From: JVPH Date: Fri, 10 May 2024 15:31:00 -0500 Subject: [PATCH 2/5] Fix styling issues --- frontend/src/App.jsx | 12 +++++++++--- frontend/src/components/HealthRecommendations.jsx | 9 +++++---- frontend/src/components/UploadFileForm.jsx | 2 +- frontend/src/components/UploadFileWrapper.jsx | 4 ++-- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index f5b1136..aea2af8 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -14,7 +14,7 @@ function App() { setNotification({ message, type }); setTimeout(() => { setNotification(null); - }, 3000); + }, 4000); }; // Callback to update the state after uploading the file @@ -30,11 +30,17 @@ function App() { setIsLoading(false); } }; + const mockData = { + classification: + "The MRI analysis indicates a high probability of a benign tumor present in the left hemisphere of the brain.", + analysis_results: + "## Análisis de la Historia Clínica:\n\n**Datos del Paciente:**\n\n* Mujer de 34 años, soltera, argentina, empleada administrativa.\n* Reside en La Matanza, Provincia de Buenos Aires.\n\n**Motivo de Consulta:**\n\n* Crisis frecuentes de palpitaciones de dos semanas de evolución.\n\n**Enfermedad Actual:**\n\n* Episodios de palpitaciones de inicio brusco, nocturnos, al intentar dormir.\n* Los episodios también ocurren después de la ingesta de alimentos.\n* No cede con cambios de posición, pero sí con la ingesta de agua.\n* Relación con estrés laboral.\n* Se le indicó ansiolítico, pero no lo ha tomado.\n\n**Antecedentes Personales:**\n\n* **Fisiológicos:** Desarrollo normal, menstruación regular, sin embarazos ni abortos.\n* **Patológicos:** Sarampión y varicela en la infancia, sin complicaciones. Toma anticonceptivos orales. Alergia a la dipirona. Apendicectomía.\n* **Hábitos:** Alimentación completa y variada, buen apetito, catarsis intestinal normal, insomnio reciente, no consume alcohol ni drogas, no fuma, toma ibuprofeno ocasionalmente. Pareja estable, usa anticonceptivos, niega ETS. No realiza actividad física regular.\n\n**Antecedentes Heredofamiliares:**\n\n* No se especifica.\n\n**Examen Físico:**\n\n* **General:** Paciente lúcida y colaboradora, buen estado general, sin signos de deshidratación.\n* **Piel y Faneras:** Sin lesiones significativas, mucosas húmedas y normocoloreadas.\n* **Sistema Linfático:** Adenomegalias no significativas en cadena laterocervical izquierda.\n* **Sistema Osteoarticulomuscular:** Sin alteraciones significativas.\n* **Cabeza y Cuello:** Sin alteraciones significativas, movilidad cervical discretamente limitada.\n* **Tórax:** Simétrico, sin deformaciones.\n* **Aparato Respiratorio:** Respiración normal, sin ruidos agregados.\n* **Aparato Circulatorio:** Sin soplos, frecuencia cardiaca 90/min, tensión arterial normal.\n* **Abdomen:** Blando, depresible, indoloro, sin visceromegalias, ruidos hidroaéreos presentes.\n* **Aparato Genital:** Mamas sin nódulos, cuello uterino normal al tacto vaginal.\n* **Sistema Nervioso:** Lúcida, pares craneales normales, tono y fuerza muscular conservados, sensibilidad conservada, taxia normal.\n\n## Impresión Diagnóstica:\n\nLa paciente presenta un cuadro de palpitaciones de reciente comienzo, posiblemente relacionado con estrés laboral. El examen físico es normal, lo que sugiere una causa no orgánica. \n\n**Posibles diagnósticos:**\n\n* **Trastorno de ansiedad:** La relación con el estrés, el insomnio y la respuesta parcial a la ingesta de agua sugieren un posible componente de ansiedad.\n* **Trastorno del ritmo cardíaco:** Aunque el examen físico cardiovascular es normal, no se puede descartar por completo un trastorno del ritmo como causa de las palpitaciones.\n\n## Estudios Complementarios:\n\n* **Electrocardiograma:** Para evaluar el ritmo cardíaco y descartar arritmias.\n* **Holter de ritmo:** Si el electrocardiograma es normal, se puede indicar un Holter para registrar el ritmo cardíaco durante 24 horas.\n* **Estudios de laboratorio:** Hemograma completo, perfil tiroideo, electrolitos.\n* **Evaluación psicológica:** Si se sospecha un trastorno de ansiedad.\n\n## Tratamiento:\n\nEl tratamiento dependerá del diagnóstico final.\n\n* **Trastorno de ansiedad:** Manejo del estrés, terapia cognitivo-conductual, ansiolíticos.\n* **Trastorno del ritmo cardíaco:** Dependerá del tipo de arritmia.\n\n## Recomendaciones:\n\n* Evitar el consumo de cafeína y otros estimulantes.\n* Practicar técnicas de relajación.\n* Dormir lo suficiente.\n* Realizar actividad física regular.\n* Seguimiento con el médico para evaluar la respuesta al tratamiento.\n\n**Nota:** Este análisis es solo una orientación y no reemplaza la consulta con un profesional de la salud.\n", + }; // The UploadFileWrapper component is used to render the form and the model's response data return (
-

+

Asistente de diagnóstico médico

@@ -46,7 +52,7 @@ function App() { className="grow" />
- +
diff --git a/frontend/src/components/HealthRecommendations.jsx b/frontend/src/components/HealthRecommendations.jsx index fdbd2ec..d4eb221 100644 --- a/frontend/src/components/HealthRecommendations.jsx +++ b/frontend/src/components/HealthRecommendations.jsx @@ -2,7 +2,6 @@ import React from "react"; import Markdown from "react-markdown"; function HealthRecommendations({ data, isLoading }) { - if (isLoading) { return ( @@ -12,9 +11,11 @@ function HealthRecommendations({ data, isLoading }) { if (!data) return null; return ( -
-

{data.classification}

- {data.analysis_results} +
+

+ {data.classification} +

+ {data.analysis_results}
); } diff --git a/frontend/src/components/UploadFileForm.jsx b/frontend/src/components/UploadFileForm.jsx index 622415a..3ebe2e2 100644 --- a/frontend/src/components/UploadFileForm.jsx +++ b/frontend/src/components/UploadFileForm.jsx @@ -64,7 +64,7 @@ function UploadFileForm({ handleFileUpload, notify, disabled }) { />

{data.classification}

diff --git a/frontend/src/utils/downloadToPDF.jsx b/frontend/src/utils/downloadToPDF.jsx new file mode 100644 index 0000000..9a713d8 --- /dev/null +++ b/frontend/src/utils/downloadToPDF.jsx @@ -0,0 +1,31 @@ +import React from "react"; +import { htmlToText } from "html-to-text"; +import MarkdownIt from "markdown-it"; +import pdfMake from "pdfmake/build/pdfmake"; +import pdfFonts from "pdfmake/build/vfs_fonts"; + +export const downloadPDF = (markdownString) => { + pdfMake.vfs = pdfFonts.pdfMake.vfs; + const md = new MarkdownIt(); + const htmlString = md.render(markdownString); + const textString = htmlToText(htmlString, { + wordwrap: 130, + }); + + const docDefinition = { + content: [ + { + text: textString, + style: "body", + }, + ], + styles: { + body: { + fontSize: 12, + bold: false, + }, + }, + }; + + pdfMake.createPdf(docDefinition).download("results.pdf"); +};