예제 #1
0
def set_inclusion():
    conectarBd()
    papers = Paper.objects()[21:50]
    print(len(papers))
    for paper in papers:
        paper.inclusion1 = True
        paper.inclusion2 = True
        paper.citationsWanted = False
        # print(paper.doi)
        paper.save()
def elegirPaper(user):
    papers = list(Paper.objects(on_revision=user))
    if papers:
        paper = random.choice(
            papers
        )  #permite elegir un elementos de una lista (en este caso la lista de papers)
        if paper.inclusion1 is None: number = 1
        else: number = 2
        #print("opcion1")
        return paper, number
    papers = list(
        Paper.objects(
            Q(inclusion2__exists=False) & Q(user_inclusion1__ne=user)
            & Q(on_revision__exists=False)
            & (Q(isOnlyReference=False) | Q(isOnlyReference__exists=False))))
    if papers:
        paper = random.choice(papers)
        if paper.inclusion1 is None: number = 1
        else: number = 2
        #print("opcion2")
        return paper, number
    else:
        return None, None
def mostrarPantallaCuracionBibliografica():
    conectarBd()
    papers = Paper.objects(
        Q(inclusion1=True) & Q(inclusion2=True)
        & Q(bibliographyIsLoaded__exists=False))
    count_papers = len(papers)
    if count_papers > 0:
        st.success("Se encontraron disponibles " + str(count_papers) +
                   " papers para cargar.")
        st.markdown("## ¿Desea realizar la carga ahora?")
        cargar = st.button("Cargar")
        if cargar:
            automatizarCarga(papers)
    else:
        st.error("No hay papers disponibles para cargar en este momento.")
def obtenerCitaciones():
    conectarBd()
    papers = Paper.objects(
        Q(inclusion1=True) & Q(inclusion2=True)
        & Q(citationsSearched__exists=False))
    count_papers = len(papers)
    if count_papers > 0:
        st.success("Se encontraron disponibles " + str(count_papers) +
                   " papers de los cuales obtener citaciones.")
        st.markdown("## ¿Desea buscar las citaciones ahora?")
        buscar = st.button("Buscar")
        if buscar:
            st.error("Este módulo aún se encuentra en desarrollo.")
            # all_dois = set()
            # cont = len(papers)
            # #for paper in papers:
            # dois = get_citations(papers)
            # st.success("Se encontraron "+str(len(dois))+" páginas de citaciones")
            # #st.markdown(all_dois)
            # #Dar posibilidad de descargar la lista en un archivo.
    else:
        st.error("No hay papers disponibles para buscar citaciones.")
예제 #5
0
def verificarUsuario():
    if os.path.exists("user_selected"):
        user = f = open("user_selected", "r").read()
        st.sidebar.write("Usuario: " + user)
        if st.sidebar.button("Cambiar Usuario"):
            os.remove("user_selected")
        return user
    else:
        if os.path.exists("user_session"):
            with open('user_session', 'rb') as fp:
                opciones = pickle.load(fp)
        else:
            opciones = op.opciones.copy()
            conectarBd()
            with st.spinner("Conectando con la Base de Datos..."):
                for paper in Paper.objects():
                    if paper.user_inclusion1 is not None:
                        opciones["users"].add(paper.user_inclusion1)
                        if paper.user_inclusion2 is not None:
                            opciones["users"].add(paper.user_inclusion2)
                with open('user_session', 'wb') as fp:
                    pickle.dump(opciones, fp, protocol=pickle.HIGHEST_PROTOCOL)
        options = list(opciones["users"])
        options.append("Otro")
        options = ["Seleccionar..."] + options
        st.markdown("#### Usuario")
        user = st.selectbox(
            label=
            "Seleccione su nombre de entre la lista de usuarios. Si usted no se encuentra en la lista elija 'Otro' y carguelo manualmente por única vez.",
            options=options)
        if user == "Otro":
            user = st.text_input(
                label="Ingrese un usuario para agregar a la base de datos.")
        if st.button("Guardar Usuario"):
            f = open("user_selected", "w")
            f.write(user)
            f.close()
            os.remove("user_session")
            return user
def buscarOpcionesCargadas():
    opciones = op.opciones.copy()
    for paper in Paper.objects():
        opciones["research_goal_list"].update(paper.research_goal)
        opciones["practical_contibution_list"].add(paper.practical_contibution)
        tasks = paper.visual_tasks
        if tasks is None: continue
        for task in tasks:
            opciones["visual_tasks_list"].add(task.name)
            opciones["data_capture_conditions_list"].add(
                task.data_capture_condition)
            opciones["electromagnetic_spectrum_list"].add(
                task.electromagnetic_spectrum)
            opciones["camera_types_list"].add(task.camera_types)
            opciones["viticultural_objects_list"].update(
                task.viticultural_objects)
            opciones["algorithms_list"].update(task.algorithms)
            opciones["viticultural_variable_list"].update(
                task.viticultural_variable)
            opciones["varietal_list"].update(task.variety)
            opciones["irrigation_conduction_list"].update(task.driving_systems)
            for feature in task.visual_features:
                if feature.type == "Handcrafted":
                    opciones["visual_features_handcrafted_list"].add(
                        feature.name)
                elif feature.type == "Latent":
                    opciones["visual_features_latent_list"].add(feature.name)
                else:
                    opciones["visual_features_deep_list"].add(feature.name)
    return opciones


# disconnect()
# connect('literatureReview')
# for paper in Paper.objects:
#     print(paper.doi)
예제 #7
0
def get_papers():
    conectarBd()
    papers = Paper.objects(
        Q(inclusion1=True) & Q(inclusion2=True)
        & Q(citationsWanted__exists=False))
    return papers
def mostrarSeccionExtracción(user):
    conectarBd()

    col1, col2 = st.beta_columns(2)
    opciones = buscarOpcionesCargadas()
    seccion = st.sidebar.radio(label="Secciones",
                               options=[
                                   "Seleccionar artículo",
                                   "Características de la investigación",
                                   "Tareas visuales"
                               ])
    if st.sidebar.button("Enviar"): guardarExtraccion()
    if st.sidebar.button("Cargar otro paper"):
        reiniciarCarga()

    if seccion == "Seleccionar artículo":
        if os.path.exists("paper_selected"):
            st.markdown(
                "#### Ya se ha seleccionado el paper cuyos datos extraer")
            with open('paper_selected', 'r') as fp:
                data = json.load(fp)
                st.json(data)
            if st.button("Seleccionar otro paper"):
                os.remove("paper_selected")
        else:
            st.markdown("## Seleccionar artículo  para extraer datos.")
            doi = st.text_input(
                label=
                "Ingrese el doi del artículo en su formato url. Por ejemplo: doi.org/10.1109/CVPR.2016.609"
            )
            if st.button(label="Buscar"):
                paper = None
                try:
                    badflag = False
                    paper = Paper.objects.get(doi=doi)
                    st.success("Se encontró un paper con título:\n" + '**"' +
                               paper.title + '"**')
                    goals = paper.research_goal
                    if goals:
                        st.error(
                            "El paper encontrado tiene cargadas el objetivo de la investigación"
                        )
                        st.write("Objetivo de la investigación: ")
                        for goal in goals:
                            st.write(paper.research_goal)
                        badflag = True

                    if paper.practical_contibution is not None:
                        st.error(
                            "El paper encontrado tiene cargadas Aportes Prácticos de la investigación"
                        )
                        st.write("Aporte práctico: " +
                                 paper.practical_contibution)
                        badflag = True

                    if paper.viticultural_aspects is not None:
                        st.error(
                            "El paper encontrado tiene cargadas Aspectos Vitícolas de la investigación"
                        )
                        st.write("Aspectos Vitícolas: " +
                                 paper.viticultural_aspects)
                        badflag = True
                    tasks = paper.visual_tasks
                    if tasks:
                        st.error(
                            "El paper encontrado tiene cargadas las tareas visuales"
                        )
                        visual_to_show = []
                        for task in paper.visual_tasks:
                            visual_to_show.append(json.loads(task.to_json()))
                        st.write(visual_to_show)
                        badflag = True
                    if not badflag:
                        st.success(
                            "El paper seleccionado esta en condiciones para llevar adelante la carga\n"
                        )
                        with open('paper_selected', 'w') as fp:
                            json.dump(paper.to_json(), fp)
                        st.write(
                            "Continue con la extracción y los datos ingresados se asociarán a este paper."
                        )
                        st.json(paper.to_json())
                    else:
                        st.error(
                            "El paper seleccionado NO esta en condiciones para llevar adelante la carga. Contactese con el administrador de su Base de Datos.\n"
                        )
                except Paper.MultipleObjectsReturned:
                    st.write(
                        "Al parecer, hay más de un paper con el doi ingresado."
                    )
                    papers = Paper.objects(doi=doi)
                    names = []
                    for paper in papers:
                        names.append(paper.title)
                    name = st.selectbox(
                        label="Elija el que usted quiera analizar",
                        options=names)
                    paper = Paper.objects(doi=doi, names=name)[0]
                except Paper.DoesNotExist:
                    st.error(
                        "No existe ningun paper con el doi ingresado en la base de datos."
                    )

    if seccion == "Tareas visuales":
        if os.path.exists("tareas_def"):
            st.markdown("#### Ya se han cargado los datos de esta sección")
            with open('tareas_def', 'r') as fp:
                tasks = json.load(fp)
            st.json(tasks)
            if st.button("Cargar más tareas"):
                os.remove("tareas_def")
            if st.button("Eliminar datos cargados"):
                os.remove("tareas")
                os.remove("tareas_def")
        else:
            st.markdown("## Extraer datos del paper seleccionado.")
            st.markdown("### Tareas Visuales de alto Nivel")
            st.markdown(
                "Los siguientes campos deberán completarse para **cada una** de las tareas visuales que se llevan a cabo mediante CV en el paper."
            )
            st.markdown(
                "Una vez que se hayan completado los campos necesarios, presione **'Cargar Tarea'** para salvar los datos y pasar a la siguiente tarea visual (si es que hay más de una)."
            )

            col1, col2 = st.beta_columns(2)
            with col1:
                st.markdown("#### Nombre de la tarea")
                options = list(opciones["visual_tasks_list"])
                options.append("Otra")
                task = st.selectbox(
                    label=
                    "Seleccione una tarea visual de alto nivel. Si la que se quiere ingresar no se encuentra en la lista elija 'Otra' y carguela manualmente",
                    options=options)
                if task == "Otra":
                    task = st.text_input(
                        label=
                        "Ingrese una tarea visual para agregar a la base de datos."
                    )
                sub = st.radio("Subsecciones", [
                    "Información Vitícola", "Dataset", "Features", "Algoritmos"
                ])
                if st.button("1) Agregar tarea visual a la lista"):
                    cargarTarea(task)
                mostrarTareas()
                if st.button("2) Guardar lista de tareas"):
                    copyfile("tareas", "tareas_def")
                    time.sleep(1)
                    st.success("¡Se han guardado los datos de esta sección! ")
                    with open('tareas_def', 'r') as fp:
                        tasks = json.load(fp)
                    st.json(tasks.to_json())
                    st.write(
                        "Seguí completando los campos de otras secciones o presioná 'Enviar' en la barra lateral si ya completaste todas las secciones."
                    )
                if st.button("Eliminar tareas visuales cargadas"):
                    os.remove("tareas")
                    st.success(
                        "¡Se han eliminado las tareas visuales cargadas hasta el momento! "
                    )

            with col2:
                if sub == "Información Vitícola":
                    if os.path.exists("viticulture"):
                        st.markdown(
                            "#### Ya se han cargado los datos de esta sección")
                        with open('viticulture', 'r') as fp:
                            data = json.load(fp)
                        st.json(data)
                        if st.button("Eliminar datos cargados"):
                            os.remove("viticulture")
                    else:
                        st.markdown("#### Objetos Vitícolas")
                        options = list(opciones["viticultural_objects_list"])
                        options.append("Otros")
                        objs = st.multiselect(
                            label=
                            "Seleccione todos los objetos vitícolas sobre los que se aplica la tarea visual de alto nivel. Si algún objeto no se encuentra en la lista elija 'Otros' y carguelo manualmente",
                            options=options)
                        if "Otros" in objs:
                            objs2 = st.text_input(
                                label=
                                "Ingrese objetos vitícolas para agregar a la base de datos separados por comas"
                            )
                        st.markdown("#### Variables Vitícolas")
                        options = list(opciones["viticultural_variable_list"])
                        options.append("Otras")
                        vars = st.multiselect(
                            label=
                            "Seleccione todas las variables vitícolas que se midieron mediante esta tarea visual. Si alguna variable vitícola no se encuentra en la lista elija 'Otras' y carguela manualmente",
                            options=options)
                        if "Otras" in vars:
                            vars2 = st.text_input(
                                label=
                                "Ingrese variables vitícolas para agregar a la base de datos separados por comas"
                            )
                        var_details = st.text_area(
                            label=
                            "Ingrese algun comentario destacable sobre la manera en que se aplicó esta tarea visual a la medición de la variable en caso de ser necesario."
                        )
                        monitor = st.checkbox(
                            "¿Se monitoriza la medición de estas variables a lo largo del tiempo?"
                        )
                        guardar = st.button("Guardar")
                        if guardar:
                            if "Otras" in vars:
                                if "Otros" in objs:
                                    cargarInfoViticola(objs, vars,
                                                       var_details, monitor,
                                                       objs2.split(','),
                                                       vars2.split(','))
                                else:
                                    cargarInfoViticola(objs,
                                                       vars,
                                                       var_details,
                                                       monitor,
                                                       vars2=vars2.split(','))
                            else:
                                if "Otros" in objs:
                                    cargarInfoViticola(objs, vars,
                                                       var_details, monitor,
                                                       objs2.split(','))
                                else:
                                    cargarInfoViticola(objs, vars, var_details,
                                                       monitor)

                if sub == "Dataset":
                    st.markdown("#### Dataset")
                    if os.path.exists("dataset"):
                        st.markdown(
                            "#### Ya se han cargado los datos de esta sección")
                        with open('dataset', 'r') as fp:
                            data = json.load(fp)
                        st.json(data)
                        if st.button("Eliminar datos cargados"):
                            os.remove("dataset")
                    else:
                        bench = st.checkbox(
                            "¿El dataset utilizado es de benchmarking?")
                        if not bench:
                            format = st.selectbox(
                                label=
                                "Seleccione los elementos de los que se compone el dataset",
                                options=list(opciones["dataset_format_list"]))

                            options = list(
                                opciones["electromagnetic_spectrum_list"])
                            options.append("Otra")
                            electromagnetic = st.selectbox(
                                label=
                                "Indique qué sección del espectro electromagnetico se capturó en el dataset. Si ninguna de las opciones lo satisface, elija 'Otra' y carguela manualmente",
                                options=options)
                            if electromagnetic == "Otra":
                                electromagnetic = st.text_input(
                                    label=
                                    "Ingrese una sección del espectro electromagnetico para agregar a la base de datos."
                                )

                            options = list(opciones["camera_types_list"])
                            options.append("Otra")
                            camera = st.selectbox(
                                label=
                                "Indique con qué tipo/arreglo de cámara se capturó el dataset. Si ninguna de las opciones lo satisface, elija 'Otra' y carguela manualmente",
                                options=options)
                            if camera == "Otra":
                                camera = st.text_input(
                                    label=
                                    "Ingrese una sección del espectro electromagnetico para agregar a la base de datos."
                                )

                            camera_details = st.text_area(
                                label=
                                "Ingrese algun comentario destacable sobre el hardware utilizado en caso de que lo crea conveniente"
                            )

                            options = list(
                                opciones["data_capture_conditions_list"])
                            options.append("Otra")
                            condition = st.selectbox(
                                label=
                                "Seleccione las condiciones en que se capturó el dataset. Si la que se quiere ingresar no se encuentra en la lista elija 'Otra' y carguela manualmente",
                                options=options)
                            if condition == "Otra":
                                condition = st.text_input(
                                    label=
                                    "Ingrese una condición de captura nueva para agregar a la base de datos."
                                )

                            options = list(opciones["varietal_list"])
                            options.append("Otros")
                            # varietal = st.st.multiselect(label="Seleccione el/los varietales correspondientes observados en el dataset. Si ninguna de las opciones lo satisface, elija 'Otra' y carguela manualmente",options=options)
                            # if varietal == "Otra":
                            #     varietal = st.text_input(label="Ingrese una condición de captura nueva para agregar a la base de datos.")
                            varietales = st.multiselect(
                                label=
                                "Seleccione el/los varietales correspondientes observados en el dataset. Si ninguna de las opciones lo satisface, elija 'Otra' y carguela manualmente",
                                options=options)
                            if "Otros" in varietales:
                                varietales2 = st.text_input(
                                    label=
                                    "Ingrese varietales para agregar a la base de datos, separados por comas"
                                )

                            options = list(
                                opciones["irrigation_conduction_list"])
                            options.append("Otros")
                            # irrigation = st.multiselect(label="Seleccione el/los sistemas de conducción observados en el dataset. Si ninguna de las opciones lo satisface, elija 'Otra' y carguela manualmente",options=options)
                            # if irrigation == "Otra":
                            #     irrigation = st.text_input(label="Ingrese una condición de captura nueva para agregar a la base de datos.")
                            irrigations = st.multiselect(
                                label=
                                "Seleccione el/los sistemas de conducción observados en el dataset. Si ninguna de las opciones lo satisface, elija 'Otra' y carguela manualmente",
                                options=options)
                            if "Otros" in irrigations:
                                irrigations2 = st.text_input(
                                    label=
                                    "Ingrese sistemas de conducción para agregar a la base de datos, separados por comas"
                                )

                            dataset_details = st.text_area(
                                label=
                                "Ingrese algun comentario destacable sobre la captura del dataset en caso de ser necesario."
                            )
                        link = st.checkbox("¿Se encuentra disponible?")
                        if link:
                            link = st.text_input(
                                label="Ingrese la url para acceder al dataset."
                            )
                        if st.button("Guardar"):
                            if bench:  #objs=varietales #vars=irrigations
                                #cargarDataset(bench,link)
                                if "Otros" in irrigations:
                                    if "Otros" in varietales:
                                        cargarDataset(
                                            bench,
                                            link,
                                            varietales,
                                            irrigations,
                                            varietales2=varietales2.split(','),
                                            irrigations2=irrigations2.split(
                                                ','))
                                        #cargarInfoViticola(objs,vars,var_details,monitor,varietales2.split(','),irrigations2.split(','))
                                    else:
                                        cargarDataset(
                                            bench,
                                            link,
                                            varietales,
                                            irrigations,
                                            irrigations2=irrigations2.split(
                                                ','))
                                        #cargarInfoViticola(objs,vars,var_details,monitor,irrigations2=irrigations2.split(','))
                                else:
                                    if "Otros" in varietales:
                                        cargarDataset(
                                            bench,
                                            link,
                                            varietales,
                                            irrigations,
                                            varietales2=varietales2.split(','))
                                        #cargarInfoViticola(objs,vars,var_details,monitor,varietales2.split(','))
                                    else:
                                        cargarDataset(bench, link, varietales,
                                                      irrigations)
                                        #cargarInfoViticola(objs,vars,var_details,monitor)

                            else:
                                #cargarDataset(bench,link,format,electromagnetic,camera,camera_details,condition,dataset_details)
                                if "Otros" in irrigations:
                                    if "Otros" in varietales:
                                        cargarDataset(
                                            bench,
                                            link,
                                            varietales,
                                            irrigations,
                                            format,
                                            electromagnetic,
                                            camera,
                                            camera_details,
                                            condition,
                                            dataset_details,
                                            varietales2=varietales2.split(','),
                                            irrigations2=irrigations2.split(
                                                ','))
                                        #cargarDataset(bench,link,format,electromagnetic,camera,camera_details,condition,dataset_details)
                                    else:
                                        cargarDataset(
                                            bench,
                                            link,
                                            varietales,
                                            irrigations,
                                            format,
                                            electromagnetic,
                                            camera,
                                            camera_details,
                                            condition,
                                            dataset_details,
                                            irrigations2=irrigations2.split(
                                                ','))
                                        #cargarDataset(bench,link,format,electromagnetic,camera,camera_details,condition,dataset_details)
                                else:
                                    if "Otros" in varietales:
                                        cargarDataset(
                                            bench,
                                            link,
                                            varietales,
                                            irrigations,
                                            format,
                                            electromagnetic,
                                            camera,
                                            camera_details,
                                            condition,
                                            dataset_details,
                                            varietales2=varietales2.split(','))
                                        #cargarDataset(bench,link,format,electromagnetic,camera,camera_details,condition,dataset_details)
                                    else:
                                        cargarDataset(bench, link, varietales,
                                                      irrigations, format,
                                                      electromagnetic, camera,
                                                      camera_details,
                                                      condition,
                                                      dataset_details)
                                        #cargarDataset(bench,link,format,electromagnetic,camera,camera_details,condition,dataset_details)

                if sub == "Features":
                    if os.path.exists("features_def"):
                        st.markdown(
                            "#### Ya se han cargado los datos de esta sección")
                        feat = pd.read_csv('features_def')
                        st.dataframe(feat)
                        if st.button("Cargar más datos"):
                            os.remove("features_def")
                        if st.button("Eliminar datos cargados"):
                            os.remove("features")
                            os.remove("features_def")
                    else:
                        st.markdown("#### Features")
                        st.markdown(
                            "Las features son representaciones de los datos visuales crudos que son más propicias para una tarea informática y se obtienen a través de un proceso a menudo creativo. "
                        )
                        feature_type = st.selectbox(
                            "Elija un tipo de features a ingresar",
                            options=list(opciones["visual_features_types"]))
                        if st.checkbox(
                                "Ver más info sobre los tipos de features..."):
                            st.markdown("Existen 3 tipos:")
                            st.markdown(
                                "- **Classic hand-crafted features**: Estas features están diseñadas por expertos humanos tratando de mantener invariante una propiedad específica de los datos. Estas features son fácilmente interpretables y caracterizan aspectos fundamentales de las imágenes como el color, la textura y la forma.\n- **Features latentes** : Estas features consisten en representaciones  del objeto ocultas en un subespacio de dimensionalidad inferior al de los datos crudos y son encontradas automáticamente por algoritmos de optimización.\n- **Deep Features**: Estas features consisten en representaciones jerárquicas extraídas mediante una red neuronal multicapa. En este tipo de features, el conocimiento del experto se concentra en el diseño de la red que se encargará de aprender la mejor forma de representar los datos a medida que aprende a realizar la tarea para la cual los necesita."
                            )

                        if feature_type == "Handcrafted":
                            options = list(
                                opciones["visual_features_handcrafted_list"])
                            options.append("Otras")
                            features_hand = st.multiselect(
                                label=
                                "Seleccione todas las handcrafted features utilizadas para esta tarea visual de alto nivel. Si alguna feature de este estilo no se encuentra en la lista elija 'Otras' y carguelas manualmente",
                                options=options)
                            if "Otras" in features_hand:
                                features_hand2 = st.text_input(
                                    label=
                                    "Ingrese handcrafted features para agregar a la base de datos **separadas por comas**"
                                )
                            if st.button(
                                    "1) Agregar Handcrafted Features a la lista"
                            ):
                                if "Otras" in features_hand:
                                    cargarFeatures("Handcrafted",
                                                   features_hand,
                                                   features_hand2)
                                else:
                                    cargarFeatures("Handcrafted",
                                                   features_hand)
                        elif feature_type == "Latent":
                            options = list(
                                opciones["visual_features_latent_list"])
                            options.append("Otras")
                            features_lat = st.multiselect(
                                label=
                                "Seleccione todas las latent features utilizadas para esta tarea visual de alto nivel. Si alguna feature de este estilo no se encuentra en la lista elija 'Otras' y carguelas manualmente",
                                options=options)
                            if "Otras" in features_lat:
                                features_lat2 = st.text_input(
                                    label=
                                    "Ingrese latent features para agregar a la base de datos **separadas por comas**"
                                )
                            if st.button(
                                    "1) Agregar Latent Features a la lista"):
                                if "Otras" in features_lat:
                                    cargarFeatures("Latent", features_lat,
                                                   features_lat2)
                                else:
                                    cargarFeatures("Latent", features_lat)
                        elif feature_type == "Deep":
                            options = list(
                                opciones["visual_features_deep_list"])
                            options.append("Otras")
                            features_deep = st.multiselect(
                                label=
                                "Seleccione todas las deep features utilizadas para esta tarea visual de alto nivel. Si alguna feature de este estilo no se encuentra en la lista elija 'Otras' y carguelas manualmente",
                                options=options)
                            if "Otras" in features_deep:
                                features_deep2 = st.text_input(
                                    label=
                                    "Ingrese latent features para agregar a la base de datos separadas por comas"
                                )
                            if st.button(
                                    "1) Agregar Deep Features a la lista"):
                                if "Otras" in features_deep:
                                    cargarFeatures("Deep", features_deep,
                                                   features_deep2)
                                else:
                                    cargarFeatures("Deep", features_deep)

                        if st.button("2) Guardar lista completa"):
                            copyfile("features", "features_def")
                            st.success(
                                "¡Se han guardado los datos de esta sección! ")
                            data = pd.read_csv('features_def')
                            st.dataframe(data)
                            st.write(
                                "Seguí completando los campos de otras secciones o presioná 'Enviar' en la barra lateral si ya completaste todas las secciones."
                            )

                        if st.button("Eliminar afiliaciones cargadas"):
                            os.remove("features")
                            st.success(
                                "¡Se han eliminado las afiliaciones cargadas hasta el momento! "
                            )

                if sub == "Algoritmos":
                    if os.path.exists("algorithms"):
                        st.markdown(
                            "#### Ya se han cargado los datos de esta sección")
                        with open('algorithms', 'r') as fp:
                            data = json.load(fp)
                        st.json(data)
                        if st.button("Eliminar datos cargados"):
                            os.remove("algorithms")
                    else:
                        st.markdown("#### Algoritmos")
                        options = list(opciones["algorithms_list"])
                        options.append("Otros")
                        algs = st.multiselect(
                            label=
                            "Seleccione todos los algoritmos de machine learning que se usaron para esta tarea visual. Si algún algoritmo no se encuentra en la lista elija 'Otros' y carguelo manualmente",
                            options=options)
                        if "Otros" in algs:
                            algs2 = st.text_input(
                                label=
                                "Ingrese algoritmos de machine learning para agregar a la base de datos separados por comas"
                            )
                        guardar = st.button("Guardar")
                        if guardar and not "Otros" in algs:
                            cargarAlgoritmos(algs)
                        if guardar and "Otros" in algs:
                            cargarAlgoritmos(algs, algs2.split(','))

    if seccion == "Características de la investigación":
        if os.path.exists("caracteristicas"):
            st.markdown("#### Ya se han cargado los datos de esta sección")
            with open('caracteristicas', 'r') as fp:
                data = json.load(fp)
            st.json(data)
            if st.button("Eliminar datos cargados"):
                os.remove("caracteristicas")
        else:
            st.markdown("## Extraer datos del paper seleccionado.")
            st.markdown("#### Objetivo de la investigación")
            options = list(opciones["research_goal_list"])
            options.append("Otros")
            goals = st.multiselect(
                label=
                "Seleccione los objetivos que persiguieron los autores con esta investigación. Si ninguno de los objetivos de la lista lo convence, elija 'Otro' y carguelo manualmente",
                options=options)
            if "Otros" in goals:
                goals2 = st.text_input(
                    label=
                    "Ingrese objetivos para agregar a la base de datos separados por comas."
                )

            st.markdown("#### Aporte práctico")
            options = list(opciones["practical_contibution_list"])
            options.append("Otro")
            practical = st.selectbox(
                label=
                "Seleccione el tipo de contribución práctica de este paper. Si alguna contribución práctica no se encuentra en la lista elija 'Otras' y carguela manualmente",
                options=options)
            if practical == "Otro":
                practical = st.text_input(
                    label=
                    "Ingrese una contribución práctica para agregar a la base de datos."
                )

            st.markdown("#### Aspectos Vitícolas")
            options = list(opciones["viticultural_aspects_list"])
            options.append("Otro")
            aspects = st.selectbox(
                label=
                "Seleccione los aspectos vitícolas que intenta resolver este paper. Si algun aspecto no se encuentra en la lista elija 'Otros' y carguela manualmente",
                options=options)
            if aspects == "Otro":
                aspects = st.text_input(
                    label=
                    "Ingrese un aspecto vitícola para agregar a la base de datos."
                )

            guardar = st.button("Guardar")
            if guardar and not "Otros" in goals:
                cargarCaracterísticas(goals, practical, aspects)
            if guardar and "Otros" in goals:
                cargarCaracterísticas(goals, practical, aspects,
                                      goals2.split(','))
def mostrarAvance(users_distribution):
    opciones = op.opciones.copy()
    users = list(opciones["users"])
    revisions = {}
    for user in users:
        revisions[user] = 0
    cantidadRevisiones = 0
    cantidadRevisados = 0
    cantidadSinRevisar = 0
    incluidos = 0
    conflictos = 0
    soloUnaSeleccion = 0
    excluidos = 0
    for paper in Paper.objects(
            Q(isOnlyReference=False) | Q(isOnlyReference__exists=False)):
        isOnlyReference = False  #por las dudas que quede algun paper cargado desde antes de que exista este atributo
        cantidadRevisiones += 2
        if paper.inclusion1 is not None:
            revisions[paper.user_inclusion1] += 1
            cantidadRevisados += 1
            if paper.inclusion2 is not None:
                if paper.user_inclusion2 == paper.user_inclusion1:
                    del paper.inclusion2
                    del paper.user_inclusion2
                    del paper.criteria_inclusion2
                    del paper.comments2
                    soloUnaSeleccion += 1
                    paper.save()
                else:
                    revisions[paper.user_inclusion2] += 1
                    cantidadRevisados += 1
                    if paper.inclusion1 and paper.inclusion2: incluidos += 1
                    if not paper.inclusion1 and not paper.inclusion2:
                        excluidos += 1
                    if paper.inclusion1 != paper.inclusion2: conflictos += 1
            else: soloUnaSeleccion += 1
        else: cantidadSinRevisar += 1

    progress = cantidadRevisados / cantidadRevisiones
    finish = st.progress(progress)
    st.write("Progreso: " + str(cantidadRevisados) + "/" +
             str(cantidadRevisiones) + "=" + str(round(progress * 100, 2)) +
             "%")
    st.write("Sin Revisar: " + str(cantidadSinRevisar))
    if users_distribution:
        st.set_option('deprecation.showPyplotGlobalUse', False)
        y = np.arange(len(users))
        plt.barh(y, width=list(revisions.values()))
        plt.yticks(y, list(revisions.keys()))
        plt.xticks(list(revisions.values()))
        st.pyplot(plt.show())

    if st.checkbox("Ver Resultados Preliminares"):
        st.set_option('deprecation.showPyplotGlobalUse', False)
        eje_x = ['Incluidos', 'Excluidos', 'Conflictos', 'En Revisión']
        eje_y = [incluidos, excluidos, conflictos, soloUnaSeleccion]
        plt.bar(eje_x, eje_y)
        plt.yticks(eje_y)
        st.pyplot(plt.show())
        if st.button("Ver conflictos"):
            dataConflictos = []
            for paper in Paper.objects(
                    Q(inclusion1=True) & Q(inclusion2=False)):
                dataConflictos.append([
                    paper.doi, paper.user_inclusion1, paper.inclusion1,
                    paper.user_inclusion2, paper.inclusion2
                ])
            for paper in Paper.objects(
                    Q(inclusion1=False) & Q(inclusion2=True)):
                dataConflictos.append([
                    paper.doi, paper.user_inclusion1, paper.inclusion1,
                    paper.user_inclusion2, paper.inclusion2
                ])
            conflictosDF = pd.DataFrame(data=dataConflictos,
                                        columns=("doi", "Revisor 1",
                                                 "Veredicto 1", "Revisor 2",
                                                 "Veredicto 2"))
            st.dataframe(conflictosDF)
        if st.button("Ver incluidos"):
            dataIncluidos = []
            for paper in Paper.objects(
                    Q(inclusion1=True) & Q(inclusion2=True)):
                dataIncluidos.append([
                    paper.doi, paper.title, paper.user_inclusion1,
                    paper.user_inclusion2
                ])
            incluidosDF = pd.DataFrame(data=dataIncluidos,
                                       columns=("doi", "Título", "Revisor 1",
                                                "Revisor 2"))
            st.dataframe(incluidosDF)