From c3bcfc77057ce876e02290d3c2d2e3d734b16821 Mon Sep 17 00:00:00 2001 From: "Stahl, Merle" <merle.stahl@studium.uni-hamburg.de> Date: Wed, 15 Dec 2021 16:14:21 +0000 Subject: [PATCH] =?UTF-8?q?Revert=20"l=C3=B6schen"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 7412025849abe85b67698b1309fb9ec9d7139912 --- count_journal.py | 40 +++ example_input.py | 13 + input/README.md | 50 +++ input/__init__.py | 0 input/get/__init__.py | 0 input/get/acs.py | 192 +++++++++++ input/get/journal_fetcher.py | 96 ++++++ input/get/nature.py | 59 ++++ input/get/template_.py | 51 +++ input/interface.py | 113 +++++++ input/publication.py | 143 +++++++++ input/requirements.txt | 2 + input/test/__init__.py | 0 input/test/test_acs.py | 303 ++++++++++++++++++ input/test/test_input.py | 82 +++++ input_old/README.md | 3 + input_old/__pycache__/input_fj.cpython-39.pyc | Bin 0 -> 4300 bytes input_old/example_urls | 2 + input_old/input_fj.py | 154 +++++++++ input_old/pub.py | 32 ++ input_old/test.py | 15 + input_old/x | 234 ++++++++++++++ verarbeitung/Processing.py | 247 ++++++++++++++ verarbeitung/Processing_unittest.py | 66 ++++ .../__pycache__/Processing.cpython-36.pyc | Bin 0 -> 3693 bytes .../__pycache__/Processing.cpython-38.pyc | Bin 0 -> 4009 bytes .../__pycache__/Processing.cpython-39.pyc | Bin 0 -> 4045 bytes .../Processing_pub_objs_only.cpython-39.pyc | Bin 0 -> 4137 bytes .../__pycache__/input_fj.cpython-36.pyc | Bin 0 -> 4299 bytes .../__pycache__/input_fj.cpython-38.pyc | Bin 0 -> 4329 bytes .../__pycache__/input_fj.cpython-39.pyc | Bin 0 -> 4337 bytes .../__pycache__/input_test.cpython-36.pyc | Bin 0 -> 2579 bytes .../__pycache__/input_test.cpython-38.pyc | Bin 0 -> 2862 bytes .../__pycache__/input_test.cpython-39.pyc | Bin 0 -> 3865 bytes .../__pycache__/json_demo.cpython-36.pyc | Bin 0 -> 865 bytes .../__pycache__/json_demo.cpython-38.pyc | Bin 0 -> 1131 bytes .../__pycache__/json_demo.cpython-39.pyc | Bin 0 -> 1163 bytes .../__pycache__/unittest.cpython-36.pyc | Bin 0 -> 646 bytes verarbeitung/input_test.py | 82 +++++ verarbeitung/json_demo.py | 49 +++ "verarbeitung/n\303\266tige Tests.txt" | 4 + 41 files changed, 2032 insertions(+) create mode 100755 count_journal.py create mode 100755 example_input.py create mode 100644 input/README.md create mode 100644 input/__init__.py create mode 100755 input/get/__init__.py create mode 100755 input/get/acs.py create mode 100755 input/get/journal_fetcher.py create mode 100644 input/get/nature.py create mode 100755 input/get/template_.py create mode 100755 input/interface.py create mode 100755 input/publication.py create mode 100644 input/requirements.txt create mode 100644 input/test/__init__.py create mode 100644 input/test/test_acs.py create mode 100755 input/test/test_input.py create mode 100644 input_old/README.md create mode 100644 input_old/__pycache__/input_fj.cpython-39.pyc create mode 100644 input_old/example_urls create mode 100644 input_old/input_fj.py create mode 100644 input_old/pub.py create mode 100755 input_old/test.py create mode 100644 input_old/x create mode 100644 verarbeitung/Processing.py create mode 100644 verarbeitung/Processing_unittest.py create mode 100644 verarbeitung/__pycache__/Processing.cpython-36.pyc create mode 100644 verarbeitung/__pycache__/Processing.cpython-38.pyc create mode 100644 verarbeitung/__pycache__/Processing.cpython-39.pyc create mode 100644 verarbeitung/__pycache__/Processing_pub_objs_only.cpython-39.pyc create mode 100644 verarbeitung/__pycache__/input_fj.cpython-36.pyc create mode 100644 verarbeitung/__pycache__/input_fj.cpython-38.pyc create mode 100644 verarbeitung/__pycache__/input_fj.cpython-39.pyc create mode 100644 verarbeitung/__pycache__/input_test.cpython-36.pyc create mode 100644 verarbeitung/__pycache__/input_test.cpython-38.pyc create mode 100644 verarbeitung/__pycache__/input_test.cpython-39.pyc create mode 100644 verarbeitung/__pycache__/json_demo.cpython-36.pyc create mode 100644 verarbeitung/__pycache__/json_demo.cpython-38.pyc create mode 100644 verarbeitung/__pycache__/json_demo.cpython-39.pyc create mode 100644 verarbeitung/__pycache__/unittest.cpython-36.pyc create mode 100644 verarbeitung/input_test.py create mode 100644 verarbeitung/json_demo.py create mode 100644 "verarbeitung/n\303\266tige Tests.txt" diff --git a/count_journal.py b/count_journal.py new file mode 100755 index 0000000..13886a2 --- /dev/null +++ b/count_journal.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 + +from input.interface import InputInterface as Input + +def count_journals(url: str): + inter = Input() + pub = inter.get_publication(url) + + if pub.citations: + for citation in pub.citations: + journal = citation.journal + if journal in cit: + cit[journal] += 1 + else: + cit[journal] = 1 + + if pub.references: + for reference in pub.references: + journal = reference.journal + if journal in cit: + cit[journal] += 1 + else: + cit[journal] = 1 + +if __name__ == "__main__": + cit = {} + + count_journals("https://doi.org/10.1021/acs.jcim.1c00203") + count_journals("https://doi.org/10.1021/acs.jcim.6b00561") + count_journals("https://doi.org/10.1021/acs.jcim.6b00613") + count_journals("https://doi.org/10.1021/acs.jcim.1c00917") + count_journals("https://doi.org/10.1021/acs.jmedchem.0c01332") + #count_journals("https://pubs.acs.org/doi/10.1021/acs.biochem.1c00290") + #count_journals("https://pubs.acs.org/doi/10.1021/acsenvironau.1c00007") + #count_journals("https://pubs.acs.org/doi/10.1021/acs.biochem.7b01162") + + cit = dict(sorted(cit.items(), key=lambda item: item[1])) + for journal in cit: + if journal != "": + print(f'{journal}: {cit[journal]}') diff --git a/example_input.py b/example_input.py new file mode 100755 index 0000000..c9bca41 --- /dev/null +++ b/example_input.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 + +from input.interface import InputInterface as Input + +def main(url: str): + i = Input() + #print(i.get_publication(url)) + print(i.get_pub_light(url)) + # print(i.get_supported_fetchers()) Useless because all classes are called the same + +if __name__ == "__main__": + #main("https://doi.org/10.1021/acs.jcim.1c0023") + main("https://doi.org/10.1021/acs.jcim.5b00332") diff --git a/input/README.md b/input/README.md new file mode 100644 index 0000000..110ce69 --- /dev/null +++ b/input/README.md @@ -0,0 +1,50 @@ +# Projekt CiS-Projekt 2021/22 + +Input-Package to fetch publication information with a given url. + +## Usage/Examples + +```python +from input.interface import InputInterface as Input +from input.publication import Publication + +def main(url): + inter = Input() + try: + pub = inter.get_publication(url) + except Exception as error: + raise error + + print(pub) + pub.title = "Cool new Title" + print(pub) + +if __name__ == "__main__": + main("https://doi.org/10.1021/acs.chemrev.8b00728") +``` + +The expected results of calling this methode are: +| Input-Url | Result | +|-----------|-----------| +| supported & correct| A publication Instance | +| supported & uncorrect| ValueError| +| not supported | ValueError| + +Supported Url are urls, which comply with the url-pattern of supported Journals. + +### Supported Journals: + +- ACS-Journals +- (Nature-Journals) + +## Testing + +``` c +python -m unittest input/test/<file.py> -v +# for all tests in directory +python -m unittest discover input/test -v +``` +## Authors +- Florian Jochens +- Sam Ockenden +- Julius Schenk \ No newline at end of file diff --git a/input/__init__.py b/input/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/input/get/__init__.py b/input/get/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/input/get/acs.py b/input/get/acs.py new file mode 100755 index 0000000..9691845 --- /dev/null +++ b/input/get/acs.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python3 + +""" +Child class of JournalFetcher +Usage: Check if Url can be used with 'can_use_url' + and then fetch publication with 'get_publication' +""" + +import re + +from input.get.journal_fetcher import JournalFetcher +from input.publication import Publication, Citation + + +class Fetcher(JournalFetcher): + """ + Specific Fetcher for the ACS journals. + """ + + # Constant for the abbreviations of the supported Journals + SUPPORTED_JOURNALS = ['1021'] + + @staticmethod + def can_use_url(url: str) -> str: + """ + Uses Regex to extract journal specific substrings in Doi. + TODO: Support non Doi-urls + """ + matched_url = re.match(r'^(https?://)?(doi.org/|pubs.acs.org/doi/)?(10.(\d{4})/\w+.\S+)', url.strip(". \t\r\n")) + + #Checks if match exists + if matched_url is not None: + return matched_url[4] in Fetcher.SUPPORTED_JOURNALS + else: + return False + + @staticmethod + + + def get_pub_light(url: str) -> Publication: + """ + Fetches html and creates Beatifulsoup-instance in parent class. + Specific css-searches for ACS-Journals and creates Publication-instance. + """ + + # Creation of Soup + try: + soup = JournalFetcher.get_soup(url) + except Exception as error: + raise error + + # Raise Error if re recognizes Pattern, but url isnt correct: + # For other Urls + if soup.text.strip(" \t\n")=="Missing resource null": + raise ValueError("'{}' matches Pattern for 'ACS', but doesnt link to Paper.".format(url)) + + # For Dois + if soup.title is not None: + if soup.title.text == "Error: DOI Not Found": + raise ValueError("'{}' matches Pattern for 'ACS', but doesnt link to Paper.".format(url)) + + + soup_header = soup.select('.article_header')[0] + + # Creates Publication + doi_url = soup_header.select('a[title="DOI URL"]')[0].string + title = soup_header.select(".hlFld-Title")[0].text + + contributors = [] + for author in soup_header.select(".hlFld-ContribAuthor"): + contributors.append(author.text) + + journal = soup_header.select(".cit-title")[0].text + + # Replaces abbreviation with whole name + if journal in JournalFetcher.abbrev_dict: + journal = JournalFetcher.abbrev_dict[journal] + + + published = soup_header.select(".pub-date-value")[0].text + + subjects = [] + subject_soup = soup_header.select('.article_header-taxonomy')[0] + for subject in subject_soup.select('a'): + subjects.append(subject.text) + + return Publication(doi_url, title, contributors, journal, published, + subjects) + + def get_publication(url: str) -> Publication: + """ + Fetches html and creates Beatifulsoup-instance in parent class. + Specific css-searches for ACS-Journals and creates Publication-instance. + """ + + # Creation of Soup + try: + soup = JournalFetcher.get_soup(url) + except Exception as error: + raise error + + # Raise Error if re recognizes Pattern, but url isnt correct: + # For other Urls + if soup.text.strip(" \t\n")=="Missing resource null": + raise ValueError("'{}' matches Pattern for 'ACS', but doesnt link to Paper.".format(url)) + + # For Dois + if soup.title is not None: + if soup.title.text == "Error: DOI Not Found": + raise ValueError("'{}' matches Pattern for 'ACS', but doesnt link to Paper.".format(url)) + + + soup_header = soup.select('.article_header')[0] + + #Could be used for more specific search + ref_cit_soup = soup + + # Creates Publication + doi_url = soup_header.select('a[title="DOI URL"]')[0].string + title = soup_header.select(".hlFld-Title")[0].text + + contributors = [] + for author in soup_header.select(".hlFld-ContribAuthor"): + contributors.append(author.text) + + journal = soup_header.select(".cit-title")[0].text + + # Replaces abbreviation with whole name + if journal in JournalFetcher.abbrev_dict: + journal = JournalFetcher.abbrev_dict[journal] + + + published = soup_header.select(".pub-date-value")[0].text + + subjects = [] + subject_soup = soup_header.select('.article_header-taxonomy')[0] + for subject in subject_soup.select('a'): + subjects.append(subject.text) + + + references = [] + references_soup = ref_cit_soup.select('ol#references') + if references_soup != []: + for reference in references_soup[0].select('li'): + if reference.select('.refDoi') != []: + ref_doi = "https://doi.org/{}".format(reference.select('.refDoi')[0].text.strip()[5:]) + else: + # No Doi -> No Paper + continue + ref_title = reference.select('.NLM_article-title')[0].text\ + if reference.select('.NLM_article-title') != [] else None + ref_journal = reference.select('i')[0].text\ + if reference.select('i') != [] else None + + # Replaces abbreviation with whole name + if ref_journal in JournalFetcher.abbrev_dict: + ref_journal = JournalFetcher.abbrev_dict[ref_journal] + + ref_contributors=[] + for author in reference.select('.NLM_contrib-group'): + ref_contributors.append(author.text.replace("\n", " ").replace("\r", "")) + + references.append(Citation(ref_doi, ref_title, ref_journal, ref_contributors, cit_type="Reference")) + + citations = [] + citation_soup = ref_cit_soup.select('.cited-content_cbyCitation') + if citation_soup != []: + for citation in citation_soup[0].select('li'): + if citation.select('a[title="DOI URL"]') != []: + cit_doi = citation.select('a[title="DOI URL"]')[0].text + else: + # No Doi -> No Paper + continue + cit_title = citation.select('.cited-content_cbyCitation_article-title')[0].text\ + if citation.select('.cited-content_cbyCitation_article-title')!= [] else None + cit_journal = citation.select('.cited-content_cbyCitation_journal-name')[0].text\ + if citation.select('.cited-content_cbyCitation_journal-name') != [] else None + + # Replaces abbreviation with whole name + if cit_journal in JournalFetcher.abbrev_dict: + cit_journal = JournalFetcher.abbrev_dict[cit_journal] + cit_contributors =[] + cit_contributors = citation.select('.cited-content_cbyCitation_article-contributors')[0]\ + .text.replace("\n", " ").replace("\r", "").split(', ') + # clean up of the last Entry + cit_contributors_last = cit_contributors.pop().strip(". ") + if cit_contributors_last != '': + cit_contributors.append(cit_contributors_last) + citations.append(Citation(cit_doi, cit_title, cit_journal, cit_contributors, cit_type = "Citation")) + + return Publication(doi_url, title, contributors, journal, published + , subjects, references, citations) diff --git a/input/get/journal_fetcher.py b/input/get/journal_fetcher.py new file mode 100755 index 0000000..514af1f --- /dev/null +++ b/input/get/journal_fetcher.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 + +""" +Parent class for specific Journal +""" + +from abc import ABCMeta, abstractmethod +from bs4 import BeautifulSoup +import requests +from input.publication import Publication + + +class JournalFetcher(metaclass=ABCMeta): + """ + This is a abstract-class for fetcher modules + """ + + @staticmethod + def get_soup(url: str) -> BeautifulSoup: + """ + Retrieves webside-html and returns a BeautifulSoup-instance + + Parameters: + ----------- + :type url: str + :param url: doi-url to a publication + :return: BeatifulSoup-instance + """ + try: + req = requests.get(url) + except requests.exceptions.HTTPError as err: + raise SystemExit(err) + + return BeautifulSoup(req.content, 'html.parser') + + + @staticmethod + @abstractmethod + def can_use_url(url: str) -> bool: + """ + Abstract-function to be implemented in subclass. + Checks if given url links to a supported journal + """ + raise AttributeError("JournalFetcher for '{}' hasnt implemented 'can_use_url()'".format(url)) + + + @staticmethod + @abstractmethod + def get_publication(url: str) -> Publication: + """ + Abstract-function to be implemented in subclass. + Creates a Publication-instance. + """ + raise AttributeError("JournalFetcher for '{}' hasnt implemented 'get_publication()'".format(url)) + + + # A Dictionary, which connects abbreviation to whole journal-name + abbrev_dict = { + "Nat. Protoc.":"Journal of Natural Products" + ,"PLoS Comput. Biol.":"PLoS Computational Biology" + ,"PLoS One":"PLoS One" + ,"Protein Sci.":"Protein Science" + ,"J. Am. Chem. Soc.":"Journal of the American Chemical Society" + ,"J. Chem. Phys.":"Journal of Chemical Physics" + ,"Appl. Sci.":"Applied Science" + ,"Comput. Sci. Eng.":"Computing in Science & Engineering" + ,"Beilstein J. Org. Chem.":"Beilstein Journal of Organic Chemistry" + ,"Biol. Chem.":"Biological Chemistry" + ,"Isr. J. Chem.":"Israel Journal of Chemistry" + ,"Nat. Methods":"Nature Methods" + ,"Proc. Natl. Acad. Sci. U. S. A.":"Proceedings of the National Academy of Sciences of the United States of America" + ,"J. Phys. Chem. B":"Journal of Physical Chemistry B" + ,"Carbohydr. Res.":"Carbohydrate Research" + ,"J. Chem. Theory Comput.":"Journal of Chemical Theory and Computation" + ,"J. Mol. Biol.":"Journal of Molecular Biology" + ,"Nucleic Acids Res.":"Nucleic Acids Research" + ,"J. Comput. Chem.":"Journal of Computational Chemistry" + ,"J. Cheminf.":"Journal of Cheminformatics" + ,"J. Med. Chem.":"Journal of Medicinal Chemistry" + ,"J. Comput.-Aided Mol. Des.":"Journal of Computer-Aided Molecular Design" + ,"J. Chem. Inf. Model.":"Journal of Chemical Information and Modeling" + ,"Mol. Cell":"Molecular Cell" + ,"J. Cell Biolog.":"Journal of Cell Biology" + ,"Mol. Cell Biol.":"Molecular and Cellular Biology" + ,"J. Cell Sci.":"Journal of Cell Science" + ,"Nat. Cell Biol.":"Nature Cell Biology" + ,"J. Aerosol Sci. Technol.":"Aerosol Science and Technology" + ,"Mol. Biol. Cell":"Molecular Biology of the Cell" + ,"Build. Environ.":"Building and Environment" + ,"Sci. Rep.":"Scientific Reports" + ,"Nat. Chem.":"Nature Chemistry" + ,"Nat. Med.":"Nature Medicine" + ,"Nat. Commun.":"Nature Communications" + ,"Exp. Cell Res.":"Experimental Cell Research" + ,"Nat. Chem. Biol.":"Nature Chemical Biology" + } \ No newline at end of file diff --git a/input/get/nature.py b/input/get/nature.py new file mode 100644 index 0000000..c50ea0e --- /dev/null +++ b/input/get/nature.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 + +""" +Child class of JournalFetcher +Usage: Check if Url can be used with 'can_use_url' + and then fetch publication with 'get_publication' +""" + +# import re +from input.get.journal_fetcher import JournalFetcher +from input.publication import Publication + + +class Fetcher(JournalFetcher): + + """ + scrapes publication metadata from a provided url + """ + + # TODO: List of Compatable Journals + # NOTE: nature does not use journal names in doi links, must match by 10.xxxx identifier instead + SUPPORTED_JOURNALS = [] + + @staticmethod + def can_use_url(url: str) -> bool: + """ + Checks if given url links to a supported journal. + """ + + # TODO: Check the URL for compatability + # re.match in SUPPORTED_JOURNALS + return False + + @staticmethod + def get_publication(url: str) -> Publication: + """ + Creates a Publication-instance. + """ + + soup = JournalFetcher.get_soup(url) + + _doi_url = "https://doi.org/" + soup.head.find(attrs={"name": "DOI"}).get("content") + _title = soup.head.find(attrs={"name": "citation_title"}).get("content") + _journal = soup.head.find(attrs={"name": "citation_journal_title"}).get("content") + _published = soup.head.find(attrs={"name": "prism.publicationDate"}).get("content") + _contributors = [] + _subjects = [] + + for creator in soup.head.findAll(attrs={"name": "dc.creator"}): + _contributors.append(creator.get("content")) + + for subject in soup.head.findAll(attrs={"name": "dc.subject"}): + _subjects.append(subject.get("content")) + + return Publication(_doi_url, _title, _contributors, _journal, _published, _subjects) + + # TODO: Exceptions-handling + # raise ValueException("Cant Fetch: '{}'".format(error)) + # return None diff --git a/input/get/template_.py b/input/get/template_.py new file mode 100755 index 0000000..58de023 --- /dev/null +++ b/input/get/template_.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 + +""" +Child class of JournalFetcher +Usage: None, this is just a template and should be ignored +""" + +# import re +from input.get.journal_fetcher import JournalFetcher +from input.publication import Publication + + +class Fetcher(JournalFetcher): + + """ + This is only a template and therefore has no functionality + """ + + # TODO: Naming-Convention: + # Class: 'Fetcher' + # file: [journal-/organisation-name] + # format = "[a-z]*.py" allowed + # TODO: List of Compatable Journals + SUPPORTED_JOURNALS = [] + + @staticmethod + def can_use_url(url: str) -> bool: + """ + Checks if given url links to a supported journal. + """ + + # TODO: Check the URL for compatability + # url_re = re.match(r'(https?://)?(doi.org/)?(10.(\d{4})/\w+.\S+)', url) + # if url_re is not None: + # return url_re[4] in SUPPORTED_JOURNALS + # else: + return False + + @staticmethod + def get_publication(url: str) -> Publication: + """ + Creates a Publication-instance. + """ + + # TODO: Fetch data from the HTML + # soup = JournalFetcher.get_soup(url) + # doi,title,contributors[],journal,publication_date,subjects[],references[],citations[] + # TODO: Create new Publication-instance + # return Publication(doi_url, title, contributors = [], journal + # , publication_date, subjects = [], references = [], citations = []) + return None \ No newline at end of file diff --git a/input/interface.py b/input/interface.py new file mode 100755 index 0000000..59515b3 --- /dev/null +++ b/input/interface.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python3 + +""" +Interface for the Input-Package only this should be accessed from outside this Package. + +""" +from os import walk +import importlib +import pathlib +import re +from input.publication import Publication + +class InputInterface: + """ + Singleton which dynamically imports and manages fetchers + """ + + instance = None + get_path = None + fetcher_classes=[] + + # '__new__' is called before '__init__' and gives us an instance + def __new__(cls, *args, **kwargs): + + # checks if an instance exists and if it doesnt creates one + if cls.instance == None: + cls.instance = super(InputInterface, cls).__new__(cls,*args, **kwargs) + + return cls.instance + + def __init__(self): + # imports all modules + + if self.fetcher_classes ==[]: + self.import_fetcher_classes() + if self.fetcher_classes ==[]: + raise AttributeError("No specific Fetchers where found at: '{}'" + .format(self.get_path)) + + + def get_publication(self, url: str) -> Publication: + """ + The interface-method to get a Publication-instance + (including it's citations and references) + + Parameters + ---------- + :param url: url to a Publication + :type url: str + :return: Publication instance or None if not supported + """ + + # Checks if module supports the 'url' and + # returns a Publication if it does. + for fetcher_class in InputInterface.fetcher_classes: + if fetcher_class.can_use_url(url): + return fetcher_class.get_publication(url) + + # No Module for given url was found + raise ValueError("'{}' is not supported".format(url)) + + def get_pub_light(self, url: str) -> Publication: + """ + The interface-method to get a Publication-instance + (only for main article) + + Parameters + ---------- + :param url: url to a Publication + :type url: str + :return: Publication instance or None if not supported + """ + + # Checks if module supports the 'url' and + # returns a Publication if it does. + for fetcher_class in InputInterface.fetcher_classes: + if fetcher_class.can_use_url(url): + return fetcher_class.get_pub_light(url) + + # No Module for given url was found + raise ValueError("'{}' is not supported".format(url)) + + def get_supported_fetchers(self): + # print(self.fetcher_classes[0].__name__) Useless right now, + # because all classes are called the same + return [a.__name__ for a in self.fetcher_classes] + + def import_fetcher_classes(self): + """ + Searches in 'get', if there are [a-z]*.py modules (specific Fetchers) + and tries to import them. + Saves found modules in 'fetcher_files'. + """ + + # Path to 'get'-package + self.get_path = '{}/get'.format(pathlib.Path(__file__).parent.resolve()) + + # Searches for modules with given Pattern + fetcher_file_names=[] + for file in next(walk(self.get_path), (None, None, []))[2]: + if re.match(r'[a-z]+.py', file) is not None: + fetcher_file_names.append(file) + + # Tries to import those modules and saves their 'Fetcher'-class + for file in fetcher_file_names: + try: + fetcher_class = importlib.import_module("input.get.{}".format(file[:-3])) + try: + self.fetcher_classes.append(fetcher_class.__getattribute__('Fetcher')) + except Exception as error: + ImportError("Module '{}' does not have a 'Fetcher'-class".format(file[:-3])) + except Exception: + raise ImportError("Module '{}' can not be imported".format(file[:-3])) diff --git a/input/publication.py b/input/publication.py new file mode 100755 index 0000000..fc512e7 --- /dev/null +++ b/input/publication.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python3 + +# this is needed for typing pre python 3.9, this maybe as an large Overhead +from typing import Any, List + + +class Publication: + """ + Represents a Publications + """ + def __init__(self, doi_url: str, title: str \ + , contributors: List[str], journal: str \ + , publication_date: str, subjects: List[str]\ + , references: List[Any] = None, citations: List[Any] = None ): + """ + Parameters + ---------- + :param doi_url: doi_url of the publication + :type doi_url: str + :param title: title of the publication + :type title: str + :param contributors:list of all contributors + :type contributors: list[] + :param published: date of release + :type published: str + :param subjects: the subject of the Publication + :type subjects: List[str] + :param references: the Citation which is been referenced by this Publication + :type references: List[Any] + :param citations: the Citation which references this Publication + :type citations: List[Any] + :return: None + """ + self.doi_url = doi_url + self.title = title + self.contributors = contributors + self.journal = journal + self.publication_date = publication_date + self.subjects = subjects + if references is None: + self.references = [] + else: + self.references = references + if citations is None: + self.citations = [] + else: + self.citations = citations + + # For the 'Verarbeitungsgruppe' + self.group = None + + def __str__(self) -> str: + return ("Title: {}\n" + "Doi-url: {}\n" + "Authors: {}\n" + "Journal: {}\n" + "Published on: {}\n" + "Subjects: {}\n" + "References: \n{}\n" + "Citations: \n{}")\ + .format(self.title, self.doi_url, ", ".join(self.contributors) + , self.journal, self.publication_date + , ", ".join(self.subjects) + , "\n".join(self.get_citation_string(self.references)) + , "\n".join(self.get_citation_string(self.citations))) + + @staticmethod + def get_citation_string(citations): + if citations == []: + return ["None"] + else: + citation_string = [] + for citation in citations: + citation_string.append(citation.__str__()) + return citation_string + + def add_citations(self, citation) -> None: + """ + Appends a list of Citations or Citation to self.citations. + + Parameter + --------- + :param citation: Citation or Reference of the Publication + :type citation: Citation or list[Citation] + :return: self.citations + """ + if type(citation) is Citation: + self.citations.append(citation) + + # Checks if 'citation' is a list of Citations + elif type(citation) is list: + for _cit in citation: + if type(_cit) is Citation: + self.citations.append(_cit) + else: + raise TypeError("_set_citation expects Citations or List of Citations, not: '{}'" + .format(type(_cit))) + else: + raise TypeError("_set_citation expects Citations or List of Citations, not: '{}'" + .format(type(citation))) + + return self.citations + + def __eq__(self, other) -> bool: + """ Compares the unique doi_url of two Publications""" + if type(self)==type(other): + return self.doi_url == other.doi_url + return False + + +class Citation: + def __init__(self, doi_url: str, title: str \ + , journal: str, contributors: List[str] \ + , cit_type: str = "Citation"): + """ + Parameters + ---------- + :param doi_url: doi_url of the publication + :type doi_url: str + :param title: title of the publication + :type title: str + :param contributors: list of all contributors + :type contributors: List[str] + :param cit_type: Specifies if Reference or Citation + :type cit_type: str + :return: None + """ + + self.title = title + self.doi_url = doi_url + self.journal = journal + self.contributors = contributors + self.cit_type = cit_type + + def __str__(self) -> str: + return ("\t{}-Title: {}\n" + "\t{}-Doi: {}\n" + "\t{}-Journal: {}\n" + "\t{}-Contributors: {}\n")\ + .format(self.cit_type, self.title + , self.cit_type, self.doi_url + , self.cit_type, self.journal + , self.cit_type, ", ".join(self.contributors)) diff --git a/input/requirements.txt b/input/requirements.txt new file mode 100644 index 0000000..a151126 --- /dev/null +++ b/input/requirements.txt @@ -0,0 +1,2 @@ +beautifulsoup4 +requests \ No newline at end of file diff --git a/input/test/__init__.py b/input/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/input/test/test_acs.py b/input/test/test_acs.py new file mode 100644 index 0000000..e3dfe84 --- /dev/null +++ b/input/test/test_acs.py @@ -0,0 +1,303 @@ +#!/usr/bin/env python + +from input.get.acs import Fetcher as Acs +from input.publication import Publication, Citation +from input.test.test_input import FetcherTestCase + + +class AcsTestCase(FetcherTestCase): + """ + Methods with test_* will be detected by unittest and run. + """ + + def test_acs_url(self): + # Positive Testing + self.can_use_url_test(Acs, "https://doi.org/10.1021/acs.jcim.1c00203" , True) + self.can_use_url_test(Acs, "doi.org/10.1021/acs.jcim.1c00203" , True) + self.can_use_url_test(Acs, "10.1021/acs.jcim.1c00203" , True) + self.can_use_url_test(Acs, " 10.1021/acs.jcim.1c00203" , True) + self.can_use_url_test(Acs, "10.1021/acs.jcim.1c00203 " , True) + self.can_use_url_test(Acs, "\t 10.1021/acs.jcim.1c00203 \t\n" , True) + self.can_use_url_test(Acs, "https://pubs.acs.org/doi/10.1021/acs.jcim.1c00203" , True) + + # Negative Testing + self.can_use_url_test(Acs, "" , False) + self.can_use_url_test(Acs, "https://doi.org/10.1038/219021a0" , False) + self.can_use_url_test(Acs, "https://www.nature.com/articles/219021a0" , False) + self.can_use_url_test(Acs, "https://pubs.acs.org/doi/doi.org/10.1021/acs.jcim.1c00203", False) + + + + def test_acs_publication(self): + url = "https://doi.org/10.1021/acs.jcim.1c00203" + self.get_publication_test(Acs, url, self.expectedPubs[url]) + + def test_acs_exceptions(self): + test_url= "https://doi.org/10.1021/acs.jcim.1c002" + self.get_publication_exception_test(Acs, test_url) + + # Dictionary of Expected Results, with url + expectedPubs = { + "https://doi.org/10.1021/acs.jcim.1c00203": + Publication( + doi_url = "https://doi.org/10.1021/acs.jcim.1c00203", + title = "AutoDock Vina 1.2.0: New Docking Methods, Expanded Force Field, and Python Bindings", + contributors = ["Jerome Eberhardt", "Diogo Santos-Martins", "Andreas F. Tillack", "Stefano Forli"], + journal="Journal of Chemical Information and Modeling", + publication_date = "July 19, 2021", + subjects = ["Algorithms","Ligands","Molecules","Receptors","Macrocycles"], + references = [ + Citation(doi_url = "https://doi.org/10.1002/jcc.21334" + , title ="AutoDock Vina: improving the speed and accuracy of docking with a new scoring function, efficient optimization, and multithreading" + , journal="Journal of Computational Chemistry" + , contributors=["Trott, O.", "Olson, A. J."] + , cit_type="Reference") + , Citation(doi_url = "https://doi.org/10.1038/nprot.2016.051" + , title ="Computational protein-ligand docking and virtual drug screening with the AutoDock suite" + , journal="Journal of Natural Products" + , contributors=["Forli, S.","Huey, R.","Pique, M. E.","Sanner, M. F.","Goodsell, D. S.","Olson, A. J."] + , cit_type="Reference") + , Citation(title = "A semiempirical free energy force field with charge-based desolvation" + , doi_url = "https://doi.org/10.1002/jcc.20634" + , journal="Journal of Computational Chemistry" + , contributors=["Huey, R.","Morris, G. M.","Olson, A. J.","Goodsell, D. S."] + , cit_type="Reference") + , Citation(title="Accelerating autodock4 with gpus and gradient-based local search" + , doi_url="https://doi.org/10.1021/acs.jctc.0c01006" + , journal="Journal of Chemical Theory and Computation" + , contributors=["Santos-Martins, D.","Solis-Vasquez, L.","Tillack, A. F.","Sanner, M. F.","Koch, A.","Forli, S."] + , cit_type="Reference") + , Citation(title="AutoDockFR: Advances in Protein-Ligand Docking with Explicitly Specified Binding Site Flexibility" + , doi_url="https://doi.org/10.1371/journal.pcbi.1004586" + , journal="PLoS Computational Biology" + , contributors=["Ravindranath, P. A.","Forli, S.","Goodsell, D. S.","Olson, A. J.","Sanner, M. F."] + , cit_type="Reference") + , Citation(title="Docking flexible cyclic peptides with AutoDock CrankPep" + , doi_url="https://doi.org/10.1021/acs.jctc.9b00557" + , journal="Journal of Chemical Theory and Computation" + , contributors=["Zhang, Y.","Sanner, M. F."] + , cit_type="Reference") + , Citation(title="Fast, accurate, and reliable molecular docking with QuickVina 2" + , doi_url="https://doi.org/10.1093/bioinformatics/btv082" + , journal="Bioinformatics" + , contributors=["Alhossary, A.","Handoko, S. D.","Mu, Y.","Kwoh, C.-K."] + , cit_type="Reference") + , Citation(title="Lessons learned in empirical scoring with smina from the CSAR 2011 benchmarking exercise" + , doi_url="https://doi.org/10.1021/ci300604z" + , journal="Journal of Chemical Information and Modeling" + , contributors=["Koes, D. R.","Baumgartner, M. P.","Camacho, C. J."] + , cit_type="Reference") + , Citation(title="Vina-Carb: Improving Glycosidic Angles during Carbohydrate Docking" + , doi_url="https://doi.org/10.1021/acs.jctc.5b00834" + , journal="Journal of Chemical Theory and Computation" + , contributors=["Nivedha, A. K.","Thieker, D. F.","Makeneni, S.","Hu, H.","Woods, R. J."] + , cit_type="Reference") + , Citation(title="AutoDock VinaXB: implementation of XBSF, new empirical halogen bond scoring function, into AutoDock Vina" + , doi_url="https://doi.org/10.1186/s13321-016-0139-1" + , journal="Journal of Cheminformatics" + , contributors=["Koebel, M. R.","Schmadeke, G.","Posner, R. G.","Sirimulla, S."] + , cit_type="Reference") + , Citation(title="Vinardo: A Scoring Function Based on Autodock Vina Improves Scoring, Docking, and Virtual Screening" + , doi_url="https://doi.org/10.1371/journal.pone.0155183" + , journal="PLoS One" + , contributors=["Quiroga, R.","Villarreal, M. A."] + , cit_type="Reference") + , Citation(title="Lennard-Jones potential and dummy atom settings to overcome the AUTODOCK limitation in treating flexible ring systems" + , doi_url="https://doi.org/10.1021/ci700036j" + , journal="Journal of Chemical Information and Modeling" + , contributors=["Forli, S.","Botta, M."] + , cit_type="Reference") + , Citation(title="AutoDock4Zn: an improved AutoDock force field for small-molecule docking to zinc metalloproteins" + , doi_url="https://doi.org/10.1021/ci500209e" + , journal="Journal of Chemical Information and Modeling" + , contributors=["Santos-Martins, D.","Forli, S.","Ramos, M. J.","Olson, A. J."] + , cit_type="Reference") + , Citation(title="A force field with discrete displaceable waters and desolvation entropy for hydrated ligand docking" + , doi_url="https://doi.org/10.1021/jm2005145" + , journal="Journal of Medicinal Chemistry" + , contributors=["Forli, S.","Olson, A. J."] + , cit_type="Reference") + , Citation(title="Directional phosphorylation and nuclear transport of the splicing factor SRSF1 is regulated by an RNA recognition motif" + , doi_url="https://doi.org/10.1016/j.jmb.2016.04.009" + , journal="Journal of Molecular Biology" + , contributors=["Serrano, P.","Aubol, B. E.","Keshwani, M. M.","Forli, S.","Ma, C.-T.","Dutta, S. K.","Geralt, M.","Wüthrich, K.","Adams, J. A."] + , cit_type="Reference") + , Citation(title="Covalent docking using autodock: Two-point attractor and flexible side chain methods" + , doi_url="https://doi.org/10.1002/pro.2733" + , journal="Protein Science" + , contributors=["Bianco, G.","Forli, S.","Goodsell, D. S.","Olson, A. J."] + , cit_type="Reference") + , Citation(title="Consensus docking: improving the reliability of docking in a virtual screening context" + , doi_url="https://doi.org/10.1021/ci300399w" + , journal="Journal of Chemical Information and Modeling" + , contributors=["Houston, D. R.","Walkinshaw, M. D."] + , cit_type="Reference") + , Citation(title="DockBench: an integrated informatic platform bridging the gap between the robust validation of docking protocols and virtual screening simulations" + , doi_url="https://doi.org/10.3390/molecules20069977" + , journal="Molecules" + , contributors=["Cuzzolin, A.","Sturlese, M.","Malvacio, I.","Ciancetta, A.","Moro, S."] + , cit_type="Reference") + , Citation(title="A new force field for molecular mechanical simulation of nucleic acids and proteins" + , doi_url="https://doi.org/10.1021/ja00315a051" + , journal="Journal of the American Chemical Society" + , contributors=["Weiner, S. J.","Kollman, P. A.","Case, D. A.","Singh, U. C.","Ghio, C.","Alagona, G.","Profeta, S.","Weiner, P."] + , cit_type="Reference") + , Citation(title="AutoDock Bias: improving binding mode prediction and virtual screening using known protein-ligand interactions" + , doi_url="https://doi.org/10.1093/bioinformatics/btz152" + , journal="Bioinformatics" + , contributors=["Arcon, J. P.","Modenutti, C. P.","Avendaño, D.","Lopez, E. D.","Defelipe, L. A.","Ambrosio, F. A.","Turjanski, A. G.","Forli, S.","Marti, M. A."] + , cit_type="Reference") + , Citation(title="Inhomogeneous Fluid Approach to Solvation Thermodynamics. 1. Theory" + , doi_url="https://doi.org/10.1021/jp9723574" + , journal="Journal of Physical Chemistry B" + , contributors=["Lazaridis, T."] + , cit_type="Reference") + , Citation(title="Inhomogeneous fluid approach to solvation thermodynamics. 2. Applications to simple fluids" + , doi_url="https://doi.org/10.1021/jp972358w" + , journal="Journal of Physical Chemistry B" + , contributors=["Lazaridis, T."] + , cit_type="Reference") + , Citation(title="Grid inhomogeneous solvation theory: Hydration structure and thermodynamics of the miniature receptor cucurbit[7]uril" + , doi_url="https://doi.org/10.1063/1.4733951" + , journal="Journal of Chemical Physics" + , contributors=["Nguyen, C. N.","Young, T. K.","Gilson, M. K."] + , cit_type="Reference") + , Citation(title="AutoDock-GIST: Incorporating Thermodynamics of Active-Site Water into Scoring Function for Accurate Protein-Ligand Docking" + , doi_url="https://doi.org/10.3390/molecules21111604" + , journal="Molecules" + , contributors=["Uehara, S.","Tanaka, S."] + , cit_type="Reference") + , Citation(title="ZINC20—A Free Ultralarge-Scale Chemical Database for Ligand Discovery" + , doi_url="https://doi.org/10.1021/acs.jcim.0c00675" + , journal="Journal of Chemical Information and Modeling" + , contributors=["Irwin, J. J.","Tang, K. G.","Young, J.","Dandarchuluun, C.","Wong, B. R.","Khurelbaatar, M.","Moroz, Y. S.","Mayfield, J.","Sayle, R. A."] + , cit_type="Reference") + , Citation(title="Structural biology-inspired discovery of novel KRAS–PDEδ inhibitors" + , doi_url="https://doi.org/10.1021/acs.jmedchem.7b01243" + , journal="Journal of Medicinal Chemistry" + , contributors=["Jiang, Y.","Zhuang, C.","Chen, L.","Lu, J.","Dong, G.","Miao, Z.","Zhang, W.","Li, J.","Sheng, C."] + , cit_type="Reference") + , Citation(title="D3R grand challenge 2015: evaluation of protein–ligand pose and affinity predictions" + , doi_url="https://doi.org/10.1007/s10822-016-9946-8" + , journal="Journal of Computer-Aided Molecular Design" + , contributors=["Gathiaka, S.","Liu, S.","Chiu, M.","Yang, H.","Stuckey, J. A.","Kang, Y. N.","Delproposto, J.","Kubish, G.","Dunbar, J. B.","Carlson, H. A.","Burley, S. K.","Walters, W. P.","Amaro, R. E.","Feher, V. A.","Gilson, M. K."] + , cit_type="Reference") + , Citation(title="D3R grand challenge 4: blind prediction of protein–ligand poses, affinity rankings, and relative binding free energies" + , doi_url="https://doi.org/10.1007/s10822-020-00289-y" + , journal="Journal of Computer-Aided Molecular Design" + , contributors=["Parks, C. D.","Gaieb, Z.","Chiu, M.","Yang, H.","Shao, C.","Walters, W. P.","Jansen, J. M.","McGaughey, G.","Lewis, R. A.","Bembenek, S. D.","Ameriks, M. K.","Mirzadegan, T.","Burley, S. K.","Amaro, R. E.","Gilson, M. K."] + , cit_type="Reference") + , Citation(title="D3R Grand Challenge 4: prospective pose prediction of BACE1 ligands with AutoDock-GPU" + , doi_url="https://doi.org/10.1007/s10822-019-00241-9" + , journal="Journal of Computer-Aided Molecular Design" + , contributors=["Santos-Martins, D.","Eberhardt, J.","Bianco, G.","Solis-Vasquez, L.","Ambrosio, F. A.","Koch, A.","Forli, S."] + , cit_type="Reference") + , Citation(title="Comparison of affinity ranking using AutoDock-GPU and MM-GBSA scores for BACE-1 inhibitors in the D3R Grand Challenge 4" + , doi_url="https://doi.org/10.1007/s10822-019-00240-w" + , journal="Journal of Computer-Aided Molecular Design" + , contributors=["El Khoury, L.","Santos-Martins, D.","Sasmal, S.","Eberhardt, J.","Bianco, G.","Ambrosio, F. A.","Solis-Vasquez, L.","Koch, A.","Forli, S.","Mobley, D. L."] + , cit_type="Reference") + , Citation(title="Macrocycle modeling in ICM: benchmarking and evaluation in D3R Grand Challenge 4" + , doi_url="https://doi.org/10.1007/s10822-019-00225-9" + , journal="Journal of Computer-Aided Molecular Design" + , contributors=["Lam, P. C.-H.","Abagyan, R.","Totrov, M."] + , cit_type="Reference") + , Citation(title="Directory of useful decoys, enhanced (DUD-E): better ligands and decoys for better benchmarking" + , doi_url="https://doi.org/10.1021/jm300687e" + , journal="Journal of Medicinal Chemistry" + , contributors=["Mysinger, M. M.","Carchia, M.","Irwin, J. J.","Shoichet, B. K."] + , cit_type="Reference") + , Citation(title="Evaluation of AutoDock and AutoDock Vina on the CASF-2013 benchmark" + , doi_url="https://doi.org/10.1021/acs.jcim.8b00312" + , journal="Journal of Chemical Information and Modeling" + , contributors=["Gaillard, T."] + , cit_type="Reference") + , Citation(title="Autodock vina adopts more accurate binding poses but autodock4 forms better binding affinity" + , doi_url="https://doi.org/10.1021/acs.jcim.9b00778" + , journal="Journal of Chemical Information and Modeling" + , contributors=["Nguyen, N. T.","Nguyen, T. H.","Pham, T. N. H.","Huy, N. T.","Bay, M. V.","Pham, M. Q.","Nam, P. C.","Vu, V. V.","Ngo, S. T."] + , cit_type="Reference") + , Citation(title="Development and validation of a genetic algorithm for flexible docking" + , doi_url="https://doi.org/10.1006/jmbi.1996.0897" + , journal="Journal of Molecular Biology" + , contributors=["Jones, G.","Willett, P.","Glen, R. C.","Leach, A. R.","Taylor, R."] + , cit_type="Reference") + , Citation(title="Glide: a new approach for rapid, accurate docking and scoring. 1. Method and assessment of docking accuracy" + , doi_url="https://doi.org/10.1021/jm0306430" + , journal="Journal of Medicinal Chemistry" + , contributors=["Friesner, R. A.","Banks, J. L.","Murphy, R. B.","Halgren, T. A.","Klicic, J. J.","Mainz, D. T.","Repasky, M. P.","Knoll, E. H.","Shelley, M.","Perry, J. K."] + , cit_type="Reference") + , Citation(title="Surflex: fully automatic flexible molecular docking using a molecular similarity-based search engine" + , doi_url="https://doi.org/10.1021/jm020406h" + , journal="Journal of Medicinal Chemistry" + , contributors=["Jain, A. N."] + , cit_type="Reference") + , Citation(title="A fast flexible docking method using an incremental construction algorithm" + , doi_url="https://doi.org/10.1006/jmbi.1996.0477" + , journal="Journal of Molecular Biology" + , contributors=["Rarey, M.","Kramer, B.","Lengauer, T.","Klebe, G."] + , cit_type="Reference") + , Citation(title="EDock: blind protein–ligand docking by replica-exchange monte carlo simulation" + , doi_url="https://doi.org/10.1186/s13321-020-00440-9" + , journal="Journal of Cheminformatics" + , contributors=["Zhang, W.","Bell, E. W.","Yin, M.","Zhang, Y."] + , cit_type="Reference") + , Citation(title="DOCK 6: Impact of new features and current docking performance" + , doi_url="https://doi.org/10.1002/jcc.23905" + , journal="Journal of Computational Chemistry" + , contributors=["Allen, W. J.","Balius, T. E.","Mukherjee, S.","Brozell, S. R.","Moustakas, D. T.","Lang, P. T.","Case, D. A.","Kuntz, I. D.","Rizzo, R. C."] + , cit_type="Reference") + , Citation(title="Improving scoring-docking-screening powers of protein–ligand scoring functions using random forest" + , doi_url="https://doi.org/10.1002/jcc.24667" + , journal="Journal of Computational Chemistry" + , contributors=["Wang, C.","Zhang, Y."] + , cit_type="Reference") + , Citation(title="ID-Score: a new empirical scoring function based on a comprehensive set of descriptors related to protein–ligand interactions" + , doi_url="https://doi.org/10.1021/ci300493w" + , journal="Journal of Chemical Information and Modeling" + , contributors=["Li, G.-B.","Yang, L.-L.","Wang, W.-J.","Li, L.-L.","Yang, S.-Y."] + , cit_type="Reference") + , Citation(title="Further development and validation of empirical scoring functions for structure-based binding affinity prediction" + , doi_url="https://doi.org/10.1023/a:1016357811882" + , journal="Journal of Computer-Aided Molecular Design" + , contributors=["Wang, R.","Lai, L.","Wang, S."] + , cit_type="Reference") + , Citation(title="A knowledge-based energy function for protein- ligand, protein- protein, and protein- DNA complexes" + , doi_url="https://doi.org/10.1021/jm049314d" + , journal="Journal of Medicinal Chemistry" + , contributors=["Zhang, C.","Liu, S.","Zhu, Q.","Zhou, Y."] + , cit_type="Reference") + , Citation(title="DLIGAND2: an improved knowledge-based energy function for protein–ligand interactions using the distance-scaled, finite, ideal-gas reference state" + , doi_url="https://doi.org/10.1186/s13321-019-0373-4" + , journal="Journal of Cheminformatics" + , contributors=["Chen, P.","Ke, Y.","Lu, Y.","Du, Y.","Li, J.","Yan, H.","Zhao, H.","Zhou, Y.","Yang, Y."] + , cit_type="Reference") + , Citation(title="Comparing AutoDock and Vina in ligand/decoy discrimination for virtual screening" + , doi_url="https://doi.org/10.3390/app9214538" + , journal="Applied Science" + , contributors=["Vieira, T. F.","Sousa, S. F."] + , cit_type="Reference") + , Citation(title="Benchmark of four popular virtual screening programs: construction of the active/decoy dataset remains a major determinant of measured performance" + , doi_url="https://doi.org/10.1186/s13321-016-0167-x" + , journal="Journal of Cheminformatics" + , contributors=["Chaput, L.","Martinez-Sanz, J.","Quiniou, E.","Rigolet, P.","Saettel, N.","Mouawad, L."] + , cit_type="Reference") + , Citation(title="Array programming with NumPy" + , doi_url="https://doi.org/10.1038/s41586-020-2649-2" + , journal="Nature" + , contributors=["Harris, C. R."] + , cit_type="Reference") + , Citation(title="Matplotlib: A 2D graphics environment" + , doi_url="https://doi.org/10.1109/mcse.2007.55" + , journal="Computing in Science & Engineering" + , contributors=["Hunter, J. D."] + , cit_type="Reference") + ], citations = [ + Citation(doi_url = "https://doi.org/10.1021/acsomega.1c04320" + , title ="Novel Anti-Hepatitis B Virus Activity of Euphorbia schimperi and Its Quercetin and Kaempferol Derivatives" + , journal="ACS Omega" + , contributors=["Mohammad K. Parvez","Sarfaraz Ahmed","Mohammed S. Al-Dosari","Mazin A. S. Abdelwahid","Ahmed H. Arbab","Adnan J. Al-Rehaily","Mai M. Al-Oqail"],cit_type="Citation"), + + ] + ) + } \ No newline at end of file diff --git a/input/test/test_input.py b/input/test/test_input.py new file mode 100755 index 0000000..b2ca55f --- /dev/null +++ b/input/test/test_input.py @@ -0,0 +1,82 @@ +import unittest +from input.get.journal_fetcher import JournalFetcher +from input.interface import InputInterface +from input.publication import Publication + +""" +Testing the Publication fetcher + +Publication 1: 'https://doi.org/10.1021/acs.jcim.1c00203' +Publication 2: 'doi.org/10.1021/acs.jcim.1c00917' +Publication 3: '10.1038/nchem.1781' +Publication 4: '11.12/jaj' +Publication 5: '11.12/' +Publication 6: 'https://doi.org/10.1021/acs.jmedchem.0c01332' # Paper is a PDF +""" +# TODO: Testcases for: +# - Specific Journals: Inherit from FetcherTestCase +# - interface module-importer (test case) +# - Error detection +# - wrong/no Journal_fetchers +# - wrong urls +# - correct Types in publication +# - Edgecases (i.e. paper as pdf, no connection, etc) + + +class InterfaceTestCase(unittest.TestCase): + def setUp(self): + self.assertEqual(InputInterface.instance, None) + self.interface = InputInterface() + + def test_singleton(self): + # interface should already be made in setUp() + self.assertNotEqual(self.interface.instance, None) + new_interface = InputInterface() + self.assertEqual(self.interface, new_interface) + + # def test_imported_modules(self): + # fetchers = self.interface.get_supported_fetchers + +class FetcherTestCase(unittest.TestCase): + + + def can_use_url_test(self, fetcher : JournalFetcher, test_url: str, expected_res: bool): + # Tests the 'can_use_url'-method + self.assertEqual(fetcher.can_use_url(test_url), expected_res) + + + def get_publication_test(self, fetcher : JournalFetcher, test_url: str, expected_res: Publication): + """ + this test asserts that every variable is equals to the expected result + """ + actual_res = fetcher.get_publication(test_url) + self.assertEqual(actual_res.doi_url, expected_res.doi_url) + self.assertEqual(actual_res.title, expected_res.title) + self.assertEqual(actual_res.contributors, expected_res.contributors) + self.assertEqual(actual_res.journal, expected_res.journal) + self.assertEqual(actual_res.publication_date, expected_res.publication_date) + self.assertEqual(actual_res.subjects, expected_res.subjects) + + # Checking for all references + self.assertEqual(len(actual_res.references), len(expected_res.references)) + num_references = len(expected_res.references) + for i in range(num_references): + self.assertEqual(actual_res.references[i].doi_url, expected_res.references[i].doi_url) + self.assertEqual(actual_res.references[i].journal, expected_res.references[i].journal) + self.assertEqual(actual_res.references[i].contributors, expected_res.references[i].contributors) + self.assertEqual(actual_res.references[i].cit_type, expected_res.references[i].cit_type) + + # Checking for all citations + self.assertEqual(len(actual_res.citations), len(expected_res.citations)) + num_citations = len(expected_res.citations) + for i in range(num_citations): + self.assertEqual(actual_res.citations[i].doi_url, expected_res.citations[i].doi_url) + self.assertEqual(actual_res.citations[i].journal, expected_res.citations[i].journal) + self.assertEqual(actual_res.citations[i].contributors, expected_res.citations[i].contributors) + self.assertEqual(actual_res.citations[i].cit_type, expected_res.citations[i].cit_type) + + + def get_publication_exception_test(self, fetcher: JournalFetcher, test_url: str): + # Ckecks + with self.assertRaises(ValueError): + fetcher.get_publication(test_url) \ No newline at end of file diff --git a/input_old/README.md b/input_old/README.md new file mode 100644 index 0000000..76bd11d --- /dev/null +++ b/input_old/README.md @@ -0,0 +1,3 @@ +# Projekt CiS-Projekt 2021/22 +Input-Skripts + diff --git a/input_old/__pycache__/input_fj.cpython-39.pyc b/input_old/__pycache__/input_fj.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3e6099f4ab4c56400b2698c812d4b5fc9a9a7aa GIT binary patch literal 4300 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 literal 0 HcmV?d00001 diff --git a/input_old/example_urls b/input_old/example_urls new file mode 100644 index 0000000..96ac680 --- /dev/null +++ b/input_old/example_urls @@ -0,0 +1,2 @@ +https://pubs.acs.org/doi/10.1021/acs.jcim.5b00332 +https://pubs.acs.org/doi/10.1021/acs.jcim.6b00709 diff --git a/input_old/input_fj.py b/input_old/input_fj.py new file mode 100644 index 0000000..ecc8e68 --- /dev/null +++ b/input_old/input_fj.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python3 +""" +Functions for information retrieval of articles from the ACS journal JCIM + +""" + +__author__ = "Florian Jochens" +__email__ = "fj@andaco.de" +__status__ = "Production" +#__copyright__ = "" +#__credits__ = ["", "", "", ""] +#__license__ = "" +#__version__ = "" +#__maintainer__ = "" + +from bs4 import BeautifulSoup as bs +import requests as req +import sys +from pathlib import Path + +class Publication: + #_registry = [] + _citations = [] + _references = [] + + def __init__(self, title, publication_date, contributors, doi_url, + subjects = None, num_citations = None): + #self._registry.append(self) + self.title = title + self.publication_date = publication_date + self.contributors = contributors + self.doi_url = doi_url + self.subjects = subjects + self.num_citations = num_citations + #self._citations = [] + #self._references = [] + +class Citation: + def __init__(self, title, journal, contributors, doi_url): + self.title = title + self.journal = journal + self.contributors = contributors + self.doi_url = doi_url + +class References: + def __init__(self, title, journal, contributors, doi_url): + self.title = title + self.journal = journal + self.contributors = contributors + self.doi_url = doi_url + +def get_article_info(soup): + header = soup.find('div', class_ = 'article_header-left pull-left') + article_title = header.find('span', class_ = 'hlFld-Title').text + publication_date = header.find('span', class_ = 'pub-date-value').text + for link in header.find('div', class_ = 'article_header-doiurl'): + doi_url = link.get('href') + subs = header.find('div', class_ = 'article_header-taxonomy') + subjects = [] + for sub in subs.find_all('a'): + subjects.append(sub.get('title')) + cons = header.find('ul', class_ = 'loa') + contributors = [] + for con in cons.find_all('span', class_ = 'hlFld-ContribAuthor'): + contributors.append(con.text) + numc = header.find('div', class_ = 'articleMetrics_count') + if not numc.a: + num_citations = 0 + else: + num_citations = numc.a.text + + pub = Publication(article_title, publication_date, contributors, doi_url, + subjects, num_citations) + return pub + +def get_download_url(): + export = soup.find('div', class_ = 'cit-download-dropdown_content') + url = 'https://pubs.acs.org' + for link in export.find_all('a'): + if link.get('title') == 'Citation and references': + url += link.get('href') + print(url) + return url + +def download(url): # Download citation and references file + if url.find('='): + filename = url.rsplit('=', 1)[1] + path = Path(('./files/' + filename)) + if path.is_file(): + print("File already exists") + else: + print("File does not exist") + +def get_citation_info(pub, num_citations, soup): + pub._citations = [] + details = soup.find('ol', class_ = 'cited-content_cbyCitation') + titles = [] + for title in details.find_all('span', + class_ = 'cited-content_cbyCitation_article-title'): + titles.append(title.text.replace('.', '')) + journal_names = [] + for name in details.find_all('span', + class_ = 'cited-content_cbyCitation_journal-name'): + journal_names.append(name.text) + doi_urls = [] + for url in details.find_all('a'): + doi_urls.append(url.get('href')) + contributors = [] + for contrib in details.find_all('span', + class_ = 'cited-content_cbyCitation_article-contributors'): + contributors.append(contrib.text) + for i in range(0, int(num_citations)): + pub._citations.append(Citation(titles[i], journal_names[i], + contributors[i], doi_urls[i])) +def print_pub_info(pub): + print(f'''Article title: {pub.title} +Publication date: {pub.publication_date} +DOI-URL: {pub.doi_url} + +Subjects:''') + print(*(pub.subjects), sep = ", ") + print('\nContributors:') + print(*(pub.contributors), sep = ", ") + + if int(pub.num_citations) > 0: + if int(pub.num_citations) == 1: + print(f'\nThis publication is cited by the following publication:\n') + else: + print(f'\nThis publication is cited by the following {pub.num_citations} publications:\n') + for citation in pub._citations: + print(f''' + Title: {citation.title} + Journal: {citation.journal} + Contributors: {citation.contributors} + DOI-URL: {citation.doi_url} + ''') + else: + print('\nThis publication is not cited by any other publication.') + +def input(url): + html_text = req.get(url).text + soup = bs(html_text, 'html.parser') + + pub = get_article_info(soup) + if int(pub.num_citations) > 0: + get_citation_info(pub, int(pub.num_citations), soup) + return pub + +#if len(sys.argv) != 2: +# sys.stderr.write('Usage: {} <url>\n'.format(sys.argv[0])) +# exit(1) +#url = sys.argv[1] +#pub = input(url) +#print_pub_info(pub) diff --git a/input_old/pub.py b/input_old/pub.py new file mode 100644 index 0000000..13b90e8 --- /dev/null +++ b/input_old/pub.py @@ -0,0 +1,32 @@ +class Publication: + #_registry = [] + #_citations = [] + #_references = [] + + def __init__(self, title, publication_date, contributors, doi_url, + subjects, num_citations): + #self._registry.append(self) + self.title = title + self.publication_date = publication_date + self.contributors = contributors + self.doi_url = doi_url + self.subjects = subjects + self.num_citations = num_citations + self.num_references = num_references + self._citations = [] + self._references = [] + +class Citation: + def __init__(self, title, journal, contributors, doi_url): + self.title = title + self.journal = journal + self.contributors = contributors + self.doi_url = doi_url + +class References: + def __init__(self, title, journal, contributors, doi_url): + self.title = title + self.journal = journal + self.contributors = contributors + self.doi_url = doi_url + diff --git a/input_old/test.py b/input_old/test.py new file mode 100755 index 0000000..dc623ca --- /dev/null +++ b/input_old/test.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 + +from input_fj import input, print_pub_info +import sys + +if len(sys.argv) != 3: + sys.stderr.write('Usage: {} <url> <url>\n'.format(sys.argv[0])) + exit(1) +url = sys.argv[1] +url2 = sys.argv[2] +pub = input(url) +print_pub_info(pub) +pub2 = input(url2) +print_pub_info(pub2) + diff --git a/input_old/x b/input_old/x new file mode 100644 index 0000000..c8ade9d --- /dev/null +++ b/input_old/x @@ -0,0 +1,234 @@ +Article title: Feasibility of Active Machine Learning for Multiclass Compound Classification +Publication date: January 7, 2016 +DOI-URL: https://doi.org/10.1021/acs.jcim.5b00332 + +Subjects: +Algorithms, Molecules, Drug discovery, Screening assays, Receptors + +Contributors: +Tobias Lang, Florian Flachsenberg, Ulrike von Luxburg, Matthias Rarey + +This publication is cited by the following 30 publications: + + + Title: Concepts of Artificial Intelligence for Computer-Assisted Drug Discovery + Journal: Chemical Reviews + Contributors: Xin Yang, Yifei Wang, Ryan Byrne, Gisbert Schneider, Shengyong Yang. + DOI-URL: https://doi.org/10.1021/acs.chemrev.8b00728 + + + Title: De Novo Molecule Design by Translating from Reduced Graphs to SMILES + Journal: Journal of Chemical Information and Modeling + Contributors: Peter Pogány, Navot Arad, Sam Genway, Stephen D. Pickett. + DOI-URL: https://doi.org/10.1021/acs.jcim.8b00626 + + + Title: Designing Algorithms To Aid Discovery by Chemical Robots + Journal: ACS Central Science + Contributors: Alon B. Henson, Piotr S. Gromski, Leroy Cronin. + DOI-URL: https://doi.org/10.1021/acscentsci.8b00176 + + + Title: Modeling Kinase Inhibition Using Highly Confident Data Sets + Journal: Journal of Chemical Information and Modeling + Contributors: Sorin Avram, Alina Bora, Liliana Halip, Ramona Curpăn. + DOI-URL: https://doi.org/10.1021/acs.jcim.7b00729 + + + Title: Predictive Models for Fast and Effective Profiling of Kinase Inhibitors + Journal: Journal of Chemical Information and Modeling + Contributors: Alina Bora, Sorin Avram, Ionel Ciucanu, Marius Raica, and Stefana Avram . + DOI-URL: https://doi.org/10.1021/acs.jcim.5b00646 + + + Title: Evaluation of categorical matrix completion algorithms: toward improved active learning for drug discovery + Journal: Bioinformatics + Contributors: Huangqingbo Sun, Robert F Murphy, . + DOI-URL: https://doi.org/10.1093/bioinformatics/btab322 + + + Title: An Artificial Intelligence Approach Based on Hybrid CNN-XGB Model to Achieve High Prediction Accuracy through Feature Extraction, Classification and Regression for Enhancing Drug Discovery in Biomedicine + Journal: International Journal of Biology and Biomedical Engineering + Contributors: Mukesh Madanan, Biju T. Sayed, Nurul Akhmal Mohd Zulkefli, Nitha C. Velayudhan. + DOI-URL: https://doi.org/10.46300/91011.2021.15.22 + + + Title: Artificial Intelligence in Medicinal Chemistry + Journal: + Contributors: Edward Griffen, Alexander Dossetter, Andrew Leach, Shane Montague. + DOI-URL: https://doi.org/10.1002/0471266949.bmc267 + + + Title: Practical Chemogenomic Modeling and Molecule Discovery Strategies Unveiled by Active Learning + Journal: + Contributors: J.B. Brown. + DOI-URL: https://doi.org/10.1016/B978-0-12-801238-3.11533-8 + + + Title: Machine learning phases and criticalities without using real data for training + Journal: Physical Review B + Contributors: D.-R. Tan, F.-J. Jiang. + DOI-URL: https://doi.org/10.1103/PhysRevB.102.224434 + + + Title: Active learning effectively identifies a minimal set of maximally informative and asymptotically performant cytotoxic structure–activity patterns in NCI-60 cell lines + Journal: RSC Medicinal Chemistry + Contributors: Takumi Nakano, Shunichi Takeda, J.B. Brown. + DOI-URL: https://doi.org/10.1039/D0MD00110D + + + Title: Active learning efficiently converges on rational limits of toxicity prediction and identifies patterns for molecule design + Journal: Computational Toxicology + Contributors: Ahsan Habib Polash, Takumi Nakano, Christin Rakers, Shunichi Takeda, J.B. Brown. + DOI-URL: https://doi.org/10.1016/j.comtox.2020.100129 + + + Title: Practical considerations for active machine learning in drug discovery + Journal: Drug Discovery Today: Technologies + Contributors: Daniel Reker. + DOI-URL: https://doi.org/10.1016/j.ddtec.2020.06.001 + + + Title: Designing compact training sets for data-driven molecular property prediction through optimal exploitation and exploration + Journal: Molecular Systems Design & Engineering + Contributors: Bowen Li, Srinivas Rangarajan. + DOI-URL: https://doi.org/10.1039/C9ME00078J + + + Title: Applicability Domain of Active Learning in Chemical Probe Identification: Convergence in Learning from Non-Specific Compounds and Decision Rule Clarification + Journal: Molecules + Contributors: Ahsan Habib Polash, Takumi Nakano, Shunichi Takeda, J.B. Brown. + DOI-URL: https://doi.org/10.3390/molecules24152716 + + + Title: Capturing and applying knowledge to guide compound optimisation + Journal: Drug Discovery Today + Contributors: Matthew Segall, Tamsin Mansley, Peter Hunt, Edmund Champness. + DOI-URL: https://doi.org/10.1016/j.drudis.2019.02.004 + + + Title: A novel graph kernel on chemical compound classification + Journal: Journal of Bioinformatics and Computational Biology + Contributors: Qiangrong Jiang, Jiajia Ma. + DOI-URL: https://doi.org/10.1142/S0219720018500269 + + + Title: Accelerating Drug Discovery Using Convolution Neural Network Based Active Learning + Journal: + Contributors: Pengfei Liu, Kwong-Sak Leung. + DOI-URL: https://doi.org/10.1109/TENCON.2018.8650298 + + + Title: An Adaptive Lightweight Security Framework Suited for IoT + Journal: + Contributors: Menachem Domb. + DOI-URL: https://doi.org/10.5772/intechopen.73712 + + + Title: Adaptive mining and model building of medicinal chemistry data with a multi-metric perspective + Journal: Future Medicinal Chemistry + Contributors: JB Brown. + DOI-URL: https://doi.org/10.4155/fmc-2018-0188 + + + Title: Chemogenomic Active Learning's Domain of Applicability on Small, Sparse qHTS Matrices: A Study Using Cytochrome P450 and Nuclear Hormone Receptor Families + Journal: ChemMedChem + Contributors: Christin Rakers, Rifat Ara Najnin, Ahsan Habib Polash, Shunichi Takeda, J.B. Brown. + DOI-URL: https://doi.org/10.1002/cmdc.201700677 + + + Title: Automating drug discovery + Journal: Nature Reviews Drug Discovery + Contributors: Gisbert Schneider. + DOI-URL: https://doi.org/10.1038/nrd.2017.232 + + + Title: Classifiers and their Metrics Quantified + Journal: Molecular Informatics + Contributors: J. B. Brown. + DOI-URL: https://doi.org/10.1002/minf.201700127 + + + Title: Active Search for Computer-aided Drug Design + Journal: Molecular Informatics + Contributors: Dino Oglic, Steven A. Oatley, Simon J. F. Macdonald, Thomas Mcinally, Roman Garnett, Jonathan D. Hirst, Thomas Gärtner. + DOI-URL: https://doi.org/10.1002/minf.201700130 + + + Title: Selection of Informative Examples in Chemogenomic Datasets + Journal: + Contributors: Daniel Reker, J. B. Brown. + DOI-URL: https://doi.org/10.1007/978-1-4939-8639-2_13 + + + Title: The value of prior knowledge in machine learning of complex network systems + Journal: Bioinformatics + Contributors: Dana Ferranti, David Krane, David Craft, . + DOI-URL: https://doi.org/10.1093/bioinformatics/btx438 + + + Title: Lightweight adaptive Random-Forest for IoT rule generation and execution + Journal: Journal of Information Security and Applications + Contributors: Menachem Domb, Elisheva Bonchek-Dokow, Guy Leshem. + DOI-URL: https://doi.org/10.1016/j.jisa.2017.03.001 + + + Title: Active learning for computational chemogenomics + Journal: Future Medicinal Chemistry + Contributors: Daniel Reker, Petra Schneider, Gisbert Schneider, JB Brown. + DOI-URL: https://doi.org/10.4155/fmc-2016-0197 + + + Title: Small Random Forest Models for Effective Chemogenomic Active Learning + Journal: Journal of Computer Aided Chemistry + Contributors: Christin Rakers, Daniel Reker, J.B. Brown. + DOI-URL: https://doi.org/10.2751/jcac.18.124 + + + Title: Large-Scale Off-Target Identification Using Fast and Accurate Dual Regularized One-Class Collaborative Filtering and Its Application to Drug Repurposing + Journal: PLOS Computational Biology + Contributors: Hansaim Lim, Aleksandar Poleksic, Yuan Yao, Hanghang Tong, Di He, Luke Zhuang, Patrick Meng, Lei Xie, . + DOI-URL: https://doi.org/10.1371/journal.pcbi.1005135 + +Article title: Matched Molecular Series: Measuring SAR Similarity +Publication date: May 1, 2017 +DOI-URL: https://doi.org/10.1021/acs.jcim.6b00709 + +Subjects: +Substituents, Mathematical methods, Structure activity relationship, Biological databases + +Contributors: +Emanuel S. R. Ehmki, Christian Kramer + +This publication is cited by the following 5 publications: + + + Title: Matched Molecular Series Analysis for ADME Property Prediction + Journal: Journal of Chemical Information and Modeling + Contributors: Mahendra Awale, Sereina Riniker, Christian Kramer. + DOI-URL: https://doi.org/10.1021/acs.jcim.0c00269 + + + Title: Approaches using AI in medicinal chemistry + Journal: + Contributors: Christian Tyrchan, Eva Nittinger, Dea Gogishvili, Atanas Patronov, Thierry Kogej. + DOI-URL: https://doi.org/10.1016/B978-0-12-822249-2.00002-5 + + + Title: Bioactivity Prediction Based on Matched Molecular Pair and Matched Molecular Series Methods + Journal: Current Pharmaceutical Design + Contributors: Xiaoyu Ding, Chen Cui, Dingyan Wang, Jihui Zhao, Mingyue Zheng, Xiaomin Luo, Hualiang Jiang, Kaixian Chen. + DOI-URL: https://doi.org/10.2174/1381612826666200427111309 + + + Title: BRADSHAW: a system for automated molecular design + Journal: Journal of Computer-Aided Molecular Design + Contributors: Darren V. S. Green, Stephen Pickett, Chris Luscombe, Stefan Senger, David Marcus, Jamel Meslamani, David Brett, Adam Powell, Jonathan Masson. + DOI-URL: https://doi.org/10.1007/s10822-019-00234-8 + + + Title: The use of matched molecular series networks for cross target structure activity relationship translation and potency prediction + Journal: MedChemComm + Contributors: Christopher E. Keefer, George Chang. + DOI-URL: https://doi.org/10.1039/C7MD00465F + diff --git a/verarbeitung/Processing.py b/verarbeitung/Processing.py new file mode 100644 index 0000000..0dcc739 --- /dev/null +++ b/verarbeitung/Processing.py @@ -0,0 +1,247 @@ +# -*- coding: utf-8 -*- +""" +Functions to generate a graph representing citations between multiple ACS/Nature journals + +""" + +__authors__ = "Donna Löding, Alina Molkentin, Xinyi Tang, Judith Große, Malte Schokolowski" +__email__ = "cis-project2021@zbh.uni-hamburg.de" +__status__ = "Production" +#__copyright__ = "" +#__credits__ = ["", "", "", ""] +#__license__ = "" +#__version__ = "" +#__maintainer__ = "" + +from bs4 import BeautifulSoup as bs +import requests as req +import sys +from pathlib import Path +from input_fj import input +from input_test import input_test_func +from json_demo import output_to_json + +# adds every publication from input list to graph structure +# doi_input_list: list of publication dois from user +def initialize_nodes_list(doi_input_list, search_depth_max, search_height_max, test_var): + references_pub_obj_list = [] + citations_pub_obj_list = [] + + for pub_doi in doi_input_list: + + #checks if its a test and chooses input function accordingly + if(test_var): + pub = input_test_func(pub_doi) + else: + pub = input(pub_doi) + + # checks if publication already exists in nodes + not_in_nodes = True + for node in nodes: # checks if a pub is already in nodes + if (pub.doi_url == node.doi_url): + not_in_nodes = False + break + if (not_in_nodes): + nodes.append(pub) + pub.group = "input" + else: + doi_input_list.remove(pub_doi) + + # inserts references as publication objects into list and + # inserts first depth references into nodes/edges if maximum search depth > 0 + for reference in create_graph_structure_references(pub, 0, search_depth_max, test_var): + references_pub_obj_list.append(reference) + + # inserts citations as publication objects into list and + # inserts first height citations into nodes if maximum search height > 0 + for citation in create_graph_structure_citations(pub, 0, search_height_max, test_var): + citations_pub_obj_list.append(citation) + + return(references_pub_obj_list, citations_pub_obj_list) + + +# adds edges between citation and reference group +def complete_inner_edges(test_var): + for node in nodes: + if (node.group == "depth"): + for citation in node.citations: + for cit in nodes: + if (citation.doi_url == cit.doi_url and [citation.doi_url, node.doi_url] not in edges): + edges.append([citation.doi_url, node.doi_url]) + if (node.group == "height"): + for reference in node.references: + for ref in nodes: + if (reference.doi_url == ref.doi_url and [node.doi_url, reference.doi_url] not in edges): + edges.append([node.doi_url,reference.doi_url]) + + + +# adds a node for every publication unknown +# adds edges for references between publications +def create_graph_structure_references(pub, search_depth, search_depth_max, test_var): + references_pub_obj_list = [] + for reference in pub.references: + not_in_nodes = True + for node in nodes: + # checks every reference for duplication + if (reference.doi_url == node.doi_url): + not_in_nodes = False + break + if (not_in_nodes): + if (search_depth < search_depth_max): + + #checks if its a test and chooses input function accordingly + if (test_var): + reference_pub_obj = input_test_func(reference.doi_url) + else: + reference_pub_obj = input(reference.doi_url) + + reference_pub_obj.group = "depth" + nodes.append(reference_pub_obj) + edges.append([pub.doi_url,reference_pub_obj.doi_url]) + references_pub_obj_list.append(reference_pub_obj) + + # adds edge only if citation already exists + elif [pub.doi_url,reference.doi_url] not in edges: + edges.append([pub.doi_url,reference.doi_url]) + return references_pub_obj_list + + +# recursive function to implement height-first-search on references +# references_pub_obj_list: input list of references as publication objects +# search_depth: current search_depth of height-first-search +# search_depth_max: maximal search_depth for dfs +def process_references_rec(references_pub_obj_list, search_depth, search_depth_max, test_var): + # adds next level to nodes/edges + for pub in references_pub_obj_list: + new_reference_pub_obj_list = create_graph_structure_references(pub, search_depth, search_depth_max, test_var) + + # If the maximum height has not yet been reached, calls function recursivly with increased height + if (search_depth < search_depth_max): + process_references_rec(new_reference_pub_obj_list, search_depth+1, search_depth_max, test_var) + + + + +# adds a node for every publication unknown +# adds edges for citations between publications +def create_graph_structure_citations(pub, search_height, search_height_max, test_var): + citations_pub_obj_list = [] + for citation in pub.citations: + not_in_nodes = True + for node in nodes: + # checks every citation for duplication + if (citation.doi_url == node.doi_url): + not_in_nodes = False + break + if (not_in_nodes): + if (search_height < search_height_max): + + #checks if its a test and chooses input function accordingly + if (test_var): + citation_pub_obj = input_test_func(citation.doi_url) + else: + citation_pub_obj = input(citation.doi_url) + + citation_pub_obj.group = "height" + nodes.append(citation_pub_obj) + edges.append([citation_pub_obj.doi_url,pub.doi_url]) + citations_pub_obj_list.append(citation_pub_obj) + + # adds only edge if citation already exists + elif [citation.doi_url,pub.doi_url] not in edges: + edges.append([citation.doi_url,pub.doi_url]) + return citations_pub_obj_list + + + +# recursive function to implement height-first-search on citations +# citations_pub_obj_list: input list of citations as publication objects +# search_height: current search_height of height-first-search +# search_height_max: maximal search_height for dfs +def process_citations_rec(citations_pub_obj_list, search_height, search_height_max, test_var): + # adds next level to nodes/edges + for pub in citations_pub_obj_list: + new_citation_pub_obj_list = create_graph_structure_citations(pub, search_height, search_height_max, test_var) + + # If the maximum height has not yet been reached, calls function recursivly with increased height + if (search_height < search_height_max): + process_citations_rec(new_citation_pub_obj_list, search_height+1, search_height_max, test_var) + + + + +# main function to call. Needs as input: +# doi_input_list: input list of dois +# search_height: max search height to process to +# search_depth: max search depth to process to +# test_var: only needed for unit test as True, default is False +def process_main(doi_input_list, search_height, search_depth, test_var = False): + # ERROR-Handling doi_array = NULL + if (len(doi_input_list) == 0): + print("Error, no input data") + + # ERROR- if a negative number is entered for height + if (search_height < 0): + print("Error, search_height of search must be positive") + + # ERROR- if a negative number is entered for depth + if (search_depth < 0): + print("Error, search_depth of search must be positive") + + # create empty array for the nodes + # create empty array for the edges + global nodes, edges + nodes = [] + edges = [] + + # initializes nodes/edges from input and gets a list with publication objects for citations and references returned + references_obj_list, citations_obj_list = initialize_nodes_list(doi_input_list,search_depth, search_height, test_var) + + # function calls to begin recursive processing up to max depth/height + process_citations_rec(citations_obj_list, 1, search_height, test_var) + process_references_rec(references_obj_list, 1, search_depth, test_var) + + # adds edges between reference group and citation group of known publications + complete_inner_edges(test_var) + + # calls a skript to save nodes and edges of graph in .json file + output_to_json(nodes,edges) + + # only for unit tests + if (test_var == True): + doi_nodes_list = [] + for node in nodes: + doi_nodes_list.append(node.doi_url) + return(doi_nodes_list, edges) + + + + +# a function to print nodes and edges from a graph +def print_graph(nodes, edges): + print("Knoten:\n") + for node in nodes: + print(node.title, "\n") + print("\nKanten:\n") + for edge in edges: + print(edge,"\n") + + +# program test, because there is no connection to UI yet. +def try_known_publications(): + doi_list = [] + doi_list.append('https://pubs.acs.org/doi/10.1021/acs.jcim.9b00249') + #arr.append('https://pubs.acs.org/doi/10.1021/acs.jcim.9b00249') + doi_list.append('https://doi.org/10.1021/acs.jmedchem.0c01332') + #arr.append('https://doi.org/10.1021/acs.jcim.0c00741') + + #arr.append('https://doi.org/10.1021/ci700007b') + #arr.append('https://doi.org/10.1021/acs.jcim.5b00292') + #url = sys.argv[1] + #arr.append[url] + + + nodes,edges = process_main(doi_list,2,2) + + print_graph(nodes, edges) \ No newline at end of file diff --git a/verarbeitung/Processing_unittest.py b/verarbeitung/Processing_unittest.py new file mode 100644 index 0000000..772d572 --- /dev/null +++ b/verarbeitung/Processing_unittest.py @@ -0,0 +1,66 @@ +import unittest +from Processing import process_main + +class ProcessingTest(unittest.TestCase): + def testCycle(self): + nodes, edges = process_main(['doiz1'],1,1,True) + self.assertCountEqual(nodes, ['doiz1', 'doiz2']) + self.assertCountEqual(edges, [['doiz1', 'doiz2'], ['doiz2', 'doiz1']]) + + nodes, edges = process_main(['doiz1'],2,2,True) + self.assertCountEqual(nodes, ['doiz1', 'doiz2']) + self.assertCountEqual(edges, [['doiz2', 'doiz1'], ['doiz1', 'doiz2']]) + + #def testBigCycle(self): + + #def testEmptyHeight(self): + + #def testEmptyDepth(self): + + def testEmptyDepthHeight(self): + nodes, edges = process_main(['doi1'],0,0,True) + self.assertCountEqual(nodes,['doi1']) + self.assertCountEqual(edges, []) + + nodes, edges = process_main(['doi1', 'doi2'],0,0,True) + self.assertCountEqual(nodes, ['doi1','doi2']) + self.assertCountEqual(edges, [['doi1', 'doi2']]) + + nodes, edges = process_main(['doi1', 'doi2', 'doi3'],0,0,True) + self.assertCountEqual(nodes, ['doi1','doi2', 'doi3']) + self.assertCountEqual(edges, [['doi3', 'doi1'], ['doi1', 'doi2']]) + + + def testInnerEdges(self): + nodes, edges = process_main(['doi_ie1'],1,1,True) + self.assertCountEqual(nodes,['doi_ie1','doi_ie2','doi_ie3']) + self.assertCountEqual(edges,[['doi_ie1','doi_ie2'],['doi_ie3','doi_ie1'],['doi_ie3','doi_ie2']]) + + def testRightHeight(self): + nodes, edges = process_main(['doi_h01'],1,0,True) + self.assertCountEqual(nodes,['doi_h01']) + self.assertCountEqual(edges, []) + + nodes, edges = process_main(['doi_h02'],1,0,True) + self.assertCountEqual(nodes,['doi_h02','doi_h1']) + self.assertCountEqual(edges, [['doi_h1','doi_h02']]) + + nodes, edges = process_main(['doi_h02'],2,0,True) + self.assertCountEqual(nodes,['doi_h02','doi_h1','doi_h2']) + self.assertCountEqual(edges, [['doi_h1','doi_h02'], ['doi_h2','doi_h1']]) + + def testRightDepth(self): + nodes, edges = process_main(['doi_d01'],0,1,True) + self.assertCountEqual(nodes,['doi_d01']) + self.assertCountEqual(edges, []) + + nodes, edges = process_main(['doi_d02'],0,1,True) + self.assertCountEqual(nodes,['doi_d02','doi_d1']) + self.assertCountEqual(edges, [['doi_d02','doi_d1']]) + + nodes, edges = process_main(['doi_d02'],0,2,True) + self.assertCountEqual(nodes,['doi_d02','doi_d1','doi_d2']) + self.assertCountEqual(edges, [['doi_d02','doi_d1'], ['doi_d1','doi_d2']]) + +if __name__ == "__main__": + unittest.main() \ No newline at end of file diff --git a/verarbeitung/__pycache__/Processing.cpython-36.pyc b/verarbeitung/__pycache__/Processing.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb6d8a0418a1340b746f2f664997515622356d8a GIT binary patch literal 3693 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 literal 0 HcmV?d00001 diff --git a/verarbeitung/__pycache__/Processing.cpython-38.pyc b/verarbeitung/__pycache__/Processing.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63ac529316c848e829cd83ef44ec749e5903bf9e GIT binary patch literal 4009 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 literal 0 HcmV?d00001 diff --git a/verarbeitung/__pycache__/Processing.cpython-39.pyc b/verarbeitung/__pycache__/Processing.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54c63251bbf3affbdd176d3d55f4956c2fc08406 GIT binary patch literal 4045 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 DM|^?B literal 0 HcmV?d00001 diff --git a/verarbeitung/__pycache__/Processing_pub_objs_only.cpython-39.pyc b/verarbeitung/__pycache__/Processing_pub_objs_only.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ce1023e6ea54e1b04b37ad5a1fd08115d5f52a4 GIT binary patch literal 4137 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 C633hX literal 0 HcmV?d00001 diff --git a/verarbeitung/__pycache__/input_fj.cpython-36.pyc b/verarbeitung/__pycache__/input_fj.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04312c91f0a7675651e99a2a6c10a2c9da146758 GIT binary patch literal 4299 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 literal 0 HcmV?d00001 diff --git a/verarbeitung/__pycache__/input_fj.cpython-38.pyc b/verarbeitung/__pycache__/input_fj.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..515ab99c01a5ce78bb5bb6de554a4dae3ffe4b4b GIT binary patch literal 4329 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 LCkH2oD2F5f?ZOc2 literal 0 HcmV?d00001 diff --git a/verarbeitung/__pycache__/input_fj.cpython-39.pyc b/verarbeitung/__pycache__/input_fj.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..175f9ebbfdf5f3313196b4f10aa01dc2e8e20509 GIT binary patch literal 4337 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 MI5;^tIYc=m0eu}6EC2ui literal 0 HcmV?d00001 diff --git a/verarbeitung/__pycache__/input_test.cpython-36.pyc b/verarbeitung/__pycache__/input_test.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85878d6d127d9d2bd5efe9130672d982bb70c5fa GIT binary patch literal 2579 zcmXr!<>mV9xF~TSCj-M{1|-12z`)?Zz`#&^je&u|ogsxGg|USpg|V3_3dCbdVQyha zVQyxMVsvLnVM$?aVMt+ZW{P4;VM}3eVTfW*;Yi_ZVTfW$;Y#6dVTfW);Ys05;Y(*s z;ZG4r5lm-H5lUxF5l-ibVoMQB5lInEXG{@G5l?4G;em>?rwFA;q)4VSrbwkogGAFA z!0I_tWKv{P<Wl6*nNk!|6jPMa8NnE27H5i5igJodifTGjidu?#icC5q7=z@vQrS}3 zQ#n#OQ@PSvqqtKvf*CY5laV~kzy$NL2m=E{Dnk@w3PTiA3S$Zr*gwp{44N#rxC2U) zax#+>OEUBGk~yKeK{QCSGbp%X7#J987;6~f8ETkn7~&agm}?l~nQB;S7~+|0SZf&K zS!&o)7_vEv^wJq>7~)y;xJuY+*qT8)SZmn9G9F+V_B^f<jv98b40{bn4MRL<3PUi1 zCZnGw*Ddyx{LJ{$qMTc-C7C5TskeBN^YcoIGLuS6@{5XZv1jF%7Ud=8+!822I5$2e zu_W~tS5azOYEf!la%%A{=AzWJTb#+6C1CFq-(pVAEV;#+UX)*2pvifQr8qSwtqA0= zB4!2#h9VXa!3rYSKm<F80QtO#n}LC0B|{M}0|UdaK>dvT+*JL<oXk8BF0Iga&J5NK zD9X=D%`VYT&eSc|Er4)z%TkLHi;_|^OG@+7^-(yPc?G2<@g=FnC3*#ww>aYCGxIV_ z;^RS1DV6|*IU^e!axii*aWO*3DiNgE(SvF8(_{gek(Zd88Xtd)D?UCqKczGW#O8^Q zFDy;Wfyfl`gFFQC1lT7Kf)6Cd$iTn=!o?s5a4;5u*d!+$4rgdECxb!{<OvWBG7+3= zlnAC8SlqMXj1o<@A|8-?L55<DGKA;A{sMUzl+=s4K+b`OXq6z$smMWCBmgp65JU)p z2#{t-7@?Ue%)r0^!m!W+u}Kas&LCJS9bCaB1IpoO!6gKDD_P+MiUDbmv7l(<U@QXh zlR-%g6e*yL2g+XHG!ntUz)%rX!r;OX>s8BG!%)MR!YIj*%~Zrz!U$p4Fs3j`g2b7@ zBny~i1(R%Gk{wKPNHR2Y)H2mD1v3<~g)@Lt7N_4!kcBTnHopWp<t51Om!M4l5|rs* zf|Bb?P^Q;py2Y21SzHpIpBA53RFqg*49*dn%(vJJN|WMK@-uI-g2it!7nCL;r4dk~ zyTy;l-0^9pdCAHkuY>9u21YJM9!4|9B1HxU26zB~><5K6H~^v;7#PwSY8fj6YCwVD zQOi`}1P%_XTIL$28fIv4h}1A<F_u92HO$~3VNL-B33Cc4NSIStB^jDon;97y3Pr*h z3c11=Y8ZnVG}-)$L_tYg3`B^72vA{DB+0<Qpvhb$%fP^Ji!HIBAT=+g2$ZNn#R@na zQt~sSSdueKiXk~u9;6d3Q-Hjn1@b8<gEBC(Fmi!?Ys6Rtk{P7FEdmuvP_Gt&;wg%y zC^Zd_FG100gw>ZInJAW&{7l0rHgJVy7=>J88AfqHYb?VkR!}u%2v%$aCXH_~Ks6bm zXflFpGJ<F_f+{mcQDzKRW(-kge2X<DKeNg(iXH5dD#I#%q{_3(P!B`ED2fy6yeh*e zHjw+OK<>=XtTKWbVuWgl5xOBpdPs&CK@BnT)8ql?9dICnb3QorgA+v&ILtVcQZtJS zGE;L5qu@*<1k*T*y{a-hr?l7*#xMdWRHR%7PKn^G$6*7h`RqV>ycm?q`Goj5_&7M& SIXE~tr5Gg`C75IwWtafTIu$nn literal 0 HcmV?d00001 diff --git a/verarbeitung/__pycache__/input_test.cpython-38.pyc b/verarbeitung/__pycache__/input_test.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df395212453392e135532b12396cd4c30a92ea05 GIT binary patch literal 2862 zcmWIL<>g{vU|=Y_x*~BRHv_|C5C<7^FfcGUFfcF_8!$33xHF_Mq%gKHq%bx!MS*xs zDa<VlDa_4GQH<^kDJ&_hEet8F%}h~DDQqe1Eeui2DI6)BEeugCDO@SsEeuhtDLg5> zDSYXSDf}q{DT3*YDMIOtDZ=R-QEVxKDIzJN>5M62DdOo2DLhbd_7tHMi4@6n#uTX( zX^?0-16VyricE@Zid>3(I#Y^5ieidVIwKf^%;HQ@N>NTxNl{H_N>NKuPmxJy1Y?jK zSBgf8W{Osdb~;mvPKs`dUOHonKGZJm6ulIK6vGswbfy&J6q9s@6pa-9bSAKUJSqAq zrYUAA=IKl+7Ack~8Yz0|Oi;J*rn057r*fonrgEinr}CuorgKE`rC0?sXj&&Dhb4&3 z1Pf0Q1_p*yhA74qhA5^K#uO%SXfX#fXtLbm4k%5^$xKcx$;{77<^<`2Vh|f-fHNpU zVi*`0Y8Y!6;u&g~Y8c`fYnW>o;+bk#Y8c{~YglU-;#q3gQW&y1iuBSMY8c{K^SDab zYS@}VI#_Gi!7?6T8TLG`5{?>nunc<*M-4+fX9`0w!%9X!O|Dz)DfyZ4rA0ZnSW7ZX za#C;cB<JUq6lErrmgE-|-(t_oFD=ST%(*2{fN*krN@7XsEv}-}wA7;1yyVp4Tg*kN zX}36&GfTi;D!#>>oLO><HN7amv_O;d7E5tzPFfK&0|P@53y5F^5o{oW9YlaqU=b*h z7V$7JFsx)K;$vW7_~o8#6%$&VT2vh4o|v1N7n7b@5|f;%TdZ49l%JKFU7}l-T9jCn zl$u#mnwK7f!pY1lC@qOENi8nXE2zB15g(tKmst`Y4+_{~2~bEgvcVw-BL@=~BZRCH zL5deWm^QzaEFd%T5_41I<8N`r$LHp!l;(igJn`{`rHMHZnIZv@UqDU=yB|XEgTxpa z7#Kjf7~}vB#v%}#tYpLC3=QC9P~d?)0>U6R$YgMuQ6iXTKrvqgQooWFXOygDE8+#Y z9A}gvyb1Op$m^iwUJQyw26)(33BnwV2+SfukiiK3U>4XAQ3eJEVNkjUIgW#|2*f8V zm^g!A36m<}R3rv+u{ekTI~GiUT@3QJ49LZ3-WGy8fEa&+QlvD<6sW&J{A5rX0Yxqd zgJOZ3fq?-W!4V7$3?&RM46%N-j5Q23j46zg4B1RYEG3K(b`4_+lO#x-8BDT(Nmek) z1}53TB!?tJGe<2`4HFXsBSSDlAqyy3Xma|!1X=hJWcy2yb6$e%ehJF7FF~31B`B@E z1Z7%HrdxbDnZ+gX`DyWqMMa5~#o%PE$$X2wpfo8yB|q~PD_Hy%b3thmBs0JR?iN2H zhsLLs<|QkGybme{7#KMic^J(Yi&PmH7*GNM<OX;k1Tio$q%(j5z=a{!rIraCAXc@^ zHB2?k&;SvrVO+pi0_E2*g9C**1r#XEDWE`MPGOZ~Xl7l=$jDGAP{>ik7|gJe&96uj z6wOi~0u&`hpx7;v1(iz7MT!gz47b=43kp*6QoxB*ljRl%I1EzqGox6NGfRpg84BbZ zG#?j%oUR4(C8&sFU}OQ6IE*}udW>Khdi%6U4dg?01_lOAmLg3C28Jk>qSQ1z&gW!c zU@*e!e2~m7mX!QV!zeaz1!5S5T!R=!aX@Pj!zflzwP6TWYy>8aZ!thM8KG!0f@?B@ zXflE-Ge%Kn3|D3hQD%ILH6=f@$}ox@?2;<ODt@HOtjbUiL%=AC6Y9Jw!zeb8`>G5f zh8V#NF+w%O2;C4PJtRYnpoSPhs@2R?!zfO$TjDcQ4XXr^Tmur&!y;r9#SL{4NJSI} z$W0&?%s{xw#t4&*&`kz863sG@Gm%U-f}3m<#RYa@ReWZuF}gv<m`*g-Lvf-p+#q8= zO@4480L~mmpkfT1jln6r2$W8uIFnK{iwiPSa|{toBLvepioL2bJEyeR5XLZy;?B&= zOD&2|O-WBRMCPE#7=tq>Ql3K;H5@jO>e>!erWJ$oGoKJ22OkFqI|l~`rxc?EqXd%- LqYMZ$$}j-{ONE5A literal 0 HcmV?d00001 diff --git a/verarbeitung/__pycache__/input_test.cpython-39.pyc b/verarbeitung/__pycache__/input_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68e42fd6a47a02787524c68816a42574834931d2 GIT binary patch literal 3865 zcmYe~<>g{vU|<L{UYTevz`*br#6iYF3=9ko3=9m#I!p`<?hGjmDU2-)DU8ibQ6L^u z3UdoX3Uf146r(#s3QG!W3quNPGgA~(3R?<$3qurh3P%cO3qur33Renu3qurZ3Qr1e z3ST;73V(_~ieNfpicmUZif}qd6kCd5ib#rRI%A4hig-Fh3J+AAJw+%*B1JNtF-0mx z8YG&|09MbDB9kJUB9|hc&Xl5%qL`wT&IraJvp7?fQj}9vQdHBKQq)q^Q)JQ^!5AdR zm7<ZNnWB}Voz9e^lcJlVm(G}?54DRsMK8r5#W2MvohijQ#Uz~}MI%K&oe69oPl|qu zX^L5jc{)>yMT%vLMv7iK6VxrdDOM@gDK_bhDYhwg=?qX&z7+cuhZM(j#uTR%=X8b? z7pN`#DK06lDQ@YEDefsA=?p2JP;r42&lIl|?{vl#pA_G8h7>=jxL}H3ihoK#I%7&; zN)X(1p_Jg1kd)AL#+0y>aJZ;&N<>OzN>n;yN_0w0N^CkK)GZ<@u_<vW@#%~y2`Pyw zNpNw|l%$m8l$3PFl+={8lytbbSW0?IMoMNnV@g&^Hr#aaRJK(1RE|{6RIXI+RGw7c zRK8UHRDo2%RH0PiRFPECRIya?bfGATl$>A&&D><<bOd5E!P1fl0|P@ULlk2QLljdA zV+s>Er7#CGXtLbm4k%5^$xKcx$;{77<^<`2Vh|f-fHNpD#xO82)G*dC#52?|)iA^} z)-cyF#52{f)G)*|*Ra+w#Iw|}r7)B-6zQci)G)-e=5dv<)vz^#bg<U2gJnFxGVFO= zB^)*EU>Wurjv9t|&J>1VhLwzdnq0ToQ}Q$8ON(-Dv6f_(<fPu>NzTtJDauSLEy*t` zzQvxEUs{xxm~%^@0O92Ll*E$MTU<q{X{kl2dC958x0s7k({6DlXO@7yRD6p$IkV&z zYkE<BX@Mr^EtcZcoU|fl1_p*A77)P-BG^C#JBZ)_5uglO#KXYAu#%yOkAZ>VS8%db zOlWaxQE`lKVophFjC*EDjB{qNZa`6fR%&)hOme1fv2Fo`qg$3*lvtFMnpsksmmY({ z$;>M#Er~BlEiTb3sJz7yAD@|*SrQ))3glu5P^dGq!664D2NM?~gsc)liX%OkHouiD zAT#n3b5rBvZ*j%P=jNxB=788d@$rSFi8&CNA_0(>K;8iR1w!zH#26VE7(lof<NyxF zA`qLbB*fti4eVr4K!Q91!XP%tWN`XXBA9+ash|j?ekCi;=vm2D#0zpc&gesU6YN8f z*Fj0Y7!;!n@UX2CggF=ym_>phgAw|{EU+P>3=9mypgaI_90y|&h)-59aR$K>DOJL$ zNDSm+aS#D^ESLbh802jkkc-j0Ed+M}G5!XnNNJEMP=AB?$)Gd>id+x|#R4}20|PjM zBN!MMN*G)iV*P3vYZz)6Qy3)~vYColN*E#R8paeRNsu@*m}CKytYDH2OtOPX4oQY) zj#{P~CME_(hG2$57ErR#<n((9vhXFy_Lm^%yad_(5|n{of->++P+EHl%D|dTxA<~0 zi%a73)8Z40iV`b}!O2>a`4)RYX;OSje&#J!u=p+Jg3=^NW`GCWEq+7}jZZ7hOI8MX zA5<hTFmf>RFq$zIsWLDypacTQ4e&q+VqjoMX8;9&3q!0+EfY9EtZJESm};1z0U}Vt zxPY+)%CBJt2MTivC{UPFK!L)X!Yawo%({?~k)cqakfVk%m|-QGUy&pznx#MlC`yVz zv0EeyDxsK*6d4#8Zm}g66r|>*fD@-C%PkIY7^LK9MzJJkmJ~xW6v#JdJ}v?|T?^z( zP;tk=$O0;H7<m}=7{N01_GytC$cO3-3=EnqMVbr@3{fmascCqe&&j~RV1(8AAemb% zDfyX(QEcGK#4rlEHZhFifYv64QLLaU#1O352uvE^Vt{HgLeXRd*JK3IWCT@ajH1jK zuFM#s%=i{-N`7XQVH7*qB~^x1{74mBm7yMnfKe1D)Ol5gQEVXhRT)AIF@hOlgldQp zx*<k-NQM|e4KadLv6-ocQJi46#Al`&RtX}x1|*<|MaU?M8|osEiYN|{n?Nj>fpC+J z5hfd<n+$R!nq?qoBAILiH`yqP3+%$G_{>yebc2jBooK9w;zVP(LB<d#W*ETz3}Pb3 zKs-nQ?g$VE;=K$5LzrG8n6EMnjH1x=BH0U)h3PfA#Rh85WEe(qfISkQVHm}S9MTzv zQCzSv%`l8&2M1|}Ayk_YT$>S^HX|f$Mlfxl7|zd(&oG8-Ge*;9jHJyNrVSc6DTu%U zF;P4S5`YH|hy(Fp3M_C^4B&wSVxs9q3LKCuOfNKWQs9A;f)+R_NP&|A3!D^a;H1C< zCj~8VQjh{C1r|6d(7;K72TlrF;G`f0P6{k=QjGmHCBfAPxL7R$Re<0M09-Z}fl8Pt z&ZN}L;)2Z7976=t2*EUtVy~*q&M7T6gfWbwxHI$eQj6kKQ_@onkvS+b#!-AlnduoN z@foQg%D@nfZxqFgEN_U)MUyp#$)=<hlz@^qR4;^U6vYEE3d}V`;i1YIgX<ckDg;q; za@asxpLU=sy4Zk$fq_qmkAshcgPntegHwu8f>DA=hEWED8D*HnKzv3CMlmE70J7H5 AT>t<8 literal 0 HcmV?d00001 diff --git a/verarbeitung/__pycache__/json_demo.cpython-36.pyc b/verarbeitung/__pycache__/json_demo.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04acef5f40630ee2c7b6e887e33dc740b5e16a74 GIT binary patch literal 865 zcmXr!<>gwdG%xWPGXuk81|-15z`)?Zz`#(fz`($e!jQt4!w?0cnQ|C&nWC5&8B&;2 zSXvmOm{S;o88lg6g0%W+GTvg%%qu7@Nd{>L32`wnFo3W#$fz3(3=Aa<%?!0nV3N6n zv6-Qkr6Qt+!G$3<pq3TPXRBe&Vya<FVYFeWVa;N$VM}2Gvsh}_QkcOk)*7}H7BGvg zhAo8^%wn%$OJTENsA0<Ds9|enWMn9m2xq7;sbO?sh}EfO2b;`M!=Az}$xy?Q!ePTu z!=AzkW^>sv)G%jp)Np`x6@@d@Fx9Z6aDzl^SW<Xw7)m%(cvJYAnfirlIZL>*xNBHy zIGdRm8NwM-7y=oB7$O)_7=jrz`TcIO<R#{&MzJN9mSp4?-D0UsO)R>_o|Ru(l$V$j z#hj9#d5bl@D8ICzh>?MT;TBtQerZv1>PrZxB(W$xwd59SUVchy@h#Sz%)IR4D!#1Z z{Ji**)QS>45bG9WxhBsomYmGul3Oe(naL%$SW7ZXa#C;cB<JUq6lErrmgE-|-x4S& zP0GnkPAtjH&x=n<EJ-b51=+`*lAjr0T9i}72I8?L78IoBrQBl4FG$V1#R4{-C8adC zK$GhhW7sW5*C-*7J@NTz@gOI~gRCn?h^3~ar$WWJK~f-fi8(p9SU`%SIPy}<!Lqkl zKnkO{VElNaTkQFzC25&CsVf<ZWEdD2eg)`f<maa9C+1}4fpBSszH?@<Za`6fR%&*M zesZR6v2Fo`qg$3*lvtFMnpsksm#&Y(0XaWDB{er+ub}c4Uw&yxL1{^RNq#&?9OU_8 zEl^@)WCKGkMm9z+B*@1I65(OwVdP`vVB}!pVJwnkU|`T>DG~*R6bCp($ERf#ff6-X f3hZ(uLKdvfCO1E&G$+*#q^y{Qfq{X8k%tKYEMV(c literal 0 HcmV?d00001 diff --git a/verarbeitung/__pycache__/json_demo.cpython-38.pyc b/verarbeitung/__pycache__/json_demo.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a1e7ba987775a20fddaa4a8f846bb238670d6a1 GIT binary patch literal 1131 zcmWIL<>g{vU|<kFup%*qje+4Yh=Yuo7#J8F7#J9e4Hy_0QW#Pga~PsPG*b>^E>jc} zBSQ*v3QG$^6mtq|3R??96iW(w3P%e=6l)4&FoP!NOORQ9nvAztGxG{cOOhEud?;pN zU|;}YXOQs;3=9k<49yI+j5Q1{46y;VOeKuX47JQPOj%4d%qfgE3^hzy%r(p@OkfsE z4RZ=Jn8jMdoWcTTvDGlAu!33aHOwh&HVie43pi?+7cw$36mr#ooWt&SizP2HH#Lea zv9u&3zbJ~OGBvU27JF8HX;EHcP84%We&#LK^rHOI0!_|aEIFCQCAU~oGLuVgv6f_( z<fPu>NzTtJDauSLEy*t`z9mplnv|27oLG{XpBJB!Sdv-<^3E;xl>E&2(xRLqRt5%! zTWpC11*v%{nk=^%!)^(IjEv7ui_gnXNsR}YTzrcK#E#;~ODzWrtYjz>U|?YQ<(6y} z6Iz^FR2<`;n46gwlb%@;lboqrtXoi&pOu<jqFa_)lvtFMnpsksmmY({$tni9Cp9-; zub}c4Pg;IaZej`8#$p~&P>X@WpOKA`gOQDq3kmWt76~yhFyM|O8`L<`LBvrCqa*_? zZc>=RY*3sqE?`0le^$RDPy)EcR-9j2l$`n!!YN5CN>44(WG-T3U|=X>2N585f<nv{ z5n`z+>F^K(v7@+PAr@~04lxKJ2nutUpF!%1r9pn?L-I2ZBM25rg8T|f-XJLu23gO^ zz`y`bk3KNJGL<maFf=pPGM6ybFg7#RveYowFoDw}OAQk!HI^`gvOqIazfdh}3CjZ3 z8m1c7g-nbL;S8n>feb+m5ez8|!3>(Lez#abF<l(Rnv<EAU0lTnj;4~-iV{5#>lS0V zCL6@}pjZGq?-ombL2BMD7O*@^N@;F^CR-6ND1bn57{v`rK%mr=n3Gck@?nuU0|P@8 zdwyw2T4qivBtSrksR$e@eEFp%1*IkNCHe6n165JOg@X|Uc^Hf285kHe*@|RAMsa|1 vZG2i*5h$R*$ph>#up%V$5teY+<mRW8=A_zzG!%0%Ffed1@^EtSb8rCwrKt$8 literal 0 HcmV?d00001 diff --git a/verarbeitung/__pycache__/json_demo.cpython-39.pyc b/verarbeitung/__pycache__/json_demo.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e31ce337645d5282ddab11668bc6d745735f9f8 GIT binary patch literal 1163 zcmYe~<>g{vU|{I}vm!Btje+4Yh=Yuo7#J8F7#J9e4Hy_0QW#Pga~PsPG*b>^E>jc} zBSQ*v3QG$^6mtq|3R??96iW(w3P%e=6l)4&FoP!NOORQ9nvAztGxG{cOOhEud?;pN zU|;}YXOQs;3=9k<49yI+j5Q1{46y;VOeKuX47JQPOj%4d%qfgE3^hzy%r(p@OkfsE z4RZ=Jn8jMdoWcTTvDGlAu!33aHOwh&HVie43pi?+7cw$36mr#ooWt&SizP2HH#Lea zv9u&3zvvcAWoly4E%vPZ(xSY?oG9j${LEXd=|%aa1)7|<SaLFpOK!2GWG0u~VlBxm z$w|G%lboMdQk0ogT9RK>d`qC9G$|)DIk6-&KQBHdu_U#Km4Sib7JEv5W_)Q;P7xc3 z$Cg-7keZjG$#RP^?3NJ7$oTxU_`Lj-)Oe7|#kW{M>?n@B)N-)EN`@jq1_p*-LCIDz zp~b01#WB8#IVGtv?wKVq&Y8iw0Y&*)so5nl$(g#vx&;u9ZdqzkVo_3RW=UyYdJGCD zs~F_A)ZBc%g34PwY57IDi6vm$i+Mo7E(VGVMm9zcMm9z+B*?>9B+S6TfIGfyP~%Gn z5nm~ck_@nTN?``GLGi=5fC(ioSpAAXiQyJoaeir0a_UP6rzEi`J+(xWxrm*CfuV>4 zMDQ{&Fn~hO6%l%=De3Ug1F@sHV4)Xp1P(n2Ap{D4n4dxFilsq*=0ox`4<iT`NrC(d zO6njf5C%mZ$ad7U$yCBv!_drF%Ur@#!`RGN%TmK!!vs#7EHzA^lv%<I$_~v;{W7(z zB`gbAYnW<S7cwz2gfpZturRPNG&3_Y<Ovuu6bBhFFoIzu10zEULokCTtKThFP)aDi z#hR0umt9=N2adXu)QS>45bG9Wxh5MVL_jeEcJeKj{DRcHTP$FCmXy-m0!_9ekoStj z85kI%xIqaFl-d$=a*FstVJQI;X3sAzNz2Shg#;2Pu@!+siZ8#kq@c7Uz9c^$WS}Z) zSaC3dAP-}aA}BuCisV6o%K^^S@o8B_puhts8L-2^ijd4lSi)hGo1apelWGUjPz(xU M4n`hM4t@?U0C*7*OaK4? literal 0 HcmV?d00001 diff --git a/verarbeitung/__pycache__/unittest.cpython-36.pyc b/verarbeitung/__pycache__/unittest.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..245eb7f9be9221daa930d9fa83c77368ba463af7 GIT binary patch literal 646 zcmXr!<>fNlw>VLok%8ec0}^0iU|?`yU|=Y=VqjoMVMt-jVTc0JOgW6XOi@gX4DJjm z%qc7_3@I$B3|Y+0%uy_<tSPM7Ohsm?3|VZ=42%pZjKK_=Y%f8E`e`!W;wdP~Pfjf^ zj?YcZ%u5D|!Y~ueE)fO>hE#?q#uSDqrWD2$rWS@M<`m{&22GY*d;t*MnR)3Usl_G9 zj8M%WnvH>h!5QRM0|o|$8ip)}62=t9bjB2>6s8pBW|kDj6qa<5c_5M{g)yBeohgl} znTe4hg&~+hlhyAQYf64*mElW}Ss@UPktWkE?!@Ba)S?pC!qUW?B9I$38E>%^r{<)s zWGLcfU|{&=ub+{ho2s9flbHv?r4{<lnZddNMfq8&*(LhPnYzWg1rUyIS!z*YQBrDV zNoiiXJ_@HaFSDd1wYWsDpz;<shynE|E6772TNxOuq@ZF@&+8#6^V4Lx#StH$mzbLx zAAgH0K0Y@;r8Eb`=82C7xf~)>#Ld6}aW&ZK5P}ON#>~LL0E+BlkX;;%MIb)NL{Kcn z$7{0R;()pE78k-9;PAM`0g4Le#Nt%2t|A@=28LTKAdL|7L4gEefo!_PVFPiS9VncO QIT#oiI2d`DgjhHj0Y5^X$^ZZW literal 0 HcmV?d00001 diff --git a/verarbeitung/input_test.py b/verarbeitung/input_test.py new file mode 100644 index 0000000..44361c4 --- /dev/null +++ b/verarbeitung/input_test.py @@ -0,0 +1,82 @@ +class Publication: + def __init__(self, doi_url, title, contributors, journal, publication_date, references, citations, group): + self.doi_url = doi_url + self.title = title + self.contributors = contributors + self.journal = journal + self.publication_date = publication_date + if references is None: + self.references = [] + else: + self.references = ref(references) + if citations is None: + self.citations = [] + else: + self.citations = cit(citations) + self.group = group + + +class Citation: + def __init__(self,doi_url, title, contributors, journal, publication_date): + self.doi_url = doi_url + self.title = title + self.contributors = contributors + self.journal = journal + self.publication_date = publication_date + +class Reference: + def __init__(self,doi_url, title, contributors, journal, publication_date): + self.doi_url = doi_url + self.title = title + self.contributors = contributors + self.journal = journal + self.publication_date = publication_date + +def input_test_func(pub_doi): + for array in list_of_arrays: + if pub_doi == array[0]: + pub = Publication(array[0], array[1], array[2], array[3], array[4], array[5], array[6], array[7]) + return pub + + +def cit(list_doi): + cits = [] + for doi_url in list_doi: + for array in list_of_arrays: + if doi_url == array[0]: + cits.append(Citation(array[0], array[1], array[2], array[3], array[4])) + return cits + +def ref(list_doi): + refs = [] + for doi_url in list_doi: + for array in list_of_arrays: + if doi_url == array[0]: + refs.append(Citation(array[0], array[1], array[2], array[3], array[4])) + return refs + + +beispiel1 = ['doi1', 'title1', ['contributor1'], 'journal1', 'date1', ['doi2'], ['doi3'], ''] +beispiel2 = ['doi2', 'title2', ['contributor2'], 'journal2', 'date2', [], ['doi1'], ''] +beispiel3 = ['doi3', 'title3', ['contributor3'], 'journal3', 'date3', ['doi1'], [], ''] + +zyklus1 = ['doiz1', 'titlez1', ['contributorz1.1', 'contributorz1.2'], 'journalz1', 'datez1', ['doiz2'], ['doiz2'], ''] +zyklus2 = ['doiz2', 'titlez2', ['contributorz2.1', 'contributorz2.2'], 'journalz2', 'datez2', ['doiz1'], ['doiz1'], ''] + +inner_edge1 = ['doi_ie1', 'title_ie1', ['contributor_ie1.1', 'contributor_ie1.2'], 'journal_ie1', 'date_ie1', ['doi_ie2'], ['doi_ie3'], ''] +inner_edge2 = ['doi_ie2', 'title_ie2', ['contributor_ie2.1', 'contributor_ie2.2'], 'journal_ie2', 'date_ie2', [], ['doi_ie1','doi_ie3'], ''] +inner_edge3 = ['doi_ie3', 'titlez_ie3', ['contributor_ie3.1', 'contributor_ie3.2'], 'journal_ie3', 'date_ie3', ['doi_ie1','doi_ie2'], [], ''] + +right_height01 = ['doi_h01', 'title_h01', ['contributor_h01'], 'journal_h01', 'date_h01', [], [], ''] +right_height02 = ['doi_h02', 'title_h02', ['contributor_h02'], 'journal_h02', 'date_h02', [], ['doi_h1'], ''] +right_height1 = ['doi_h1', 'title_h1', ['contributor_h1'], 'journal_h1', 'date_h1', [], ['doi_h2'], ''] +right_height2 = ['doi_h2', 'title_h2', ['contributor_h2'], 'journal_h2', 'date_h2', [], ['doi_h3'], ''] +right_height3 = ['doi_h3', 'title_h3', ['contributor_h3'], 'journal_h3', 'date_h3', [], [], ''] + +right_depth01 = ['doi_d01', 'title_d01', ['contributor_d01'], 'journal_d01', 'date_d01', [], [], ''] +right_depth02 = ['doi_d02', 'title_d02', ['contributor_d02'], 'journal_d02', 'date_d02', ['doi_d1'], [], ''] +right_depth1 = ['doi_d1', 'title_d1', ['contributor_d1'], 'journal_d1', 'date_d1', ['doi_d2'], [], ''] +right_depth2 = ['doi_d2', 'title_d2', ['contributor_d2'], 'journal_d2', 'date_d2', ['doi_d3'], [], ''] +right_depth3 = ['doi_d3', 'title_d3', ['contributor_d3'], 'journal_d3', 'date_d3', [], [], ''] + +list_of_arrays = [beispiel1, beispiel2, beispiel3, zyklus1, zyklus2, inner_edge1, inner_edge2, inner_edge3, right_height01, right_height02, right_height1, right_height2, right_height3, right_depth01, right_depth02, right_depth1, right_depth2, right_depth3] diff --git a/verarbeitung/json_demo.py b/verarbeitung/json_demo.py new file mode 100644 index 0000000..b9f618d --- /dev/null +++ b/verarbeitung/json_demo.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +import json +from input_fj import input + +""" +Functions that format the computed graph to match the interface to the output-part + +""" + +# creates a list that contains a dictionary for each node +# the dictionaries store the values for the attributes +def format_nodes(V): + list_of_node_dicts = list() + for node in V: + new_dict = dict() + new_dict["name"] = node.title + new_dict["author"] = node.contributors + new_dict["year"] = node.publication_date + new_dict["journal"] = node.journal + new_dict["doi"] = node.doi_url + new_dict["group"] = node.group + list_of_node_dicts.append(new_dict) + return list_of_node_dicts + +# creates a list that contains a disctionary for each edge +# the dictionaries contain the source as keys and the target as values +def format_edges(E): + list_of_edge_dicts = list() + for edge in E: + new_dict_2 = dict() + new_dict_2["source"] = edge[0] + new_dict_2["target"] = edge[1] + list_of_edge_dicts.append(new_dict_2) + return list_of_edge_dicts + +# combine the lists of nodes and edges to a dictionary and saves it to a json file +def output_to_json(V,E): + dict_of_all = dict() + list_of_node_dicts = format_nodes(V) + list_of_edge_dicts = format_edges(E) + dict_of_all["nodes"] = list_of_node_dicts + dict_of_all["links"] = list_of_edge_dicts + with open('json_text.json','w') as outfile: + json.dump(dict_of_all, outfile) + +#knoten = ["doi1", "doi2", "doi3"] +#kanten = [[1,2],[3,4],[5,6]] +#output_to_json(knoten,kanten) + diff --git "a/verarbeitung/n\303\266tige Tests.txt" "b/verarbeitung/n\303\266tige Tests.txt" new file mode 100644 index 0000000..9556328 --- /dev/null +++ "b/verarbeitung/n\303\266tige Tests.txt" @@ -0,0 +1,4 @@ +Zyklus +großer Zyklus +Innere Kanten vervollständigen + -- GitLab