diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 Binary files /dev/null and b/.DS_Store differ diff --git a/primingsitepredictor/.idea/.gitignore b/primingsitepredictor/.idea/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..13566b81b018ad684f3a35fee301741b2734c8f4 --- /dev/null +++ b/primingsitepredictor/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/primingsitepredictor/.idea/inspectionProfiles/profiles_settings.xml b/primingsitepredictor/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..105ce2da2d6447d11dfe32bfb846c3d5b199fc99 --- /dev/null +++ b/primingsitepredictor/.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/primingsitepredictor/.idea/misc.xml b/primingsitepredictor/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..e6a7aa474cd32e70c4d9694c40996d01e47c23fc --- /dev/null +++ b/primingsitepredictor/.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 3.10 (tests)" project-jdk-type="Python SDK" /> +</project> \ No newline at end of file diff --git a/primingsitepredictor/.idea/modules.xml b/primingsitepredictor/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7f52b9584a9cd9443097c0f753a17a344fa41a0 --- /dev/null +++ b/primingsitepredictor/.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/primingsitepredictor.iml" filepath="$PROJECT_DIR$/.idea/primingsitepredictor.iml" /> + </modules> + </component> +</project> \ No newline at end of file diff --git a/primingsitepredictor/.idea/primingsitepredictor.iml b/primingsitepredictor/.idea/primingsitepredictor.iml new file mode 100644 index 0000000000000000000000000000000000000000..d0876a78d06ac03b5d78c8dcdb95570281c6f1d6 --- /dev/null +++ b/primingsitepredictor/.idea/primingsitepredictor.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/primingsitepredictor/.idea/vcs.xml b/primingsitepredictor/.idea/vcs.xml new file mode 100644 index 0000000000000000000000000000000000000000..6c0b8635858dc7ad44b93df54b762707ce49eefc --- /dev/null +++ b/primingsitepredictor/.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/primingsitepredictor/Primer1.fasta b/primingsitepredictor/Primer1.fasta index 545f1100114ec5eb992d22bc71d364b8663a7638..251777b9e4a409e7bb32d851b7bee98032bd3d6c 100644 --- a/primingsitepredictor/Primer1.fasta +++ b/primingsitepredictor/Primer1.fasta @@ -1,2 +1,2 @@ -<primer1 -TTTTTTTTTTTTTTT +<primer1 +TTTTTTTTTTTTTTT diff --git a/primingsitepredictor/cli.py b/primingsitepredictor/cli.py index 5b665962b5b9b5aa698793c7fe4e3d4cba2db16f..218fbb65b4c66ea098d317a17bbee015706d4933 100644 --- a/primingsitepredictor/cli.py +++ b/primingsitepredictor/cli.py @@ -1,35 +1,36 @@ # -*- coding: utf-8 -*- """ -Created on Mon Nov 14 14:49:50 2022 +Changed on Fr Dec 23 16:49:50 2022 -@author: baerma +@author: RobinC """ import argparse import logging import main -def create_parser(): - """This function creates the parser""" - parser = argparse.ArgumentParser( - prog = 'Priming site predictor', - description = 'Takes a cutoff energy and the predicts location of priming sites of transcripts', - epilog = 'To predict or not to predict') - parser.add_argument('energycutoff', type=float, help='a float as energy Cutoff') - #parser.add_argument('transcripts', help='fastafile containing transcripts') #What type is that? fasta? Actually doesn't make sense here - args = parser.parse_args() - energy_cutoff = args.energycutoff - return energy_cutoff -#possibly make a class out of this although I think it's an overkill +class CLI(): + def create_parser(self): + """This function creates the parser""" -def letsgo(): - energy_cutoff = create_parser() - print(f"Your energy cutoff is {energy_cutoff}") + parser = argparse.ArgumentParser( + prog = 'PrimingSitePredictor', + description = 'Takes a cutoff energy and the predicts location of priming sites of transcripts', + epilog = 'To predict or not to predict') + parser.add_argument('--float', type=float, required=True, help='A energy-cutoff float number') + parsed_args = parser.parse_args() + energy_cutoff = parsed_args.float + return energy_cutoff + + def letsgo(self): + """This function creates a parser and prints the energycutoff""" + energy_cutoff = CLI.create_parser() + print(f"Your energy cutoff is {energy_cutoff}") if __name__ == '__main__': logging.basicConfig( format='[%(asctime)s: %(levelname)s] %(message)s (module "%(module)s")', level=logging.INFO, - ) + ) LOG = logging.getLogger(__name__) main() - #here we would point to the main module and parse the energy cutoff + diff --git a/primingsitepredictor/createprimer.py b/primingsitepredictor/createprimer.py index c2c234f2eca3c07dd400098897f2586ceb0a7183..8dcd2329f74f6f0c6254ff428dd323aa9bf8fe53 100644 --- a/primingsitepredictor/createprimer.py +++ b/primingsitepredictor/createprimer.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- """ -Created on Wed Nov 16 14:17:06 2022 +Changed on Fr Dec 23 14:34:20 2022 -@author: baerma +@author: RobinC """ class CreatePrimer: @@ -13,8 +13,7 @@ class CreatePrimer: self.primer_length = primerlength self.primer_sequence = 'T'*self.primer_length self.lines = [f'<{self.name}', self.primer_sequence] - #print(self.primer) - #return self.primer + def create_fasta(self): with open(f'{self.name}.fasta', 'w') as f: diff --git a/primingsitepredictor/main.py b/primingsitepredictor/main.py index 07348dd4b21c73c4a8be7d07a2f351e1cab7fd5f..d8d80b1e26440880da3aaacd2ffa336ebe0a95cf 100644 --- a/primingsitepredictor/main.py +++ b/primingsitepredictor/main.py @@ -1,10 +1,16 @@ +""" +Changed on Tue Dec 20 14:06:20 2022 + +@author: RobinC +""" import sys from createprimer import CreatePrimer from postprocessing import PostProcessRIBlast + def main(): generate_RIBlast_input() - create_gtf() + def generate_RIBlast_input(): @@ -20,9 +26,5 @@ def create_gtf(): gtf_file = PostProcessRIBlast().output print(gtf_file) - - -main() - if __name__ == '__main__': main() diff --git a/primingsitepredictor/my_primer.fasta b/primingsitepredictor/my_primer.fasta new file mode 100644 index 0000000000000000000000000000000000000000..70ef81c7f1201827c1886f6cf15efec0ec65ecf3 --- /dev/null +++ b/primingsitepredictor/my_primer.fasta @@ -0,0 +1,2 @@ +<my_primer +TTTTTTTTTTTTTTTTTTTT diff --git a/primingsitepredictor/output_transcripts_df.GTF b/primingsitepredictor/output_transcripts_df.GTF new file mode 100644 index 0000000000000000000000000000000000000000..89ba6f367701e787b727d3602c241853c88d61d8 --- /dev/null +++ b/primingsitepredictor/output_transcripts_df.GTF @@ -0,0 +1,33 @@ +Transcript_1 RIBlast Priming_site 2974 2988 . + . Interaction_Energy "0.01341899394212988" +Transcript_1 RIBlast Priming_site 4 18 . + . Interaction_Energy "0.029617468622161858" +Transcript_1 RIBlast Priming_site 3 17 . + . Interaction_Energy "0.033652793432239245" +Transcript_1 RIBlast Priming_site 2 16 . + . Interaction_Energy "0.0436763978338453" +Transcript_1 RIBlast Priming_site 1 15 . + . Interaction_Energy "0.07361927731913716" +Transcript_1 RIBlast Priming_site 0 14 . + . Interaction_Energy "0.07913386517826602" +Transcript_2 RIBlast Priming_site 1270 1284 . + . Interaction_Energy "0.023871738821072214" +Transcript_2 RIBlast Priming_site 1269 1283 . + . Interaction_Energy "0.021998205780680843" +Transcript_2 RIBlast Priming_site 1268 1282 . + . Interaction_Energy "0.02017380792576395" +Transcript_2 RIBlast Priming_site 1267 1281 . + . Interaction_Energy "0.018400390375292373" +Transcript_2 RIBlast Priming_site 1266 1280 . + . Interaction_Energy "0.016661952134191884" +Transcript_2 RIBlast Priming_site 1265 1279 . + . Interaction_Energy "0.015028790572682043" +Transcript_2 RIBlast Priming_site 1264 1278 . + . Interaction_Energy "0.013507972357530618" +Transcript_2 RIBlast Priming_site 1263 1277 . + . Interaction_Energy "0.012121303370956734" +Transcript_2 RIBlast Priming_site 1262 1276 . + . Interaction_Energy "0.0108940605154748" +Transcript_2 RIBlast Priming_site 1261 1275 . + . Interaction_Energy "0.009818208415333858" +Transcript_2 RIBlast Priming_site 1260 1274 . + . Interaction_Energy "0.008876574189642966" +Transcript_2 RIBlast Priming_site 1259 1273 . + . Interaction_Energy "0.00807212607564225" +Transcript_2 RIBlast Priming_site 1258 1272 . + . Interaction_Energy "0.007386053280385996" +Transcript_2 RIBlast Priming_site 1257 1271 . + . Interaction_Energy "0.006777457533826199" +Transcript_2 RIBlast Priming_site 1256 1270 . + . Interaction_Energy "0.006231339626935633" +Transcript_2 RIBlast Priming_site 1255 1269 . + . Interaction_Energy "0.005701431631106869" +Transcript_2 RIBlast Priming_site 1254 1268 . + . Interaction_Energy "0.005221962850186007" +Transcript_2 RIBlast Priming_site 1253 1267 . + . Interaction_Energy "0.004743243630707861" +Transcript_2 RIBlast Priming_site 1252 1266 . + . Interaction_Energy "0.0043514767009977685" +Transcript_2 RIBlast Priming_site 1251 1265 . + . Interaction_Energy "0.004001246269203596" +Transcript_2 RIBlast Priming_site 1250 1264 . + . Interaction_Energy "0.0035602658910861193" +Transcript_2 RIBlast Priming_site 1249 1263 . + . Interaction_Energy "0.0034681706680775195" +Transcript_2 RIBlast Priming_site 1248 1262 . + . Interaction_Energy "0.003588271464203091" +Transcript_2 RIBlast Priming_site 1247 1261 . + . Interaction_Energy "0.0037963420302257692" +Transcript_2 RIBlast Priming_site 1246 1260 . + . Interaction_Energy "0.004081499678888505" +Transcript_2 RIBlast Priming_site 1245 1259 . + . Interaction_Energy "0.004411927146940477" +Transcript_2 RIBlast Priming_site 1244 1258 . + . Interaction_Energy "0.00480978620121743" diff --git a/primingsitepredictor/output_transcripts_df.txt b/primingsitepredictor/output_transcripts_df.txt index bb43f201dfc4ff5c44ff9de6b45d5dfe82799c18..89ba6f367701e787b727d3602c241853c88d61d8 100644 --- a/primingsitepredictor/output_transcripts_df.txt +++ b/primingsitepredictor/output_transcripts_df.txt @@ -1,3 +1,33 @@ -Transcript_1 RIBlast Priming_site 2974 2988 . + . Accessibility_Energy "0.08051396365277928" -Transcript_1 RIBlast Priming_site 4 18 . + . Accessibility_Energy "0.17770481173297115" -Transcript_2 RIBlast Priming_site 1270 1284 . + . Accessibility_Energy "0.6445369481689498" +Transcript_1 RIBlast Priming_site 2974 2988 . + . Interaction_Energy "0.01341899394212988" +Transcript_1 RIBlast Priming_site 4 18 . + . Interaction_Energy "0.029617468622161858" +Transcript_1 RIBlast Priming_site 3 17 . + . Interaction_Energy "0.033652793432239245" +Transcript_1 RIBlast Priming_site 2 16 . + . Interaction_Energy "0.0436763978338453" +Transcript_1 RIBlast Priming_site 1 15 . + . Interaction_Energy "0.07361927731913716" +Transcript_1 RIBlast Priming_site 0 14 . + . Interaction_Energy "0.07913386517826602" +Transcript_2 RIBlast Priming_site 1270 1284 . + . Interaction_Energy "0.023871738821072214" +Transcript_2 RIBlast Priming_site 1269 1283 . + . Interaction_Energy "0.021998205780680843" +Transcript_2 RIBlast Priming_site 1268 1282 . + . Interaction_Energy "0.02017380792576395" +Transcript_2 RIBlast Priming_site 1267 1281 . + . Interaction_Energy "0.018400390375292373" +Transcript_2 RIBlast Priming_site 1266 1280 . + . Interaction_Energy "0.016661952134191884" +Transcript_2 RIBlast Priming_site 1265 1279 . + . Interaction_Energy "0.015028790572682043" +Transcript_2 RIBlast Priming_site 1264 1278 . + . Interaction_Energy "0.013507972357530618" +Transcript_2 RIBlast Priming_site 1263 1277 . + . Interaction_Energy "0.012121303370956734" +Transcript_2 RIBlast Priming_site 1262 1276 . + . Interaction_Energy "0.0108940605154748" +Transcript_2 RIBlast Priming_site 1261 1275 . + . Interaction_Energy "0.009818208415333858" +Transcript_2 RIBlast Priming_site 1260 1274 . + . Interaction_Energy "0.008876574189642966" +Transcript_2 RIBlast Priming_site 1259 1273 . + . Interaction_Energy "0.00807212607564225" +Transcript_2 RIBlast Priming_site 1258 1272 . + . Interaction_Energy "0.007386053280385996" +Transcript_2 RIBlast Priming_site 1257 1271 . + . Interaction_Energy "0.006777457533826199" +Transcript_2 RIBlast Priming_site 1256 1270 . + . Interaction_Energy "0.006231339626935633" +Transcript_2 RIBlast Priming_site 1255 1269 . + . Interaction_Energy "0.005701431631106869" +Transcript_2 RIBlast Priming_site 1254 1268 . + . Interaction_Energy "0.005221962850186007" +Transcript_2 RIBlast Priming_site 1253 1267 . + . Interaction_Energy "0.004743243630707861" +Transcript_2 RIBlast Priming_site 1252 1266 . + . Interaction_Energy "0.0043514767009977685" +Transcript_2 RIBlast Priming_site 1251 1265 . + . Interaction_Energy "0.004001246269203596" +Transcript_2 RIBlast Priming_site 1250 1264 . + . Interaction_Energy "0.0035602658910861193" +Transcript_2 RIBlast Priming_site 1249 1263 . + . Interaction_Energy "0.0034681706680775195" +Transcript_2 RIBlast Priming_site 1248 1262 . + . Interaction_Energy "0.003588271464203091" +Transcript_2 RIBlast Priming_site 1247 1261 . + . Interaction_Energy "0.0037963420302257692" +Transcript_2 RIBlast Priming_site 1246 1260 . + . Interaction_Energy "0.004081499678888505" +Transcript_2 RIBlast Priming_site 1245 1259 . + . Interaction_Energy "0.004411927146940477" +Transcript_2 RIBlast Priming_site 1244 1258 . + . Interaction_Energy "0.00480978620121743" diff --git a/primingsitepredictor/postprocessing.py b/primingsitepredictor/postprocessing.py index 125950e493a8399cf4297eeb0778ca531325dc2a..e2504e0f98e7a6527f508715d018aace78066c5c 100644 --- a/primingsitepredictor/postprocessing.py +++ b/primingsitepredictor/postprocessing.py @@ -60,15 +60,10 @@ class PostProcessRIBlast(): for index in self.interaction_df.index: self.output = self.output + str(self.interaction_df[3][index]+'\t' + 'RIBlast' + '\t' + 'Priming_site' + '\t' + self.interaction_df[13][index] + '\t' + self.interaction_df[12][index] + '\t' + '.' + '\t' + '+' + '\t' + '.' + '\t' + f'Interaction_Energy "{self.interaction_df["Normalised_interaction_energy"][index]}"' + '\n') -<<<<<<< HEAD - with open('output_transcripts_df.txt', 'w') as f: + with open('output_transcripts_df.GTF', 'w') as f: f.write(self.output) - + return(self.output) -======= - return(self.output) ->>>>>>> 9d8e928323a99c5e86557c4b53ab93aaf8f5beb5 - -#print(PostProcessRIBlast().output) \ No newline at end of file +print(PostProcessRIBlast().output) \ No newline at end of file diff --git a/primingsitepredictor/test/RIBlast output example.txt b/primingsitepredictor/test/RIBlast output example.txt new file mode 100644 index 0000000000000000000000000000000000000000..f3a270893926da9f8b302af5b15dbed875a6475f --- /dev/null +++ b/primingsitepredictor/test/RIBlast output example.txt @@ -0,0 +1,37 @@ +RIblast ris result +input:queryRNA.fa,database:test_db,RepeatFlag:0,MaximalSpan:70,MinAccessibleLength:5,MaxSeedLength:20,InteractionEnergyThreshold:-4,HybridEnergyThreshold:-6,FinalThreshold:-8,DropOutLengthWoGap:5,DropOutLengthWGap:16 +Id,Query name, Query Length, Target name, Target Length, Accessibility Energy, Hybridization Energy, Interaction Energy, BasePair +0,Test_Primer,15,Transcript_1,3233,1.49191,-9.76,-8.26809,(0-14:2988-2974) +1,Test_Primer,15,Transcript_1,3233,1.02308,-9.76,-8.73692,(0-14:18-4) +2,Test_Primer,15,Transcript_1,3233,0.947439,-9.73,-8.78256,(0-14:17-3) +3,Test_Primer,15,Transcript_1,3233,0.793049,-9.73,-8.93695,(0-14:16-2) +4,Test_Primer,15,Transcript_1,3233,0.483869,-9.73,-9.24613,(0-14:15-1) +5,Test_Primer,15,Transcript_1,3233,0.441093,-9.17,-8.72891,(0-14:14-0) +6,Test_Primer,15,Transcript_2,1285,0.260102,-9.1,-8.8399,(0-14:1284-1270) +7,Test_Primer,15,Transcript_2,1285,0.308504,-9.73,-9.4215,(0-14:1283-1269) +8,Test_Primer,15,Transcript_2,1285,0.359773,-9.73,-9.37023,(0-14:1282-1268) +9,Test_Primer,15,Transcript_2,1285,0.414262,-9.73,-9.31574,(0-14:1281-1267) +10,Test_Primer,15,Transcript_2,1285,0.473033,-9.73,-9.25697,(0-14:1280-1266) +11,Test_Primer,15,Transcript_2,1285,0.534123,-9.73,-9.19588,(0-14:1279-1265) +12,Test_Primer,15,Transcript_2,1285,0.597302,-9.73,-9.1327,(0-14:1278-1264) +13,Test_Primer,15,Transcript_2,1285,0.661445,-9.73,-9.06855,(0-14:1277-1263) +14,Test_Primer,15,Transcript_2,1285,0.724659,-9.73,-9.00534,(0-14:1276-1262) +15,Test_Primer,15,Transcript_2,1285,0.786234,-9.73,-8.94377,(0-14:1275-1261) +16,Test_Primer,15,Transcript_2,1285,0.84594,-9.73,-8.88406,(0-14:1274-1260) +17,Test_Primer,15,Transcript_2,1285,0.902197,-9.73,-8.8278,(0-14:1273-1259) +18,Test_Primer,15,Transcript_2,1285,0.954797,-9.73,-8.7752,(0-14:1272-1258) +19,Test_Primer,15,Transcript_2,1285,1.00572,-9.73,-8.72428,(0-14:1271-1257) +20,Test_Primer,15,Transcript_2,1285,1.05547,-9.73,-8.67453,(0-14:1270-1256) +21,Test_Primer,15,Transcript_2,1285,1.1081,-9.73,-8.6219,(0-14:1269-1255) +22,Test_Primer,15,Transcript_2,1285,1.16012,-9.73,-8.56988,(0-14:1268-1254) +23,Test_Primer,15,Transcript_2,1285,1.21706,-9.73,-8.51294,(0-14:1267-1253) +24,Test_Primer,15,Transcript_2,1285,1.26811,-9.73,-8.46189,(0-14:1266-1252) +25,Test_Primer,15,Transcript_2,1285,1.3178,-9.73,-8.4122,(0-14:1265-1251) +26,Test_Primer,15,Transcript_2,1285,1.38695,-9.73,-8.34305,(0-14:1264-1250) +27,Test_Primer,15,Transcript_2,1285,1.40247,-9.73,-8.32753,(0-14:1263-1249) +28,Test_Primer,15,Transcript_2,1285,1.38231,-9.73,-8.34769,(0-14:1262-1248) +29,Test_Primer,15,Transcript_2,1285,1.34893,-9.73,-8.38107,(0-14:1261-1247) +30,Test_Primer,15,Transcript_2,1285,1.30604,-9.73,-8.42396,(0-14:1260-1246) +31,Test_Primer,15,Transcript_2,1285,1.25994,-9.73,-8.47006,(0-14:1259-1245) +32,Test_Primer,15,Transcript_2,1285,1.20881,-9.76,-8.55119,(0-14:1258-1244) +33,Test_Primer,15,Transcript_2,1285,1.63873,-9.91,-8.27127,(0-14:674-660) diff --git a/primingsitepredictor/test/__init__.py b/primingsitepredictor/test/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/primingsitepredictor/test/output_transcripts_df.GTF b/primingsitepredictor/test/output_transcripts_df.GTF new file mode 100644 index 0000000000000000000000000000000000000000..89ba6f367701e787b727d3602c241853c88d61d8 --- /dev/null +++ b/primingsitepredictor/test/output_transcripts_df.GTF @@ -0,0 +1,33 @@ +Transcript_1 RIBlast Priming_site 2974 2988 . + . Interaction_Energy "0.01341899394212988" +Transcript_1 RIBlast Priming_site 4 18 . + . Interaction_Energy "0.029617468622161858" +Transcript_1 RIBlast Priming_site 3 17 . + . Interaction_Energy "0.033652793432239245" +Transcript_1 RIBlast Priming_site 2 16 . + . Interaction_Energy "0.0436763978338453" +Transcript_1 RIBlast Priming_site 1 15 . + . Interaction_Energy "0.07361927731913716" +Transcript_1 RIBlast Priming_site 0 14 . + . Interaction_Energy "0.07913386517826602" +Transcript_2 RIBlast Priming_site 1270 1284 . + . Interaction_Energy "0.023871738821072214" +Transcript_2 RIBlast Priming_site 1269 1283 . + . Interaction_Energy "0.021998205780680843" +Transcript_2 RIBlast Priming_site 1268 1282 . + . Interaction_Energy "0.02017380792576395" +Transcript_2 RIBlast Priming_site 1267 1281 . + . Interaction_Energy "0.018400390375292373" +Transcript_2 RIBlast Priming_site 1266 1280 . + . Interaction_Energy "0.016661952134191884" +Transcript_2 RIBlast Priming_site 1265 1279 . + . Interaction_Energy "0.015028790572682043" +Transcript_2 RIBlast Priming_site 1264 1278 . + . Interaction_Energy "0.013507972357530618" +Transcript_2 RIBlast Priming_site 1263 1277 . + . Interaction_Energy "0.012121303370956734" +Transcript_2 RIBlast Priming_site 1262 1276 . + . Interaction_Energy "0.0108940605154748" +Transcript_2 RIBlast Priming_site 1261 1275 . + . Interaction_Energy "0.009818208415333858" +Transcript_2 RIBlast Priming_site 1260 1274 . + . Interaction_Energy "0.008876574189642966" +Transcript_2 RIBlast Priming_site 1259 1273 . + . Interaction_Energy "0.00807212607564225" +Transcript_2 RIBlast Priming_site 1258 1272 . + . Interaction_Energy "0.007386053280385996" +Transcript_2 RIBlast Priming_site 1257 1271 . + . Interaction_Energy "0.006777457533826199" +Transcript_2 RIBlast Priming_site 1256 1270 . + . Interaction_Energy "0.006231339626935633" +Transcript_2 RIBlast Priming_site 1255 1269 . + . Interaction_Energy "0.005701431631106869" +Transcript_2 RIBlast Priming_site 1254 1268 . + . Interaction_Energy "0.005221962850186007" +Transcript_2 RIBlast Priming_site 1253 1267 . + . Interaction_Energy "0.004743243630707861" +Transcript_2 RIBlast Priming_site 1252 1266 . + . Interaction_Energy "0.0043514767009977685" +Transcript_2 RIBlast Priming_site 1251 1265 . + . Interaction_Energy "0.004001246269203596" +Transcript_2 RIBlast Priming_site 1250 1264 . + . Interaction_Energy "0.0035602658910861193" +Transcript_2 RIBlast Priming_site 1249 1263 . + . Interaction_Energy "0.0034681706680775195" +Transcript_2 RIBlast Priming_site 1248 1262 . + . Interaction_Energy "0.003588271464203091" +Transcript_2 RIBlast Priming_site 1247 1261 . + . Interaction_Energy "0.0037963420302257692" +Transcript_2 RIBlast Priming_site 1246 1260 . + . Interaction_Energy "0.004081499678888505" +Transcript_2 RIBlast Priming_site 1245 1259 . + . Interaction_Energy "0.004411927146940477" +Transcript_2 RIBlast Priming_site 1244 1258 . + . Interaction_Energy "0.00480978620121743" diff --git a/primingsitepredictor/test/output_transcripts_df.txt b/primingsitepredictor/test/output_transcripts_df.txt new file mode 100644 index 0000000000000000000000000000000000000000..89ba6f367701e787b727d3602c241853c88d61d8 --- /dev/null +++ b/primingsitepredictor/test/output_transcripts_df.txt @@ -0,0 +1,33 @@ +Transcript_1 RIBlast Priming_site 2974 2988 . + . Interaction_Energy "0.01341899394212988" +Transcript_1 RIBlast Priming_site 4 18 . + . Interaction_Energy "0.029617468622161858" +Transcript_1 RIBlast Priming_site 3 17 . + . Interaction_Energy "0.033652793432239245" +Transcript_1 RIBlast Priming_site 2 16 . + . Interaction_Energy "0.0436763978338453" +Transcript_1 RIBlast Priming_site 1 15 . + . Interaction_Energy "0.07361927731913716" +Transcript_1 RIBlast Priming_site 0 14 . + . Interaction_Energy "0.07913386517826602" +Transcript_2 RIBlast Priming_site 1270 1284 . + . Interaction_Energy "0.023871738821072214" +Transcript_2 RIBlast Priming_site 1269 1283 . + . Interaction_Energy "0.021998205780680843" +Transcript_2 RIBlast Priming_site 1268 1282 . + . Interaction_Energy "0.02017380792576395" +Transcript_2 RIBlast Priming_site 1267 1281 . + . Interaction_Energy "0.018400390375292373" +Transcript_2 RIBlast Priming_site 1266 1280 . + . Interaction_Energy "0.016661952134191884" +Transcript_2 RIBlast Priming_site 1265 1279 . + . Interaction_Energy "0.015028790572682043" +Transcript_2 RIBlast Priming_site 1264 1278 . + . Interaction_Energy "0.013507972357530618" +Transcript_2 RIBlast Priming_site 1263 1277 . + . Interaction_Energy "0.012121303370956734" +Transcript_2 RIBlast Priming_site 1262 1276 . + . Interaction_Energy "0.0108940605154748" +Transcript_2 RIBlast Priming_site 1261 1275 . + . Interaction_Energy "0.009818208415333858" +Transcript_2 RIBlast Priming_site 1260 1274 . + . Interaction_Energy "0.008876574189642966" +Transcript_2 RIBlast Priming_site 1259 1273 . + . Interaction_Energy "0.00807212607564225" +Transcript_2 RIBlast Priming_site 1258 1272 . + . Interaction_Energy "0.007386053280385996" +Transcript_2 RIBlast Priming_site 1257 1271 . + . Interaction_Energy "0.006777457533826199" +Transcript_2 RIBlast Priming_site 1256 1270 . + . Interaction_Energy "0.006231339626935633" +Transcript_2 RIBlast Priming_site 1255 1269 . + . Interaction_Energy "0.005701431631106869" +Transcript_2 RIBlast Priming_site 1254 1268 . + . Interaction_Energy "0.005221962850186007" +Transcript_2 RIBlast Priming_site 1253 1267 . + . Interaction_Energy "0.004743243630707861" +Transcript_2 RIBlast Priming_site 1252 1266 . + . Interaction_Energy "0.0043514767009977685" +Transcript_2 RIBlast Priming_site 1251 1265 . + . Interaction_Energy "0.004001246269203596" +Transcript_2 RIBlast Priming_site 1250 1264 . + . Interaction_Energy "0.0035602658910861193" +Transcript_2 RIBlast Priming_site 1249 1263 . + . Interaction_Energy "0.0034681706680775195" +Transcript_2 RIBlast Priming_site 1248 1262 . + . Interaction_Energy "0.003588271464203091" +Transcript_2 RIBlast Priming_site 1247 1261 . + . Interaction_Energy "0.0037963420302257692" +Transcript_2 RIBlast Priming_site 1246 1260 . + . Interaction_Energy "0.004081499678888505" +Transcript_2 RIBlast Priming_site 1245 1259 . + . Interaction_Energy "0.004411927146940477" +Transcript_2 RIBlast Priming_site 1244 1258 . + . Interaction_Energy "0.00480978620121743" diff --git a/primingsitepredictor/test/primer1.fasta b/primingsitepredictor/test/primer1.fasta new file mode 100644 index 0000000000000000000000000000000000000000..251777b9e4a409e7bb32d851b7bee98032bd3d6c --- /dev/null +++ b/primingsitepredictor/test/primer1.fasta @@ -0,0 +1,2 @@ +<primer1 +TTTTTTTTTTTTTTT diff --git a/primingsitepredictor/test/test_cli.py b/primingsitepredictor/test/test_cli.py new file mode 100644 index 0000000000000000000000000000000000000000..dec66a1765914a96fbb354b33bcbbd07694833a7 --- /dev/null +++ b/primingsitepredictor/test/test_cli.py @@ -0,0 +1,103 @@ +""" +Created on Tue Dec 20 14:06:20 2022 + +@author: RobinC +""" + +# Imports +import os, sys +import pytest +currentdir = os.path.dirname(os.path.realpath(__file__)) +parentdir = os.path.dirname(currentdir) +sys.path.append(parentdir) +import createprimer as cp +import unittest +import cli +import argparse +import pytest +from unittest.mock import patch +from unittest.mock import Mock +import io +import sys + +class TestCli(unittest.TestCase): + + def test_import(self): + """Test function for module imports""" + try: + import argparse + except ImportError: + self.fail("Failed to import argparse") + + try: + import logging + except ImportError: + self.fail("Failed to import logging") + + try: + import main + except ImportError: + self.fail("Failed to import main") + + + + def test_create_parser(self): + + # Test parsing a float number + float_num = 3.14 + float_str = str(float_num) + self.assertEqual(float_num, cli.CLI.create_parser(['--float', float_str])) + + # Test parsing a float number with leading and trailing whitespace + float_num = 3.14 + float_str = " " + str(float_num) + " " + self.assertEqual(float_num, cli.CLI.create_parser(['--float', float_str])) + + # Test parsing a float number with a decimal point and no digits after it + float_num = 3. + float_str = str(float_num) + self.assertEqual(float_num, cli.CLI.create_parser(['--float', float_str])) + + # Test parsing a float number with a decimal point and multiple digits after it + float_num = 3.14159 + float_str = str(float_num) + self.assertEqual(float_num, cli.CLI.create_parser(['--float', float_str])) + + # Test parsing a negative float number + float_num = -3.14 + float_str = str(float_num) + self.assertEqual(float_num, cli.CLI.create_parser(['--float', float_str])) + + def test_invalid_create_parser(self): + + # Test parsing a float number with a letter in it + args = ['--float', '3.14a'] + with self.assertRaises(SystemExit): + cli.CLI.create_parser(args) + + # Test parsing a float number with multiple decimal points + args = ['--float', '3.14.159'] + with self.assertRaises(SystemExit): + cli.CLI.create_parser(args) + + def test_letsgo(self): + + # Test printing a float number + float_num = 3.14 + float_str = str(float_num) + with self.assertLogs('', level='INFO') as cm: + cli.CLI.letsgo(['--float', float_str]) + self.assertEqual(cm.output, [f'INFO:root:Your energy cutoff is {float_num}']) + + + + + + + + + + + + + diff --git a/primingsitepredictor/test/test_createprimer.py b/primingsitepredictor/test/test_createprimer.py new file mode 100644 index 0000000000000000000000000000000000000000..a54ad9c01245b741d89346851b1b3a7c76ff726d --- /dev/null +++ b/primingsitepredictor/test/test_createprimer.py @@ -0,0 +1,71 @@ +""" +Created on Tue Dec 20 14:06:20 2022 + +@author: RobinC +""" + +import os, sys +import pytest +currentdir = os.path.dirname(os.path.realpath(__file__)) +parentdir = os.path.dirname(currentdir) +sys.path.append(parentdir) +import createprimer as cp +import unittest + + +class TestCreatePrimer(unittest.TestCase): + + def test_init(self): + """Test function for the __init__() method""" + + # Test default values + primer = cp.CreatePrimer() + self.assertEqual(primer.name, 'primer1') + self.assertEqual(primer.primer_length, 15) + self.assertEqual(primer.primer_sequence, 'T'*15) + self.assertEqual(primer.lines, ['<primer1', 'TTTTTTTTTTTTTTT']) + + # Test custom values + primer = cp.CreatePrimer('my_primer', 20) + self.assertEqual(primer.name, 'my_primer') + self.assertEqual(primer.primer_length, 20) + self.assertEqual(primer.primer_sequence, 'T'*20) + self.assertEqual(primer.lines, ['<my_primer', 'TTTTTTTTTTTTTTTTTTTT']) + + + def test_create_fasta(self): + """Test function for the test_create_fasta() method""" + + # Test default values + primer = cp.CreatePrimer() + primer.create_fasta() + with open('primer1.fasta', 'r') as f: + lines = f.readlines() + self.assertEqual(lines, ['<primer1\n', 'TTTTTTTTTTTTTTT\n']) + + # Test custom values + primer = cp.CreatePrimer('my_primer', 20) + primer.create_fasta() + with open('my_primer.fasta', 'r') as f: + lines = f.readlines() + self.assertEqual(lines, ['<my_primer\n', 'TTTTTTTTTTTTTTTTTTTT\n']) + + + + + + + + + + + + + + + + + + + + diff --git a/primingsitepredictor/test/test_fasta.fasta b/primingsitepredictor/test/test_fasta.fasta new file mode 100644 index 0000000000000000000000000000000000000000..5b85943f52a87f58f84c34e9c994e97c2f5a4e9a --- /dev/null +++ b/primingsitepredictor/test/test_fasta.fasta @@ -0,0 +1,2 @@ +ATGC +CAGT diff --git a/primingsitepredictor/test/test_main.py b/primingsitepredictor/test/test_main.py new file mode 100644 index 0000000000000000000000000000000000000000..1ac3d3c6f6f77b3a7945be939347c7536357d633 --- /dev/null +++ b/primingsitepredictor/test/test_main.py @@ -0,0 +1,93 @@ +""" +Created on Tue Dec 20 14:06:20 2022 + +@author: RobinC +""" + +# Imports +import os, sys +currentdir = os.path.dirname(os.path.realpath(__file__)) +parentdir = os.path.dirname(currentdir) +sys.path.append(parentdir) +import unittest +import main as mn +import createprimer as cp +import postprocessing as pp +from io import StringIO + +class TestMain(unittest.TestCase): + + def test_import(self): + """Test function for module imports""" + try: + import CreatePrimer + except ImportError: + self.fail("Failed to import CreatePrimer") + + try: + import PostProcessRIBlast + except ImportError: + self.fail("Failed to import PostProcessRIBlast") + + def test_generate_RIBlast_input(self): + """Test funciton for the method generate_RIBlast_input()""" + + # Call the CreatePrimer() method and the create_fasta() method + primer = cp.CreatePrimer() + primer.create_fasta() + + # get the name and the transcript filename + primer_filename = primer.name+".fasta" + transcript_filename = "transcripts.fasta" + + # Call the generate_RIBlast_input() method + result = mn.generate_RIBlast_input() + + assert result == [primer_filename, transcript_filename] + + + def test_create_gtf(self): + """Test funciton for the method create_gtf()""" + + # Call the output of the PostprocessRIBlast() method + result = pp.PostProcessRIBlast().output + + # Open the expected output + with open('output_transcripts_df.txt', 'r') as f: + expected_output = f.read() + + # Use an assertion to check the output result + assert result == expected_output + + # Capture the output of the print statement + captured_output = StringIO() + sys.stdout = captured_output + + # Call the function that contains the print statement + mn.create_gtf() + + # Check the captured output against the expected value + assert captured_output.getvalue().strip() == expected_output + + + def test_main(self): + """Test function for the method main()""" + + # Call the CreatePrimer() method and the create_fasta() method + primer = cp.CreatePrimer() + primer.create_fasta() + + # get the name and the transcript filename + primer_filename = primer.name+".fasta" + transcripts_filename = "transcripts.fasta" + + # Get the results for the called methods + result1 = mn.generate_RIBlast_input() + result2 = mn.create_gtf() + + # Open the expected output + with open('output_transcripts_df.txt', 'r') as f: + expected_output = f.read() + + assert result1 == [primer_filename, transcripts_filename] + assert result2 == expected_output diff --git a/primingsitepredictor/test/test_postprocessing.py b/primingsitepredictor/test/test_postprocessing.py new file mode 100644 index 0000000000000000000000000000000000000000..2948ef269fe44e369cd619e63ab930608e03dc8e --- /dev/null +++ b/primingsitepredictor/test/test_postprocessing.py @@ -0,0 +1,157 @@ +""" +Created on Tue Dec 20 14:06:20 2022 + +@author: RobinC +""" + +# Imports +import os, sys +import pytest + +currentdir = os.path.dirname(os.path.realpath(__file__)) +parentdir = os.path.dirname(currentdir) +sys.path.append(parentdir) +import postprocessing as pp +import unittest +import math +from unittest import mock + + +class TestPostProcessRIBlast(unittest.TestCase): + def test_import(self): + """Test function for module imports""" + try: + import pandas + except ImportError: + self.fail("Failed to import pandas") + + try: + import math + except ImportError: + self.fail("Failed to import math") + + def setUp(self): + """Setup function to create an instance of PostProcessRIBlast()""" + + self.post_processor = pp.PostProcessRIBlast() + + def test_init(self): + """Test function for the __init__() method""" + + # Test if generate_gtf method is being called + with unittest.mock.patch.object( + pp.PostProcessRIBlast, "generate_gtf" + ) as mock_generate_gtf: + pp.PostProcessRIBlast() + mock_generate_gtf.assert_called_once() + + # Test if generate_gtf returns the expected output + expected_output = ( + 'Transcript_1\tRIBlast\tPriming_site\t2974[3257 chars]3"\n' + ) + self.assertEqual(self.post_processor.generate_gtf(), expected_output) + + def test_calculate_energy(self): + """Test function for the calculate_energy() method""" + + def calculate_energy(value): + energy_constant = 1.380649*10**(-23)*298 + kcalmol_joul = 6.9477*10**-21 + return (math.exp(-float(value)*kcalmol_joul/energy_constant)) + + # set a decimal place + decimalPlace = 20 + + # Test for a positive value + self.testinstance = pp.PostProcessRIBlast.calculate_energy(self, 5.0) + expected_output = calculate_energy(5.0) + self.assertAlmostEqual(self.testinstance, expected_output, decimalPlace) + + + # Test for a negative value + self.testinstance = pp.PostProcessRIBlast.calculate_energy(self, -5.0) + expected_output = calculate_energy(-5.0) + self.assertAlmostEqual(self.testinstance, expected_output, decimalPlace) + + # Test for zero + self.testinstance = pp.PostProcessRIBlast.calculate_energy(self, 0) + expected_output = calculate_energy(0) + self.assertAlmostEqual(self.testinstance, expected_output, decimalPlace) + + + def test_create_list_from_output(self): + """Test function for the create_list_from_output() method""" + + #create an instance test of the class PostProcessRIBlast() + test = pp.PostProcessRIBlast() + test.file = "RIBlast output example.txt" + + with open('RIBlast output example.txt', 'r') as file: + data_list = file.readlines() + + # Remove the header + data_list = data_list[3:] + + # Convert each row of the list into a list of values + expected_output = [] + for row in data_list: + # Split the row by the comma character + values = row.strip().split(',') + # Append the list of values to the final list + expected_output.append(values) + return expected_output + self.assertEqual(test.create_list_from_output(), expected_output) + + + def test_create_pandas_df(self): + """Test function for the create_pandas_df() method with mock data""" + + # create a test instance + test_instance = pp.PostProcessRIBlast() + + # create some mock data for the input list + test_instance.interaction_list= [ + ['Id','Query name', 'Query Length', 'Target name', 'Target Length', 'Accessibility Energy', 'Hybridization Energy', 'Interaction Energy', 'BasePair'], + [0,'Test_Primer',15,'Transcript_1',3233,1.49191,-9.76,-8.26809,'(0-14:2988-2974)'], + [1,'Test_Primer',15,'Transcript_1',3233,1.02308,-9.76,-8.73692,'(0-14:18-4)'], + [2,'Test_Primer',15,'Transcript_1',3233,0.947439,-9.73,-8.78256,'(0-14:17-3)'], + [3,'Test_Primer',15,'Transcript_1',3233,0.793049,-9.73,-8.93695,'(0-14:16-2)'], + [4,'Test_Primer',15,'Transcript_1',3233,0.483869,-9.73,-9.24613,'(0-14:15-1)'], + [5,'Test_Primer',15,'Transcript_1',3233,0.441093,-9.17,-8.72891,'(0-14:14-0)']] + + # create the DataFrame using the mock data + df = test_instance.create_pandas_df() + + #self.assertEqual(len(df),7) + + # check that the DataFrame has the expected column names + #self.assertEqual(list(df.columns), ['Id','Query name', 'Query Length', 'Target name', 'Target Length', 'Accessibility Energy', 'Hybridization Energy', 'Interaction Energy', 'BasePair']) + + # check that the values in the 'Id' column are correct + self.assertEqual(list(df['Id']), ['Id',0,1,2,3,4,5]) + + # check that the values in the 'Query name' column are correct + self.assertEqual(list(df['Query name']), ['Query name','Test_Primer','Test_Primer','Test_Primer','Test_Primer','Test_Primer','Test_Primer']) + + # check that the values in the 'Query Length' column are correct + self.assertEqual(list(df['Query Length']), ['Query Length',15, 15, 15, 15, 15, 15]) + + # check that the values in the 'Target name' column are correct + self.assertEqual(list(df['Target name']), ['Target name','Transcript_1','Transcript_1','Transcript_1','Transcript_1','Transcript_1','Transcript_1']) + + # check that the values in the 'Target Length' column are correct + self.assertEqual(list(df['Target Length']), ['Target Length', 3233, 3233, 3233, 3233, 3233, 3233]) + + # check that the values in the 'Accessibility Energy' column are correct + self.assertEqual(list(df['Accessibility Energy']), ['Accessibility Energy',1.49191, 1.02308, 0.947439, 0.793049, 0.483869, 0.441093]) + + # check that the values in the 'Hybridization Energy' column are correct + self.assertEqual(list(df['Hybridization Energy']), ['Hybridization Energy',-9.76, -9.76, -9.73, -9.73, -9.73, -9.17]) + + # check that the values in the 'Interaction Energy' column are correct + self.assertEqual(list(df['Interaction Energy']), ['Interaction Energy',-8.26809, -8.73692, -8.78256, -8.93695, -9.24613, -8.72891]) + + # check that the values in the 'BasePair' column are correct + self.assertEqual(list(df['BasePair']), ['BasePair','(0-14:2988-2974)', '(0-14:18-4)', '(0-14:17-3)', '(0-14:16-2)', '(0-14:15-1)', '(0-14:14-0)']) + + diff --git a/primingsitepredictor/test_fasta.fasta b/primingsitepredictor/test_fasta.fasta new file mode 100644 index 0000000000000000000000000000000000000000..5b85943f52a87f58f84c34e9c994e97c2f5a4e9a --- /dev/null +++ b/primingsitepredictor/test_fasta.fasta @@ -0,0 +1,2 @@ +ATGC +CAGT