diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..61f2dc9f84d472c32fa57194620d6b1e5fa14649
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+**/__pycache__/
diff --git a/citation_parser_ui.py b/citation_parser_ui.py
new file mode 100644
index 0000000000000000000000000000000000000000..453ead98cdb0543e35c58a3e0adfd734e34067bc
--- /dev/null
+++ b/citation_parser_ui.py
@@ -0,0 +1,255 @@
+import base64
+import re
+import dash
+from dash import dcc
+from dash import html
+from dash import callback_context
+from dash.dependencies import Input, Output, State
+from dash.exceptions import PreventUpdate
+from input.interface import InputInterface
+import input.publication
+
+app = dash.Dash(__name__)
+
+# List of options when inputting data and generating the graph
+additional_options = ['Update Automatically','Smart Input']
+
+# Reads the contents of info_box.txt. 
+# They can later be displayed by pressing the corresponding button.
+f = open('info_box.txt', 'r')
+boxcontent = f.read()
+f.close()
+
+app.layout = html.Div([
+    # Layer 0: For the Header and Help Function(s)
+    html.Div([
+        html.Button(id='show-info',children='Show Info',n_clicks=0),
+        html.Div(id='info-box')
+    ]),
+    # Layer 1: For all mandatory Inputs
+    html.Div([
+        "Input: ",
+        # A simple box for inputting a string. 
+        # Value is transmitted upon pressing return or clicking out of the box.
+        dcc.Input(id='input-string', value='', type='text',debounce=True),
+        # Forward recursion. Values between 1 and 10 can be entered.
+        dcc.Input(id='forward-depth',value='1',type='number',min='1',max='10'),
+        # Backward recursion. Values between 1 and 10 can be entered.
+        dcc.Input(id='backward-depth',value='1',type='number',min='1',max='10'),
+        # Upload box. Can be used via drag-and-drop or byclicking on it to open a file viewer.
+        dcc.Upload(
+            id="upload-data",
+            children=html.Div(
+                ["Drag and drop or click to select a file to upload."]),
+            style={
+                "width": "30%",
+                "height": "60px",
+                "lineHeight": "60px",
+                "borderWidth": "1px",
+                "borderStyle": "dashed",
+                "borderRadius": "5px",
+                "textAlign": "center",
+                "margin": "10px",
+            })
+    ]),
+    # Layer 2: For the checklist, Remove-/Start-Buttons and input-error-message
+    html.Div([
+        # All input DOIs are collected in this checklist. 
+        # It is initialized to avoid error messages.
+        dcc.Checklist(id='input-checklist',options=[],
+            labelStyle = dict(display='block'),value=[]),
+        # Displays error message if 'Smart Input' is active.
+        html.Div(id='input-err',style={'color':'red'}),
+        # Clears the entire list.
+        html.Button(id='clear-all-button',children='Clear All'),
+        # Clear all selected elements.
+        html.Button(id='clear-selected-button',children='Clear Selected'),
+        # Starts the process that generates a graph.
+        html.Button(id='start-button',children='Generate Graph')
+    ]),
+    # Layer 3: For additional Options (e.g. Topological Sort)
+    html.Div([
+        html.H4('Additional Options'),
+        # A checklist of all additional options that are listed above.
+        dcc.Checklist(id='additional-options',
+            options=[{'label':k,'value':k} for k in additional_options],
+            value=[])
+    ]),
+    # Layer 4: For the Graph
+    html.Div([
+        html.Div(id='test-output')
+    ])
+])
+
+@app.callback(
+    Output('input-checklist','options'),
+    Output('input-checklist','value'),
+    Output('input-string','value'),
+    Output('input-err','children'),
+    Input('input-string','value'),
+    Input('clear-all-button','n_clicks'),
+    Input('clear-selected-button','n_clicks'),
+    Input('upload-data','contents'),
+    State('input-checklist','options'),
+    State('input-checklist','value'),
+    State('additional-options','value')
+)
+def update_input_checklist(input_value,btn1,btn2,filecontents,all_inputs,
+        selected_inputs,additional_options):
+    '''
+    Most important callback function. Updates the checklist that holds all inputs.
+    State of the checklist as input is needed so that previews entries are readded.
+    input-string is required as Output to clear the input box after each input.
+    Different actions are performed depending on which input triggered the callback.
+    The value-attribute of input-checklist must be updates so that the values
+    of deleted elements no longer appear in the list of selected elements.
+
+    :param input_value: given by dcc.Input
+    :type input_value: string
+    :param btn1: signals pressing of clear-all-button
+    :type btn1: int
+    :param btn2: signals pressing of clear-selected-button
+    :type btn2: int
+    :param filecontents: the contents of an uploaded file
+    :type filecontents: bit-string
+    :param all_inputs: all labels and values from the checklist,
+        regardless if they have been checked or not
+    :type all_inputs: list of dictionaries with 2 entries each
+    :param selected_inputs: values of all checked elements
+    :type selected_inputs: list of strings
+    :param addtitional_options: all checked additional options
+    :type additional_options: list of strings
+    '''
+    # changed_id is used to determine which Input has triggered the callback
+    changed_id = [p['prop_id'] for p in callback_context.triggered][0]
+
+    # if clear-all-button was pressed:
+    if 'clear-all-button' in changed_id:
+        return list(),list(),'',''
+    
+    # if clear-selected-button was pressed:
+    if 'clear-selected-button' in changed_id:
+        all_inputs = [i for i in all_inputs if i['value'] not in selected_inputs]
+        return all_inputs,list(),'',''
+    
+    # when a new element is added via dcc.Input
+    if 'input-string' in changed_id:
+        # Creates a list of previously added inputs to make sure nothing is added twice
+        currValues = [x['value'] for x in all_inputs]        
+        if input_value not in currValues:
+
+            # if 'Smart Input' is selected, the input will be checked for validity 
+            # and a more readable string will be returned
+            if 'Smart Input' in additional_options:
+                try:
+                    # Attempts to call get_publication. If unsuccesful, 
+                    # the DOI is not added and an error message is returned
+                    i = InputInterface()
+                    pub = i.get_pub_light(input_value)
+                except Exception as err:
+                    return options,selected_inputs,'','{}'.format(err)
+                # Creates a more readable string to display in the checklist
+                rep_str = pub.contributors[0] + ',' + pub.journal + \
+                        ',' + pub.publication_date
+                all_inputs.append({'label':rep_str, 'value':input_value})
+            
+            # if 'Smart Input' is not selected, the input value is added as is,
+            # without checking for validity.
+            else:
+                all_inputs.append({'label':input_value,'value':input_value})
+        return all_inputs,selected_inputs,'',''
+    
+    # when a txt-file is uploaded
+    if 'upload-data.contents' in changed_id:
+        if filecontents:
+            # Skips the info portion that is added when a file is uploaded
+            found = base64.b64decode(re.search(',(.+?)$', filecontents).group(1))
+            # Returns the binary string into a proper text
+            text = found.decode('utf-8')
+            # Creates a list of inputs by splitting the lines
+            list_of_inputs = (text.strip().split('\n'))
+            CurrValues = [x['value'] for x in all_inputs]
+            # For every line the same actions as for a single input are performed
+            for input_value in list_of_inputs:
+                if input_value not in CurrValues:
+                    if 'Smart Input' in additional_options:
+                        try:
+                            i = InputInterface()
+                            pub = i.get_pub_light(input_value)
+                        except Exception as err:
+                            return all_inputs,selected_inputs,'','{}'.format(err)
+                        rep_str = pub.contributors[0] + ',' + pub.journal + \
+                                ',' + pub.publication_date
+                        all_inputs.append({'label':rep_str, 'value':input_value})
+                    else:
+                        all_inputs.append({'label':input_value,'value':input_value})
+        return all_inputs,selected_inputs,'',''
+    # when the programm is first started:
+    # if this is not done, the input_checklist will be generated 
+    # with one element that contains an empty string
+    if input_value == '':
+        return list(),list(),'',''
+
+@app.callback(
+    Output('info-box','children'),
+    Input('show-info','n_clicks')
+)
+def show_hide_info_box(n_clicks):
+    '''
+    This callback shows and hides the (first) info-box by, checking how often 
+    the button has been pressed. The text was loaded at the top.
+    :param n_clicks: number of times show-info has been clicked.
+    'type n_clicks: int
+    '''
+    if n_clicks % 2 == 0:
+        return ''
+    else:
+        return html.Div(boxcontent, style={'whiteSpace': 'pre-line'})
+
+@app.callback(
+    Output('test-output','children'),
+    Input('start-button','n_clicks'),
+    Input('input-checklist','options'),
+    Input('input-checklist','value'),
+    Input('forward-depth','value'),
+    Input('backward-depth','value'),
+    State('additional-options','value')
+)
+def generate_output(n_clicks,all_inputs,selected_inputs,
+        forward_depth,backward_depth,additional_options):
+    '''
+    Basic structure for a callback that generates an output. This is only a 
+    proof of concept and has noting to do with the intended output yet.
+
+    :param n_clicks: how often has Generate Graph been clicked
+    :type n_clicks: int
+    :param all_inputs: all labels and values from the checklist,
+        regardless if they have been checked or not
+    :type all_inputs: list of dictionaries with 2 entries each
+    :param selected_inputs: values of all checked elements
+    :type selected_inputs: list of strings
+    :param forward_depth: forward recursion depth
+    :type forward_depth: unsigned int
+    :param backward_depth: backward recursion depth
+    :type backward_depth: unsigned int
+    :param additional_options: value of all selected additional options
+    :type additional_options: list of strings
+    '''
+    changed_id = [p['prop_id'] for p in callback_context.triggered][0]
+    if n_clicks is None:
+        raise PreventUpdate
+    elif 'Update Automatically' in additional_options \
+            or 'start-button' in changed_id: 
+        s = ''
+        for i in range(len(all_inputs)):
+            x = all_inputs[i]['value']
+            if x in selected_inputs:
+                s += x*(abs(int(forward_depth)-int(backward_depth)))
+            else:
+                s += x*(int(forward_depth)+int(backward_depth))
+        return s
+    else:
+        raise PreventUpdate
+
+if __name__ == '__main__':
+    app.run_server(debug=True)
diff --git a/count_journal.py b/count_journal.py
new file mode 100755
index 0000000000000000000000000000000000000000..13886a2e7badf339bdd23475f7d3de713329f472
--- /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 0000000000000000000000000000000000000000..c9bca4189fce4c1fd0a0dfc42ef4e517baa5f406
--- /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/info_box.txt b/info_box.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3cb826b85b7336e0083f35a235a197e88f77ee5d
--- /dev/null
+++ b/info_box.txt
@@ -0,0 +1,43 @@
+English
+
+Show Info: Can be activated and deactivated by clicking on the button.
+
+Input: input by entering a DOI ("Digital Object Identifier")
+
+Drag and drop or click to select a file to upload: entering multiple DOI by txt-file is only possible if every DOI has its own line.
+
+Recursion:
+
+Clear All: clearing all inputs
+
+Clear Selected: clearing all selected inputs
+
+Generate Graph: generates the graph
+
+Update Automatically: automatically updates the graph for every new input
+
+Smart Input: checks the correctness of the entered DOI and shows a nicer depiction: Author, Journal, publication date.
+
+
+
+German 
+
+Show Info: Durch wiederholtes klicken kann das Fenster ein und aus geblendet werden.
+
+Input: Die Eingabe erfolgt in Form eines DOI ("Digital Object Identifier") 
+
+Drag and drop or click to select a file to upload: Mehrere DOI in einem txt-Dokument müssen untereinander angeordnet sein.
+
+Recursion: 
+
+Clear All: alle Eingaben werden gelöscht
+
+Clear Selected: alle markierten Eingaben werden gelöscht
+
+Generate Graph: generiert den zugehörigen Graphen
+
+Update Automatically: automatische Aktualisierung des Graphen nach neuer Eingabe
+
+Smart Input: direkte Überprüfung der Eingabe auf Richtigkeit zudem wird nicht mehr der DOI angezeigt sondern: Der Autor, Das Journal, Das Veröffentlichungsdatum.
+
+
diff --git a/input/README.md b/input/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..110ce69136a8935b83d070113130222f243e924f
--- /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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/input/get/__init__.py b/input/get/__init__.py
new file mode 100755
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/input/get/__pycache__/__init__.cpython-38.pyc b/input/get/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a1e24ad908499dfeb45afebf60601d0704dbbbcb
Binary files /dev/null and b/input/get/__pycache__/__init__.cpython-38.pyc differ
diff --git a/input/get/__pycache__/acs.cpython-38.pyc b/input/get/__pycache__/acs.cpython-38.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f3585b798ebbeab22676f00cc409ef48cd6b6019
Binary files /dev/null and b/input/get/__pycache__/acs.cpython-38.pyc differ
diff --git a/input/get/__pycache__/journal_fetcher.cpython-38.pyc b/input/get/__pycache__/journal_fetcher.cpython-38.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3be8ddceae79b7f027f194a2c4cec6c1fe9575a5
Binary files /dev/null and b/input/get/__pycache__/journal_fetcher.cpython-38.pyc differ
diff --git a/input/get/__pycache__/nature.cpython-38.pyc b/input/get/__pycache__/nature.cpython-38.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6008e587da3dab81c3c79bb42345b63f0226ebbd
Binary files /dev/null and b/input/get/__pycache__/nature.cpython-38.pyc differ
diff --git a/input/get/acs.py b/input/get/acs.py
new file mode 100755
index 0000000000000000000000000000000000000000..9691845b27ae694a8213a0f0fe5f827c75890eee
--- /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 0000000000000000000000000000000000000000..514af1f80f5c7d442b790aebf5fe3954d50f8f5d
--- /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 0000000000000000000000000000000000000000..c50ea0ef9d1d4a9a386730e31cc72372cbf698c0
--- /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 0000000000000000000000000000000000000000..58de0237bd514f7dd1b5b25f251b740d33e3589e
--- /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 0000000000000000000000000000000000000000..59515b3a3a2a5361222b8e55d3a7314ab3907132
--- /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 0000000000000000000000000000000000000000..fc512e7173a84695ea566706784c565a7b5ebb8f
--- /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 0000000000000000000000000000000000000000..a151126691e7f0a9f1c824e9cbac243a96b32e71
--- /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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/input/test/test_acs.py b/input/test/test_acs.py
new file mode 100644
index 0000000000000000000000000000000000000000..e3dfe84a09d3599de32efbab0dd60655b5414152
--- /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 0000000000000000000000000000000000000000..b2ca55f961565fd1192b72ce992c9ff95bd23020
--- /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 0000000000000000000000000000000000000000..76bd11d5d70daac13e190f4d52269eb381413c69
--- /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
Binary files /dev/null and b/input_old/__pycache__/input_fj.cpython-39.pyc differ
diff --git a/input_old/example_urls b/input_old/example_urls
new file mode 100644
index 0000000000000000000000000000000000000000..96ac680c65edddcb495312000157edea1ab94884
--- /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 0000000000000000000000000000000000000000..ecc8e68fc5a84a446ae3f09dcb5ed56e8d262766
--- /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 0000000000000000000000000000000000000000..13b90e804cd485813b731385b319b3077a017dd2
--- /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 0000000000000000000000000000000000000000..dc623ca182691e9e06a6713a4d3d5dcf0bbf23c2
--- /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 0000000000000000000000000000000000000000..c8ade9d56a520a3ac57e5eadce8b81bb3e63c0dd
--- /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/ui_programm_fragmente/README.md b/ui_programm_fragmente/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..d3a7e438ee56b341db5d7a1eabcb996e154f103f
--- /dev/null
+++ b/ui_programm_fragmente/README.md
@@ -0,0 +1,38 @@
+# Projekt CiS-Biochemie 2021-22 UI
+
+# Benötigt:
+- Dash 
+- Pandas
+- beautifulsoup4
+- requests
+
+# Starten des Programms:
+
+Ausführen von citation_parser_ui.py und einfügen des entstandenen Liks in einen Browser.
+Danach müsste sich die Benutzeroberfläche im Browser öffnen.
+
+
+# Übersicht der Benutzeroberfläche:
+
+- Show Info: Durch wiederholtes klicken kann das Fenster ein und aus geblendet werden.
+
+- Input: Die Eingabe erfolgt in Form eines DOI ("Digital Object Identifier") 
+
+- Drag and drop or click to select a file to upload: Mehrere DOI in einem txt-Dokument (genau ein DOI pro Zeile).
+
+- Recursion: die beiden noch unbeschrifteten Felder rechts neben Input sind für die Rekursionstiefen in beide Richtungen
+
+- Clear All: alle Eingaben werden gelöscht
+
+- Clear Selected: alle markierten Eingaben werden gelöscht
+
+- Generate Graph: generiert den zugehörigen Graphen (generiert momentan nur einen string)
+
+- Update Automatically: automatische Aktualisierung des Graphen bei jeder neuen Eingabe
+
+- Smart Input: direkte Überprüfung der Eingabe auf Richtigkeit zudem wird nicht mehr der DOI angezeigt sondern: 
+  Der Autor, Das Journal, Das Veröffentlichungsdatum. (muss vor Hinzufügen aktiviert worden sein)
+
+## Autoren
+- Isabelle Siebels
+- Sebastian David
diff --git a/ui_programm_fragmente/input_to_checklist.py b/ui_programm_fragmente/input_to_checklist.py
new file mode 100644
index 0000000000000000000000000000000000000000..3c00ed4c23c7acf914c02af576fec41d8ba2efc7
--- /dev/null
+++ b/ui_programm_fragmente/input_to_checklist.py
@@ -0,0 +1,160 @@
+import dash
+from dash import dcc
+from dash import html
+from dash import callback_context
+from dash.dependencies import Input, Output, State
+from dash.exceptions import PreventUpdate
+from input.interface import InputInterface
+import input.publication
+
+app = dash.Dash(__name__)
+
+additional_options = ['Update Automatically']
+
+app.layout = html.Div([
+    # Layer 0: For the Header and Help Function(s)
+    html.Div([
+        html.Button(id='show-info',children='Show Info',n_clicks=0),
+        html.Div(id='info-box')
+    ]),
+    # Layer 1: For all mandatory Inputs
+    html.Div([
+        "Input: ",
+        dcc.Input(id='input-string', value='', type='text',debounce=True),
+        dcc.Input(id='forward-depth',value='1',type='number',min='1',max='10'),
+        dcc.Input(id='backward-depth',value='1',type='number',min='1',max='10')
+    ]),
+    # Layer 2: For the checklist, Remove-/Start-Buttons and input-error-message
+    html.Div([
+        dcc.Checklist(id='input-checklist',options=[],labelStyle = dict(display='block'),value=[]),
+        html.Div(id='input-err',style={'color':'red'}),
+        html.Button(id='clear-all-button',children='Clear All'),
+        html.Button(id='clear-selected-button',children='Clear Selected'),
+        html.Button(id='start-button',children='Generate Graph')
+    ]),
+    # Layer 3: For additional Options (e.g. Topological Sort)
+    html.Div([
+        html.H4('Additional Options'),
+        dcc.Checklist(id='additional-options',
+            options=[{'label':k,'value':k} for k in additional_options],
+            value=[])
+    ]),
+    # Layer 4: For the Graph
+    html.Div([
+        html.Div(id='test-output')
+    ])
+])
+
+'''
+Most important callback function. Updates the checklist that holds all inputs.
+input-string is required as Output to clear the input box after each input
+'''
+@app.callback(
+    Output('input-checklist','options'),
+    Output('input-checklist','value'),
+    Output('input-string','value'),
+    Output('input-err','children'),
+    Input('input-string','value'),
+    Input('clear-all-button','n_clicks'),
+    Input('clear-selected-button','n_clicks'),
+    State('input-checklist','options'),
+    State('input-checklist','value')
+)
+def update_input_checklist(input_value,btn1,btn2,all_inputs,selected_inputs):
+    '''
+        :param input_value: given by dcc.Input
+        :type input_value: string
+        :param btn1: signals pressing of clear-all-button
+        :param btn2: signals pressing of clear-selected-button
+        :param all_inputs: all labels and values from the checklist,
+            regardless if they have been checked or not
+        :type all_inputs: list of dictionaries with 2 entries each
+        :param selected_inputs: values of all checked elements
+        :type selected_inputs: list of strings
+    '''
+    changed_id = [p['prop_id'] for p in callback_context.triggered][0]
+    # if clear-all-button was pressed:
+    if 'clear-all-button' in changed_id:
+        return list(),list(),'',''
+    # if clear-selected-button was pressed:
+    if 'clear-selected-button' in changed_id:
+        all_inputs = [i for i in all_inputs if i['value'] not in selected_inputs]
+        return all_inputs,list(),'',''
+    # when the programm is first started:
+    if input_value == '':
+        app.layout['input-checklist'].options.clear()
+        return list(),list(),'',''
+    # when a new element is added via dcc.Input
+    if 'input-string' in changed_id:
+        options = all_inputs
+        currValues = [x['value'] for x in options]
+        if input_value not in currValues:
+            try:
+                i = InputInterface()
+                pub = i.get_pub_light(input_value)
+            except Exception as err:
+                return options,selected_inputs,'','{}'.format(err)
+            rep_str = pub.contributors[0] + ',' + pub.journal + ',' + pub.publication_date
+            options.append({'label':rep_str, 'value':input_value})
+        return options,selected_inputs,'',''
+
+'''
+This callback shows and hides the (first) help-box
+'''
+@app.callback(
+    Output('info-box','children'),
+    Input('show-info','n_clicks')
+)
+def show_hide_info_box(n_clicks):
+    if n_clicks % 2 == 0:
+        return ''
+    else:
+        return 'Hier koennte Ihre Werbung stehen'
+
+'''
+Basic structure for a callback that generates an output
+'''
+@app.callback(
+    Output('test-output','children'),
+    Input('start-button','n_clicks'),
+    Input('input-checklist','options'),
+    Input('input-checklist','value'),
+    Input('forward-depth','value'),
+    Input('backward-depth','value'),
+    State('additional-options','value')
+)
+def generate_output(n_clicks,all_inputs,selected_inputs,
+        forward_depth,backward_depth,additional_options):
+    '''
+        :param n_clicks: how often has Generate Graph been clicked
+        :type n_clicks: int
+        :param all_inputs: all labels and values from the checklist,
+            regardless if they have been checked or not
+        :type all_inputs: list of dictionaries with 2 entries each
+        :param selected_inputs: values of all checked elements
+        :type selected_inputs: list of strings
+        :param forward_depth: forward recursion depth
+        :type forward_depth: unsigned int
+        :param backward_depth: backward recursion depth
+        :type backward_depth: unsigned int
+        :param additional_options: value of all selected additional options
+        :type additional_options: list of strings
+    '''
+    changed_id = [p['prop_id'] for p in callback_context.triggered][0]
+    if n_clicks is None:
+        raise PreventUpdate
+    elif 'Update Automatically' in additional_options \
+            or 'start-button' in changed_id: 
+        s = ''
+        for i in range(len(all_inputs)):
+            x = all_inputs[i]['value']
+            if x in selected_inputs:
+                s += x*(abs(int(forward_depth)-int(backward_depth)))
+            else:
+                s += x*(int(forward_depth)+int(backward_depth))
+        return s
+    else:
+        raise PreventUpdate
+
+if __name__ == '__main__':
+    app.run_server(debug=True)
diff --git a/ui_programm_fragmente/upload_to_checklist.py b/ui_programm_fragmente/upload_to_checklist.py
new file mode 100644
index 0000000000000000000000000000000000000000..9a094f213901a808ad924f4b1ffa87fb87f2f75d
--- /dev/null
+++ b/ui_programm_fragmente/upload_to_checklist.py
@@ -0,0 +1,78 @@
+import dash
+from dash import dcc
+from dash import html
+from dash.dependencies import Input, Output, State
+import base64
+import re
+
+app = dash.Dash(__name__)
+
+list_of_inputs = dict()
+
+app.layout = html.Div([
+    html.H4("Add all lines in a file to a list"),
+    html.Div([
+        dcc.Upload(
+            id="upload-data",
+            children=html.Div(
+                ["Drag and drop or click to select a file to upload."]
+            ),
+            
+            style={
+                "width": "30%",
+                "height": "60px",
+                "lineHeight": "60px",
+                "borderWidth": "1px",
+                "borderStyle": "dashed",
+                "borderRadius": "5px",
+                "textAlign": "center",
+                "margin": "10px",
+            }),
+
+    ]),
+    dcc.Checklist(id='input-checklist',options=list(),labelStyle = dict(display='block'),value=[]),
+
+])
+
+@app.callback(
+    Output('input-checklist','options'),
+    Input('upload-data','filename'),
+    Input('upload-data','contents'),
+    State('input-checklist','options')
+)
+def update_input_list(uploaded_filenames,uploaded_file_contents,all_inputs):
+    if uploaded_file_contents is not None:
+  
+            
+        string = uploaded_file_contents
+
+        #cutting the first part of the String away to decode
+        found = base64.b64decode(re.search(',(.+?)$', string).group(1))
+        print(found.decode('utf-8'))
+        
+        uploaded_file_contents = found.decode('utf-8')
+        
+    
+        list_of_inputs = (uploaded_file_contents.split())
+        #das hier sollte es untereinander anzeigen, bekomme ich allerdings nicht auf die Seite...
+        #return (*list_of_inputs, sep="\n")
+            
+        options = all_inputs
+        if not options:
+            options = list()
+        CurrValues = [x['value'] for x in options]
+
+           
+       # würde auch funktionieren
+       # return (found.decode('utf-8'))
+        for i in list_of_inputs:
+            if i not in CurrValues:
+                options.append({'label':i, 'value':i})
+
+
+        return options
+
+if __name__ == '__main__':
+    app.run_server(debug=True)
+
+
diff --git a/verarbeitung/.gitignore b/verarbeitung/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b604f4fdf854363614dd5eb73cb2ab92a941ac64
--- /dev/null
+++ b/verarbeitung/.gitignore
@@ -0,0 +1,61 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*,cover
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+#CodeCounter
+
+.VSCodeCounter/
\ No newline at end of file
diff --git a/verarbeitung/README.md b/verarbeitung/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..10640cbd5243b9db6c9c84652690db567082c215
--- /dev/null
+++ b/verarbeitung/README.md
@@ -0,0 +1,61 @@
+# Projekt CiS-Projekt 2021/22
+
+Processing-Package to generate theoretical graph for citations and references of given input publications.
+
+## Usage/Examples
+
+```python
+from verarbeitung.process_main import Processing
+
+
+def main(url_list):
+	Processing(url_list)
+```
+
+Grundlegender Prozess:
+Es wird von der UI eine Liste an DOIs an die Verarbeitung übergeben und
+diese wird dann umgewandelt in eine Knoten-und Kantenmenge, welche die Zitierungen darstellen.
+Die Informationen über die Paper und die Zitierungen kommen von der Input Gruppe über den Aufruf
+von der Funktion Publication. Die Knoten- und Kantenmengen werden in Form einer 
+Json Datei an den Output übergeben.
+
+## Files and functions in directory
+
+
+get_pub_from_input.py:
+
+```python
+def get_pub(pub_doi, test_var)
+```
+- 	Gibt für eine DOI ein Klassenobjekt zurück, in dem alle nötigen Informationen gespeichert sind.
+
+
+process_main.py:
+
+```python
+def Processing(url_list)
+```
+- 	Überprüft, ob bereits eine Json Datei existiert und ruft dann entweder die Funktion auf, um
+  	einen neuen Graphen zu erstellen oder die Funktion um einen Vorhandenen zu updaten.
+
+
+start.script.py:
+
+ - 	Wird benötigt, um die Dateien ordnerübergreifend aufzurufen. Nur fürs interne Testen der 	
+ 	Funktionalität
+
+
+<name>.json:
+
+- 	sind momentan Beispiele, die an den Output übergeben werden könnten.
+
+## Testing
+
+python -m unittest discover verarbeitung/test -v
+
+## Authors
+- Donna Löding
+- Alina Molkentin
+- Xinyi Tang
+- Judith Große
+- Malte Schokolowski
\ No newline at end of file
diff --git a/verarbeitung/__init__.py b/verarbeitung/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/verarbeitung/construct_new_graph/README.md b/verarbeitung/construct_new_graph/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..d73f4ebe71ea67c80f38c8d0e923d6bd925b43f5
--- /dev/null
+++ b/verarbeitung/construct_new_graph/README.md
@@ -0,0 +1,29 @@
+# Projekt CiS-Projekt 2021/22
+
+Directory for functions to create the fundamental graph structure at first time call of programm.
+
+## Files in directory
+
+initialize_graph.py 
+
+- 	Führt den grundlegendem Graphbauprozess aus. Die Input-DOIs werden 
+	als Klassenobjekt zur Knotenmenge hinzugefügt und über einen rekursiven Aufruf
+	wird die angegene Zitierungstiefe in beide Richtungen zu den Kanten hinzugefügt.
+
+
+add_citations_rec.py 
+
+- 	Die DOIs, die in den Zitierungen des Inputs zu finden sind, werden ebenfalls zu Knoten
+	und je nach angegebener Höhe oder Tiefe wird dies für weitere Tiefen erneut ausgeführt.
+
+
+export_to_json.py 
+
+- 	Wandelt die berechnete Knoten- und Kantenmenge in eine Json Datei um.
+
+## Authors
+- Donna Löding
+- Alina Molkentin
+- Xinyi Tang
+- Judith Große
+- Malte Schokolowski
\ No newline at end of file
diff --git a/verarbeitung/construct_new_graph/__init__.py b/verarbeitung/construct_new_graph/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/verarbeitung/construct_new_graph/add_citations_rec.py b/verarbeitung/construct_new_graph/add_citations_rec.py
new file mode 100644
index 0000000000000000000000000000000000000000..a00d1f6fc200dd30493075561833079fca9b65df
--- /dev/null
+++ b/verarbeitung/construct_new_graph/add_citations_rec.py
@@ -0,0 +1,187 @@
+# -*- coding: utf-8 -*-
+"""
+Functions to add citations recursivly for 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__ = ""
+
+
+import sys  
+from pathlib import Path
+from os import error
+sys.path.append("../")
+
+from input.publication import Publication
+from verarbeitung.get_pub_from_input import get_pub
+
+def get_cit_type_list(pub, cit_type):
+    '''
+        :param pub:                 Publication which citations will be added
+        :type pub:                  Publication
+
+        :param cit_type:            variable to differenciate citation and reference call
+        :type cit_type:             String
+
+        function to create nodes and edges and call create_graph_structure_citations
+    '''
+    if (cit_type == "Citation"):
+        return(pub.citations)
+    else:
+        return(pub.references)
+
+def create_global_lists_cit(input_nodes, input_edges, pub, search_depth, search_depth_max, cit_type, test_var):
+    '''
+        :param input_nodes:         list of nodes from Processing
+        :type input_nodes:          List[Publication]
+
+        :param input_edges:         list of edges from Processing
+        :type input_edges:          List[String, String]
+
+        :param pub:                 Publication which citations will be added
+        :type pub:                  Publication
+
+        :param search_depth:        current depth to search for citations
+        :type search_depth_max:     int
+
+        :param search_depth_max:    maximum depth to search for citations
+        :type search_depth_max:     int
+
+        :param cit_type:            variable to differenciate citation and reference call
+        :type cit_type:             String
+
+        :param test_var:            variable to differenciate between test and url call
+        :type test_var:             boolean
+
+        function to create nodes and edges and call create_graph_structure_citations
+    '''
+
+    global nodes, edges
+    nodes = input_nodes
+    edges = input_edges
+
+    return create_graph_structure_citations(pub, search_depth, search_depth_max, cit_type, test_var)
+
+
+def create_graph_structure_citations(pub, search_depth, search_depth_max, cit_type, test_var):
+    '''
+        :param pub:                 publication which citations will be added
+        :type pub:                  Publication
+
+        :param search_depth:        current depth to search for citations
+        :type search_depth_max:     int
+
+        :param search_depth_max:    maximum depth to search for citations
+        :type search_depth_max:     int
+
+        :param cit_type:            variable to differenciate citation and reference call
+        :type cit_type:             String
+
+        :param test_var:            variable to differenciate between test and url call
+        :type test_var:             boolean
+
+        adds a node for every citing publication unknown
+        adds edges to added citations
+    '''
+
+    citations_pub_obj_list = []
+    for citation in get_cit_type_list(pub, cit_type):
+        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_depth < search_depth_max): #checks if its a test and chooses input function accordingly
+                citation_pub_obj = get_pub(citation.doi_url, test_var)
+                if (type(citation_pub_obj) != Publication):
+                    print(pub)
+                    continue 
+                
+                if (cit_type == "Citation"):
+                    citation_pub_obj.group = search_depth + 1
+                    edges.append([citation_pub_obj.doi_url,pub.doi_url])
+                else:
+                    citation_pub_obj.group = -(search_depth + 1)
+                    edges.append([pub.doi_url,citation_pub_obj.doi_url])
+                nodes.append(citation_pub_obj)                   
+                citations_pub_obj_list.append(citation_pub_obj)
+
+        # adds just the edge if citation already exists   
+        else:
+            if (cit_type == "Citation"):      
+                if ([citation.doi_url,pub.doi_url] not in edges):
+                    edges.append([citation.doi_url,pub.doi_url])
+            else:
+                if ([pub.doi_url,citation.doi_url] not in edges):
+                    edges.append([pub.doi_url,citation.doi_url])   
+    return citations_pub_obj_list
+
+
+def process_citations_rec(citations_pub_obj_list, search_depth, search_depth_max, cit_type, test_var):  
+    '''
+        :param citations_pub_obj_list:  list of publications which citations will be added
+        :type citations_pub_obj_list:   List[Publication]
+
+        :param search_depth:        current depth to search for citations
+        :type search_depth_max:     int
+
+        :param search_depth_max:    maximum depth to search for citations
+        :type search_depth_max:     int
+
+        :param cit_type:            variable to differenciate citation and reference call
+        :type cit_type:             String
+
+        :param test_var:            variable to differenciate between test and url call
+        :type test_var:             boolean
+
+        recursive function to implement depth-first-search on citations
+    '''
+
+    # adds next level to nodes/edges
+    for pub in citations_pub_obj_list:
+        new_citation_pub_obj_list = create_graph_structure_citations(pub, search_depth, search_depth_max, cit_type, test_var)   
+
+        # If the maximum depth has not yet been reached, calls function recursivly with increased depth 
+        if (search_depth < search_depth_max):
+            process_citations_rec(new_citation_pub_obj_list, search_depth+1, search_depth_max, cit_type, test_var)
+
+
+def add_citations(input_nodes, input_edges, citations_pub_obj_list, search_depth, search_depth_max, cit_type, test_var):
+    '''
+        :param input_nodes:             list of nodes from Processing
+        :type input_nodes:              List[Publication]
+
+        :param input_edges:             list of edges from Processing
+        :type input_edges:              List[String, String]
+
+        :param citations_pub_obj_list:  list of publications which citations will be added
+        :type citations_pub_obj_list:   List[Publication]
+
+        :param search_depth:        current depth to search for citations
+        :type search_depth_max:     int
+
+        :param search_depth_max:    maximum depth to search for citations
+        :type search_depth_max:     int
+
+        :param cit_type:            variable to differenciate citation and reference call
+        :type cit_type:             String
+
+        :param test_var:            variable to differenciate between test and url call
+        :type test_var:             boolean
+
+        function to call recursive depth-first-search of citations
+    '''
+    global nodes, edges
+    nodes = input_nodes
+    edges = input_edges
+
+    process_citations_rec(citations_pub_obj_list, search_depth, search_depth_max, cit_type, test_var)
+    #return(nodes, edges)
\ No newline at end of file
diff --git a/verarbeitung/construct_new_graph/export_to_json.py b/verarbeitung/construct_new_graph/export_to_json.py
new file mode 100644
index 0000000000000000000000000000000000000000..c69a61befcc402f9aee5b2184db56e0ad245618f
--- /dev/null
+++ b/verarbeitung/construct_new_graph/export_to_json.py
@@ -0,0 +1,86 @@
+# -*- coding: utf-8 -*-
+"""
+Functions that format the computed graph to match the interface to the output-part and saves as a json file
+
+"""
+
+__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__ = ""
+
+import json
+
+
+def format_nodes(nodes):
+    '''
+        :param nodes:       list of publications to export to json
+        :type nodes:        List[Publication]
+
+        creates a list that contains a dictionary for each node
+    '''
+    list_of_node_dicts = list()
+    for node in nodes:
+        new_dict = dict()
+        new_dict["doi"] = node.doi_url
+        new_dict["name"] = node.title
+        new_dict["author"] = node.contributors
+        new_dict["year"] = node.publication_date
+        new_dict["journal"] = node.journal
+        if (node.group == 0):
+            new_dict["group"] = "Input"
+        elif (node.group > 0):
+            new_dict["group"] = "Citedby"
+        else:
+            new_dict["group"] = "Reference"
+        new_dict["depth"] = node.group
+        new_dict["citations"] = len(node.citations)
+        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(edges):
+    '''
+        :param edges:       list of links to export to json
+        :type edges:        List[String,String]
+
+        function to format links, append to list and return list to output_to_json
+    '''
+    list_of_edge_dicts = list()
+    for edge in edges:
+        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
+   
+
+def output_to_json(nodes, edges, json_file = 'json_text.json', test_var = False):
+    '''
+        :param nodes:       list of publications to export to json
+        :type nodes:        List[Publication]
+
+        :param edges:       list of links to export to json
+        :type edges:        List[String,String]
+
+        :param test_var:    variable to differenciate between test and url call
+        :type test_var:     boolean
+
+        function to export nodes and links as a dictionary to json file
+    '''
+    dict_of_all = dict()
+    list_of_node_dicts = format_nodes(nodes)
+    list_of_edge_dicts = format_edges(edges)
+    dict_of_all["nodes"] = list_of_node_dicts
+    dict_of_all["links"] = list_of_edge_dicts
+    if (test_var and json_file == 'json_text.json'):
+        with open('test_output.json','w') as outfile:
+            json.dump(dict_of_all, outfile)
+    else:
+        with open(json_file,'w') as outfile:
+            json.dump(dict_of_all, outfile)
diff --git a/verarbeitung/construct_new_graph/initialize_graph.py b/verarbeitung/construct_new_graph/initialize_graph.py
new file mode 100644
index 0000000000000000000000000000000000000000..ba86e8bc979de42c388c5e8fe0e4ced9282500f0
--- /dev/null
+++ b/verarbeitung/construct_new_graph/initialize_graph.py
@@ -0,0 +1,147 @@
+# -*- 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__ = ""
+
+
+import sys  
+from pathlib import Path
+from os import error
+sys.path.append("../")
+
+from input.publication import Publication
+from verarbeitung.get_pub_from_input import get_pub
+from .export_to_json import output_to_json
+from .add_citations_rec import add_citations, create_global_lists_cit
+
+
+def initialize_nodes_list(doi_input_list, search_depth_max, search_height_max, test_var):
+    '''
+        :param doi_input_list:      input list of doi from UI
+        :type doi_input_list:       List[String]
+
+        :param search_depth_max:    maximum depth to search for references
+        :type search_depth_max:     int
+
+        :param search_height_max:   maximum height to search for citations
+        :type search_height_max:    int
+
+        :param test_var:            variable to differenciate between test and url call
+        :type test_var:             boolean
+
+        adds input dois to nodes and retrieves citations and references for input publications
+    '''
+
+    # saves found citations and references in lists
+    references_pub_obj_list = []
+    citations_pub_obj_list = []
+
+    for pub_doi in doi_input_list: #iterates over every incoming doi
+        pub = get_pub(pub_doi, test_var)
+        if (type(pub) != Publication):
+            print(pub)
+            continue       
+
+        # checks if publication already exists in nodes
+        not_in_nodes = True #boolean value to check if a node already exists in the set of nodes
+        for node in nodes: #iterates over every node in the set of nodes
+            if (pub.doi_url == node.doi_url): #determines that a node with this doi already is in the set
+                not_in_nodes = False #false --> node will not be created
+                break
+        if (not_in_nodes): #there is no node with this doi in the set
+            nodes.append(pub) #appends Publication Object
+            pub.group = 0
+        else:
+            doi_input_list.remove(pub_doi) #deletes the doi-dublicate from input list
+
+        # inserts references as publication objects into list and 
+        # inserts first depth references into nodes/edges if maximum search depth > 0
+        for reference in create_global_lists_cit(nodes, edges, pub, 0, search_depth_max, "Reference", 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_global_lists_cit(nodes, edges, pub, 0, search_height_max, "Citation", test_var):
+            citations_pub_obj_list.append(citation)
+
+    return(references_pub_obj_list, citations_pub_obj_list)
+        
+
+
+def complete_inner_edges():
+    '''
+        completes inner edges between nodes of group height and depth
+    '''
+
+    for node in nodes:
+        if (node.group < 0):
+            for citation in node.citations:
+                for pub in nodes:
+                    if ((pub.doi_url == citation.doi_url) and ([citation.doi_url, node.doi_url] not in edges)):
+                        edges.append([citation.doi_url, node.doi_url])
+        if (node.group > 0):
+            for reference in node.references:
+                for pub in nodes:
+                    if ((pub.doi_url == reference.doi_url) and ([node.doi_url, reference.doi_url] not in edges)):
+                        edges.append([node.doi_url,reference.doi_url])
+
+
+def init_graph_construction(doi_input_list, search_depth, search_height, test_var = False):
+    '''
+        :param doi_input_list:  input list of doi from UI
+        :type doi_input_list:   List[String]
+
+        :param search_height:   maximum height to search for citations
+        :type search_height:    int
+
+        :param search_depth:    maximum depth to search for references
+        :type search_depth:     int
+
+        :param test_var:        variable to differenciate between test and url call
+        :type test_var:         boolean
+
+        main function to start graph generation
+    '''
+
+    # 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")       
+
+    
+    # creates empty lists to save nodes and 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
+    add_citations(nodes, edges, citations_obj_list, 1, search_height, "Citation", test_var)
+    add_citations(nodes, edges, references_obj_list, 1, search_depth, "Reference", test_var)
+
+    # adds edges between reference group and citation group of known publications
+    complete_inner_edges()
+
+    # calls a skript to save nodes and edges of graph in .json file
+    #output_to_json(nodes, edges, test_var)
+
+    return(nodes,edges)
diff --git a/verarbeitung/dev_files/README.md b/verarbeitung/dev_files/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..53ccd029db552570862ab3eef82313bcb43192f1
--- /dev/null
+++ b/verarbeitung/dev_files/README.md
@@ -0,0 +1 @@
+Dieser Ordner ist nur für uns intern, um Testläufe mir echten DOIs zu starten.
\ No newline at end of file
diff --git a/verarbeitung/dev_files/__init__.py b/verarbeitung/dev_files/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/verarbeitung/dev_files/print_graph_test.py b/verarbeitung/dev_files/print_graph_test.py
new file mode 100644
index 0000000000000000000000000000000000000000..b45e90956fd3535c08fafa5196c3b2f351985d13
--- /dev/null
+++ b/verarbeitung/dev_files/print_graph_test.py
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*-
+"""
+Functions to test and print the nodes and edges sets
+
+"""
+
+__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__ = ""
+
+
+import sys
+
+#sys.path.insert(1, 'C:\Users\Malte\Git\CiS-Projekt\ci-s-projekt-verarbeitung\input')
+sys.path.append("../../")
+from verarbeitung.construct_new_graph.initialize_graph import init_graph_construction
+from verarbeitung.update_graph.import_from_json import input_from_json
+from verarbeitung.update_graph.update_graph import update_graph
+
+# 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")
+    print(len(nodes))
+    print(len(edges))
+    print(" ")
+
+def print_extended_graph(nodes, edges):
+    print("Knoten:\n")
+    for node in nodes:
+        print(node.title, "\n")
+        print(node.doi_url)
+        for reference in node.references:
+            print(reference.doi_url)
+        for citation in node.citations:
+            print(citation.doi_url)
+    print("\nKanten:\n")
+    for edge in edges:
+        print(edge,"\n")
+    print(len(nodes))
+    print(len(edges))
+    print(" ")
+
+def print_simple(nodes, edges):
+    # for node in nodes:
+    #     print(node)
+    # for edge in edges:
+    #     print(edge)
+    print(len(nodes))
+    print(len(edges))
+    print(" ")
+
+# program test with some random dois
+def try_known_publications():
+    doi_list = []
+    doi_list.append('https://pubs.acs.org/doi/10.1021/acs.jcim.9b00249')
+    #doi_list.append('https://doi.org/10.1021/acs.jcim.9b00249')
+    doi_list.append('https://pubs.acs.org/doi/10.1021/acs.jcim.1c00203')
+    #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')
+    #doi_list.append('https://doi.org/10.1021/acs.jcim.5b00292')
+    
+    #doi_list.append('https://pubs.acs.org/doi/10.1021/acs.jcim.0c00675')
+    #url = sys.argv[1]
+    #arr.append[url]
+
+
+    nodes, edges = init_graph_construction(doi_list,2,2)
+
+    print_graph(nodes, edges) 
+
+    return(nodes, edges)
+
+def try_delete_nodes():
+    doi_list = []
+    doi_list.append('https://pubs.acs.org/doi/10.1021/acs.jcim.9b00249')
+    #doi_list.append('https://pubs.acs.org/doi/10.1021/acs.jcim.1c00203')
+    nodes, edges = init_graph_construction(doi_list,1,1)
+    #print_simple(nodes, edges)
+
+    # list_of_nodes_py, list_of_edges_py = input_from_json('json_text.json')
+    # doi_list = []
+    # doi_list.append('https://pubs.acs.org/doi/10.1021/acs.jcim.9b00249')
+    # valid_nodes, valid_edges = update_graph(doi_list, list_of_nodes_py, list_of_edges_py)
+    # print_simple(valid_nodes, valid_edges)
+
+def try_import():
+    nodes, edges = input_from_json('json_text.json')
+    print_extended_graph(nodes,edges)
+
+#nodes, edges = try_known_publications()
+#nodes_new, edges_new = input_from_json("json_text.json")
+#print_graph(nodes_new, edges_new)
+try_delete_nodes()
+
+#try_import()
\ No newline at end of file
diff --git a/verarbeitung/get_pub_from_input.py b/verarbeitung/get_pub_from_input.py
new file mode 100644
index 0000000000000000000000000000000000000000..2766ba836e2ae807c0950ac60389a4f620c39ba5
--- /dev/null
+++ b/verarbeitung/get_pub_from_input.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+"""
+A function to return an object of Type Publication for a given doi
+
+"""
+
+__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__ = ""
+
+
+import sys  
+from pathlib import Path
+sys.path.append("../")
+
+from input.interface import InputInterface as Input
+from verarbeitung.test.input_test import input_test_func
+
+
+def get_pub(pub_doi, test_var):
+    '''
+        :param pub_doi:  input doi to get Publication object for
+        :type pub_doi:   String
+
+        :param test_var:        variable to differenciate between test and url call
+        :type test_var:         boolean
+
+        function to return an object of type Publication for given input doi depending on whether its a test or url doi
+    '''
+    #checks if it's a test and chooses appropiate function
+    if(test_var): 
+        pub = input_test_func(pub_doi) 
+
+    #checks that it isnt a test and chooses standart-input function
+    else: 
+        inter = Input()
+        try:
+            pub = inter.get_publication(pub_doi) #creates an object of class Publication
+        except AttributeError:
+            pub = inter.get_publication(pub_doi)
+        except ValueError:
+            return(ValueError)
+        except IndexError:
+            return(IndexError)
+    return(pub)
\ No newline at end of file
diff --git a/verarbeitung/json_text.json b/verarbeitung/json_text.json
new file mode 100644
index 0000000000000000000000000000000000000000..aeb1ae04b7931c7e81e6ea73efcc52fd41dc20b0
--- /dev/null
+++ b/verarbeitung/json_text.json
@@ -0,0 +1 @@
+{"nodes": [{"doi": "https://doi.org/10.1021/acs.jcim.9b00249", "name": "Comparing Molecular Patterns Using the Example of SMARTS: Applications and Filter Collection Analysis", "author": ["Emanuel S. R. Ehmki", "Robert Schmidt", "Farina Ohm", "Matthias Rarey"], "year": "May 24, 2019", "journal": "Journal of Chemical Information and Modeling", "group": "Input", "depth": 0, "citations": 5}, {"doi": "https://doi.org/10.1021/acs.chemrev.1c00107", "name": "Combining Machine Learning and Computational Chemistry for Predictive Insights Into Chemical Systems", "author": ["John A. Keith", "Valentin Vassilev-Galindo", "Bingqing Cheng", "Stefan Chmiela", "Michael Gastegger", "Klaus-Robert M\u00fcller", "Alexandre Tkatchenko"], "year": "July 7, 2021", "journal": "Chem. Rev.", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "https://doi.org/10.1021/acs.jcim.0c00741", "name": "Disconnected Maximum Common Substructures under Constraints", "author": ["Robert Schmidt", "Florian Krull", "Anna Lina Heinzke", "Matthias Rarey"], "year": "December 16, 2020", "journal": "Journal of Chemical Information and Modeling", "group": "Citedby", "depth": 1, "citations": 0}, {"doi": "https://doi.org/10.1021/acs.jmedchem.0c01332", "name": "Evolution of Novartis\u2019 Small Molecule Screening Deck Design", "author": ["Ansgar Schuffenhauer", "Nadine Schneider", "Samuel Hintermann", "Douglas Auld", "Jutta Blank", "Simona Cotesta", "Caroline Engeloch", "Nikolas Fechner", "Christoph Gaul", "Jerome Giovannoni", "Johanna Jansen", "John Joslin", "Philipp Krastel", "Eugen Lounkine", "John Manchester", "Lauren G. Monovich", "Anna Paola Pelliccioli", "Manuel Schwarze", "Michael D. Shultz", "Nikolaus Stiefl", "Daniel K. Baeschlin"], "year": "November 3, 2020", "journal": "Journal of Medicinal Chemistry", "group": "Citedby", "depth": 1, "citations": 8}, {"doi": "https://doi.org/10.1021/acs.jcim.9b00250", "name": "Comparing Molecular Patterns Using the Example of SMARTS: Theory and Algorithms", "author": ["Robert Schmidt", "Emanuel S. R. Ehmki", "Farina Ohm", "Hans-Christian Ehrlich", "Andriy Mashychev", "Matthias Rarey"], "year": "May 23, 2019", "journal": "Journal of Chemical Information and Modeling", "group": "Citedby", "depth": 1, "citations": 12}, {"doi": "https://doi.org/10.1021/acs.jcim.1c00203", "name": "AutoDock Vina 1.2.0: New Docking Methods, Expanded Force Field, and Python Bindings", "author": ["Jerome Eberhardt", "Diogo Santos-Martins", "Andreas F. Tillack", "Stefano Forli"], "year": "July 19, 2021", "journal": "Journal of Chemical Information and Modeling", "group": "Input", "depth": 0, "citations": 1}, {"doi": "https://doi.org/10.1021/acs.jctc.0c01006", "name": "Accelerating AutoDock4 with GPUs and Gradient-Based Local Search", "author": ["Diogo Santos-Martins", "Leonardo Solis-Vasquez", "Andreas F Tillack", "Michel F Sanner", "Andreas Koch", "Stefano Forli"], "year": "January 6, 2021", "journal": "Journal of Chemical Theory and Computation", "group": "Reference", "depth": -1, "citations": 14}, {"doi": "https://doi.org/10.1021/acs.jctc.9b00557", "name": "Docking Flexible Cyclic Peptides with AutoDock CrankPep", "author": ["Yuqi Zhang", "Michel F. Sanner"], "year": "September 11, 2019", "journal": "Journal of Chemical Theory and Computation", "group": "Reference", "depth": -1, "citations": 9}, {"doi": "https://doi.org/10.1021/ci300604z", "name": "Lessons Learned in Empirical Scoring with smina from the CSAR 2011 Benchmarking Exercise", "author": ["David Ryan Koes", "Matthew P. Baumgartner", "Carlos J. Camacho"], "year": "February 4, 2013", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/acs.jctc.5b00834", "name": "Vina-Carb: Improving Glycosidic Angles during Carbohydrate Docking", "author": ["Anita K. Nivedha", "David F. Thieker", "Spandana Makeneni", "Huimin Hu", "Robert J. Woods"], "year": "January 8, 2016", "journal": "Journal of Chemical Theory and Computation", "group": "Reference", "depth": -1, "citations": 48}, {"doi": "https://doi.org/10.1021/ci700036j", "name": "Lennard-Jones Potential and Dummy Atom Settings to Overcome the AUTODOCK Limitation in Treating Flexible Ring Systems", "author": ["Stefano Forli", "Maurizio Botta"], "year": "June 22, 2007", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 32}, {"doi": "https://doi.org/10.1021/ci500209e", "name": "AutoDock4Zn: An Improved AutoDock Force Field for Small-Molecule Docking to Zinc Metalloproteins", "author": ["Diogo Santos-Martins", "Stefano Forli", "Maria Jo\u00e3o Ramos", "Arthur J. Olson"], "year": "June 15, 2014", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/jm2005145", "name": "A Force Field with Discrete Displaceable Waters and Desolvation Entropy for Hydrated Ligand Docking", "author": ["Stefano Forli", "Arthur J. Olson"], "year": "December 9, 2011", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/ci300399w", "name": "Consensus Docking: Improving the Reliability of Docking in a Virtual Screening Context", "author": ["Douglas R. Houston", "Malcolm D. Walkinshaw"], "year": "January 27, 2013", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/jp9723574", "name": "Inhomogeneous Fluid Approach to Solvation Thermodynamics. 1. Theory", "author": ["Themis Lazaridis"], "year": "April 14, 1998", "journal": "Journal of Physical Chemistry B", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/jp972358w", "name": "Inhomogeneous Fluid Approach to Solvation Thermodynamics. 2. Applications to Simple Fluids", "author": ["Themis Lazaridis"], "year": "April 14, 1998", "journal": "Journal of Physical Chemistry B", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/acs.jcim.0c00675", "name": "ZINC20\u2014A Free Ultralarge-Scale Chemical Database for Ligand Discovery", "author": ["John J. Irwin", "Khanh G. Tang", "Jennifer Young", "Chinzorig Dandarchuluun", "Benjamin R. Wong", "Munkhzul Khurelbaatar", "Yurii S. Moroz", "John Mayfield", "Roger A. Sayle"], "year": "October 29, 2020", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 26}, {"doi": "https://doi.org/10.1021/acs.jmedchem.7b01243", "name": "Structural Biology-Inspired Discovery of Novel KRAS\u2013PDE\u03b4 Inhibitors", "author": ["Yan Jiang", "Chunlin Zhuang", "Long Chen", "Junjie Lu", "Guoqiang Dong", "Zhenyuan Miao", "Wannian Zhang", "Jian Li", "Chunquan Sheng"], "year": "September 20, 2017", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -1, "citations": 12}, {"doi": "https://doi.org/10.1021/jm300687e", "name": "Directory of Useful Decoys, Enhanced (DUD-E): Better Ligands and Decoys for Better Benchmarking", "author": ["Michael M. Mysinger", "Michael Carchia", "John. J. Irwin", "Brian K. Shoichet"], "year": "June 20, 2012", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/acs.jcim.8b00312", "name": "Evaluation of AutoDock and AutoDock Vina on the CASF-2013 Benchmark", "author": ["Thomas Gaillard"], "year": "July 10, 2018", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 74}, {"doi": "https://doi.org/10.1021/acs.jcim.9b00778", "name": "Autodock Vina Adopts More Accurate Binding Poses but Autodock4 Forms Better Binding Affinity", "author": ["Nguyen Thanh Nguyen", "Trung Hai Nguyen", "T. Ngoc Han Pham", "Nguyen Truong Huy", "Mai Van Bay", "Minh Quan Pham", "Pham Cam Nam", "Van V. Vu", "Son Tung Ngo"], "year": "December 30, 2019", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 66}, {"doi": "https://doi.org/10.1021/jm0306430", "name": "Glide:\u2009 A New Approach for Rapid, Accurate Docking and Scoring. 1. Method and Assessment of Docking Accuracy", "author": ["Richard A. Friesner", "Jay L. Banks", "Robert B. Murphy", "Thomas A. Halgren", "Jasna J. Klicic", "Daniel T. Mainz", "Matthew P. Repasky", "Eric H. Knoll", "Mee Shelley", "Jason K. Perry", "David E. Shaw", "Perry Francis", "Peter S. Shenkin"], "year": "February 27, 2004", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -1, "citations": 97}, {"doi": "https://doi.org/10.1021/jm020406h", "name": "Surflex:\u2009 Fully Automatic Flexible Molecular Docking Using a Molecular Similarity-Based Search Engine", "author": ["Ajay N. Jain"], "year": "January 21, 2003", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/ci300493w", "name": "ID-Score: A New Empirical Scoring Function Based on a Comprehensive Set of Descriptors Related to Protein\u2013Ligand Interactions", "author": ["Guo-Bo Li", "Ling-Ling Yang", "Wen-Jing Wang", "Lin-Li Li", "Sheng-Yong Yang"], "year": "February 9, 2013", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 99}, {"doi": "https://doi.org/10.1021/jm049314d", "name": "A Knowledge-Based Energy Function for Protein\u2212Ligand, Protein\u2212Protein, and Protein\u2212DNA Complexes", "author": ["Chi Zhang", "Song Liu", "Qianqian Zhu", "Yaoqi Zhou"], "year": "February 16, 2005", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/acsomega.1c04320", "name": "Novel Anti-Hepatitis B Virus Activity of Euphorbia schimperi and Its Quercetin and Kaempferol Derivatives", "author": ["Mohammad K. Parvez", "Sarfaraz Ahmed", "Mohammed S. Al-Dosari", "Mazin A. S. Abdelwahid", "Ahmed H. Arbab", "Adnan J. Al-Rehaily", "Mai M. Al-Oqail"], "year": "October 21, 2021", "journal": "ACS Omega", "group": "Citedby", "depth": 1, "citations": 0}, {"doi": "https://doi.org/10.1021/acs.jpcb.1c08383", "name": "Molecular Simulations of Aqueous Electrolytes: Role of Explicit Inclusion of Charge Transfer into Force Fields", "author": ["Max L. Berkowitz"], "year": "November 22, 2021", "journal": "Journal of Physical Chemistry B", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "https://doi.org/10.1021/acs.jpca.1c06264", "name": "Topological Characterization and Graph Entropies of Tessellations of Kekulene Structures: Existence of Isentropic Structures and Applications to Thermochemistry, Nuclear Magnetic Resonance, and Electron Spin Resonance", "author": ["S. Ruth Julie Kavitha", "Jessie Abraham", "Micheal Arockiaraj", "Joseph Jency", "Krishnan Balasubramanian"], "year": "September 1, 2021", "journal": "J. Phys. Chem. A", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "https://doi.org/10.1021/acsmedchemlett.1c00251", "name": "The Growing Importance of Chirality in 3D Chemical Space Exploration and Modern Drug Discovery Approaches for Hit-ID", "author": ["Ilaria Proietti Silvestri", "Paul J. J. Colbon"], "year": "July 16, 2021", "journal": "ACS Med. Chem. Lett.", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "https://doi.org/10.1021/acs.jmedchem.1c00416", "name": "Target-Based Evaluation of \u201cDrug-Like\u201d Properties and Ligand Efficiencies", "author": ["Paul D. Leeson", "A. Patricia Bento", "Anna Gaulton", "Anne Hersey", "Emma J. Manners", "Chris J. Radoux", "Andrew R. Leach"], "year": "May 13, 2021", "journal": "Journal of Medicinal Chemistry", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "https://doi.org/10.1021/acs.jcim.1c00226", "name": "Automatic Identification of Lansoprazole Degradants under Stress Conditions by LC-HRMS with MassChemSite and WebChembase", "author": ["Stefano Bonciarelli", "Jenny Desantis", "Laura Goracci", "Lydia Siragusa", "Ismael Zamora", "Elisabeth Ortega-Carrasco"], "year": "June 1, 2021", "journal": "Journal of Chemical Information and Modeling", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "https://doi.org/10.1021/acs.chemrestox.0c00006", "name": "Computational Approaches to Identify Structural Alerts and Their Applications in Environmental Toxicology and Drug Discovery", "author": ["Hongbin Yang", "Chaofeng Lou", "Weihua Li", "Guixia Liu", "Yun Tang"], "year": "February 24, 2020", "journal": "Chem. Res. Toxicol.", "group": "Citedby", "depth": 2, "citations": 11}, {"doi": "https://doi.org/10.1021/acs.est.9b06379", "name": "Toward a Global Understanding of Chemical Pollution: A First Comprehensive Analysis of National and Regional Chemical Inventories", "author": ["Zhanyun Wang", "Glen W. Walker", "Derek C. G. Muir", "Kakuko Nagatani-Yoshida"], "year": "January 22, 2020", "journal": "Environ. Sci. Technol.", "group": "Citedby", "depth": 2, "citations": 100}, {"doi": "https://doi.org/10.1021/ci049714+", "name": "ZINC \u2212 A Free Database of Commercially Available Compounds for Virtual Screening", "author": ["John J. Irwin", "Brian K. Shoichet"], "year": "December 14, 2004", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -2, "citations": 98}, {"doi": "https://doi.org/10.1021/ci3001277", "name": "ZINC: A Free Tool to Discover Chemistry for Biology", "author": ["John J. Irwin", "Teague Sterling", "Michael M. Mysinger", "Erin S. Bolstad", "Ryan G. Coleman"], "year": "May 15, 2012", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -2, "citations": 100}, {"doi": "https://doi.org/10.1021/acs.jcim.5b00559", "name": "ZINC 15 \u2013 Ligand Discovery for Everyone", "author": ["Teague Sterling", "John J. Irwin"], "year": "October 19, 2015", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -2, "citations": 98}, {"doi": "https://doi.org/10.1021/ci7004498", "name": "Application of Belief Theory to Similarity Data Fusion for Use in Analog Searching and Lead Hopping", "author": ["Steven W. Muchmore", "Derek A. Debe", "James T. Metz", "Scott P. Brown", "Yvonne C. Martin", "Philip J. Hajduk"], "year": "April 17, 2008", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -2, "citations": 100}, {"doi": "https://doi.org/10.1021/jm020155c", "name": "Do Structurally Similar Molecules Have Similar Biological Activity?", "author": ["Yvonne C. Martin", "James L. Kofron", "Linda M. Traphagen"], "year": "August 13, 2002", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -2, "citations": 100}, {"doi": "https://doi.org/10.1021/jm9602928", "name": "The Properties of Known Drugs. 1. Molecular Frameworks", "author": ["Guy W. Bemis", "Mark A. Murcko"], "year": "July 19, 1996", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -2, "citations": 100}, {"doi": "https://doi.org/10.1021/ci025599w", "name": "Molecular Shape Diversity of Combinatorial Libraries:\u2009 A Prerequisite for Broad Bioactivity\u2020", "author": ["Wolfgang H. B. Sauer", "Matthias K. Schwarz"], "year": "March 14, 2003", "journal": "J. Chem. Inf. Comput. Sci.", "group": "Reference", "depth": -2, "citations": 99}], "links": [{"source": "https://doi.org/10.1021/acs.chemrev.1c00107", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00741", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.jmedchem.0c01332", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.jcim.9b00250", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/acs.jctc.0c01006"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/acs.jctc.9b00557"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/ci300604z"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/acs.jctc.5b00834"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/ci700036j"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/ci500209e"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/jm2005145"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/ci300399w"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/jp9723574"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/jp972358w"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/acs.jcim.0c00675"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/acs.jmedchem.7b01243"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/jm300687e"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/acs.jcim.8b00312"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/acs.jcim.9b00778"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/jm0306430"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/jm020406h"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/ci300493w"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/jm049314d"}, {"source": "https://doi.org/10.1021/acsomega.1c04320", "target": "https://doi.org/10.1021/acs.jcim.1c00203"}, {"source": "https://doi.org/10.1021/acs.jpcb.1c08383", "target": "https://doi.org/10.1021/acs.chemrev.1c00107"}, {"source": "https://doi.org/10.1021/acs.jpca.1c06264", "target": "https://doi.org/10.1021/acs.chemrev.1c00107"}, {"source": "https://doi.org/10.1021/acsmedchemlett.1c00251", "target": "https://doi.org/10.1021/acs.jmedchem.0c01332"}, {"source": "https://doi.org/10.1021/acs.jmedchem.1c00416", "target": "https://doi.org/10.1021/acs.jmedchem.0c01332"}, {"source": "https://doi.org/10.1021/acs.chemrev.1c00107", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00226", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00741", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.jmedchem.0c01332", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.chemrestox.0c00006", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.est.9b06379", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.jcim.9b00249", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00675", "target": "https://doi.org/10.1021/ci049714+"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00675", "target": "https://doi.org/10.1021/ci3001277"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00675", "target": "https://doi.org/10.1021/acs.jcim.5b00559"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00675", "target": "https://doi.org/10.1021/ci7004498"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00675", "target": "https://doi.org/10.1021/jm020155c"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00675", "target": "https://doi.org/10.1021/jm9602928"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00675", "target": "https://doi.org/10.1021/ci025599w"}, {"source": "https://doi.org/10.1021/acs.jcim.5b00559", "target": "https://doi.org/10.1021/ci049714+"}, {"source": "https://doi.org/10.1021/acs.jcim.5b00559", "target": "https://doi.org/10.1021/ci3001277"}, {"source": "https://doi.org/10.1021/acs.jcim.5b00559", "target": "https://doi.org/10.1021/jm300687e"}, {"source": "https://doi.org/10.1021/acs.jcim.8b00312", "target": "https://doi.org/10.1021/ci300604z"}, {"source": "https://doi.org/10.1021/acs.jctc.0c01006", "target": "https://doi.org/10.1021/ci700036j"}, {"source": "https://doi.org/10.1021/acs.jctc.9b00557", "target": "https://doi.org/10.1021/ci700036j"}, {"source": "https://doi.org/10.1021/ci500209e", "target": "https://doi.org/10.1021/ci700036j"}, {"source": "https://doi.org/10.1021/acs.jctc.0c01006", "target": "https://doi.org/10.1021/ci500209e"}, {"source": "https://doi.org/10.1021/acs.jctc.0c01006", "target": "https://doi.org/10.1021/jm2005145"}, {"source": "https://doi.org/10.1021/acs.jcim.8b00312", "target": "https://doi.org/10.1021/jm2005145"}, {"source": "https://doi.org/10.1021/ci500209e", "target": "https://doi.org/10.1021/jm2005145"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00741", "target": "https://doi.org/10.1021/jm300687e"}, {"source": "https://doi.org/10.1021/acs.jcim.9b00778", "target": "https://doi.org/10.1021/acs.jcim.8b00312"}, {"source": "https://doi.org/10.1021/acs.jctc.0c01006", "target": "https://doi.org/10.1021/acs.jcim.9b00778"}, {"source": "https://doi.org/10.1021/acs.jctc.0c01006", "target": "https://doi.org/10.1021/ci049714+"}, {"source": "https://doi.org/10.1021/ci7004498", "target": "https://doi.org/10.1021/jm020155c"}, {"source": "https://doi.org/10.1021/acsmedchemlett.1c00251", "target": "https://doi.org/10.1021/ci025599w"}, {"source": "https://doi.org/10.1021/acs.jmedchem.0c01332", "target": "https://doi.org/10.1021/ci025599w"}]}
\ No newline at end of file
diff --git a/verarbeitung/new_height.json b/verarbeitung/new_height.json
new file mode 100644
index 0000000000000000000000000000000000000000..f96362a05cea7ad954fa28bfc22074e15e9fa1cd
--- /dev/null
+++ b/verarbeitung/new_height.json
@@ -0,0 +1 @@
+{"nodes": [{"doi": "doi_lg_1_i", "name": "title_lg_1_i", "author": ["contributor_lg_1_i"], "year": "date_lg_1_i", "journal": "journal_lg_1_i", "group": "Input", "depth": 0, "citations": 2}, {"doi": "doi_lg_1_d11", "name": "title_lg_1_d11", "author": ["contributor_lg_1_d11"], "year": "date_lg_1_d11", "journal": "journal_lg_1_d11", "group": "Reference", "depth": -1, "citations": 1}, {"doi": "doi_lg_1_d12", "name": "title_lg_1_d12", "author": ["contributor_lg_1_d12"], "year": "date_lg_1_d12", "journal": "journal_lg_1_d12", "group": "Reference", "depth": -1, "citations": 2}, {"doi": "doi_lg_1_h11", "name": "title_lg_1_h11", "author": ["contributor_lg_1_h11"], "year": "date_lg_1_h11", "journal": "journal_lg_1_h11", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "doi_lg_1_h12", "name": "title_lg_1_h12", "author": ["contributor_lg_1_h12"], "year": "date_lg_1_h12", "journal": "journal_lg_1_h12", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "doi_lg_1_h21", "name": "title_lg_1_h21", "author": ["contributor_lg_1_h21"], "year": "date_lg_1_h21", "journal": "journal_lg_1_h21", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_1_h22", "name": "title_lg_1_h22", "author": ["contributor_lg_1_h22"], "year": "date_lg_1_h22", "journal": "journal_lg_1_h22", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_1_h23", "name": "title_lg_1_h23", "author": ["contributor_lg_1_h23"], "year": "date_lg_1_h23", "journal": "journal_lg_1_h23", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_1_d21", "name": "title_lg_1_d21", "author": ["contributor_lg_1_d21"], "year": "date_lg_1_d21", "journal": "journal_lg_1_d21", "group": "Reference", "depth": -2, "citations": 2}, {"doi": "doi_lg_1_d22", "name": "title_lg_1_d22", "author": ["contributor_lg_1_d22"], "year": "date_lg_1_d22", "journal": "journal_lg_1_d22", "group": "Reference", "depth": -2, "citations": 2}, {"doi": "doi_lg_1_d23", "name": "title_lg_1_d23", "author": ["contributor_lg_1_d23"], "year": "date_lg_1_d23", "journal": "journal_lg_1_d23", "group": "Reference", "depth": -2, "citations": 2}], "links": [{"source": "doi_lg_1_i", "target": "doi_lg_1_d11"}, {"source": "doi_lg_1_i", "target": "doi_lg_1_d12"}, {"source": "doi_lg_1_h11", "target": "doi_lg_1_i"}, {"source": "doi_lg_1_h12", "target": "doi_lg_1_i"}, {"source": "doi_lg_1_h21", "target": "doi_lg_1_h11"}, {"source": "doi_lg_1_h22", "target": "doi_lg_1_h11"}, {"source": "doi_lg_1_h22", "target": "doi_lg_1_h12"}, {"source": "doi_lg_1_h23", "target": "doi_lg_1_h12"}, {"source": "doi_lg_1_d11", "target": "doi_lg_1_d21"}, {"source": "doi_lg_1_d11", "target": "doi_lg_1_d22"}, {"source": "doi_lg_1_d21", "target": "doi_lg_1_d22"}, {"source": "doi_lg_1_d22", "target": "doi_lg_1_d21"}, {"source": "doi_lg_1_d12", "target": "doi_lg_1_d23"}, {"source": "doi_lg_1_h12", "target": "doi_lg_1_d12"}]}
\ No newline at end of file
diff --git "a/verarbeitung/n\303\266tige Tests.txt" "b/verarbeitung/n\303\266tige Tests.txt"
new file mode 100644
index 0000000000000000000000000000000000000000..95563280436fbf6b9b8702dffef6f32e213f5a16
--- /dev/null
+++ "b/verarbeitung/n\303\266tige Tests.txt"	
@@ -0,0 +1,4 @@
+Zyklus
+großer Zyklus
+Innere Kanten vervollständigen
+
diff --git a/verarbeitung/process_main.py b/verarbeitung/process_main.py
new file mode 100644
index 0000000000000000000000000000000000000000..4e0678386b6da3ee18d4a0f7b0c271f3167c93fd
--- /dev/null
+++ b/verarbeitung/process_main.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+"""
+main function to call 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__ = ""
+
+
+import sys  
+from pathlib import Path
+from os import error
+
+sys.path.append("../")
+
+from verarbeitung.construct_new_graph.export_to_json import output_to_json
+from verarbeitung.construct_new_graph.initialize_graph import init_graph_construction
+from verarbeitung.update_graph.update_graph import update_graph
+
+def Processing(url_list, search_depth, search_height, json_file = 'json_text.json'):
+    '''
+        :param url_list:        list of urls to construct publication graph for
+        :type url_list:         List[String]
+        
+        :param search_depth:    maximum depth to search for references
+        :type search_depth:     int
+
+        :param search_height:   maximum height to search for citations
+        :type search_height:    int
+
+        :param json_file:       file to export graph to
+        :type json_file:        String
+
+        main function to construct new or updated publication graphs
+    '''
+
+    # updates graph if json file is known in directory otherwise starts new graph construction
+    try:
+        with open(json_file) as f:
+            nodes, edges = update_graph(url_list, json_file, search_depth, search_height)
+            
+    except IOError:
+        nodes, edges = init_graph_construction(url_list, search_depth, search_height)
+    
+    # exports graph to given json file name
+    output_to_json(nodes, edges, json_file)
+    
\ No newline at end of file
diff --git a/verarbeitung/start_script.py b/verarbeitung/start_script.py
new file mode 100644
index 0000000000000000000000000000000000000000..71c0e8dadfc0a736f2e465fd78c56741631dacd2
--- /dev/null
+++ b/verarbeitung/start_script.py
@@ -0,0 +1,11 @@
+import sys
+from pathlib import Path
+from verarbeitung.process_main import Processing
+from verarbeitung.dev_files.print_graph_test import try_known_publications, try_delete_nodes
+
+
+doi_list = []
+doi_list.append('https://pubs.acs.org/doi/10.1021/acs.jcim.9b00249')
+#doi_list.append('https://doi.org/10.1021/acs.jcim.9b00249')
+doi_list.append('https://pubs.acs.org/doi/10.1021/acs.jcim.1c00203')
+Processing(doi_list, 2, 2, 'test.json')
\ No newline at end of file
diff --git a/verarbeitung/test.json b/verarbeitung/test.json
new file mode 100644
index 0000000000000000000000000000000000000000..aeb1ae04b7931c7e81e6ea73efcc52fd41dc20b0
--- /dev/null
+++ b/verarbeitung/test.json
@@ -0,0 +1 @@
+{"nodes": [{"doi": "https://doi.org/10.1021/acs.jcim.9b00249", "name": "Comparing Molecular Patterns Using the Example of SMARTS: Applications and Filter Collection Analysis", "author": ["Emanuel S. R. Ehmki", "Robert Schmidt", "Farina Ohm", "Matthias Rarey"], "year": "May 24, 2019", "journal": "Journal of Chemical Information and Modeling", "group": "Input", "depth": 0, "citations": 5}, {"doi": "https://doi.org/10.1021/acs.chemrev.1c00107", "name": "Combining Machine Learning and Computational Chemistry for Predictive Insights Into Chemical Systems", "author": ["John A. Keith", "Valentin Vassilev-Galindo", "Bingqing Cheng", "Stefan Chmiela", "Michael Gastegger", "Klaus-Robert M\u00fcller", "Alexandre Tkatchenko"], "year": "July 7, 2021", "journal": "Chem. Rev.", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "https://doi.org/10.1021/acs.jcim.0c00741", "name": "Disconnected Maximum Common Substructures under Constraints", "author": ["Robert Schmidt", "Florian Krull", "Anna Lina Heinzke", "Matthias Rarey"], "year": "December 16, 2020", "journal": "Journal of Chemical Information and Modeling", "group": "Citedby", "depth": 1, "citations": 0}, {"doi": "https://doi.org/10.1021/acs.jmedchem.0c01332", "name": "Evolution of Novartis\u2019 Small Molecule Screening Deck Design", "author": ["Ansgar Schuffenhauer", "Nadine Schneider", "Samuel Hintermann", "Douglas Auld", "Jutta Blank", "Simona Cotesta", "Caroline Engeloch", "Nikolas Fechner", "Christoph Gaul", "Jerome Giovannoni", "Johanna Jansen", "John Joslin", "Philipp Krastel", "Eugen Lounkine", "John Manchester", "Lauren G. Monovich", "Anna Paola Pelliccioli", "Manuel Schwarze", "Michael D. Shultz", "Nikolaus Stiefl", "Daniel K. Baeschlin"], "year": "November 3, 2020", "journal": "Journal of Medicinal Chemistry", "group": "Citedby", "depth": 1, "citations": 8}, {"doi": "https://doi.org/10.1021/acs.jcim.9b00250", "name": "Comparing Molecular Patterns Using the Example of SMARTS: Theory and Algorithms", "author": ["Robert Schmidt", "Emanuel S. R. Ehmki", "Farina Ohm", "Hans-Christian Ehrlich", "Andriy Mashychev", "Matthias Rarey"], "year": "May 23, 2019", "journal": "Journal of Chemical Information and Modeling", "group": "Citedby", "depth": 1, "citations": 12}, {"doi": "https://doi.org/10.1021/acs.jcim.1c00203", "name": "AutoDock Vina 1.2.0: New Docking Methods, Expanded Force Field, and Python Bindings", "author": ["Jerome Eberhardt", "Diogo Santos-Martins", "Andreas F. Tillack", "Stefano Forli"], "year": "July 19, 2021", "journal": "Journal of Chemical Information and Modeling", "group": "Input", "depth": 0, "citations": 1}, {"doi": "https://doi.org/10.1021/acs.jctc.0c01006", "name": "Accelerating AutoDock4 with GPUs and Gradient-Based Local Search", "author": ["Diogo Santos-Martins", "Leonardo Solis-Vasquez", "Andreas F Tillack", "Michel F Sanner", "Andreas Koch", "Stefano Forli"], "year": "January 6, 2021", "journal": "Journal of Chemical Theory and Computation", "group": "Reference", "depth": -1, "citations": 14}, {"doi": "https://doi.org/10.1021/acs.jctc.9b00557", "name": "Docking Flexible Cyclic Peptides with AutoDock CrankPep", "author": ["Yuqi Zhang", "Michel F. Sanner"], "year": "September 11, 2019", "journal": "Journal of Chemical Theory and Computation", "group": "Reference", "depth": -1, "citations": 9}, {"doi": "https://doi.org/10.1021/ci300604z", "name": "Lessons Learned in Empirical Scoring with smina from the CSAR 2011 Benchmarking Exercise", "author": ["David Ryan Koes", "Matthew P. Baumgartner", "Carlos J. Camacho"], "year": "February 4, 2013", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/acs.jctc.5b00834", "name": "Vina-Carb: Improving Glycosidic Angles during Carbohydrate Docking", "author": ["Anita K. Nivedha", "David F. Thieker", "Spandana Makeneni", "Huimin Hu", "Robert J. Woods"], "year": "January 8, 2016", "journal": "Journal of Chemical Theory and Computation", "group": "Reference", "depth": -1, "citations": 48}, {"doi": "https://doi.org/10.1021/ci700036j", "name": "Lennard-Jones Potential and Dummy Atom Settings to Overcome the AUTODOCK Limitation in Treating Flexible Ring Systems", "author": ["Stefano Forli", "Maurizio Botta"], "year": "June 22, 2007", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 32}, {"doi": "https://doi.org/10.1021/ci500209e", "name": "AutoDock4Zn: An Improved AutoDock Force Field for Small-Molecule Docking to Zinc Metalloproteins", "author": ["Diogo Santos-Martins", "Stefano Forli", "Maria Jo\u00e3o Ramos", "Arthur J. Olson"], "year": "June 15, 2014", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/jm2005145", "name": "A Force Field with Discrete Displaceable Waters and Desolvation Entropy for Hydrated Ligand Docking", "author": ["Stefano Forli", "Arthur J. Olson"], "year": "December 9, 2011", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/ci300399w", "name": "Consensus Docking: Improving the Reliability of Docking in a Virtual Screening Context", "author": ["Douglas R. Houston", "Malcolm D. Walkinshaw"], "year": "January 27, 2013", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/jp9723574", "name": "Inhomogeneous Fluid Approach to Solvation Thermodynamics. 1. Theory", "author": ["Themis Lazaridis"], "year": "April 14, 1998", "journal": "Journal of Physical Chemistry B", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/jp972358w", "name": "Inhomogeneous Fluid Approach to Solvation Thermodynamics. 2. Applications to Simple Fluids", "author": ["Themis Lazaridis"], "year": "April 14, 1998", "journal": "Journal of Physical Chemistry B", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/acs.jcim.0c00675", "name": "ZINC20\u2014A Free Ultralarge-Scale Chemical Database for Ligand Discovery", "author": ["John J. Irwin", "Khanh G. Tang", "Jennifer Young", "Chinzorig Dandarchuluun", "Benjamin R. Wong", "Munkhzul Khurelbaatar", "Yurii S. Moroz", "John Mayfield", "Roger A. Sayle"], "year": "October 29, 2020", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 26}, {"doi": "https://doi.org/10.1021/acs.jmedchem.7b01243", "name": "Structural Biology-Inspired Discovery of Novel KRAS\u2013PDE\u03b4 Inhibitors", "author": ["Yan Jiang", "Chunlin Zhuang", "Long Chen", "Junjie Lu", "Guoqiang Dong", "Zhenyuan Miao", "Wannian Zhang", "Jian Li", "Chunquan Sheng"], "year": "September 20, 2017", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -1, "citations": 12}, {"doi": "https://doi.org/10.1021/jm300687e", "name": "Directory of Useful Decoys, Enhanced (DUD-E): Better Ligands and Decoys for Better Benchmarking", "author": ["Michael M. Mysinger", "Michael Carchia", "John. J. Irwin", "Brian K. Shoichet"], "year": "June 20, 2012", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/acs.jcim.8b00312", "name": "Evaluation of AutoDock and AutoDock Vina on the CASF-2013 Benchmark", "author": ["Thomas Gaillard"], "year": "July 10, 2018", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 74}, {"doi": "https://doi.org/10.1021/acs.jcim.9b00778", "name": "Autodock Vina Adopts More Accurate Binding Poses but Autodock4 Forms Better Binding Affinity", "author": ["Nguyen Thanh Nguyen", "Trung Hai Nguyen", "T. Ngoc Han Pham", "Nguyen Truong Huy", "Mai Van Bay", "Minh Quan Pham", "Pham Cam Nam", "Van V. Vu", "Son Tung Ngo"], "year": "December 30, 2019", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 66}, {"doi": "https://doi.org/10.1021/jm0306430", "name": "Glide:\u2009 A New Approach for Rapid, Accurate Docking and Scoring. 1. Method and Assessment of Docking Accuracy", "author": ["Richard A. Friesner", "Jay L. Banks", "Robert B. Murphy", "Thomas A. Halgren", "Jasna J. Klicic", "Daniel T. Mainz", "Matthew P. Repasky", "Eric H. Knoll", "Mee Shelley", "Jason K. Perry", "David E. Shaw", "Perry Francis", "Peter S. Shenkin"], "year": "February 27, 2004", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -1, "citations": 97}, {"doi": "https://doi.org/10.1021/jm020406h", "name": "Surflex:\u2009 Fully Automatic Flexible Molecular Docking Using a Molecular Similarity-Based Search Engine", "author": ["Ajay N. Jain"], "year": "January 21, 2003", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/ci300493w", "name": "ID-Score: A New Empirical Scoring Function Based on a Comprehensive Set of Descriptors Related to Protein\u2013Ligand Interactions", "author": ["Guo-Bo Li", "Ling-Ling Yang", "Wen-Jing Wang", "Lin-Li Li", "Sheng-Yong Yang"], "year": "February 9, 2013", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -1, "citations": 99}, {"doi": "https://doi.org/10.1021/jm049314d", "name": "A Knowledge-Based Energy Function for Protein\u2212Ligand, Protein\u2212Protein, and Protein\u2212DNA Complexes", "author": ["Chi Zhang", "Song Liu", "Qianqian Zhu", "Yaoqi Zhou"], "year": "February 16, 2005", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -1, "citations": 100}, {"doi": "https://doi.org/10.1021/acsomega.1c04320", "name": "Novel Anti-Hepatitis B Virus Activity of Euphorbia schimperi and Its Quercetin and Kaempferol Derivatives", "author": ["Mohammad K. Parvez", "Sarfaraz Ahmed", "Mohammed S. Al-Dosari", "Mazin A. S. Abdelwahid", "Ahmed H. Arbab", "Adnan J. Al-Rehaily", "Mai M. Al-Oqail"], "year": "October 21, 2021", "journal": "ACS Omega", "group": "Citedby", "depth": 1, "citations": 0}, {"doi": "https://doi.org/10.1021/acs.jpcb.1c08383", "name": "Molecular Simulations of Aqueous Electrolytes: Role of Explicit Inclusion of Charge Transfer into Force Fields", "author": ["Max L. Berkowitz"], "year": "November 22, 2021", "journal": "Journal of Physical Chemistry B", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "https://doi.org/10.1021/acs.jpca.1c06264", "name": "Topological Characterization and Graph Entropies of Tessellations of Kekulene Structures: Existence of Isentropic Structures and Applications to Thermochemistry, Nuclear Magnetic Resonance, and Electron Spin Resonance", "author": ["S. Ruth Julie Kavitha", "Jessie Abraham", "Micheal Arockiaraj", "Joseph Jency", "Krishnan Balasubramanian"], "year": "September 1, 2021", "journal": "J. Phys. Chem. A", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "https://doi.org/10.1021/acsmedchemlett.1c00251", "name": "The Growing Importance of Chirality in 3D Chemical Space Exploration and Modern Drug Discovery Approaches for Hit-ID", "author": ["Ilaria Proietti Silvestri", "Paul J. J. Colbon"], "year": "July 16, 2021", "journal": "ACS Med. Chem. Lett.", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "https://doi.org/10.1021/acs.jmedchem.1c00416", "name": "Target-Based Evaluation of \u201cDrug-Like\u201d Properties and Ligand Efficiencies", "author": ["Paul D. Leeson", "A. Patricia Bento", "Anna Gaulton", "Anne Hersey", "Emma J. Manners", "Chris J. Radoux", "Andrew R. Leach"], "year": "May 13, 2021", "journal": "Journal of Medicinal Chemistry", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "https://doi.org/10.1021/acs.jcim.1c00226", "name": "Automatic Identification of Lansoprazole Degradants under Stress Conditions by LC-HRMS with MassChemSite and WebChembase", "author": ["Stefano Bonciarelli", "Jenny Desantis", "Laura Goracci", "Lydia Siragusa", "Ismael Zamora", "Elisabeth Ortega-Carrasco"], "year": "June 1, 2021", "journal": "Journal of Chemical Information and Modeling", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "https://doi.org/10.1021/acs.chemrestox.0c00006", "name": "Computational Approaches to Identify Structural Alerts and Their Applications in Environmental Toxicology and Drug Discovery", "author": ["Hongbin Yang", "Chaofeng Lou", "Weihua Li", "Guixia Liu", "Yun Tang"], "year": "February 24, 2020", "journal": "Chem. Res. Toxicol.", "group": "Citedby", "depth": 2, "citations": 11}, {"doi": "https://doi.org/10.1021/acs.est.9b06379", "name": "Toward a Global Understanding of Chemical Pollution: A First Comprehensive Analysis of National and Regional Chemical Inventories", "author": ["Zhanyun Wang", "Glen W. Walker", "Derek C. G. Muir", "Kakuko Nagatani-Yoshida"], "year": "January 22, 2020", "journal": "Environ. Sci. Technol.", "group": "Citedby", "depth": 2, "citations": 100}, {"doi": "https://doi.org/10.1021/ci049714+", "name": "ZINC \u2212 A Free Database of Commercially Available Compounds for Virtual Screening", "author": ["John J. Irwin", "Brian K. Shoichet"], "year": "December 14, 2004", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -2, "citations": 98}, {"doi": "https://doi.org/10.1021/ci3001277", "name": "ZINC: A Free Tool to Discover Chemistry for Biology", "author": ["John J. Irwin", "Teague Sterling", "Michael M. Mysinger", "Erin S. Bolstad", "Ryan G. Coleman"], "year": "May 15, 2012", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -2, "citations": 100}, {"doi": "https://doi.org/10.1021/acs.jcim.5b00559", "name": "ZINC 15 \u2013 Ligand Discovery for Everyone", "author": ["Teague Sterling", "John J. Irwin"], "year": "October 19, 2015", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -2, "citations": 98}, {"doi": "https://doi.org/10.1021/ci7004498", "name": "Application of Belief Theory to Similarity Data Fusion for Use in Analog Searching and Lead Hopping", "author": ["Steven W. Muchmore", "Derek A. Debe", "James T. Metz", "Scott P. Brown", "Yvonne C. Martin", "Philip J. Hajduk"], "year": "April 17, 2008", "journal": "Journal of Chemical Information and Modeling", "group": "Reference", "depth": -2, "citations": 100}, {"doi": "https://doi.org/10.1021/jm020155c", "name": "Do Structurally Similar Molecules Have Similar Biological Activity?", "author": ["Yvonne C. Martin", "James L. Kofron", "Linda M. Traphagen"], "year": "August 13, 2002", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -2, "citations": 100}, {"doi": "https://doi.org/10.1021/jm9602928", "name": "The Properties of Known Drugs. 1. Molecular Frameworks", "author": ["Guy W. Bemis", "Mark A. Murcko"], "year": "July 19, 1996", "journal": "Journal of Medicinal Chemistry", "group": "Reference", "depth": -2, "citations": 100}, {"doi": "https://doi.org/10.1021/ci025599w", "name": "Molecular Shape Diversity of Combinatorial Libraries:\u2009 A Prerequisite for Broad Bioactivity\u2020", "author": ["Wolfgang H. B. Sauer", "Matthias K. Schwarz"], "year": "March 14, 2003", "journal": "J. Chem. Inf. Comput. Sci.", "group": "Reference", "depth": -2, "citations": 99}], "links": [{"source": "https://doi.org/10.1021/acs.chemrev.1c00107", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00741", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.jmedchem.0c01332", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.jcim.9b00250", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/acs.jctc.0c01006"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/acs.jctc.9b00557"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/ci300604z"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/acs.jctc.5b00834"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/ci700036j"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/ci500209e"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/jm2005145"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/ci300399w"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/jp9723574"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/jp972358w"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/acs.jcim.0c00675"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/acs.jmedchem.7b01243"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/jm300687e"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/acs.jcim.8b00312"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/acs.jcim.9b00778"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/jm0306430"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/jm020406h"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/ci300493w"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00203", "target": "https://doi.org/10.1021/jm049314d"}, {"source": "https://doi.org/10.1021/acsomega.1c04320", "target": "https://doi.org/10.1021/acs.jcim.1c00203"}, {"source": "https://doi.org/10.1021/acs.jpcb.1c08383", "target": "https://doi.org/10.1021/acs.chemrev.1c00107"}, {"source": "https://doi.org/10.1021/acs.jpca.1c06264", "target": "https://doi.org/10.1021/acs.chemrev.1c00107"}, {"source": "https://doi.org/10.1021/acsmedchemlett.1c00251", "target": "https://doi.org/10.1021/acs.jmedchem.0c01332"}, {"source": "https://doi.org/10.1021/acs.jmedchem.1c00416", "target": "https://doi.org/10.1021/acs.jmedchem.0c01332"}, {"source": "https://doi.org/10.1021/acs.chemrev.1c00107", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.jcim.1c00226", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00741", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.jmedchem.0c01332", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.chemrestox.0c00006", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.est.9b06379", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.jcim.9b00249", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00675", "target": "https://doi.org/10.1021/ci049714+"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00675", "target": "https://doi.org/10.1021/ci3001277"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00675", "target": "https://doi.org/10.1021/acs.jcim.5b00559"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00675", "target": "https://doi.org/10.1021/ci7004498"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00675", "target": "https://doi.org/10.1021/jm020155c"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00675", "target": "https://doi.org/10.1021/jm9602928"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00675", "target": "https://doi.org/10.1021/ci025599w"}, {"source": "https://doi.org/10.1021/acs.jcim.5b00559", "target": "https://doi.org/10.1021/ci049714+"}, {"source": "https://doi.org/10.1021/acs.jcim.5b00559", "target": "https://doi.org/10.1021/ci3001277"}, {"source": "https://doi.org/10.1021/acs.jcim.5b00559", "target": "https://doi.org/10.1021/jm300687e"}, {"source": "https://doi.org/10.1021/acs.jcim.8b00312", "target": "https://doi.org/10.1021/ci300604z"}, {"source": "https://doi.org/10.1021/acs.jctc.0c01006", "target": "https://doi.org/10.1021/ci700036j"}, {"source": "https://doi.org/10.1021/acs.jctc.9b00557", "target": "https://doi.org/10.1021/ci700036j"}, {"source": "https://doi.org/10.1021/ci500209e", "target": "https://doi.org/10.1021/ci700036j"}, {"source": "https://doi.org/10.1021/acs.jctc.0c01006", "target": "https://doi.org/10.1021/ci500209e"}, {"source": "https://doi.org/10.1021/acs.jctc.0c01006", "target": "https://doi.org/10.1021/jm2005145"}, {"source": "https://doi.org/10.1021/acs.jcim.8b00312", "target": "https://doi.org/10.1021/jm2005145"}, {"source": "https://doi.org/10.1021/ci500209e", "target": "https://doi.org/10.1021/jm2005145"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00741", "target": "https://doi.org/10.1021/jm300687e"}, {"source": "https://doi.org/10.1021/acs.jcim.9b00778", "target": "https://doi.org/10.1021/acs.jcim.8b00312"}, {"source": "https://doi.org/10.1021/acs.jctc.0c01006", "target": "https://doi.org/10.1021/acs.jcim.9b00778"}, {"source": "https://doi.org/10.1021/acs.jctc.0c01006", "target": "https://doi.org/10.1021/ci049714+"}, {"source": "https://doi.org/10.1021/ci7004498", "target": "https://doi.org/10.1021/jm020155c"}, {"source": "https://doi.org/10.1021/acsmedchemlett.1c00251", "target": "https://doi.org/10.1021/ci025599w"}, {"source": "https://doi.org/10.1021/acs.jmedchem.0c01332", "target": "https://doi.org/10.1021/ci025599w"}]}
\ No newline at end of file
diff --git a/verarbeitung/test/README.md b/verarbeitung/test/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..79afed64d1efe590ebf60814882959c67c60de0e
--- /dev/null
+++ b/verarbeitung/test/README.md
@@ -0,0 +1,27 @@
+# Projekt CiS-Projekt 2021/22
+
+Directory to contain unittests for construction and update of publication graph
+
+## Files in directory
+
+input_test.py 
+
+- 	Immitiert die Arbeit der Input Gruppe auf eine sehr einfache Weise.
+	Beispielhafte Informationen werden aus Strings herausgelesen und als Klassenobjekt gespeichert.
+
+construct_graph_unittest.py 
+
+- 	Führt diverse Tests zur Konstruktion des Graphen ohne Vorkenntnisse mit eigenen Beispielen und 
+	unserer Input_test Funktion aus.
+
+update_graph_unittest.py
+
+-	Führt diverse Tests zum Updaten eines alten Graphs mit aktualisierter Input Liste mit eigenen 
+	Beispielen und unserer Input_test Funktion aus.
+
+## Authors
+- Donna Löding
+- Alina Molkentin
+- Xinyi Tang
+- Judith Große
+- Malte Schokolowski
\ No newline at end of file
diff --git a/verarbeitung/test/__init__.py b/verarbeitung/test/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/verarbeitung/test/construct_graph_unittest.py b/verarbeitung/test/construct_graph_unittest.py
new file mode 100644
index 0000000000000000000000000000000000000000..13f201c03a32d13d3364b5bd9af22c3e0efbebdc
--- /dev/null
+++ b/verarbeitung/test/construct_graph_unittest.py
@@ -0,0 +1,102 @@
+import unittest
+
+import sys  
+from pathlib import Path
+sys.path.append("../")
+
+from verarbeitung.construct_new_graph.initialize_graph import init_graph_construction
+
+class ConstructionTest(unittest.TestCase):
+     maxDiff = None
+
+
+     def testCycle(self):
+         nodes, edges = init_graph_construction(['doiz1'],1,1,True)
+         doi_nodes = keep_only_dois(nodes)
+         self.assertCountEqual(doi_nodes, ['doiz1', 'doiz2'])
+         self.assertCountEqual(edges, [['doiz1', 'doiz2'], ['doiz2', 'doiz1']])
+
+         nodes, edges = init_graph_construction(['doiz1'],2,2,True)
+         doi_nodes = keep_only_dois(nodes)
+         self.assertCountEqual(doi_nodes, ['doiz1', 'doiz2'])
+         self.assertCountEqual(edges, [['doiz2', 'doiz1'], ['doiz1', 'doiz2']])
+
+    #def testBigCycle(self):
+
+    #def testEmptyHeight(self):
+
+    #def testEmptyDepth(self):
+
+     def testEmptyDepthHeight(self):
+         nodes, edges = init_graph_construction(['doi1'],0,0,True)
+         doi_nodes = keep_only_dois(nodes)
+         self.assertCountEqual(doi_nodes,['doi1'])
+         self.assertCountEqual(edges, [])
+
+         nodes, edges = init_graph_construction(['doi1', 'doi2'],0,0,True)
+         doi_nodes = keep_only_dois(nodes)
+         self.assertCountEqual(doi_nodes, ['doi1','doi2'])
+         self.assertCountEqual(edges, [['doi1', 'doi2']])
+
+         nodes, edges = init_graph_construction(['doi1', 'doi2', 'doi3'],0,0,True)
+         doi_nodes = keep_only_dois(nodes)
+         self.assertCountEqual(doi_nodes, ['doi1','doi2', 'doi3'])
+         self.assertCountEqual(edges, [['doi3', 'doi1'], ['doi1', 'doi2']])
+
+
+     def testInnerEdges(self):
+        nodes, edges = init_graph_construction(['doi_ie1'],1,1,True)
+        doi_nodes = keep_only_dois(nodes)
+        self.assertCountEqual(doi_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 = init_graph_construction(['doi_h01'],1,0,True)
+          doi_nodes = keep_only_dois(nodes)
+          self.assertCountEqual(doi_nodes,['doi_h01'])
+          self.assertCountEqual(edges, [])
+
+          nodes, edges = init_graph_construction(['doi_h02'],1,0,True)
+          doi_nodes = keep_only_dois(nodes)
+          self.assertCountEqual(doi_nodes,['doi_h02','doi_h1'])
+          self.assertCountEqual(edges, [['doi_h1','doi_h02']])
+
+          nodes, edges = init_graph_construction(['doi_h02'],2,0,True)
+          doi_nodes = keep_only_dois(nodes)
+          self.assertCountEqual(doi_nodes,['doi_h02','doi_h1','doi_h2'])
+          self.assertCountEqual(edges, [['doi_h1','doi_h02'], ['doi_h2','doi_h1']])
+
+     def testRightDepth(self):
+          nodes, edges = init_graph_construction(['doi_d01'],0,1,True)
+          doi_nodes = keep_only_dois(nodes)
+          self.assertCountEqual(doi_nodes,['doi_d01'])
+          self.assertCountEqual(edges, [])
+
+          nodes, edges = init_graph_construction(['doi_d02'],0,1,True)
+          doi_nodes = keep_only_dois(nodes)
+          self.assertCountEqual(doi_nodes,['doi_d02','doi_d1'])
+          self.assertCountEqual(edges, [['doi_d02','doi_d1']])
+
+          nodes, edges = init_graph_construction(['doi_d02'],0,2,True)
+          doi_nodes = keep_only_dois(nodes)
+          self.assertCountEqual(doi_nodes,['doi_d02','doi_d1','doi_d2'])
+          self.assertCountEqual(edges, [['doi_d02','doi_d1'], ['doi_d1','doi_d2']])
+
+
+
+
+def keep_only_dois(nodes):
+     '''
+          :param nodes:  input list of nodes of type Publication
+          :type nodes:   List[Publication]
+
+          gets nodes of type pub and return only their doi
+    '''
+     doi_list = []
+     for node in nodes:
+          doi_list.append(node.doi_url)
+     return doi_list
+
+
+if __name__ == "__main__":
+     unittest.main()
\ No newline at end of file
diff --git a/verarbeitung/test/input_test.py b/verarbeitung/test/input_test.py
new file mode 100644
index 0000000000000000000000000000000000000000..a701f7e294ccbda42f29973078921a3b330b948b
--- /dev/null
+++ b/verarbeitung/test/input_test.py
@@ -0,0 +1,104 @@
+import sys
+sys.path.append("../")
+
+from input.publication import Publication, Citation
+
+
+def input_test_func(pub_doi):
+    '''
+        :param pub_doi: pub doi to find publication in list_of_arrays
+        :type pub_doi:  String
+
+        returns the publication class for given 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], [], [])
+            pub.citations = cit(array[7], "Citation")
+            pub.references = cit(array[6], "Reference")
+            return pub
+
+
+def cit(list_doi, cit_type):
+    '''
+        :param list_doi list of citation dois to get their Citation Class 
+        :type list_doi: List[String]
+
+        returns a list of citations objects for given doi list
+    '''
+
+    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], cit_type))
+    return cits
+
+
+
+beispiel1 = ['doi1', 'title1', ['contributor1'], 'journal1', 'date1', ['subject1'], ['doi2'], ['doi3']]
+beispiel2 = ['doi2', 'title2', ['contributor2'], 'journal2', 'date2', ['subject2'], [], ['doi1']]
+beispiel3 = ['doi3', 'title3', ['contributor3'], 'journal3', 'date3', ['subject3'], ['doi1'], []]
+
+zyklus1 = ['doiz1', 'titlez1', ['contributorz1.1', 'contributorz1.2'], 'journalz1', 'datez1', ['subjectz1'], ['doiz2'], ['doiz2']]
+zyklus2 = ['doiz2', 'titlez2', ['contributorz2.1', 'contributorz2.2'], 'journalz2', 'datez2', ['subjectz1'], ['doiz1'], ['doiz1']]
+
+inner_edge1 = ['doi_ie1', 'title_ie1', ['contributor_ie1.1', 'contributor_ie1.2'], 'journal_ie1', 'date_ie1', ['subject_ie1'], ['doi_ie2'], ['doi_ie3']]
+inner_edge2 = ['doi_ie2', 'title_ie2', ['contributor_ie2.1', 'contributor_ie2.2'], 'journal_ie2', 'date_ie2', ['subject_ie2'], [], ['doi_ie1','doi_ie3']]
+inner_edge3 = ['doi_ie3', 'titlez_ie3', ['contributor_ie3.1', 'contributor_ie3.2'], 'journal_ie3', 'date_ie3', ['subject_ie3'], ['doi_ie1','doi_ie2'], []]
+
+right_height01 = ['doi_h01', 'title_h01', ['contributor_h01'], 'journal_h01', 'date_h01', ['subject_h01'], [], []]
+right_height02 = ['doi_h02', 'title_h02', ['contributor_h02'], 'journal_h02', 'date_h02', ['subject_h02'], [], ['doi_h1']]
+right_height1 = ['doi_h1', 'title_h1', ['contributor_h1'], 'journal_h1', 'date_h1', ['subject_h1'], [], ['doi_h2']]
+right_height2 = ['doi_h2', 'title_h2', ['contributor_h2'], 'journal_h2', 'date_h2', ['subject_h2'], [], ['doi_h3']]
+right_height3 = ['doi_h3', 'title_h3', ['contributor_h3'], 'journal_h3', 'date_h3', ['subject_h3'], [], []]
+
+right_depth01 = ['doi_d01', 'title_d01', ['contributor_d01'], 'journal_d01', 'date_d01', ['subject_d01'], [], []]
+right_depth02 = ['doi_d02', 'title_d02', ['contributor_d02'], 'journal_d02', 'date_d02', ['subject_d01'], ['doi_d1'], []]
+right_depth1 = ['doi_d1', 'title_d1', ['contributor_d1'], 'journal_d1', 'date_d1', ['subject_d1'], ['doi_d2'], []]
+right_depth2 = ['doi_d2', 'title_d2', ['contributor_d2'], 'journal_d2', 'date_d2', ['subject_d2'], ['doi_d3'], []]
+right_depth3 = ['doi_d3', 'title_d3', ['contributor_d3'], 'journal_d3', 'date_d3', ['subject_d3'], [], []]
+
+large_graph_1_h21 = ['doi_lg_1_h21', 'title_lg_1_h21', ['contributor_lg_1_h21'], 'journal_lg_1_h21', 'date_lg_1_h21', ['subject_lg_1_h21'], ['doi_lg_1_h11'], []]
+large_graph_1_h22 = ['doi_lg_1_h22', 'title_lg_1_h22', ['contributor_lg_1_h22'], 'journal_lg_1_h22', 'date_lg_1_h22', ['subject_lg_1_h22'], ['doi_lg_1_h11','doi_lg_1_h12'], []]
+large_graph_1_h23 = ['doi_lg_1_h23', 'title_lg_1_h23', ['contributor_lg_1_h23'], 'journal_lg_1_h23', 'date_lg_1_h23', ['subject_lg_1_h23'], ['doi_lg_1_h12','doi_cg_i'], []]
+large_graph_1_h11 = ['doi_lg_1_h11', 'title_lg_1_h11', ['contributor_lg_1_h11'], 'journal_lg_1_h11', 'date_lg_1_h11', ['subject_lg_1_h11'], ['doi_lg_1_i'], ['doi_lg_1_h21','doi_lg_1_h22']]
+large_graph_1_h12 = ['doi_lg_1_h12', 'title_lg_1_h12', ['contributor_lg_1_h12'], 'journal_lg_1_h12', 'date_lg_1_h12', ['subject_lg_1_h12'], ['doi_lg_1_i','doi_lg_1_d12'], ['doi_lg_1_h22','doi_lg_1_h23']]
+large_graph_1_i =   ['doi_lg_1_i'  , 'title_lg_1_i'  , ['contributor_lg_1_i']  , 'journal_lg_1_i'  , 'date_lg_1_i'  , ['subject_lg_1_i']  , ['doi_lg_1_d11','doi_lg_1_d12'], ['doi_lg_1_h11','doi_lg_1_h12']]
+large_graph_1_d11 = ['doi_lg_1_d11', 'title_lg_1_d11', ['contributor_lg_1_d11'], 'journal_lg_1_d11', 'date_lg_1_d11', ['subject_lg_1_d11'], ['doi_lg_1_d21','doi_lg_1_d22'], ['doi_lg_1_i']]
+large_graph_1_d12 = ['doi_lg_1_d12', 'title_lg_1_d12', ['contributor_lg_1_d12'], 'journal_lg_1_d12', 'date_lg_1_d12', ['subject_lg_1_d12'], ['doi_lg_1_d23'], ['doi_lg_1_h12','doi_lg_1_i']]
+large_graph_1_d21 = ['doi_lg_1_d21', 'title_lg_1_d21', ['contributor_lg_1_d21'], 'journal_lg_1_d21', 'date_lg_1_d21', ['subject_lg_1_d21'], ['doi_lg_1_d22'], ['doi_lg_1_d11','doi_lg_1_d22']]
+large_graph_1_d22 = ['doi_lg_1_d22', 'title_lg_1_d22', ['contributor_lg_1_d22'], 'journal_lg_1_d22', 'date_lg_1_d22', ['subject_lg_1_d22'], ['doi_lg_1_d21'], ['doi_lg_1_d11','doi_lg_1_d21']]
+large_graph_1_d23 = ['doi_lg_1_d23', 'title_lg_1_d23', ['contributor_lg_1_d23'], 'journal_lg_1_d23', 'date_lg_1_d23', ['subject_lg_1_d23'], [], ['doi_lg_1_d12','doi_cg_d11']]
+
+large_graph_2_h21 = ['doi_lg_2_h21', 'title_lg_2_h21', ['contributor_lg_2_h21'], 'journal_lg_2_h21', 'date_lg_2_h21', ['subject_lg_2_h21'], ['doi_lg_2_h11'], []]
+large_graph_2_h22 = ['doi_lg_2_h22', 'title_lg_2_h22', ['contributor_lg_2_h22'], 'journal_lg_2_h22', 'date_lg_2_h22', ['subject_lg_2_h22'], ['doi_lg_2_h11'], []]
+large_graph_2_h23 = ['doi_lg_2_h23', 'title_lg_2_h23', ['contributor_lg_2_h23'], 'journal_lg_2_h23', 'date_lg_2_h23', ['subject_lg_2_h23'], ['doi_lg_2_h12','doi_lg_2_h24'], ['doi_lg_2_h24']]
+large_graph_2_h24 = ['doi_lg_2_h24', 'title_lg_2_h24', ['contributor_lg_2_h24'], 'journal_lg_2_h24', 'date_lg_2_h24', ['subject_lg_2_h24'], ['doi_lg_2_h12','doi_lg_2_h23','doi_lg_2_d12'], ['doi_lg_2_h23']]
+large_graph_2_h11 = ['doi_lg_2_h11', 'title_lg_2_h11', ['contributor_lg_2_h11'], 'journal_lg_2_h11', 'date_lg_2_h11', ['subject_lg_2_h11'], ['doi_lg_2_i','doi_cg_i'], ['doi_lg_2_h21','doi_lg_2_h22']]
+large_graph_2_h12 = ['doi_lg_2_h12', 'title_lg_2_h12', ['contributor_lg_2_h12'], 'journal_lg_2_h12', 'date_lg_2_h12', ['subject_lg_2_h12'], ['doi_lg_2_i'], ['doi_lg_2_h23','doi_lg_2_h24']]
+large_graph_2_i =   ['doi_lg_2_i'  , 'title_lg_2_i'  , ['contributor_lg_2_i']  , 'journal_lg_2_i'  , 'date_lg_2_i'  , ['subject_lg_2_i']  , ['doi_lg_2_d11','doi_lg_2_d12'], ['doi_lg_2_h11','doi_lg_2_h12','doi_cg_i','doi_lg_2_h11']]
+large_graph_2_d11 = ['doi_lg_2_d11', 'title_lg_2_d11', ['contributor_lg_2_d11'], 'journal_lg_2_d11', 'date_lg_2_d11', ['subject_lg_2_d11'], ['doi_lg_2_i','doi_lg_2_d21'], ['doi_lg_2_i']]
+large_graph_2_d12 = ['doi_lg_2_d12', 'title_lg_2_d12', ['contributor_lg_2_d12'], 'journal_lg_2_d12', 'date_lg_2_d12', ['subject_lg_2_d12'], ['doi_lg_2_d22','doi_lg_2_d23','doi_lg_2_d24'], ['doi_lg_2_h24','doi_lg_2_i']]
+large_graph_2_d21 = ['doi_lg_2_d21', 'title_lg_2_d21', ['contributor_lg_2_d21'], 'journal_lg_2_d21', 'date_lg_2_d21', ['subject_lg_2_d21'], [], ['doi_lg_2_d11']]
+large_graph_2_d22 = ['doi_lg_2_d22', 'title_lg_2_d22', ['contributor_lg_2_d22'], 'journal_lg_2_d22', 'date_lg_2_d22', ['subject_lg_2_d22'], [], ['doi_lg_2_d12']]
+large_graph_2_d23 = ['doi_lg_2_d23', 'title_lg_2_d23', ['contributor_lg_2_d23'], 'journal_lg_2_d23', 'date_lg_2_d23', ['subject_lg_2_d23'], [], ['doi_lg_2_d12']]
+large_graph_2_d24 = ['doi_lg_2_d24', 'title_lg_2_d24', ['contributor_lg_2_d24'], 'journal_lg_2_d24', 'date_lg_2_d24', ['subject_lg_2_d24'], [], ['doi_lg_2_d12']]
+
+crossed_graph_h21 = ['doi_cg_h21', 'title_cg_h21', ['contributor_cg_h21'], 'journal_cg_h21', 'date_cg_h21', ['subject_cg_h21'], ['doi_cg_h11'], []]
+crossed_graph_h22 = ['doi_cg_h22', 'title_cg_h22', ['contributor_cg_h22'], 'journal_cg_h22', 'date_cg_h22', ['subject_cg_h22'], ['doi_cg_h11'], []]
+crossed_graph_h11 = ['doi_cg_h11', 'title_cg_h11', ['contributor_cg_h11'], 'journal_cg_h11', 'date_cg_h11', ['subject_cg_h11'], ['doi_cg_i'], ['doi_cg_h21','doi_cg_h22']]
+crossed_graph_i =   ['doi_cg_i', 'title_cg_i', ['contributor_cg_i'], 'journal_cg_i', 'date_cg_i', ['subject_cg_i'], ['doi_lg_2_i','doi_cg_d11','doi_cg_d12'], ['doi_lg_1_h23','doi_cg_h11','doi_lg_2_h11']]
+crossed_graph_d11 = ['doi_cg_d11', 'title_cg_d11', ['contributor_cg_d11'], 'journal_cg_d11', 'date_cg_d11', ['subject_cg_d11'], ['doi_lg_1_d23','doi_cg_d21'], ['doi_cg_i']]
+crossed_graph_d12 = ['doi_cg_d12', 'title_cg_d12', ['contributor_cg_d12'], 'journal_cg_d12', 'date_cg_d12', ['subject_cg_d12'], ['doi_cg_d22'], ['doi_cg_i']]
+crossed_graph_d21 = ['doi_cg_d21', 'title_cg_d21', ['contributor_cg_d21'], 'journal_cg_d21', 'date_cg_d21', ['subject_cg_d21'], [], ['doi_cg_d11']]
+crossed_graph_d22 = ['doi_cg_d22', 'title_cg_d22', ['contributor_cg_d22'], 'journal_cg_d22', 'date_cg_d22', ['subject_cg_d22'], [], ['doi_cg_d12']]
+
+
+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,
+                    large_graph_1_h21, large_graph_1_h22, large_graph_1_h23, large_graph_1_h11, large_graph_1_h12, large_graph_1_i, large_graph_1_d11, large_graph_1_d12,
+                    large_graph_1_d21, large_graph_1_d22, large_graph_1_d23, large_graph_2_h21, large_graph_2_h22, large_graph_2_h23, large_graph_2_h24, large_graph_2_h11, large_graph_2_h12, 
+                    large_graph_2_i, large_graph_2_d11, large_graph_2_d12, large_graph_2_d21, large_graph_2_d22, large_graph_2_d23, crossed_graph_h21, crossed_graph_h22, crossed_graph_h11,
+                    crossed_graph_i, crossed_graph_d11, crossed_graph_d12, crossed_graph_d21, crossed_graph_d22]
diff --git a/verarbeitung/test/test_graphs_plan.pdf b/verarbeitung/test/test_graphs_plan.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..c45b187bf3665e98fc84a4267bad2cbb9e3e64fa
Binary files /dev/null and b/verarbeitung/test/test_graphs_plan.pdf differ
diff --git a/verarbeitung/test/update_graph_unittest.py b/verarbeitung/test/update_graph_unittest.py
new file mode 100644
index 0000000000000000000000000000000000000000..cf8261af6307585aa641c8a9c388e00ad6c7cadd
--- /dev/null
+++ b/verarbeitung/test/update_graph_unittest.py
@@ -0,0 +1,73 @@
+import unittest
+
+import sys  
+from pathlib import Path
+
+sys.path.append("../")
+
+from verarbeitung.construct_new_graph.initialize_graph import init_graph_construction
+from verarbeitung.construct_new_graph.export_to_json import output_to_json
+from verarbeitung.update_graph.import_from_json import input_from_json
+from verarbeitung.update_graph.update_graph import update_graph
+
+class UpdatingTest(unittest.TestCase):
+     maxDiff = None
+
+     # def test_import_from_json(self):
+     #      nodes_old, edges_old = init_graph_construction(['doi_lg_1_i'],2,2,True)
+     #      output_to_json(nodes_old, edges_old, test_var = True)
+     #      nodes_new, edges_new = input_from_json('test_output.json')
+     #      self.assertCountEqual(nodes_old,nodes_new)
+     #      self.assertCountEqual(edges_old, edges_new)
+
+     # def test_deleted_input_dois(self):
+     #      nodes_old_single, edges_old_single = init_graph_construction(['doi_lg_1_i'],2,2,True)
+     #      nodes_old_both, edges_old_both = init_graph_construction(['doi_lg_1_i','doi_lg_2_i'],2,2,True)
+     #      output_to_json(nodes_old_both, edges_old_both, test_var=True)
+     #      nodes_new_single, edges_new_single = update_graph(['doi_lg_1_i'], 'test_output.json', 2, 2, True)
+     #      self.assertCountEqual(nodes_old_single,nodes_new_single)
+     #      self.assertCountEqual(edges_old_single, edges_new_single)
+
+     #      nodes_old_single, edges_old_single = init_graph_construction(['doi_cg_i'],3,3,True)
+     #      nodes_old_two, edges_old_two = init_graph_construction(['doi_lg_1_i','doi_cg_i'],3,3,True)
+     #      nodes_old_three, edges_old_three = init_graph_construction(['doi_lg_1_i','doi_lg_2_i','doi_cg_i'],3,3,True)
+
+     def test_new_height(self):
+          nodes_height_0, edges_height_0 = init_graph_construction(['doi_lg_1_i'],2,0,True)
+          nodes_height_1, edges_height_1 = init_graph_construction(['doi_lg_1_i'],2,1,True)
+          nodes_height_2, edges_height_2 = init_graph_construction(['doi_lg_1_i'],2,2,True)
+
+          output_to_json(nodes_height_2, edges_height_2, 'new_height.json', True)
+          nodes_new_height_1, edges_new_height_1 = update_graph(['doi_lg_1_i'], 'new_height.json', 2, 1, True)
+          self.assertCountEqual(nodes_height_1, nodes_new_height_1)
+          self.assertCountEqual(edges_height_1, edges_new_height_1)
+
+          nodes_height_2, edges_height_2 = init_graph_construction(['doi_lg_1_i'],2,2,True)
+          output_to_json(nodes_height_2, edges_height_2, 'new_height.json', True)
+          nodes_new_height_0, edges_new_height_0 = update_graph(['doi_lg_1_i'], 'new_height.json', 2, 0, True)
+          self.assertCountEqual(nodes_height_0, nodes_new_height_0)
+          self.assertCountEqual(edges_height_0, edges_new_height_0)
+
+
+
+
+
+          
+
+
+
+def keep_only_dois(nodes):
+     '''
+          :param nodes:  input list of nodes of type Publication
+          :type nodes:   List[Publication]
+
+          gets nodes of type pub and return only their doi
+     '''
+     doi_list = []
+     for node in nodes:
+          doi_list.append(node.doi_url)
+     return doi_list
+
+
+if __name__ == "__main__":
+     unittest.main()
\ No newline at end of file
diff --git a/verarbeitung/test_output.json b/verarbeitung/test_output.json
new file mode 100644
index 0000000000000000000000000000000000000000..840e19dbb925319d75057380b5dbf2c1176e139a
--- /dev/null
+++ b/verarbeitung/test_output.json
@@ -0,0 +1 @@
+{"nodes": [{"doi": "doi_lg_1_i", "name": "title_lg_1_i", "author": ["contributor_lg_1_i"], "year": "date_lg_1_i", "journal": "journal_lg_1_i", "group": "Input", "depth": 0, "citations": 2}, {"doi": "doi_lg_1_d11", "name": "title_lg_1_d11", "author": ["contributor_lg_1_d11"], "year": "date_lg_1_d11", "journal": "journal_lg_1_d11", "group": "Reference", "depth": -1, "citations": 1}, {"doi": "doi_lg_1_d12", "name": "title_lg_1_d12", "author": ["contributor_lg_1_d12"], "year": "date_lg_1_d12", "journal": "journal_lg_1_d12", "group": "Reference", "depth": -1, "citations": 2}, {"doi": "doi_lg_1_h11", "name": "title_lg_1_h11", "author": ["contributor_lg_1_h11"], "year": "date_lg_1_h11", "journal": "journal_lg_1_h11", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "doi_lg_1_h12", "name": "title_lg_1_h12", "author": ["contributor_lg_1_h12"], "year": "date_lg_1_h12", "journal": "journal_lg_1_h12", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "doi_lg_2_i", "name": "title_lg_2_i", "author": ["contributor_lg_2_i"], "year": "date_lg_2_i", "journal": "journal_lg_2_i", "group": "Input", "depth": 0, "citations": 4}, {"doi": "doi_lg_2_d11", "name": "title_lg_2_d11", "author": ["contributor_lg_2_d11"], "year": "date_lg_2_d11", "journal": "journal_lg_2_d11", "group": "Reference", "depth": -1, "citations": 1}, {"doi": "doi_lg_2_d12", "name": "title_lg_2_d12", "author": ["contributor_lg_2_d12"], "year": "date_lg_2_d12", "journal": "journal_lg_2_d12", "group": "Reference", "depth": -1, "citations": 2}, {"doi": "doi_lg_2_h11", "name": "title_lg_2_h11", "author": ["contributor_lg_2_h11"], "year": "date_lg_2_h11", "journal": "journal_lg_2_h11", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "doi_lg_2_h12", "name": "title_lg_2_h12", "author": ["contributor_lg_2_h12"], "year": "date_lg_2_h12", "journal": "journal_lg_2_h12", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "doi_cg_i", "name": "title_cg_i", "author": ["contributor_cg_i"], "year": "date_cg_i", "journal": "journal_cg_i", "group": "Citedby", "depth": 1, "citations": 3}, {"doi": "doi_lg_1_h21", "name": "title_lg_1_h21", "author": ["contributor_lg_1_h21"], "year": "date_lg_1_h21", "journal": "journal_lg_1_h21", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_1_h22", "name": "title_lg_1_h22", "author": ["contributor_lg_1_h22"], "year": "date_lg_1_h22", "journal": "journal_lg_1_h22", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_1_h23", "name": "title_lg_1_h23", "author": ["contributor_lg_1_h23"], "year": "date_lg_1_h23", "journal": "journal_lg_1_h23", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_2_h21", "name": "title_lg_2_h21", "author": ["contributor_lg_2_h21"], "year": "date_lg_2_h21", "journal": "journal_lg_2_h21", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_2_h22", "name": "title_lg_2_h22", "author": ["contributor_lg_2_h22"], "year": "date_lg_2_h22", "journal": "journal_lg_2_h22", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_2_h23", "name": "title_lg_2_h23", "author": ["contributor_lg_2_h23"], "year": "date_lg_2_h23", "journal": "journal_lg_2_h23", "group": "Citedby", "depth": 2, "citations": 1}, {"doi": "doi_lg_2_h24", "name": "title_lg_2_h24", "author": ["contributor_lg_2_h24"], "year": "date_lg_2_h24", "journal": "journal_lg_2_h24", "group": "Citedby", "depth": 2, "citations": 1}, {"doi": "doi_cg_h11", "name": "title_cg_h11", "author": ["contributor_cg_h11"], "year": "date_cg_h11", "journal": "journal_cg_h11", "group": "Citedby", "depth": 2, "citations": 2}, {"doi": "doi_lg_1_d21", "name": "title_lg_1_d21", "author": ["contributor_lg_1_d21"], "year": "date_lg_1_d21", "journal": "journal_lg_1_d21", "group": "Reference", "depth": -2, "citations": 2}, {"doi": "doi_lg_1_d22", "name": "title_lg_1_d22", "author": ["contributor_lg_1_d22"], "year": "date_lg_1_d22", "journal": "journal_lg_1_d22", "group": "Reference", "depth": -2, "citations": 2}, {"doi": "doi_lg_1_d23", "name": "title_lg_1_d23", "author": ["contributor_lg_1_d23"], "year": "date_lg_1_d23", "journal": "journal_lg_1_d23", "group": "Reference", "depth": -2, "citations": 2}, {"doi": "doi_lg_2_d21", "name": "title_lg_2_d21", "author": ["contributor_lg_2_d21"], "year": "date_lg_2_d21", "journal": "journal_lg_2_d21", "group": "Reference", "depth": -2, "citations": 1}, {"doi": "doi_lg_2_d22", "name": "title_lg_2_d22", "author": ["contributor_lg_2_d22"], "year": "date_lg_2_d22", "journal": "journal_lg_2_d22", "group": "Reference", "depth": -2, "citations": 1}, {"doi": "doi_lg_2_d23", "name": "title_lg_2_d23", "author": ["contributor_lg_2_d23"], "year": "date_lg_2_d23", "journal": "journal_lg_2_d23", "group": "Reference", "depth": -2, "citations": 1}], "links": [{"source": "doi_lg_1_i", "target": "doi_lg_1_d11"}, {"source": "doi_lg_1_i", "target": "doi_lg_1_d12"}, {"source": "doi_lg_1_h11", "target": "doi_lg_1_i"}, {"source": "doi_lg_1_h12", "target": "doi_lg_1_i"}, {"source": "doi_lg_2_i", "target": "doi_lg_2_d11"}, {"source": "doi_lg_2_i", "target": "doi_lg_2_d12"}, {"source": "doi_lg_2_h11", "target": "doi_lg_2_i"}, {"source": "doi_lg_2_h12", "target": "doi_lg_2_i"}, {"source": "doi_cg_i", "target": "doi_lg_2_i"}, {"source": "doi_lg_1_h21", "target": "doi_lg_1_h11"}, {"source": "doi_lg_1_h22", "target": "doi_lg_1_h11"}, {"source": "doi_lg_1_h22", "target": "doi_lg_1_h12"}, {"source": "doi_lg_1_h23", "target": "doi_lg_1_h12"}, {"source": "doi_lg_2_h21", "target": "doi_lg_2_h11"}, {"source": "doi_lg_2_h22", "target": "doi_lg_2_h11"}, {"source": "doi_lg_2_h23", "target": "doi_lg_2_h12"}, {"source": "doi_lg_2_h24", "target": "doi_lg_2_h12"}, {"source": "doi_lg_2_h24", "target": "doi_lg_2_h23"}, {"source": "doi_lg_2_h23", "target": "doi_lg_2_h24"}, {"source": "doi_lg_1_h23", "target": "doi_cg_i"}, {"source": "doi_cg_h11", "target": "doi_cg_i"}, {"source": "doi_lg_2_h11", "target": "doi_cg_i"}, {"source": "doi_lg_1_d11", "target": "doi_lg_1_d21"}, {"source": "doi_lg_1_d11", "target": "doi_lg_1_d22"}, {"source": "doi_lg_1_d21", "target": "doi_lg_1_d22"}, {"source": "doi_lg_1_d22", "target": "doi_lg_1_d21"}, {"source": "doi_lg_1_d12", "target": "doi_lg_1_d23"}, {"source": "doi_lg_2_d11", "target": "doi_lg_2_i"}, {"source": "doi_lg_2_d11", "target": "doi_lg_2_d21"}, {"source": "doi_lg_2_d12", "target": "doi_lg_2_d22"}, {"source": "doi_lg_2_d12", "target": "doi_lg_2_d23"}, {"source": "doi_lg_1_h12", "target": "doi_lg_1_d12"}, {"source": "doi_lg_1_h11", "target": "doi_lg_1_h12"}, {"source": "doi_lg_2_h24", "target": "doi_lg_2_d12"}]}
\ No newline at end of file
diff --git a/verarbeitung/update_graph/Kanten_Vergleich.py b/verarbeitung/update_graph/Kanten_Vergleich.py
new file mode 100644
index 0000000000000000000000000000000000000000..fbfa63e604680fab11bd7c50f0efed0c1ba4ae50
--- /dev/null
+++ b/verarbeitung/update_graph/Kanten_Vergleich.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python3
+
+def back_to_valid_edges(links_from_json, processed_input_list):
+    '''
+    :param links_from_json: list of edges from the old graph
+    :type links_from_json:  list
+    :param processed_input_list:   list pubs still in graph
+    :type processed_input_list:    list
+    
+    function that deletes edges, if one ore two including nodes are deleted nodes
+    '''
+    list_of_valid_edges = links_from_json.copy()
+
+
+    #iterates over all edges from old graph
+    for edge in list_of_valid_edges:
+
+        # counter for adjacent nodes
+        found_adj_nodes = 0
+        for pub in processed_input_list: 
+            # checks for both adjacent nodes of edge if pub is source/target node
+            for adj_node in edge:
+                # increases counter if adjacent node was found
+                if (adj_node == pub.doi_url):
+                    found_adj_nodes += 1
+            if (found_adj_nodes == 2):
+                break
+
+        #removes the edge if less than 2 adjacent nodes found
+        if (found_adj_nodes < 2):
+            links_from_json.remove(edge) 
+
+#Kanten_Menge_Ganz = [["doi_1","doi_2"],["doi_3","doi_4"],["doi_5","doi_6"]]
+#Geloeschte = ["doi_2","doi_1","doi_4"]
+#print(back_to_valid_edges(Kanten_Menge_Ganz,Geloeschte))
+
+#Im Anschluss muss mit den Hinzugefügten Knoten Processing aufgerufen werden
diff --git a/verarbeitung/update_graph/Knoten_Vergleich.py b/verarbeitung/update_graph/Knoten_Vergleich.py
new file mode 100644
index 0000000000000000000000000000000000000000..55c10f2872ea3dcfb40aa30aac4b09aa01fe48a6
--- /dev/null
+++ b/verarbeitung/update_graph/Knoten_Vergleich.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python3
+from collections import Counter
+
+def doi_listen_vergleichen(alte,neue):
+    '''
+    :param alte: list of dois from old graph
+    :type alte: list
+    :param neue: list of dois from new graph
+    :type neue: list
+    
+    function to calculate, which nodes from the old graph are deleted and which are added
+    '''
+    dois_from_old_graph = alte #WICHTIG: Keine doppelten DOIs
+    dois_from_new_graph = neue
+    deleted_nodes = []
+    common_nodes = []
+    inserted_nodes = []
+    all_dois = dois_from_old_graph + dois_from_new_graph
+
+    for doi in all_dois: # iterates over the merged list of new and old dois 
+        if ((all_dois.count(doi) == 2) & (doi not in common_nodes)): # If the doi occurs twice the node is in the old and the new graph
+            common_nodes.append(doi) #appends the doi to common ones, if its not alredy in it
+        elif ((doi in dois_from_old_graph) & (doi not in dois_from_new_graph)): #If the doi occurs once and it is from old graph it is a deleted node
+            deleted_nodes.append(doi) #appends the doi to deleted ones
+        elif ((doi in dois_from_new_graph) & (doi not in dois_from_old_graph)): #if the doi occurs ince and it is from new graph it is a inserted node
+            inserted_nodes.append(doi) #appends the doi to the inserted ones
+    return(common_nodes, inserted_nodes, deleted_nodes)
+
+
+#Test Prints
+	#liste_1 = ["doi_1","doi_2","doi_3","doi_4","doi_5"]
+	#liste_2 = ["doi_1","doi_2","doi_3","doi_6","doi_7"]
+	#print("gemeinsame Elemente: ",doi_listen_vergleichen(liste_1,liste_2)[0])
+	#print("hinzugefügte Elemente: ",doi_listen_vergleichen(liste_1,liste_2)[1])
+	#print("gelöschte Elemente: ",doi_listen_vergleichen(liste_1,liste_2)[2])
+
diff --git a/verarbeitung/update_graph/README.md b/verarbeitung/update_graph/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..f680e9942cfb4e1b843fffae2c81c63af869e559
--- /dev/null
+++ b/verarbeitung/update_graph/README.md
@@ -0,0 +1,37 @@
+# Projekt CiS-Projekt 2021/22
+
+Directory for functions to adjust a publication graph to updated input lists and changed citation/reference depths. For minimal use of the time consuming Input function, a reinterpretation of the exported json file is implemented.
+
+## Files in directory
+
+import_from_json.py 
+
+- 	Stellt die alte Knoten-und Kantenmenge aus der Json Datei wieder her.
+
+Knoten_Vergleich.py 
+
+- 	Überprüft welche Knoten neu hinzugekommen sind und welche enfternt wurden.
+
+Kanten_Vergleich.py 
+
+- 	Stellt nach der Löschung eines Knotens wieder eine valide Kantenmenge her.
+
+update_graph_del.py 
+
+- 	Führt die Löschung eines Knotens durch
+
+connect_new_input.py 
+
+- 	Verbindet den alten Graphen aus der Json Datei mit den neuen DOIs zu dem neuen Graphen.
+
+update_graph.py 
+
+- 	Überprüft welche Änderungen der Benutzer vorgenommen hat (Löschen oder hinzufügen von DOIs) 
+	und führt diese aus.
+
+## Authors
+- Donna Löding
+- Alina Molkentin
+- Xinyi Tang
+- Judith Große
+- Malte Schokolowski
\ No newline at end of file
diff --git a/verarbeitung/update_graph/__init__.py b/verarbeitung/update_graph/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/verarbeitung/update_graph/connect_new_input.py b/verarbeitung/update_graph/connect_new_input.py
new file mode 100644
index 0000000000000000000000000000000000000000..3f11e591db737bd11f2a261213973a2bf297ed1c
--- /dev/null
+++ b/verarbeitung/update_graph/connect_new_input.py
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*-
+"""
+Functions to update 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__ = ""
+
+import sys  
+from pathlib import Path
+from os import error
+sys.path.append("../")
+
+from .import_from_json import input_from_json
+from verarbeitung.construct_new_graph.initialize_graph import initialize_nodes_list, complete_inner_edges
+from verarbeitung.construct_new_graph.add_citations_rec import add_citations
+from verarbeitung.construct_new_graph.export_to_json import output_to_json
+
+def connect_old_and_new_input(json_file, new_doi_list, search_depth, search_height, test_var = False):
+    '''
+        :param json_file:       json file with old graph
+        :type json_file:        json file
+
+        :param new_doi_list:    additional dois which has to be connected to the old graph
+        :type new_doi_list:     list of strings
+
+        :param search_depth:    depth to search for references
+        :type search_depth:     int
+
+        :param search_height:   height to search for citations
+        :type search_height:    int
+
+        :param test_var:        variable to differenciate between test and url call
+        :type test_var:         boolean
+
+        connetcs the old graph and the new input dois to a complete new graph
+    '''
+    global nodes, edges
+    nodes = []
+    edges = []
+
+    nodes, edges = input_from_json(json_file)
+
+    complete_changed_group_nodes(new_doi_list, search_depth, search_height, test_var)
+    
+    # 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(new_doi_list,search_depth, search_height, test_var)
+
+    # function calls to begin recursive processing up to max depth/height
+    add_citations(nodes, edges, citations_obj_list, 1, search_height, "Citation", test_var)
+    add_citations(nodes, edges, references_obj_list, 1, search_depth, "Reference", 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, test_var)
+
+    return(nodes, edges)
+
+
+def complete_changed_group_nodes(new_doi_list, search_depth_max, search_height_max, test_var):
+    '''
+    work in progress
+    '''
+    changed_group_node_citations = []
+    changed_group_node_references = []
+
+    for node in nodes:
+        if (node.group < 0) and (node.doi in new_doi_list):
+            node.group = "input"
+            
+
+        elif (node.group > 0) and (node.doi in new_doi_list):
+            node.group = "input"
+
+
diff --git a/verarbeitung/update_graph/delete_nodes_edges.py b/verarbeitung/update_graph/delete_nodes_edges.py
new file mode 100644
index 0000000000000000000000000000000000000000..0e4571a15be9628d15a892629688d70ba5f9abf3
--- /dev/null
+++ b/verarbeitung/update_graph/delete_nodes_edges.py
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*-
+"""
+Functions to remove publications/links from nodes/edges list, if they can no longer be reached
+
+"""
+
+__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__ = ""
+
+import sys  
+from pathlib import Path
+sys.path.append("../../")
+
+from .Kanten_Vergleich import back_to_valid_edges
+
+
+def search_ref_graph_rec(pub):
+    '''
+    :param pub: pub go get appended to usable_nodes
+    :type pub:  Publication
+    
+    function that appends nodes of group "reference" to list usable_nodes, if they are reachable from input nodes
+    '''
+    for reference in pub.references:
+        for ref_pub in input_obj_list:
+            if ((reference.doi_url == ref_pub.doi_url) and (ref_pub not in usable_nodes)):
+                usable_nodes.append(ref_pub)
+
+                # to find a cyclus and avoid recursion error
+                not_in_citations = True
+                for citation in pub.citations:
+                    if (reference.doi_url == citation.doi_url):
+                        not_in_citations = False
+                        break
+                if (not_in_citations):  
+                    search_ref_graph_rec(ref_pub)
+
+
+def search_cit_graph_rec(pub):  
+    '''
+    :param pub: pub go get appended to usable_nodes
+    :type pub:  Publication
+    
+    function that appends nodes of group "citation" to list usable_nodes, if they are reachable from input nodes
+    '''  
+    for citation in pub.citations:
+        for cit_pub in input_obj_list:
+            if ((citation.doi_url == cit_pub.doi_url) and (cit_pub not in usable_nodes)):
+                usable_nodes.append(cit_pub)
+
+                # to find a cyclus and avoid recursion error
+                not_in_references = True
+                for reference in pub.references:
+                    if (citation.doi_url == reference.doi_url):
+                        not_in_references = False
+                        break
+                if (not_in_references):  
+                    search_cit_graph_rec(cit_pub)
+
+
+
+def delete_nodes_and_edges(input_list, common_nodes, old_edges_list):
+    '''
+    :param input_list:      list of publications to get reduced
+    :type input_list:       List[Publication]
+
+    :param common_nodes:        list of input dois which are in old and new input call
+    :type common_nodes:         List[String]
+
+    :param old_edges_list:      list of links between publications from old call
+    :type old_edges_list:       List[List[String,String]]
+    
+    function to start recursive node removal for references and citations and to change edge list to valid state
+    '''
+    global usable_nodes, input_obj_list
+    usable_nodes = []
+    input_obj_list = input_list
+
+    # starts for every common input node a tree-search and adds found nodes to usable_nodes
+    for common in common_nodes:
+        for pub in input_obj_list:
+            if (common == pub.doi_url):
+                usable_nodes.append(pub)
+                search_ref_graph_rec(pub)
+                search_cit_graph_rec(pub)
+
+    valid_edges = back_to_valid_edges(old_edges_list, usable_nodes)
+
+    return(usable_nodes, valid_edges)
\ No newline at end of file
diff --git a/verarbeitung/update_graph/import_from_json.py b/verarbeitung/update_graph/import_from_json.py
new file mode 100644
index 0000000000000000000000000000000000000000..92d9b02e2c225eaf2a5cd2c3607f080ee9c231a9
--- /dev/null
+++ b/verarbeitung/update_graph/import_from_json.py
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+"""
+Functions to read old json files to recreate old graph structure
+
+"""
+
+__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__ = ""
+
+  
+import json
+import sys
+sys.path.append("../")
+
+from input.publication import Publication, Citation
+
+
+
+def create_pubs_from_json(input_dict):
+    '''
+    :param input_dict:  dictionary read from old graph Json File
+    :type json_file:    dictionary
+
+    creates list of publication retrieved from old json file
+    '''
+    
+    #iterates over the list of nodes
+    for node in input_dict["nodes"]:         
+        #creates for the nodes the objects class Publication
+        
+        pub = Publication(node["doi"], node["name"], node["author"], node["journal"], node["year"], [])
+        pub.group = node["depth"]
+        #appends the objects to a list
+        list_of_nodes_py.append(pub) 
+
+def add_ref_and_cit_to_pubs(input_dict):
+    '''
+    :param input_dict:  dictionary read from old graph Json File
+    :type json_file:    dictionary
+
+    adds references and citations to retrieved publication list
+    '''
+
+    # iterates over the list of edges
+    for edge in input_dict["links"]:
+        for source in list_of_nodes_py:
+            for target in list_of_nodes_py:
+
+                # when correct dois found, adds then as references/citatons to publication list
+                if ((source.doi_url == edge["source"]) and (target.doi_url == edge["target"])):
+                    new_reference = Citation(target.doi_url, target.title, target.journal, target.contributors, "Reference")
+                    source.references.append(new_reference)
+
+                    new_citation = Citation(source.doi_url, source.title, source.journal, source.contributors, "Citation")
+                    target.citations.append(new_citation)
+        
+        # adds edge to list
+        list_of_edges_py.append([edge["source"],edge["target"]])
+
+
+def input_from_json(json_file):
+    '''
+    :param json_file:   Json-Datei for the old graph
+    :type json_file:    String
+
+    retrieves information from old json file to be reused for new graph construction
+    '''
+
+    # creates global sets for nodes and edges
+    global list_of_nodes_py, list_of_edges_py
+    list_of_nodes_py = []
+    list_of_edges_py = []
+
+    #opens the json file and saves content in dictionary
+    with open(json_file,'r') as file: 
+        input_dict = json.load(file)
+
+    # creates nodes of Class Publication from input Json file
+    create_pubs_from_json(input_dict)
+
+    # adds references and citations to publications and creates edges 
+    add_ref_and_cit_to_pubs(input_dict)
+              
+
+    return(list_of_nodes_py, list_of_edges_py)
\ No newline at end of file
diff --git a/verarbeitung/update_graph/update_depth.py b/verarbeitung/update_graph/update_depth.py
new file mode 100644
index 0000000000000000000000000000000000000000..179a9988c138f4eb6122749eb1bedd3507370d00
--- /dev/null
+++ b/verarbeitung/update_graph/update_depth.py
@@ -0,0 +1,138 @@
+# -*- coding: utf-8 -*-
+"""
+Functions to update the citation depth of recursive graph construction
+
+"""
+
+__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__ = ""
+
+import sys  
+sys.path.append("../../")
+
+from verarbeitung.construct_new_graph.add_citations_rec import add_citations
+from verarbeitung.construct_new_graph.initialize_graph import complete_inner_edges
+from .Kanten_Vergleich import back_to_valid_edges
+
+
+def reduce_max_height(max_height):
+    '''
+        :param max_height:        new maximum height to reduce publications in publication list to
+        :type max_height:         int
+
+        function to remove all publications which are not in new maximum height threshold
+    '''
+    input_list_del = processed_input_list.copy()
+    for pub in input_list_del:
+        if (pub.group > 0):
+            if (pub.group > max_height):
+                processed_input_list.remove(pub)
+
+def reduce_max_depth(max_depth):
+    '''
+        :param max_depth:   new maximum depth to reduce publications in publication list to
+        :type max_depth:    int
+
+        function to remove all publications which are not in new maximum depth threshold
+    '''
+    input_list_del = processed_input_list.copy()
+    for pub in input_list_del:
+        if (pub.group < 0):
+            if (abs(pub.group) > max_depth):
+                processed_input_list.remove(pub)
+
+
+
+def get_old_height_depth():
+    '''
+        function to get old max height and max depth from previous construction call
+    '''
+    max_height = 0 
+    max_depth = 0
+    for pub in processed_input_list:
+        if (pub.group < 0):
+            max_depth = max(max_depth, abs(pub.group))
+        if (pub.group > 0):
+            max_height = max(max_height, pub.group)
+    return(max_height, max_depth)
+
+def get_old_max_references(old_depth):
+    '''
+        :param old_depth:       old maximum depth to search for citations
+        :type old_depth:        int
+
+        function to get references for new recursive levels
+    '''
+    old_max_references = []
+    for pub in processed_input_list:
+        if (abs(pub.group) == old_depth):
+            old_max_references.append(pub.references)
+    return(old_max_references)
+
+def get_old_max_citations(old_height):
+    '''
+        :param old_height:      old maximum height to search for citations
+        :type old_height:       int
+
+        function to get citations for new recursive levels
+    '''
+    old_max_citations = []
+    for pub in processed_input_list:
+        if (abs(pub.group) == old_height):
+            old_max_citations.append(pub.citations)
+    return(old_max_citations)
+
+def update_depth(obj_input_list, input_edges, new_depth, new_height, test_var):
+    '''
+        :param obj_input_list:  input list of publications of type Publication from update_graph
+        :type obj_input_list:   List[Publication]
+
+        :param input_edges:     list of publications from update_graph
+        :type input_edges:      List[Publication]
+
+        :param new_depth:       new maximum depth to search for references
+        :type new_depth:        int
+
+        :param new_height:      new maximum height to search for citations
+        :type new_height:       int
+
+        :param test_var:        variable to differenciate between test and url call
+        :type test_var:         boolean
+
+        function to adjust old publication search depth to update call
+    '''
+
+    global processed_input_list, valid_edges
+    processed_input_list = obj_input_list
+    valid_edges = input_edges
+
+    old_height, old_depth = get_old_height_depth()
+
+    # removes publications and links from recursion levels which aren't needed anymore
+    if (old_depth > new_depth):
+        reduce_max_depth(new_depth)
+    elif (old_height > new_height):
+        reduce_max_height(new_height)
+    
+    
+    # adds publications and links for new recursion levels
+    elif (old_depth < new_depth):
+        old_max_references = get_old_max_references()
+        add_citations(processed_input_list, valid_edges, old_max_references, old_depth+1, new_depth, "Reference", test_var)
+    elif (old_height < new_height):
+        old_max_citations = get_old_max_citations()
+        add_citations(processed_input_list, valid_edges, old_max_citations, old_height+1, new_height, "Citation", test_var)
+    back_to_valid_edges(valid_edges, processed_input_list)
+
+    # adds edges between reference group and citation group of known publications
+    complete_inner_edges()
+
+
+    
+
diff --git a/verarbeitung/update_graph/update_graph.py b/verarbeitung/update_graph/update_graph.py
new file mode 100644
index 0000000000000000000000000000000000000000..11a9eda9fb2638fdb4fe0a9560439a297e360612
--- /dev/null
+++ b/verarbeitung/update_graph/update_graph.py
@@ -0,0 +1,112 @@
+# -*- coding: utf-8 -*-
+"""
+Functions to update 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__ = ""
+
+
+import sys
+
+sys.path.append("../../")
+
+from input.publication import Publication
+from verarbeitung.get_pub_from_input import get_pub
+from .Knoten_Vergleich import doi_listen_vergleichen
+from .delete_nodes_edges import delete_nodes_and_edges
+from .connect_new_input import connect_old_and_new_input
+from .update_depth import update_depth
+from .import_from_json import input_from_json
+
+
+def get_old_input_dois(old_obj_input_list):
+    '''
+        :param old_obj_input_list:  list of publications retrieved from old json file
+        :type old_obj_input_list:   List[Publication]
+
+        function to return pub dois for old publications of group input retrieved from json file
+    '''
+
+    # new list to save doi_url for each old publication of group input
+    old_input_dois = []
+    for pub in old_obj_input_list:
+        if (pub.group == 0):
+            old_input_dois.append(pub.doi_url)
+    return old_input_dois
+
+def get_new_input_dois(new_input, test_var):
+    '''
+        :param new_input:   input list of doi from UI
+        :type new_input:    list of strings
+
+        :param test_var:    variable to differenciate between test and url call
+        :type test_var:     boolean
+
+        function to return pub dois for input urls
+    '''
+
+    # new list to save doi_url for each new input url
+    new_input_dois = []
+    for new_node in new_input:
+        # retrieves information and adds to new list if successful 
+        pub = get_pub(new_node, test_var)
+        if (type(pub) != Publication):
+            print(pub)
+            continue
+
+        new_input_dois.append(pub.doi_url)
+    return(new_input_dois)
+
+
+def update_graph(new_doi_input_list, json_file, search_depth, search_height, test_var = False):
+    '''
+        :param new_doi_input_list:  input list of doi from UI
+        :type new_doi_input_list:   List[String]
+
+        :param old_obj_input_list:  list of publications retrieved from old json file
+        :type old_obj_input_list:   List[Publication]
+
+        :param old_edges_list:      list of links between publications retrieved from old json file
+        :type old_edges_list:       List[List[String,String]]
+
+        :param test_var:            variable to differenciate between test and url call
+        :type test_var:             boolean
+
+        function to compare old and new input, start node/edge removal and to return updated sets of nodes and edges
+    '''
+
+    # gets information from previous cunstruction call
+    old_obj_input_list , old_edges_list = input_from_json(json_file)
+    print(type(old_edges_list[1]))
+
+    # one global list to save the process of removing unneeded publications and one to save valid edges
+    global processed_list, valid_edges
+    processed_list = old_obj_input_list
+    valid_edges = old_edges_list
+
+
+    # get dois from lists to compare for differences
+    old_doi_input_list = get_old_input_dois(old_obj_input_list)
+    new_doi_input_list = get_new_input_dois(new_doi_input_list, test_var)
+
+    # retrieve which publications are already known, removed, inserted
+    common_nodes, inserted_nodes, deleted_nodes = doi_listen_vergleichen(old_doi_input_list, new_doi_input_list)
+
+    # deletes publications and edges from node_list if publications can no longer be reached
+    if (len(deleted_nodes) > 0):
+        processed_list, valid_edges = delete_nodes_and_edges(processed_list, common_nodes, old_edges_list)
+    
+    update_depth(processed_list, valid_edges, search_depth, search_height, test_var)
+    
+    if (len(inserted_nodes) > 0):
+        connect_old_and_new_input(json_file, inserted_nodes, search_depth, search_height, test_var)
+
+    return(processed_list, valid_edges)