Repository 'hd'
hg clone https://toolshed.g2.bx.psu.edu/repos/mheinzl/hd

Changeset 22:7e570ba56b83 (2019-02-27)
Previous changeset 21:9919024d7778 (2018-12-14) Next changeset 23:ffd105ac12fb (2019-02-27)
Commit message:
planemo upload for repository https://github.com/monikaheinzl/duplexanalysis_galaxy/tree/master/tools/hd commit b8a2f7b7615b2bcd3b602027af31f4e677da94f6-dirty
modified:
hd.py
hd.xml
test-data/output_file.pdf
test-data/output_file.tabular
added:
test-data/output_file_chimeras.tabular
b
diff -r 9919024d7778 -r 7e570ba56b83 hd.py
--- a/hd.py Fri Dec 14 05:03:24 2018 -0500
+++ b/hd.py Wed Feb 27 04:50:56 2019 -0500
[
b'@@ -13,14 +13,14 @@\n # It is also possible to perform the HD analysis with shortened tags with given sizes as input.\n # The tool can run on a certain number of processors, which can be defined by the user.\n \n-# USAGE: python hd.py --inputFile filename --inputName1 filename --sample_size int/0 --sep "characterWhichSeparatesCSVFile" /\n-#        --only_DCS True --FamilySize3 True --subset_tag True --nproc int --minFS int --maxFS int --nr_above_bars True/False --output_tabular outptufile_name_tabular\n+# USAGE: python hd.py --inputFile filename --inputName1 filename --sample_size int /\n+#        --only_DCS True --FamilySize3 True --subset_tag True --nproc int --minFS int --maxFS int --nr_above_bars True/False --output_pdf outputfile_name_pdf --output_tabular outputfile_name_tabular --output_chimeras_tabular outputfile_name_chimeras_tabular\n \n import argparse\n import itertools\n import operator\n import sys\n-from collections import Counter\n+from collections import Counter, defaultdict\n from functools import partial\n from multiprocessing.pool import Pool\n \n@@ -94,7 +94,7 @@\n     plt.close("all")\n \n \n-def plotHDwithFSD(list1, maximumX, minimumX, subtitle, lenTags, title_file1, pdf, xlabel, relative=False, nr_above_bars=True):\n+def plotHDwithFSD(list1, maximumX, minimumX, subtitle, lenTags, title_file1, pdf, xlabel, relative=False, nr_above_bars=True, nr_unique_chimeras=0, len_sample=0):\n     if relative is True:\n         step = 0.1\n     else:\n@@ -144,6 +144,13 @@\n \n     legend = "sample size= {:,} against {:,}".format(sum(counts), lenTags)\n     plt.text(0.14, -0.01, legend, size=12, transform=plt.gcf().transFigure)\n+    if nr_unique_chimeras != 0 and len_sample != 0:\n+        if relative == True:\n+            legend = "nr. of unique chimeric tags= {:,} ({:.5f}) (rel.diff=1)".format(nr_unique_chimeras,\n+                                                                         int(nr_unique_chimeras) / float(len_sample))\n+        else:\n+            legend = "nr. of unique chimeric tags= {:,} ({:.5f})".format(nr_unique_chimeras, int(nr_unique_chimeras) / float(len_sample))\n+        plt.text(0.14, -0.05, legend, size=12, transform=plt.gcf().transFigure)\n \n     pdf.savefig(fig, bbox_inches="tight")\n     plt.close("all")\n@@ -158,7 +165,7 @@\n \n     maximumX = numpy.amax(numpy.concatenate(ham_partial))\n     minimumX = numpy.amin(numpy.concatenate(ham_partial))\n-    maximumY = numpy.amax(numpy.array(numpy.concatenate(map(lambda (x): numpy.bincount(x), ham_partial))))\n+    maximumY = numpy.amax(numpy.array(numpy.concatenate(map(lambda x: numpy.bincount(x), ham_partial))))\n \n     if len(range(minimumX, maximumX)) == 0:\n         range1 = minimumX\n@@ -448,6 +455,7 @@\n \n def hamming_difference(array1, array2, mate_b):\n     array2 = numpy.unique(array2)  # remove duplicate sequences to decrease running time\n+\n     array1_half = numpy.array([i[0:(len(i)) / 2] for i in array1])  # mate1 part1\n     array1_half2 = numpy.array([i[len(i) / 2:len(i)] for i in array1])  # mate1 part 2\n \n@@ -473,6 +481,7 @@\n     min_tagsList = []\n     diff11_zeros = []\n     min_tagsList_zeros = []\n+    max_tag_list = []\n     i = 0  # counter, only used to see how many HDs of tags were already calculated\n     if mate_b is False:  # HD calculation for all a\'s\n         half1_mate1 = array1_half\n@@ -487,24 +496,29 @@\n \n     for a, b, tag in zip(half1_mate1, half2_mate1, array1):\n         # exclude identical tag from array2, to prevent comparison to itself\n-        sameTag = numpy.where(array2 == tag)\n+        sameTag = numpy.where(array2 == tag)[0]\n         indexArray2 = numpy.arange(0, len(array2), 1)\n         index_withoutSame = numpy.delete(indexArray2, sameTag)  # delete identical tag from the data\n \n         # all tags without identical tag\n         array2_half_withoutSame = half1_mate2[index_withoutSame]\n         array2_half2_withoutSame = half2_mate2[index_withoutSame]\n-        # array2_withoutSame = array2[index_withoutSame]  # whole tag (=not splitted into 2 halfs)\n+     '..b'size", title_file1=name1, lenTags=lenTags,\n@@ -914,15 +989,14 @@\n         plotHDwithFSD(listRelDifference1, maximumXRelDifference, minimumXRelDifference, pdf=pdf,\n                       subtitle="Chimera Analysis: relative delta Hamming distances",\n                       title_file1=name1, lenTags=lenTags,\n-                      xlabel="relative delta HD", relative=True, nr_above_bars=nr_above_bars)\n+                      xlabel="relative delta HD", relative=True, nr_above_bars=nr_above_bars, nr_unique_chimeras=nr_chimeric_tags, len_sample=len_sample)\n \n         # plots for chimeric reads\n         if len(minHD_tags_zeros) != 0:\n             # HD\n-            plotHDwithFSD(listDifference1_zeros, maximumXDifference_zeros, minimumXDifference_zeros, pdf=pdf,\n-                          subtitle="Hamming distance of the non-identical half of chimeras",\n+            plotHDwithFSD(listDifference1_zeros, maximumXDifference_zeros, minimumXDifference_zeros, pdf=pdf,subtitle="Hamming distance of the non-identical half of chimeras",\n                           title_file1=name1, lenTags=lenTags, xlabel="HD", relative=False,\n-                          nr_above_bars=nr_above_bars)\n+                          nr_above_bars=nr_above_bars, nr_unique_chimeras=nr_chimeric_tags, len_sample=len_sample)\n \n         # print all data to a CSV file\n         # HD\n@@ -974,26 +1048,31 @@\n         # HD within tags\n         output_file.write(\n             "The hamming distances were calculated by comparing each half of all tags against the tag(s) with the minimum Hamming distance per half.\\n"\n-            "It is possible that one tag can have the minimum HD from multiple tags, so the sample size in this calculation differs from the sample size entered by the user.\\n")\n-        output_file.write(\n-            "actual number of tags with min HD = {:,} (sample size by user = {:,})\\n".format(\n-                len(numpy.concatenate(listDifference1)), len(numpy.concatenate(list1))))\n+            "Since this calculation was repeated, but starting with the second half to find all possible chimeras in the data, the actual number of tags in the plots differs from the sample size entered by the user.\\n"\n+            "In addition, both family sizes of one tag will be included in the plots if only tags of reads that can form a DCS were allowed.\\n")\n+\n         output_file.write("length of one part of the tag = {}\\n\\n".format(len(data_array[0, 1]) / 2))\n \n         createFileHDwithinTag(summary9, sumCol9, overallSum9, output_file,\n                               "Hamming distance of each half in the tag", sep)\n         createFileHD(summary11, sumCol11, overallSum11, output_file,\n                      "Absolute delta Hamming distances within the tag", sep)\n+\n         createFileHD(summary13, sumCol13, overallSum13, output_file,\n                      "Chimera analysis: relative delta Hamming distances", sep)\n \n         if len(minHD_tags_zeros) != 0:\n             output_file.write(\n-                "Chimeras:\\nAll tags were filtered: only those tags where at least one half is identical with the half of the min. tag are kept.\\nSo the hamming distance of the non-identical half is compared.\\n")\n+                "Chimeras:\\nAll tags were filtered: only those tags where at least one half is identical with the half of the min. tag are kept.\\nSo the Hamming distance of the non-identical half is shown.\\n")\n+            output_file.write(\n+                "Be aware that the real number of chimeric tags (where rel. diff = 1) is not shown in the plot because of the above reasons.\\n")\n+            output_file.write("real number of chimeric tags{}{}{}{}\\n".format(sep, nr_chimeric_tags, sep, int(nr_chimeric_tags) / float(len_sample)))\n             createFileHD(summary15, sumCol15, overallSum15, output_file,\n                          "Hamming distances of non-zero half", sep)\n+\n         output_file.write("\\n")\n \n \n if __name__ == \'__main__\':\n     sys.exit(Hamming_Distance_Analysis(sys.argv))\n+\n'
b
diff -r 9919024d7778 -r 7e570ba56b83 hd.xml
--- a/hd.xml Fri Dec 14 05:03:24 2018 -0500
+++ b/hd.xml Wed Feb 27 04:50:56 2019 -0500
[
@@ -7,7 +7,7 @@
     </requirements>
     <command>
         python2 '$__tool_directory__/hd.py' --inputFile '$inputFile' --inputName1 '$inputFile.name' --sample_size $sampleSize --subset_tag $subsetTag --nproc $nproc $onlyDCS --minFS $minFS --maxFS $maxFS
- $nr_above_bars --output_pdf $output_pdf --output_tabular $output_tabular
+ $nr_above_bars --output_pdf $output_pdf --output_tabular $output_tabular --output_chimeras_tabular $output_chimeras_tabular
     </command>
     <inputs>
         <param name="inputFile" type="data" format="tabular" label="Dataset 1: input tags" optional="false" help="Input in tabular format with the family size, tag and the direction of the strand ('ab' or 'ba') for each family."/>
@@ -21,8 +21,10 @@
  
     </inputs>
     <outputs>
+        <data name="output_pdf" format="pdf" />
         <data name="output_tabular" format="tabular"/>
-        <data name="output_pdf" format="pdf" />
+        <data name="output_chimeras_tabular" format="tabular"/>
+
     </outputs>
     <tests>
         <test>
@@ -30,6 +32,7 @@
             <param name="sampleSize" value="0"/>
             <output name="output_pdf" file="output_file.pdf" lines_diff="6"/>
             <output name="output_tabular" file="output_file.tabular"/>
+            <output name="output_chimeras_tabular" file="output_file_chimeras.tabular"/>
         </test>
     </tests>
     <help> <![CDATA[
@@ -80,7 +83,7 @@
     
 **Output**
     
-The output is one PDF file with the plots of the Hamming distance and a tabular file with the data of the plot for each dataset.
+The output is one PDF file with the plots of the Hamming distance, a tabular file with the data of the plot for each dataset and a tabular file with tags that are chimeric.
     
     
 **About Author**
b
diff -r 9919024d7778 -r 7e570ba56b83 test-data/output_file.pdf
b
Binary file test-data/output_file.pdf has changed
b
diff -r 9919024d7778 -r 7e570ba56b83 test-data/output_file.tabular
--- a/test-data/output_file.tabular Fri Dec 14 05:03:24 2018 -0500
+++ b/test-data/output_file.tabular Wed Feb 27 04:50:56 2019 -0500
b
@@ -20,66 +20,67 @@
 sum 9 0 0 0 11 0 20
 
 
-max. family size: 7
+max. family size in sample: 7
 absolute frequency: 1
 relative frequency: 0.05
 
 The hamming distances were calculated by comparing each half of all tags against the tag(s) with the minimum Hamming distance per half.
-It is possible that one tag can have the minimum HD from multiple tags, so the sample size in this calculation differs from the sample size entered by the user.
-actual number of tags with min HD = 171 (sample size by user = 20)
+Since this calculation was repeated, but starting with the second half to find all possible chimeras in the data, the actual number of tags in the plots differs from the sample size entered by the user.
+In addition, both family sizes of one tag will be included in the plots if only tags of reads that can form a DCS were allowed.
 length of one part of the tag = 12
 
 Hamming distance of each half in the tag
  HD a HD b' HD b HD a' HD a+b sum
-HD=0 146 0 8 4 0 158
-HD=1 0 2 2 21 11 36
+HD=0 20 0 8 1 0 29
+HD=1 0 0 1 19 8 28
 HD=2 0 0 0 0 1 1
-HD=5 0 0 4 0 0 4
-HD=6 0 2 2 0 6 10
-HD=7 0 16 9 0 21 46
-HD=8 0 20 0 0 26 46
-HD=9 0 50 0 0 50 100
-HD=10 0 30 0 0 30 60
-HD=11 0 18 0 0 18 36
-HD=12 0 8 0 0 8 16
-sum 146 146 25 25 171 513
+HD=5 0 0 3 0 0 3
+HD=6 0 0 2 0 3 5
+HD=7 0 1 6 0 4 11
+HD=8 0 2 0 0 7 9
+HD=9 0 1 0 0 1 2
+HD=10 0 2 0 0 2 4
+HD=11 0 7 0 0 7 14
+HD=12 0 7 0 0 7 14
+sum 20 20 20 20 40 120
 
 Absolute delta Hamming distances within the tag
  FS=1 FS=2 FS=3 FS=4 FS=5-10 FS>10 sum
 diff=0 1 0 0 0 0 0 1
-diff=1 6 1 2 1 1 0 11
-diff=4 4 0 0 0 0 0 4
+diff=1 4 1 1 1 1 0 8
+diff=4 3 0 0 0 0 0 3
 diff=5 2 0 0 0 0 0 2
-diff=6 6 0 0 1 1 0 8
-diff=7 15 0 1 0 3 0 19
-diff=8 15 2 0 1 2 0 20
-diff=9 37 4 1 4 4 0 50
-diff=10 22 2 1 4 1 0 30
-diff=11 8 1 1 5 3 0 18
-diff=12 6 1 0 1 0 0 8
-sum 122 11 6 17 15 0 171
+diff=6 3 0 0 1 1 0 5
+diff=7 2 0 0 0 0 0 2
+diff=8 1 0 0 0 1 0 2
+diff=9 1 0 0 0 0 0 1
+diff=10 2 0 0 0 0 0 2
+diff=11 4 0 1 1 1 0 7
+diff=12 5 1 0 1 0 0 7
+sum 28 2 2 4 4 0 40
 
 Chimera analysis: relative delta Hamming distances
  FS=1 FS=2 FS=3 FS=4 FS=5-10 FS>10 sum
 diff=0.0 1 0 0 0 0 0 1
-diff=0.7 6 0 0 0 0 0 6
-diff=0.8 4 0 0 1 1 0 6
-diff=1.0 111 11 6 16 14 0 158
-sum 122 11 6 17 15 0 171
+diff=0.7 5 0 0 0 0 0 5
+diff=0.8 3 0 0 1 1 0 5
+diff=1.0 19 2 2 3 3 0 29
+sum 28 2 2 4 4 0 40
 
 Chimeras:
 All tags were filtered: only those tags where at least one half is identical with the half of the min. tag are kept.
-So the hamming distance of the non-identical half is compared.
+So the Hamming distance of the non-identical half is shown.
+Be aware that the real number of chimeric tags (where rel. diff = 1) is not shown in the plot because of the above reasons.
+real number of chimeric tags 20 1.0
 Hamming distances of non-zero half
  FS=1 FS=2 FS=3 FS=4 FS=5-10 FS>10 sum
-HD=1 6 1 2 1 1 0 11
-HD=6 2 0 0 0 0 0 2
-HD=7 15 0 1 0 3 0 19
-HD=8 15 2 0 1 2 0 20
-HD=9 37 4 1 4 4 0 50
-HD=10 22 2 1 4 1 0 30
-HD=11 8 1 1 5 3 0 18
-HD=12 6 1 0 1 0 0 8
-sum 111 11 6 16 14 0 158
+HD=1 4 1 1 1 1 0 8
+HD=7 2 0 0 0 0 0 2
+HD=8 1 0 0 0 1 0 2
+HD=9 1 0 0 0 0 0 1
+HD=10 2 0 0 0 0 0 2
+HD=11 4 0 1 1 1 0 7
+HD=12 5 1 0 1 0 0 7
+sum 19 2 2 3 3 0 29
 
 
b
diff -r 9919024d7778 -r 7e570ba56b83 test-data/output_file_chimeras.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/output_file_chimeras.tabular Wed Feb 27 04:50:56 2019 -0500
b
@@ -0,0 +1,23 @@
+sample tag similar tag
+AAAAAAAAAAAA AACCAAAACTTC *AAAAAAAAAAAA* TCTTTCTTTGAG
+AAAAAAAAAAAA ACCAGGCGTCGA *AAAAAAAAAAAA* AACCAAAACTTC, *AAAAAAAAAAAA* AGCTCCACGTTG, *AAAAAAAAAAAA* CAGTGTTGAGAC, *AAAAAAAAAAAA* TCTTTCTTTGAG, *AAAAAAAAAAAA* TTGGGTTCCTTA
+AAAAAAAAAAAA AGCTCCACGTTG *AAAAAAAAAAAA* CAGTGTTGAGAC, *AAAAAAAAAAAA* CCGCTCCTCACA
+AAAAAAAAAAAA ATCGTGGTTTGT *AAAAAAAAAAAA* CAGTGTTGAGAC, AAAAAAAAAAAG *ATCGTGGTTTGT*
+AAAAAAAAAAAA ATTCACCCTTGT *AAAAAAAAAAAA* CAGTGTTGAGAC, AAAAAAAAAAAT *ATTCACCCTTGT*
+AAAAAAAAAAAA CACACTTAACTT *AAAAAAAAAAAA* ATTCACCCTTGT, *AAAAAAAAAAAA* CCGCTCCTCACA, *AAAAAAAAAAAA* TCTTTCTTTGAG
+AAAAAAAAAAAA CAGTGTTGAGAC *AAAAAAAAAAAA* ATCGTGGTTTGT, *AAAAAAAAAAAA* ATTCACCCTTGT, *AAAAAAAAAAAA* CACACTTAACTT
+AAAAAAAAAAAA CCGCTCCTCACA *AAAAAAAAAAAA* AGCTCCACGTTG, *AAAAAAAAAAAA* CACACTTAACTT
+AAAAAAAAAAAA GGCAACACAGAA *AAAAAAAAAAAA* ATCGTGGTTTGT, AAAAAAAAAAAG *GGCAACACAGAA*
+AAAAAAAAAAAA TCTTTCTTTGAG *AAAAAAAAAAAA* AACCAAAACTTC, AAAAAAAAAAAG *TCTTTCTTTGAG*
+AAAAAAAAAAAA TTGGGTTCCTTA *AAAAAAAAAAAA* ACCAGGCGTCGA, *AAAAAAAAAAAA* GGCAACACAGAA, *AAAAAAAAAAAA* TCTTTCTTTGAG
+AAAAAAAAAAAG AGTCGCACCCAG *AAAAAAAAAAAG* ATCGTGGTTTGT
+AAAAAAAAAAAG ATCGTGGTTTGT *AAAAAAAAAAAG* TAGCCCTAAACG, AAAAAAAAAAAA *ATCGTGGTTTGT*
+AAAAAAAAAAAG CGCAACACAGAA *AAAAAAAAAAAG* ATCGTGGTTTGT
+AAAAAAAAAAAG GGCAACACAGAA *AAAAAAAAAAAG* ATCGTGGTTTGT, AAAAAAAAAAAA *GGCAACACAGAA*
+AAAAAAAAAAAG TAGCCCTAAACG *AAAAAAAAAAAG* ATCGTGGTTTGT
+AAAAAAAAAAAG TCTTTCTTTGAG *AAAAAAAAAAAG* ATCGTGGTTTGT, *AAAAAAAAAAAG* CGCAACACAGAA, *AAAAAAAAAAAG* GGCAACACAGAA, AAAAAAAAAAAA *TCTTTCTTTGAG*
+AAAAAAAAAAAT ATCATAGACTCT *AAAAAAAAAAAT* ATTCACCCTTGT
+AAAAAAAAAAAT ATTCACCCTTGT *AAAAAAAAAAAT* ATCATAGACTCT, AAAAAAAAAAAA *ATTCACCCTTGT*
+AAAAAAAAAAAT ATTCGAAAGTTA *AAAAAAAAAAAT* ATCATAGACTCT, *AAAAAAAAAAAT* ATTCACCCTTGT
+This file contains all tags that were identified as chimeras as the first column and the corresponding tags which returned a Hamming distance of zero in either the first or the second half of the sample tag as the second column.
+ The tags were separated by an empty space into their halves and the * marks the identical half.
\ No newline at end of file