From 6fc6fa37533e425c86ad5566c0945498e0276014 Mon Sep 17 00:00:00 2001
From: Suvi <s.selliah@unibas.ch>
Date: Tue, 28 Dec 2021 16:43:00 +0100
Subject: [PATCH] Issue#5:First full project commit

---
 .DS_Store                                     | Bin 0 -> 6148 bytes
 .idea/.gitignore                              |   3 +
 .idea/Generate_cDNA.iml                       |   8 +
 .../inspectionProfiles/profiles_settings.xml  |   6 +
 .idea/misc.xml                                |   4 +
 .idea/modules.xml                             |   8 +
 .idea/vcs.xml                                 |   6 +
 Generate_cDNA.py                              | 237 ----------------
 LICENSE.md                                    |  21 ++
 README.md                                     |  15 +
 generatecDNA-nf.nf                            |  25 ++
 generatecDNA.egg-info/PKG-INFO                |  13 +
 generatecDNA.egg-info/SOURCES.txt             |  11 +
 generatecDNA.egg-info/dependency_links.txt    |   1 +
 generatecDNA.egg-info/entry_points.txt        |   3 +
 generatecDNA.egg-info/top_level.txt           |   1 +
 generatecDNA/.DS_Store                        | Bin 0 -> 6148 bytes
 generatecDNA/__init__.py                      |   3 +
 .../__pycache__/__init__.cpython-310.pyc      | Bin 0 -> 237 bytes
 .../__pycache__/generatecDNA.cpython-310.pyc  | Bin 0 -> 1297 bytes
 .../__pycache__/generatecDNA.cpython-39.pyc   | Bin 0 -> 5093 bytes
 generatecDNA/generatecDNA-cli.py              |  37 +++
 generatecDNA/generatecDNA.py                  | 258 ++++++++++++++++++
 setup.py                                      |  28 ++
 tests/.DS_Store                               | Bin 0 -> 6148 bytes
 .../test.cpython-310-pytest-6.2.5.pyc         | Bin 0 -> 1314 bytes
 tests/fasta_example.fasta                     |  21 ++
 tests/gtf_example.gtf                         |  21 ++
 tests/nrcopies_example.csv                    |  10 +
 29 files changed, 503 insertions(+), 237 deletions(-)
 create mode 100644 .DS_Store
 create mode 100644 .idea/.gitignore
 create mode 100644 .idea/Generate_cDNA.iml
 create mode 100644 .idea/inspectionProfiles/profiles_settings.xml
 create mode 100644 .idea/misc.xml
 create mode 100644 .idea/modules.xml
 create mode 100644 .idea/vcs.xml
 delete mode 100644 Generate_cDNA.py
 create mode 100644 LICENSE.md
 create mode 100644 README.md
 create mode 100644 generatecDNA-nf.nf
 create mode 100644 generatecDNA.egg-info/PKG-INFO
 create mode 100644 generatecDNA.egg-info/SOURCES.txt
 create mode 100644 generatecDNA.egg-info/dependency_links.txt
 create mode 100644 generatecDNA.egg-info/entry_points.txt
 create mode 100644 generatecDNA.egg-info/top_level.txt
 create mode 100644 generatecDNA/.DS_Store
 create mode 100644 generatecDNA/__init__.py
 create mode 100644 generatecDNA/__pycache__/__init__.cpython-310.pyc
 create mode 100644 generatecDNA/__pycache__/generatecDNA.cpython-310.pyc
 create mode 100644 generatecDNA/__pycache__/generatecDNA.cpython-39.pyc
 create mode 100644 generatecDNA/generatecDNA-cli.py
 create mode 100644 generatecDNA/generatecDNA.py
 create mode 100644 setup.py
 create mode 100644 tests/.DS_Store
 create mode 100644 tests/__pycache__/test.cpython-310-pytest-6.2.5.pyc
 create mode 100644 tests/fasta_example.fasta
 create mode 100644 tests/gtf_example.gtf
 create mode 100644 tests/nrcopies_example.csv

diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..0be791f97a0ff41cfcb9194d1ac6fbdea9665f90
GIT binary patch
literal 6148
zcmZQzU|@7AO)+F(5MW?n;9!8zEL;p&0Z1N%F(jFwBHSSJz-AONBr=pRq%tHkxIpDb
zsnHM^4S~TM0-(Ih!;sF9%8<v9%7C1I{TLiQbMljua`Ka)1%x951B2dwFaUc9r@o}}
z;sU6?T}cHwnZ+dr2G<ywm|0la*f}^jxH)2jGxE!WOA<>;i=7gSqCvcn{QR6G7&|d3
zEHkw{UO>b-Kd&S)GcUCWq$D^qB{eCrC?-5JFD1X+DZex?r5LOiD#5|Y$r&#oRb8!X
zXl`z%qhMrgUaO-}ZDDGvqhMlgQd`T(A*!rz9TcCPlbe^{1NH+0BO`=n;DypKs+WO*
z0jCekf{XHU^7GOmB_D$jt`KC<WyoVlW6%SUXrZ|tEi^@OnxV&#%8<^G&Y;VX2{MNv
zAJrsASu~Tl7<?E!8Jrnh8T=T68C)6k7;+g>(DZbp>EUDuVsK?}WN=~d#i8RTnhp+z
zVun<P5{6QS0tP*X0)|Rd8yG;TWga-O{09dqE4XGTW+-7OMpFq22^=biO-e%YJzClU
z2hM;H(3H;sDgy?@0i%|VhQMeD4B8L?l@AKg8qNVqH$Z5R6aymz1Go#o$iTn?^8_Qf
zAHV>T18D`(Agv%8q?LgY!~&ZE*2=&L)yfF&hJf^ex+EYPtet_80j!;YkpZk7UR^Un
zv@<Y5ZDxe_P#7WF85kkj85kkjVa^++M?+vV1fU_n450-;^}j0v1Frr*MAaxc8Umvs
zFf2oWk;Nt0#R*&~WA`7Zt_9Vn2~cTJ?GLJs8A0_lL?1{ASe6MgpeO<6K;%GLLDfFE
XDrRJW)a0WL0ayr)(xV|j{}2EGQseNA

literal 0
HcmV?d00001

diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/Generate_cDNA.iml b/.idea/Generate_cDNA.iml
new file mode 100644
index 0000000..d0876a7
--- /dev/null
+++ b/.idea/Generate_cDNA.iml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+  <settings>
+    <option name="USE_PROJECT_PROFILE" value="false" />
+    <version value="1.0" />
+  </settings>
+</component>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..7ba73c2
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7" project-jdk-type="Python SDK" />
+</project>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..2859f75
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/Generate_cDNA.iml" filepath="$PROJECT_DIR$/.idea/Generate_cDNA.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/Generate_cDNA.py b/Generate_cDNA.py
deleted file mode 100644
index c06fddb..0000000
--- a/Generate_cDNA.py
+++ /dev/null
@@ -1,237 +0,0 @@
-#!/usr/bin/env python3
-#Author: Suvarnan Selliah
-
-class GeneratecDNA:
-
-    def generatecDNA(fasta, gtf, cp_nr, my_output_fasta="cDNA.fasta", my_output_csv="cDNA.csv", placeholder = "ph-file.csv"):
-
-        cDNA_transcript_id = 1
-        #READING INPUT FILES / PART I
-        #open files
-        with open(fasta, 'r') as fa, open(gtf, 'r') as gt, open(cp_nr, 'r') as cp:
-
-            #read fasta-file
-            for myFastaline in fa:
-
-                #search for transcript id and transcript sequence in fasta-file
-                fasta_id = ""
-                fasta_seq = ""
-                fasta_id_found = False
-                fasta_seq_found = False
-                currentFastaString = myFastaline
-                if fasta_id_found == False:
-                    position_of_start = currentFastaString.find('>')
-                    if position_of_start != 0:
-                        continue
-                    elif position_of_start == 0:
-                        fasta_id = myFastaline
-                        fasta_id = fasta_id.replace(">", "")
-                        fasta_id_found = True
-                        continue
-                    else:
-                        print("FASTA: Start position in fasta file not found")
-                        break
-                if fasta_id_found == True and fasta_seq_found == False:
-                    while fasta_seq_found == False:
-                        currentFastaString = fa.readline()
-                        zero_position = currentFastaString[0]
-                        if zero_position == ";":
-                            continue
-                        elif zero_position == ">":
-                            print("FASTA: No Sequence after headline")
-                            break
-                        else:
-                            fasta_seq = currentFastaString
-                            fasta_seq_found = True
-
-                #starting to work with gtf-file
-                #defining variables for gtf-file
-                gtf_seqname = ''
-                gtf_start = 0
-                gtf_end = 0
-                gtf_score = 0.0
-                gtf_info_found = False
-                gtf_entries = 0
-                gtf_list_of_lines = []
-                gtf_prob_list = []
-
-                #defining variables for csv-file
-                csv_trans_id = ""
-                csv_gene_id = ""
-                csv_count = 0
-                csv_info_found = False
-
-                if fasta_id_found == True and fasta_seq_found == True:
-                    # search for transcript id from fasta-file in gtf-file
-                    for myGTFline in gt:
-                        currentGTFString = myGTFline
-                        gtf_list = currentGTFString.split('\t')
-                        gtf_seqname = gtf_list[0]
-                        if gtf_seqname == fasta_id:
-                            gtf_entries += 1
-                            gtf_start = gtf_list[3]
-                            gtf_end = gtf_list[4]
-                            gtf_score = gtf_list[5]
-                            gtf_temp_list = []
-                            gtf_temp_list.append(gtf_start)
-                            gtf_temp_list.append(gtf_end)
-                            gtf_temp_list.append(gtf_score)
-                            gtf_list_of_lines.append(gtf_temp_list)
-                            gtf_prob_list.append(gtf_score)
-                        else:
-                            continue
-                    if gtf_entries != 0:
-                        gtf_info_found = True
-                        fasta_id_found = False
-                        fasta_seq_found = False
-                    assert gtf_info_found, "Sequence ID from fasta-file not found in gtf-file"
-
-                    #search copy number of transcript in 3. file/csv-file
-                    for myCSVline in cp:
-                        currentCSVString = myCSVline
-                        csv_list = currentCSVString.split(',')
-                        csv_trans_id = csv_list[0]
-                        if csv_trans_id == fasta_id:
-                            csv_gene_id = csv_list[1]
-                            csv_count = csv_list[2]
-                            csv_info_found = True
-                            gtf_info_found = False
-                            break
-                        else:
-                            continue
-                    assert csv_info_found, "Data (TranscriptID,GeneID,Count) from csv-file/3.file not found"
-
-                    #COMPUTATION & OUTPUT / PART II
-                    #set score to 0 for primimg sites close to the end of sequence
-                    seq_len = len(fasta_seq)
-                    seq_len -= 22
-                    gtf_list_of_lines_len = len(gtf_list_of_lines)
-                    for i in range(gtf_list_of_lines_len):
-                        if gtf_list_of_lines[i][1] > seq_len:
-                            gtf_list_of_lines[i][2] = 0.0
-                            gtf_prob_list[i] = 0.0
-
-                    #assign priming sites (according to score) to copy number
-                    sum_of_score = 0.0
-                    for i in gtf_prob_list:
-                        sum_of_score += i
-                    one_score = 100/sum_of_score
-                    norm_list = []
-                    gtf_prob_list_len = len(gtf_prob_list)
-                    for i in range(gtf_prob_list_len):
-                        norm_list.append((one_score * gtf_prob_list[i]))
-                    one_norm = csv_count / 100
-                    distr_RNA_to_prim_sites = []
-                    norm_list_len = len(norm_list)
-                    for i in range(norm_list_len):
-                        distr_RNA_to_prim_sites.append((one_norm * norm_list[i]))
-                    total_RNA_number = 0
-                    distr_RNA_to_prim_sites_len = len(distr_RNA_to_prim_sites)
-                    for i in range(distr_RNA_to_prim_sites_len):
-                        total_RNA_number += distr_RNA_to_prim_sites[i]
-                    new_distr_RNA_to_prim_sites = []
-                    if total_RNA_number != csv_count:
-                        for i in range(distr_RNA_to_prim_sites_len):
-                            new_distr_RNA_to_prim_sites.append(int(distr_RNA_to_prim_sites[i]))
-                    new_distr_RNA_to_prim_sites_len = len(new_distr_RNA_to_prim_sites)
-                    counter = 0
-                    while total_RNA_number != csv_count:
-                        new_distr_RNA_to_prim_sites[counter] = round(distr_RNA_to_prim_sites[counter])
-                        counter += 1
-                        assert counter <= new_distr_RNA_to_prim_sites_len, "Calculated RNA transcripts (assigned to priming sites) are more than initial count"
-
-                    #order the priming sites
-                    prim_sites_ordered = []
-                    for i in range(gtf_list_of_lines_len):
-                        prim_sites_ordered.append(gtf_list_of_lines[i][0])
-                    prim_sites_ordered.sort()
-
-                    #searching for 2 priming sites
-                    prim_sites_ordered_len = len(prim_sites_ordered)
-                    ph_1 = 0
-                    ph_2 = 0
-                    for i in range(0, (prim_sites_ordered_len-1), 2):
-                        if prim_sites_ordered[i] == 0.0:
-                            continue
-                        else:
-                            search_for_1 = prim_sites_ordered[i]
-                            search_for_2 = prim_sites_ordered[i+1]
-                            for j in range(gtf_list_of_lines_len):
-                                if gtf_list_of_lines[j][0] == search_for_1:
-                                    ph_1 = j
-                                if gtf_list_of_lines[j][0] == search_for_2:
-                                    ph_2 = j
-                            #making cDNA and comparing in library
-                            start_1 = gtf_list_of_lines[ph_1][0]
-                            start_2 = gtf_list_of_lines[ph_2][0]
-                            start_1 -= 1
-                            start_2 -= 1
-                            trans_between_prim_sites = fasta_seq[start_1:start_2]
-                            cDNA = ''
-                            for element in range(0, len(trans_between_prim_sites)):
-                                if trans_between_prim_sites[element] == 'A':
-                                    cDNA[element] = 'T'
-                                elif trans_between_prim_sites[element] == 'U':
-                                    cDNA[element] = 'A'
-                                elif trans_between_prim_sites[element] == 'G':
-                                    cDNA[element] = 'C'
-                                elif trans_between_prim_sites[element] == 'C':
-                                    cDNA[element] = 'G'
-                                else:
-                                    assert False, "cDNA synthesis failed, position is not A,U,G or C in transcript"
-                            # open output files
-                            if i == 0:
-                                with open(my_output_fasta, 'a') as myfasta, open(my_output_csv, 'a') as mycsv:
-                                    myfasta.write(">" + string(cDNA_transcript_id))
-                                    myfasta.write("\n")
-                                    myfasta.write(cDNA)
-                                    mycsv.write(",".join([cDNA_transcript_id, csv_gene_id, new_distr_RNA_to_prim_sites[ph_1]]))
-                            else:
-                                found_cDNA_id = ''
-                                found_cDNA_id_bool = False
-                                with open(my_output_fasta, 'r') as myfasta, open(my_output_csv, 'r') as mycsv, open(placeholder, 'w') as phf:
-                                    for myline in myfasta:
-                                        pos = myline.find('>')
-                                        if pos != 0:
-                                            continue
-                                        if pos == 0:
-                                            fid = myline
-                                            fid = fid.replace(">", "")
-                                            fbool = False
-                                            while fbool == False:
-                                                myline = myfasta.readline()
-                                                zer = myline[0]
-                                                if zer == ";":
-                                                    continue
-                                                elif zer == ">":
-                                                    assert False, "Error in searching cDNA in output fasta-file"
-                                                else:
-                                                    fseq = myline
-                                                    fbool = True
-                                            if fseq ==cDNA:
-                                                found_cDNA_id = fid
-                                                found_cDNA_id_bool = True
-                                                break
-                                    if found_cDNA_id_bool == True:
-                                        for myline_csv_out in mycsv:
-                                            csvlist = myline_csv_out.split(',')
-                                            csvcDNAid = csvlist[0]
-                                            if csvcDNAid == found_cDNA_id:
-                                                csvgeneid = csvlist[1]
-                                                csvcDNAcount = csvlist[2]
-                                                csvcDNAcount += new_distr_RNA_to_prim_sites[ph_1]
-                                                phf.write(",".join([csvcDNAid, csvgeneid, csvcDNAcount]))
-                                            else:
-                                                phf.write(myline_csv_out)
-                                if found_cDNA_id_bool == True:
-                                    with open(my_output_csv, 'w') as mycsv, open(placeholder, 'r') as phf:
-                                        for myplaceholder in phf:
-                                            mycsv.write(myplaceholder)
-                                else:
-                                    cDNA_transcript_id += 1
-                                    with open(my_output_fasta, 'a') as myfasta, open(my_output_csv, 'a') as mycsv:
-                                        myfasta.write(">" + string(cDNA_transcript_id))
-                                        myfasta.write("\n")
-                                        myfasta.write(cDNA)
-                                        mycsv.write(",".join(
-                                            [cDNA_transcript_id, csv_gene_id, new_distr_RNA_to_prim_sites[ph_1]]))
\ No newline at end of file
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..d5499e7
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Suvarnan Selliah and Ruth Eneida Montano Crespo
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6354e70
--- /dev/null
+++ b/README.md
@@ -0,0 +1,15 @@
+
+## cDNA generator
+
+This script generates cDNA copies of transcripts allowing for the priming of DNA synthesis at transcript-internal sites.
+
+Input:
+
+* fasta-formatted file of transcript sequences
+* gtf-formatted file with potential priming sites for individual transcripts, with associated probabilities
+* file with the copy number of each unique transcript subjected to the cDNA synthesis
+
+Output:
+
+* fasta-formatted files with DNA copies of the transcripts, ending at the one of the possible priming sites for each transcript. Priming sites are sampled in proportion to their probability. Each copy of a unique transcript is independently sampled, but only unique DNA sequences are saved to the output file.
+* Csv-formatted file with the copy number of each unique DNA copy.
\ No newline at end of file
diff --git a/generatecDNA-nf.nf b/generatecDNA-nf.nf
new file mode 100644
index 0000000..100a08a
--- /dev/null
+++ b/generatecDNA-nf.nf
@@ -0,0 +1,25 @@
+#!/usr/bin/env nextflow
+
+/* Path to transcript sequences sampled (fasta formatted) */
+params.sampledTranscriptSeq = "$baseDir/tests/*.fasta"
+/* Path to potential priming sites for individual transcripts (gtf formatted) */
+params.internalPrimingSites = "$baseDir/tests/*.gtf"
+/* Path to copy number of each unique transcript subjected to the cDNA synthesis (csv: transcriptID,count) */
+params.transcriptCounts = "$baseDir/tests/*.csv"
+
+process generatecDNA {
+
+    input:
+	path sampledTranscriptSeq from params.sampledTranscriptSeq
+	path internalPrimingSites from params.internalPrimingSites
+    path transcriptCounts from params.transcriptCounts
+
+    output:
+/* O5. Path to unique cDNA sequences */
+	path "cDNA_Seq"	into cDNAseq_ch
+/* O6. Path to cDNA count table */
+	path "cDNA_Count" into cDNA_Count_ch
+
+    """
+    python $baseDir/generatecDNA/generatecDNA.py -rna ${sampledTranscriptSeq}  -gtf ${internalPrimingSites} -cnr ${transcriptCounts}
+	"""
\ No newline at end of file
diff --git a/generatecDNA.egg-info/PKG-INFO b/generatecDNA.egg-info/PKG-INFO
new file mode 100644
index 0000000..ccabcbf
--- /dev/null
+++ b/generatecDNA.egg-info/PKG-INFO
@@ -0,0 +1,13 @@
+Metadata-Version: 2.1
+Name: generatecDNA
+Version: 0.1.0
+Summary: Generates cDNA copies of RNA transcript from internal priming sites
+Home-page: https://git.scicore.unibas.ch/zavolan_group/pipelines/scrna-seq-simulation.git
+Author: Suvarnan Selliah and Ruth Eneida Montano Crespo
+Author-email: r.montanocrespo@unibas.ch
+License: MIT
+Platform: UNKNOWN
+License-File: LICENSE.md
+
+UNKNOWN
+
diff --git a/generatecDNA.egg-info/SOURCES.txt b/generatecDNA.egg-info/SOURCES.txt
new file mode 100644
index 0000000..94fdf5c
--- /dev/null
+++ b/generatecDNA.egg-info/SOURCES.txt
@@ -0,0 +1,11 @@
+LICENSE.md
+README.md
+setup.py
+generatecDNA/__init__.py
+generatecDNA/generatecDNA-cli.py
+generatecDNA/generatecDNA.py
+generatecDNA.egg-info/PKG-INFO
+generatecDNA.egg-info/SOURCES.txt
+generatecDNA.egg-info/dependency_links.txt
+generatecDNA.egg-info/entry_points.txt
+generatecDNA.egg-info/top_level.txt
\ No newline at end of file
diff --git a/generatecDNA.egg-info/dependency_links.txt b/generatecDNA.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/generatecDNA.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/generatecDNA.egg-info/entry_points.txt b/generatecDNA.egg-info/entry_points.txt
new file mode 100644
index 0000000..7f34db3
--- /dev/null
+++ b/generatecDNA.egg-info/entry_points.txt
@@ -0,0 +1,3 @@
+[console_scripts]
+generatecDNA = generatecDNA.__main__:main
+
diff --git a/generatecDNA.egg-info/top_level.txt b/generatecDNA.egg-info/top_level.txt
new file mode 100644
index 0000000..06a294c
--- /dev/null
+++ b/generatecDNA.egg-info/top_level.txt
@@ -0,0 +1 @@
+generatecDNA
diff --git a/generatecDNA/.DS_Store b/generatecDNA/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..d26fe4d4827233bf0a8017f5f274df73be301a99
GIT binary patch
literal 6148
zcmZQzU|@7AO)+F(5MW?n;9!8zOq>i@0Z1N%F(jFwB5WY@z-DAJlrY3I#53qI6hP%h
zslgorpt$1($5|#r9s_dxReI*+Cnx3PCqa{kBLf42-hVIvdkLbefT5BhnIVxOnIVHA
z6=V*YuJy#}N-8fdfZDY)sURn_xWvHV8Y2@k3o9Et2RjEhM{ICLetB?7Vo7PSQ({px
zh!>KdpOXY*Cnkkurk2MGh&boxl_X~7r51sd1ZSqCCM6cdglFcZ<d-|;m*%AugY`ls
zI5;^t;{_zEt932ROmq|s4Gn5_6spaQ40IGs49sh5IXOg?^{s>AvvYFu^1H#_W?*E5
z&<wm#8b<XnFfiZ<l(OKWyqx^JbVx>F5N1ecNM*=lNM$HuNMtBsNM%T7aAELcaAeSB
zNM^`k$OLB~v<P67MGH!PoTh-XAG&Uk>ye`m=IT*;Gz3ONU_^!hv>@Z)9+AEu_4H^6
zjD`Td5CD}A3eYBt1C(xn&>$%WMg|6O7l4t0fdys`Be);H0Fnb~1<@d_AR45Vff2+4
zn*r9!zzEgK2=0b}^nto0AR4Tlfsp~Moq>@7tR3F^VuWaCV1(Mt2<@RTLbNk5LbNk5
zLbSu2H%gC&z-S0SLx34V3xMi>R|W=L{eOt6QF1f{Mnhm&h5#drOR$R*xKhUMKTur@
zs!tQ3(xBQOR2?&d>S=@+xGH9X3@A!Kg+bLlNGpg2SH+ABkeYn7Api@ZQF=54=pO<A
DnNy0F

literal 0
HcmV?d00001

diff --git a/generatecDNA/__init__.py b/generatecDNA/__init__.py
new file mode 100644
index 0000000..dde8fb9
--- /dev/null
+++ b/generatecDNA/__init__.py
@@ -0,0 +1,3 @@
+"""This is the __init__ function."""
+
+__version__ = "0.1.0"
diff --git a/generatecDNA/__pycache__/__init__.cpython-310.pyc b/generatecDNA/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f05da8021066e73461eaab38e654999c8cde7044
GIT binary patch
literal 237
zcmd1j<>g{vU|_gE_ef$m0|Ucj5C<7EGB7YWFfcF_b1*P4q%cG=q%a0EXfjpFhGb+G
zD`XZclw_nT#K&jmWtPOpE2Nd?C6{F8=lN+e-eQlBPsvY?k6+19#Kgb=A%3MhTg8MH
zrxq2*<mTs<6qS}_#JJ=qm*%GCl@!OgXO{RRCdC94<);@V=H_PRr7NW67b*B;rll$b
zCugSSC8rk0B&Xyhx~Jx)7A2PC7saGQSgFY_evUCPXXq7F-r}&y%}*)KNwoucpcv!;
G4rTy!dqqD0

literal 0
HcmV?d00001

diff --git a/generatecDNA/__pycache__/generatecDNA.cpython-310.pyc b/generatecDNA/__pycache__/generatecDNA.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3fa119fa372e6138678c2cb12a3cb877b3da94ba
GIT binary patch
literal 1297
zcmd1j<>g{vU|=}B{7B+^W(J1GAPzESW?*1&U|?V<7GhvvaA!ziNMUSYNMUSdiegA%
z3TDt`PDWM@V#9SPF)%QsGDI<^Fhnt>Fs3r6F{Lo2Ft@Nov81r1u(mKnv8J#EGib8k
z;&D&SOD#$)Np*JdbG*e?lv+|+l$Xo`G7O4AY$gT<24|2<#26SDY8Y!6;u&g~Y8c`f
zYnW>o;+awyf*CX!{WO_xv8E*!mn7a|PA^Hj#hP3YpI4;Ga*L%nH7BhI<hCM^VMVMA
z3=At7ir5(#7=C3tTg8MHrxq2*<mTs<6qS}_#JJ=qm*%GCl@!OgXO{RRCdC94<);@V
z=H_PRr7NW67b*B;rll$bCugSSC8rk0B&XyhLOqdR6q641PO^)iBML{apz;<+e0*kJ
zW=VWJ$Qi|K3=9lxjBJctj8&pg1Hhr62UCR-4BQM13>>gvU}I!pC}F5!$YKOVM?X(3
zOAX5criBc(tl<nP3@i*R49(1p40#-e48@}5jEoE*7|FoMP{II;hGwSzs9LrfRu_g?
zzgqSh_65u-EDITH*;80k*jgBB*j*T!8EZLG*lRgUSW-AjSZg?%8Jn407-Ds6xoX&J
zxFi`;IJ23G+-f*exWpN1ISVbJqTJa`MS(S(DV!*xJlRY|F*TeiyeOi)*-S-gHJm9t
zP*Ju8Y$<#-oZ<{AEaD6c85tQ0m5}`cief{C;u>V%fW$QU{cbT9Rf*<S#^;xo6qJ_4
zgHwPWn7qYUev6SSnGu?jKolq?fl@*+C^ZQ%FfgPu)G)-d)H2pEPGl-%3Wg*LaN5vh
zy2YetaEm25Be4i903kq;aEr?(C$qRDIX}0+4wN~HLB<L&ROzC`BXU~Mv&qR%PRuE`
z(?jUI#qbj3q+5)Rw-`fiF^1k^bic*u{EN{}ll>M;enDy;IL+STEJ{sG$;r%1ExyH8
zR9sS&S#XQBC^0WR^%iqZYThl@@}kU=R88(8P<jIEK&0|0rnJOctYE!S?75YYKw$y#
zqc}h$$P-a4ptKsroSKsg@gOK)6oGxogX{xPSy8OTz`(%A#KkD{pNE-)k&BU!k%du+
zk%x(kk%tk6IT)E5M3|U9D*dmL#2Frbnrxu#ke8U78Xtd)D?UCqKczGW#O8^QFDy;W
zfyyu!mlPFoGB7X{DS!yD+YkiEl|`WF1%*F2Lvb+hG4Zg0#r!lG!8DSuz&b&iZgJQ^
NEVKjZ21lO|BLGTXETjMc

literal 0
HcmV?d00001

diff --git a/generatecDNA/__pycache__/generatecDNA.cpython-39.pyc b/generatecDNA/__pycache__/generatecDNA.cpython-39.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f4322b4d9bb4b2f764b84c23b40cd483e44a35fc
GIT binary patch
literal 5093
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

literal 0
HcmV?d00001

diff --git a/generatecDNA/generatecDNA-cli.py b/generatecDNA/generatecDNA-cli.py
new file mode 100644
index 0000000..46009bf
--- /dev/null
+++ b/generatecDNA/generatecDNA-cli.py
@@ -0,0 +1,37 @@
+"""Command-line interface client."""
+
+import argparse
+import generatecDNA as gn
+
+
+def main() -> None:
+    """Entry point for CLI executable."""
+    parser = argparse.ArgumentParser(description="cDNA generator")
+
+    parser.add_argument(
+        "-rna",
+        type=str,
+        metavar="",
+        help="Path file to fasta file with RNA sequence")
+    parser.add_argument(
+        "-gtf",
+        type=str,
+        metavar="",
+        help="Path file to gtf file")
+    parser.add_argument(
+        "-cnr",
+        type=str,
+        metavar="",
+        help="Path file to copy number file")
+
+    args = parser.parse_args()
+
+    Generator = gn.GeneratecDNA(
+        fastaFile=args.rna, gtf=args.gtf, cp_nr=args.cnr)
+    Generator.generatecDNA(
+        fastaFile=args.rna, gtf=args.gtf, cp_nr=args.cnr)
+    print("Done")
+
+
+if __name__ == '__main__':
+    main()
diff --git a/generatecDNA/generatecDNA.py b/generatecDNA/generatecDNA.py
new file mode 100644
index 0000000..0f470ab
--- /dev/null
+++ b/generatecDNA/generatecDNA.py
@@ -0,0 +1,258 @@
+"""Package contains utilities to generate cDNA
+ as part of the workflow to simulate scRNAseq.
+
+Class:
+    GeneratecDNA: contains one method
+        generatecDNA: takes as input fasta-formatted file &
+        gtf-formatted-file & csv-formatted file,
+        outputs fasta-formatted file with cDNA ID and unique cDNA sequence &
+        csv-formatted file with cDNA ID and copy number
+"""
+
+import random
+
+
+class GeneratecDNA:
+    """Contains function to generate cDNA.
+
+    Args:
+        input files: path to fasta-file (RNA_ID & RNA_Seq),
+        gtf-file (RNA_ID & Priming sites & Probability),
+        csv-file (RNA_ID & copy number)
+
+    Attributes:
+        fastaFile: RNA_ID & RNA_Seq
+        gtf: RNA_ID & Priming sites & Probability
+        cp_nr: RNA_ID & copy number
+    """
+
+    def __init__(self, fastaFile, gtf, cp_nr) -> str:
+        """Class intructor."""
+        self.fastaFile = fastaFile
+        self.gtf = gtf
+        self.cp_nr = cp_nr
+
+    def generatecDNA(self, fastaFile, gtf, cp_nr):
+        """Generate cDNA.
+
+        Args:
+            fastaFile (str): RNA_ID & RNA_Seq
+            gtf (str): RNA_ID & Priming sites & Probability
+            cp_nr (str): RNA_ID & copy number
+
+        Returns:
+            cDNA.fasta: cDNA_ID & cDNA sequence
+            cDNA.csv: cDNA_ID & copy number
+        """
+        # defining global variables
+        gtfFileInputDict = {}
+        csvFileInputDict = {}
+        fastaInputDict = {}
+        # READING INPUT FILES / PART I
+        # open gtf file
+        with open(gtf, 'r') as gt:
+            # read gtf file
+            for mygtfline in gt:
+                currentGTFString = mygtfline
+                gtf_list = currentGTFString.split('\t')
+                gtf_seqname = gtf_list[0]
+                gtf_start = gtf_list[3]
+                gtf_end = gtf_list[4]
+                gtf_score = gtf_list[5]
+                my_temp_list_1 = [int(gtf_start),
+                                  int(gtf_end), float(gtf_score)]
+                if gtf_seqname in gtfFileInputDict:
+                    my_temp_list_2 = gtfFileInputDict[gtf_seqname]
+                    my_temp_list_2.append(my_temp_list_1)
+                    gtfFileInputDict[gtf_seqname] = my_temp_list_2
+                else:
+                    gtfFileInputDict[gtf_seqname] = [my_temp_list_1]
+        print(gtfFileInputDict)
+        # open csv file
+        with open(cp_nr, 'r') as cp:
+            # read csv file
+            for mycsvline in cp:
+                currentcsvstring = mycsvline
+                csv_list = currentcsvstring.split(',')
+                csv_trans_id = csv_list[0]
+                csv_count = csv_list[2]
+                csv_count = csv_count.replace("\n", "")
+                """ trans id should be always new,
+                    otherwise unhash csv_current_count
+                    in defining variables section.
+                if csv_trans_id in csvFileInputDict:
+                    csv_current_count = csvFileInputDict[csv_trans_id]
+                    csv_current_count += csv_count
+                    csvFileInputDict[csv_trans_id] = csv_current_count
+                else:
+                    csvFileInputDict[csv_trans_id] = csv_count
+                """
+                csvFileInputDict[csv_trans_id] = int(csv_count)
+        print(csvFileInputDict)
+        # open fasta file
+        with open(fastaFile, 'r') as fa:
+            # defining variables
+            fasta_id = ""
+            fasta_seq = ""
+            fasta_id_found = False
+            fasta_seq_found = False
+            # read fasta file
+            for myfastaline in fa:
+                currentfastastring = myfastaline
+                # find fasta ID
+                if not fasta_id_found and not fasta_seq_found:
+                    position_of_start = currentfastastring.find('>')
+                    if position_of_start != 0:
+                        continue
+                    elif position_of_start == 0:
+                        fasta_id = myfastaline
+                        fasta_id = fasta_id.replace(">", "")
+                        fasta_id = fasta_id.replace("\n", "")
+                        # I don't know, how the sequence id is formatted and
+                        # which part thereof is equal to the transcript ID
+                        # in the csv-formatted file and gtf-formatted file
+                        # temp_fasta_list_1 = fasta_id.split('\t')
+                        # fasta_id = temp_fasta_list_1[0]
+                        fasta_id_found = True
+                        continue
+                    else:
+                        print("FASTA: Start position in fasta file not found")
+                        break
+                # find fasta sequence
+                if fasta_id_found and not fasta_seq_found:
+                    while not fasta_seq_found:
+                        zero_position = currentfastastring[0]
+                        if zero_position == ";":
+                            currentfastastring = fa.readline()
+                        elif zero_position == ">":
+                            assert False, "FASTA: No Sequence after headline"
+                        else:
+                            fasta_seq = currentfastastring
+                            fasta_seq_found = True
+                if fasta_id_found and fasta_seq_found:
+                    fastaInputDict[fasta_id] = fasta_seq
+                    fasta_id_found = False
+                    fasta_seq_found = False
+                    fasta_id = ""
+                    fasta_seq = ""
+        print(fastaInputDict)
+        # COMPUTATION OF INPUT FILES / PART II
+        outputFastaDict = {}
+        outputCSVDict = {}
+        # starting Loop1: read fasta dict
+        for (k, v) in fastaInputDict.items():
+            rna_seq = v
+            # search for transcript ID in gtf-file to get
+            # priming sites and scores
+            if k in gtfFileInputDict:
+                gtfList = gtfFileInputDict[k]
+            else:
+                assert False, "Fasta-ID from fasta-file not found in gtf-file"
+            # Excluding priming sites within 40 bases
+            # at the beginning of the transcript and
+            # ordering priming sites on the RNA sequence in gtf-dict
+            # sorting
+            gtfList.sort(key=lambda x: x[0])
+            # elimination
+            for i in gtfList:
+                if i[0] <= 40:
+                    gtfList.remove(i)
+            # search for transcript ID in csv-file
+            # to get copy number of transcript
+            if k in csvFileInputDict:
+                actual_count = csvFileInputDict[k]
+            else:
+                assert False, "Fasta-ID from fasta-file not found in csv-file"
+            # random choosing
+            scores = []
+            for i in gtfList:
+                scores.append(i[2])
+            print("gtfList: ", gtfList)
+            print("scores: ", scores)
+            my_weighted_list = random.choices(
+                gtfList, weights=scores, k=actual_count)
+            # counts per priming site
+            counts_per_priming_site = []
+            for i in range(0, len(gtfList)):
+                counts_per_priming_site.append(0)
+            for i in range(0, len(gtfList)):
+                counts_per_priming_site[i] = my_weighted_list.count(gtfList[i])
+            print("counts: ", counts_per_priming_site)
+            # Loop2: through gtfList to create cDNA starting on priming sites
+            # according to counts per priming sites
+            counter_cDNA = 0
+            for i in gtfList:
+                cDNA_3_5 = ""
+                counter_cDNA += 1
+                cDNA_ID = "-".join([k, "cDNA", str(counter_cDNA)])
+                if counter_cDNA == 1:
+                    end = i[1]
+                    # create 3' to 5' cDNA
+                    for j in range(0, int(end)):
+                        if rna_seq[j] == "A":
+                            cDNA_3_5 = cDNA_3_5 + "T"
+                        elif rna_seq[j] == "U":
+                            cDNA_3_5 = cDNA_3_5 + "A"
+                        elif rna_seq[j] == "G":
+                            cDNA_3_5 = cDNA_3_5 + "C"
+                        elif rna_seq[j] == "C":
+                            cDNA_3_5 = cDNA_3_5 + "G"
+                        else:
+                            print(
+                                k, rna_seq, gtfList, i,
+                                cDNA_ID, counts_per_priming_site)
+                            assert False, "cDNA synthesis failed, position " \
+                                          "is not A,U,G or C in transcript"
+                else:
+                    previous_end = end + 1
+                    this_end = i[1]
+                    # create 3' to 5' cDNA
+                    for j in range(int(previous_end), int(this_end)):
+                        if rna_seq[j] == "A":
+                            cDNA_3_5 = cDNA_3_5 + "T"
+                        elif rna_seq[j] == "U":
+                            cDNA_3_5 = cDNA_3_5 + "A"
+                        elif rna_seq[j] == "G":
+                            cDNA_3_5 = cDNA_3_5 + "C"
+                        elif rna_seq[j] == "C":
+                            cDNA_3_5 = cDNA_3_5 + "G"
+                        else:
+                            print(
+                                k, rna_seq, gtfList, i,
+                                cDNA_ID, counts_per_priming_site)
+                            assert False, "cDNA synthesis failed, " \
+                                          "position is not A,U,G or C " \
+                                          "in transcript"
+                # reverse sequence to 5' to 3'
+                cDNA_5_3 = cDNA_3_5[::-1]
+                if counts_per_priming_site[(counter_cDNA - 1)] == 0:
+                    continue
+                elif cDNA_5_3 in outputCSVDict:
+                    new_count = outputCSVDict[cDNA_5_3]
+                    new_count += counts_per_priming_site[(counter_cDNA - 1)]
+                    outputCSVDict[cDNA_5_3] = new_count
+                else:
+                    outputFastaDict[cDNA_5_3] = cDNA_ID
+                    outputCSVDict[cDNA_5_3] = \
+                        counts_per_priming_site[(counter_cDNA - 1)]
+        # WRITING OUTPUT FILES / PART III
+        # write fasta-file and csv-formatted file
+        with open("cDNA.fasta", 'w') as myFa, open("cDNA.csv", 'w') as myCO:
+            firstLine = True
+            for (k, v) in outputFastaDict.items():
+                headline = "".join([">", v])
+                csvLine = ",".join([v, str(outputCSVDict[k])])
+                if firstLine:
+                    myFa.write(headline)
+                    myFa.write("\n")
+                    myFa.write(k)
+                    myCO.write(csvLine)
+                    firstLine = False
+                else:
+                    myFa.write("\n")
+                    myFa.write(headline)
+                    myFa.write("\n")
+                    myFa.write(k)
+                    myCO.write("\n")
+                    myCO.write(csvLine)
+        return myFa, myCO
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..335dd93
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,28 @@
+"""cDNA Generator.
+
+@author: Suvarnan Selliah & Ruth Montano
+"""
+
+from setuptools import setup, find_packages
+
+with open("README.md", "r") as f:
+    long_description = f.read()
+
+setup(
+    name='generatecDNA',
+    url=('https://git.scicore.unibas.ch/'
+         'zavolan_group/pipelines/scrna-seq-simulation.git'),
+    author='Suvarnan Selliah and Ruth Eneida Montano Crespo',
+    author_email='s.selliah@unibas.ch,r.montanocrespo@unibas.ch',
+    description=('Generates cDNA copies of RNA transcript'
+                 'from internal priming sites'),
+    license='MIT',
+    version='0.1.0',
+    packages=find_packages(),
+    install_requires=[],
+
+    entry_points={
+        'console_scripts': [
+            'generatecDNA = generatecDNA.__main__:main'
+        ]
+    })
diff --git a/tests/.DS_Store b/tests/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..9f52ee6408fed3d2e48fd284a905747184f46c18
GIT binary patch
literal 6148
zcmZQzU|@7AO)+F(5MW?n;9!8zEL;p&0Z1N%F(jFwB5WY@z-A;fBr+s3WH6*M#6#sq
zsnHM^4S~TM0-(Ih%@EHJ&rrZn$$*@H<2`folaq4tlc2?eBLf42-hVIvdk2TEr1Ihd
zsIHw!1v#0;B?bo97@3$^SlQS)*g3d4VuLgC%Y#c2OG=BK5{sfiypa6-oFo`KF)1uF
zwLD%x#5q5&Br!8DwFsmnI5Q<RDX}OfJTosPzuYOmG%uwXtQRW5!O6iHFCbZ6t!rUs
zqN8AFXi%%8P;G8xprc@7U|w6x$sww&Zygk$os*lF-wpNv10y4ZX5fX=Fsg@vfdPm2
z%7TmXa`N-iAw?d8Fhd$cB117l2}2@7JVPo&1w$f3E<*uB4nrz~9zqT+DA%I}B|k$t
zLkU9~78AhYsJa<t(R7P2<S`U6Bs1hQ6fk5mq%ss^F(;X!n4t{K98f4AM<~qqqx1*~
z0ci5);2t6V9rfmD2#kgR@gV>z9~7V!odc9^fY2Z*21W)3a2J4)fq?~PDkHcbzyOj1
zX$8?Btsoktm4Ok&0-FKW%D@QK$_Va;fb@a7Bp@2Boq>@7tet_80jwQfXEQ>yGcZDJ
zW`y=o7$Mpj7$Mpj7$MqW&KspiLtr!npdr8vp#?zozbgX+uKqtn)hIa{0;3@?EJJ{i
z#U<Fq30x^-_aCUP1=XhsP-#%@52}tCLG?65A4myUmI*STC;{d`<Um?M)jqf?W@LcW
S<f9D%SO|^Mqai^55C8yahL4;8

literal 0
HcmV?d00001

diff --git a/tests/__pycache__/test.cpython-310-pytest-6.2.5.pyc b/tests/__pycache__/test.cpython-310-pytest-6.2.5.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..eb8b9d2fd21bd6ecbf4ff82a5f60b0e6ef2056f4
GIT binary patch
literal 1314
zcmd1j<>g{vU|^U%<w)WJW(J1GAPzESVqjo!U|?V<He+C5NMT4}%wdRP1k+5p%uEc7
z47n^(tc(yDwkS5R40{xN3R4Pm3quq~3S%&XCd*5ZiGIn9APS1v85kHq*coItA0q=p
z3Bv-$bcPhhMT`p>85wFA7BDSjh+(Q_tYu1Js%5TWtYOY(s%5ERDRwPkUci#VT*H#a
zn8E@QPh(ohlEPZTx`1sVLm5M{RtfV0_8P{8j79n-%nLX`tUSgPRxq1+A!7>L940Y_
zTGkZy6pk9!Ohz$=TDB6-66OV5HEatRn;DxJQy5qnYFTQTQ#fmxYnb5nHlo<eRKpCm
zmkVxh8rWW@g^WenV7r(WGUhR+aDmyR*~<{jpvmp0$y}A;Y^5JsoLW?@pPQdoQdC-!
zq3@EPT$-DjS5mC+o>}6Pn4}+2l%HOdn46oKm#&bOU!>rZnU<;$oSd1Omz-LxpPZ7H
z=$@LFT9jClU!-4>T3k}BpO#o$k{F*_k(gVMld1>iRi)6xru33DxIO75X;qmtu_do4
zIlmw?wHR(ya&cJ|lOvZV<1Z##TTR9)AytinN(0Se1zTGM5Yt$*_!e`1X^AFN6mvnP
z0f;cJ;!7+pPAw_{D=^h81__$pVz|YeT2!RTeTyd@5{RkEE`E+tJkTHo^KNk!r6#82
zmzJa!72V=;D5wO5a(rUZEy4KY#GIV?qSS(-<ow)%#G=$&JPrkw@kynbIVG8S#kbgU
z@{<#Dif>887iZ*`=A?j?#;51xCne^@=OyN*-r|fePE1P$nQ)8G5$wLq{5;p9qWq#;
z!trVOMY)M3@u?LBIf;3RC7Jnon(VjOk`oJxD~pSm85kIfSQ!`?qPRhJLOf@L%rS&;
zAf}igbIevU6bUjgF#L*fwu%9#zZh8hi-D)V7)bhy!JGbKP|{xvC}fJkq+UVgElv<O
zJ~uHlj|Ef+a4;}1@G<hRRxs8u76~&jFlch#;(&!!5f=jk!!5~pNa*T8ypx%qr&p9(
zUX)pqdW#b-bc-D-Rs=G!hz+EX4WbWhEZA#Egb+vphfQvNN@-529jJ^d25D4c;9%rn
HV&Mb;JDQO4

literal 0
HcmV?d00001

diff --git a/tests/fasta_example.fasta b/tests/fasta_example.fasta
new file mode 100644
index 0000000..1a25b15
--- /dev/null
+++ b/tests/fasta_example.fasta
@@ -0,0 +1,21 @@
+>RNA_1
+;some comment from RNA_1
+CCCGGGGAUAACAACCCCGUGGUCUUUGAAGCCCUAGGCAAUGUGUGACAUUCCACCCGAACACCAUGCAUCCUUUGAUCGCAUUGGGCAGGGGACGUCGCUCCACUGGCGUAACACGAAGAGCAUUGGGUGUAACUUCCGAGAGGAGAUUGAGGGUGUGGAGCGACCUGGACCUCACUCCCCCUCAUGCACAGCGUGGACGGAAUCUGAUUUUCGUAUCGAGAAUAUAAAGUACUGUAGCGGCUCCCAUCGGUUGUGGUGUGGUCCAGCCGUGGGUGGACAUCUACCGUGAUUGCAGGGACUUUUCCUGAGAAAUGGCUACUGCAUUUGCACACGUCGCACUGUGACCCCAGGAUGUAUGACCAACCGCCUAGGCGCGGAUCAGGUCUUGACCCUGAUAUGAUUGGGUGUUGGCCCUGCCUGCCUCGAUUAGGGCACUACCACCACGCUCUCACGUCUCUGUUACCCUGGCAAUAAUGCUGGUGAUCUGGGGUGGCUAAUCGAGGGUAUUUACUAUGUGGGCUCAUCGAUGACGGGGCAGUACUCGUUUAAAGCAACCGCGCAGAAGUAGGACGUCCAAGAAUCCUCGCAAGAUAUAACAGUGUUCAUUAGAGUGUUGCUAUUUGCAAUUUUGAAGGGUGUGUUACGUACGUCUCAGGCGUCCACGGCUCCUUCCUACACUACACGCAGUCCCUAGCAACACAGGGUCUUAUCCACUCAACUAAUAGAACGCGUAUAAGACAUAGACCUUCUAGAACUACGAGUAAAUGGCCCAUGUUAUGCAUCAAUCGACUUCAUCCUCGAUGAGAUUGUAGUGCUCAAGCUUCUUAGGCACUAGCACGAUUGACCUGCCCAGAAUGGUGAAUUGCUGCGCUACAAACAAGGGUGACUCCGGCACAAGCUUGCUCCUGUAGAGUCACGGGUUACGCAAAGCGGUACGGUCAUGGACUGUCAGGCUGGUUUUUUGGCACGCUCCGGGACCCGAUACUGGCAUCGGGGA
+>RNA_2
+GGCUAGACUCACCAGGGAGCUUGGGUUGUACAUCGUACGGCUGGCCAUGGGGUCAGCAAUAUUAGUUAGGCUCAGCUCGUUUUUGGUCCCCAUGUUCGUCCCCCCUGGUUACAGUAUCCACGGUUUCUUCUGCGCAAACAAGGUAGCCGGACAAACAAGCUGGUGGCCUGGGGGUCGACAUGUUACACUCUGAAGGGUUAAGUCACUUCCCAUCGACUGCGUGGGCAUCUUUAUACAGCAGCGCUUGAAACCCCAAGAACGUAGGCUGCGCCCCUCCCUGCUCAAGGCCGUGGCUCUGUCAUCUGCUAAGUGAGCGAGGAGUGUGAUACGUUGCCAUUAAGCGUCUUAAGUUUUUCAUAGAUAGUGUAACGUCGCUGCUGAACUAUAAUAAGGAACCGCUAGGAAUCCACCGAUAACGUAGAUCUCCCUCGGAUGAUUUCCGGCUUAACGCGCACUAGCUGAUUCAUAUCAUGAACAAUAAGAUACAGACGUACUCUGCAGCGUGGACCUCACGGAACUUGUGAGUGCUGGUAGUUGCAGCAUGCGGCCGCUAUACCCGCCUGUUCUUAUUGAUCAUGAUCGUUCUUUCUGAGCGCUACACUGCUGGUGGUCCUGAAGCGGCGUAAUAAUUCAGGCAGUUUACAUUGCUUGGGAACGUAGCAACUAUGAUCGAAUUCGUACCCCCAGCACUAAGUACGGAUUAGCGCCAGUCGCGAAUUCUAUGAUCGUGCGAUGAUACCACUAUACGCGACAAUUAAGGUAAGCGUGGAACGCUAGGAAAGAGUGAUAUCAAAUGCGCACUACUGAGUCCCAGGUGUACAGUUACCGAAUGAUUUCAGAGUACGUAUUGCUUGUGGUGGAUCUCCUUGCAGAGAAGCUCACGAGUCCCGGACUGCCCAUGUGCACUGACUUGUUAGAAUAGAGAAUAGUAGAGGCUACUGUCCCGCACAGCUACCGUCCAUAGCAGAUUCUGUUCGCGUUUUAGAGAGGCAACUAGCAC
+>RNA_3
+CGGCUCCAAGACGUCGUAUAGUUACAGACACUAGGCGGUCUAGGGUCGUACUUUGAGCAACAUUGAAUCUGUUCAGACAUUUUACUGCUGAGCAUUUAGACCGGAUCGGGUGCGAGUGAGGGAUGGACGUGCCCGAUCACUGCGGUAACGGUCAUCACCACUUUGGGGAGGCCCAUUUAUUAGUCAGAGUAGGUUGCGAAGGUAAACACCGGCCUUAACAAGACUCACGAGGUCCCGAUAGGCAUGGACUCAGUACCAUUGGCUGGCGUGCAUAAACCAUAAGCUAGCCUGCUAGCUUCUUGCAGAAACGUAAACAAUAAAGUUUAGUAAGUAAGCCGCCGGAAAUUAUGUGGUUACCAACGUUAGCGUCUAUGAGUAACUCGCCAUCGGAUAAAAUUUCUCCCUACUUUACUCCCGAACGCCUUGGGGCAUGACUUGCAUAUACUCUUACACGCCUUCAAAAGCGGAGGGGAGAAUGACCAUCAUCAUGGUGCCAGCCUGGCUAAACUGCUGCCGGUGCGAAUUUUUCCCAGUACACCACAAAUACUGGCUCACAAAGUGUAGUGGGAUUACAUGUGAAGCAUGAUACGGAUAGGCGGGUCACGACAGCUUGGUGCUACUUGUUGGGGAAUAUAAAAUCGACUAAAGUGACCCCCACGGCUAAGUCUGUCAGCGAUGUAUUCUGUUAACCGGUCGUCUUUGACGGCGAGUGUCAUAUUCCUCUUAUAAUUCAAAGUCAGUGGGGCCUGGUAUUAUGCACAGCGCGGCCGCAAGCAUAGCGGAUACGUAUACUCAGAAGUAUAAUGUUUUCGUACCCUGACGCCAGAAGCAACUAGAUAUCGUCUUCGUGCAUCACGGAAUAUACGGCUACUGGCGGUAACCGUUGCUAGUGGUUAGGGGUUUAUAGGCGGCAGGUCUAGGUUCAUUGGCAAACGCACACGCGAUCACUCUCGUUUAUCUAGUCACGAUGGCUAGCCCGCGGGCACGAGCGCCUCAGGUC
+>RNA_4
+GAUGCGCGAAUCAACACCUAGGUCAUUAUACUGGGGUGGCAAAGCUUAUCGUGACUCGACGGGCUUUUUCCACCACCCCUACUCGGACCAUUGCUGGUCGAUCUACUAUAAGCGGCCACAAUGUGAAGUCCGGCUCCCGACGUGAGUAUCUAGAUAAUUAUGAGCAAGACACCAGUUAUGGCAUCUAGAAAUCAGCCACGGCCGCGCGCGGGGGGUACUGUACACUGAAACAGCAAACUUCUAUGACAGCCCGAAGUUGUUCCGGCGUGCGGUACAGAAAAGACUAAACAGGGCCUCAUUCCGCAUGUCACGUCACCGUCACCUUCGGACCCCACCUAGUUUUAGGAAACUCGCUCGUUUGAUAAGCAUAAAAACUUGUAUUGCAGCAAAGGGGUUCGCACGACUAAAAAGAUCCGCGUGUUGUGUAACAAGAGAUAACGUGGGGUCACACAAAAUGCCGACAGCCUACCGUUGUAAUGGCGAGCGAGUUCUGCCCGGGACGACAGCUCUAACAUUUUUGGCGCGUAGAAUAUGAAACUUCAUUAAAACAGGACGCACAACAUCUAUGGUGGUGAUUCAACCUUAGGAUGACCACAUCGAUUACUUGGAUUCUAAUGGUAGAAGCUAAGGGCUCCAUGAGAGACCACUGCGAGCGACUUGACAUGGCCUUUGCGCCAUUGUAUUGCCAUGCAAGAACAUCUAUGAUGGUUAUGGUCUCGUGUUGGUCCCCCACAGAGCAUCGUUAGGGUCGUCCAGGUUCAGGAGACCCUCUAAUUACGAGUCCUCUCAUACGGAGGAACUAGCGCACCCAGCCGCCGAUUCGUAGGGAUAUUAUAAUCGUACCGAGGAGCGCAGAUGAACUCGUGGUGUCUCUGUCAGUCCUCACCGCUAGUCCCGACCAUCGUGCGUACUGUCUUCUAACAUCAACGCCAUCUUCGCCUCGGCCACGUCUCAUAAUUCUUUUCUAAUGGCACAUUCUAGCGACUCAUAAUUUUGUCAG
+>RNA_5
+CGCGGAAGCCUCCGGCGAAGCGAUGGUGAGCCCACUGACCCUCACAGUUAACCCCAUCCGCAUCAUCAUUAAGAUCGCACCCGAAGUACGGUCAUCCGAGGGAAACUGCAGCAGCCUAUUGGGAACAGCGUUCACGACCUCCGCCGUCCGCCGUUACUCCCAUCUUGCGGGUGCCGACAGUAACGCCCUCCCGUGCUCCCCGCCGGUAGUCUGACAAUUUAUCCUAUAGGGACUAGCGAUCAGAUGGGAACCCGCCUCUCCCAUUGCUACCGCUCCGCCGGCCGCUAGCAACGGCCCAGCACAUUCGAAGAUUACUUUUCGCUGGCCCAUACUAGAACCAAUCCAUUCUACGGACAUACGGAUUGGCGCAAGUCCCUCAAAUCCCCUGCCUAAGCACGUUCUGCAGCGGGAGACACUUCAAGAGGGUAGGGGGAUUUAGCAAUGCGAUUGUGGUGUCACGAGAGUACGGUCCAUAAUUUAAAGUGGAGCUAUCCCGCUUAGUGUCUCCUCGUAUGGGAGAGCGAUUUAUCGGAGCCUGAACCACGCAACCAAUGCAAGGAUUGGACUACACGGAUACAAGGUGUGCAUGGCGCGAAUCCCGUGCUUCAAAGAGGCGCCCACUACAUCGACGCAUAGGUAGUAACUUGCUUUCUACAAGUAACCUUUCAGAUACUCGUUAACAUUCCCAUGGUUUCGGCACUUCCGUAACUCGAAACUACAUGAGCAGUAUUUGCGGGUCCGGUGCGCUGAUUUCGAACCUACUAGAGCUCUAGGAGCAACUGUGCAGCGGGGGUGGAGCCUUUGCCACCUAUCCGGUUAAGCUACAAGACACUAUUGUGGCCUCGCUCGCUAACGAUGUCAGUCUUAAUAAGUGGUCAGUGCUCCUCGUAUGCUAUGGGGUGCUUCAACGCCCGGGAAGUGAGACAAUGGGUACGAACAACGCCCAUCAUUAUGGAAAUAACGAAUCUGCCGACCUGUCCGACGACUGUUUCCAAUGUCA
+>RNA_6
+CGCGGAAGCCUCCGGCGAAGCGAUGGUGAGCCCACUGACCCUCACAGUUAACCCCAUCCGCAUCAUCAUUAAGAUCGCACCCGAAGUACGGUCAUCCGAGGGAAACUGCAGCAGCCUAUUGGGAACAGCGUUCACGACCUCCGCCGUCCGCCGUUACUCCCAUCUUGCGGGUGCCGACAGUAACGCCCUCCCGUGCUCCCCGCCGGUAGUCUGACAAUUUAUCCUAUAGGGACUAGCGAUCAGAUGGGAACCCGCCUCUCCCAUUGCUACCGCUCCGCCGGCCGCUAGCAACGGCCCAGCACAUUCGAAGAUUACUUUUCGCUGGCCCAUACUAGAACCAAUCCAUUCUACGGACAUACGGAUUGGCGCAAGUCCCUCAAAUCCCCUGCCUAAGCACGUUCUGCAGCGGGAGACACUUCAAGAGGGUAGGGGGAUUUAGCAAUGCGAUUGUGGUGUCACGAGAGUACGGUCCAUAAUUUAAAGUGGAGCUAUCCCGCUUAGUGUCUCCUCGUAUGGGAGAGCGAUUUAUCGGAGCCUGAACCACGCAACCAAUGCAAGGAUUGGACUACACGGAUACAAGGUGUGCAUGGCGCGAAUCCCGUGCUUCAAAGAGGCGCCCACUACAUCGACGCAUAGGUAGUAACUUGCUUUCUACAAGUAACCUUUCAGAUACUCGUUAACAUUCCCAUGGUUUCGGCACUUCCGUAACUCGAAACUACAUGAGCAGUAUUUGCGGGUCCGGUGCGCUGAUUUCGAACCUACUAGAGCUCUAGGAGCAACUGUGCAGCGGGGGUGGAGCCUUUGCCACCUAUCCGGUUAAGCUACAAGACACUAUUGUGGCCUCGCUCGCUAACGAUGUCAGUCUUAAUAAGUGGUCAGUGCUCCUCGUAUGCUAUGGGGUGCUUCAACGCCCGGGAAGUGAGACAAUGGGUACGAACAACGCCCAUCAUUAUGGAAAUAACGAAUCUGCCGACCUGUCCGACGACUGUUUCCAAUGUCA
+>RNA_7
+UUGUCUCCACGAACACCUAGUCUCACUCAUGUCCCAGCCAGGCAGUCCUUGCUGAGUGGCAACACAUCACCUCAGCUAUGGUGAGGUCCCUACGACGCACCGUUCCGCCGACCCUUUUCGGUUUAGAACUGCUUUGUCAUCGAACGUGAGGGCACCGGAGGUAGGCUUCGAAGCGCGAUCCUGAUAAACUCGACUCAGACGCUCCCAAGCCAUGUUCAACAUCGACCCGUAGUUGAUGGUAUCGGAAACGCGACAAGAGCCGUCCCGCAGACAGAUAUUCCGCCGCCCCAGACGAUACGUGGGGCCGCAGGCCUGCCGAAUGACACAGGGUCUUUAUCAGUCCUCCCGUGCGCUUGUUCCACAUCUGCACUUAAAUGUGGCCUUCUGGGAUAUGCCCGUCCAGCCUGGUUCUAGGGUAGCCCUGCAUCUUCAAGGUUGUACCGGCAAACUGGCAAGGGACAAUGGGAAUAGAGGUCAGCUCACGUCCGGGCCGCUAGCAU
+>RNA_8
+AAUCGAGACAGGCGAGACUCUUCGGACCGGGCCGGCCGCAUUGAGGAAAGGGGUCAGAGCGACCGGUGCCCCAUUCCGGAAUCGCCCAGGCAUGAUGUAAACACACCAACCGUCCUUGCCUGAUGAACUCGCACGUUUCGUGCCUCAUGAAGAGUAGACUCCCGGUUGUAUUUGUCCCCCGUGUGUACUGAUAGAACCUAGGAACGGCAAUAAUACCACUGAGGAACGGGUGGCCUAUCCAAGGGGGGCUACGGAUAGCGGGUAGCCAUACGCCGUAGGGAGUCUUAUUCGGUAAGUUUGAGCUAUAGAACGUAAAAUUAGCUGCUCCGUGUUCCUCUAUAUGCGGCUGCAUUUCCACGUACCUACUCCCGUGAGUUAGCUCGACACUUUAUAACCAUCUCAGUUGCUACGGUGAUAAAGAAUUACGUGCCGCCGACGGGUAGUCCCGCGCAAAGAUGUGGUCGUUUAGUGGGUUCUCCUACUCUAGAGACUUGCUCGUAGCAUGCGCUUAUUACAAUAUCAGUCUGGUGGUGCCGAUUUCUAGCUCAUGACCGUAAGCAACCCAAAGCAUCGUAGAAUCGGAUACAUACAGCUGAAUGAUUACAAUAACUUUGUAGAGCCCACAGUAAAGCCUAAUGAGAGCCGUUCGUUGCCUGUAAUAUCUCACUUGGGUGAUGCAAGCCCCGCUUGAUUGGAAAUCCGGGGCUCGGGUGUCCCGUGUCGUGGGAUGGUACUUGCUCACUGCCAGGAUAAAUAAAUCCCACCUCACGCGGGCAAUUACAGUGAUGACAACAAACGCC
+>RNA_9
+CCCUGCCUGAGUCAUCCGGGAGUUCCCUGAGUUAUGCAGUGUAAAAAGAAUAUAUGAGAGCUCUUUUAGGGACUCAGUGAAGCUAUAACGAAGCCUUCCUCCAUCCCUCAUUUUAUAUAAAGUUGUCGGUAGUCGGGGCUACAGUGCAGUGUCCUGAUGAGCCCGCUGCUGCGAACCUUAGGGAUCUCUUAAGCUCACCGAAGCCAUUAUGUGAGAUCCCCCGCCUUGCUGGCGAUUAAGUGGGUCUAAAGCGUGUAAUUCGCCUCCUCGUAUAACUUUCUUCGGUAAUUAUGGCCGUUCAAUACUUGGAUAGACUUCGUUAUAUACGCGGUGAUUCUAUUACCACGGAGCGUUUAAAAAAAUUACCAGGAUCUCAAGGGCACCCCGCCUGAUGUGUUGAGUCUCUCGAUUGUAGGUCAGUUAGCUAGCUGACUCACAAUUGCUCUCAGCCCAGGCGUCCUAUGGCUUACCCUACAAGUAUGUUGCUCUCUGUACGGACA
+>RNA_10
+CCCUGCCUGAGUCAUCCGGGAGUUCCCUGAGUUAUGCAGUGUAAAAAGAAUAUAUGAGAGCUCUUUUAGGGACUCAGUGAAGCUAUAACGAAGCCUUCCUCCAUCCCUCAUUUUAUAUAAAGUUGUCGGUAGUCGGGGCUACAGUGCAGUGUCCUGAUGAGCCCGCUGCUGCGAACCUUAGGGAUCUCUUAAGCUCACCGAAGCCAUUAUGUGAGAUCCCCCGCCUUGCUGGCGAUUAAGUGGGUCUAAAGCGUGUAAUUCGCCUCCUCGUAUAACUUUCUUCGGUAAUUAUGGCCGUUCAAUACUUGGAUAGACUUCGUUAUAUACGCGGUGAUUCUAUUACCACGGAGCGUUUAAAAAAAUUACCAGGAUCUCAAGGGCACCCCGCCUGAUGUGUUGAGUCUCUCGAUUGUAGGUCAGUUAGCUAGCUGACUCACAAUUGCUCUCAGCCCAGGCGUCCUAUGGCUUACCCUACAAGUAUGUUGCUCUCUGUACGGACA
\ No newline at end of file
diff --git a/tests/gtf_example.gtf b/tests/gtf_example.gtf
new file mode 100644
index 0000000..cc1d19d
--- /dev/null
+++ b/tests/gtf_example.gtf
@@ -0,0 +1,21 @@
+RNA_1	.	priming_site	50	68	89	.	.	.
+RNA_2	.	priming_site	500	518	50	.	.	.
+RNA_2	.	priming_site	980	1000	90	.	.	.
+RNA_3	.	priming_site	500	522	34	.	.	.
+RNA_3	.	priming_site	255	270	89	.	.	.
+RNA_3	.	priming_site	678	698	34	.	.	.
+RNA_3	.	priming_site	990	1000	34	.	.	.
+RNA_4	.	priming_site	400	422	23	.	.	.
+RNA_4	.	priming_site	20	40	60	.	.	.
+RNA_5	.	priming_site	90	112	12	.	.	.
+RNA_5	.	priming_site	40	58	34.9	.	.	.
+RNA_5	.	priming_site	800	812	23.9	.	.	.
+RNA_5	.	priming_site	456	474	56.9	.	.	.
+RNA_6	.	priming_site	978	1000	100	.	.	.
+RNA_7	.	priming_site	100	122	0.1	.	.	.
+RNA_7	.	priming_site	50	70	40	.	.	.
+RNA_8	.	priming_site	20	42	20	.	.	.
+RNA_8	.	priming_site	80	96	98.9	.	.	.
+RNA_9	.	priming_site	400	418	40	.	.	.
+RNA_9	.	priming_site	10	32	60	.	.	.
+RNA_10	.	priming_site	200	218	10	.	.	.
\ No newline at end of file
diff --git a/tests/nrcopies_example.csv b/tests/nrcopies_example.csv
new file mode 100644
index 0000000..debd328
--- /dev/null
+++ b/tests/nrcopies_example.csv
@@ -0,0 +1,10 @@
+RNA_1,Gene_1,2
+RNA_2,Gene_2,90
+RNA_3,Gene_3,6
+RNA_4,Gene_4,8
+RNA_5,Gene_5,25
+RNA_6,Gene_6,23
+RNA_7,Gene_7,5
+RNA_8,Gene_8,5
+RNA_9,Gene_9,1
+RNA_10,Gene_10,7
\ No newline at end of file
-- 
GitLab