ngs_server 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +4 -0
  3. data/Rakefile +2 -0
  4. data/bin/ngs_server +58 -0
  5. data/data/holder.txt +0 -0
  6. data/ext/bamtools/CMakeLists.txt +49 -0
  7. data/ext/bamtools/LICENSE +22 -0
  8. data/ext/bamtools/README +60 -0
  9. data/ext/bamtools/Tutorial_Toolkit_BamTools-1.0.pdf +0 -0
  10. data/ext/bamtools/docs/Doxyfile +1601 -0
  11. data/ext/bamtools/extconf.rb +9 -0
  12. data/ext/bamtools/src/CMakeFiles/CMakeDirectoryInformation.cmake +22 -0
  13. data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/DependInfo.cmake +13 -0
  14. data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/build.make +65 -0
  15. data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/cmake_clean.cmake +8 -0
  16. data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/depend.internal +3 -0
  17. data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/depend.make +3 -0
  18. data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/progress.make +2 -0
  19. data/ext/bamtools/src/CMakeFiles/progress.marks +1 -0
  20. data/ext/bamtools/src/CMakeLists.txt +18 -0
  21. data/ext/bamtools/src/ExportHeader.cmake +31 -0
  22. data/ext/bamtools/src/Makefile +182 -0
  23. data/ext/bamtools/src/api/BamAlignment.cpp +2432 -0
  24. data/ext/bamtools/src/api/BamAlignment.h +206 -0
  25. data/ext/bamtools/src/api/BamAux.h +456 -0
  26. data/ext/bamtools/src/api/BamConstants.h +127 -0
  27. data/ext/bamtools/src/api/BamIndex.h +79 -0
  28. data/ext/bamtools/src/api/BamMultiReader.cpp +395 -0
  29. data/ext/bamtools/src/api/BamMultiReader.h +126 -0
  30. data/ext/bamtools/src/api/BamReader.cpp +369 -0
  31. data/ext/bamtools/src/api/BamReader.h +117 -0
  32. data/ext/bamtools/src/api/BamWriter.cpp +142 -0
  33. data/ext/bamtools/src/api/BamWriter.h +63 -0
  34. data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/DependInfo.cmake +14 -0
  35. data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/build.make +80 -0
  36. data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/cmake_clean.cmake +8 -0
  37. data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/depend.internal +3 -0
  38. data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/depend.make +3 -0
  39. data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/progress.make +2 -0
  40. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/BamAlignment.cpp.o +0 -0
  41. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/BamMultiReader.cpp.o +0 -0
  42. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/BamReader.cpp.o +0 -0
  43. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/BamWriter.cpp.o +0 -0
  44. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/CXX.includecache +596 -0
  45. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/DependInfo.cmake +41 -0
  46. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamHeader.cpp.o +0 -0
  47. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamProgram.cpp.o +0 -0
  48. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamProgramChain.cpp.o +0 -0
  49. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamReadGroup.cpp.o +0 -0
  50. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamReadGroupDictionary.cpp.o +0 -0
  51. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamSequence.cpp.o +0 -0
  52. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamSequenceDictionary.cpp.o +0 -0
  53. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/build.make +675 -0
  54. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/cmake_clean.cmake +32 -0
  55. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/cmake_clean_target.cmake +3 -0
  56. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/depend.internal +295 -0
  57. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/depend.make +295 -0
  58. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/flags.make +8 -0
  59. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamHeader_p.cpp.o +0 -0
  60. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamIndexFactory_p.cpp.o +0 -0
  61. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamMultiReader_p.cpp.o +0 -0
  62. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamRandomAccessController_p.cpp.o +0 -0
  63. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamReader_p.cpp.o +0 -0
  64. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamStandardIndex_p.cpp.o +0 -0
  65. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamToolsIndex_p.cpp.o +0 -0
  66. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamWriter_p.cpp.o +0 -0
  67. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BgzfStream_p.cpp.o +0 -0
  68. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/SamFormatParser_p.cpp.o +0 -0
  69. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/SamFormatPrinter_p.cpp.o +0 -0
  70. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/SamHeaderValidator_p.cpp.o +0 -0
  71. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/link.txt +2 -0
  72. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/progress.make +24 -0
  73. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/BamAlignment.cpp.o +0 -0
  74. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/BamMultiReader.cpp.o +0 -0
  75. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/BamReader.cpp.o +0 -0
  76. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/BamWriter.cpp.o +0 -0
  77. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/CXX.includecache +596 -0
  78. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/DependInfo.cmake +47 -0
  79. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamHeader.cpp.o +0 -0
  80. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamProgram.cpp.o +0 -0
  81. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamProgramChain.cpp.o +0 -0
  82. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamReadGroup.cpp.o +0 -0
  83. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamReadGroupDictionary.cpp.o +0 -0
  84. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamSequence.cpp.o +0 -0
  85. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamSequenceDictionary.cpp.o +0 -0
  86. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/build.make +677 -0
  87. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/cmake_clean.cmake +33 -0
  88. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/depend.internal +295 -0
  89. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/depend.make +295 -0
  90. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/flags.make +8 -0
  91. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamHeader_p.cpp.o +0 -0
  92. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamIndexFactory_p.cpp.o +0 -0
  93. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamMultiReader_p.cpp.o +0 -0
  94. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamRandomAccessController_p.cpp.o +0 -0
  95. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamReader_p.cpp.o +0 -0
  96. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamStandardIndex_p.cpp.o +0 -0
  97. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamToolsIndex_p.cpp.o +0 -0
  98. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamWriter_p.cpp.o +0 -0
  99. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BgzfStream_p.cpp.o +0 -0
  100. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/SamFormatParser_p.cpp.o +0 -0
  101. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/SamFormatPrinter_p.cpp.o +0 -0
  102. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/SamHeaderValidator_p.cpp.o +0 -0
  103. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/link.txt +1 -0
  104. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/progress.make +24 -0
  105. data/ext/bamtools/src/api/CMakeFiles/CMakeDirectoryInformation.cmake +22 -0
  106. data/ext/bamtools/src/api/CMakeFiles/progress.marks +1 -0
  107. data/ext/bamtools/src/api/CMakeLists.txt +78 -0
  108. data/ext/bamtools/src/api/Makefile +902 -0
  109. data/ext/bamtools/src/api/SamConstants.h +95 -0
  110. data/ext/bamtools/src/api/SamHeader.cpp +184 -0
  111. data/ext/bamtools/src/api/SamHeader.h +68 -0
  112. data/ext/bamtools/src/api/SamProgram.cpp +139 -0
  113. data/ext/bamtools/src/api/SamProgram.h +61 -0
  114. data/ext/bamtools/src/api/SamProgramChain.cpp +351 -0
  115. data/ext/bamtools/src/api/SamProgramChain.h +85 -0
  116. data/ext/bamtools/src/api/SamReadGroup.cpp +221 -0
  117. data/ext/bamtools/src/api/SamReadGroup.h +68 -0
  118. data/ext/bamtools/src/api/SamReadGroupDictionary.cpp +289 -0
  119. data/ext/bamtools/src/api/SamReadGroupDictionary.h +86 -0
  120. data/ext/bamtools/src/api/SamSequence.cpp +161 -0
  121. data/ext/bamtools/src/api/SamSequence.h +60 -0
  122. data/ext/bamtools/src/api/SamSequenceDictionary.cpp +292 -0
  123. data/ext/bamtools/src/api/SamSequenceDictionary.h +88 -0
  124. data/ext/bamtools/src/api/api_global.h +21 -0
  125. data/ext/bamtools/src/api/cmake_install.cmake +122 -0
  126. data/ext/bamtools/src/api/internal/BamHeader_p.cpp +132 -0
  127. data/ext/bamtools/src/api/internal/BamHeader_p.h +71 -0
  128. data/ext/bamtools/src/api/internal/BamIndexFactory_p.cpp +112 -0
  129. data/ext/bamtools/src/api/internal/BamIndexFactory_p.h +49 -0
  130. data/ext/bamtools/src/api/internal/BamMultiMerger_p.h +297 -0
  131. data/ext/bamtools/src/api/internal/BamMultiReader_p.cpp +805 -0
  132. data/ext/bamtools/src/api/internal/BamMultiReader_p.h +103 -0
  133. data/ext/bamtools/src/api/internal/BamRandomAccessController_p.cpp +272 -0
  134. data/ext/bamtools/src/api/internal/BamRandomAccessController_p.h +93 -0
  135. data/ext/bamtools/src/api/internal/BamReader_p.cpp +380 -0
  136. data/ext/bamtools/src/api/internal/BamReader_p.h +112 -0
  137. data/ext/bamtools/src/api/internal/BamStandardIndex_p.cpp +986 -0
  138. data/ext/bamtools/src/api/internal/BamStandardIndex_p.h +236 -0
  139. data/ext/bamtools/src/api/internal/BamToolsIndex_p.cpp +641 -0
  140. data/ext/bamtools/src/api/internal/BamToolsIndex_p.h +187 -0
  141. data/ext/bamtools/src/api/internal/BamWriter_p.cpp +424 -0
  142. data/ext/bamtools/src/api/internal/BamWriter_p.h +66 -0
  143. data/ext/bamtools/src/api/internal/BgzfStream_p.cpp +438 -0
  144. data/ext/bamtools/src/api/internal/BgzfStream_p.h +108 -0
  145. data/ext/bamtools/src/api/internal/SamFormatParser_p.cpp +230 -0
  146. data/ext/bamtools/src/api/internal/SamFormatParser_p.h +61 -0
  147. data/ext/bamtools/src/api/internal/SamFormatPrinter_p.cpp +210 -0
  148. data/ext/bamtools/src/api/internal/SamFormatPrinter_p.h +60 -0
  149. data/ext/bamtools/src/api/internal/SamHeaderValidator_p.cpp +510 -0
  150. data/ext/bamtools/src/api/internal/SamHeaderValidator_p.h +101 -0
  151. data/ext/bamtools/src/api/internal/SamHeaderVersion_p.h +134 -0
  152. data/ext/bamtools/src/cmake_install.cmake +42 -0
  153. data/ext/bamtools/src/shared/bamtools_global.h +78 -0
  154. data/ext/bamtools/src/third_party/CMakeFiles/CMakeDirectoryInformation.cmake +22 -0
  155. data/ext/bamtools/src/third_party/CMakeFiles/progress.marks +1 -0
  156. data/ext/bamtools/src/third_party/CMakeLists.txt +10 -0
  157. data/ext/bamtools/src/third_party/Makefile +167 -0
  158. data/ext/bamtools/src/third_party/cmake_install.cmake +35 -0
  159. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/CMakeDirectoryInformation.cmake +22 -0
  160. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/CXX.includecache +144 -0
  161. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/DependInfo.cmake +27 -0
  162. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/build.make +157 -0
  163. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/cmake_clean.cmake +13 -0
  164. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/depend.internal +31 -0
  165. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/depend.make +31 -0
  166. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/flags.make +8 -0
  167. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/json_reader.cpp.o +0 -0
  168. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/json_value.cpp.o +0 -0
  169. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/json_writer.cpp.o +0 -0
  170. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/link.txt +1 -0
  171. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/progress.make +4 -0
  172. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/progress.marks +1 -0
  173. data/ext/bamtools/src/third_party/jsoncpp/CMakeLists.txt +23 -0
  174. data/ext/bamtools/src/third_party/jsoncpp/LICENSE +55 -0
  175. data/ext/bamtools/src/third_party/jsoncpp/Makefile +263 -0
  176. data/ext/bamtools/src/third_party/jsoncpp/cmake_install.cmake +29 -0
  177. data/ext/bamtools/src/third_party/jsoncpp/json.h +15 -0
  178. data/ext/bamtools/src/third_party/jsoncpp/json_batchallocator.h +130 -0
  179. data/ext/bamtools/src/third_party/jsoncpp/json_config.h +42 -0
  180. data/ext/bamtools/src/third_party/jsoncpp/json_features.h +47 -0
  181. data/ext/bamtools/src/third_party/jsoncpp/json_forwards.h +42 -0
  182. data/ext/bamtools/src/third_party/jsoncpp/json_internalarray.inl +453 -0
  183. data/ext/bamtools/src/third_party/jsoncpp/json_internalmap.inl +612 -0
  184. data/ext/bamtools/src/third_party/jsoncpp/json_reader.cpp +870 -0
  185. data/ext/bamtools/src/third_party/jsoncpp/json_reader.h +201 -0
  186. data/ext/bamtools/src/third_party/jsoncpp/json_tool.h +93 -0
  187. data/ext/bamtools/src/third_party/jsoncpp/json_value.cpp +1701 -0
  188. data/ext/bamtools/src/third_party/jsoncpp/json_value.h +1059 -0
  189. data/ext/bamtools/src/third_party/jsoncpp/json_valueiterator.inl +297 -0
  190. data/ext/bamtools/src/third_party/jsoncpp/json_writer.cpp +819 -0
  191. data/ext/bamtools/src/third_party/jsoncpp/json_writer.h +179 -0
  192. data/ext/bamtools/src/toolkit/CMakeFiles/CMakeDirectoryInformation.cmake +25 -0
  193. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/CXX.includecache +698 -0
  194. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/DependInfo.cmake +34 -0
  195. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools.cpp.o +0 -0
  196. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_convert.cpp.o +0 -0
  197. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_count.cpp.o +0 -0
  198. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_coverage.cpp.o +0 -0
  199. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_filter.cpp.o +0 -0
  200. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_header.cpp.o +0 -0
  201. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_index.cpp.o +0 -0
  202. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_merge.cpp.o +0 -0
  203. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_random.cpp.o +0 -0
  204. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_resolve.cpp.o +0 -0
  205. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_revert.cpp.o +0 -0
  206. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_sort.cpp.o +0 -0
  207. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_split.cpp.o +0 -0
  208. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_stats.cpp.o +0 -0
  209. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/build.make +447 -0
  210. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/cmake_clean.cmake +24 -0
  211. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/depend.internal +319 -0
  212. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/depend.make +319 -0
  213. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/flags.make +8 -0
  214. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/link.txt +1 -0
  215. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/progress.make +15 -0
  216. data/ext/bamtools/src/toolkit/CMakeFiles/progress.marks +1 -0
  217. data/ext/bamtools/src/toolkit/CMakeLists.txt +44 -0
  218. data/ext/bamtools/src/toolkit/Makefile +560 -0
  219. data/ext/bamtools/src/toolkit/bamtools.cpp +163 -0
  220. data/ext/bamtools/src/toolkit/bamtools_convert.cpp +888 -0
  221. data/ext/bamtools/src/toolkit/bamtools_convert.h +37 -0
  222. data/ext/bamtools/src/toolkit/bamtools_count.cpp +187 -0
  223. data/ext/bamtools/src/toolkit/bamtools_count.h +37 -0
  224. data/ext/bamtools/src/toolkit/bamtools_coverage.cpp +196 -0
  225. data/ext/bamtools/src/toolkit/bamtools_coverage.h +37 -0
  226. data/ext/bamtools/src/toolkit/bamtools_filter.cpp +911 -0
  227. data/ext/bamtools/src/toolkit/bamtools_filter.h +37 -0
  228. data/ext/bamtools/src/toolkit/bamtools_header.cpp +122 -0
  229. data/ext/bamtools/src/toolkit/bamtools_header.h +38 -0
  230. data/ext/bamtools/src/toolkit/bamtools_index.cpp +126 -0
  231. data/ext/bamtools/src/toolkit/bamtools_index.h +37 -0
  232. data/ext/bamtools/src/toolkit/bamtools_merge.cpp +221 -0
  233. data/ext/bamtools/src/toolkit/bamtools_merge.h +37 -0
  234. data/ext/bamtools/src/toolkit/bamtools_random.cpp +255 -0
  235. data/ext/bamtools/src/toolkit/bamtools_random.h +37 -0
  236. data/ext/bamtools/src/toolkit/bamtools_resolve.cpp +1396 -0
  237. data/ext/bamtools/src/toolkit/bamtools_resolve.h +42 -0
  238. data/ext/bamtools/src/toolkit/bamtools_revert.cpp +194 -0
  239. data/ext/bamtools/src/toolkit/bamtools_revert.h +37 -0
  240. data/ext/bamtools/src/toolkit/bamtools_sort.cpp +410 -0
  241. data/ext/bamtools/src/toolkit/bamtools_sort.h +37 -0
  242. data/ext/bamtools/src/toolkit/bamtools_split.cpp +551 -0
  243. data/ext/bamtools/src/toolkit/bamtools_split.h +38 -0
  244. data/ext/bamtools/src/toolkit/bamtools_stats.cpp +286 -0
  245. data/ext/bamtools/src/toolkit/bamtools_stats.h +37 -0
  246. data/ext/bamtools/src/toolkit/bamtools_tool.h +35 -0
  247. data/ext/bamtools/src/toolkit/bamtools_version.h +20 -0
  248. data/ext/bamtools/src/toolkit/bamtools_version.h.in +20 -0
  249. data/ext/bamtools/src/toolkit/cmake_install.cmake +52 -0
  250. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/CXX.includecache +250 -0
  251. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/DependInfo.cmake +29 -0
  252. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/bamtools_fasta.cpp.o +0 -0
  253. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/bamtools_options.cpp.o +0 -0
  254. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/bamtools_pileup_engine.cpp.o +0 -0
  255. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/bamtools_utilities.cpp.o +0 -0
  256. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/build.make +184 -0
  257. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/cmake_clean.cmake +14 -0
  258. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/depend.internal +40 -0
  259. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/depend.make +40 -0
  260. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/flags.make +8 -0
  261. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/link.txt +1 -0
  262. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/progress.make +5 -0
  263. data/ext/bamtools/src/utils/CMakeFiles/CMakeDirectoryInformation.cmake +23 -0
  264. data/ext/bamtools/src/utils/CMakeFiles/progress.marks +1 -0
  265. data/ext/bamtools/src/utils/CMakeLists.txt +30 -0
  266. data/ext/bamtools/src/utils/Makefile +290 -0
  267. data/ext/bamtools/src/utils/bamtools_fasta.cpp +632 -0
  268. data/ext/bamtools/src/utils/bamtools_fasta.h +47 -0
  269. data/ext/bamtools/src/utils/bamtools_filter_engine.h +552 -0
  270. data/ext/bamtools/src/utils/bamtools_filter_properties.h +195 -0
  271. data/ext/bamtools/src/utils/bamtools_filter_ruleparser.h +319 -0
  272. data/ext/bamtools/src/utils/bamtools_options.cpp +287 -0
  273. data/ext/bamtools/src/utils/bamtools_options.h +213 -0
  274. data/ext/bamtools/src/utils/bamtools_pileup_engine.cpp +327 -0
  275. data/ext/bamtools/src/utils/bamtools_pileup_engine.h +94 -0
  276. data/ext/bamtools/src/utils/bamtools_utilities.cpp +333 -0
  277. data/ext/bamtools/src/utils/bamtools_utilities.h +67 -0
  278. data/ext/bamtools/src/utils/bamtools_variant.h +128 -0
  279. data/ext/bamtools/src/utils/cmake_install.cmake +29 -0
  280. data/ext/bamtools/src/utils/utils_global.h +21 -0
  281. data/lib/ngs_server/version.rb +3 -0
  282. data/lib/ngs_server.rb +3 -0
  283. data/ngs_server.gemspec +23 -0
  284. metadata +339 -0
@@ -0,0 +1,805 @@
1
+ // ***************************************************************************
2
+ // BamMultiReader_p.cpp (c) 2010 Derek Barnett, Erik Garrison
3
+ // Marth Lab, Department of Biology, Boston College
4
+ // ---------------------------------------------------------------------------
5
+ // Last modified: 9 September 2011 (DB)
6
+ // ---------------------------------------------------------------------------
7
+ // Functionality for simultaneously reading multiple BAM files
8
+ // *************************************************************************
9
+
10
+ #include <api/BamAlignment.h>
11
+ #include <api/BamMultiReader.h>
12
+ #include <api/internal/BamMultiMerger_p.h>
13
+ #include <api/internal/BamMultiReader_p.h>
14
+ using namespace BamTools;
15
+ using namespace BamTools::Internal;
16
+
17
+ #include <algorithm>
18
+ #include <fstream>
19
+ #include <iostream>
20
+ #include <iterator>
21
+ #include <sstream>
22
+ using namespace std;
23
+
24
+ // ctor
25
+ BamMultiReaderPrivate::BamMultiReaderPrivate(void)
26
+ : m_alignments(0)
27
+ , m_sortOrder(BamMultiReader::SortedByPosition)
28
+ { }
29
+
30
+ // dtor
31
+ BamMultiReaderPrivate::~BamMultiReaderPrivate(void) {
32
+
33
+ // close all open BAM readers
34
+ Close();
35
+
36
+ // clean up alignment cache
37
+ delete m_alignments;
38
+ m_alignments = 0;
39
+ }
40
+
41
+ // close all BAM files
42
+ void BamMultiReaderPrivate::Close(void) {
43
+ CloseFiles( Filenames() );
44
+ }
45
+
46
+ // close requested BAM file
47
+ void BamMultiReaderPrivate::CloseFile(const string& filename) {
48
+ vector<string> filenames(1, filename);
49
+ CloseFiles(filenames);
50
+ }
51
+
52
+ // close requested BAM files
53
+ void BamMultiReaderPrivate::CloseFiles(const vector<string>& filenames) {
54
+
55
+ // iterate over filenames
56
+ vector<string>::const_iterator filesIter = filenames.begin();
57
+ vector<string>::const_iterator filesEnd = filenames.end();
58
+ for ( ; filesIter != filesEnd; ++filesIter ) {
59
+ const string& filename = (*filesIter);
60
+ if ( filename.empty() ) continue;
61
+
62
+ // iterate over readers
63
+ vector<ReaderAlignment>::iterator readerIter = m_readers.begin();
64
+ vector<ReaderAlignment>::iterator readerEnd = m_readers.end();
65
+ for ( ; readerIter != readerEnd; ++readerIter ) {
66
+ BamReader* reader = (*readerIter).first;
67
+ if ( reader == 0 ) continue;
68
+
69
+ // if reader matches requested filename
70
+ if ( reader->GetFilename() == filename ) {
71
+
72
+ // remove reader/alignment from alignment cache
73
+ m_alignments->Remove(reader);
74
+
75
+ // close & delete reader
76
+ reader->Close();
77
+ delete reader;
78
+ reader = 0;
79
+
80
+ // delete reader's alignment entry
81
+ BamAlignment* alignment = (*readerIter).second;
82
+ delete alignment;
83
+ alignment = 0;
84
+
85
+ // remove reader from container
86
+ m_readers.erase(readerIter);
87
+
88
+ // on match, just go on to next filename
89
+ // (no need to keep looking and iterator is invalid now anyway)
90
+ break;
91
+ }
92
+ }
93
+ }
94
+
95
+ // make sure alignment cache is cleared if all readers are now closed
96
+ if ( m_readers.empty() && m_alignments != 0 )
97
+ m_alignments->Clear();
98
+ }
99
+
100
+ // creates index files for BAM files that don't have them
101
+ bool BamMultiReaderPrivate::CreateIndexes(const BamIndex::IndexType& type) {
102
+
103
+ bool result = true;
104
+
105
+ // iterate over readers
106
+ vector<ReaderAlignment>::iterator readerIter = m_readers.begin();
107
+ vector<ReaderAlignment>::iterator readerEnd = m_readers.end();
108
+ for ( ; readerIter != readerEnd; ++readerIter ) {
109
+ BamReader* reader = (*readerIter).first;
110
+ if ( reader == 0 ) continue;
111
+
112
+ // if reader doesn't have an index, create one
113
+ if ( !reader->HasIndex() )
114
+ result &= reader->CreateIndex(type);
115
+ }
116
+
117
+ return result;
118
+ }
119
+
120
+ IBamMultiMerger* BamMultiReaderPrivate::CreateMergerForCurrentSortOrder(void) const {
121
+ switch ( m_sortOrder ) {
122
+ case ( BamMultiReader::SortedByPosition ) : return new PositionMultiMerger;
123
+ case ( BamMultiReader::SortedByReadName ) : return new ReadNameMultiMerger;
124
+ case ( BamMultiReader::Unsorted ) : return new UnsortedMultiMerger;
125
+ default :
126
+ cerr << "BamMultiReader ERROR: requested sort order is unknown" << endl;
127
+ return 0;
128
+ }
129
+ }
130
+
131
+ const string BamMultiReaderPrivate::ExtractReadGroup(const string& headerLine) const {
132
+
133
+ string readGroup("");
134
+ stringstream headerLineSs(headerLine);
135
+ string part;
136
+
137
+ // parse @RG header line, looking for the ID: tag
138
+ while( getline(headerLineSs, part, '\t') ) {
139
+ stringstream partSs(part);
140
+ string subtag;
141
+ getline(partSs, subtag, ':');
142
+ if ( subtag == "ID" ) {
143
+ getline(partSs, readGroup, ':');
144
+ break;
145
+ }
146
+ }
147
+ return readGroup;
148
+ }
149
+
150
+ const vector<string> BamMultiReaderPrivate::Filenames(void) const {
151
+
152
+ // init filename container
153
+ vector<string> filenames;
154
+ filenames.reserve( m_readers.size() );
155
+
156
+ // iterate over readers
157
+ vector<ReaderAlignment>::const_iterator readerIter = m_readers.begin();
158
+ vector<ReaderAlignment>::const_iterator readerEnd = m_readers.end();
159
+ for ( ; readerIter != readerEnd; ++readerIter ) {
160
+ const BamReader* reader = (*readerIter).first;
161
+ if ( reader == 0 ) continue;
162
+
163
+ // store filename if not empty
164
+ const string filename = reader->GetFilename();
165
+ if ( !filename.empty() )
166
+ filenames.push_back( reader->GetFilename() );
167
+ }
168
+
169
+ // return result
170
+ return filenames;
171
+ }
172
+
173
+ SamHeader BamMultiReaderPrivate::GetHeader(void) const {
174
+ string text = GetHeaderText();
175
+ return SamHeader(text);
176
+ }
177
+
178
+ // makes a virtual, unified header for all the bam files in the multireader
179
+ string BamMultiReaderPrivate::GetHeaderText(void) const {
180
+
181
+ // TODO: merge SamHeader objects instead of parsing string data (again)
182
+
183
+ // if only one reader is open
184
+ if ( m_readers.size() == 1 ) {
185
+
186
+ // just return reader's header text
187
+ const ReaderAlignment& ra = m_readers.front();
188
+ const BamReader* reader = ra.first;
189
+ if ( reader ) return reader->GetHeaderText();
190
+
191
+ // invalid reader
192
+ return string();
193
+ }
194
+
195
+ string mergedHeader("");
196
+ map<string, bool> readGroups;
197
+
198
+ // foreach extraction entry (each BAM file)
199
+ vector<ReaderAlignment>::const_iterator readerBegin = m_readers.begin();
200
+ vector<ReaderAlignment>::const_iterator readerIter = readerBegin;
201
+ vector<ReaderAlignment>::const_iterator readerEnd = m_readers.end();
202
+ for ( ; readerIter != readerEnd; ++readerIter ) {
203
+ const BamReader* reader = (*readerIter).first;
204
+ if ( reader == 0 ) continue;
205
+
206
+ // get header from reader
207
+ string headerText = reader->GetHeaderText();
208
+ if ( headerText.empty() ) continue;
209
+
210
+ // store header text in lines
211
+ map<string, bool> currentFileReadGroups;
212
+ const vector<string> lines = SplitHeaderText(headerText);
213
+
214
+ // iterate over header lines
215
+ vector<string>::const_iterator linesIter = lines.begin();
216
+ vector<string>::const_iterator linesEnd = lines.end();
217
+ for ( ; linesIter != linesEnd; ++linesIter ) {
218
+
219
+ // get next line from header, skip if empty
220
+ const string headerLine = (*linesIter);
221
+ if ( headerLine.empty() ) continue;
222
+
223
+ // if first file, save HD & SQ entries
224
+ // TODO: what if first file has empty header, should just check for empty 'mergedHeader' instead ?
225
+ if ( readerIter == readerBegin ) {
226
+ if ( headerLine.find("@HD") == 0 || headerLine.find("@SQ") == 0) {
227
+ mergedHeader.append(headerLine.c_str());
228
+ mergedHeader.append(1, '\n');
229
+ }
230
+ }
231
+
232
+ // (for all files) append RG entries if they are unique
233
+ if ( headerLine.find("@RG") == 0 ) {
234
+
235
+ // extract read group name from line
236
+ const string readGroup = ExtractReadGroup(headerLine);
237
+
238
+ // make sure not to duplicate @RG entries
239
+ if ( readGroups.find(readGroup) == readGroups.end() ) {
240
+ mergedHeader.append(headerLine.c_str() );
241
+ mergedHeader.append(1, '\n');
242
+ readGroups[readGroup] = true;
243
+ currentFileReadGroups[readGroup] = true;
244
+ } else {
245
+ // warn iff we are reading one file and discover duplicated @RG tags in the header
246
+ // otherwise, we emit no warning, as we might be merging multiple BAM files with identical @RG tags
247
+ if ( currentFileReadGroups.find(readGroup) != currentFileReadGroups.end() ) {
248
+ cerr << "BamMultiReader WARNING: duplicate @RG tag " << readGroup
249
+ << " entry in header of " << reader->GetFilename() << endl;
250
+ }
251
+ }
252
+ }
253
+ }
254
+ }
255
+
256
+ // return merged header text
257
+ return mergedHeader;
258
+ }
259
+
260
+ // get next alignment among all files
261
+ bool BamMultiReaderPrivate::GetNextAlignment(BamAlignment& al) {
262
+ return PopNextCachedAlignment(al, true);
263
+ }
264
+
265
+ // get next alignment among all files without parsing character data from alignments
266
+ bool BamMultiReaderPrivate::GetNextAlignmentCore(BamAlignment& al) {
267
+ return PopNextCachedAlignment(al, false);
268
+ }
269
+
270
+ // ---------------------------------------------------------------------------------------
271
+ //
272
+ // NB: The following GetReferenceX() functions assume that we have identical
273
+ // references for all BAM files. We enforce this by invoking the
274
+ // ValidateReaders() method to verify that our reference data is the same
275
+ // across all files on Open - so we will not encounter a situation in which
276
+ // there is a mismatch and we are still live.
277
+ //
278
+ // ---------------------------------------------------------------------------------------
279
+
280
+ // returns the number of reference sequences
281
+ int BamMultiReaderPrivate::GetReferenceCount(void) const {
282
+
283
+ // handle empty multireader
284
+ if ( m_readers.empty() )
285
+ return 0;
286
+
287
+ // return reference count from first reader
288
+ const ReaderAlignment& ra = m_readers.front();
289
+ const BamReader* reader = ra.first;
290
+ if ( reader ) return reader->GetReferenceCount();
291
+
292
+ // invalid reader
293
+ return 0;
294
+ }
295
+
296
+ // returns vector of reference objects
297
+ const RefVector BamMultiReaderPrivate::GetReferenceData(void) const {
298
+
299
+ // handle empty multireader
300
+ if ( m_readers.empty() )
301
+ return RefVector();
302
+
303
+ // return reference data from first BamReader
304
+ const ReaderAlignment& ra = m_readers.front();
305
+ const BamReader* reader = ra.first;
306
+ if ( reader ) return reader->GetReferenceData();
307
+
308
+ // invalid reader
309
+ return RefVector();
310
+ }
311
+
312
+ // returns refID from reference name
313
+ int BamMultiReaderPrivate::GetReferenceID(const string& refName) const {
314
+
315
+ // handle empty multireader
316
+ if ( m_readers.empty() )
317
+ return -1;
318
+
319
+ // return reference ID from first BamReader
320
+ const ReaderAlignment& ra = m_readers.front();
321
+ const BamReader* reader = ra.first;
322
+ if ( reader ) return reader->GetReferenceID(refName);
323
+
324
+ // invalid reader
325
+ return -1;
326
+ }
327
+ // ---------------------------------------------------------------------------------------
328
+
329
+ // checks if any readers still have alignments
330
+ bool BamMultiReaderPrivate::HasAlignmentData(void) const {
331
+ if ( m_alignments == 0 )
332
+ return false;
333
+ return !m_alignments->IsEmpty();
334
+ }
335
+
336
+ // returns true if all readers have index data available
337
+ // this is useful to indicate whether Jump() or SetRegion() are possible
338
+ bool BamMultiReaderPrivate::HasIndexes(void) const {
339
+
340
+ // handle empty multireader
341
+ if ( m_readers.empty() )
342
+ return false;
343
+
344
+ bool result = true;
345
+
346
+ // iterate over readers
347
+ vector<ReaderAlignment>::const_iterator readerIter = m_readers.begin();
348
+ vector<ReaderAlignment>::const_iterator readerEnd = m_readers.end();
349
+ for ( ; readerIter != readerEnd; ++readerIter ) {
350
+ const BamReader* reader = (*readerIter).first;
351
+ if ( reader == 0 ) continue;
352
+
353
+ // see if current reader has index data
354
+ result &= reader->HasIndex();
355
+ }
356
+
357
+ return result;
358
+ }
359
+
360
+ // returns true if multireader has open readers
361
+ bool BamMultiReaderPrivate::HasOpenReaders(void) {
362
+
363
+ // iterate over readers
364
+ vector<ReaderAlignment>::const_iterator readerIter = m_readers.begin();
365
+ vector<ReaderAlignment>::const_iterator readerEnd = m_readers.end();
366
+ for ( ; readerIter != readerEnd; ++readerIter ) {
367
+ const BamReader* reader = (*readerIter).first;
368
+ if ( reader == 0 ) continue;
369
+
370
+ // return true whenever an open reader is found
371
+ if ( reader->IsOpen() ) return true;
372
+ }
373
+
374
+ // no readers open
375
+ return false;
376
+ }
377
+
378
+ // performs random-access jump using (refID, position) as a left-bound
379
+ bool BamMultiReaderPrivate::Jump(int refID, int position) {
380
+
381
+ // NB: While it may make sense to track readers in which we can
382
+ // successfully Jump, in practice a failure of Jump means "no
383
+ // alignments here." It makes sense to simply accept the failure,
384
+ // UpdateAlignments(), and continue.
385
+
386
+ // iterate over readers
387
+ vector<ReaderAlignment>::iterator readerIter = m_readers.begin();
388
+ vector<ReaderAlignment>::iterator readerEnd = m_readers.end();
389
+ for ( ; readerIter != readerEnd; ++readerIter ) {
390
+ BamReader* reader = (*readerIter).first;
391
+ if ( reader == 0 ) continue;
392
+
393
+ // attempt jump() on each
394
+ if ( !reader->Jump(refID, position) ) {
395
+ cerr << "BamMultiReader ERROR: could not jump " << reader->GetFilename()
396
+ << " to " << refID << ":" << position << endl;
397
+ }
398
+ }
399
+
400
+ // update alignment cache & return success
401
+ UpdateAlignmentCache();
402
+ return true;
403
+ }
404
+
405
+ bool BamMultiReaderPrivate::LoadNextAlignment(BamReader* reader, BamAlignment* alignment) {
406
+ // lazy building of alignment's char data,
407
+ // only populated on demand by sorting merger or client call to GetNextAlignment()
408
+ return reader->GetNextAlignmentCore(*alignment);
409
+ }
410
+
411
+ // locate (& load) index files for BAM readers that don't already have one loaded
412
+ bool BamMultiReaderPrivate::LocateIndexes(const BamIndex::IndexType& preferredType) {
413
+
414
+ bool result = true;
415
+
416
+ // iterate over readers
417
+ vector<ReaderAlignment>::iterator readerIter = m_readers.begin();
418
+ vector<ReaderAlignment>::iterator readerEnd = m_readers.end();
419
+ for ( ; readerIter != readerEnd; ++readerIter ) {
420
+ BamReader* reader = (*readerIter).first;
421
+ if ( reader == 0 ) continue;
422
+
423
+ // if reader has no index, try to locate one
424
+ if ( !reader->HasIndex() )
425
+ result &= reader->LocateIndex(preferredType);
426
+ }
427
+
428
+ return result;
429
+ }
430
+
431
+ // opens BAM files
432
+ bool BamMultiReaderPrivate::Open(const vector<string>& filenames) {
433
+
434
+ // create alignment cache if neccessary
435
+ if ( m_alignments == 0 ) {
436
+ m_alignments = CreateMergerForCurrentSortOrder();
437
+ if ( m_alignments == 0 ) return false;
438
+ }
439
+
440
+ // put all current readers back at beginning (refreshes alignment cache)
441
+ Rewind();
442
+
443
+ // iterate over filenames
444
+ vector<string>::const_iterator filenameIter = filenames.begin();
445
+ vector<string>::const_iterator filenameEnd = filenames.end();
446
+ for ( ; filenameIter != filenameEnd; ++filenameIter ) {
447
+ const string& filename = (*filenameIter);
448
+ if ( filename.empty() ) continue;
449
+
450
+ // attempt to open BamReader on filename
451
+ bool openedOk = false;
452
+ ReaderAlignment ra = OpenReader(filename, &openedOk);
453
+ if ( openedOk ) {
454
+ m_readers.push_back(ra); // store reader/alignment in local list
455
+ m_alignments->Add(ra); // add reader/alignment to sorting cache
456
+ }
457
+ }
458
+
459
+ // if more than one reader open, check for reference consistency
460
+ if ( m_readers.size() > 1 )
461
+ ValidateReaders();
462
+
463
+ // return success
464
+ return true;
465
+ }
466
+
467
+ bool BamMultiReaderPrivate::OpenFile(const std::string& filename) {
468
+ vector<string> filenames(1, filename);
469
+ return Open(filenames);
470
+ }
471
+
472
+ bool BamMultiReaderPrivate::OpenIndexes(const vector<string>& indexFilenames) {
473
+
474
+ // TODO: This needs to be cleaner - should not assume same order.
475
+ // And either way, shouldn't start at first reader. Should start at
476
+ // first reader without an index?
477
+
478
+ // make sure same number of index filenames as readers
479
+ if ( m_readers.size() != indexFilenames.size() || !indexFilenames.empty() )
480
+ return false;
481
+
482
+ // init result flag
483
+ bool result = true;
484
+
485
+ // iterate over BamReaders
486
+ vector<string>::const_iterator indexFilenameIter = indexFilenames.begin();
487
+ vector<string>::const_iterator indexFilenameEnd = indexFilenames.end();
488
+ vector<ReaderAlignment>::iterator readerIter = m_readers.begin();
489
+ vector<ReaderAlignment>::iterator readerEnd = m_readers.end();
490
+ for ( ; readerIter != readerEnd; ++readerIter ) {
491
+ BamReader* reader = (*readerIter).first;
492
+
493
+ // open index filename on reader
494
+ if ( reader ) {
495
+ const string& indexFilename = (*indexFilenameIter);
496
+ result &= reader->OpenIndex(indexFilename);
497
+ }
498
+
499
+ // increment filename iterator, skip if no more index files to open
500
+ if ( ++indexFilenameIter == indexFilenameEnd )
501
+ break;
502
+ }
503
+
504
+ // TODO: validation ??
505
+
506
+ // return success/fail
507
+ return result;
508
+ }
509
+
510
+ ReaderAlignment BamMultiReaderPrivate::OpenReader(const string& filename, bool* ok) {
511
+
512
+ // clear status flag
513
+ *ok = false;
514
+
515
+ // create new BamReader & BamAlignment
516
+ BamReader* reader = new BamReader;
517
+ BamAlignment* alignment = new BamAlignment;
518
+
519
+ // if reader opens OK
520
+ if ( reader->Open(filename) ) {
521
+
522
+ // if first alignment reads OK
523
+ if ( LoadNextAlignment(reader, alignment) ) {
524
+ *ok = true;
525
+ return make_pair(reader, alignment);
526
+ }
527
+
528
+ // could not read alignment
529
+ else {
530
+ cerr << "BamMultiReader WARNING: Could not read first alignment from "
531
+ << filename << ", ignoring file" << endl;
532
+ }
533
+ }
534
+
535
+ // reader could not open
536
+ else {
537
+ cerr << "BamMultiReader WARNING: Could not open "
538
+ << filename << ", ignoring file" << endl;
539
+ }
540
+
541
+ // if we get here, there was a problem with this BAM file (opening or reading)
542
+ // clean up memory allocation & return null pointer
543
+ delete reader;
544
+ delete alignment;
545
+ return ReaderAlignment();
546
+ }
547
+
548
+ // print associated filenames to stdout
549
+ void BamMultiReaderPrivate::PrintFilenames(void) const {
550
+ const vector<string>& filenames = Filenames();
551
+ vector<string>::const_iterator filenameIter = filenames.begin();
552
+ vector<string>::const_iterator filenameEnd = filenames.end();
553
+ for ( ; filenameIter != filenameEnd; ++filenameIter )
554
+ cout << (*filenameIter) << endl;
555
+ }
556
+
557
+ bool BamMultiReaderPrivate::PopNextCachedAlignment(BamAlignment& al, const bool needCharData) {
558
+
559
+ // bail out if no more data to process
560
+ if ( !HasAlignmentData() )
561
+ return false;
562
+
563
+ // pop next reader/alignment pair
564
+ ReaderAlignment nextReaderAlignment = m_alignments->TakeFirst();
565
+ BamReader* reader = nextReaderAlignment.first;
566
+ BamAlignment* alignment = nextReaderAlignment.second;
567
+
568
+ // store cached alignment into destination parameter (by copy)
569
+ al = *alignment;
570
+
571
+ // set char data if requested
572
+ if ( needCharData ) {
573
+ al.BuildCharData();
574
+ al.Filename = reader->GetFilename();
575
+ }
576
+
577
+ // load next alignment from reader & store in cache
578
+ SaveNextAlignment(reader, alignment);
579
+
580
+ // return success
581
+ return true;
582
+ }
583
+
584
+ // returns BAM file pointers to beginning of alignment data & resets alignment cache
585
+ bool BamMultiReaderPrivate::Rewind(void) {
586
+
587
+ // clear out alignment cache
588
+ m_alignments->Clear();
589
+
590
+ // attempt to rewind files
591
+ if ( !RewindReaders() ) {
592
+ cerr << "BamMultiReader ERROR: could not rewind file(s) successfully";
593
+ return false;
594
+ }
595
+
596
+ // reset cache & return success
597
+ UpdateAlignmentCache();
598
+ return true;
599
+ }
600
+
601
+ // returns BAM file pointers to beginning of alignment data
602
+ bool BamMultiReaderPrivate::RewindReaders(void) {
603
+
604
+ bool result = true;
605
+
606
+ // iterate over readers
607
+ vector<ReaderAlignment>::iterator readerIter = m_readers.begin();
608
+ vector<ReaderAlignment>::iterator readerEnd = m_readers.end();
609
+ for ( ; readerIter != readerEnd; ++readerIter ) {
610
+ BamReader* reader = (*readerIter).first;
611
+ if ( reader == 0 ) continue;
612
+
613
+ // attempt rewind on BamReader
614
+ result &= reader->Rewind();
615
+ }
616
+
617
+ return result;
618
+ }
619
+
620
+ void BamMultiReaderPrivate::SaveNextAlignment(BamReader* reader, BamAlignment* alignment) {
621
+
622
+ // if can read alignment from reader, store in cache
623
+ if ( LoadNextAlignment(reader, alignment) )
624
+ m_alignments->Add( make_pair(reader, alignment) );
625
+ }
626
+
627
+ // sets the index caching mode on the readers
628
+ void BamMultiReaderPrivate::SetIndexCacheMode(const BamIndex::IndexCacheMode mode) {
629
+
630
+ // iterate over readers
631
+ vector<ReaderAlignment>::iterator readerIter = m_readers.begin();
632
+ vector<ReaderAlignment>::iterator readerEnd = m_readers.end();
633
+ for ( ; readerIter != readerEnd; ++readerIter ) {
634
+ BamReader* reader = (*readerIter).first;
635
+ if ( reader == 0 ) continue;
636
+
637
+ // set reader's index cache mode
638
+ reader->SetIndexCacheMode(mode);
639
+ }
640
+ }
641
+
642
+ bool BamMultiReaderPrivate::SetRegion(const BamRegion& region) {
643
+
644
+ // NB: While it may make sense to track readers in which we can
645
+ // successfully SetRegion, In practice a failure of SetRegion means "no
646
+ // alignments here." It makes sense to simply accept the failure,
647
+ // UpdateAlignments(), and continue.
648
+
649
+ // iterate over alignments
650
+ vector<ReaderAlignment>::iterator readerIter = m_readers.begin();
651
+ vector<ReaderAlignment>::iterator readerEnd = m_readers.end();
652
+ for ( ; readerIter != readerEnd; ++readerIter ) {
653
+ BamReader* reader = (*readerIter).first;
654
+ if ( reader == 0 ) continue;
655
+
656
+ // attempt to set BamReader's region of interest
657
+ if ( !reader->SetRegion(region) ) {
658
+ cerr << "BamMultiReader WARNING: could not jump " << reader->GetFilename() << " to "
659
+ << region.LeftRefID << ":" << region.LeftPosition << ".."
660
+ << region.RightRefID << ":" << region.RightPosition << endl;
661
+ }
662
+ }
663
+
664
+ // update alignment cache & return success
665
+ UpdateAlignmentCache();
666
+ return true;
667
+ }
668
+
669
+ void BamMultiReaderPrivate::SetSortOrder(const BamMultiReader::SortOrder& order) {
670
+
671
+ // skip if no change needed
672
+ if ( m_sortOrder == order ) return;
673
+
674
+ // set new sort order
675
+ m_sortOrder = order;
676
+
677
+ // create new alignment cache based on sort order
678
+ IBamMultiMerger* newAlignmentCache = CreateMergerForCurrentSortOrder();
679
+ if ( newAlignmentCache == 0 ) return; // print error?
680
+
681
+ // copy old cache contents to new cache
682
+ while ( m_alignments->Size() > 0 ) {
683
+ ReaderAlignment value = m_alignments->TakeFirst(); // retrieves & 'pops'
684
+ newAlignmentCache->Add(value);
685
+ }
686
+
687
+ // remove old cache structure & point to new cache
688
+ delete m_alignments;
689
+ m_alignments = newAlignmentCache;
690
+ }
691
+
692
+ // splits the entire header into a list of strings
693
+ const vector<string> BamMultiReaderPrivate::SplitHeaderText(const string& headerText) const {
694
+
695
+ stringstream header(headerText);
696
+ string item;
697
+
698
+ vector<string> lines;
699
+ while ( getline(header, item) )
700
+ lines.push_back(item);
701
+ return lines;
702
+ }
703
+
704
+ // updates our alignment cache
705
+ void BamMultiReaderPrivate::UpdateAlignmentCache(void) {
706
+
707
+ // skip if invalid alignment cache
708
+ if ( m_alignments == 0 ) return;
709
+
710
+ // clear the cache
711
+ m_alignments->Clear();
712
+
713
+ // iterate over readers
714
+ vector<ReaderAlignment>::iterator readerIter = m_readers.begin();
715
+ vector<ReaderAlignment>::iterator readerEnd = m_readers.end();
716
+ for ( ; readerIter != readerEnd; ++readerIter ) {
717
+ BamReader* reader = (*readerIter).first;
718
+ BamAlignment* alignment = (*readerIter).second;
719
+ if ( reader == 0 || alignment == 0 ) continue;
720
+
721
+ // save next alignment from each reader in cache
722
+ SaveNextAlignment(reader, alignment);
723
+ }
724
+ }
725
+
726
+ // ValidateReaders checks that all the readers point to BAM files representing
727
+ // alignments against the same set of reference sequences, and that the
728
+ // sequences are identically ordered. If these checks fail the operation of
729
+ // the multireader is undefined, so we force program exit.
730
+ void BamMultiReaderPrivate::ValidateReaders(void) const {
731
+
732
+ // retrieve first reader data
733
+ const BamReader* firstReader = m_readers.front().first;
734
+ if ( firstReader == 0 ) return;
735
+ const RefVector firstReaderRefData = firstReader->GetReferenceData();
736
+ const int firstReaderRefCount = firstReader->GetReferenceCount();
737
+ const int firstReaderRefSize = firstReaderRefData.size();
738
+
739
+ // iterate over all readers
740
+ vector<ReaderAlignment>::const_iterator readerIter = m_readers.begin();
741
+ vector<ReaderAlignment>::const_iterator readerEnd = m_readers.end();
742
+ for ( ; readerIter != readerEnd; ++readerIter ) {
743
+
744
+ // get current reader data
745
+ BamReader* reader = (*readerIter).first;
746
+ if ( reader == 0 ) continue;
747
+ const RefVector currentReaderRefData = reader->GetReferenceData();
748
+ const int currentReaderRefCount = reader->GetReferenceCount();
749
+ const int currentReaderRefSize = currentReaderRefData.size();
750
+
751
+ // init container iterators
752
+ RefVector::const_iterator firstRefIter = firstReaderRefData.begin();
753
+ RefVector::const_iterator firstRefEnd = firstReaderRefData.end();
754
+ RefVector::const_iterator currentRefIter = currentReaderRefData.begin();
755
+
756
+ // compare reference counts from BamReader ( & container size, in case of BR error)
757
+ if ( (currentReaderRefCount != firstReaderRefCount) ||
758
+ (firstReaderRefSize != currentReaderRefSize) )
759
+ {
760
+ cerr << "BamMultiReader ERROR: mismatched number of references in " << reader->GetFilename()
761
+ << " expected " << firstReaderRefCount
762
+ << " reference sequences but only found " << currentReaderRefCount << endl;
763
+ exit(1);
764
+ }
765
+
766
+ // this will be ok; we just checked above that we have identically-sized sets of references
767
+ // here we simply check if they are all, in fact, equal in content
768
+ while ( firstRefIter != firstRefEnd ) {
769
+ const RefData& firstRef = (*firstRefIter);
770
+ const RefData& currentRef = (*currentRefIter);
771
+
772
+ // compare reference name & length
773
+ if ( (firstRef.RefName != currentRef.RefName) ||
774
+ (firstRef.RefLength != currentRef.RefLength) )
775
+ {
776
+ cerr << "BamMultiReader ERROR: mismatched references found in " << reader->GetFilename()
777
+ << " expected: " << endl;
778
+
779
+ // print first reader's reference data
780
+ RefVector::const_iterator refIter = firstReaderRefData.begin();
781
+ RefVector::const_iterator refEnd = firstReaderRefData.end();
782
+ for ( ; refIter != refEnd; ++refIter ) {
783
+ const RefData& entry = (*refIter);
784
+ cerr << entry.RefName << " " << entry.RefLength << endl;
785
+ }
786
+
787
+ cerr << "but found: " << endl;
788
+
789
+ // print current reader's reference data
790
+ refIter = currentReaderRefData.begin();
791
+ refEnd = currentReaderRefData.end();
792
+ for ( ; refIter != refEnd; ++refIter ) {
793
+ const RefData& entry = (*refIter);
794
+ cerr << entry.RefName << " " << entry.RefLength << endl;
795
+ }
796
+
797
+ exit(1);
798
+ }
799
+
800
+ // update iterators
801
+ ++firstRefIter;
802
+ ++currentRefIter;
803
+ }
804
+ }
805
+ }