sequenceserver 1.0.0.pre.2 → 1.0.0.pre.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/README.md +18 -4
- data/bin/sequenceserver +219 -124
- data/lib/sequenceserver.rb +156 -153
- data/lib/sequenceserver/blast.rb +163 -432
- data/lib/sequenceserver/blast/exceptions.rb +27 -0
- data/lib/sequenceserver/blast/hit.rb +32 -0
- data/lib/sequenceserver/blast/hsp.rb +260 -0
- data/lib/sequenceserver/blast/query.rb +28 -0
- data/lib/sequenceserver/blast/report.rb +123 -0
- data/lib/sequenceserver/config.rb +94 -0
- data/lib/sequenceserver/database.rb +89 -49
- data/lib/sequenceserver/exceptions.rb +154 -0
- data/lib/sequenceserver/links.rb +1 -1
- data/lib/sequenceserver/logger.rb +5 -7
- data/lib/sequenceserver/sequence.rb +40 -39
- data/public/css/bootstrap.min.css +5 -7
- data/public/css/custom.css +28 -27
- data/public/dist/css/sequenceserver.min.css +1 -0
- data/public/dist/css/sequenceserver.min.css.gz +0 -0
- data/public/dist/fonts/FontAwesome.otf +0 -0
- data/public/dist/fonts/fontawesome-webfont.eot +0 -0
- data/public/dist/fonts/fontawesome-webfont.svg +565 -0
- data/public/dist/fonts/fontawesome-webfont.ttf +0 -0
- data/public/dist/fonts/fontawesome-webfont.woff +0 -0
- data/public/dist/fonts/fontawesome-webfont.woff2 +0 -0
- data/public/dist/js/sequenceserver.min.js +12 -0
- data/public/dist/js/sequenceserver.min.js.gz +0 -0
- data/public/dist/js/shims/FlashCanvas/canvas2png.js +1 -0
- data/public/dist/js/shims/FlashCanvas/flashcanvas.js +1 -0
- data/public/dist/js/shims/FlashCanvas/flashcanvas.swf +0 -0
- data/public/dist/js/shims/FlashCanvasPro/canvas2png.js +1 -0
- data/public/dist/js/shims/FlashCanvasPro/flash10canvas.swf +0 -0
- data/public/dist/js/shims/FlashCanvasPro/flash9canvas.swf +0 -0
- data/public/dist/js/shims/FlashCanvasPro/flashcanvas.js +1 -0
- data/public/dist/js/shims/canvas-blob.js +1 -0
- data/public/dist/js/shims/color-picker.js +2 -0
- data/public/dist/js/shims/combos/1.js +6 -0
- data/public/dist/js/shims/combos/10.js +2 -0
- data/public/dist/js/shims/combos/11.js +2 -0
- data/public/dist/js/shims/combos/12.js +6 -0
- data/public/dist/js/shims/combos/13.js +1 -0
- data/public/dist/js/shims/combos/14.js +1 -0
- data/public/dist/js/shims/combos/15.js +2 -0
- data/public/dist/js/shims/combos/16.js +7 -0
- data/public/dist/js/shims/combos/17.js +2 -0
- data/public/dist/js/shims/combos/18.js +3 -0
- data/public/dist/js/shims/combos/2.js +7 -0
- data/public/dist/js/shims/combos/21.js +2 -0
- data/public/dist/js/shims/combos/22.js +1 -0
- data/public/dist/js/shims/combos/23.js +6 -0
- data/public/dist/js/shims/combos/25.js +2 -0
- data/public/dist/js/shims/combos/27.js +1 -0
- data/public/dist/js/shims/combos/28.js +1 -0
- data/public/dist/js/shims/combos/29.js +1 -0
- data/public/dist/js/shims/combos/3.js +1 -0
- data/public/dist/js/shims/combos/30.js +2 -0
- data/public/dist/js/shims/combos/31.js +1 -0
- data/public/dist/js/shims/combos/33.js +1 -0
- data/public/dist/js/shims/combos/34.js +1 -0
- data/public/dist/js/shims/combos/4.js +1 -0
- data/public/dist/js/shims/combos/5.js +2 -0
- data/public/dist/js/shims/combos/6.js +2 -0
- data/public/dist/js/shims/combos/7.js +7 -0
- data/public/dist/js/shims/combos/8.js +7 -0
- data/public/dist/js/shims/combos/9.js +2 -0
- data/public/dist/js/shims/combos/97.js +1 -0
- data/public/dist/js/shims/combos/98.js +1 -0
- data/public/dist/js/shims/combos/99.js +1 -0
- data/public/dist/js/shims/details.js +1 -0
- data/public/dist/js/shims/dom-extend.js +1 -0
- data/public/dist/js/shims/es5.js +1 -0
- data/public/dist/js/shims/es6.js +1 -0
- data/public/dist/js/shims/excanvas.js +1 -0
- data/public/dist/js/shims/filereader-xhr.js +1 -0
- data/public/dist/js/shims/form-combat.js +1 -0
- data/public/dist/js/shims/form-core.js +1 -0
- data/public/dist/js/shims/form-datalist-lazy.js +1 -0
- data/public/dist/js/shims/form-datalist.js +1 -0
- data/public/dist/js/shims/form-fixrangechange.js +1 -0
- data/public/dist/js/shims/form-inputmode.js +1 -0
- data/public/dist/js/shims/form-message.js +1 -0
- data/public/dist/js/shims/form-native-extend.js +1 -0
- data/public/dist/js/shims/form-number-date-api.js +1 -0
- data/public/dist/js/shims/form-number-date-ui.js +1 -0
- data/public/dist/js/shims/form-shim-extend.js +1 -0
- data/public/dist/js/shims/form-shim-extend2.js +1 -0
- data/public/dist/js/shims/form-validation.js +1 -0
- data/public/dist/js/shims/form-validators.js +1 -0
- data/public/dist/js/shims/forms-picker.js +1 -0
- data/public/dist/js/shims/geolocation.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-ar.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-ch-CN.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-cs.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-de.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-el.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-en.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-es.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-fa.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-fr.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-he.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-hi.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-hu.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-it.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-ja.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-lt.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-nl.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-pl.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-pt-BR.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-pt-PT.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-pt.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-ru.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-sv.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-zh-CN.js +1 -0
- data/public/dist/js/shims/i18n/formcfg-zh-TW.js +1 -0
- data/public/dist/js/shims/jme/alternate-media.js +1 -0
- data/public/dist/js/shims/jme/base.js +1 -0
- data/public/dist/js/shims/jme/controls.css +1 -0
- data/public/dist/js/shims/jme/jme.eot +0 -0
- data/public/dist/js/shims/jme/jme.svg +36 -0
- data/public/dist/js/shims/jme/jme.ttf +0 -0
- data/public/dist/js/shims/jme/jme.woff +0 -0
- data/public/dist/js/shims/jme/mediacontrols-lazy.js +1 -0
- data/public/dist/js/shims/jme/mediacontrols.js +1 -0
- data/public/dist/js/shims/jme/playlist.js +1 -0
- data/public/dist/js/shims/jpicker/images/AlphaBar.png +0 -0
- data/public/dist/js/shims/jpicker/images/Bars.png +0 -0
- data/public/dist/js/shims/jpicker/images/Maps.png +0 -0
- data/public/dist/js/shims/jpicker/images/NoColor.png +0 -0
- data/public/dist/js/shims/jpicker/images/bar-opacity.png +0 -0
- data/public/dist/js/shims/jpicker/images/map-opacity.png +0 -0
- data/public/dist/js/shims/jpicker/images/mappoint.gif +0 -0
- data/public/dist/js/shims/jpicker/images/picker.gif +0 -0
- data/public/dist/js/shims/jpicker/images/preview-opacity.png +0 -0
- data/public/dist/js/shims/jpicker/images/rangearrows.gif +0 -0
- data/public/dist/js/shims/jpicker/jpicker.css +1 -0
- data/public/dist/js/shims/matchMedia.js +3 -0
- data/public/dist/js/shims/mediacapture-picker.js +1 -0
- data/public/dist/js/shims/mediacapture.js +1 -0
- data/public/dist/js/shims/mediaelement-core.js +1 -0
- data/public/dist/js/shims/mediaelement-debug.js +1 -0
- data/public/dist/js/shims/mediaelement-jaris.js +1 -0
- data/public/dist/js/shims/mediaelement-native-fix.js +1 -0
- data/public/dist/js/shims/mediaelement-yt.js +1 -0
- data/public/dist/js/shims/moxie/flash/Moxie.cdn.swf +0 -0
- data/public/dist/js/shims/moxie/flash/Moxie.min.swf +0 -0
- data/public/dist/js/shims/moxie/js/moxie-html4.js +3 -0
- data/public/dist/js/shims/moxie/js/moxie-swf.js +2 -0
- data/public/dist/js/shims/picture.js +1 -0
- data/public/dist/js/shims/plugins/jquery.ui.position.js +11 -0
- data/public/dist/js/shims/range-ui.js +1 -0
- data/public/dist/js/shims/sizzle.js +11 -0
- data/public/dist/js/shims/sticky.js +1 -0
- data/public/dist/js/shims/styles/color-picker.png +0 -0
- data/public/dist/js/shims/styles/forms-ext.css +1 -0
- data/public/dist/js/shims/styles/forms-picker.css +1 -0
- data/public/dist/js/shims/styles/progress.gif +0 -0
- data/public/dist/js/shims/styles/progress.png +0 -0
- data/public/dist/js/shims/styles/shim-ext.css +1 -0
- data/public/dist/js/shims/styles/shim.css +1 -0
- data/public/dist/js/shims/styles/transparent.png +0 -0
- data/public/dist/js/shims/styles/widget.eot +0 -0
- data/public/dist/js/shims/styles/widget.svg +12 -0
- data/public/dist/js/shims/styles/widget.ttf +0 -0
- data/public/dist/js/shims/styles/widget.woff +0 -0
- data/public/dist/js/shims/swf/JarisFLVPlayer.swf +0 -0
- data/public/dist/js/shims/swfmini-embed.js +1 -0
- data/public/dist/js/shims/swfmini.js +6 -0
- data/public/dist/js/shims/track-ui.js +1 -0
- data/public/dist/js/shims/track.js +1 -0
- data/public/dist/js/shims/url.js +1 -0
- data/public/dist/js/shims/usermedia-core.js +1 -0
- data/public/dist/js/shims/usermedia-shim.js +1 -0
- data/public/dist/js/webshims/shims/FlashCanvas/canvas2png.js +1 -0
- data/public/dist/js/webshims/shims/FlashCanvas/flashcanvas.js +1 -0
- data/public/dist/js/webshims/shims/FlashCanvas/flashcanvas.swf +0 -0
- data/public/dist/js/webshims/shims/FlashCanvasPro/canvas2png.js +1 -0
- data/public/dist/js/webshims/shims/FlashCanvasPro/flash10canvas.swf +0 -0
- data/public/dist/js/webshims/shims/FlashCanvasPro/flash9canvas.swf +0 -0
- data/public/dist/js/webshims/shims/FlashCanvasPro/flashcanvas.js +1 -0
- data/public/dist/js/webshims/shims/canvas-blob.js +1 -0
- data/public/dist/js/webshims/shims/color-picker.js +2 -0
- data/public/dist/js/webshims/shims/combos/1.js +6 -0
- data/public/dist/js/webshims/shims/combos/10.js +2 -0
- data/public/dist/js/webshims/shims/combos/11.js +2 -0
- data/public/dist/js/webshims/shims/combos/12.js +6 -0
- data/public/dist/js/webshims/shims/combos/13.js +1 -0
- data/public/dist/js/webshims/shims/combos/14.js +1 -0
- data/public/dist/js/webshims/shims/combos/15.js +2 -0
- data/public/dist/js/webshims/shims/combos/16.js +7 -0
- data/public/dist/js/webshims/shims/combos/17.js +2 -0
- data/public/dist/js/webshims/shims/combos/18.js +3 -0
- data/public/dist/js/webshims/shims/combos/2.js +7 -0
- data/public/dist/js/webshims/shims/combos/21.js +2 -0
- data/public/dist/js/webshims/shims/combos/22.js +1 -0
- data/public/dist/js/webshims/shims/combos/23.js +6 -0
- data/public/dist/js/webshims/shims/combos/25.js +2 -0
- data/public/dist/js/webshims/shims/combos/27.js +1 -0
- data/public/dist/js/webshims/shims/combos/28.js +1 -0
- data/public/dist/js/webshims/shims/combos/29.js +1 -0
- data/public/dist/js/webshims/shims/combos/3.js +1 -0
- data/public/dist/js/webshims/shims/combos/30.js +2 -0
- data/public/dist/js/webshims/shims/combos/31.js +1 -0
- data/public/dist/js/webshims/shims/combos/33.js +1 -0
- data/public/dist/js/webshims/shims/combos/34.js +1 -0
- data/public/dist/js/webshims/shims/combos/4.js +1 -0
- data/public/dist/js/webshims/shims/combos/5.js +2 -0
- data/public/dist/js/webshims/shims/combos/6.js +2 -0
- data/public/dist/js/webshims/shims/combos/7.js +7 -0
- data/public/dist/js/webshims/shims/combos/8.js +7 -0
- data/public/dist/js/webshims/shims/combos/9.js +2 -0
- data/public/dist/js/webshims/shims/combos/97.js +1 -0
- data/public/dist/js/webshims/shims/combos/98.js +1 -0
- data/public/dist/js/webshims/shims/combos/99.js +1 -0
- data/public/dist/js/webshims/shims/details.js +1 -0
- data/public/dist/js/webshims/shims/dom-extend.js +1 -0
- data/public/dist/js/webshims/shims/es5.js +1 -0
- data/public/dist/js/webshims/shims/es6.js +1 -0
- data/public/dist/js/webshims/shims/excanvas.js +1 -0
- data/public/dist/js/webshims/shims/filereader-xhr.js +1 -0
- data/public/dist/js/webshims/shims/form-combat.js +1 -0
- data/public/dist/js/webshims/shims/form-core.js +1 -0
- data/public/dist/js/webshims/shims/form-datalist-lazy.js +1 -0
- data/public/dist/js/webshims/shims/form-datalist.js +1 -0
- data/public/dist/js/webshims/shims/form-fixrangechange.js +1 -0
- data/public/dist/js/webshims/shims/form-inputmode.js +1 -0
- data/public/dist/js/webshims/shims/form-message.js +1 -0
- data/public/dist/js/webshims/shims/form-native-extend.js +1 -0
- data/public/dist/js/webshims/shims/form-number-date-api.js +1 -0
- data/public/dist/js/webshims/shims/form-number-date-ui.js +1 -0
- data/public/dist/js/webshims/shims/form-shim-extend.js +1 -0
- data/public/dist/js/webshims/shims/form-shim-extend2.js +1 -0
- data/public/dist/js/webshims/shims/form-validation.js +1 -0
- data/public/dist/js/webshims/shims/form-validators.js +1 -0
- data/public/dist/js/webshims/shims/forms-picker.js +1 -0
- data/public/dist/js/webshims/shims/geolocation.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-ar.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-ch-CN.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-cs.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-de.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-el.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-en.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-es.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-fa.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-fr.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-he.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-hi.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-hu.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-it.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-ja.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-lt.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-nl.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-pl.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-pt-BR.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-pt-PT.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-pt.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-ru.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-sv.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-zh-CN.js +1 -0
- data/public/dist/js/webshims/shims/i18n/formcfg-zh-TW.js +1 -0
- data/public/dist/js/webshims/shims/jme/alternate-media.js +1 -0
- data/public/dist/js/webshims/shims/jme/base.js +1 -0
- data/public/dist/js/webshims/shims/jme/controls.css +1 -0
- data/public/dist/js/webshims/shims/jme/jme.eot +0 -0
- data/public/dist/js/webshims/shims/jme/jme.svg +36 -0
- data/public/dist/js/webshims/shims/jme/jme.ttf +0 -0
- data/public/dist/js/webshims/shims/jme/jme.woff +0 -0
- data/public/dist/js/webshims/shims/jme/mediacontrols-lazy.js +1 -0
- data/public/dist/js/webshims/shims/jme/mediacontrols.js +1 -0
- data/public/dist/js/webshims/shims/jme/playlist.js +1 -0
- data/public/dist/js/webshims/shims/jpicker/images/AlphaBar.png +0 -0
- data/public/dist/js/webshims/shims/jpicker/images/Bars.png +0 -0
- data/public/dist/js/webshims/shims/jpicker/images/Maps.png +0 -0
- data/public/dist/js/webshims/shims/jpicker/images/NoColor.png +0 -0
- data/public/dist/js/webshims/shims/jpicker/images/bar-opacity.png +0 -0
- data/public/dist/js/webshims/shims/jpicker/images/map-opacity.png +0 -0
- data/public/dist/js/webshims/shims/jpicker/images/mappoint.gif +0 -0
- data/public/dist/js/webshims/shims/jpicker/images/picker.gif +0 -0
- data/public/dist/js/webshims/shims/jpicker/images/preview-opacity.png +0 -0
- data/public/dist/js/webshims/shims/jpicker/images/rangearrows.gif +0 -0
- data/public/dist/js/webshims/shims/jpicker/jpicker.css +1 -0
- data/public/dist/js/webshims/shims/matchMedia.js +3 -0
- data/public/dist/js/webshims/shims/mediacapture-picker.js +1 -0
- data/public/dist/js/webshims/shims/mediacapture.js +1 -0
- data/public/dist/js/webshims/shims/mediaelement-core.js +1 -0
- data/public/dist/js/webshims/shims/mediaelement-debug.js +1 -0
- data/public/dist/js/webshims/shims/mediaelement-jaris.js +1 -0
- data/public/dist/js/webshims/shims/mediaelement-native-fix.js +1 -0
- data/public/dist/js/webshims/shims/mediaelement-yt.js +1 -0
- data/public/dist/js/webshims/shims/moxie/flash/Moxie.cdn.swf +0 -0
- data/public/dist/js/webshims/shims/moxie/flash/Moxie.min.swf +0 -0
- data/public/dist/js/webshims/shims/moxie/js/moxie-html4.js +3 -0
- data/public/dist/js/webshims/shims/moxie/js/moxie-swf.js +2 -0
- data/public/dist/js/webshims/shims/picture.js +1 -0
- data/public/dist/js/webshims/shims/plugins/jquery.ui.position.js +11 -0
- data/public/dist/js/webshims/shims/range-ui.js +1 -0
- data/public/dist/js/webshims/shims/sizzle.js +11 -0
- data/public/dist/js/webshims/shims/sticky.js +1 -0
- data/public/dist/js/webshims/shims/styles/color-picker.png +0 -0
- data/public/dist/js/webshims/shims/styles/forms-ext.css +1 -0
- data/public/dist/js/webshims/shims/styles/forms-picker.css +1 -0
- data/public/dist/js/webshims/shims/styles/progress.gif +0 -0
- data/public/dist/js/webshims/shims/styles/progress.png +0 -0
- data/public/dist/js/webshims/shims/styles/shim-ext.css +1 -0
- data/public/dist/js/webshims/shims/styles/shim.css +1 -0
- data/public/dist/js/webshims/shims/styles/transparent.png +0 -0
- data/public/dist/js/webshims/shims/styles/widget.eot +0 -0
- data/public/dist/js/webshims/shims/styles/widget.svg +12 -0
- data/public/dist/js/webshims/shims/styles/widget.ttf +0 -0
- data/public/dist/js/webshims/shims/styles/widget.woff +0 -0
- data/public/dist/js/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
- data/public/dist/js/webshims/shims/swfmini-embed.js +1 -0
- data/public/dist/js/webshims/shims/swfmini.js +6 -0
- data/public/dist/js/webshims/shims/track-ui.js +1 -0
- data/public/dist/js/webshims/shims/track.js +1 -0
- data/public/dist/js/webshims/shims/url.js +1 -0
- data/public/dist/js/webshims/shims/usermedia-core.js +1 -0
- data/public/dist/js/webshims/shims/usermedia-shim.js +1 -0
- data/public/js/bootstrap.min.js +3 -8
- data/public/js/jquery-ui.min.js +6 -0
- data/public/js/jquery.min.js +4 -0
- data/public/js/jquery.t.js +4 -4
- data/public/js/sequenceserver.blast.js +20 -18
- data/public/js/sequenceserver.js +116 -74
- data/sequenceserver.gemspec +20 -16
- data/views/400.erb +2 -1
- data/views/500.erb +6 -1
- data/views/result.erb +38 -18
- data/views/search.erb +49 -32
- metadata +389 -11
- data/public/img/glyphicons-halflings-white.png +0 -0
- data/public/img/glyphicons-halflings.png +0 -0
- data/public/js/jquery-ui.js +0 -14987
- data/public/js/jquery.js +0 -5
- data/public/js/jquery.scrollspy.js +0 -74
- data/public/sequence.min.js +0 -1
@@ -0,0 +1,27 @@
|
|
1
|
+
module SequenceServer
|
2
|
+
module BLAST
|
3
|
+
# To signal error in query sequence or options.
|
4
|
+
#
|
5
|
+
# ArgumentError is raised when BLAST+'s exit status is 1; see [1].
|
6
|
+
class ArgumentError < ArgumentError
|
7
|
+
end
|
8
|
+
|
9
|
+
# To signal internal errors.
|
10
|
+
#
|
11
|
+
# RuntimeError is raised when BLAST+'s exits status is one of 2, 3, 4, or
|
12
|
+
# 255; see [1]. These are rare, infrastructure errors, used internally,
|
13
|
+
# and of concern only to the admins/developers.
|
14
|
+
class RuntimeError < RuntimeError
|
15
|
+
def initialize(status, message)
|
16
|
+
@status = status
|
17
|
+
@message = message
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_reader :status, :message
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
"#{status}, #{message}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module SequenceServer
|
2
|
+
# Define BLAST::Hit.
|
3
|
+
module BLAST
|
4
|
+
# Hit Object to store all the hits per Query.
|
5
|
+
# @member [Fixnum] number
|
6
|
+
# @member [String] id
|
7
|
+
# @member [String] def
|
8
|
+
# @member [String] accession
|
9
|
+
# @member [Fixnum] len
|
10
|
+
# @member [HSP] hsp
|
11
|
+
Hit = Struct.new(:number, :id, :title, :accession, :len, :hsps) do
|
12
|
+
def initialize(*args)
|
13
|
+
args[0] = args[0].to_i
|
14
|
+
args[2] = '' if args[2] == 'No definition line'
|
15
|
+
args[4] = args[4].to_i
|
16
|
+
super
|
17
|
+
end
|
18
|
+
|
19
|
+
alias_method :length, :len
|
20
|
+
|
21
|
+
# Hit evalue is the minimum evalue of all HSP(s).
|
22
|
+
def evalue
|
23
|
+
hsps.map(&:evalue).min
|
24
|
+
end
|
25
|
+
|
26
|
+
# Hit score is the sum of bit scores of all HSP(s).
|
27
|
+
def score
|
28
|
+
hsps.map(&:bit_score).reduce(:+)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,260 @@
|
|
1
|
+
module SequenceServer
|
2
|
+
# Define BLAST::HSP and BLAST::HSP::*.
|
3
|
+
module BLAST
|
4
|
+
# Structure to hold generic HSP data for each hit.
|
5
|
+
#
|
6
|
+
# HSP class is not used directly. Relevant HSP stats and formatting the
|
7
|
+
# alignment changes with BLAST algorithm. We subclass HSP for each BLAST
|
8
|
+
# algorithm.
|
9
|
+
HSP = Struct.new(:number, :bit_score, :score, :evalue, :qstart, :qend,
|
10
|
+
:sstart, :send, :qframe, :sframe, :identity, :positives,
|
11
|
+
:gaps, :len, :qseq, :sseq, :midline) do
|
12
|
+
INTEGER_ARGS = [0, 2].concat((4..13).to_a)
|
13
|
+
FLOAT_ARGS = [1, 3]
|
14
|
+
|
15
|
+
def initialize(*args)
|
16
|
+
INTEGER_ARGS.each do |i|
|
17
|
+
args[i] = args[i].to_i
|
18
|
+
end
|
19
|
+
|
20
|
+
FLOAT_ARGS.each do |i|
|
21
|
+
args[i] = args[i].to_f
|
22
|
+
end
|
23
|
+
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
alias_method :length, :len
|
28
|
+
|
29
|
+
# Returns a Hash of stats common to all BLAST algorithms. Subclasses must
|
30
|
+
# update the returned Hash to add relevant stats of their own.
|
31
|
+
#
|
32
|
+
def stats
|
33
|
+
{
|
34
|
+
'Score' => [bit_score, score],
|
35
|
+
'E value' => evalue,
|
36
|
+
'Identities' => [in_fraction(identity, length),
|
37
|
+
in_percentage(identity, length)],
|
38
|
+
'Gaps' => [in_fraction(gaps, length),
|
39
|
+
in_percentage(gaps, length)]
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns pretty formatted alignment String.
|
44
|
+
#
|
45
|
+
# Calls out to `nqseq`, `nsseq`, `qframe_unit`, `sframe_unit`,
|
46
|
+
# `qframe_sign`, and `sframe_sign` attributes. The default value of
|
47
|
+
# these attributes suit BLASTP. Subclasses must override these
|
48
|
+
# attributes appropriately.
|
49
|
+
#
|
50
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
51
|
+
# rubocop:disable Metrics/MethodLength, Style/FormatString
|
52
|
+
def pp
|
53
|
+
chars = 60
|
54
|
+
lines = (length / chars.to_f).ceil
|
55
|
+
width = [qend, send, qstart, sstart].map(&:to_s).map(&:length).max
|
56
|
+
|
57
|
+
nqseq = self.nqseq
|
58
|
+
nsseq = self.nsseq
|
59
|
+
|
60
|
+
s = ''
|
61
|
+
(1..lines).each do |i|
|
62
|
+
lqstart = nqseq
|
63
|
+
lqseq = qseq[chars * (i - 1), chars]
|
64
|
+
nqseq += (lqseq.length - lqseq.count('-')) * qframe_unit * qframe_sign
|
65
|
+
lqend = nqseq - qframe_sign
|
66
|
+
s << "Query %#{width}d #{lqseq} #{lqend}\n" % lqstart
|
67
|
+
|
68
|
+
lmseq = midline[chars * (i - 1), chars]
|
69
|
+
s << "#{' ' * (width + 8)} #{lmseq}\n"
|
70
|
+
|
71
|
+
lsstart = nsseq
|
72
|
+
lsseq = sseq[chars * (i - 1), chars]
|
73
|
+
nsseq += (lsseq.length - lsseq.count('-')) * sframe_unit * sframe_sign
|
74
|
+
lsend = nsseq - sframe_sign
|
75
|
+
s << "Subject %#{width}d #{lsseq} #{lsend}\n" % lsstart
|
76
|
+
|
77
|
+
s << "\n" unless i == lines
|
78
|
+
end
|
79
|
+
s
|
80
|
+
end
|
81
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
82
|
+
# rubocop:enable Metrics/MethodLength, Style/FormatString
|
83
|
+
|
84
|
+
## We calculate start and end coordinate of each line of the alignment ##
|
85
|
+
## based on the six attributes below. See `pp` method. ##
|
86
|
+
|
87
|
+
# Alignment start coordinate for query sequence.
|
88
|
+
#
|
89
|
+
# This will be qstart or qend depending on the direction in which the
|
90
|
+
# (translated) query sequence aligned.
|
91
|
+
def nqseq
|
92
|
+
qframe >= 0 ? qstart : qend
|
93
|
+
end
|
94
|
+
|
95
|
+
# Alignment start coordinate for subject sequence.
|
96
|
+
#
|
97
|
+
# This will be sstart or send depending on the direction in which the
|
98
|
+
# (translated) subject sequence aligned.
|
99
|
+
def nsseq
|
100
|
+
sframe >= 0 ? sstart : send
|
101
|
+
end
|
102
|
+
|
103
|
+
# Jump in query coordinate.
|
104
|
+
#
|
105
|
+
# Roughly,
|
106
|
+
#
|
107
|
+
# qend = qstart + n * qframe_unit
|
108
|
+
#
|
109
|
+
# This will be 1 or 3 depending on whether the query sequence was
|
110
|
+
# translated or not.
|
111
|
+
def qframe_unit
|
112
|
+
1
|
113
|
+
end
|
114
|
+
|
115
|
+
# Jump in subject coordinate.
|
116
|
+
#
|
117
|
+
# Roughly,
|
118
|
+
#
|
119
|
+
# send = sstart + n * sframe_unit
|
120
|
+
#
|
121
|
+
# This will be 1 or 3 depending on whether the subject sequence was
|
122
|
+
# translated or not.
|
123
|
+
def sframe_unit
|
124
|
+
1
|
125
|
+
end
|
126
|
+
|
127
|
+
# If we should add or subtract qframe_unit from qstart to arrive at qend.
|
128
|
+
#
|
129
|
+
# Roughly,
|
130
|
+
#
|
131
|
+
# qend = qstart + (qframe_sign) * n * qframe_unit
|
132
|
+
#
|
133
|
+
# This will be +1 or -1, depending on the direction in which the
|
134
|
+
# (translated) query sequence aligned.
|
135
|
+
def qframe_sign
|
136
|
+
qframe >= 0 ? 1 : -1
|
137
|
+
end
|
138
|
+
|
139
|
+
# If we should add or subtract sframe_unit from sstart to arrive at send.
|
140
|
+
#
|
141
|
+
# Roughly,
|
142
|
+
#
|
143
|
+
# send = sstart + (sframe_sign) * n * sframe_unit
|
144
|
+
#
|
145
|
+
# This will be +1 or -1, depending on the direction in which the
|
146
|
+
# (translated) subject sequence aligned.
|
147
|
+
def sframe_sign
|
148
|
+
sframe >= 0 ? 1 : -1
|
149
|
+
end
|
150
|
+
|
151
|
+
## We define stats in terms of the following functions. ##
|
152
|
+
|
153
|
+
# Return fractional representation as String.
|
154
|
+
#
|
155
|
+
# NOTE:
|
156
|
+
# Rational class reduces the fraction so we can't use that.
|
157
|
+
def in_fraction(num, den)
|
158
|
+
"#{num}/#{den}"
|
159
|
+
end
|
160
|
+
|
161
|
+
# Return percentage as Float.
|
162
|
+
def in_percentage(num, den)
|
163
|
+
format '%.2f', (num * 100.0 / den)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
class HSP
|
168
|
+
# HSP subclass for BLASTX algorithm.
|
169
|
+
class BLASTX < self
|
170
|
+
def stats
|
171
|
+
super.update 'Query frame' => qframe
|
172
|
+
end
|
173
|
+
|
174
|
+
# Translated nucleotide query against protein database, hence 3.
|
175
|
+
def qframe_unit
|
176
|
+
3
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# HSP subclass for BLASTP algorithm.
|
181
|
+
class BLASTP < self
|
182
|
+
def stats
|
183
|
+
super.update(
|
184
|
+
'Positives' =>
|
185
|
+
[
|
186
|
+
in_fraction(positives, length),
|
187
|
+
in_percentage(positives, length)
|
188
|
+
]
|
189
|
+
)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
# HSP subclass for BLASTN algorithm.
|
194
|
+
class BLASTN < self
|
195
|
+
def stats
|
196
|
+
super.update('Strand' =>
|
197
|
+
"#{qframe > 0 ? '+' : '-'}/#{sframe > 0 ? '+' : '-'}")
|
198
|
+
end
|
199
|
+
|
200
|
+
# BLASTN is a bit weird in that, no matter which direction the query
|
201
|
+
# sequence aligned in, qstart is taken as alignment start coordinate
|
202
|
+
# for query.
|
203
|
+
#
|
204
|
+
# NOTE:
|
205
|
+
# Because BLAST reverses the qstart and qend for BLASTN?
|
206
|
+
def nqseq
|
207
|
+
qstart
|
208
|
+
end
|
209
|
+
|
210
|
+
# BLASTN is a bit weird in that, no matter which direction the subject
|
211
|
+
# sequence aligned in, sstart is taken as alignment start coordinate
|
212
|
+
# for subject.
|
213
|
+
#
|
214
|
+
# NOTE:
|
215
|
+
# Because BLAST reverses the sstart and send for BLASTN?
|
216
|
+
def nsseq
|
217
|
+
sstart
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
# HSP subclass for TBLASTX algorithm.
|
222
|
+
class TBLASTX < self
|
223
|
+
def stats
|
224
|
+
super.update(
|
225
|
+
'Frame' => in_fraction(qframe, sframe),
|
226
|
+
'Positives' =>
|
227
|
+
[
|
228
|
+
in_fraction(positives, length),
|
229
|
+
in_percentage(positives, length)
|
230
|
+
]
|
231
|
+
)
|
232
|
+
end
|
233
|
+
|
234
|
+
# Translated nucleotide query against translated nucleotide database,
|
235
|
+
# hence 3.
|
236
|
+
def qframe_unit
|
237
|
+
3
|
238
|
+
end
|
239
|
+
|
240
|
+
# Translated nucleotide query against translated nucleotide database,
|
241
|
+
# hence 3.
|
242
|
+
def sframe_unit
|
243
|
+
3
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
# HSP subclass for TBLASTN algorithm.
|
248
|
+
class TBLASTN < self
|
249
|
+
def stats
|
250
|
+
super.update 'Hit frame' => sframe
|
251
|
+
end
|
252
|
+
|
253
|
+
# Protein query against translated nucleotide database, hence 3.
|
254
|
+
def sframe_unit
|
255
|
+
3
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module SequenceServer
|
2
|
+
# Define BLAST::Query.
|
3
|
+
module BLAST
|
4
|
+
# Capture results per query of a BLAST search.
|
5
|
+
# @member [String] number
|
6
|
+
# @member [String] def
|
7
|
+
# @member [Fixnum] len
|
8
|
+
# @member [Array(Hit)] hits
|
9
|
+
Query = Struct.new(:number, :def, :len, :hits) do
|
10
|
+
def initialize(*args)
|
11
|
+
args[0] = args[0].to_i
|
12
|
+
args[1] = "Query_#{args[0]}" if args[1] == 'No definition line'
|
13
|
+
args[2] = args[2].to_i
|
14
|
+
@id, *rest = args[1].split
|
15
|
+
@title = rest.join(' ')
|
16
|
+
super
|
17
|
+
end
|
18
|
+
|
19
|
+
def sort_hits_by_evalue!
|
20
|
+
@hits = hits.sort_by(&:evalue)
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_reader :id, :title
|
24
|
+
|
25
|
+
alias_method :length, :len
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
module SequenceServer
|
2
|
+
module BLAST
|
3
|
+
# Captures BLAST results from BLAST+'s XML output.
|
4
|
+
class Report
|
5
|
+
include Links
|
6
|
+
|
7
|
+
# Expects a File object and Database objects used to BLAST against.
|
8
|
+
#
|
9
|
+
# Parses the XML file into an intermediate representation (ir) and
|
10
|
+
# constructs an object model from that.
|
11
|
+
#
|
12
|
+
# NOTE:
|
13
|
+
# Databases param is optional for test suite.
|
14
|
+
#
|
15
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
16
|
+
def initialize(rfile, databases = nil)
|
17
|
+
@archive_file = rfile
|
18
|
+
|
19
|
+
xml_file = BLAST.format('report' => @archive_file,
|
20
|
+
'type' => 'full',
|
21
|
+
'format' => 'xml')
|
22
|
+
|
23
|
+
ir = File.open(xml_file[:filepath]) do |f|
|
24
|
+
node_to_array Ox.parse(f.read).root
|
25
|
+
end
|
26
|
+
|
27
|
+
@program = ir[0]
|
28
|
+
@program_version = ir[1]
|
29
|
+
@querydb = Array databases
|
30
|
+
@parameters = {
|
31
|
+
:matrix => ir[7][0],
|
32
|
+
:evalue => ir[7][1],
|
33
|
+
:gapopen => ir[7][2],
|
34
|
+
:gapextend => ir[7][3],
|
35
|
+
:filters => ir[7][4]
|
36
|
+
}
|
37
|
+
|
38
|
+
ir[8].each_with_index do |n, i|
|
39
|
+
@stats ||= n[5][0]
|
40
|
+
@queries ||= []
|
41
|
+
@queries.push(Query.new(n[0], n[2], n[3], []))
|
42
|
+
|
43
|
+
# Ensure a hit object is received. No hits, returns a newline. Note
|
44
|
+
# that checking to "\n" doesn't work since n[4] = ["\n"]
|
45
|
+
if n[4] == ["\n"]
|
46
|
+
@queries[i][:hits] = []
|
47
|
+
else
|
48
|
+
n[4].each_with_index do |hits, j|
|
49
|
+
@queries[i][:hits].push(Hit.new(hits[0], hits[1], hits[2],
|
50
|
+
hits[3], hits[4], []))
|
51
|
+
hits[5].each do |hsp|
|
52
|
+
hsp_klass = HSP.const_get program.upcase
|
53
|
+
@queries[i][:hits][j][:hsps].push(hsp_klass.new(*hsp))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
@queries[i].sort_hits_by_evalue!
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
61
|
+
|
62
|
+
attr_reader :archive_file
|
63
|
+
attr_reader :program, :program_version
|
64
|
+
|
65
|
+
# :nodoc:
|
66
|
+
# params are defaults provided by BLAST or user input to tweak the
|
67
|
+
# result. stats are computed metrics provided by BLAST.
|
68
|
+
#
|
69
|
+
# BLAST+ doesn't list all input params (like word_size) in the XML
|
70
|
+
# output. Only matrix, evalue, gapopen, gapextend, and filters.
|
71
|
+
attr_reader :params, :stats
|
72
|
+
|
73
|
+
attr_reader :querydb
|
74
|
+
|
75
|
+
attr_reader :queries
|
76
|
+
|
77
|
+
# Helper methods for pretty printing results
|
78
|
+
|
79
|
+
def link_per_hit(sequence_id)
|
80
|
+
links = Links.instance_methods.map { |m| send(m, sequence_id) }
|
81
|
+
|
82
|
+
# Sort links based on :order key (ascending)
|
83
|
+
links.compact!.sort_by! { |link| link[:order] }
|
84
|
+
end
|
85
|
+
|
86
|
+
# Returns an array of database objects which contain the queried
|
87
|
+
# sequence id.
|
88
|
+
# NOTE: This function may return more than one database object for
|
89
|
+
# a single sequence id.
|
90
|
+
#
|
91
|
+
# e.g., which_blastdb('SI_2.2.23') => [<Database: ...>, ...]
|
92
|
+
def which_blastdb(sequence_id)
|
93
|
+
querydb.select { |db| db.include? sequence_id }
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
PARSEABLE_AS_ARRAY = %w(Parameters BlastOutput_param Iteration_stat
|
99
|
+
Statistics Iteration_hits BlastOutput_iterations
|
100
|
+
Iteration Hit Hit_hsps Hsp)
|
101
|
+
|
102
|
+
def node_to_array(element)
|
103
|
+
element.nodes.map { |n| node_to_value n }
|
104
|
+
end
|
105
|
+
|
106
|
+
def node_to_value(node)
|
107
|
+
# Ensure that the recursion doesn't fails when String value is received.
|
108
|
+
return node if node.is_a?(String)
|
109
|
+
|
110
|
+
if PARSEABLE_AS_ARRAY.include? node.name
|
111
|
+
value = node_to_array(node)
|
112
|
+
else
|
113
|
+
value = first_text(node)
|
114
|
+
end
|
115
|
+
value
|
116
|
+
end
|
117
|
+
|
118
|
+
def first_text(node)
|
119
|
+
node.nodes.find { |n| n.is_a? String }
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|