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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +2 -0
- data/bin/ngs_server +58 -0
- data/data/holder.txt +0 -0
- data/ext/bamtools/CMakeLists.txt +49 -0
- data/ext/bamtools/LICENSE +22 -0
- data/ext/bamtools/README +60 -0
- data/ext/bamtools/Tutorial_Toolkit_BamTools-1.0.pdf +0 -0
- data/ext/bamtools/docs/Doxyfile +1601 -0
- data/ext/bamtools/extconf.rb +9 -0
- data/ext/bamtools/src/CMakeFiles/CMakeDirectoryInformation.cmake +22 -0
- data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/DependInfo.cmake +13 -0
- data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/build.make +65 -0
- data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/cmake_clean.cmake +8 -0
- data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/depend.internal +3 -0
- data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/depend.make +3 -0
- data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/progress.make +2 -0
- data/ext/bamtools/src/CMakeFiles/progress.marks +1 -0
- data/ext/bamtools/src/CMakeLists.txt +18 -0
- data/ext/bamtools/src/ExportHeader.cmake +31 -0
- data/ext/bamtools/src/Makefile +182 -0
- data/ext/bamtools/src/api/BamAlignment.cpp +2432 -0
- data/ext/bamtools/src/api/BamAlignment.h +206 -0
- data/ext/bamtools/src/api/BamAux.h +456 -0
- data/ext/bamtools/src/api/BamConstants.h +127 -0
- data/ext/bamtools/src/api/BamIndex.h +79 -0
- data/ext/bamtools/src/api/BamMultiReader.cpp +395 -0
- data/ext/bamtools/src/api/BamMultiReader.h +126 -0
- data/ext/bamtools/src/api/BamReader.cpp +369 -0
- data/ext/bamtools/src/api/BamReader.h +117 -0
- data/ext/bamtools/src/api/BamWriter.cpp +142 -0
- data/ext/bamtools/src/api/BamWriter.h +63 -0
- data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/DependInfo.cmake +14 -0
- data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/build.make +80 -0
- data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/cmake_clean.cmake +8 -0
- data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/depend.internal +3 -0
- data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/depend.make +3 -0
- data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/progress.make +2 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/BamAlignment.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/BamMultiReader.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/BamReader.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/BamWriter.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/CXX.includecache +596 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/DependInfo.cmake +41 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamHeader.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamProgram.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamProgramChain.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamReadGroup.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamReadGroupDictionary.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamSequence.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamSequenceDictionary.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/build.make +675 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/cmake_clean.cmake +32 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/cmake_clean_target.cmake +3 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/depend.internal +295 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/depend.make +295 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/flags.make +8 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamHeader_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamIndexFactory_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamMultiReader_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamRandomAccessController_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamReader_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamStandardIndex_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamToolsIndex_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamWriter_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BgzfStream_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/SamFormatParser_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/SamFormatPrinter_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/SamHeaderValidator_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/link.txt +2 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/progress.make +24 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/BamAlignment.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/BamMultiReader.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/BamReader.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/BamWriter.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/CXX.includecache +596 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/DependInfo.cmake +47 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamHeader.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamProgram.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamProgramChain.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamReadGroup.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamReadGroupDictionary.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamSequence.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamSequenceDictionary.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/build.make +677 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/cmake_clean.cmake +33 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/depend.internal +295 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/depend.make +295 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/flags.make +8 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamHeader_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamIndexFactory_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamMultiReader_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamRandomAccessController_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamReader_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamStandardIndex_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamToolsIndex_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamWriter_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BgzfStream_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/SamFormatParser_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/SamFormatPrinter_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/SamHeaderValidator_p.cpp.o +0 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/link.txt +1 -0
- data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/progress.make +24 -0
- data/ext/bamtools/src/api/CMakeFiles/CMakeDirectoryInformation.cmake +22 -0
- data/ext/bamtools/src/api/CMakeFiles/progress.marks +1 -0
- data/ext/bamtools/src/api/CMakeLists.txt +78 -0
- data/ext/bamtools/src/api/Makefile +902 -0
- data/ext/bamtools/src/api/SamConstants.h +95 -0
- data/ext/bamtools/src/api/SamHeader.cpp +184 -0
- data/ext/bamtools/src/api/SamHeader.h +68 -0
- data/ext/bamtools/src/api/SamProgram.cpp +139 -0
- data/ext/bamtools/src/api/SamProgram.h +61 -0
- data/ext/bamtools/src/api/SamProgramChain.cpp +351 -0
- data/ext/bamtools/src/api/SamProgramChain.h +85 -0
- data/ext/bamtools/src/api/SamReadGroup.cpp +221 -0
- data/ext/bamtools/src/api/SamReadGroup.h +68 -0
- data/ext/bamtools/src/api/SamReadGroupDictionary.cpp +289 -0
- data/ext/bamtools/src/api/SamReadGroupDictionary.h +86 -0
- data/ext/bamtools/src/api/SamSequence.cpp +161 -0
- data/ext/bamtools/src/api/SamSequence.h +60 -0
- data/ext/bamtools/src/api/SamSequenceDictionary.cpp +292 -0
- data/ext/bamtools/src/api/SamSequenceDictionary.h +88 -0
- data/ext/bamtools/src/api/api_global.h +21 -0
- data/ext/bamtools/src/api/cmake_install.cmake +122 -0
- data/ext/bamtools/src/api/internal/BamHeader_p.cpp +132 -0
- data/ext/bamtools/src/api/internal/BamHeader_p.h +71 -0
- data/ext/bamtools/src/api/internal/BamIndexFactory_p.cpp +112 -0
- data/ext/bamtools/src/api/internal/BamIndexFactory_p.h +49 -0
- data/ext/bamtools/src/api/internal/BamMultiMerger_p.h +297 -0
- data/ext/bamtools/src/api/internal/BamMultiReader_p.cpp +805 -0
- data/ext/bamtools/src/api/internal/BamMultiReader_p.h +103 -0
- data/ext/bamtools/src/api/internal/BamRandomAccessController_p.cpp +272 -0
- data/ext/bamtools/src/api/internal/BamRandomAccessController_p.h +93 -0
- data/ext/bamtools/src/api/internal/BamReader_p.cpp +380 -0
- data/ext/bamtools/src/api/internal/BamReader_p.h +112 -0
- data/ext/bamtools/src/api/internal/BamStandardIndex_p.cpp +986 -0
- data/ext/bamtools/src/api/internal/BamStandardIndex_p.h +236 -0
- data/ext/bamtools/src/api/internal/BamToolsIndex_p.cpp +641 -0
- data/ext/bamtools/src/api/internal/BamToolsIndex_p.h +187 -0
- data/ext/bamtools/src/api/internal/BamWriter_p.cpp +424 -0
- data/ext/bamtools/src/api/internal/BamWriter_p.h +66 -0
- data/ext/bamtools/src/api/internal/BgzfStream_p.cpp +438 -0
- data/ext/bamtools/src/api/internal/BgzfStream_p.h +108 -0
- data/ext/bamtools/src/api/internal/SamFormatParser_p.cpp +230 -0
- data/ext/bamtools/src/api/internal/SamFormatParser_p.h +61 -0
- data/ext/bamtools/src/api/internal/SamFormatPrinter_p.cpp +210 -0
- data/ext/bamtools/src/api/internal/SamFormatPrinter_p.h +60 -0
- data/ext/bamtools/src/api/internal/SamHeaderValidator_p.cpp +510 -0
- data/ext/bamtools/src/api/internal/SamHeaderValidator_p.h +101 -0
- data/ext/bamtools/src/api/internal/SamHeaderVersion_p.h +134 -0
- data/ext/bamtools/src/cmake_install.cmake +42 -0
- data/ext/bamtools/src/shared/bamtools_global.h +78 -0
- data/ext/bamtools/src/third_party/CMakeFiles/CMakeDirectoryInformation.cmake +22 -0
- data/ext/bamtools/src/third_party/CMakeFiles/progress.marks +1 -0
- data/ext/bamtools/src/third_party/CMakeLists.txt +10 -0
- data/ext/bamtools/src/third_party/Makefile +167 -0
- data/ext/bamtools/src/third_party/cmake_install.cmake +35 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/CMakeDirectoryInformation.cmake +22 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/CXX.includecache +144 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/DependInfo.cmake +27 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/build.make +157 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/cmake_clean.cmake +13 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/depend.internal +31 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/depend.make +31 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/flags.make +8 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/json_reader.cpp.o +0 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/json_value.cpp.o +0 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/json_writer.cpp.o +0 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/link.txt +1 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/progress.make +4 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/progress.marks +1 -0
- data/ext/bamtools/src/third_party/jsoncpp/CMakeLists.txt +23 -0
- data/ext/bamtools/src/third_party/jsoncpp/LICENSE +55 -0
- data/ext/bamtools/src/third_party/jsoncpp/Makefile +263 -0
- data/ext/bamtools/src/third_party/jsoncpp/cmake_install.cmake +29 -0
- data/ext/bamtools/src/third_party/jsoncpp/json.h +15 -0
- data/ext/bamtools/src/third_party/jsoncpp/json_batchallocator.h +130 -0
- data/ext/bamtools/src/third_party/jsoncpp/json_config.h +42 -0
- data/ext/bamtools/src/third_party/jsoncpp/json_features.h +47 -0
- data/ext/bamtools/src/third_party/jsoncpp/json_forwards.h +42 -0
- data/ext/bamtools/src/third_party/jsoncpp/json_internalarray.inl +453 -0
- data/ext/bamtools/src/third_party/jsoncpp/json_internalmap.inl +612 -0
- data/ext/bamtools/src/third_party/jsoncpp/json_reader.cpp +870 -0
- data/ext/bamtools/src/third_party/jsoncpp/json_reader.h +201 -0
- data/ext/bamtools/src/third_party/jsoncpp/json_tool.h +93 -0
- data/ext/bamtools/src/third_party/jsoncpp/json_value.cpp +1701 -0
- data/ext/bamtools/src/third_party/jsoncpp/json_value.h +1059 -0
- data/ext/bamtools/src/third_party/jsoncpp/json_valueiterator.inl +297 -0
- data/ext/bamtools/src/third_party/jsoncpp/json_writer.cpp +819 -0
- data/ext/bamtools/src/third_party/jsoncpp/json_writer.h +179 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/CMakeDirectoryInformation.cmake +25 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/CXX.includecache +698 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/DependInfo.cmake +34 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools.cpp.o +0 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_convert.cpp.o +0 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_count.cpp.o +0 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_coverage.cpp.o +0 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_filter.cpp.o +0 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_header.cpp.o +0 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_index.cpp.o +0 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_merge.cpp.o +0 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_random.cpp.o +0 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_resolve.cpp.o +0 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_revert.cpp.o +0 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_sort.cpp.o +0 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_split.cpp.o +0 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_stats.cpp.o +0 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/build.make +447 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/cmake_clean.cmake +24 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/depend.internal +319 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/depend.make +319 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/flags.make +8 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/link.txt +1 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/progress.make +15 -0
- data/ext/bamtools/src/toolkit/CMakeFiles/progress.marks +1 -0
- data/ext/bamtools/src/toolkit/CMakeLists.txt +44 -0
- data/ext/bamtools/src/toolkit/Makefile +560 -0
- data/ext/bamtools/src/toolkit/bamtools.cpp +163 -0
- data/ext/bamtools/src/toolkit/bamtools_convert.cpp +888 -0
- data/ext/bamtools/src/toolkit/bamtools_convert.h +37 -0
- data/ext/bamtools/src/toolkit/bamtools_count.cpp +187 -0
- data/ext/bamtools/src/toolkit/bamtools_count.h +37 -0
- data/ext/bamtools/src/toolkit/bamtools_coverage.cpp +196 -0
- data/ext/bamtools/src/toolkit/bamtools_coverage.h +37 -0
- data/ext/bamtools/src/toolkit/bamtools_filter.cpp +911 -0
- data/ext/bamtools/src/toolkit/bamtools_filter.h +37 -0
- data/ext/bamtools/src/toolkit/bamtools_header.cpp +122 -0
- data/ext/bamtools/src/toolkit/bamtools_header.h +38 -0
- data/ext/bamtools/src/toolkit/bamtools_index.cpp +126 -0
- data/ext/bamtools/src/toolkit/bamtools_index.h +37 -0
- data/ext/bamtools/src/toolkit/bamtools_merge.cpp +221 -0
- data/ext/bamtools/src/toolkit/bamtools_merge.h +37 -0
- data/ext/bamtools/src/toolkit/bamtools_random.cpp +255 -0
- data/ext/bamtools/src/toolkit/bamtools_random.h +37 -0
- data/ext/bamtools/src/toolkit/bamtools_resolve.cpp +1396 -0
- data/ext/bamtools/src/toolkit/bamtools_resolve.h +42 -0
- data/ext/bamtools/src/toolkit/bamtools_revert.cpp +194 -0
- data/ext/bamtools/src/toolkit/bamtools_revert.h +37 -0
- data/ext/bamtools/src/toolkit/bamtools_sort.cpp +410 -0
- data/ext/bamtools/src/toolkit/bamtools_sort.h +37 -0
- data/ext/bamtools/src/toolkit/bamtools_split.cpp +551 -0
- data/ext/bamtools/src/toolkit/bamtools_split.h +38 -0
- data/ext/bamtools/src/toolkit/bamtools_stats.cpp +286 -0
- data/ext/bamtools/src/toolkit/bamtools_stats.h +37 -0
- data/ext/bamtools/src/toolkit/bamtools_tool.h +35 -0
- data/ext/bamtools/src/toolkit/bamtools_version.h +20 -0
- data/ext/bamtools/src/toolkit/bamtools_version.h.in +20 -0
- data/ext/bamtools/src/toolkit/cmake_install.cmake +52 -0
- data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/CXX.includecache +250 -0
- data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/DependInfo.cmake +29 -0
- data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/bamtools_fasta.cpp.o +0 -0
- data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/bamtools_options.cpp.o +0 -0
- data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/bamtools_pileup_engine.cpp.o +0 -0
- data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/bamtools_utilities.cpp.o +0 -0
- data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/build.make +184 -0
- data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/cmake_clean.cmake +14 -0
- data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/depend.internal +40 -0
- data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/depend.make +40 -0
- data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/flags.make +8 -0
- data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/link.txt +1 -0
- data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/progress.make +5 -0
- data/ext/bamtools/src/utils/CMakeFiles/CMakeDirectoryInformation.cmake +23 -0
- data/ext/bamtools/src/utils/CMakeFiles/progress.marks +1 -0
- data/ext/bamtools/src/utils/CMakeLists.txt +30 -0
- data/ext/bamtools/src/utils/Makefile +290 -0
- data/ext/bamtools/src/utils/bamtools_fasta.cpp +632 -0
- data/ext/bamtools/src/utils/bamtools_fasta.h +47 -0
- data/ext/bamtools/src/utils/bamtools_filter_engine.h +552 -0
- data/ext/bamtools/src/utils/bamtools_filter_properties.h +195 -0
- data/ext/bamtools/src/utils/bamtools_filter_ruleparser.h +319 -0
- data/ext/bamtools/src/utils/bamtools_options.cpp +287 -0
- data/ext/bamtools/src/utils/bamtools_options.h +213 -0
- data/ext/bamtools/src/utils/bamtools_pileup_engine.cpp +327 -0
- data/ext/bamtools/src/utils/bamtools_pileup_engine.h +94 -0
- data/ext/bamtools/src/utils/bamtools_utilities.cpp +333 -0
- data/ext/bamtools/src/utils/bamtools_utilities.h +67 -0
- data/ext/bamtools/src/utils/bamtools_variant.h +128 -0
- data/ext/bamtools/src/utils/cmake_install.cmake +29 -0
- data/ext/bamtools/src/utils/utils_global.h +21 -0
- data/lib/ngs_server/version.rb +3 -0
- data/lib/ngs_server.rb +3 -0
- data/ngs_server.gemspec +23 -0
- metadata +339 -0
|
@@ -0,0 +1,911 @@
|
|
|
1
|
+
// ***************************************************************************
|
|
2
|
+
// bamtools_filter.cpp (c) 2010 Derek Barnett, Erik Garrison
|
|
3
|
+
// Marth Lab, Department of Biology, Boston College
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Last modified: 7 April 2011
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Filters BAM file(s) according to some user-specified criteria
|
|
8
|
+
// ***************************************************************************
|
|
9
|
+
|
|
10
|
+
#include "bamtools_filter.h"
|
|
11
|
+
|
|
12
|
+
#include <api/BamMultiReader.h>
|
|
13
|
+
#include <api/BamWriter.h>
|
|
14
|
+
#include <utils/bamtools_filter_engine.h>
|
|
15
|
+
#include <utils/bamtools_options.h>
|
|
16
|
+
#include <utils/bamtools_utilities.h>
|
|
17
|
+
using namespace BamTools;
|
|
18
|
+
|
|
19
|
+
#include <jsoncpp/json.h>
|
|
20
|
+
using namespace Json;
|
|
21
|
+
|
|
22
|
+
#include <cstdio>
|
|
23
|
+
#include <iostream>
|
|
24
|
+
#include <sstream>
|
|
25
|
+
#include <string>
|
|
26
|
+
#include <vector>
|
|
27
|
+
using namespace std;
|
|
28
|
+
|
|
29
|
+
namespace BamTools {
|
|
30
|
+
|
|
31
|
+
// -------------------------------
|
|
32
|
+
// string literal constants
|
|
33
|
+
|
|
34
|
+
// property names
|
|
35
|
+
const string ALIGNMENTFLAG_PROPERTY = "alignmentFlag";
|
|
36
|
+
const string CIGAR_PROPERTY = "cigar";
|
|
37
|
+
const string INSERTSIZE_PROPERTY = "insertSize";
|
|
38
|
+
const string ISDUPLICATE_PROPERTY = "isDuplicate";
|
|
39
|
+
const string ISFAILEDQC_PROPERTY = "isFailedQC";
|
|
40
|
+
const string ISFIRSTMATE_PROPERTY = "isFirstMate";
|
|
41
|
+
const string ISMAPPED_PROPERTY = "isMapped";
|
|
42
|
+
const string ISMATEMAPPED_PROPERTY = "isMateMapped";
|
|
43
|
+
const string ISMATEREVERSESTRAND_PROPERTY = "isMateReverseStrand";
|
|
44
|
+
const string ISPAIRED_PROPERTY = "isPaired";
|
|
45
|
+
const string ISPRIMARYALIGNMENT_PROPERTY = "isPrimaryAlignment";
|
|
46
|
+
const string ISPROPERPAIR_PROPERTY = "isProperPair";
|
|
47
|
+
const string ISREVERSESTRAND_PROPERTY = "isReverseStrand";
|
|
48
|
+
const string ISSECONDMATE_PROPERTY = "isSecondMate";
|
|
49
|
+
const string ISSINGLETON_PROPERTY = "isSingleton";
|
|
50
|
+
const string MAPQUALITY_PROPERTY = "mapQuality";
|
|
51
|
+
const string MATEPOSITION_PROPERTY = "matePosition";
|
|
52
|
+
const string MATEREFERENCE_PROPERTY = "mateReference";
|
|
53
|
+
const string NAME_PROPERTY = "name";
|
|
54
|
+
const string POSITION_PROPERTY = "position";
|
|
55
|
+
const string QUERYBASES_PROPERTY = "queryBases";
|
|
56
|
+
const string REFERENCE_PROPERTY = "reference";
|
|
57
|
+
const string TAG_PROPERTY = "tag";
|
|
58
|
+
|
|
59
|
+
// boolalpha
|
|
60
|
+
const string TRUE_STR = "true";
|
|
61
|
+
const string FALSE_STR = "false";
|
|
62
|
+
|
|
63
|
+
RefVector filterToolReferences;
|
|
64
|
+
|
|
65
|
+
struct BamAlignmentChecker {
|
|
66
|
+
bool check(const PropertyFilter& filter, const BamAlignment& al) {
|
|
67
|
+
|
|
68
|
+
bool keepAlignment = true;
|
|
69
|
+
const PropertyMap& properties = filter.Properties;
|
|
70
|
+
PropertyMap::const_iterator propertyIter = properties.begin();
|
|
71
|
+
PropertyMap::const_iterator propertyEnd = properties.end();
|
|
72
|
+
for ( ; propertyIter != propertyEnd; ++propertyIter ) {
|
|
73
|
+
|
|
74
|
+
// check alignment data field depending on propertyName
|
|
75
|
+
const string& propertyName = (*propertyIter).first;
|
|
76
|
+
const PropertyFilterValue& valueFilter = (*propertyIter).second;
|
|
77
|
+
|
|
78
|
+
if ( propertyName == ALIGNMENTFLAG_PROPERTY ) keepAlignment &= valueFilter.check(al.AlignmentFlag);
|
|
79
|
+
else if ( propertyName == CIGAR_PROPERTY ) {
|
|
80
|
+
stringstream cigarSs;
|
|
81
|
+
const vector<CigarOp>& cigarData = al.CigarData;
|
|
82
|
+
if ( !cigarData.empty() ) {
|
|
83
|
+
vector<CigarOp>::const_iterator cigarBegin = cigarData.begin();
|
|
84
|
+
vector<CigarOp>::const_iterator cigarIter = cigarBegin;
|
|
85
|
+
vector<CigarOp>::const_iterator cigarEnd = cigarData.end();
|
|
86
|
+
for ( ; cigarIter != cigarEnd; ++cigarIter ) {
|
|
87
|
+
const CigarOp& op = (*cigarIter);
|
|
88
|
+
cigarSs << op.Length << op.Type;
|
|
89
|
+
}
|
|
90
|
+
keepAlignment &= valueFilter.check(cigarSs.str());
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else if ( propertyName == INSERTSIZE_PROPERTY ) keepAlignment &= valueFilter.check(al.InsertSize);
|
|
94
|
+
else if ( propertyName == ISDUPLICATE_PROPERTY ) keepAlignment &= valueFilter.check(al.IsDuplicate());
|
|
95
|
+
else if ( propertyName == ISFAILEDQC_PROPERTY ) keepAlignment &= valueFilter.check(al.IsFailedQC());
|
|
96
|
+
else if ( propertyName == ISFIRSTMATE_PROPERTY ) keepAlignment &= valueFilter.check(al.IsFirstMate());
|
|
97
|
+
else if ( propertyName == ISMAPPED_PROPERTY ) keepAlignment &= valueFilter.check(al.IsMapped());
|
|
98
|
+
else if ( propertyName == ISMATEMAPPED_PROPERTY ) keepAlignment &= valueFilter.check(al.IsMateMapped());
|
|
99
|
+
else if ( propertyName == ISMATEREVERSESTRAND_PROPERTY ) keepAlignment &= valueFilter.check(al.IsMateReverseStrand());
|
|
100
|
+
else if ( propertyName == ISPAIRED_PROPERTY ) keepAlignment &= valueFilter.check(al.IsPaired());
|
|
101
|
+
else if ( propertyName == ISPRIMARYALIGNMENT_PROPERTY ) keepAlignment &= valueFilter.check(al.IsPrimaryAlignment());
|
|
102
|
+
else if ( propertyName == ISPROPERPAIR_PROPERTY ) keepAlignment &= valueFilter.check(al.IsProperPair());
|
|
103
|
+
else if ( propertyName == ISREVERSESTRAND_PROPERTY ) keepAlignment &= valueFilter.check(al.IsReverseStrand());
|
|
104
|
+
else if ( propertyName == ISSECONDMATE_PROPERTY ) keepAlignment &= valueFilter.check(al.IsSecondMate());
|
|
105
|
+
else if ( propertyName == ISSINGLETON_PROPERTY ) {
|
|
106
|
+
const bool isSingleton = al.IsPaired() && al.IsMapped() && !al.IsMateMapped();
|
|
107
|
+
keepAlignment &= valueFilter.check(isSingleton);
|
|
108
|
+
}
|
|
109
|
+
else if ( propertyName == MAPQUALITY_PROPERTY ) keepAlignment &= valueFilter.check(al.MapQuality);
|
|
110
|
+
else if ( propertyName == MATEPOSITION_PROPERTY ) keepAlignment &= ( al.IsPaired() && al.IsMateMapped() && valueFilter.check(al.MateRefID) );
|
|
111
|
+
else if ( propertyName == MATEREFERENCE_PROPERTY ) {
|
|
112
|
+
if ( !al.IsPaired() || !al.IsMateMapped() ) return false;
|
|
113
|
+
BAMTOOLS_ASSERT_MESSAGE( (al.MateRefID>=0 && (al.MateRefID<(int)filterToolReferences.size())), "Invalid MateRefID");
|
|
114
|
+
const string& refName = filterToolReferences.at(al.MateRefID).RefName;
|
|
115
|
+
keepAlignment &= valueFilter.check(refName);
|
|
116
|
+
}
|
|
117
|
+
else if ( propertyName == NAME_PROPERTY ) keepAlignment &= valueFilter.check(al.Name);
|
|
118
|
+
else if ( propertyName == POSITION_PROPERTY ) keepAlignment &= valueFilter.check(al.Position);
|
|
119
|
+
else if ( propertyName == QUERYBASES_PROPERTY ) keepAlignment &= valueFilter.check(al.QueryBases);
|
|
120
|
+
else if ( propertyName == REFERENCE_PROPERTY ) {
|
|
121
|
+
BAMTOOLS_ASSERT_MESSAGE( (al.RefID>=0 && (al.RefID<(int)filterToolReferences.size())), "Invalid RefID");
|
|
122
|
+
const string& refName = filterToolReferences.at(al.RefID).RefName;
|
|
123
|
+
keepAlignment &= valueFilter.check(refName);
|
|
124
|
+
}
|
|
125
|
+
else if ( propertyName == TAG_PROPERTY ) keepAlignment &= checkAlignmentTag(valueFilter, al);
|
|
126
|
+
else BAMTOOLS_ASSERT_UNREACHABLE;
|
|
127
|
+
|
|
128
|
+
// if alignment fails at ANY point, just quit and return false
|
|
129
|
+
if ( !keepAlignment ) return false;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
BAMTOOLS_ASSERT_MESSAGE( keepAlignment, "Error in BamAlignmentChecker... keepAlignment should be true here");
|
|
133
|
+
return keepAlignment;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
bool checkAlignmentTag(const PropertyFilterValue& valueFilter, const BamAlignment& al) {
|
|
137
|
+
|
|
138
|
+
// ensure filter contains string data
|
|
139
|
+
Variant entireTagFilter = valueFilter.Value;
|
|
140
|
+
if ( !entireTagFilter.is_type<string>() ) return false;
|
|
141
|
+
|
|
142
|
+
// localize string from variant
|
|
143
|
+
const string& entireTagFilterString = entireTagFilter.get<string>();
|
|
144
|
+
|
|
145
|
+
// ensure we have at least "XX:x"
|
|
146
|
+
if ( entireTagFilterString.length() < 4 ) return false;
|
|
147
|
+
|
|
148
|
+
// get tagName & lookup in alignment
|
|
149
|
+
// if found, set tagType to tag type character
|
|
150
|
+
// if not found, return false
|
|
151
|
+
const string& tagName = entireTagFilterString.substr(0,2);
|
|
152
|
+
char tagType = '\0';
|
|
153
|
+
if ( !al.GetTagType(tagName, tagType) ) return false;
|
|
154
|
+
|
|
155
|
+
// remove tagName & ":" from beginning tagFilter
|
|
156
|
+
string tagFilterString = entireTagFilterString.substr(3);
|
|
157
|
+
|
|
158
|
+
// switch on tag type to set tag query value & parse filter token
|
|
159
|
+
int32_t intFilterValue, intQueryValue;
|
|
160
|
+
uint32_t uintFilterValue, uintQueryValue;
|
|
161
|
+
float realFilterValue, realQueryValue;
|
|
162
|
+
string stringFilterValue, stringQueryValue;
|
|
163
|
+
|
|
164
|
+
PropertyFilterValue tagFilter;
|
|
165
|
+
PropertyFilterValue::ValueCompareType compareType;
|
|
166
|
+
bool keepAlignment = false;
|
|
167
|
+
switch (tagType) {
|
|
168
|
+
|
|
169
|
+
// signed int tag type
|
|
170
|
+
case 'c' :
|
|
171
|
+
case 's' :
|
|
172
|
+
case 'i' :
|
|
173
|
+
if ( al.GetTag(tagName, intQueryValue) ) {
|
|
174
|
+
if ( FilterEngine<BamAlignmentChecker>::parseToken(tagFilterString, intFilterValue, compareType) ) {
|
|
175
|
+
tagFilter.Value = intFilterValue;
|
|
176
|
+
tagFilter.Type = compareType;
|
|
177
|
+
keepAlignment = tagFilter.check(intQueryValue);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
break;
|
|
181
|
+
|
|
182
|
+
// unsigned int tag type
|
|
183
|
+
case 'C' :
|
|
184
|
+
case 'S' :
|
|
185
|
+
case 'I' :
|
|
186
|
+
if ( al.GetTag(tagName, uintQueryValue) ) {
|
|
187
|
+
if ( FilterEngine<BamAlignmentChecker>::parseToken(tagFilterString, uintFilterValue, compareType) ) {
|
|
188
|
+
tagFilter.Value = uintFilterValue;
|
|
189
|
+
tagFilter.Type = compareType;
|
|
190
|
+
keepAlignment = tagFilter.check(uintQueryValue);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
break;
|
|
194
|
+
|
|
195
|
+
// 'real' tag type
|
|
196
|
+
case 'f' :
|
|
197
|
+
if ( al.GetTag(tagName, realQueryValue) ) {
|
|
198
|
+
if ( FilterEngine<BamAlignmentChecker>::parseToken(tagFilterString, realFilterValue, compareType) ) {
|
|
199
|
+
tagFilter.Value = realFilterValue;
|
|
200
|
+
tagFilter.Type = compareType;
|
|
201
|
+
keepAlignment = tagFilter.check(realQueryValue);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
break;
|
|
205
|
+
|
|
206
|
+
// string tag type
|
|
207
|
+
case 'A':
|
|
208
|
+
case 'Z':
|
|
209
|
+
case 'H':
|
|
210
|
+
if ( al.GetTag(tagName, stringQueryValue) ) {
|
|
211
|
+
if ( FilterEngine<BamAlignmentChecker>::parseToken(tagFilterString, stringFilterValue, compareType) ) {
|
|
212
|
+
tagFilter.Value = stringFilterValue;
|
|
213
|
+
tagFilter.Type = compareType;
|
|
214
|
+
keepAlignment = tagFilter.check(stringQueryValue);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
break;
|
|
218
|
+
|
|
219
|
+
// unknown tag type
|
|
220
|
+
default :
|
|
221
|
+
keepAlignment = false;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return keepAlignment;
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
} // namespace BamTools
|
|
229
|
+
|
|
230
|
+
// ---------------------------------------------
|
|
231
|
+
// FilterSettings implementation
|
|
232
|
+
|
|
233
|
+
struct FilterTool::FilterSettings {
|
|
234
|
+
|
|
235
|
+
// ----------------------------------
|
|
236
|
+
// IO opts
|
|
237
|
+
|
|
238
|
+
// flags
|
|
239
|
+
bool HasInputBamFilename;
|
|
240
|
+
bool HasOutputBamFilename;
|
|
241
|
+
bool HasRegion;
|
|
242
|
+
bool HasScriptFilename;
|
|
243
|
+
bool IsForceCompression;
|
|
244
|
+
|
|
245
|
+
// filenames
|
|
246
|
+
vector<string> InputFiles;
|
|
247
|
+
string OutputFilename;
|
|
248
|
+
string Region;
|
|
249
|
+
string ScriptFilename;
|
|
250
|
+
|
|
251
|
+
// -----------------------------------
|
|
252
|
+
// General filter opts
|
|
253
|
+
|
|
254
|
+
// flags
|
|
255
|
+
bool HasAlignmentFlagFilter;
|
|
256
|
+
bool HasInsertSizeFilter;
|
|
257
|
+
bool HasMapQualityFilter;
|
|
258
|
+
bool HasNameFilter;
|
|
259
|
+
bool HasQueryBasesFilter;
|
|
260
|
+
bool HasTagFilter; //(s)
|
|
261
|
+
|
|
262
|
+
// filters
|
|
263
|
+
string AlignmentFlagFilter;
|
|
264
|
+
string InsertSizeFilter;
|
|
265
|
+
string NameFilter;
|
|
266
|
+
string MapQualityFilter;
|
|
267
|
+
string QueryBasesFilter;
|
|
268
|
+
string TagFilter; // support multiple ?
|
|
269
|
+
|
|
270
|
+
// -----------------------------------
|
|
271
|
+
// AlignmentFlag filter opts
|
|
272
|
+
|
|
273
|
+
// flags
|
|
274
|
+
bool HasIsDuplicateFilter;
|
|
275
|
+
bool HasIsFailedQCFilter;
|
|
276
|
+
bool HasIsFirstMateFilter;
|
|
277
|
+
bool HasIsMappedFilter;
|
|
278
|
+
bool HasIsMateMappedFilter;
|
|
279
|
+
bool HasIsMateReverseStrandFilter;
|
|
280
|
+
bool HasIsPairedFilter;
|
|
281
|
+
bool HasIsPrimaryAlignmentFilter;
|
|
282
|
+
bool HasIsProperPairFilter;
|
|
283
|
+
bool HasIsReverseStrandFilter;
|
|
284
|
+
bool HasIsSecondMateFilter;
|
|
285
|
+
bool HasIsSingletonFilter;
|
|
286
|
+
|
|
287
|
+
// filters
|
|
288
|
+
string IsDuplicateFilter;
|
|
289
|
+
string IsFailedQCFilter;
|
|
290
|
+
string IsFirstMateFilter;
|
|
291
|
+
string IsMappedFilter;
|
|
292
|
+
string IsMateMappedFilter;
|
|
293
|
+
string IsMateReverseStrandFilter;
|
|
294
|
+
string IsPairedFilter;
|
|
295
|
+
string IsPrimaryAlignmentFilter;
|
|
296
|
+
string IsProperPairFilter;
|
|
297
|
+
string IsReverseStrandFilter;
|
|
298
|
+
string IsSecondMateFilter;
|
|
299
|
+
string IsSingletonFilter;
|
|
300
|
+
|
|
301
|
+
// ---------------------------------
|
|
302
|
+
// constructor
|
|
303
|
+
|
|
304
|
+
FilterSettings(void)
|
|
305
|
+
: HasInputBamFilename(false)
|
|
306
|
+
, HasOutputBamFilename(false)
|
|
307
|
+
, HasRegion(false)
|
|
308
|
+
, HasScriptFilename(false)
|
|
309
|
+
, IsForceCompression(false)
|
|
310
|
+
, OutputFilename(Options::StandardOut())
|
|
311
|
+
, HasAlignmentFlagFilter(false)
|
|
312
|
+
, HasInsertSizeFilter(false)
|
|
313
|
+
, HasMapQualityFilter(false)
|
|
314
|
+
, HasNameFilter(false)
|
|
315
|
+
, HasQueryBasesFilter(false)
|
|
316
|
+
, HasTagFilter(false)
|
|
317
|
+
, HasIsDuplicateFilter(false)
|
|
318
|
+
, HasIsFailedQCFilter(false)
|
|
319
|
+
, HasIsFirstMateFilter(false)
|
|
320
|
+
, HasIsMappedFilter(false)
|
|
321
|
+
, HasIsMateMappedFilter(false)
|
|
322
|
+
, HasIsMateReverseStrandFilter(false)
|
|
323
|
+
, HasIsPairedFilter(false)
|
|
324
|
+
, HasIsPrimaryAlignmentFilter(false)
|
|
325
|
+
, HasIsProperPairFilter(false)
|
|
326
|
+
, HasIsReverseStrandFilter(false)
|
|
327
|
+
, HasIsSecondMateFilter(false)
|
|
328
|
+
, HasIsSingletonFilter(false)
|
|
329
|
+
, IsDuplicateFilter(TRUE_STR)
|
|
330
|
+
, IsFailedQCFilter(TRUE_STR)
|
|
331
|
+
, IsFirstMateFilter(TRUE_STR)
|
|
332
|
+
, IsMappedFilter(TRUE_STR)
|
|
333
|
+
, IsMateMappedFilter(TRUE_STR)
|
|
334
|
+
, IsMateReverseStrandFilter(TRUE_STR)
|
|
335
|
+
, IsPairedFilter(TRUE_STR)
|
|
336
|
+
, IsPrimaryAlignmentFilter(TRUE_STR)
|
|
337
|
+
, IsProperPairFilter(TRUE_STR)
|
|
338
|
+
, IsReverseStrandFilter(TRUE_STR)
|
|
339
|
+
, IsSecondMateFilter(TRUE_STR)
|
|
340
|
+
, IsSingletonFilter(TRUE_STR)
|
|
341
|
+
{ }
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
// ---------------------------------------------
|
|
345
|
+
// FilterToolPrivate declaration
|
|
346
|
+
|
|
347
|
+
class FilterTool::FilterToolPrivate {
|
|
348
|
+
|
|
349
|
+
// ctor & dtor
|
|
350
|
+
public:
|
|
351
|
+
FilterToolPrivate(FilterTool::FilterSettings* settings);
|
|
352
|
+
~FilterToolPrivate(void);
|
|
353
|
+
|
|
354
|
+
// 'public' interface
|
|
355
|
+
public:
|
|
356
|
+
bool Run(void);
|
|
357
|
+
|
|
358
|
+
// internal methods
|
|
359
|
+
private:
|
|
360
|
+
bool AddPropertyTokensToFilter(const string& filterName, const map<string, string>& propertyTokens);
|
|
361
|
+
bool CheckAlignment(const BamAlignment& al);
|
|
362
|
+
const string GetScriptContents(void);
|
|
363
|
+
void InitProperties(void);
|
|
364
|
+
bool ParseCommandLine(void);
|
|
365
|
+
bool ParseFilterObject(const string& filterName, const Json::Value& filterObject);
|
|
366
|
+
bool ParseScript(void);
|
|
367
|
+
bool SetupFilters(void);
|
|
368
|
+
|
|
369
|
+
// data members
|
|
370
|
+
private:
|
|
371
|
+
vector<string> m_propertyNames;
|
|
372
|
+
FilterTool::FilterSettings* m_settings;
|
|
373
|
+
FilterEngine<BamAlignmentChecker> m_filterEngine;
|
|
374
|
+
};
|
|
375
|
+
|
|
376
|
+
// ---------------------------------------------
|
|
377
|
+
// FilterToolPrivate implementation
|
|
378
|
+
|
|
379
|
+
// constructor
|
|
380
|
+
FilterTool::FilterToolPrivate::FilterToolPrivate(FilterTool::FilterSettings* settings)
|
|
381
|
+
: m_settings(settings)
|
|
382
|
+
{ }
|
|
383
|
+
|
|
384
|
+
// destructor
|
|
385
|
+
FilterTool::FilterToolPrivate::~FilterToolPrivate(void) { }
|
|
386
|
+
|
|
387
|
+
bool FilterTool::FilterToolPrivate::AddPropertyTokensToFilter(const string& filterName,
|
|
388
|
+
const map<string,
|
|
389
|
+
string>& propertyTokens)
|
|
390
|
+
{
|
|
391
|
+
// dummy temp values for token parsing
|
|
392
|
+
bool boolValue;
|
|
393
|
+
int32_t int32Value;
|
|
394
|
+
uint16_t uint16Value;
|
|
395
|
+
uint32_t uint32Value;
|
|
396
|
+
string stringValue;
|
|
397
|
+
PropertyFilterValue::ValueCompareType type;
|
|
398
|
+
|
|
399
|
+
// iterate over property token map
|
|
400
|
+
map<string, string>::const_iterator mapIter = propertyTokens.begin();
|
|
401
|
+
map<string, string>::const_iterator mapEnd = propertyTokens.end();
|
|
402
|
+
for ( ; mapIter != mapEnd; ++mapIter ) {
|
|
403
|
+
|
|
404
|
+
const string& propertyName = (*mapIter).first;
|
|
405
|
+
const string& token = (*mapIter).second;
|
|
406
|
+
|
|
407
|
+
// ------------------------------
|
|
408
|
+
// convert token to value & compare type
|
|
409
|
+
// then add to filter engine
|
|
410
|
+
|
|
411
|
+
// bool conversion
|
|
412
|
+
if ( propertyName == ISDUPLICATE_PROPERTY ||
|
|
413
|
+
propertyName == ISFAILEDQC_PROPERTY ||
|
|
414
|
+
propertyName == ISFIRSTMATE_PROPERTY ||
|
|
415
|
+
propertyName == ISMAPPED_PROPERTY ||
|
|
416
|
+
propertyName == ISMATEMAPPED_PROPERTY ||
|
|
417
|
+
propertyName == ISMATEREVERSESTRAND_PROPERTY ||
|
|
418
|
+
propertyName == ISPAIRED_PROPERTY ||
|
|
419
|
+
propertyName == ISPRIMARYALIGNMENT_PROPERTY ||
|
|
420
|
+
propertyName == ISPROPERPAIR_PROPERTY ||
|
|
421
|
+
propertyName == ISREVERSESTRAND_PROPERTY ||
|
|
422
|
+
propertyName == ISSECONDMATE_PROPERTY ||
|
|
423
|
+
propertyName == ISSINGLETON_PROPERTY
|
|
424
|
+
)
|
|
425
|
+
{
|
|
426
|
+
FilterEngine<BamAlignmentChecker>::parseToken(token, boolValue, type);
|
|
427
|
+
m_filterEngine.setProperty(filterName, propertyName, boolValue, type);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// int32_t conversion
|
|
431
|
+
else if ( propertyName == INSERTSIZE_PROPERTY ||
|
|
432
|
+
propertyName == MATEPOSITION_PROPERTY ||
|
|
433
|
+
propertyName == POSITION_PROPERTY
|
|
434
|
+
)
|
|
435
|
+
{
|
|
436
|
+
FilterEngine<BamAlignmentChecker>::parseToken(token, int32Value, type);
|
|
437
|
+
m_filterEngine.setProperty(filterName, propertyName, int32Value, type);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// uint16_t conversion
|
|
441
|
+
else if ( propertyName == MAPQUALITY_PROPERTY )
|
|
442
|
+
{
|
|
443
|
+
FilterEngine<BamAlignmentChecker>::parseToken(token, uint16Value, type);
|
|
444
|
+
m_filterEngine.setProperty(filterName, propertyName, uint16Value, type);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// uint32_t conversion
|
|
448
|
+
else if ( propertyName == ALIGNMENTFLAG_PROPERTY )
|
|
449
|
+
{
|
|
450
|
+
FilterEngine<BamAlignmentChecker>::parseToken(token, uint32Value, type);
|
|
451
|
+
m_filterEngine.setProperty(filterName, propertyName, uint32Value, type);
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// string conversion
|
|
455
|
+
else if ( propertyName == CIGAR_PROPERTY ||
|
|
456
|
+
propertyName == MATEREFERENCE_PROPERTY ||
|
|
457
|
+
propertyName == NAME_PROPERTY ||
|
|
458
|
+
propertyName == QUERYBASES_PROPERTY ||
|
|
459
|
+
propertyName == REFERENCE_PROPERTY
|
|
460
|
+
)
|
|
461
|
+
{
|
|
462
|
+
FilterEngine<BamAlignmentChecker>::parseToken(token, stringValue, type);
|
|
463
|
+
m_filterEngine.setProperty(filterName, propertyName, stringValue, type);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
else if ( propertyName == TAG_PROPERTY ) {
|
|
467
|
+
// this will be stored directly as the TAG:VALUE token
|
|
468
|
+
// (VALUE may contain compare ops, will be parsed out later)
|
|
469
|
+
m_filterEngine.setProperty(filterName, propertyName, token, PropertyFilterValue::EXACT);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// else unknown property
|
|
473
|
+
else {
|
|
474
|
+
cerr << "bamtools filter ERROR: unknown property - " << propertyName << endl;
|
|
475
|
+
return false;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
return true;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
bool FilterTool::FilterToolPrivate::CheckAlignment(const BamAlignment& al) {
|
|
482
|
+
return m_filterEngine.check(al);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
const string FilterTool::FilterToolPrivate::GetScriptContents(void) {
|
|
486
|
+
|
|
487
|
+
// open script for reading
|
|
488
|
+
FILE* inFile = fopen(m_settings->ScriptFilename.c_str(), "rb");
|
|
489
|
+
if ( !inFile ) {
|
|
490
|
+
cerr << "bamtools filter ERROR: could not open script: "
|
|
491
|
+
<< m_settings->ScriptFilename << " for reading" << endl;
|
|
492
|
+
return false;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// read in entire script contents
|
|
496
|
+
char buffer[1024];
|
|
497
|
+
ostringstream docStream("");
|
|
498
|
+
while ( true ) {
|
|
499
|
+
|
|
500
|
+
// peek ahead, make sure there is data available
|
|
501
|
+
char ch = fgetc(inFile);
|
|
502
|
+
ungetc(ch, inFile);
|
|
503
|
+
if( feof(inFile) ) break;
|
|
504
|
+
|
|
505
|
+
// read next block of data
|
|
506
|
+
if ( fgets(buffer, 1024, inFile) == 0 ) {
|
|
507
|
+
cerr << "bamtools filter ERROR: could not read script contents" << endl;
|
|
508
|
+
return false;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
docStream << buffer;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// close script file
|
|
515
|
+
fclose(inFile);
|
|
516
|
+
|
|
517
|
+
// import buffer contents to document, return
|
|
518
|
+
string document = docStream.str();
|
|
519
|
+
return document;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
void FilterTool::FilterToolPrivate::InitProperties(void) {
|
|
523
|
+
|
|
524
|
+
// store property names in vector
|
|
525
|
+
m_propertyNames.push_back(ALIGNMENTFLAG_PROPERTY);
|
|
526
|
+
m_propertyNames.push_back(CIGAR_PROPERTY);
|
|
527
|
+
m_propertyNames.push_back(INSERTSIZE_PROPERTY);
|
|
528
|
+
m_propertyNames.push_back(ISDUPLICATE_PROPERTY);
|
|
529
|
+
m_propertyNames.push_back(ISFAILEDQC_PROPERTY);
|
|
530
|
+
m_propertyNames.push_back(ISFIRSTMATE_PROPERTY);
|
|
531
|
+
m_propertyNames.push_back(ISMAPPED_PROPERTY);
|
|
532
|
+
m_propertyNames.push_back(ISMATEMAPPED_PROPERTY);
|
|
533
|
+
m_propertyNames.push_back(ISMATEREVERSESTRAND_PROPERTY);
|
|
534
|
+
m_propertyNames.push_back(ISPAIRED_PROPERTY);
|
|
535
|
+
m_propertyNames.push_back(ISPRIMARYALIGNMENT_PROPERTY);
|
|
536
|
+
m_propertyNames.push_back(ISPROPERPAIR_PROPERTY);
|
|
537
|
+
m_propertyNames.push_back(ISREVERSESTRAND_PROPERTY);
|
|
538
|
+
m_propertyNames.push_back(ISSECONDMATE_PROPERTY);
|
|
539
|
+
m_propertyNames.push_back(ISSINGLETON_PROPERTY);
|
|
540
|
+
m_propertyNames.push_back(MAPQUALITY_PROPERTY);
|
|
541
|
+
m_propertyNames.push_back(MATEPOSITION_PROPERTY);
|
|
542
|
+
m_propertyNames.push_back(MATEREFERENCE_PROPERTY);
|
|
543
|
+
m_propertyNames.push_back(NAME_PROPERTY);
|
|
544
|
+
m_propertyNames.push_back(POSITION_PROPERTY);
|
|
545
|
+
m_propertyNames.push_back(QUERYBASES_PROPERTY);
|
|
546
|
+
m_propertyNames.push_back(REFERENCE_PROPERTY);
|
|
547
|
+
m_propertyNames.push_back(TAG_PROPERTY);
|
|
548
|
+
|
|
549
|
+
// add vector contents to FilterEngine<BamAlignmentChecker>
|
|
550
|
+
vector<string>::const_iterator propertyNameIter = m_propertyNames.begin();
|
|
551
|
+
vector<string>::const_iterator propertyNameEnd = m_propertyNames.end();
|
|
552
|
+
for ( ; propertyNameIter != propertyNameEnd; ++propertyNameIter )
|
|
553
|
+
m_filterEngine.addProperty((*propertyNameIter));
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
bool FilterTool::FilterToolPrivate::ParseCommandLine(void) {
|
|
557
|
+
|
|
558
|
+
// add a rule set to filter engine
|
|
559
|
+
const string CMD = "COMMAND_LINE";
|
|
560
|
+
m_filterEngine.addFilter(CMD);
|
|
561
|
+
|
|
562
|
+
// map property names to command line args
|
|
563
|
+
map<string, string> propertyTokens;
|
|
564
|
+
if ( m_settings->HasAlignmentFlagFilter ) propertyTokens.insert( make_pair(ALIGNMENTFLAG_PROPERTY, m_settings->AlignmentFlagFilter) );
|
|
565
|
+
if ( m_settings->HasInsertSizeFilter ) propertyTokens.insert( make_pair(INSERTSIZE_PROPERTY, m_settings->InsertSizeFilter) );
|
|
566
|
+
if ( m_settings->HasIsDuplicateFilter ) propertyTokens.insert( make_pair(ISDUPLICATE_PROPERTY, m_settings->IsDuplicateFilter) );
|
|
567
|
+
if ( m_settings->HasIsFailedQCFilter ) propertyTokens.insert( make_pair(ISFAILEDQC_PROPERTY, m_settings->IsFailedQCFilter) );
|
|
568
|
+
if ( m_settings->HasIsFirstMateFilter ) propertyTokens.insert( make_pair(ISFIRSTMATE_PROPERTY, m_settings->IsFirstMateFilter) );
|
|
569
|
+
if ( m_settings->HasIsMappedFilter ) propertyTokens.insert( make_pair(ISMAPPED_PROPERTY, m_settings->IsMappedFilter) );
|
|
570
|
+
if ( m_settings->HasIsMateMappedFilter ) propertyTokens.insert( make_pair(ISMATEMAPPED_PROPERTY, m_settings->IsMateMappedFilter) );
|
|
571
|
+
if ( m_settings->HasIsMateReverseStrandFilter ) propertyTokens.insert( make_pair(ISMATEREVERSESTRAND_PROPERTY, m_settings->IsMateReverseStrandFilter) );
|
|
572
|
+
if ( m_settings->HasIsPairedFilter ) propertyTokens.insert( make_pair(ISPAIRED_PROPERTY, m_settings->IsPairedFilter) );
|
|
573
|
+
if ( m_settings->HasIsPrimaryAlignmentFilter ) propertyTokens.insert( make_pair(ISPRIMARYALIGNMENT_PROPERTY, m_settings->IsPrimaryAlignmentFilter) );
|
|
574
|
+
if ( m_settings->HasIsProperPairFilter ) propertyTokens.insert( make_pair(ISPROPERPAIR_PROPERTY, m_settings->IsProperPairFilter) );
|
|
575
|
+
if ( m_settings->HasIsReverseStrandFilter ) propertyTokens.insert( make_pair(ISREVERSESTRAND_PROPERTY, m_settings->IsReverseStrandFilter) );
|
|
576
|
+
if ( m_settings->HasIsSecondMateFilter ) propertyTokens.insert( make_pair(ISSECONDMATE_PROPERTY, m_settings->IsSecondMateFilter) );
|
|
577
|
+
if ( m_settings->HasIsSingletonFilter ) propertyTokens.insert( make_pair(ISSINGLETON_PROPERTY, m_settings->IsSingletonFilter) );
|
|
578
|
+
if ( m_settings->HasMapQualityFilter ) propertyTokens.insert( make_pair(MAPQUALITY_PROPERTY, m_settings->MapQualityFilter) );
|
|
579
|
+
if ( m_settings->HasNameFilter ) propertyTokens.insert( make_pair(NAME_PROPERTY, m_settings->NameFilter) );
|
|
580
|
+
if ( m_settings->HasQueryBasesFilter ) propertyTokens.insert( make_pair(QUERYBASES_PROPERTY, m_settings->QueryBasesFilter) );
|
|
581
|
+
if ( m_settings->HasTagFilter ) propertyTokens.insert( make_pair(TAG_PROPERTY, m_settings->TagFilter) );
|
|
582
|
+
|
|
583
|
+
// send add these properties to filter set "COMMAND_LINE"
|
|
584
|
+
return AddPropertyTokensToFilter(CMD, propertyTokens);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
bool FilterTool::FilterToolPrivate::ParseFilterObject(const string& filterName, const Json::Value& filterObject) {
|
|
588
|
+
|
|
589
|
+
// filter object parsing variables
|
|
590
|
+
Json::Value null(Json::nullValue);
|
|
591
|
+
Json::Value propertyValue;
|
|
592
|
+
|
|
593
|
+
// store results
|
|
594
|
+
map<string, string> propertyTokens;
|
|
595
|
+
|
|
596
|
+
// iterate over known properties
|
|
597
|
+
vector<string>::const_iterator propertyNameIter = m_propertyNames.begin();
|
|
598
|
+
vector<string>::const_iterator propertyNameEnd = m_propertyNames.end();
|
|
599
|
+
for ( ; propertyNameIter != propertyNameEnd; ++propertyNameIter ) {
|
|
600
|
+
const string& propertyName = (*propertyNameIter);
|
|
601
|
+
|
|
602
|
+
// if property defined in filter, add to token list
|
|
603
|
+
propertyValue = filterObject.get(propertyName, null);
|
|
604
|
+
if ( propertyValue != null )
|
|
605
|
+
propertyTokens.insert( make_pair(propertyName, propertyValue.asString()) );
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
// add this filter to engin
|
|
609
|
+
m_filterEngine.addFilter(filterName);
|
|
610
|
+
|
|
611
|
+
// add token list to this filter
|
|
612
|
+
return AddPropertyTokensToFilter(filterName, propertyTokens);
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
bool FilterTool::FilterToolPrivate::ParseScript(void) {
|
|
616
|
+
|
|
617
|
+
// read in script contents from file
|
|
618
|
+
const string document = GetScriptContents();
|
|
619
|
+
|
|
620
|
+
// set up JsonCPP reader and attempt to parse script
|
|
621
|
+
Json::Value root;
|
|
622
|
+
Json::Reader reader;
|
|
623
|
+
if ( !reader.parse(document, root) ) {
|
|
624
|
+
// use built-in error reporting mechanism to alert user what was wrong with the script
|
|
625
|
+
cerr << "bamtools filter ERROR: failed to parse script - see error message(s) below" << endl
|
|
626
|
+
<< reader.getFormatedErrorMessages();
|
|
627
|
+
return false;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
// initialize return status
|
|
631
|
+
bool success = true;
|
|
632
|
+
|
|
633
|
+
// see if root object contains multiple filters
|
|
634
|
+
const Json::Value filters = root["filters"];
|
|
635
|
+
if ( !filters.isNull() ) {
|
|
636
|
+
|
|
637
|
+
// iterate over any filters found
|
|
638
|
+
int filterIndex = 0;
|
|
639
|
+
Json::Value::const_iterator filtersIter = filters.begin();
|
|
640
|
+
Json::Value::const_iterator filtersEnd = filters.end();
|
|
641
|
+
for ( ; filtersIter != filtersEnd; ++filtersIter, ++filterIndex ) {
|
|
642
|
+
Json::Value filter = (*filtersIter);
|
|
643
|
+
|
|
644
|
+
// convert filter index to string
|
|
645
|
+
string filterName;
|
|
646
|
+
|
|
647
|
+
// if id tag supplied
|
|
648
|
+
const Json::Value id = filter["id"];
|
|
649
|
+
if ( !id.isNull() )
|
|
650
|
+
filterName = id.asString();
|
|
651
|
+
|
|
652
|
+
// use array index
|
|
653
|
+
else {
|
|
654
|
+
stringstream convert;
|
|
655
|
+
convert << filterIndex;
|
|
656
|
+
filterName = convert.str();
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
// create & parse filter
|
|
660
|
+
success &= ParseFilterObject(filterName, filter);
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
// see if user defined a "rule" for these filters
|
|
664
|
+
// otherwise, use filter engine's default rule behavior
|
|
665
|
+
string ruleString("");
|
|
666
|
+
const Json::Value rule = root["rule"];
|
|
667
|
+
if ( rule.isString() )
|
|
668
|
+
ruleString = rule.asString();
|
|
669
|
+
m_filterEngine.setRule(ruleString);
|
|
670
|
+
|
|
671
|
+
// return success/fail
|
|
672
|
+
return success;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
// otherwise, root is the only filter (just contains properties)
|
|
676
|
+
// create & parse filter named "ROOT"
|
|
677
|
+
else success = ParseFilterObject("ROOT", root);
|
|
678
|
+
|
|
679
|
+
// return success/failure
|
|
680
|
+
return success;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
bool FilterTool::FilterToolPrivate::Run(void) {
|
|
684
|
+
|
|
685
|
+
// set to default input if none provided
|
|
686
|
+
if ( !m_settings->HasInputBamFilename )
|
|
687
|
+
m_settings->InputFiles.push_back(Options::StandardIn());
|
|
688
|
+
|
|
689
|
+
// initialize defined properties & user-specified filters
|
|
690
|
+
// quit if failed
|
|
691
|
+
if ( !SetupFilters() ) return false;
|
|
692
|
+
|
|
693
|
+
// open reader without index
|
|
694
|
+
BamMultiReader reader;
|
|
695
|
+
if ( !reader.Open(m_settings->InputFiles) ) {
|
|
696
|
+
cerr << "bamtools filter ERROR: could not open input files for reading." << endl;
|
|
697
|
+
return false;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
// retrieve reader header & reference data
|
|
701
|
+
const string headerText = reader.GetHeaderText();
|
|
702
|
+
filterToolReferences = reader.GetReferenceData();
|
|
703
|
+
|
|
704
|
+
// determine compression mode for BamWriter
|
|
705
|
+
bool writeUncompressed = ( m_settings->OutputFilename == Options::StandardOut() &&
|
|
706
|
+
!m_settings->IsForceCompression );
|
|
707
|
+
BamWriter::CompressionMode compressionMode = BamWriter::Compressed;
|
|
708
|
+
if ( writeUncompressed ) compressionMode = BamWriter::Uncompressed;
|
|
709
|
+
|
|
710
|
+
// open BamWriter
|
|
711
|
+
BamWriter writer;
|
|
712
|
+
writer.SetCompressionMode(compressionMode);
|
|
713
|
+
if ( !writer.Open(m_settings->OutputFilename, headerText, filterToolReferences) ) {
|
|
714
|
+
cerr << "bamtools filter ERROR: could not open " << m_settings->OutputFilename << " for writing." << endl;
|
|
715
|
+
reader.Close();
|
|
716
|
+
return false;
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
// if no region specified, filter entire file
|
|
720
|
+
BamAlignment al;
|
|
721
|
+
if ( !m_settings->HasRegion ) {
|
|
722
|
+
while ( reader.GetNextAlignment(al) ) {
|
|
723
|
+
if ( CheckAlignment(al) )
|
|
724
|
+
writer.SaveAlignment(al);
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
// otherwise attempt to use region as constraint
|
|
729
|
+
else {
|
|
730
|
+
|
|
731
|
+
// if region string parses OK
|
|
732
|
+
BamRegion region;
|
|
733
|
+
if ( Utilities::ParseRegionString(m_settings->Region, reader, region) ) {
|
|
734
|
+
|
|
735
|
+
// attempt to find index files
|
|
736
|
+
reader.LocateIndexes();
|
|
737
|
+
|
|
738
|
+
// if index data available for all BAM files, we can use SetRegion
|
|
739
|
+
if ( reader.HasIndexes() ) {
|
|
740
|
+
|
|
741
|
+
// attempt to use SetRegion(), if failed report error
|
|
742
|
+
if ( !reader.SetRegion(region.LeftRefID, region.LeftPosition, region.RightRefID, region.RightPosition) ) {
|
|
743
|
+
cerr << "bamtools filter ERROR: set region failed. Check that REGION describes a valid range" << endl;
|
|
744
|
+
reader.Close();
|
|
745
|
+
return false;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
// everything checks out, just iterate through specified region, filtering alignments
|
|
749
|
+
while ( reader.GetNextAlignment(al) )
|
|
750
|
+
if ( CheckAlignment(al) )
|
|
751
|
+
writer.SaveAlignment(al);
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
// no index data available, we have to iterate through until we
|
|
755
|
+
// find overlapping alignments
|
|
756
|
+
else {
|
|
757
|
+
while ( reader.GetNextAlignment(al) ) {
|
|
758
|
+
if ( (al.RefID >= region.LeftRefID) && ((al.Position + al.Length) >= region.LeftPosition) &&
|
|
759
|
+
(al.RefID <= region.RightRefID) && ( al.Position <= region.RightPosition) )
|
|
760
|
+
{
|
|
761
|
+
if ( CheckAlignment(al) )
|
|
762
|
+
writer.SaveAlignment(al);
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
// error parsing REGION string
|
|
769
|
+
else {
|
|
770
|
+
cerr << "bamtools filter ERROR: could not parse REGION: " << m_settings->Region << endl;
|
|
771
|
+
cerr << "Check that REGION is in valid format (see documentation) and that the coordinates are valid"
|
|
772
|
+
<< endl;
|
|
773
|
+
reader.Close();
|
|
774
|
+
return false;
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
// clean up & exit
|
|
779
|
+
reader.Close();
|
|
780
|
+
writer.Close();
|
|
781
|
+
return true;
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
bool FilterTool::FilterToolPrivate::SetupFilters(void) {
|
|
785
|
+
|
|
786
|
+
// set up filter engine with supported properties
|
|
787
|
+
InitProperties();
|
|
788
|
+
|
|
789
|
+
// parse script for filter rules, if given
|
|
790
|
+
if ( m_settings->HasScriptFilename )
|
|
791
|
+
return ParseScript();
|
|
792
|
+
|
|
793
|
+
// otherwise check command line for filters
|
|
794
|
+
else return ParseCommandLine();
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
// ---------------------------------------------
|
|
798
|
+
// FilterTool implementation
|
|
799
|
+
|
|
800
|
+
FilterTool::FilterTool(void)
|
|
801
|
+
: AbstractTool()
|
|
802
|
+
, m_settings(new FilterSettings)
|
|
803
|
+
, m_impl(0)
|
|
804
|
+
{
|
|
805
|
+
// ----------------------------------
|
|
806
|
+
// set program details
|
|
807
|
+
|
|
808
|
+
const string usage = "[-in <filename> -in <filename> ...] "
|
|
809
|
+
"[-out <filename> | [-forceCompression]] [-region <REGION>] "
|
|
810
|
+
"[ [-script <filename] | [filterOptions] ]";
|
|
811
|
+
Options::SetProgramInfo("bamtools filter", "filters BAM file(s)", usage );
|
|
812
|
+
|
|
813
|
+
// ----------------------------------
|
|
814
|
+
// I/O options
|
|
815
|
+
|
|
816
|
+
OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
|
|
817
|
+
|
|
818
|
+
const string inDesc = "the input BAM file(s)";
|
|
819
|
+
const string outDesc = "the output BAM file";
|
|
820
|
+
const string regionDesc = "only read data from this genomic region (see documentation for more details)";
|
|
821
|
+
const string scriptDesc = "the filter script file (see documentation for more details)";
|
|
822
|
+
const string forceDesc = "if results are sent to stdout (like when piping to another tool), "
|
|
823
|
+
"default behavior is to leave output uncompressed. Use this flag to "
|
|
824
|
+
"override and force compression";
|
|
825
|
+
|
|
826
|
+
Options::AddValueOption("-in", "BAM filename", inDesc, "", m_settings->HasInputBamFilename, m_settings->InputFiles, IO_Opts, Options::StandardIn());
|
|
827
|
+
Options::AddValueOption("-out", "BAM filename", outDesc, "", m_settings->HasOutputBamFilename, m_settings->OutputFilename, IO_Opts, Options::StandardOut());
|
|
828
|
+
Options::AddValueOption("-region", "REGION", regionDesc, "", m_settings->HasRegion, m_settings->Region, IO_Opts);
|
|
829
|
+
Options::AddValueOption("-script", "filename", scriptDesc, "", m_settings->HasScriptFilename, m_settings->ScriptFilename, IO_Opts);
|
|
830
|
+
Options::AddOption("-forceCompression",forceDesc, m_settings->IsForceCompression, IO_Opts);
|
|
831
|
+
|
|
832
|
+
// ----------------------------------
|
|
833
|
+
// general filter options
|
|
834
|
+
|
|
835
|
+
OptionGroup* FilterOpts = Options::CreateOptionGroup("General Filters");
|
|
836
|
+
|
|
837
|
+
const string flagDesc = "keep reads with this *exact* alignment flag (for more detailed queries, see below)";
|
|
838
|
+
const string insertDesc = "keep reads with insert size that matches pattern";
|
|
839
|
+
const string mapQualDesc = "keep reads with map quality that matches pattern";
|
|
840
|
+
const string nameDesc = "keep reads with name that matches pattern";
|
|
841
|
+
const string queryDesc = "keep reads with motif that matches pattern";
|
|
842
|
+
const string tagDesc = "keep reads with this key=>value pair";
|
|
843
|
+
|
|
844
|
+
Options::AddValueOption("-alignmentFlag", "int", flagDesc, "", m_settings->HasAlignmentFlagFilter, m_settings->AlignmentFlagFilter, FilterOpts);
|
|
845
|
+
Options::AddValueOption("-insertSize", "int", insertDesc, "", m_settings->HasInsertSizeFilter, m_settings->InsertSizeFilter, FilterOpts);
|
|
846
|
+
Options::AddValueOption("-mapQuality", "[0-255]", mapQualDesc, "", m_settings->HasMapQualityFilter, m_settings->MapQualityFilter, FilterOpts);
|
|
847
|
+
Options::AddValueOption("-name", "string", nameDesc, "", m_settings->HasNameFilter, m_settings->NameFilter, FilterOpts);
|
|
848
|
+
Options::AddValueOption("-queryBases", "string", queryDesc, "", m_settings->HasQueryBasesFilter, m_settings->QueryBasesFilter, FilterOpts);
|
|
849
|
+
Options::AddValueOption("-tag", "TAG:VALUE", tagDesc, "", m_settings->HasTagFilter, m_settings->TagFilter, FilterOpts);
|
|
850
|
+
|
|
851
|
+
// ----------------------------------
|
|
852
|
+
// alignment flag filter options
|
|
853
|
+
|
|
854
|
+
OptionGroup* AlignmentFlagOpts = Options::CreateOptionGroup("Alignment Flag Filters");
|
|
855
|
+
|
|
856
|
+
const string boolArg = "true/false";
|
|
857
|
+
const string isDupDesc = "keep only alignments that are marked as duplicate?";
|
|
858
|
+
const string isFailQcDesc = "keep only alignments that failed QC?";
|
|
859
|
+
const string isFirstMateDesc = "keep only alignments marked as first mate?";
|
|
860
|
+
const string isMappedDesc = "keep only alignments that were mapped?";
|
|
861
|
+
const string isMateMappedDesc = "keep only alignments with mates that mapped";
|
|
862
|
+
const string isMateReverseDesc = "keep only alignments with mate on reverese strand?";
|
|
863
|
+
const string isPairedDesc = "keep only alignments that were sequenced as paired?";
|
|
864
|
+
const string isPrimaryDesc = "keep only alignments marked as primary?";
|
|
865
|
+
const string isProperPairDesc = "keep only alignments that passed PE resolution?";
|
|
866
|
+
const string isReverseDesc = "keep only alignments on reverse strand?";
|
|
867
|
+
const string isSecondMateDesc = "keep only alignments marked as second mate?";
|
|
868
|
+
const string isSingletonDesc = "keep only singletons";
|
|
869
|
+
|
|
870
|
+
Options::AddValueOption("-isDuplicate", boolArg, isDupDesc, "", m_settings->HasIsDuplicateFilter, m_settings->IsDuplicateFilter, AlignmentFlagOpts, TRUE_STR);
|
|
871
|
+
Options::AddValueOption("-isFailedQC", boolArg, isFailQcDesc, "", m_settings->HasIsFailedQCFilter, m_settings->IsFailedQCFilter, AlignmentFlagOpts, TRUE_STR);
|
|
872
|
+
Options::AddValueOption("-isFirstMate", boolArg, isFirstMateDesc, "", m_settings->HasIsFirstMateFilter, m_settings->IsFirstMateFilter, AlignmentFlagOpts, TRUE_STR);
|
|
873
|
+
Options::AddValueOption("-isMapped", boolArg, isMappedDesc, "", m_settings->HasIsMappedFilter, m_settings->IsMappedFilter, AlignmentFlagOpts, TRUE_STR);
|
|
874
|
+
Options::AddValueOption("-isMateMapped", boolArg, isMateMappedDesc, "", m_settings->HasIsMateMappedFilter, m_settings->IsMateMappedFilter, AlignmentFlagOpts, TRUE_STR);
|
|
875
|
+
Options::AddValueOption("-isMateReverseStrand", boolArg, isMateReverseDesc, "", m_settings->HasIsMateReverseStrandFilter, m_settings->IsMateReverseStrandFilter, AlignmentFlagOpts, TRUE_STR);
|
|
876
|
+
Options::AddValueOption("-isPaired", boolArg, isPairedDesc, "", m_settings->HasIsPairedFilter, m_settings->IsPairedFilter, AlignmentFlagOpts, TRUE_STR);
|
|
877
|
+
Options::AddValueOption("-isPrimaryAlignment", boolArg, isPrimaryDesc, "", m_settings->HasIsPrimaryAlignmentFilter, m_settings->IsPrimaryAlignmentFilter, AlignmentFlagOpts, TRUE_STR);
|
|
878
|
+
Options::AddValueOption("-isProperPair", boolArg, isProperPairDesc, "", m_settings->HasIsProperPairFilter, m_settings->IsProperPairFilter, AlignmentFlagOpts, TRUE_STR);
|
|
879
|
+
Options::AddValueOption("-isReverseStrand", boolArg, isReverseDesc, "", m_settings->HasIsReverseStrandFilter, m_settings->IsReverseStrandFilter, AlignmentFlagOpts, TRUE_STR);
|
|
880
|
+
Options::AddValueOption("-isSecondMate", boolArg, isSecondMateDesc, "", m_settings->HasIsSecondMateFilter, m_settings->IsSecondMateFilter, AlignmentFlagOpts, TRUE_STR);
|
|
881
|
+
Options::AddValueOption("-isSingleton", boolArg, isSingletonDesc, "", m_settings->HasIsSingletonFilter, m_settings->IsSingletonFilter, AlignmentFlagOpts, TRUE_STR);
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
FilterTool::~FilterTool(void) {
|
|
885
|
+
|
|
886
|
+
delete m_settings;
|
|
887
|
+
m_settings = 0;
|
|
888
|
+
|
|
889
|
+
delete m_impl;
|
|
890
|
+
m_impl = 0;
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
int FilterTool::Help(void) {
|
|
894
|
+
Options::DisplayHelp();
|
|
895
|
+
return 0;
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
int FilterTool::Run(int argc, char* argv[]) {
|
|
899
|
+
|
|
900
|
+
// parse command line arguments
|
|
901
|
+
Options::Parse(argc, argv, 1);
|
|
902
|
+
|
|
903
|
+
// initialize FilterTool with settings
|
|
904
|
+
m_impl = new FilterToolPrivate(m_settings);
|
|
905
|
+
|
|
906
|
+
// run FilterTool, return success/fail
|
|
907
|
+
if ( m_impl->Run() )
|
|
908
|
+
return 0;
|
|
909
|
+
else
|
|
910
|
+
return 1;
|
|
911
|
+
}
|