Repository 'riboplot'
hg clone https://toolshed.g2.bx.psu.edu/repos/vimalkumarvelayudhan/riboplot

Changeset 0:ca58e9466cbf (2015-06-29)
Next changeset 1:1e9797878349 (2015-06-29)
Commit message:
First commit
added:
data/css/asc.gif
data/css/bg.gif
data/css/custom.css
data/css/desc.gif
data/css/normalize.css
data/css/skeleton.css
data/js/custom.js
data/js/jquery-1.11.3.min.js
data/js/jquery-1.11.3.min.map
data/js/jquery.tablesorter.min.js
data/ribocount.html
data/ribocount_index.html
data/riboplot.html
ribocount.xml
riboplot.xml
riboplot/__init__.py
riboplot/config.py
riboplot/core.py
riboplot/ribocount.py
riboplot/riboplot.py
runtests.sh
tests/__init__.py
tests/test_plot.py
tool_dependencies.xml
b
diff -r 000000000000 -r ca58e9466cbf data/css/asc.gif
b
Binary file data/css/asc.gif has changed
b
diff -r 000000000000 -r ca58e9466cbf data/css/bg.gif
b
Binary file data/css/bg.gif has changed
b
diff -r 000000000000 -r ca58e9466cbf data/css/custom.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/data/css/custom.css Mon Jun 29 16:38:36 2015 +0100
b
@@ -0,0 +1,61 @@
+.info {
+    font-weight: normal;
+}
+
+.text-muted {
+    font-size: 0.6em;
+    text-align: center;
+    color: #555555;
+}
+
+#main {
+    text-align: center;
+}
+
+#page-title {
+    margin-top: 5%;
+}
+
+/* tables */
+table.tablesorter {
+    border: 1px solid #eeeeee;
+}
+
+table.tablesorter thead tr .header {
+    background-image: url(bg.gif);
+    background-repeat: no-repeat;
+    background-position: center right;
+    cursor: pointer;
+}
+
+table.tablesorter thead tr .headerSortUp {
+    background-image: url(asc.gif);
+}
+
+table.tablesorter thead tr .headerSortDown {
+    background-image: url(desc.gif);
+}
+
+table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp {
+    background-color: #eeeeee;
+}
+
+table.tablesorter tbody {
+    font-family: monospace;
+}
+
+#overlay {
+    top: 20px;
+    left: 50%;
+    position: absolute;
+    margin-left: -170px;
+    width: 250px;
+    text-align: center;
+    display: none;
+    margin-top: -10px;
+    background: #F6FF00;
+    color: #515151;
+    padding: 3px;
+    border-radius: 5px;
+    box-shadow: 3px 3px 3px #eeeeee;
+}
\ No newline at end of file
b
diff -r 000000000000 -r ca58e9466cbf data/css/desc.gif
b
Binary file data/css/desc.gif has changed
b
diff -r 000000000000 -r ca58e9466cbf data/css/normalize.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/data/css/normalize.css Mon Jun 29 16:38:36 2015 +0100
[
b'@@ -0,0 +1,427 @@\n+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n+\n+/**\n+ * 1. Set default font family to sans-serif.\n+ * 2. Prevent iOS text size adjust after orientation change, without disabling\n+ *    user zoom.\n+ */\n+\n+html {\n+  font-family: sans-serif; /* 1 */\n+  -ms-text-size-adjust: 100%; /* 2 */\n+  -webkit-text-size-adjust: 100%; /* 2 */\n+}\n+\n+/**\n+ * Remove default margin.\n+ */\n+\n+body {\n+  margin: 0;\n+}\n+\n+/* HTML5 display definitions\n+   ========================================================================== */\n+\n+/**\n+ * Correct `block` display not defined for any HTML5 element in IE 8/9.\n+ * Correct `block` display not defined for `details` or `summary` in IE 10/11\n+ * and Firefox.\n+ * Correct `block` display not defined for `main` in IE 11.\n+ */\n+\n+article,\n+aside,\n+details,\n+figcaption,\n+figure,\n+footer,\n+header,\n+hgroup,\n+main,\n+menu,\n+nav,\n+section,\n+summary {\n+  display: block;\n+}\n+\n+/**\n+ * 1. Correct `inline-block` display not defined in IE 8/9.\n+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n+ */\n+\n+audio,\n+canvas,\n+progress,\n+video {\n+  display: inline-block; /* 1 */\n+  vertical-align: baseline; /* 2 */\n+}\n+\n+/**\n+ * Prevent modern browsers from displaying `audio` without controls.\n+ * Remove excess height in iOS 5 devices.\n+ */\n+\n+audio:not([controls]) {\n+  display: none;\n+  height: 0;\n+}\n+\n+/**\n+ * Address `[hidden]` styling not present in IE 8/9/10.\n+ * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n+ */\n+\n+[hidden],\n+template {\n+  display: none;\n+}\n+\n+/* Links\n+   ========================================================================== */\n+\n+/**\n+ * Remove the gray background color from active links in IE 10.\n+ */\n+\n+a {\n+  background-color: transparent;\n+}\n+\n+/**\n+ * Improve readability when focused and also mouse hovered in all browsers.\n+ */\n+\n+a:active,\n+a:hover {\n+  outline: 0;\n+}\n+\n+/* Text-level semantics\n+   ========================================================================== */\n+\n+/**\n+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n+ */\n+\n+abbr[title] {\n+  border-bottom: 1px dotted;\n+}\n+\n+/**\n+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n+ */\n+\n+b,\n+strong {\n+  font-weight: bold;\n+}\n+\n+/**\n+ * Address styling not present in Safari and Chrome.\n+ */\n+\n+dfn {\n+  font-style: italic;\n+}\n+\n+/**\n+ * Address variable `h1` font-size and margin within `section` and `article`\n+ * contexts in Firefox 4+, Safari, and Chrome.\n+ */\n+\n+h1 {\n+  font-size: 2em;\n+  margin: 0.67em 0;\n+}\n+\n+/**\n+ * Address styling not present in IE 8/9.\n+ */\n+\n+mark {\n+  background: #ff0;\n+  color: #000;\n+}\n+\n+/**\n+ * Address inconsistent and variable font size in all browsers.\n+ */\n+\n+small {\n+  font-size: 80%;\n+}\n+\n+/**\n+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n+ */\n+\n+sub,\n+sup {\n+  font-size: 75%;\n+  line-height: 0;\n+  position: relative;\n+  vertical-align: baseline;\n+}\n+\n+sup {\n+  top: -0.5em;\n+}\n+\n+sub {\n+  bottom: -0.25em;\n+}\n+\n+/* Embedded content\n+   ========================================================================== */\n+\n+/**\n+ * Remove border when inside `a` element in IE 8/9/10.\n+ */\n+\n+img {\n+  border: 0;\n+}\n+\n+/**\n+ * Correct overflow not hidden in IE 9/10/11.\n+ */\n+\n+svg:not(:root) {\n+  overflow: hidden;\n+}\n+\n+/* Grouping content\n+   ========================================================================== */\n+\n+/**\n+ * Address margin not present in IE 8/9 and Safari.\n+ */\n+\n+figure {\n+  margin: 1em 40px;\n+}\n+\n+/**\n+ * Address differences between Firefox and other browsers.\n+ */\n+\n+hr {\n+  -moz-box-sizing: content-box;\n+  box-sizing: content-box;\n+  height: 0;\n+}\n+\n+/**\n+ * Contain overflow in all browsers.\n+ */\n+\n+pre {\n+  overflow: auto;\n+}\n+\n+/**\n+ * Address odd `em`-unit font size rendering in all browsers.\n+ */\n+\n+code,\n+kbd,\n+pre,\n+samp {\n+  font-family: monospace, monospace;\n+  font-size: 1em;\n+}\n+\n+/* Forms\n+   ======================================'..b' of disabled elements.\n+ * 2. Correct font properties not being inherited.\n+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n+ */\n+\n+button,\n+input,\n+optgroup,\n+select,\n+textarea {\n+  color: inherit; /* 1 */\n+  font: inherit; /* 2 */\n+  margin: 0; /* 3 */\n+}\n+\n+/**\n+ * Address `overflow` set to `hidden` in IE 8/9/10/11.\n+ */\n+\n+button {\n+  overflow: visible;\n+}\n+\n+/**\n+ * Address inconsistent `text-transform` inheritance for `button` and `select`.\n+ * All other form control elements do not inherit `text-transform` values.\n+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n+ * Correct `select` style inheritance in Firefox.\n+ */\n+\n+button,\n+select {\n+  text-transform: none;\n+}\n+\n+/**\n+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n+ *    and `video` controls.\n+ * 2. Correct inability to style clickable `input` types in iOS.\n+ * 3. Improve usability and consistency of cursor style between image-type\n+ *    `input` and others.\n+ */\n+\n+button,\n+html input[type="button"], /* 1 */\n+input[type="reset"],\n+input[type="submit"] {\n+  -webkit-appearance: button; /* 2 */\n+  cursor: pointer; /* 3 */\n+}\n+\n+/**\n+ * Re-set default cursor for disabled elements.\n+ */\n+\n+button[disabled],\n+html input[disabled] {\n+  cursor: default;\n+}\n+\n+/**\n+ * Remove inner padding and border in Firefox 4+.\n+ */\n+\n+button::-moz-focus-inner,\n+input::-moz-focus-inner {\n+  border: 0;\n+  padding: 0;\n+}\n+\n+/**\n+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n+ * the UA stylesheet.\n+ */\n+\n+input {\n+  line-height: normal;\n+}\n+\n+/**\n+ * It\'s recommended that you don\'t attempt to style these elements.\n+ * Firefox\'s implementation doesn\'t respect box-sizing, padding, or width.\n+ *\n+ * 1. Address box sizing set to `content-box` in IE 8/9/10.\n+ * 2. Remove excess padding in IE 8/9/10.\n+ */\n+\n+input[type="checkbox"],\n+input[type="radio"] {\n+  box-sizing: border-box; /* 1 */\n+  padding: 0; /* 2 */\n+}\n+\n+/**\n+ * Fix the cursor style for Chrome\'s increment/decrement buttons. For certain\n+ * `font-size` values of the `input`, it causes the cursor style of the\n+ * decrement button to change from `default` to `text`.\n+ */\n+\n+input[type="number"]::-webkit-inner-spin-button,\n+input[type="number"]::-webkit-outer-spin-button {\n+  height: auto;\n+}\n+\n+/**\n+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n+ *    (include `-moz` to future-proof).\n+ */\n+\n+input[type="search"] {\n+  -webkit-appearance: textfield; /* 1 */\n+  -moz-box-sizing: content-box;\n+  -webkit-box-sizing: content-box; /* 2 */\n+  box-sizing: content-box;\n+}\n+\n+/**\n+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n+ * Safari (but not Chrome) clips the cancel button when the search input has\n+ * padding (and `textfield` appearance).\n+ */\n+\n+input[type="search"]::-webkit-search-cancel-button,\n+input[type="search"]::-webkit-search-decoration {\n+  -webkit-appearance: none;\n+}\n+\n+/**\n+ * Define consistent border, margin, and padding.\n+ */\n+\n+fieldset {\n+  border: 1px solid #c0c0c0;\n+  margin: 0 2px;\n+  padding: 0.35em 0.625em 0.75em;\n+}\n+\n+/**\n+ * 1. Correct `color` not being inherited in IE 8/9/10/11.\n+ * 2. Remove padding so people aren\'t caught out if they zero out fieldsets.\n+ */\n+\n+legend {\n+  border: 0; /* 1 */\n+  padding: 0; /* 2 */\n+}\n+\n+/**\n+ * Remove default vertical scrollbar in IE 8/9/10/11.\n+ */\n+\n+textarea {\n+  overflow: auto;\n+}\n+\n+/**\n+ * Don\'t inherit the `font-weight` (applied by a rule above).\n+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n+ */\n+\n+optgroup {\n+  font-weight: bold;\n+}\n+\n+/* Tables\n+   ========================================================================== */\n+\n+/**\n+ * Remove most spacing between table cells.\n+ */\n+\n+table {\n+  border-collapse: collapse;\n+  border-spacing: 0;\n+}\n+\n+td,\n+th {\n+  padding: 0;\n+}\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r ca58e9466cbf data/css/skeleton.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/data/css/skeleton.css Mon Jun 29 16:38:36 2015 +0100
[
b'@@ -0,0 +1,419 @@\n+/*\n+* Skeleton V2.0.4\n+* Copyright 2014, Dave Gamache\n+* www.getskeleton.com\n+* Free to use under the MIT license.\n+* http://www.opensource.org/licenses/mit-license.php\n+* 12/29/2014\n+*/\n+\n+\n+/* Table of contents\n+\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\n+- Grid\n+- Base Styles\n+- Typography\n+- Links\n+- Buttons\n+- Forms\n+- Lists\n+- Code\n+- Tables\n+- Spacing\n+- Utilities\n+- Clearing\n+- Media Queries\n+*/\n+\n+\n+/* Grid\n+\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93 */\n+.container {\n+  position: relative;\n+  width: 100%;\n+  max-width: 960px;\n+  margin: 0 auto;\n+  padding: 0 20px;\n+  box-sizing: border-box; }\n+.column,\n+.columns {\n+  width: 100%;\n+  float: left;\n+  box-sizing: border-box; }\n+\n+/* For devices larger than 400px */\n+@media (min-width: 400px) {\n+  .container {\n+    width: 85%;\n+    padding: 0; }\n+}\n+\n+/* For devices larger than 550px */\n+@media (min-width: 550px) {\n+  .container {\n+    width: 80%; }\n+  .column,\n+  .columns {\n+    margin-left: 4%; }\n+  .column:first-child,\n+  .columns:first-child {\n+    margin-left: 0; }\n+\n+  .one.column,\n+  .one.columns                    { width: 4.66666666667%; }\n+  .two.columns                    { width: 13.3333333333%; }\n+  .three.columns                  { width: 22%;            }\n+  .four.columns                   { width: 30.6666666667%; }\n+  .five.columns                   { width: 39.3333333333%; }\n+  .six.columns                    { width: 48%;            }\n+  .seven.columns                  { width: 56.6666666667%; }\n+  .eight.columns                  { width: 65.3333333333%; }\n+  .nine.columns                   { width: 74.0%;          }\n+  .ten.columns                    { width: 82.6666666667%; }\n+  .eleven.columns                 { width: 91.3333333333%; }\n+  .twelve.columns                 { width: 100%; margin-left: 0; }\n+\n+  .one-third.column               { width: 30.6666666667%; }\n+  .two-thirds.column              { width: 65.3333333333%; }\n+\n+  .one-half.column                { width: 48%; }\n+\n+  /* Offsets */\n+  .offset-by-one.column,\n+  .offset-by-one.columns          { margin-left: 8.66666666667%; }\n+  .offset-by-two.column,\n+  .offset-by-two.columns          { margin-left: 17.3333333333%; }\n+  .offset-by-three.column,\n+  .offset-by-three.columns        { margin-left: 26%;            }\n+  .offset-by-four.column,\n+  .offset-by-four.columns         { margin-left: 34.6666666667%; }\n+  .offset-by-five.column,\n+  .offset-by-five.columns         { margin-left: 43.3333333333%; }\n+  .offset-by-six.column,\n+  .offset-by-six.columns          { margin-left: 52%;            }\n+  .offset-by-seven.column,\n+  .offset-by-seven.columns        { margin-left: 60.6666666667%; }\n+  .offset-by-eight.column,\n+  .offset-by-eight.columns        { margin-left: 69.3333333333%; }\n+  .offset-by-nine.column,\n+  .offset-by-nine.columns         { margin-left: 78.0%;          }\n+  .offset-by-ten.column,\n+  .offset-by-ten.columns          { margin-left: 86.6666666667%; }\n+  .offset-by-eleven.column,\n+  .offset-by-eleven.columns       { margin-left: 95.3333333333%; }\n+\n+  .offset-by-one-third.column,\n+  .offset-by-one-third.columns    { margin-left: 34.6666666667%; }\n+  .offset-by-two-thirds.column,\n+  .offset-by-two-thirds.columns   { margin-left: 69.3333333333%; }\n+\n+  .offset-by-one-half.column,\n+  .offset-by-one-half.columns     { margin-left: 52%; }\n+\n+}\n+\n+\n+/* Base Styles\n+\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93 */\n+/* NOTE\n+html is set to 62.5% so that all the REM measurements throughout Skeleton\n+are based on 10px sizing. So basically 1.5rem = 15px :) */\n+html {\n+  font-size: 62.5%; }\n+body {\n+  font-size: 1.5em; /* currently ems cause chrome bug '..b'none; }\n+textarea {\n+  min-height: 65px;\n+  padding-top: 6px;\n+  padding-bottom: 6px; }\n+input[type="email"]:focus,\n+input[type="number"]:focus,\n+input[type="search"]:focus,\n+input[type="text"]:focus,\n+input[type="tel"]:focus,\n+input[type="url"]:focus,\n+input[type="password"]:focus,\n+textarea:focus,\n+select:focus {\n+  border: 1px solid #33C3F0;\n+  outline: 0; }\n+label,\n+legend {\n+  display: block;\n+  margin-bottom: .5rem;\n+  font-weight: 600; }\n+fieldset {\n+  padding: 0;\n+  border-width: 0; }\n+input[type="checkbox"],\n+input[type="radio"] {\n+  display: inline; }\n+label > .label-body {\n+  display: inline-block;\n+  margin-left: .5rem;\n+  font-weight: normal; }\n+\n+\n+/* Lists\n+\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93 */\n+ul {\n+  list-style: circle inside; }\n+ol {\n+  list-style: decimal inside; }\n+ol, ul {\n+  padding-left: 0;\n+  margin-top: 0; }\n+ul ul,\n+ul ol,\n+ol ol,\n+ol ul {\n+  margin: 1.5rem 0 1.5rem 3rem;\n+  font-size: 90%; }\n+li {\n+  margin-bottom: 1rem; }\n+\n+\n+/* Code\n+\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93 */\n+code {\n+  padding: .2rem .5rem;\n+  margin: 0 .2rem;\n+  font-size: 90%;\n+  white-space: nowrap;\n+  background: #F1F1F1;\n+  border: 1px solid #E1E1E1;\n+  border-radius: 4px; }\n+pre > code {\n+  display: block;\n+  padding: 1rem 1.5rem;\n+  white-space: pre; }\n+\n+\n+/* Tables\n+\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93 */\n+th,\n+td {\n+  padding: 12px 15px;\n+  text-align: left;\n+  border-bottom: 1px solid #E1E1E1; }\n+\n+/*th:first-child,\n+td:first-child {\n+  padding-left: 0; }\n+th:last-child,\n+td:last-child {\n+  padding-right: 0; }\n+*/\n+\n+/* Spacing\n+\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93 */\n+button,\n+.button {\n+  margin-bottom: 1rem; }\n+input,\n+textarea,\n+select,\n+fieldset {\n+  margin-bottom: 1.5rem; }\n+pre,\n+blockquote,\n+dl,\n+figure,\n+table,\n+p,\n+ul,\n+ol,\n+form {\n+  margin-bottom: 2.5rem; }\n+\n+\n+/* Utilities\n+\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93 */\n+.u-full-width {\n+  width: 100%;\n+  box-sizing: border-box; }\n+.u-max-full-width {\n+  max-width: 100%;\n+  box-sizing: border-box; }\n+.u-pull-right {\n+  float: right; }\n+.u-pull-left {\n+  float: left; }\n+\n+\n+/* Misc\n+\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93 */\n+hr {\n+  margin-top: 3rem;\n+  margin-bottom: 3.5rem;\n+  border-width: 0;\n+  border-top: 1px solid #E1E1E1; }\n+\n+\n+/* Clearing\n+\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93 */\n+\n+/* Self Clearing Goodness */\n+.container:after,\n+.row:after,\n+.u-cf {\n+  content: "";\n+  display: table;\n+  clear: both; }\n+\n+\n+/* Media Queries\n+\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93 */\n+/*\n+Note: The best way to structure the use of media queries is to create the queries\n+near the relevant code. For example, if you wanted to change the styles for buttons\n+on small devices, paste the mobile query code up in the buttons section and style it\n+there.\n+*/\n+\n+\n+/* Larger than mobile */\n+@media (min-width: 400px) {}\n+\n+/* Larger than phablet (also point when grid becomes active) */\n+@media (min-width: 550px) {}\n+\n+/* Larger than tablet */\n+@media (min-width: 750px) {}\n+\n+/* Larger than desktop */\n+@media (min-width: 1000px) {}\n+\n+/* Larger than Desktop HD */\n+@media (min-width: 1200px) {}\n'
b
diff -r 000000000000 -r ca58e9466cbf data/js/custom.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/data/js/custom.js Mon Jun 29 16:38:36 2015 +0100
[
@@ -0,0 +1,11 @@
+$(document).ready(function()
+{
+    $("#counts-table").tablesorter({sortList: [[2,1]]});
+        //assign the sortStart event
+    $("#counts-table").bind("sortStart", function() {
+        $("#overlay").show();
+    }).bind("sortEnd",function() {
+        $("#overlay").hide();
+    });
+}
+);
b
diff -r 000000000000 -r ca58e9466cbf data/js/jquery-1.11.3.min.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/data/js/jquery-1.11.3.min.js Mon Jun 29 16:38:36 2015 +0100
[
b'@@ -0,0 +1,5 @@\n+/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */\n+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,o=/^-ms-/,p=/-([\\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),'..b'0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m});\n'
b
diff -r 000000000000 -r ca58e9466cbf data/js/jquery-1.11.3.min.map
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/data/js/jquery-1.11.3.min.map Mon Jun 29 16:38:36 2015 +0100
[
b'@@ -0,0 +1,1 @@\n+{"version":3,"file":"jquery-1.11.3.min.js","sources":["jquery-1.11.3.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","deletedIds","slice","concat","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","support","version","jQuery","selector","context","fn","init","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","prototype","jquery","constructor","length","toArray","call","get","num","pushStack","elems","ret","merge","prevObject","each","callback","args","map","elem","i","apply","arguments","first","eq","last","len","j","end","sort","splice","extend","src","copyIsArray","copy","name","options","clone","target","deep","isFunction","isPlainObject","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","obj","type","Array","isWindow","isNumeric","parseFloat","isEmptyObject","key","nodeType","e","ownLast","globalEval","data","trim","execScript","camelCase","string","nodeName","toLowerCase","value","isArraylike","text","makeArray","arr","results","Object","inArray","max","second","grep","invert","callbackInverse","matches","callbackExpect","arg","guid","proxy","tmp","now","Date","split","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","MAX_NEGATIVE","pop","push_native","list","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","rwhitespace","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","unloadHandler","childNodes","els","seed","match","m","groups","old","nid","newContext","newSelector","ownerDocument","exec","getElementById","parentNode","id","getElementsByTagName","getElementsByClassName","qsa","test","getAttribute","setAttribute","toSelector","testContext","join","querySelectorAll","qsaError","removeAttribute","keys","cache","cacheLength","shift","markFunction","assert","div","createElement","removeChild","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","parent","doc","defaultView","top","addEventListener","attachEvent","className","appendChild","createComment","getById","getElementsByName","find","filter","attrId","getAttributeNode","tag","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","cont'..b'B,IAAW/lC,GACnB,MAAO7B,GAAOiE,SAAUpC,GACvBA,EACkB,IAAlBA,EAAKyC,SACJzC,EAAKoM,aAAepM,EAAK4jB,cACzB,EAGHzlB,EAAO6nC,QACNC,UAAW,SAAUjmC,EAAMiB,EAAShB,GACnC,GAAIimC,GAAaC,EAASC,EAAWC,EAAQC,EAAWC,EAAYC,EACnElW,EAAWnyB,EAAOyhB,IAAK5f,EAAM,YAC7BymC,EAAUtoC,EAAQ6B,GAClBglB,IAGiB,YAAbsL,IACJtwB,EAAKkd,MAAMoT,SAAW,YAGvBgW,EAAYG,EAAQT,SACpBI,EAAYjoC,EAAOyhB,IAAK5f,EAAM,OAC9BumC,EAAapoC,EAAOyhB,IAAK5f,EAAM,QAC/BwmC,GAAmC,aAAblW,GAAwC,UAAbA,IAChDnyB,EAAOwF,QAAQ,QAAUyiC,EAAWG,IAAiB,GAGjDC,GACJN,EAAcO,EAAQnW,WACtB+V,EAASH,EAAY75B,IACrB85B,EAAUD,EAAY9X,OAEtBiY,EAAS/jC,WAAY8jC,IAAe,EACpCD,EAAU7jC,WAAYikC,IAAgB,GAGlCpoC,EAAOkD,WAAYJ,KACvBA,EAAUA,EAAQ7B,KAAMY,EAAMC,EAAGqmC,IAGd,MAAfrlC,EAAQoL,MACZ2Y,EAAM3Y,IAAQpL,EAAQoL,IAAMi6B,EAAUj6B,IAAQg6B,GAE1B,MAAhBplC,EAAQmtB,OACZpJ,EAAMoJ,KAASntB,EAAQmtB,KAAOkY,EAAUlY,KAAS+X,GAG7C,SAAWllC,GACfA,EAAQylC,MAAMtnC,KAAMY,EAAMglB,GAE1ByhB,EAAQ7mB,IAAKoF,KAKhB7mB,EAAOG,GAAGsC,QACTolC,OAAQ,SAAU/kC,GACjB,GAAKd,UAAUjB,OACd,MAAmBsC,UAAZP,EACN3D,KACAA,KAAKsC,KAAK,SAAUK,GACnB9B,EAAO6nC,OAAOC,UAAW3oC,KAAM2D,EAAShB,IAI3C,IAAIoF,GAASshC,EACZC,GAAQv6B,IAAK,EAAG+hB,KAAM,GACtBpuB,EAAO1C,KAAM,GACb6O,EAAMnM,GAAQA,EAAKuJ,aAEpB,IAAM4C,EAON,MAHA9G,GAAU8G,EAAIJ,gBAGR5N,EAAOsH,SAAUJ,EAASrF,UAMpBA,GAAK6mC,wBAA0B9pB,IAC1C6pB,EAAM5mC,EAAK6mC,yBAEZF,EAAMZ,GAAW55B,IAEhBE,IAAKu6B,EAAIv6B,KAASs6B,EAAIG,aAAezhC,EAAQ0gB,YAAiB1gB,EAAQ2gB,WAAc,GACpFoI,KAAMwY,EAAIxY,MAASuY,EAAII,aAAe1hC,EAAQsgB,aAAiBtgB,EAAQugB,YAAc,KAX9EghB,GAeTtW,SAAU,WACT,GAAMhzB,KAAM,GAAZ,CAIA,GAAI0pC,GAAchB,EACjBiB,GAAiB56B,IAAK,EAAG+hB,KAAM,GAC/BpuB,EAAO1C,KAAM,EAwBd,OArBwC,UAAnCa,EAAOyhB,IAAK5f,EAAM,YAEtBgmC,EAAShmC,EAAK6mC,yBAGdG,EAAe1pC,KAAK0pC,eAGpBhB,EAAS1oC,KAAK0oC,SACR7nC,EAAO+E,SAAU8jC,EAAc,GAAK,UACzCC,EAAeD,EAAahB,UAI7BiB,EAAa56B,KAAQlO,EAAOyhB,IAAKonB,EAAc,GAAK,kBAAkB,GACtEC,EAAa7Y,MAAQjwB,EAAOyhB,IAAKonB,EAAc,GAAK,mBAAmB,KAOvE36B,IAAM25B,EAAO35B,IAAO46B,EAAa56B,IAAMlO,EAAOyhB,IAAK5f,EAAM,aAAa,GACtEouB,KAAM4X,EAAO5X,KAAO6Y,EAAa7Y,KAAOjwB,EAAOyhB,IAAK5f,EAAM,cAAc,MAI1EgnC,aAAc,WACb,MAAO1pC,MAAKyC,IAAI,WACf,GAAIinC,GAAe1pC,KAAK0pC,cAAgB3hC,EAExC,OAAQ2hC,IAAmB7oC,EAAO+E,SAAU8jC,EAAc,SAAuD,WAA3C7oC,EAAOyhB,IAAKonB,EAAc,YAC/FA,EAAeA,EAAaA,YAE7B,OAAOA,IAAgB3hC,QAM1BlH,EAAOyB,MAAQ+lB,WAAY,cAAeI,UAAW,eAAiB,SAAUoc,EAAQzd,GACvF,GAAIrY,GAAM,IAAItC,KAAM2a,EAEpBvmB,GAAOG,GAAI6jC,GAAW,SAAU7zB,GAC/B,MAAOuR,GAAQviB,KAAM,SAAU0C,EAAMmiC,EAAQ7zB,GAC5C,GAAIq4B,GAAMZ,GAAW/lC,EAErB,OAAawB,UAAR8M,EACGq4B,EAAOjiB,IAAQiiB,GAAOA,EAAKjiB,GACjCiiB,EAAIzpC,SAAS6O,gBAAiBo2B,GAC9BniC,EAAMmiC,QAGHwE,EACJA,EAAIO,SACF76B,EAAYlO,EAAQwoC,GAAMhhB,aAApBrX,EACPjC,EAAMiC,EAAMnQ,EAAQwoC,GAAM5gB,aAI3B/lB,EAAMmiC,GAAW7zB,IAEhB6zB,EAAQ7zB,EAAKnO,UAAUjB,OAAQ,SAQpCf,EAAOyB,MAAQ,MAAO,QAAU,SAAUK,EAAGykB,GAC5CvmB,EAAOuzB,SAAUhN,GAAS+J,GAAcxwB,EAAQ0xB,cAC/C,SAAU3vB,EAAM+tB,GACf,MAAKA,IACJA,EAAWJ,GAAQ3tB,EAAM0kB,GAElB+I,GAAU1jB,KAAMgkB,GACtB5vB,EAAQ6B,GAAOswB,WAAY5L,GAAS,KACpCqJ,GALF,WAaH5vB,EAAOyB,MAAQunC,OAAQ,SAAUC,MAAO,SAAW,SAAUpmC,EAAMkB,GAClE/D,EAAOyB,MAAQ6yB,QAAS,QAAUzxB,EAAMmpB,QAASjoB,EAAM,GAAI,QAAUlB,GAAQ,SAAUqmC,EAAcC,GAEpGnpC,EAAOG,GAAIgpC,GAAa,SAAU9U,EAAQpvB,GACzC,GAAI0c,GAAY3f,UAAUjB,SAAYmoC,GAAkC,iBAAX7U,IAC5DnB,EAAQgW,IAAkB7U,KAAW,GAAQpvB,KAAU,EAAO,SAAW,SAE1E,OAAOyc,GAAQviB,KAAM,SAAU0C,EAAMkC,EAAMkB,GAC1C,GAAI+I,EAEJ,OAAKhO,GAAOiE,SAAUpC,GAIdA,EAAK9C,SAAS6O,gBAAiB,SAAW/K,GAI3B,IAAlBhB,EAAKyC,UACT0J,EAAMnM,EAAK+L,gBAIJrK,KAAKkC,IACX5D,EAAKkc,KAAM,SAAWlb,GAAQmL,EAAK,SAAWnL,GAC9ChB,EAAKkc,KAAM,SAAWlb,GAAQmL,EAAK,SAAWnL,GAC9CmL,EAAK,SAAWnL,KAIDQ,SAAV4B,EAENjF,EAAOyhB,IAAK5f,EAAMkC,EAAMmvB,GAGxBlzB,EAAO+e,MAAOld,EAAMkC,EAAMkB,EAAOiuB,IAChCnvB,EAAM4d,EAAY0S,EAAShxB,OAAWse,EAAW,WAOvD3hB,EAAOG,GAAGipC,KAAO,WAChB,MAAOjqC,MAAK4B,QAGbf,EAAOG,GAAGkpC,QAAUrpC,EAAOG,GAAG0Z,QAkBP,kBAAXyvB,SAAyBA,OAAOC,KAC3CD,OAAQ,YAAc,WACrB,MAAOtpC,IAOT,IAECwpC,IAAUtqC,EAAOc,OAGjBypC,GAAKvqC,EAAOwqC,CAwBb,OAtBA1pC,GAAO2pC,WAAa,SAAU1mC,GAS7B,MARK/D,GAAOwqC,IAAM1pC,IACjBd,EAAOwqC,EAAID,IAGPxmC,GAAQ/D,EAAOc,SAAWA,IAC9Bd,EAAOc,OAASwpC,IAGVxpC,SAMIZ,KAAawf,IACxB1f,EAAOc,OAASd,EAAOwqC,EAAI1pC,GAMrBA"}\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r ca58e9466cbf data/js/jquery.tablesorter.min.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/data/js/jquery.tablesorter.min.js Mon Jun 29 16:38:36 2015 +0100
[
b'@@ -0,0 +1,4 @@\n+\n+(function($){$.extend({tablesorter:new\n+function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:\'/\\.|\\,/g\',onRenderHeader:null,selectorHeaders:\'thead th\',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}if(table.tBodies.length==0)return;var rows=table.tBodies[0].rows;if(rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter);}else if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter);}if(!p){p=detectParserForColumn(table,rows,-1,i);}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\\n";}list.push(p);}}if(table.config.debug){log(parsersDebug);}return list;};function detectParserForColumn(table,rows,rowIndex,cellIndex){var l=parsers.length,node=false,nodeValue=false,keepLooking=true;while(nodeValue==\'\'&&keepLooking){rowIndex++;if(rows[rowIndex]){node=getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex);nodeValue=trimAndGetNodeText(table.config,node);if(table.config.debug){log(\'Checking if value was empty on row:\'+rowIndex);}}else{keepLooking=false;}}for(var i=1;i<l;i++){if(parsers[i].is(nodeValue,table,node)){return parsers[i];}}return parsers[0];}function getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex){return rows[rowIndex].cells[cellIndex];}function trimAndGetNodeText(config,node){return $.trim(getElementText(config,node));}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i];}}return false;}function buildCache(table){if(table.config.debug){var cacheTime=new Date();}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=$(table.tBodies[0].rows[i]),cols=[];if(c.hasClass(table.config.cssChildRow)){cache.row[cache.row.length-1]=cache.row[cache.row.length-1].add(c);continue;}cache.row.push(c);for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c[0].cells[j]),table,c[0].cells[j]));}cols.push(cache.normalized.length);cache.normalized.push(cols);cols=null;};if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime);}return cache;};function getElementText(config,node){var text="";if(!node)return"";if(!config.supportsTextContent)config.supportsTextContent=node.textContent||false;if(config.textExtraction=="simple"){if(config.supportsTextContent){text=node.textContent;}else{if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){text=node.childNodes[0].innerHTML;}else{text=node.innerHTML;}}}else{if(typeof(config.textExtraction)=="function"){text=config.textExtraction(node);}else{text=$(node).text();}}return text;}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){var pos=n[i][checkCell];rows.push(r[pos]);if(!table.config.appender){var l=r[pos].length;for(var j=0;j<l;j++){tableBody[0].appendChild(r[pos][j]);}}}if(table.config.appender){table.config.appende'..b'rtList.length>0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false;}}if(a){parsers.push(parser);};};this.addWidget=function(widget){widgets.push(widget);};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i;};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i;};this.isDigit=function(s,config){return/^[-+]?\\d*$/.test($.trim(s.replace(/[,.\']/g,\'\')));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLocaleLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[\xc2\xa3$\xe2\x82\xac?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[\xc2\xa3$\xe2\x82\xac]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\\d{2,3}[\\.]\\d{2,3}[\\.]\\d{2,3}[\\.]\\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\\/\\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\\/\\//),\'\'));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\\d{4}[\\/-]\\d{1,2}[\\/-]\\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\\.? [0-9]{1,2}, ([0-9]{4}|\'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\\s(AM|PM)))$/));},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\\d{1,2}[\\/\\-]\\d{1,2}[\\/\\-]\\d{2,4}/.test(s);},format:function(s,table){var c=table.config;s=s.replace(/\\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\\d{1,2})[\\/\\-](\\d{1,2})[\\/\\-](\\d{4})/,"$3/$1/$2");}else if (c.dateFormat == "pt") {s = s.replace(/(\\d{1,2})[\\/\\-](\\d{1,2})[\\/\\-](\\d{4})/, "$3/$2/$1");} else if(c.dateFormat=="uk"){s=s.replace(/(\\d{1,2})[\\/\\-](\\d{1,2})[\\/\\-](\\d{4})/,"$3/$2/$1");}else if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\\d{1,2})[\\/\\-](\\d{1,2})[\\/\\-](\\d{2})/,"$1/$2/$3");}return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\\s(am|pm)))$/.test(s);},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime());},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false;},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?\'sortValue\':c.parserMetadataName;return $(cell).metadata()[p];},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date();}var $tr,row=-1,odd;$("tr:visible",table.tBodies[0]).each(function(i){$tr=$(this);if(!$tr.hasClass(table.config.cssChildRow))row++;odd=(row%2==0);$tr.removeClass(table.config.widgetZebra.css[odd?0:1]).addClass(table.config.widgetZebra.css[odd?1:0])});if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time);}}});})(jQuery);\n'
b
diff -r 000000000000 -r ca58e9466cbf data/ribocount.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/data/ribocount.html Mon Jun 29 16:38:36 2015 +0100
b
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+
+    <!-- Basic Page Needs
+    –––––––––––––––––––––––––––––––––––––––––––––––––– -->
+    <meta charset="utf-8">
+    <title>Ribo-Seq profile counts</title>
+    <meta name="description" content="">
+    <meta name="author" content="">
+
+    <!-- Mobile Specific Metas
+    –––––––––––––––––––––––––––––––––––––––––––––––––– -->
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+
+    <!-- FONT
+    –––––––––––––––––––––––––––––––––––––––––––––––––– -->
+    <!--<link href="http://fonts.googleapis.com/css?family=Open+Sans:400,300,600"-->
+          <!--rel="stylesheet" type="text/css">-->
+
+    <!-- CSS
+    –––––––––––––––––––––––––––––––––––––––––––––––––– -->
+    <link rel="stylesheet" href="css/normalize.css">
+    <link rel="stylesheet" href="css/skeleton.css">
+    <link rel="stylesheet" href="css/custom.css">
+
+    <!-- Favicon
+    –––––––––––––––––––––––––––––––––––––––––––––––––– -->
+    <link rel="icon" type="image/png" href="images/favicon.png">
+
+</head>
+<body>
+
+<!-- Primary Page Layout
+–––––––––––––––––––––––––––––––––––––––––––––––––– -->
+<div class="container">
+    <div class="row">
+        <div class="twelve columns">
+            <h3 id="page-title">Ribo-Seq profile counts for all transcripts</h3>
+            <h5>Total transcript(s) <span class="info">{count}</span>, Footprint
+                length <span class="info">{length}</span></h5>
+            <div id="overlay">Sorting this large table...</div>
+            <table id="counts-table" class="tablesorter u-full-width">
+                <thead>
+                <tr>
+                    <th>Number</th>
+                    <th>Transcript name</th>
+                    <th>Total reads</th>
+                    <th>Counts (csv file)</th>
+                </tr>
+                </thead>
+                <tbody>
+                {table_content}
+                </tbody>
+            </table>
+            <p class="text-muted">Time taken for generating counts (H:MM:SS): {duration}</p>
+        </div>
+    </div>
+</div>
+<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
+<script type="text/javascript" src="js/jquery.tablesorter.min.js"></script>
+<script type="text/javascript" src="js/custom.js"></script>
+</body>
+</html>
\ No newline at end of file
b
diff -r 000000000000 -r ca58e9466cbf data/ribocount_index.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/data/ribocount_index.html Mon Jun 29 16:38:36 2015 +0100
b
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+
+    <!-- Basic Page Needs
+    –––––––––––––––––––––––––––––––––––––––––––––––––– -->
+    <meta charset="utf-8">
+    <title>Ribo-Seq profile counts</title>
+
+    <!-- Mobile Specific Metas
+    –––––––––––––––––––––––––––––––––––––––––––––––––– -->
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+</head>
+<body>
+
+<h3>Ribocount output</h3>
+<h5>The following zip file contains read counts as CSV files for <em>{count}</em>
+transcripts with read length <em>{read_length}</em>.</h5>
+
+<p>Download: <a href="ribocount_output.zip">ribocount_output.zip</a></p>
+
+<p>Note: To view the list of transcripts and their read counts (in CSV),
+extract the zip file and open "index.html" in a web browser. </p>
+</body>
+</html>
\ No newline at end of file
b
diff -r 000000000000 -r ca58e9466cbf data/riboplot.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/data/riboplot.html Mon Jun 29 16:38:36 2015 +0100
b
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+
+    <!-- Basic Page Needs
+    –––––––––––––––––––––––––––––––––––––––––––––––––– -->
+    <meta charset="utf-8">
+    <title>Ribo-Seq profile plot</title>
+    <meta name="description" content="">
+    <meta name="author" content="">
+
+    <!-- Mobile Specific Metas
+    –––––––––––––––––––––––––––––––––––––––––––––––––– -->
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+
+    <!-- FONT
+    –––––––––––––––––––––––––––––––––––––––––––––––––– -->
+    <!--<link href="http://fonts.googleapis.com/css?family=Open+Sans:400,300,600"-->
+          <!--rel="stylesheet" type="text/css">-->
+
+    <!-- CSS
+    –––––––––––––––––––––––––––––––––––––––––––––––––– -->
+    <link rel="stylesheet" href="css/normalize.css">
+    <link rel="stylesheet" href="css/skeleton.css">
+    <link rel="stylesheet" href="css/custom.css">
+
+    <!-- Favicon
+    –––––––––––––––––––––––––––––––––––––––––––––––––– -->
+    <link rel="icon" type="image/png" href="images/favicon.png">
+
+</head>
+<body>
+
+<!-- Primary Page Layout
+–––––––––––––––––––––––––––––––––––––––––––––––––– -->
+<div class="container">
+    <div class="row">
+        <div id="main" class="twelve columns">
+            <center>
+                <h3>Ribo-Seq profile plot</h3>
+                <p>
+                <img width="100%" class="u-max-full-width" src="ribograph.png"/><br>
+                <p>
+                <h4>Download plots<br>
+                    <a href="ribograph.png">PNG</a>, <a href="ribograph.svg">SVG</a>
+                </h4>
+
+                <h4>Download counts<br>
+                 <a href="RiboCounts.csv">RiboCounts.csv</a>
+                </h4>
+                <p>
+                    <small>
+                        (Right click --> Save link/target as...)
+                    </small>
+                </p>
+            </center>
+        </div>
+    </div>
+</div>
+</body>
+</html>
\ No newline at end of file
b
diff -r 000000000000 -r ca58e9466cbf ribocount.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ribocount.xml Mon Jun 29 16:38:36 2015 +0100
b
@@ -0,0 +1,31 @@
+<tool id="ribocount" name="ribocount" version="0.1.0">
+    <description>Get read counts for all transcripts in an alignment (BAM)
+    </description>
+    <requirements>
+        <requirement type="package" version="0.7.7">pysam</requirement>
+        <requirement type="package" version="0.1.18">samtools</requirement>
+    </requirements>
+    <stdio>
+        <exit_code range="1:"  level="fatal" description="Error" />
+    </stdio>
+    <command interpreter="python">./riboplot/ribocount.py
+    --ribo_file "${ribo_file}"
+    --transcriptome_fasta "${transcriptome_fasta}"
+    --read_length "${read_length}"
+    --read_offset "${read_offset}"
+    --html_file "${html_file}"
+    --output_path "${html_file.files_path}"
+    ## --debug
+    </command>
+    <inputs>
+        <param name="ribo_file" type="data" format="bam" label="Ribo-Seq alignment file in BAM format"/>
+        <param name="transcriptome_fasta" type="data" format="fasta" label="FASTA format file of the transcriptome"/>
+        <param name="read_length" type="integer" label="Read length to consider" value="28"/>
+        <param name="read_offset" type="integer" label="Offset" value="0"/>
+    </inputs>
+    <outputs>
+        <data format="html" name="html_file" label="ribocount (HTML report)"/>
+    </outputs>
+    <help>
+    </help>
+</tool>
b
diff -r 000000000000 -r ca58e9466cbf riboplot.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/riboplot.xml Mon Jun 29 16:38:36 2015 +0100
b
@@ -0,0 +1,54 @@
+<tool id="riboplot" name="riboplot" version="0.1.0">
+    <description>Plot and output read counts for a single transcript in an alignment (BAM)
+    </description>
+    <requirements>
+        <requirement type="package" version="1.2.1">matplotlib</requirement>
+        <requirement type="package" version="0.7.7">pysam</requirement>
+        <requirement type="package" version="0.1.18">samtools</requirement>
+    </requirements>
+    <stdio>
+        <exit_code range="1:"  level="fatal" description="Error" />
+    </stdio>
+    <command interpreter="python">./riboplot/riboplot.py
+    --ribo_file "${ribo_file}"
+    --transcriptome_fasta "${transcriptome_fasta}"
+    --transcript_name "${transcript_name}"
+    #if $rnacov.rnacov_select=="yes"
+        --rna_file "${rna_file}"
+    #end if
+    --read_length "${read_length}"
+    --read_offset "${read_offset}"
+    --html_file "${html_file}"
+    --output_path "${html_file.files_path}"
+    ## --debug
+    </command>
+    <inputs>
+        <param name="ribo_file" type="data" format="bam" label="Ribo-Seq alignment file in BAM format"/>
+        <param name="transcriptome_fasta" type="data" format="fasta" label="FASTA format file of the transcriptome"/>
+        <param name="transcript_name" type="text" label="Name of the transcript to plot (as in FASTA)" size="40">
+            <validator type="expression" message="Please input a single transcript name">len(value.split(',')) == 1</validator>
+            <validator type="empty_field" message="Field requires a value"/>
+            <sanitizer>
+                <valid>
+                    <add value="|"/>
+                </valid>
+            </sanitizer>
+        </param>
+        <conditional name="rnacov">
+            <param name="rnacov_select" type="select" label="Include RNA Coverage">
+                <option value="no">No</option>
+                <option value="yes">Yes</option>
+            </param>
+            <when value="yes">
+                <param name="rna_file" type="data" format="bam" label="RNA-Seq alignment file in BAM format"/>
+            </when>
+        </conditional>
+        <param name="read_length" type="integer" label="Read length to consider" value="28"/>
+        <param name="read_offset" type="integer" label="Offset" value="0"/>
+    </inputs>
+    <outputs>
+        <data format="html" name="html_file" label="riboplot (HTML report)"/>
+    </outputs>
+    <help>
+    </help>
+</tool>
b
diff -r 000000000000 -r ca58e9466cbf riboplot/config.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/riboplot/config.py Mon Jun 29 16:38:36 2015 +0100
[
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+import os
+
+
+class Config(object):
+    # get the running directory of this file, move one level up to get the
+    # application directory
+    APP_DIR = os.path.split(os.path.dirname(os.path.abspath(__file__)))[0]
+
+
+class TestingConfig(Config):
+    """Testing configuration"""
+    DATA_DIR = os.path.join(Config.APP_DIR, 'tests/data')
+
+
+class ProductionConfig(Config):
+    """Production configuration"""
+    # not used now
+    DATA_DIR = os.path.join(Config.APP_DIR, 'data')
b
diff -r 000000000000 -r ca58e9466cbf riboplot/core.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/riboplot/core.py Mon Jun 29 16:38:36 2015 +0100
[
@@ -0,0 +1,66 @@
+"""Common functions. """
+import logging
+import pysam
+
+
+class BAMProfilesError(Exception):
+    pass
+
+
+class BAMFileError(Exception):
+    pass
+
+
+class TranscriptError(Exception):
+    pass
+
+
+class RNACountsError(Exception):
+    """For errors related to RNA Coverage generation using bedtools. """
+    pass
+
+
+def check_bam_file(bam_file):
+    """Check if bam file is indexed. If not, index. """
+    with pysam.AlignmentFile(bam_file, 'rb') as bam_fileobj:
+        try:
+            bam_fileobj.fetch(bam_fileobj.references[0])
+        except ValueError as err:
+            if err.message == 'fetch called on bamfile without index':
+                bam_fileobj.close()
+                logging.debug('Indexing bam file {}'.format(bam_file))
+                pysam.index(bam_file)
+
+
+def get_ribo_counts(ribo_fileobj, transcript_name, read_length=None, read_offset=0):
+    """Get total reads and read counts in all 3 frames for the give transcript
+    from input BAM file (indexed).
+
+    """
+    read_counts = {}
+    total_reads = 0
+
+    if transcript_name not in ribo_fileobj.references:
+        raise BAMFileError('Transcript "{}" does not exist in BAM '
+                           'file. '.format(transcript_name))
+
+    for record in ribo_fileobj.fetch(transcript_name):
+        if read_length:
+            if record.query_length != read_length:
+                continue
+        total_reads += 1
+        position = record.pos + 1
+
+        try:
+            read_counts[position]
+        except KeyError:
+            read_counts[position] = {1: 0, 2: 0, 3: 0}
+
+        rem = position % 3
+        if rem == 0:
+            read_counts[position][3] += 1
+        else:
+            read_counts[position][rem] += 1
+
+    return read_counts, total_reads
+
b
diff -r 000000000000 -r ca58e9466cbf riboplot/ribocount.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/riboplot/ribocount.py Mon Jun 29 16:38:36 2015 +0100
[
@@ -0,0 +1,150 @@
+# check dependencies
+missing_deps = []
+try:
+    import pysam
+except ImportError:
+    missing_deps.append('pysam')
+
+if len(missing_deps):
+    sys.exit('''\nCould not import the following modules. Please check if they
+    (or their dependencies are installed correctly.
+    \n\n{}\n'''.format('\n'.join(missing_deps)))
+
+import os
+import sys
+import timeit
+import shutil
+import zipfile
+import logging
+import argparse
+from datetime import datetime
+
+import core
+import config
+
+# Default is production
+CONFIG = config.ProductionConfig()
+
+
+def create_parser():
+    """Argument parser. """
+    parser = argparse.ArgumentParser(
+        prog='ribograph.counts', description='Output read counts for all transcripts')
+
+    # required arguments
+    required = parser.add_argument_group('required arguments')
+    required.add_argument('--ribo_file', help='Ribo-Seq alignment file in BAM format', required=True)
+    required.add_argument('--transcriptome_fasta', help='FASTA format file of the transcriptome', required=True)
+
+    # optional arguments
+    parser.add_argument('--read_length', help='Read length to consider (default: %(default)s)',
+                        metavar='INTEGER', type=int)
+    parser.add_argument('--read_offset', help='Read offset (default: %(default)s)',
+                        metavar='INTEGER', type=int, default=0)
+    parser.add_argument('--html_file', help='Output file for results (HTML)', default='ribocount.html')
+    parser.add_argument('--output_path', help='Files are saved in this directory', default='output')
+    parser.add_argument('--debug', help='Flag. Produce debug output', action='store_true')
+
+    return parser
+
+
+def main():
+    parsed = create_parser()
+    args = parsed.parse_args()
+
+    if args.debug:
+        level = logging.DEBUG
+    else:
+        level = logging.INFO
+
+    logging.basicConfig(format='%(asctime)s: %(levelname)s %(message)s',
+                        level=level, stream=sys.stdout, datefmt='%d/%m/%Y %I:%M:%S %p')
+
+    start = datetime.now()
+    logging.debug('Start')
+    logging.debug('Supplied Arguments')
+    logging.debug('\n{}'.format('\n'.join(['{:<20}: {}'.format(k, v) for k, v in vars(args).items()])))
+
+    (ribo_file, transcriptome_fasta, read_length, read_offset) = (
+        args.ribo_file, args.transcriptome_fasta, args.read_length, args.read_offset)
+
+    logging.debug('Checking if BAM file is indexed')
+    core.check_bam_file(ribo_file)
+
+    logging.debug('Get transcript information')
+    fasta_file = pysam.FastaFile(transcriptome_fasta)
+
+    count = 0
+    table_content = ''
+
+    if not os.path.exists(args.output_path):
+        os.mkdir(args.output_path)
+
+    output_path = os.path.join(args.output_path, 'ribocount_output')
+    if not os.path.exists(output_path):
+        os.mkdir(output_path)
+
+    csv_dir = os.path.join(output_path, 'csv')
+    if not os.path.exists(csv_dir):
+        os.mkdir(csv_dir)
+
+    bam_fileobj = pysam.AlignmentFile(ribo_file, 'rb')
+    for transcript in fasta_file.references:
+        rp_counts, rp_reads = core.get_ribo_counts(bam_fileobj, transcript, read_length, read_offset)
+
+        if not rp_reads:
+            continue
+
+        logging.debug('Writing counts for {}'.format(transcript))
+        count += 1
+        csv_file = 'RiboCounts{}.csv'.format(count)
+        with open(os.path.join(csv_dir, csv_file), 'w') as f:
+            f.write('"Position","Frame 1","Frame 2","Frame 3"\n')
+
+            for pos in range(1, len(fasta_file[transcript]) + 1):
+                if pos in rp_counts:
+                    f.write('{0},{1},{2},{3}\n'.format(
+                        pos, rp_counts[pos][1], rp_counts[pos][2], rp_counts[pos][3]))
+                else:
+                    f.write('{0},{1},{2},{3}\n'.format(pos, 0, 0, 0))
+        if count % 2 == 0:
+            table_content += '<tr>'
+        else:
+            table_content += '<tr class="odd">'
+        table_content += '<td>{0}</td><td>{1}</td><td>{2}</td><td><a href="csv/{3}">{3}</a></td></tr>'.format(
+            count, transcript, rp_reads, csv_file)
+    bam_fileobj.close()
+
+    if not read_length:
+        read_length = 'All'
+
+    duration = str(datetime.now() - start).split('.')[0]
+    logging.debug('Time taken for generating counts {}'.format(duration))
+
+    with open(os.path.join(CONFIG.DATA_DIR, 'ribocount.html')) as g,\
+            open(os.path.join(output_path, 'index.html'), 'w') as h:
+        h.write(g.read().format(count=count, length=read_length, table_content=table_content, duration=duration))
+
+    for asset in ('css', 'js'):
+        asset_dir = os.path.join(output_path, asset)
+        if not os.path.exists(asset_dir):
+            os.mkdir(asset_dir)
+        asset_data_dir = os.path.join(CONFIG.DATA_DIR, asset)
+        for fname in os.listdir(asset_data_dir):
+            shutil.copy(os.path.join(asset_data_dir, fname),
+                        os.path.join(output_path, asset, fname))
+
+    logging.debug('Creating zip file')
+    os.chdir(args.output_path)
+    with zipfile.ZipFile('ribocount_output.zip', 'w') as zip:
+        for root, d, f in os.walk('ribocount_output'):
+            for name in f:
+                zip.write(os.path.join(root, name))
+
+    logging.debug('Writing HTML report')
+
+    with open(os.path.join(CONFIG.DATA_DIR, 'ribocount_index.html')) as j, open(args.html_file, 'w') as k:
+        k.write(j.read().format(count=count, read_length=read_length))
+
+if __name__ == '__main__':
+    print timeit.timeit('main()', number=1, setup='from __main__ import main')
b
diff -r 000000000000 -r ca58e9466cbf riboplot/riboplot.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/riboplot/riboplot.py Mon Jun 29 16:38:36 2015 +0100
[
b'@@ -0,0 +1,319 @@\n+# check dependencies\n+missing_deps = []\n+try:\n+    import pysam\n+except ImportError:\n+    missing_deps.append(\'pysam\')\n+\n+try:\n+    from matplotlib import pyplot as plt\n+except ImportError:\n+    missing_deps.append(\'matplotlib\')\n+else:\n+    from matplotlib import gridspec\n+    from matplotlib.font_manager import FontProperties\n+\n+if len(missing_deps):\n+    sys.exit(\'\'\'\\nCould not import the following modules. Please check if they\n+    (or their dependencies are installed correctly.\n+    \\n\\n{}\\n\'\'\'.format(\'\\n\'.join(missing_deps)))\n+\n+\n+import os\n+import re\n+import sys\n+import config\n+import pysam\n+import timeit\n+import shutil\n+import logging\n+import tempfile\n+import argparse\n+import subprocess\n+\n+import core\n+# Default is production\n+CONFIG = config.ProductionConfig()\n+\n+\n+def get_start_stops(transcript_sequence, start_codons=None, stop_codons=None):\n+        """Return start and stop positions for all frames in the given\n+        transcript.\n+\n+        """\n+        if not start_codons:\n+            start_codons = [\'ATG\']\n+        if not stop_codons:\n+            stop_codons = [\'TAA\', \'TAG\', \'TGA\']\n+\n+        seq_frames = {1: {\'starts\': [], \'stops\': []},\n+                      2: {\'starts\': [], \'stops\': []},\n+                      3: {\'starts\': [], \'stops\': []}}\n+\n+        for codons, positions in ((start_codons, \'starts\'),\n+                                  (stop_codons, \'stops\')):\n+            if len(codons) > 1:\n+                pat = re.compile(\'|\'.join(codons))\n+            else:\n+                pat = re.compile(codons[0])\n+\n+            for m in re.finditer(pat, transcript_sequence):\n+                # Increment position by 1, Frame 1 starts at position 1 not 0\n+                start = m.start() + 1\n+                rem = start % 3\n+                if rem == 1:  # frame 1\n+                    seq_frames[1][positions].append(start)\n+                elif rem == 2:  # frame 2\n+                    seq_frames[2][positions].append(start)\n+                elif rem == 0:  # frame 3\n+                    seq_frames[3][positions].append(start)\n+        return seq_frames\n+\n+\n+def get_rna_counts(rna_file, transcript_name):\n+    """Get coverage for a given RNA BAM file, return read counts. """\n+    try:\n+        subprocess.check_output([\'bedtools\', \'--version\'])\n+    except OSError:\n+        logging.error(\'Could not find bedtools in PATH. bedtools is \'\n+                      \'required for generating RNA coverage plot. \')\n+        raise\n+    logging.debug(\'Get RNA coverage for transcript using bedtools\')\n+    # check if the RNA file exists\n+    if not os.path.exists(rna_file):\n+        msg = \'RNA-Seq BAM file "{}" does not exist\'.format(rna_file)\n+        logging.error(msg)\n+        raise OSError(msg)\n+    rna_counts = {}\n+\n+    cov_file = tempfile.NamedTemporaryFile(delete=False)\n+    try:\n+        subprocess.check_call(\n+            [\'bedtools\', \'genomecov\', \'-ibam\', rna_file,\n+             \'-bg\'], stdout=cov_file)\n+    except subprocess.CalledProcessError as e:\n+        # needs testing\n+        raise core.RNACountsError(\'Could not generate coverage for RNA BAM file. \\n{}\\n\'.format(e))\n+    logging.debug(\'Finished generating RNA coverage\')\n+    logging.debug(\'Processing coverage file\')\n+    for line in open(cov_file.name):\n+        line = line.split()\n+        if line[0] == transcript_name:\n+            position, count = int(line[1]) + 1, int(line[3])\n+            rna_counts[position] = count\n+    cov_file.close()\n+    os.unlink(cov_file.name)\n+    logging.debug(\'Finished processing coverage file\')\n+    return rna_counts\n+\n+\n+def plot_profile(ribo_counts, transcript_name, transcript_length,\n+                 start_stops, read_length=None, read_offset=None, rna_counts=None,\n+                 html_file=\'index.html\', output_path=\'output\'):\n+    """Plot read counts (in all 3 frames) and RNA coverage if provided for a\n+    single transcript.\n+\n+    """\n+    gs = gridspec.GridSpec(4, 1, height_ratios=[7, 1, 1, 1])\n+    '..b't file in BAM format\', required=True)\n+    required.add_argument(\'--transcriptome_fasta\', help=\'FASTA format file of the transcriptome\', required=True)\n+    required.add_argument(\'--transcript_name\', help=\'Transcript name\', metavar=\'TEXT\', required=True)\n+\n+    # plot function - optional arguments\n+    parser.add_argument(\'--rna_file\', help=\'RNA-Seq alignment file (BAM)\')\n+    parser.add_argument(\'--read_length\', help=\'Read length to consider (default: %(default)s)\',\n+                        metavar=\'INTEGER\', type=int)\n+    parser.add_argument(\'--read_offset\', help=\'Read offset (default: %(default)s)\',\n+                        metavar=\'INTEGER\', type=int, default=0)\n+    parser.add_argument(\'--html_file\', help=\'Output file for results (HTML)\', default=\'index.html\')\n+    parser.add_argument(\'--output_path\', help=\'Files are saved in this directory\', default=\'output\')\n+    parser.add_argument(\'--debug\', help=\'Flag. Produce debug output\', action=\'store_true\')\n+\n+    return parser\n+\n+\n+def main():\n+    """Start program. """\n+    parsed = create_parser()\n+    args = parsed.parse_args()\n+\n+    if args.debug:\n+        level = logging.DEBUG\n+    else:\n+        level = logging.INFO\n+\n+    logging.basicConfig(format=\'%(asctime)s: %(levelname)s %(message)s\',\n+                        level=level, stream=sys.stdout, datefmt=\'%d/%m/%Y %I:%M:%S %p\')\n+\n+    logging.debug(\'Start\')\n+    logging.debug(\'Supplied Arguments\')\n+    logging.debug(\'\\n{}\'.format(\'\\n\'.join([\'{:<20}: {}\'.format(k, v) for k, v in vars(args).items()])))\n+\n+    (ribo_file, rna_file, transcript_name, transcriptome_fasta, read_length,\n+     read_offset, output_path) = (args.ribo_file, args.rna_file, args.transcript_name,\n+                     args.transcriptome_fasta, args.read_length, args.read_offset, args.output_path)\n+\n+    logging.debug(\'Checking if BAM file is indexed...\')\n+    core.check_bam_file(ribo_file)\n+\n+    logging.debug(\'Get transcript information...\')\n+    transcripts = pysam.FastaFile(transcriptome_fasta)\n+    sequence = transcripts.fetch(transcript_name)\n+    length = len(sequence)\n+\n+    if not length:\n+        logging.error(\'Transcript "{}" does not exist in transcriptome \'\n+                      \'FASTA file "{}"\'.format(transcript_name, os.path.basename(transcriptome_fasta)))\n+        sys.exit(1)\n+\n+    logging.debug(\'Get start/stop positions in transcript (3 frames)...\')\n+    codon_positions = get_start_stops(sequence)\n+\n+    mrna_counts = {}\n+    if rna_file:\n+        try:\n+            mrna_counts = get_rna_counts(rna_file, transcript_name)\n+        except OSError as e:\n+            sys.exit(e)\n+    else:\n+        logging.debug(\'No RNA-Seq data provided. Not generating coverage\')\n+\n+    logging.debug(\'Get ribo-seq read counts and total reads in Ribo-Seq...\')\n+    bam_fileobj = pysam.AlignmentFile(ribo_file, \'rb\')\n+    ribo_counts, total_reads = core.get_ribo_counts(bam_fileobj, transcript_name, read_length, read_offset)\n+    bam_fileobj.close()\n+\n+    if not os.path.exists(output_path):\n+        os.mkdir(output_path)\n+\n+    logging.debug(\'Writing counts for {}\'.format(transcript_name))\n+    with open(os.path.join(output_path, \'RiboCounts.csv\'), \'w\') as f:\n+        f.write(\'"Position","Frame 1","Frame 2","Frame 3"\\n\')\n+\n+        for pos in range(1, length + 1):\n+            if pos in ribo_counts:\n+                f.write(\'{0},{1},{2},{3}\\n\'.format(\n+                    pos, ribo_counts[pos][1], ribo_counts[pos][2], ribo_counts[pos][3]))\n+            else:\n+                f.write(\'{0},{1},{2},{3}\\n\'.format(pos, 0, 0, 0))\n+\n+    logging.debug(\'Generating plot...\')\n+    plot_profile(ribo_counts, transcript_name, length,\n+                 codon_positions, read_length, read_offset, mrna_counts,\n+                 html_file=os.path.join(args.output_path, args.html_file),\n+                 output_path=args.output_path)\n+    logging.debug(\'Finished\')\n+\n+\n+if __name__ == \'__main__\':\n+    print timeit.timeit(\'main()\', number=1, setup=\'from __main__ import main\')\n'
b
diff -r 000000000000 -r ca58e9466cbf runtests.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/runtests.sh Mon Jun 29 16:38:36 2015 +0100
b
@@ -0,0 +1,2 @@
+#!/bin/bash
+python -m unittest discover --verbose
b
diff -r 000000000000 -r ca58e9466cbf tests/test_plot.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test_plot.py Mon Jun 29 16:38:36 2015 +0100
[
@@ -0,0 +1,52 @@
+import os
+import logging
+import unittest
+
+from riboplot import core, config, plot
+
+# use testing configuration
+CONFIG = plot.CONFIG = config.TestingConfig()
+logging.disable(logging.CRITICAL)
+
+RIBO_FILE = os.path.join(CONFIG.DATA_DIR, '5hRPFsorted.bam')
+RNA_FILE = os.path.join(CONFIG.DATA_DIR, '5hmRNAsorted.bam')
+TRANSCRIPT_NAME = 'gi|148357119|ref|NM_001098396.1|'
+TRANSCRIPTOME_FASTA = os.path.join(CONFIG.DATA_DIR, 'zebrafish.fna')
+TRANSCRIPTOME_FASTA_MINUS1 = os.path.join(CONFIG.DATA_DIR, 'zebrafish_minus1.fna')
+
+class RNACountsTestCase(unittest.TestCase):
+
+    def test_get_rna_counts(self):
+        """Test get RNA counts for transcript from RNA-Seq BAM file"""
+        counts = plot.get_rna_counts(rna_file=RNA_FILE, transcript_name=TRANSCRIPT_NAME)
+        self.assertIsInstance(counts, dict)
+        self.assertTrue(len(counts) > 0)
+
+    def test_missing_rna_file(self):
+        """Exit with error if RNA BAM file does not exist. """
+        self.assertRaises(OSError, plot.get_rna_counts, rna_file='{}.absent'.format(RNA_FILE),
+                          transcript_name=TRANSCRIPT_NAME)
+
+    def test_missing_bedtools(self):
+        """Exit with error if bedtools is missing."""
+        # reset env temporarily
+        paths = os.environ['PATH']
+        os.environ['PATH'] = ''
+        self.assertRaises(OSError, plot.get_rna_counts, rna_file=RNA_FILE,
+                          transcript_name=TRANSCRIPT_NAME)
+        os.environ['PATH'] = paths
+
+
+class PlotTestCase(unittest.TestCase):
+
+    def test_get_codon_positions(self):
+        """Test get codon positions. """
+        # input is the sequence obtained from get_transcript so no new lines.
+        fasta = ('AACCGGAGCACCCAGAGAAAACCCACGCAAACGCAGGGAGAATTTGCAAACTCCACACA'
+                 'GAAATGCCAGCTGATCCAGCCGAGCCTCGAGTCAGCATCCTTGCTTGTTGGATGCCTGA'
+                 'TTGCAGTTCAACTCCAAACTCAGTTGGACCAGCTGATCAGTG')
+        codon_positions = plot.get_start_stops(fasta)
+        expected = {1: {'starts': [], 'stops': []},
+                    2: {'starts': [], 'stops': [71, 116, 152]},
+                    3: {'starts': [63, 111], 'stops': []}}
+        self.assertEqual(codon_positions, expected)
\ No newline at end of file
b
diff -r 000000000000 -r ca58e9466cbf tool_dependencies.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool_dependencies.xml Mon Jun 29 16:38:36 2015 +0100
b
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<tool_dependency>
+    <package name="matplotlib" version="1.2.1">
+        <repository changeset_revision="d22042e5e279" name="package_matplotlib_1_2"
+                    owner="ribogalaxy" prior_installation_required="True"
+                    toolshed="http://toolshed.ribogalaxy.ucc.ie" />
+    </package>
+    <package name="pysam" version="0.7.7">
+        <repository changeset_revision="0e8f87bbc1e8" name="package_pysam_0_7_7"
+                    owner="ribogalaxy" prior_installation_required="True"
+                    toolshed="http://toolshed.ribogalaxy.ucc.ie" />
+    </package>
+    <package name="samtools" version="0.1.18">
+        <repository changeset_revision="4407d444b269" name="package_samtools_0_1_18"
+                    owner="ribogalaxy" prior_installation_required="True"
+                    toolshed="http://toolshed.ribogalaxy.ucc.ie" />
+    </package>
+</tool_dependency>