Mercurial > repos > jjjjia > cpo_prediction
changeset 6:cabceaa239e4 draft
planemo upload
author | jjjjia |
---|---|
date | Thu, 23 Aug 2018 12:21:15 -0400 |
parents | 698579246d0d |
children | 4d2777aa99db |
files | cpo_clustalw.xml cpo_galaxy_prediction.py cpo_galaxy_predictions.xml cpo_galaxy_tree.py cpo_galaxy_tree.xml cpo_plasmidfinder.xml cpo_prediction.tar.gz |
diffstat | 7 files changed, 160 insertions(+), 204 deletions(-) [+] |
line wrap: on
line diff
--- a/cpo_clustalw.xml Tue Aug 21 17:53:08 2018 -0400 +++ b/cpo_clustalw.xml Thu Aug 23 12:21:15 2018 -0400 @@ -5,38 +5,17 @@ </requirements> <command detect_errors="exit_code"> <![CDATA[ - clustalw2 -tree -infile=$input -outputtree=nj + clustalw2 -tree -infile=$input && mv `ls $input | cut -d$'.' -f 1`.ph ./result.ph ]]> </command> <inputs> <param name="input" type="data" format="fasta" label="Input" help="FASTA file with contig(s)"/> </inputs> <outputs> - <data name="phylip" format="txt" from_work_dir="*.ph"/> - <data name="njtree" format="txt" from_work_dir="*.nj*"/> + <data name="phylip" format="txt" from_work_dir="result.ph"/> </outputs> <help> - -**Syntax** - -This tool reconstructs individual plasmid sequences from draft genome assemblies using the plasmid reference databases. - -For more information please visit https://github.com/phac-nml/mob-suite/. - ------ - -**Input:** - -A FASTA file with a single or multiple contigs (e.g. a draft genome assembly): - - -**Output:** - -Tab-delimited report listing information for each input contig on its cluster number, possible replicon, relaxase, and repetitive elements types, etc. Refer to https://github.com/phac-nml/mob-suite#mob-recon-contig-report-format for the description of each column. - -Note: Plasmid sequences will not be output if none are found. Some plasmid could be intergrated into a chromosome. - - + clustalw2 -tree -infile=$input -outputtree=nj </help> <citations> <citation type="bibtex"> @@ -49,4 +28,4 @@ url = {https://github.com/phac-nml/mob-suite} }</citation> </citations> -</tool> +</tool> \ No newline at end of file
--- a/cpo_galaxy_prediction.py Tue Aug 21 17:53:08 2018 -0400 +++ b/cpo_galaxy_prediction.py Thu Aug 23 12:21:15 2018 -0400 @@ -26,7 +26,7 @@ import numpy -debug = True #debug skips the shell scripts and also dump out a ton of debugging messages +debug = False #debug skips the shell scripts and also dump out a ton of debugging messages if not debug: #parses some parameters @@ -596,10 +596,13 @@ #TSV output + lindaOut = [] tsvOut = [] - tsvOut.append("ID\tExpected Species\tMLST Species\tSequence Type\tMLST Scheme\tCarbapenem Resistance Genes\tOther AMR Genes\tTotal Plasmids\tPlasmids ID\tNum_Contigs\tPlasmid Length\tPlasmid RepType\tPlasmid Mobility\tNearest Reference\tDefinitely Plasmid Contigs\tLikely Plasmid Contigs") + lindaOut.append("new\tID\tQUALITY\tExpected Species\tMLST Scheme\tSequence Type\tMLST_ALLELE_1\tMLST_ALLELE_2\tMLST_ALLELE_3\tMLST_ALLELE_4\tMLST_ALLELE_5\tMLST_ALLELE_6\tMLST_ALLELE_7\tSEROTYPE\tK_CAPSULE\tPLASMID_1_FAMILY\tPLASMID_1_BEST_MATCH\tPLASMID_1_COVERAGE\tPLASMID_1_SNVS_TO_BEST_MATCH\tPLASMID_1_CARBAPENEMASE\tPLASMID_1_INC_GROUP\tPLASMID_2_RFLP\tPLASMID_2_FAMILY\tPLASMID_2_BEST_MATCH\tPLASMID_2_COVERAGE\tPLASMID_2_SNVS_TO_BEST_MATCH\tPLASMID_2_CARBAPENEMASE\tPLASMID_2_INC_GROUP") + + tsvOut.append("new\tID\tExpected Species\tMLST Species\tSequence Type\tMLST Scheme\tCarbapenem Resistance Genes\tOther AMR Genes\tTotal Plasmids\tPlasmids ID\tNum_Contigs\tPlasmid Length\tPlasmid RepType\tPlasmid Mobility\tNearest Reference\tDefinitely Plasmid Contigs\tLikely Plasmid Contigs") #start with ID - temp = "" + temp = "\t" temp += (ID + "\t") temp += expectedSpecies + "\t"
--- a/cpo_galaxy_predictions.xml Tue Aug 21 17:53:08 2018 -0400 +++ b/cpo_galaxy_predictions.xml Thu Aug 23 12:21:15 2018 -0400 @@ -19,14 +19,14 @@ ]]> </command> <inputs> - <param type="txt" name="ID"/> + <param type="text" name="ID"/> <param type="data" name="mlst" format="tabular" /> <param type="data" name="mobsuitecontig" format="tabular" /> <param type="data" name="mobsuiteaggregate" format="tabular" /> <param type="data" name="abricate" format="tabular" /> <param type="data" name="rgi" format="tabular" /> <param type="data" name="plasmidfinder" format="tabular" /> - <param type="txt" name="expected"/> + <param type="text" name="expected"/> </inputs> <outputs> <data name="tsvSummary" format="tabular" from_work_dir="summary.tsv"/> @@ -43,7 +43,7 @@ <param name="plasmidfinder" value="BC11-Kpn005_S2.origins"/> <param name="expected" value="Klebsiella pneumoniae"/> <output name="tsvSummary" file="summary.tsv"/> - <output name="txtSummary" file="summary.txt"/> + <output name="tsvSummary" file="summary.txt"/> </test> </tests> <help>
--- a/cpo_galaxy_tree.py Tue Aug 21 17:53:08 2018 -0400 +++ b/cpo_galaxy_tree.py Thu Aug 23 12:21:15 2018 -0400 @@ -24,8 +24,9 @@ import gzip import collections import json -import ete3 import numpy +import ete3 as e + #parses some parameters parser = optparse.OptionParser("Usage: %prog [options] arg1 arg2 ...") @@ -105,38 +106,45 @@ with open(outputpath, 'wb') as out: out.write(gzContent) return True +def addFace(name): + #if its the reference branch, populate the faces with column headers + face = e.faces.TextFace(name,fsize=10,tight_text=True) + face.border.margin = 5 + face.margin_right = 5 + face.margin_left = 5 + return face #endregion #region functions to parse result files def ParseWorkflowResults(pathToResult): _worflowResult = {} - r = pandas.read_csv(pathToResult, delimiter='\t', header=None) #read the kraken2report.tsv + r = pandas.read_csv(pathToResult, delimiter='\t', header=0) r = r.replace(numpy.nan, '', regex=True) for i in range(len(r.index)): _results = workflowResult() - if(str(r.iloc[i,0]).lower() == "new"): + if(str(r.loc[r.index[i], 'new']).lower() == "new"): _results.new = True else: _results.new = False - _results.ID = str(r.iloc[i,1]) - _results.ExpectedSpecies = str(r.iloc[i,2]) - _results.MLSTSpecies = str(r.iloc[i,3]) - _results.SequenceType = str(r.iloc[i,4]) - _results.MLSTScheme = (str(r.iloc[i,5])) - _results.CarbapenemResistanceGenes = (str(r.iloc[i,6])) - _results.OtherAMRGenes = (str(r.iloc[i,7])) - _results.TotalPlasmids = int(r.iloc[i,8]) + _results.ID = str(r.loc[r.index[i], 'ID']) + _results.ExpectedSpecies = str(r.loc[r.index[i], 'Expected Species']) + _results.MLSTSpecies = str(r.loc[r.index[i], 'MLST Species']) + _results.SequenceType = str(r.loc[r.index[i], 'Sequence Type']) + _results.MLSTScheme = (str(r.loc[r.index[i], 'MLST Scheme'])) + _results.CarbapenemResistanceGenes = (str(r.loc[r.index[i], 'Carbapenem Resistance Genes'])) + _results.OtherAMRGenes = (str(r.loc[r.index[i], 'Other AMR Genes'])) + _results.TotalPlasmids = int(r.loc[r.index[i], 'Total Plasmids']) for j in range(0,_results.TotalPlasmids): _plasmid = plasmidObj() - _plasmid.PlasmidsID =(((str(r.iloc[i,9])).split(";"))[j]) - _plasmid.Num_Contigs = (((str(r.iloc[i,10])).split(";"))[j]) - _plasmid.PlasmidLength = (((str(r.iloc[i,11])).split(";"))[j]) - _plasmid.PlasmidRepType = (((str(r.iloc[i,12])).split(";"))[j]) - _plasmid.PlasmidMobility = ((str(r.iloc[i,13])).split(";"))[j] - _plasmid.NearestReference = ((str(r.iloc[i,14])).split(";"))[j] + _plasmid.PlasmidsID =(((str(r.loc[r.index[i], 'Plasmids ID'])).split(";"))[j]) + _plasmid.Num_Contigs = (((str(r.loc[r.index[i], 'Num_Contigs'])).split(";"))[j]) + _plasmid.PlasmidLength = (((str(r.loc[r.index[i], 'Plasmid Length'])).split(";"))[j]) + _plasmid.PlasmidRepType = (((str(r.loc[r.index[i], 'Plasmid RepType'])).split(";"))[j]) + _plasmid.PlasmidMobility = ((str(r.loc[r.index[i], 'Plasmid Mobility'])).split(";"))[j] + _plasmid.NearestReference = ((str(r.loc[r.index[i], 'Nearest Reference'])).split(";"))[j] _results.plasmids.append(_plasmid) - _results.DefinitelyPlasmidContigs = (str(r.iloc[i,15])) - _results.LikelyPlasmidContigs = (str(r.iloc[i,16])) + _results.DefinitelyPlasmidContigs = (str(r.loc[r.index[i], 'Definitely Plasmid Contigs'])) + _results.LikelyPlasmidContigs = (str(r.loc[r.index[i], 'Likely Plasmid Contigs'])) _results.row = "\t".join(str(x) for x in r.ix[i].tolist()) _worflowResult[_results.ID] = _results return _worflowResult @@ -148,20 +156,90 @@ distance = read(distancePath) treeFile = "".join(read(treePath)) - distanceDict = {} + distanceDict = {} #store the distance matrix as rowname:list<string> for i in range(len(distance)): temp = distance[i].split("\t") distanceDict[temp[0]] = temp[1:] #region step5: tree construction - t = ete3.Tree(treeFile) + + ''' + #region create detailed tree + + plasmidCount = 0 + for n in t.traverse(): + if (n.is_leaf() and not n.name == "Reference"): + mData = metadata[n.name.replace(".fa","")] + face = faces.TextFace(mData.MLSTSpecies,fsize=10,tight_text=True) + face.border.margin = 5 + face.margin_left = 10 + face.margin_right = 10 + n.add_face(face, 0, "aligned") + face = faces.TextFace(mData.SequenceType,fsize=10,tight_text=True) + face.border.margin = 5 + face.margin_right = 10 + n.add_face(face, 1, "aligned") + face = faces.TextFace(mData.CarbapenemResistanceGenes,fsize=10,tight_text=True) + face.border.margin = 5 + face.margin_right = 10 + n.add_face(face, 2, "aligned") + index = 3 + if (mData.TotalPlasmids > plasmidCount): + plasmidCount = mData.TotalPlasmids + for i in range(0, mData.TotalPlasmids): + face = faces.TextFace(mData.plasmids[i].PlasmidRepType,fsize=10,tight_text=True) + face.border.margin = 5 + face.margin_right = 10 + n.add_face(face, index, "aligned") + index+=1 + face = faces.TextFace(mData.plasmids[i].PlasmidMobility,fsize=10,tight_text=True) + face.border.margin = 5 + face.margin_right = 10 + n.add_face(face, index, "aligned") + index+=1 + + face = faces.TextFace("Species",fsize=10,tight_text=True) + face.border.margin = 5 + face.margin_right = 10 + face.margin_left = 10 + (t&"Reference").add_face(face, 0, "aligned") + face = faces.TextFace("Sequence Type",fsize=10,tight_text=True) + face.border.margin = 5 + face.margin_right = 10 + (t&"Reference").add_face(face, 1, "aligned") + face = faces.TextFace("Carbapenamases",fsize=10,tight_text=True) + face.border.margin = 5 + face.margin_right = 10 + (t&"Reference").add_face(face, 2, "aligned") + index = 3 + for i in range(0, plasmidCount): + face = faces.TextFace("plasmid " + str(i) + " replicons",fsize=10,tight_text=True) + face.border.margin = 5 + face.margin_right = 10 + (t&"Reference").add_face(face, index, "aligned") + index+=1 + face = faces.TextFace("plasmid " + str(i) + " mobility",fsize=10,tight_text=True) + face.border.margin = 5 + face.margin_right = 10 + (t&"Reference").add_face(face, index, "aligned") + index+=1 + + t.render("./pipelineTest/tree.png", w=5000,units="mm", tree_style=ts) + + #endregion + ''' + #region create box tree + #region step5: tree construction + treeFile = "".join(read(treePath)) + t = e.Tree(treeFile) t.set_outgroup(t&"Reference") - ts = ete3.TreeStyle() - ts.show_leaf_name = True + #set the tree style + ts = e.TreeStyle() + ts.show_leaf_name = False ts.show_branch_length = True ts.scale = 2000 #pixel per branch length unit ts.branch_vertical_margin = 15 #pixel between branches - style2 = ete3.NodeStyle() + style2 = e.NodeStyle() style2["fgcolor"] = "#000000" style2["shape"] = "circle" style2["vt_line_color"] = "#0000aa" @@ -172,93 +250,8 @@ style2["hz_line_type"] = 0 for n in t.traverse(): n.set_style(style2) - ''' - #region create detailed tree - - plasmidCount = 0 - for n in t.traverse(): - if (n.is_leaf() and not n.name == "Reference"): - mData = metadata[n.name.replace(".fa","")] - face = ete3.faces.TextFace(mData.MLSTSpecies,fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_left = 10 - face.margin_right = 10 - n.add_face(face, 0, "aligned") - face = ete3.faces.TextFace(mData.SequenceType,fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 10 - n.add_face(face, 1, "aligned") - face = ete3.faces.TextFace(mData.CarbapenemResistanceGenes,fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 10 - n.add_face(face, 2, "aligned") - index = 3 - if (mData.TotalPlasmids > plasmidCount): - plasmidCount = mData.TotalPlasmids - for i in range(0, mData.TotalPlasmids): - face = ete3.faces.TextFace(mData.plasmids[i].PlasmidRepType,fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 10 - n.add_face(face, index, "aligned") - index+=1 - face = ete3.faces.TextFace(mData.plasmids[i].PlasmidMobility,fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 10 - n.add_face(face, index, "aligned") - index+=1 - face = ete3.faces.TextFace("Species",fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 10 - face.margin_left = 10 - (t&"Reference").add_face(face, 0, "aligned") - face = ete3.faces.TextFace("Sequence Type",fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 10 - (t&"Reference").add_face(face, 1, "aligned") - face = ete3.faces.TextFace("Carbapenamases",fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 10 - (t&"Reference").add_face(face, 2, "aligned") - index = 3 - for i in range(0, plasmidCount): - face = ete3.faces.TextFace("plasmid " + str(i) + " replicons",fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 10 - (t&"Reference").add_face(face, index, "aligned") - index+=1 - face = ete3.faces.TextFace("plasmid " + str(i) + " mobility",fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 10 - (t&"Reference").add_face(face, index, "aligned") - index+=1 - - t.render("./pipelineTest/tree.png", w=5000,units="mm", tree_style=ts) - - #endregion - ''' - #region create box tree - #region step5: tree construction - treeFile = "".join(read("./pipelineTest/tree.txt")) - t = ete3.Tree(treeFile) - t.set_outgroup(t&"Reference") - - ts = ete3.TreeStyle() - ts.show_leaf_name = True - ts.show_branch_length = True - ts.scale = 2000 #pixel per branch length unit - ts.branch_vertical_margin = 15 #pixel between branches - style2 = ete3.NodeStyle() - style2["fgcolor"] = "#000000" - style2["shape"] = "circle" - style2["vt_line_color"] = "#0000aa" - style2["hz_line_color"] = "#0000aa" - style2["vt_line_width"] = 2 - style2["hz_line_width"] = 2 - style2["vt_line_type"] = 0 # 0 solid, 1 dashed, 2 dotted - style2["hz_line_type"] = 0 - for n in t.traverse(): - n.set_style(style2) + #find the plasmid origins plasmidIncs = {} for key in metadata: for plasmid in metadata[key].plasmids: @@ -270,81 +263,61 @@ if metadata[key].ID not in plasmidIncs[inc]: plasmidIncs[inc].append(metadata[key].ID) #plasmidIncs = sorted(plasmidIncs) - for n in t.traverse(): + for n in t.traverse(): #loop through the nodes of a tree if (n.is_leaf() and n.name == "Reference"): - face = ete3.faces.TextFace("New?",fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 5 - face.margin_left = 5 - (t&"Reference").add_face(face, 0, "aligned") + #if its the reference branch, populate the faces with column headers + index = 0 + (t&"Reference").add_face(addFace("SampleID"), index, "aligned") + index = index + 1 + (t&"Reference").add_face(addFace("New?"), index, "aligned") + index = index + 1 for i in range(len(plasmidIncs)): #this loop adds the columns (aka the incs) to the reference node - face = ete3.faces.TextFace(list(plasmidIncs.keys())[i],fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 5 - face.margin_left = 5 - (t&"Reference").add_face(face, i + 1, "aligned") - face = ete3.faces.TextFace("MLSTScheme",fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 5 - face.margin_left = 5 - (t&"Reference").add_face(face, len(plasmidIncs) + 0 + 1, "aligned") - face = ete3.faces.TextFace("Sequence Type",fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 5 - face.margin_left = 5 - (t&"Reference").add_face(face, len(plasmidIncs) + 1 + 1, "aligned") - face = ete3.faces.TextFace("Carbapenamases",fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 5 - face.margin_left = 5 - (t&"Reference").add_face(face, len(plasmidIncs) + 2 + 1, "aligned") - for i in range(len(distanceDict[list(distanceDict.keys())[0]])): #this loop adds the columns (aka the incs) to the reference node - face = ete3.faces.TextFace(distanceDict[list(distanceDict.keys())[0]][i],fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 5 - face.margin_left = 5 - (t&"Reference").add_face(face, len(plasmidIncs) + 2 + i + 1 + 1, "aligned") - elif (n.is_leaf() and not n.name == "Reference"): - if (metadata[n.name.replace(".fa","")].new == True): - face = ete3.faces.RectFace(30,30,"green","green") # TextFace("Y",fsize=10,tight_text=True) + (t&"Reference").add_face(addFace(list(plasmidIncs.keys())[i]), i + index, "aligned") + index = index + len(plasmidIncs) + (t&"Reference").add_face(addFace("MLSTScheme"), index, "aligned") + index = index + 1 + (t&"Reference").add_face(addFace("Sequence Type"), index, "aligned") + index = index + 1 + (t&"Reference").add_face(addFace("Carbapenamases"), index, "aligned") + index = index + 1 + for i in range(len(distanceDict[list(distanceDict.keys())[0]])): #this loop adds the distance matrix + (t&"Reference").add_face(addFace(distanceDict[list(distanceDict.keys())[0]][i]), index + i, "aligned") + index = index + len(distanceDict[list(distanceDict.keys())[0]]) + elif (n.is_leaf() and not n.name == "Reference"): + #not reference branches, populate with metadata + index = 0 + mData = metadata[n.name.replace(".fa","")] + n.add_face(addFace(mData.ID), index, "aligned") + index = index + 1 + if (metadata[n.name.replace(".fa","")].new == True): #new column + face = e.RectFace(30,30,"green","green") # TextFace("Y",fsize=10,tight_text=True) face.border.margin = 5 face.margin_right = 5 face.margin_left = 5 face.vt_align = 1 face.ht_align = 1 - n.add_face(face, 0, "aligned") + n.add_face(face, index, "aligned") + index = index + 1 for incs in plasmidIncs: #this loop adds presence/absence to the sample nodes if (n.name.replace(".fa","") in plasmidIncs[incs]): - face = ete3.faces.RectFace(30,30,"black","black") # TextFace("Y",fsize=10,tight_text=True) + face = e.RectFace(30,30,"black","black") # TextFace("Y",fsize=10,tight_text=True) face.border.margin = 5 face.margin_right = 5 face.margin_left = 5 face.vt_align = 1 face.ht_align = 1 - n.add_face(face, list(plasmidIncs.keys()).index(incs) + 1, "aligned") - mData = metadata[n.name.replace(".fa","")] - face = ete3.faces.TextFace(mData.MLSTSpecies,fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 5 - face.margin_left = 5 - n.add_face(face, len(plasmidIncs) + 0 + 1, "aligned") - face = ete3.faces.TextFace(mData.SequenceType,fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 5 - face.margin_left = 5 - n.add_face(face, len(plasmidIncs) + 1 + 1, "aligned") - face = ete3.faces.TextFace(mData.CarbapenemResistanceGenes,fsize=10,tight_text=True) - face.margin_right = 5 - face.margin_left = 5 - n.add_face(face, len(plasmidIncs) + 2 + 1, "aligned") + n.add_face(face, list(plasmidIncs.keys()).index(incs) + index, "aligned") + index = index + len(plasmidIncs) + n.add_face(addFace(mData.MLSTSpecies), index, "aligned") + index = index + 1 + n.add_face(addFace(mData.SequenceType), index, "aligned") + index = index + 1 + n.add_face(addFace(mData.CarbapenemResistanceGenes), index, "aligned") + index = index + 1 for i in range(len(distanceDict[list(distanceDict.keys())[0]])): #this loop adds distance matrix - face = ete3.faces.TextFace(list(distanceDict[n.name])[i],fsize=10,tight_text=True) - face.border.margin = 5 - face.margin_right = 5 - face.margin_left = 5 - n.add_face(face, len(plasmidIncs) + 2 + i + 1 + 1, "aligned") - - t.render("./tree.png", w=5000,units="mm", tree_style=ts) + n.add_face(addFace(list(distanceDict[n.name])[i]), index + i, "aligned") + + t.render("./tree.png", w=5000,units="mm", tree_style=ts) #save it as a png. or an phyloxml #endregion #endregion
--- a/cpo_galaxy_tree.xml Tue Aug 21 17:53:08 2018 -0400 +++ b/cpo_galaxy_tree.xml Thu Aug 23 12:21:15 2018 -0400 @@ -4,6 +4,7 @@ <requirement type="package" version="0.23.4">pandas</requirement> <requirement type="package" version="3.6">python</requirement> <requirement type="package" version="3.1.1">ete3</requirement> + <requirement type="package" version="5.9.2">pyqt</requirement> </requirements> <command detect_errors="exit_code"> <![CDATA[ @@ -49,4 +50,4 @@ url = {https://bfjia.net, }</citation> </citations> -</tool> \ No newline at end of file +</tool>
--- a/cpo_plasmidfinder.xml Tue Aug 21 17:53:08 2018 -0400 +++ b/cpo_plasmidfinder.xml Thu Aug 23 12:21:15 2018 -0400 @@ -1,5 +1,5 @@ -<tool id="plasmidfindercpo" name="plasmidfindercpo" version="0.8"> - <description>this tool parses stuff</description> +<tool id="cpo_plasmidfinder" name="cpo_plasmidfinder" version="0.8"> + <description>Modified plasmidfinder v0.8 with custom database</description> <requirements> <requirement type="package" version="0.8">abricate</requirement> </requirements>