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.")
Exemplo n.º 3
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)
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 automatizarCarga(papers):
    papers_before = len(Paper.objects)
    authors_before = len(Author.objects)
    inst_before = len(Institution.objects)
    fin_inst_before = len(Finantial_Institution.objects)
    total = len(papers)
    inicio_msg = st.success(
        "Se iniciará la carga de información bibliográfica de **" +
        str(total) + "** papers.")
    my_bar = st.progress(.0)
    loaded = 0
    exitos = []
    fallos = []

    for paper in papers:
        with open('mensajes.txt', 'a') as f:
            try:
                test = get_entity(paper.doi, EntityType.PUBLICATION,
                                  OutputType.JSON)
                exitos.append(test['title'][0])
                #st.write(test['title'][0])
            except:
                fallos.append(paper.title)
                f.write('Fallo la Busqueda del Paper \n')
            if test['created']['date-parts'][0][1] is not None:
                paper.publication_month = test['created']['date-parts'][0][1]
                paper.save()
            if test['created']['date-parts'][0][0] is not None:
                paper.publication_year = test['created']['date-parts'][0][0]

            #Guardando Autores y autores affiliation
            if 'author' in test:
                affiliation_list = []
                for autor in test['author']:
                    try:
                        name_author = autor['given'] + ' ' + autor['family']
                    except:
                        continue
                    try:
                        author_ = Author.objects.get(name=name_author)
                    except Author.MultipleObjectsReturned:
                        f.write("Hubo un problema con el Autor: " +
                                name_author + "\n")
                        continue
                    except Author.DoesNotExist:
                        if 'ORCID' in autor and 'authenticated-orcid' in autor:
                            author_ = Author(orcid=autor['ORCID'],
                                             authenticated_orcid=autor[
                                                 'authenticated-orcid'],
                                             name=name_author,
                                             familyName=autor['family'],
                                             firstName=autor['given']).save()
                            f.write("Se guardó el Autor: " + name_author +
                                    "\n")
                        else:
                            author_ = Author(name=name_author,
                                             familyName=autor['family'],
                                             firstName=autor['given']).save()
                            f.write("Se guardó el Autor: " + name_author +
                                    "\n")

                    if autor['affiliation'] != []:
                        for institucion in autor['affiliation']:
                            try:
                                institution_ = Institution.objects.get(
                                    name=institucion['name'])
                            except Institution.MultipleObjectsReturned:
                                f.write(
                                    "Hubo un problema con la Institución : " +
                                    institucion['name'] + "\n")
                                continue
                            except Institution.DoesNotExist:
                                f.write("Se guardó la Institución : " +
                                        institucion['name'] + "\n")
                                institution_ = Institution(
                                    name=institucion['name']).save()
                            affiliation = Author_Affiliation(
                                institution=institution_,
                                author=author_,
                                sequence=autor['sequence'])
                            affiliation_list.append(affiliation)
                    else:
                        affiliation = Author_Affiliation(
                            author=author_, sequence=autor['sequence'])
                        affiliation_list.append(affiliation)

                paper.author_affiliations = affiliation_list

            #Obteniendo Finantial_Institution
            funder_list = []
            if 'funder' in test:
                for funder_ in test['funder']:
                    try:
                        if 'DOI' in funder_:
                            funder = Finantial_Institution.objects.get(
                                doi=funder_['DOI'])
                        else:
                            funder = Finantial_Institution.objects.get(
                                name=funder_['name'])
                    except Finantial_Institution.MultipleObjectsReturned:
                        f.write(
                            "Hubo un problema con la institución financiera: "
                            + funder_['name'] + "\n")
                        continue
                    except Finantial_Institution.DoesNotExist:
                        if 'DOI' in funder_:
                            funder = Finantial_Institution(
                                doi=funder_['DOI'],
                                name=funder_['name']).save()
                            f.write("Se guardó la Institución : " +
                                    funder_['name'] + "\n")
                        else:
                            funder = Finantial_Institution(
                                name=funder_['name']).save()
                            f.write("Se guardó la Institución : " +
                                    funder_['name'] + "\n")
                    funder_list.append(funder)
                paper.finantial_institutions = funder_list
            else:
                f.write("El paper " + paper.doi +
                        " no fue financiado por ninguna institución. \n")

            #Obteniendo reference
            reference_list = []
            if 'reference' in test:
                for reference_ in test['reference']:
                    try:
                        if 'DOI' in reference_:
                            paper_ref = Paper.objects.get(
                                doi=reference_['DOI'])
                        else:
                            continue
                    except Paper.MultipleObjectsReturned:
                        f.write(
                            "Hubo un problema con el paper de referencia: " +
                            reference_['DOI'] + "\n")
                        continue
                    except Paper.DoesNotExist:
                        if 'article-title' in reference_ and 'DOI' in reference_:
                            paper_ref = Paper(
                                doi=reference_['DOI'],
                                title=reference_['article-title'],
                                abstract=' ',
                                isOnlyReference=True).save()
                            f.write("Se guardó el paper de referencia: " +
                                    reference_['DOI'] + "\n")
                        else:
                            f.write("Paper de referencia no tiene title: " +
                                    "\n")
                    reference_list.append(reference_['DOI'])
            else:
                f.write("Paper de referencia no tiene DOI: " + "\n")

            paper.references = reference_list
            paper.bibliographyIsLoaded = True
            paper.save()
            f.close()
        loaded += 1
        my_bar.progress(loaded / total)
    my_bar.empty()
    inicio_msg.empty()
    papers_after = len(Paper.objects)
    authors_after = len(Author.objects)
    inst_after = len(Institution.objects)
    fin_inst_after = len(Finantial_Institution.objects)
    exitosDF = pd.DataFrame()
    exitosDF["Título"] = pd.Series(exitos)
    fallosDF = pd.DataFrame()
    fallosDF["Título"] = pd.Series(fallos)
    st.success("Se procesaron exitosamente **" + str(len(exitos)) +
               "** papers")
    st.success("Se ingresaron **" + str(papers_after - papers_before) +
               " nuevas referencias** a la base de datos")
    st.success("Se ingresaron **" + str(authors_after - authors_before) +
               " nuevos autores** a la base de datos")
    st.success("Se ingresaron **" + str(inst_after - inst_before) +
               " nuevas instituciones** a la base de datos")
    st.success("Se ingresaron **" + str(fin_inst_after - fin_inst_before) +
               " nuevas instituciones financiadoras** a la base de datos")
    st.dataframe(exitosDF)
    st.error("La API CrossRef no tenía registros de **" + str(len(fallos)) +
             "** papers")
    st.dataframe(fallosDF)
def crearPaper():
    badflag = False
    if not os.path.exists("affiliations_def"):
        error = InputError("Faltan los autores!!")
        st.sidebar.write(error)
        badflag = True
    if not os.path.exists("publication"):
        error = InputError("Faltan los datos de publicación!!")
        st.sidebar.write(error)
        badflag = True
    if not os.path.exists("financement"):
        error = InputError("Faltan los datos de financiamiento!!")
        st.sidebar.write(error)
        badflag = True
    if badflag: return False
    with open('publication', 'r') as fp:
        pub_data = json.load(fp)
    finan_data = pd.read_csv('financement')
    aff_data = pd.read_csv('affiliations')

    #manejo de instituciones financieras
    finantial_institutions_list = []
    for index, row in finan_data.iterrows():
        try:
            f_inst = Finantial_Institution.objects.get(name=row["Name"])
            finantial_institutions_list.append(f_inst)
        except Finantial_Institution.MultipleObjectsReturned:
            st.write("Hubo un problema con la institución: " + row["Name"])
            continue
        except Finantial_Institution.DoesNotExist:
            st.write("Se guardó la institución: " + row["Name"])
            #fin_ins = Finantial_Institution(name = row["Name"], country = row["Country"]).save()
            #finantial_institutions_list.append(fin_ins)

    #manejo de afiliaciones
    affiliations = []
    for index, row in aff_data.iterrows():
        #autor
        try:
            author = Author.objects.get(name=row["Autor"])
        except Author.MultipleObjectsReturned:
            st.write("Hubo un problema con el autor: " + row["Autor"])
            continue
        except Author.DoesNotExist:
            st.write("Se guardó al autor " + row["Autor"] + " con id " +
                     str(row["Scopus_id"]))
            author = Author(name=row["Autor"],
                            scopusID=str(row["Scopus_id"])).save()
        #institucion
        try:
            institution = Institution.objects.get(name=row["Institución"])
        except Institution.MultipleObjectsReturned:
            st.write("Hubo un problema con la institución: " +
                     row["Institución"])
            continue
        except Institution.DoesNotExist:
            st.write("Se guardó la institución " + row["Institución"])
            institution = Institution(name=row["Institución"]).save()
        aff = Author_Affiliation(institution=institution, author=author)
        affiliations.append(aff)
    #crea el paper
    new_paper = Paper(title=pub_data["Titulo"],
                      abstract=pub_data["Abstract"],
                      doi=pub_data["DOI"],
                      keywords=pub_data["Keywords"],
                      publication_month=pub_data["Mes_Publicacion"],
                      publication_year=pub_data["Año_Publicacion"],
                      finantial_institutions=finantial_institutions_list,
                      author_affiliations=affiliations).save()
    with open('paper', 'w') as fp:
        json.dump(new_paper.to_json(), fp)
    st.sidebar.success("¡Se han guardado los datos de este paper! ")
    st.sidebar.json(new_paper.to_json())
    return True
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)