Mercurial > repos > iuc > meme_fimo
changeset 15:0c5239d1aa65 draft
"planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/meme commit 86a94f48321780dbe18ef5b099434c347ec2f4d0"
line wrap: on
line diff
--- a/fimo.xml Wed Dec 12 02:50:48 2018 -0500 +++ b/fimo.xml Wed Dec 11 18:05:35 2019 -0500 @@ -47,7 +47,7 @@ '${fasta_type.input_database.fields.path}' #end if && mv ./out/fimo.html '${html_outfile}' -&& mv ./out/fimo.txt '${txt_outfile}' +&& mv ./out/fimo.tsv '${txt_outfile}' && mv ./out/fimo.xml '${xml_outfile}' && mv ./out/fimo.gff '${gff_outfile}' ]]></command> @@ -235,10 +235,10 @@ <param name="xml_outfile" value="True"/> <param name="gff_outfile" value="True"/> <param name="non_commercial_use" value="True"/> - <output name="html_outfile" file="fimo_output_test1.html" lines_diff="20"/> - <output name="txt_outfile" file="fimo_output_test1.txt"/> - <output name="xml_outfile" file="fimo_output_test1.xml" lines_diff="20"/> - <output name="gff_outfile" file="fimo_output_test1.gff"/> + <output name="html_outfile" file="fimo_output_test1.html" compare="contains"/> + <output name="txt_outfile" file="fimo_output_test1.txt" compare="contains"/> + <output name="xml_outfile" file="fimo_output_test1.xml" compare="contains"/> + <output name="gff_outfile" file="fimo_output_test1.gff" compare="contains"/> </test> <test expect_num_outputs="4"> <param name="input_motifs" value="dreme_fimo_input_1.xml" ftype="memexml"/> @@ -252,10 +252,10 @@ <param name="xml_outfile" value="True"/> <param name="gff_outfile" value="True"/> <param name="non_commercial_use" value="True"/> - <output name="html_outfile" file="fimo_output_test2.html" lines_diff="20"/> - <output name="txt_outfile" file="fimo_output_test2.txt"/> - <output name="xml_outfile" file="fimo_output_test2.xml" lines_diff="20"/> - <output name="gff_outfile" file="fimo_output_test2.gff"/> + <output name="html_outfile" file="fimo_output_test2.html" compare="contains"/> + <output name="txt_outfile" file="fimo_output_test2.txt" compare="contains"/> + <output name="xml_outfile" file="fimo_output_test2.xml" compare="contains"/> + <output name="gff_outfile" file="fimo_output_test2.gff" compare="contains"/> </test> <test expect_num_outputs="3"> <param name="input_motifs" value="dreme_fimo_input_1.xml" ftype="memexml"/> @@ -273,9 +273,9 @@ <param name="xml_outfile" value="True"/> <param name="gff_outfile" value="False"/> <param name="non_commercial_use" value="True"/> - <output name="html_outfile" file="fimo_output_test3.html" lines_diff="20"/> - <output name="txt_outfile" file="fimo_output_test3.txt"/> - <output name="xml_outfile" file="fimo_output_test3.xml" lines_diff="20"/> + <output name="html_outfile" file="fimo_output_test3.html" compare="contains"/> + <output name="txt_outfile" file="fimo_output_test3.txt" compare="contains"/> + <output name="xml_outfile" file="fimo_output_test3.xml" compare="contains"/> </test> </tests> <help>
--- a/macros.xml Wed Dec 12 02:50:48 2018 -0500 +++ b/macros.xml Wed Dec 11 18:05:35 2019 -0500 @@ -1,10 +1,9 @@ <?xml version='1.0' encoding='UTF-8'?> <macros> - <token name="@WRAPPER_VERSION@">4.12.0</token> + <token name="@WRAPPER_VERSION@">5.0.5</token> <xml name="requirements"> <requirements> - <requirement type="package" version="1.3.23">graphicsmagick</requirement> - <requirement type="package" version="4.12.0">meme</requirement> + <requirement type="package" version="5.0.5">meme</requirement> <yield/> </requirements> </xml>
--- a/test-data/dreme_output_test1.html Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/dreme_output_test1.html Wed Dec 11 18:05:35 2019 -0500 @@ -7,10 +7,9 @@ // @JSON_VAR data var data = { "program": "dreme", - "version": "4.12.0", - "release": "Tue Jun 27 16:22:50 2017 -0700", + "version": "5.0.5", "cmd": [ - "dreme", "-o", "./dreme_test1_out", "-p", "dreme_test_sites.fa", + "dreme", "-o", "./dreme_out", "-p", "-norc", "-rna", "-s", "1" ], "options": { @@ -20,95 +19,19 @@ "seed": 1, "stop": { "evalue": "0.05" - } - }, "alphabet": { "name": "RNA", "like": "rna", "ncore": 4, "symbols": [ - { - "symbol": "A", - "name": "Adenine", - "colour": "CC0000" - }, { - "symbol": "C", - "name": "Cytosine", - "colour": "0000CC" - }, { - "symbol": "G", - "name": "Guanine", - "colour": "FFB300" - }, { - "symbol": "U", - "aliases": "T", - "name": "Uracil", - "colour": "008000" - }, { - "symbol": "N", - "aliases": "X.", - "name": "Any base", - "equals": "ACGU" - }, { - "symbol": "V", - "name": "Not U", - "equals": "ACG" - }, { - "symbol": "H", - "name": "Not G", - "equals": "ACU" - }, { - "symbol": "D", - "name": "Not C", - "equals": "AGU" - }, { - "symbol": "B", - "name": "Not A", - "equals": "CGU" - }, { - "symbol": "M", - "name": "Amino", - "equals": "AC" - }, { - "symbol": "R", - "name": "Purine", - "equals": "AG" - }, { - "symbol": "W", - "name": "Weak", - "equals": "AU" - }, { - "symbol": "S", - "name": "Strong", - "equals": "CG" - }, { - "symbol": "Y", - "name": "Pyrimidine", - "equals": "CU" - }, { - "symbol": "K", - "name": "Keto", - "equals": "GU" - } - ] - }, "background": { "freqs": [0.221, 0.245, 0.221, 0.312] - }, - "sequence_db": { - "name": "dreme test sites", - "file": "dreme_test_sites.fa", - "lmod": "Thu Apr 26 15:09:03 CEST 2018", - "count": 1000 - }, "control_db": { "name": "shuffled positive sequences", "from": "shuffled", "count": 1000, "freqs": [0.221, 0.245, 0.221, 0.312] - }, "motifs": [ - { "db": 0, "id": "UUYUCY", "alt": "DREME-1", @@ -126,9 +49,7 @@ [0.000000, 0.000000, 0.000000, 1.000000], [0.000000, 1.000000, 0.000000, 0.000000], [0.000000, 0.474946, 0.000000, 0.525054] - ], "matches": [ - { "seq": "UUUUCC", "p": 147, "n": 75, @@ -140,6059 +61,53 @@ "n": 94, "pvalue": "2.2e-005", "evalue": "1.0e+000" - }, { "seq": "UUCUCU", "p": 94, "n": 51, "pvalue": "1.3e-004", "evalue": "6.1e+000" - }, { "seq": "UUCUCC", "p": 75, "n": 42, "pvalue": "1.1e-003", "evalue": "5.0e+001" - } - ] - }, { - "db": 0, - "id": "YAGG", - "alt": "DREME-2", - "len": 4, - "nsites": 793, - "evalue": "5.1e-012", - "p": 600, - "n": 416, - "pvalue": "1.1e-016", - "unerased_evalue": "2.4e-012", - "pwm": [ - [0.000000, 0.692308, 0.000000, 0.307692], - [1.000000, 0.000000, 0.000000, 0.000000], - [0.000000, 0.000000, 1.000000, 0.000000], - [0.000000, 0.000000, 1.000000, 0.000000] - ], - "matches": [ - { - "seq": "CAGG", - "p": 441, - "n": 304, - "pvalue": "1.5e-010", - "evalue": "6.6e-006" - }, { - "seq": "UAGG", - "p": 232, - "n": 165, - "pvalue": "1.1e-004", - "evalue": "4.7e+000" - } - ] - }, { - "db": 0, - "id": "GAAGAW", - "alt": "DREME-3", - "len": 6, - "nsites": 89, - "evalue": "3.4e-005", - "p": 81, - "n": 22, - "pvalue": "8.2e-010", - "unerased_evalue": "3.5e-004", - "pwm": [ - [0.000000, 0.000000, 1.000000, 0.000000], - [1.000000, 0.000000, 0.000000, 0.000000], - [1.000000, 0.000000, 0.000000, 0.000000], - [0.000000, 0.000000, 1.000000, 0.000000], - [1.000000, 0.000000, 0.000000, 0.000000], - [0.494382, 0.000000, 0.000000, 0.505618] - ], - "matches": [ - { - "seq": "GAAGAU", - "p": 45, - "n": 7, - "pvalue": "2.4e-008", - "evalue": "9.9e-004" - }, { - "seq": "GAAGAA", - "p": 40, - "n": 16, - "pvalue": "7.9e-004", - "evalue": "3.3e+001" - } - ] - }, { - "db": 0, - "id": "SMUGGA", - "alt": "DREME-4", - "len": 6, - "nsites": 119, - "evalue": "3.7e-003", - "p": 110, - "n": 47, - "pvalue": "9.1e-008", - "unerased_evalue": "2.6e-005", - "pwm": [ - [0.000000, 0.529412, 0.470588, 0.000000], - [0.428571, 0.571429, 0.000000, 0.000000], - [0.000000, 0.000000, 0.000000, 1.000000], - [0.000000, 0.000000, 1.000000, 0.000000], - [0.000000, 0.000000, 1.000000, 0.000000], - [1.000000, 0.000000, 0.000000, 0.000000] - ], - "matches": [ - { - "seq": "GAUGGA", - "p": 22, - "n": 6, - "pvalue": "1.7e-003", - "evalue": "7.1e+001" - }, { - "seq": "GCUGGA", - "p": 33, - "n": 14, - "pvalue": "3.6e-003", - "evalue": "1.5e+002" - }, { - "seq": "CCUGGA", - "p": 32, - "n": 15, - "pvalue": "8.6e-003", - "evalue": "3.5e+002" - }, { - "seq": "CAUGGA", - "p": 29, - "n": 13, - "pvalue": "9.1e-003", - "evalue": "3.7e+002" - } - ] - } - ], - "runtime": { - "host": "ThinkPad-T450s", - "when": "Thu May 03 13:22:29 CEST 2018", - "cpu": 13.95, - "real": 13.95, - "stop": "evalue" - } - }; - </script> <script> var site_url = "http://meme-suite.org"; </script> - <script> - -/* - * $ - * - * Shorthand function for getElementById - */ -function $(el) { - return document.getElementById(el); -} - - -/* - * See http://stackoverflow.com/a/5450113/66387 - * Does string multiplication like the perl x operator. - */ -function string_mult(pattern, count) { - if (count < 1) return ''; - var result = ''; - while (count > 1) { - if (count & 1) result += pattern; - count >>= 1, pattern += pattern; - } - return result + pattern; -} - -/* - * See http://stackoverflow.com/questions/814613/how-to-read-get-data-from-a-url-using-javascript - * Slightly modified with information from - * https://developer.mozilla.org/en/DOM/window.location - */ -function parse_params() { - "use strict"; - var search, queryStart, queryEnd, query, params, nvPairs, i, nv, n, v; - search = window.location.search; - queryStart = search.indexOf("?") + 1; - queryEnd = search.indexOf("#") + 1 || search.length + 1; - query = search.slice(queryStart, queryEnd - 1); - - if (query === search || query === "") return {}; - - params = {}; - nvPairs = query.replace(/\+/g, " ").split("&"); - - for (i = 0; i < nvPairs.length; i++) { - nv = nvPairs[i].split("="); - n = decodeURIComponent(nv[0]); - v = decodeURIComponent(nv[1]); - // allow a name to be used multiple times - // storing each value in the array - if (!(n in params)) { - params[n] = []; - } - params[n].push(nv.length === 2 ? v : null); - } - return params; -} - -/* - * coords - * - * Calculates the x and y offset of an element. - * From http://www.quirksmode.org/js/findpos.html - * with alterations to take into account scrolling regions - */ -function coords(elem) { - var myX = myY = 0; - if (elem.getBoundingClientRect) { - var rect; - rect = elem.getBoundingClientRect(); - myX = rect.left + ((typeof window.pageXOffset !== "undefined") ? - window.pageXOffset : document.body.scrollLeft); - myY = rect.top + ((typeof window.pageYOffset !== "undefined") ? - window.pageYOffset : document.body.scrollTop); - } else { - // this fall back doesn't properly handle absolutely positioned elements - // inside a scrollable box - var node; - if (elem.offsetParent) { - // subtract all scrolling - node = elem; - do { - myX -= node.scrollLeft ? node.scrollLeft : 0; - myY -= node.scrollTop ? node.scrollTop : 0; - } while (node = node.parentNode); - // this will include the page scrolling (which is unwanted) so add it back on - myX += (typeof window.pageXOffset !== "undefined") ? window.pageXOffset : document.body.scrollLeft; - myY += (typeof window.pageYOffset !== "undefined") ? window.pageYOffset : document.body.scrollTop; - // sum up offsets - node = elem; - do { - myX += node.offsetLeft; - myY += node.offsetTop; - } while (node = node.offsetParent); - } - } - return [myX, myY]; -} - -/* - * position_popup - * - * Positions a popup relative to an anchor element. - * - * The avaliable positions are: - * 0 - Centered below the anchor. - */ -function position_popup(anchor, popup, position) { - "use strict"; - var a_x, a_y, a_w, a_h, p_x, p_y, p_w, p_h; - var a_xy, spacer, margin, scrollbar, page_w; - // define constants - spacer = 5; - margin = 15; - scrollbar = 15; - // define the positions and widths - a_xy = coords(anchor); - a_x = a_xy[0]; - a_y = a_xy[1]; - a_w = anchor.offsetWidth; - a_h = anchor.offsetHeight; - p_w = popup.offsetWidth; - p_h = popup.offsetHeight; - page_w = null; - if (window.innerWidth) { - page_w = window.innerWidth; - } else if (document.body) { - page_w = document.body.clientWidth; - } - // check the position type is defined - if (typeof position !== "number") { - position = 0; - } - // calculate the popup position - switch (position) { - case 1: - p_x = a_x + a_w + spacer; - p_y = a_y + (a_h / 2) - (p_h / 2); - break; - case 0: - default: - p_x = a_x + (a_w / 2) - (p_w / 2); - p_y = a_y + a_h + spacer; - break; - } - // constrain the popup position - if (p_x < margin) { - p_x = margin; - } else if (page_w != null && (p_x + p_w) > (page_w - margin - scrollbar)) { - p_x = page_w - margin - scrollbar - p_w; - } - if (p_y < margin) { - p_y = margin; - } - // position the popup - popup.style.left = p_x + "px"; - popup.style.top = p_y + "px"; -} - -function lookup_help_popup(popup_id) { - var _body, pop, info; - pop = document.getElementById(popup_id); - if (pop == null) { - _body = document.getElementsByTagName("body")[0]; - pop = document.createElement("div"); - pop.className = "pop_content"; - pop.id = popup_id; - pop.style.backgroundColor = "#FFC"; - pop.style.borderColor = "black"; - info = document.createElement("p"); - info.style.fontWeight = "bold"; - info.appendChild(document.createTextNode("Error: No popup for topic \"" + popup_id + "\".")); - pop.appendChild(info); - // this might cause problems with the menu, but as this only happens - // when something is already wrong I don't think that's too much of a problem - _body.insertBefore(pop, _body.firstChild); - } - if (document.getElementsByTagName('body')[0].hasAttribute("data-autobtns")) { - if (!/\bauto_buttons\b/.test(pop.className)) { - pop.className += " auto_buttons"; - var back_btn_sec = document.createElement("div"); - back_btn_sec.className = "nested_only pop_back_sec"; - var back_btn = document.createElement("span"); - back_btn.className = "pop_back"; - back_btn.appendChild(document.createTextNode("<< back")); - back_btn.addEventListener("click", function(e) { - help_return(); - }, false); - back_btn_sec.appendChild(back_btn); - pop.insertBefore(back_btn_sec, pop.firstChild); - var close_btn_sec = document.createElement("div"); - close_btn_sec.className = "pop_close_sec"; - var close_btn = document.createElement("span"); - close_btn.className = "pop_close"; - close_btn.appendChild(document.createTextNode("close")); - close_btn.addEventListener("click", function(e) { - help_popup(); - }, false); - close_btn_sec.appendChild(close_btn); - pop.appendChild(close_btn_sec); - } - } - return pop; -} - -/* - * help_popup - * - * Moves around help pop-ups so they appear - * below an activator. - */ -function help_popup(activator, popup_id) { - "use strict"; - var pop; - // set default values - if (typeof help_popup.popup === "undefined") { - help_popup.popup = []; - } - if (typeof help_popup.activator === "undefined") { - help_popup.activator = null; - } - var last_pop = (help_popup.popup.length > 0 ? help_popup.popup[help_popup.popup.length - 1] : null); - if (typeof(activator) == "undefined") { // no activator so hide - if (last_pop != null) { - last_pop.style.display = 'none'; - help_popup.popup = []; - } - return; - } - pop = lookup_help_popup(popup_id); - if (pop == last_pop) { - if (activator == help_popup.activator) { - //hide popup (as we've already shown it for the current help button) - last_pop.style.display = 'none'; - help_popup.popup = []; - return; // toggling complete! - } - } else if (last_pop != null) { - //activating different popup so hide current one - last_pop.style.display = 'none'; - } - help_popup.popup = [pop]; - help_popup.activator = activator; - toggle_class(pop, "nested", false); - //must make the popup visible to measure it or it has zero width - pop.style.display = 'block'; - position_popup(activator, pop); -} - -/* - * help_refine - * - * Intended for links within a help popup. Stores a stack of state so - * you can go back. - */ -function help_refine(popup_id) { - if (help_popup.popup == null || help_popup.popup.length == 0 || help_popup.activator == null) { - throw new Error("Can not refine a help popup when one is not shown!"); - } - var pop = lookup_help_popup(popup_id); - var last_pop = help_popup.popup[help_popup.popup.length - 1]; - if (pop == last_pop) return; // slightly odd, but no real cause for alarm - help_popup.popup.push(pop); - toggle_class(pop, "nested", true); - last_pop.style.display = "none"; - //must make the popup visible to measure it or it has zero width - pop.style.display = "block"; - position_popup(help_popup.activator, pop); -} - -/* - * help_return - * - * Intended for links within a help popup. Stores a stack of state so - * you can go back. - */ -function help_return() { - if (help_popup.popup == null || help_popup.popup.length == 0 || help_popup.activator == null) { - throw new Error("Can not return to a earlier help popup when one is not shown!"); - } - var last_pop = help_popup.popup.pop(); - last_pop.style.display = "none"; - var pop = (help_popup.popup.length > 0 ? help_popup.popup[help_popup.popup.length - 1] : null); - if (pop != null) { - toggle_class(pop, "nested", help_popup.popup.length > 1); - pop.style.display = "block"; - position_popup(help_popup.activator, pop); - } else { - help_popup.activator = null; - } -} - -/* - * update_scroll_pad - * - * Creates padding at the bottom of the page to allow - * scrolling of anything into view. - */ -function update_scroll_pad() { - var page, pad; - page = (document.compatMode === "CSS1Compat") ? document.documentElement : document.body; - pad = $("scrollpad"); - if (pad === null) { - pad = document.createElement("div"); - pad.id = 'scrollpad'; - document.getElementsByTagName('body')[0].appendChild(pad); - } - pad.style.height = Math.abs(page.clientHeight - 100) + "px"; -} - -function substitute_classes(node, remove, add) { - "use strict"; - var list, all, i, cls, classes; - list = node.className.split(/\s+/); - all = {}; - for (i = 0; i < list.length; i++) { - if (list[i].length > 0) all[list[i]] = true; - } - for (i = 0; i < remove.length; i++) { - if (all.hasOwnProperty(remove[i])) { - delete all[remove[i]]; - } - } - for (i = 0; i < add.length; i++) { - all[add[i]] = true; - } - classes = ""; - for (cls in all) { - classes += cls + " "; - } - node.className = classes; -} - -/* - * toggle_class - * - * Adds or removes a class from the node. If the parameter 'enabled' is not - * passed then the existence of the class will be toggled, otherwise it will be - * included if enabled is true. - */ -function toggle_class(node, cls, enabled) { - var classes = node.className; - var list = classes.replace(/^\s+/, '').replace(/\s+$/, '').split(/\s+/); - var found = false; - for (var i = 0; i < list.length; i++) { - if (list[i] == cls) { - list.splice(i, 1); - i--; - found = true; - } - } - if (typeof enabled == "undefined") { - if (!found) list.push(cls); - } else { - if (enabled) list.push(cls); - } - node.className = list.join(" "); -} - -/* - * find_child - * - * Searches child nodes in depth first order and returns the first it finds - * with the className specified. - * TODO replace with querySelector - */ -function find_child(node, className) { - var pattern; - if (node == null || typeof node !== "object") { - return null; - } - if (typeof className === "string") { - pattern = new RegExp("\\b" + className + "\\b"); - } else { - pattern = className; - } - if (node.nodeType == Node.ELEMENT_NODE && - pattern.test(node.className)) { - return node; - } else { - var result = null; - for (var i = 0; i < node.childNodes.length; i++) { - result = find_child(node.childNodes[i], pattern); - if (result != null) break; - } - return result; - } -} - -/* - * find_parent - * - * Searches parent nodes outwards from the node and returns the first it finds - * with the className specified. - */ -function find_parent(node, className) { - var pattern; - pattern = new RegExp("\\b" + className + "\\b"); - do { - if (node.nodeType == Node.ELEMENT_NODE && - pattern.test(node.className)) { - return node; - } - } while (node = node.parentNode); - return null; -} - -/* - * find_parent_tag - * - * Searches parent nodes outwards from the node and returns the first it finds - * with the tag name specified. HTML tags should be specified in upper case. - */ -function find_parent_tag(node, tag_name) { - do { - if (node.nodeType == Node.ELEMENT_NODE && node.tagName == tag_name) { - return node; - } - } while (node = node.parentNode); - return null; -} - -/* - * __toggle_help - * - * Uses the 'topic' property of the this object to - * toggle display of a help topic. - * - * This function is not intended to be called directly. - */ -function __toggle_help(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - - help_popup(this, this.getAttribute("data-topic")); -} - -function setup_help_button(button) { - "use strict"; - var topic; - if (button.hasAttribute("data-topic")) { - topic = button.getAttribute("data-topic"); - if (document.getElementById(topic) != null) { - button.tabIndex = "0"; // make keyboard selectable - button.addEventListener("click", function() { - help_popup(button, topic); - }, false); - button.addEventListener("keydown", function(e) { - // toggle only on Enter or Spacebar, let other keys do their thing - if (e.keyCode !== 13 && e.keyCode !== 32) return; - // stop a submit or something like that - e.preventDefault(); - help_popup(button, topic); - }, false); - } else { - button.style.visibility = "hidden"; - } - } - button.className += " active"; -} - -/* - * help_button - * - * Makes a help button for the passed topic. - */ -function help_button(topic) { - var btn = document.createElement("div"); - btn.className = "help"; - btn.setAttribute("data-topic", topic); - setup_help_button(btn); - return btn; -} - -/* - * prepare_download - * - * Sets the attributes of a link to setup a file download using the given content. - * If no link is provided then create one and click it. - */ -function prepare_download(content, mimetype, filename, link) { - "use strict"; - // if no link is provided then create one and click it - var click_link = false; - if (!link) { - link = document.createElement("a"); - click_link = true; - } - try { - // Use a BLOB to convert the text into a data URL. - // We could do this manually with a base 64 conversion. - // This will only be supported on modern browsers, - // hence the try block. - var blob = new Blob([content], {type: mimetype}); - var reader = new FileReader(); - reader.onloadend = function() { - // If we're lucky the browser will also support the download - // attribute which will let us suggest a file name to save the link. - // Otherwise it is likely that the filename will be unintelligible. - link.setAttribute("download", filename); - link.href = reader.result; - if (click_link) { - // must add the link to click it - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } - } - reader.readAsDataURL(blob); - } catch (error) { - if (console && console.log) console.log(error); - // probably an old browser - link.href = ""; - link.visible = false; - } -} - -/* - * add_cell - * - * Add a cell to the table row. - */ -function add_cell(row, node, cls, click_action) { - var cell = row.insertCell(row.cells.length); - if (node) cell.appendChild(node); - if (cls && cls !== "") cell.className = cls; - if (click_action) cell.addEventListener("click", click_action, false); -} - -/* - * add_header_cell - * - * Add a header cell to the table row. - */ -function add_header_cell(row, node, help_topic, cls, colspan) { - var th = document.createElement("th"); - if (node) th.appendChild(node); - if (help_topic && help_topic !== "") th.appendChild(help_button(help_topic)); - if (cls && cls !== "") th.className = cls; - if (typeof colspan == "number" && colspan > 1) th.colSpan = colspan; - row.appendChild(th); -} - -/* - * add_text_cell - * - * Add a text cell to the table row. - */ -function add_text_cell(row, text, cls, action) { - var node = null; - if (typeof(text) != 'undefined') node = document.createTextNode(text); - add_cell(row, node, cls, action); -} - -/* - * add_text_header_cell - * - * Add a text header cell to the table row. - */ -function add_text_header_cell(row, text, help_topic, cls, action, colspan) { - var node = null; - if (typeof(text) != 'undefined') { - var nbsp = (help_topic ? "\u00A0" : ""); - var str = "" + text; - var parts = str.split(/\n/); - if (parts.length === 1) { - if (action) { - node = document.createElement("span"); - node.appendChild(document.createTextNode(str + nbsp)); - } else { - node = document.createTextNode(str + nbsp); - } - } else { - node = document.createElement("span"); - for (var i = 0; i < parts.length; i++) { - if (i !== 0) { - node.appendChild(document.createElement("br")); - } - node.appendChild(document.createTextNode(parts[i])); - } - } - if (action) { - node.addEventListener("click", action, false); - node.style.cursor = "pointer"; - } - } - add_header_cell(row, node, help_topic, cls, colspan); -} - -function setup_help() { - "use strict"; - var help_buttons, i; - help_buttons = document.querySelectorAll(".help:not(.active)"); - for (i = 0; i < help_buttons.length; i++) { - setup_help_button(help_buttons[i]); - } -} - -function setup_scrollpad() { - "use strict"; - if (document.getElementsByTagName('body')[0].hasAttribute("data-scrollpad") && document.getElementById("scrollpad") == null) { - window.addEventListener("resize", update_scroll_pad, false); - update_scroll_pad(); - } -} - -// anon function to avoid polluting global scope -(function() { - "use strict"; - window.addEventListener("load", function load(evt) { - window.removeEventListener("load", load, false); - setup_help(); - setup_scrollpad(); - }, false); -})(); - -/* - * make_link - * - * Creates a text node and if a URL is specified it surrounds it with a link. - * If the URL doesn't begin with "http://" it automatically adds it, as - * relative links don't make much sense in this context. - */ -function make_link(text, url) { - var textNode = null; - var link = null; - if (typeof text !== "undefined" && text !== null) textNode = document.createTextNode(text); - if (typeof url === "string") { - if (url.indexOf("//") == -1) { - url = "http://" + url; - } - link = document.createElement('a'); - link.href = url; - if (textNode) link.appendChild(textNode); - return link; - } - return textNode; -} -</script> - <script> -function motif_logo_template(inputs) { - function _input(name) { - if (typeof inputs[name] === "undefined") { - throw new Error("Missing template variable: " + name); - } - return inputs[name]; - } - return ( -"%!PS-Adobe-3.0 EPSF-3.0\n" + -"%%Title: Sequence Logo : " + _input("TITLE") + "\n" + -"%%Creator: " + _input("CREATOR") + "\n" + -"%%CreationDate: " + _input("CREATIONDATE") + "\n" + -"%%BoundingBox: 0 0 " + _input("BOUNDINGWIDTH") + " " + _input("BOUNDINGHEIGHT") + " \n" + -"%%Pages: 0\n" + -"%%DocumentFonts: \n" + -"%%EndComments\n" + -"\n" + -"% ---- CONSTANTS ----\n" + -"\/cmfactor 72 2.54 div def % defines points -> cm conversion\n" + -"\/cm {cmfactor mul} bind def % defines centimeters\n" + -"\n" + -"% ---- VARIABLES ----\n" + -"\n" + -"% NA = Nucleic Acid, AA = Amino Acid\n" + -"\/logoType (" + _input("LOGOTYPE") + ") def \n" + -"\n" + -"\/logoTitle (" + _input("TITLE") + ") def\n" + -"\n" + -"% Dimensions in cm\n" + -"\/logoWidth " + _input("LOGOWIDTH") + " cm def\n" + -"\/logoHeight " + _input("LOGOLINEHEIGHT") + " cm def\n" + -"\/totalHeight " + _input("LOGOHEIGHT") + " cm def\n" + -"\n" + -"\/yaxis " + _input("YAXIS") + " def\n" + -"\/yaxisLabel (" + _input("YAXISLABEL") + ") def\n" + -"\/yaxisBits " + _input("BARBITS") + " def % bits\n" + -"\/yaxisTicBits " + _input("TICBITS") + " def\n" + -"\n" + -"\/xaxis " + _input("NUMBERING") + " def\n" + -"\/xaxisLabel (" + _input("XAXISLABEL") + ") def\n" + -"\/showEnds (" + _input("SHOWENDS") + ") def \n" + -"\n" + -"\/showFineprint true def\n" + -"\/fineprint (" + _input("FINEPRINT") + ") def\n" + -"\n" + -"\/charsPerLine " + _input("CHARSPERLINE") + " def\n" + -"\n" + -"\/showingBox " + _input("SHOWINGBOX") + " def \n" + -"\/shrinking false def % true falses\n" + -"\/shrink 1.0 def\n" + -"\/outline " + _input("OUTLINE") + " def\n" + -"\n" + -"\/IbeamFraction " + _input("ERRORBARFRACTION") + " def\n" + -"\/IbeamGray 0.50 def\n" + -"\/IbeamLineWidth 0.5 def\n" + -"\n" + -"\/fontsize " + _input("FONTSIZE") + " def\n" + -"\/titleFontsize " + _input("TITLEFONTSIZE") + " def\n" + -"\/smallFontsize " + _input("SMALLFONTSIZE") + " def\n" + -"\n" + -"\/topMargin " + _input("TOPMARGIN") + " cm def\n" + -"\/bottomMargin " + _input("BOTTOMMARGIN") + " cm def\n" + -"\n" + -"\/defaultColor [0 0 0] def \n" + -"\n" + -_input("COLORDICT") + "\n" + -"\n" + -"\/colorDict fullColourDict def\n" + -"\n" + -"% ---- DERIVED PARAMETERS ----\n" + -"\n" + -"\/leftMargin\n" + -" fontsize 3.5 mul\n" + -"\n" + -"def \n" + -"\n" + -"\/rightMargin \n" + -" %Add extra room if showing ends\n" + -" showEnds (false) eq { fontsize}{fontsize 1.5 mul} ifelse\n" + -"def\n" + -"\n" + -"\/yaxisHeight \n" + -" logoHeight \n" + -" bottomMargin sub \n" + -" topMargin sub\n" + -"def\n" + -"\n" + -"\/ticWidth fontsize 2 div def\n" + -"\n" + -"\/pointsPerBit yaxisHeight yaxisBits div def\n" + -"\n" + -"\/stackMargin 1 def\n" + -"\n" + -"% Do not add space aroung characters if characters are boxed\n" + -"\/charRightMargin \n" + -" showingBox { 0.0 } {stackMargin} ifelse\n" + -"def\n" + -"\n" + -"\/charTopMargin \n" + -" showingBox { 0.0 } {stackMargin} ifelse\n" + -"def\n" + -"\n" + -"\/charWidth\n" + -" logoWidth\n" + -" leftMargin sub\n" + -" rightMargin sub\n" + -" charsPerLine div\n" + -" charRightMargin sub\n" + -"def\n" + -"\n" + -"\/charWidth4 charWidth 4 div def\n" + -"\/charWidth2 charWidth 2 div def\n" + -"\n" + -"\/stackWidth \n" + -" charWidth charRightMargin add\n" + -"def\n" + -" \n" + -"\/numberFontsize \n" + -" fontsize charWidth lt {fontsize}{charWidth} ifelse\n" + -"def\n" + -"\n" + -"% movements to place 5'\/N and 3'\/C symbols\n" + -"\/leftEndDeltaX fontsize neg def\n" + -"\/leftEndDeltaY fontsize 1.5 mul neg def\n" + -"\/rightEndDeltaX fontsize 0.25 mul def\n" + -"\/rightEndDeltaY leftEndDeltaY def\n" + -"\n" + -"% Outline width is proporional to charWidth, \n" + -"% but no less that 1 point\n" + -"\/outlinewidth \n" + -" charWidth 32 div dup 1 gt {}{pop 1} ifelse\n" + -"def\n" + -"\n" + -"\n" + -"% ---- PROCEDURES ----\n" + -"\n" + -"\/StartLogo { \n" + -" % Save state\n" + -" save \n" + -" gsave \n" + -"\n" + -" % Print Logo Title, top center \n" + -" gsave \n" + -" SetStringFont\n" + -"\n" + -" logoWidth 2 div\n" + -" logoTitle\n" + -" stringwidth pop 2 div sub\n" + -" totalHeight\n" + -" titleFontsize sub\n" + -" moveto\n" + -"\n" + -" logoTitle\n" + -" show\n" + -" grestore\n" + -"\n" + -" % Print X-axis label, bottom center\n" + -" gsave\n" + -" SetStringFont\n" + -"\n" + -" logoWidth 2 div\n" + -" xaxisLabel\n" + -" stringwidth pop 2 div sub\n" + -" 0\n" + -" titleFontsize 3 div\n" + -" add\n" + -" moveto\n" + -"\n" + -" xaxisLabel\n" + -" show\n" + -" grestore\n" + -"\n" + -" % Show Fine Print\n" + -" showFineprint {\n" + -" gsave\n" + -" SetSmallFont\n" + -" logoWidth\n" + -" fineprint stringwidth pop sub\n" + -" smallFontsize sub\n" + -" smallFontsize 3 div\n" + -" moveto\n" + -" \n" + -" fineprint show\n" + -" grestore\n" + -" } if\n" + -"\n" + -" % Move to lower left corner of last line, first stack\n" + -" leftMargin bottomMargin translate\n" + -"\n" + -" % Move above first line ready for StartLine \n" + -" 0 totalHeight translate\n" + -"\n" + -" SetLogoFont\n" + -"} bind def\n" + -"\n" + -"\/EndLogo { \n" + -" grestore \n" + -" showpage \n" + -" restore \n" + -"} bind def\n" + -"\n" + -"\n" + -"\/StartLine { \n" + -" % move down to the bottom of the line:\n" + -" 0 logoHeight neg translate\n" + -" \n" + -" gsave \n" + -" yaxis { MakeYaxis } if\n" + -" xaxis { showEnds (true) eq {ShowLeftEnd} if } if\n" + -"} bind def\n" + -"\n" + -"\/EndLine{ \n" + -" xaxis { showEnds (true) eq {ShowRightEnd} if } if\n" + -" grestore \n" + -"} bind def\n" + -"\n" + -"\n" + -"\/MakeYaxis {\n" + -" gsave \n" + -" stackMargin neg 0 translate\n" + -" ShowYaxisBar\n" + -" ShowYaxisLabel\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/ShowYaxisBar { \n" + -" gsave \n" + -" SetStringFont\n" + -"\n" + -" \/str 10 string def % string to hold number \n" + -" \/smallgap stackMargin 2 div def\n" + -"\n" + -" % Draw first tic and bar\n" + -" gsave \n" + -" ticWidth neg 0 moveto \n" + -" ticWidth 0 rlineto \n" + -" 0 yaxisHeight rlineto\n" + -" stroke\n" + -" grestore\n" + -"\n" + -" \n" + -" % Draw the tics\n" + -" % initial increment limit proc for\n" + -" 0 yaxisTicBits yaxisBits abs %cvi\n" + -" {\/loopnumber exch def\n" + -"\n" + -" % convert the number coming from the loop to a string\n" + -" % and find its width\n" + -" loopnumber 10 str cvrs\n" + -" \/stringnumber exch def % string representing the number\n" + -"\n" + -" stringnumber stringwidth pop\n" + -" \/numberwidth exch def % width of number to show\n" + -"\n" + -" \/halfnumberheight\n" + -" stringnumber CharBoxHeight 2 div\n" + -" def\n" + -"\n" + -" numberwidth % move back width of number\n" + -" neg loopnumber pointsPerBit mul % shift on y axis\n" + -" halfnumberheight sub % down half the digit\n" + -"\n" + -" moveto % move back the width of the string\n" + -"\n" + -" ticWidth neg smallgap sub % Move back a bit more \n" + -" 0 rmoveto % move back the width of the tic \n" + -"\n" + -" stringnumber show\n" + -" smallgap 0 rmoveto % Make a small gap \n" + -"\n" + -" % now show the tic mark\n" + -" 0 halfnumberheight rmoveto % shift up again\n" + -" ticWidth 0 rlineto\n" + -" stroke\n" + -" } for\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\/ShowYaxisLabel {\n" + -" gsave\n" + -" SetStringFont\n" + -"\n" + -" % How far we move left depends on the size of\n" + -" % the tic labels.\n" + -" \/str 10 string def % string to hold number \n" + -" yaxisBits yaxisTicBits div cvi yaxisTicBits mul \n" + -" str cvs stringwidth pop\n" + -" ticWidth 1.5 mul add neg \n" + -"\n" + -"\n" + -" yaxisHeight\n" + -" yaxisLabel stringwidth pop\n" + -" sub 2 div\n" + -"\n" + -" translate\n" + -" 90 rotate\n" + -" 0 0 moveto\n" + -" yaxisLabel show\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/StartStack { % <stackNumber> startstack\n" + -" xaxis {MakeNumber}{pop} ifelse\n" + -" gsave\n" + -"} bind def\n" + -"\n" + -"\/EndStack {\n" + -" grestore\n" + -" stackWidth 0 translate\n" + -"} bind def\n" + -"\n" + -"\n" + -"% Draw a character whose height is proportional to symbol bits\n" + -"\/MakeSymbol{ % charbits character MakeSymbol\n" + -" gsave\n" + -" \/char exch def\n" + -" \/bits exch def\n" + -"\n" + -" \/bitsHeight \n" + -" bits pointsPerBit mul \n" + -" def\n" + -"\n" + -" \/charHeight \n" + -" bitsHeight charTopMargin sub\n" + -" dup \n" + -" 0.0 gt {}{pop 0.0} ifelse % if neg replace with zero \n" + -" def \n" + -" \n" + -" charHeight 0.0 gt {\n" + -" char SetColor\n" + -" charWidth charHeight char ShowChar\n" + -"\n" + -" showingBox { % Unfilled box\n" + -" 0 0 charWidth charHeight false ShowBox\n" + -" } if\n" + -"\n" + -"\n" + -" } if\n" + -"\n" + -" grestore\n" + -"\n" + -" 0 bitsHeight translate \n" + -"} bind def\n" + -"\n" + -"\n" + -"\/ShowChar { % <width> <height> <char> ShowChar\n" + -" gsave\n" + -" \/tc exch def % The character\n" + -" \/ysize exch def % the y size of the character\n" + -" \/xsize exch def % the x size of the character\n" + -"\n" + -" \/xmulfactor 1 def \n" + -" \/ymulfactor 1 def\n" + -" \/limmulfactor 0.01 def\n" + -" \/drawable true def\n" + -"\n" + -" \n" + -" % if ysize is negative, make everything upside down!\n" + -" ysize 0 lt {\n" + -" % put ysize normal in this orientation\n" + -" \/ysize ysize abs def\n" + -" xsize ysize translate\n" + -" 180 rotate\n" + -" } if\n" + -"\n" + -" shrinking {\n" + -" xsize 1 shrink sub 2 div mul\n" + -" ysize 1 shrink sub 2 div mul translate \n" + -"\n" + -" shrink shrink scale\n" + -" } if\n" + -"\n" + -" % Calculate the font scaling factors\n" + -" % Loop twice to catch small correction due to first scaling\n" + -" 2 {\n" + -" gsave\n" + -" xmulfactor ymulfactor scale\n" + -" \n" + -" ysize % desired size of character in points\n" + -" tc CharBoxHeight \n" + -" dup 0.0 ne {\n" + -" div % factor by which to scale up the character\n" + -" \/ymulfactor exch def\n" + -" } % end if\n" + -" {pop pop}\n" + -" ifelse\n" + -"\n" + -" xsize % desired size of character in points\n" + -" tc CharBoxWidth \n" + -" dup 0.0 ne {\n" + -" div % factor by which to scale up the character\n" + -" \/xmulfactor exch def\n" + -" } % end if\n" + -" {pop pop}\n" + -" ifelse\n" + -" grestore\n" + -" % if the multiplication factors get too small we need to avoid a crash\n" + -" xmulfactor limmulfactor lt {\n" + -" \/xmulfactor 1 def\n" + -" \/drawable false def\n" + -" } if\n" + -" ymulfactor limmulfactor lt {\n" + -" \/ymulfactor 1 def\n" + -" \/drawable false def\n" + -" } if\n" + -" } repeat\n" + -"\n" + -" % Adjust horizontal position if the symbol is an I\n" + -" tc (I) eq {\n" + -" charWidth 2 div % half of requested character width\n" + -" tc CharBoxWidth 2 div % half of the actual character\n" + -" sub 0 translate\n" + -" % Avoid x scaling for I \n" + -" \/xmulfactor 1 def \n" + -" } if\n" + -"\n" + -"\n" + -" % ---- Finally, draw the character\n" + -" drawable { \n" + -" newpath\n" + -" xmulfactor ymulfactor scale\n" + -"\n" + -" % Move lower left corner of character to start point\n" + -" tc CharBox pop pop % llx lly : Lower left corner\n" + -" exch neg exch neg\n" + -" moveto\n" + -"\n" + -" outline { % outline characters:\n" + -" outlinewidth setlinewidth\n" + -" tc true charpath\n" + -" gsave 1 setgray fill grestore\n" + -" clip stroke\n" + -" } { % regular characters\n" + -" tc show\n" + -" } ifelse\n" + -" } if\n" + -"\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/ShowBox { % x1 y1 x2 y2 filled ShowBox\n" + -" gsave\n" + -" \/filled exch def \n" + -" \/y2 exch def\n" + -" \/x2 exch def\n" + -" \/y1 exch def\n" + -" \/x1 exch def\n" + -" newpath\n" + -" x1 y1 moveto\n" + -" x2 y1 lineto\n" + -" x2 y2 lineto\n" + -" x1 y2 lineto\n" + -" closepath\n" + -"\n" + -" clip\n" + -" \n" + -" filled {\n" + -" fill\n" + -" }{ \n" + -" 0 setgray stroke \n" + -" } ifelse\n" + -"\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/MakeNumber { % number MakeNumber\n" + -" gsave\n" + -" SetNumberFont\n" + -" stackWidth 0 translate\n" + -" 90 rotate % rotate so the number fits\n" + -" dup stringwidth pop % find the length of the number\n" + -" neg % prepare for move\n" + -" stackMargin sub % Move back a bit\n" + -" charWidth (0) CharBoxHeight % height of numbers\n" + -" sub 2 div %\n" + -" moveto % move back to provide space\n" + -" show\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/Ibeam{ % heightInBits Ibeam\n" + -" gsave\n" + -" % Make an Ibeam of twice the given height in bits\n" + -" \/height exch pointsPerBit mul def \n" + -" \/heightDRAW height IbeamFraction mul def\n" + -"\n" + -" IbeamLineWidth setlinewidth\n" + -" IbeamGray setgray \n" + -"\n" + -" charWidth2 height neg translate\n" + -" ShowIbar\n" + -" newpath\n" + -" 0 0 moveto\n" + -" 0 heightDRAW rlineto\n" + -" stroke\n" + -" newpath\n" + -" 0 height moveto\n" + -" 0 height rmoveto\n" + -" currentpoint translate\n" + -" ShowIbar\n" + -" newpath\n" + -" 0 0 moveto\n" + -" 0 heightDRAW neg rlineto\n" + -" currentpoint translate\n" + -" stroke\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/ShowIbar { % make a horizontal bar\n" + -" gsave\n" + -" newpath\n" + -" charWidth4 neg 0 moveto\n" + -" charWidth4 0 lineto\n" + -" stroke\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/ShowLeftEnd {\n" + -" gsave\n" + -" SetStringFont\n" + -" leftEndDeltaX leftEndDeltaY moveto\n" + -" logoType (NA) eq {(5) show ShowPrime} if\n" + -" logoType (AA) eq {(N) show} if\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/ShowRightEnd { \n" + -" gsave\n" + -" SetStringFont\n" + -" rightEndDeltaX rightEndDeltaY moveto\n" + -" logoType (NA) eq {(3) show ShowPrime} if\n" + -" logoType (AA) eq {(C) show} if\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/ShowPrime {\n" + -" gsave\n" + -" SetPrimeFont\n" + -" (\\242) show \n" + -" grestore\n" + -"} bind def\n" + -"\n" + -" \n" + -"\/SetColor{ % <char> SetColor\n" + -" dup colorDict exch known {\n" + -" colorDict exch get aload pop setrgbcolor\n" + -" } {\n" + -" pop\n" + -" defaultColor aload pop setrgbcolor\n" + -" } ifelse \n" + -"} bind def\n" + -"\n" + -"% define fonts\n" + -"\/SetTitleFont {\/Times-Bold findfont titleFontsize scalefont setfont} bind def\n" + -"\/SetLogoFont {\/Helvetica-Bold findfont charWidth scalefont setfont} bind def\n" + -"\/SetStringFont{\/Helvetica-Bold findfont fontsize scalefont setfont} bind def\n" + -"\/SetPrimeFont {\/Symbol findfont fontsize scalefont setfont} bind def\n" + -"\/SetSmallFont {\/Helvetica findfont smallFontsize scalefont setfont} bind def\n" + -"\n" + -"\/SetNumberFont {\n" + -" \/Helvetica-Bold findfont \n" + -" numberFontsize\n" + -" scalefont\n" + -" setfont\n" + -"} bind def\n" + -"\n" + -"%Take a single character and return the bounding box\n" + -"\/CharBox { % <char> CharBox <lx> <ly> <ux> <uy>\n" + -" gsave\n" + -" newpath\n" + -" 0 0 moveto\n" + -" % take the character off the stack and use it here:\n" + -" true charpath \n" + -" flattenpath \n" + -" pathbbox % compute bounding box of 1 pt. char => lx ly ux uy\n" + -" % the path is here, but toss it away ...\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"% The height of a characters bounding box\n" + -"\/CharBoxHeight { % <char> CharBoxHeight <num>\n" + -" CharBox\n" + -" exch pop sub neg exch pop\n" + -"} bind def\n" + -"\n" + -"\n" + -"% The width of a characters bounding box\n" + -"\/CharBoxWidth { % <char> CharBoxHeight <num>\n" + -" CharBox\n" + -" pop exch pop sub neg \n" + -"} bind def\n" + -"\n" + -"% Set the colour scheme to be faded to indicate trimming\n" + -"\/MuteColour {\n" + -" \/colorDict mutedColourDict def\n" + -"} def\n" + -"\n" + -"% Restore the colour scheme to the normal colours\n" + -"\/RestoreColour {\n" + -" \/colorDict fullColourDict def\n" + -"} def\n" + -"\n" + -"% Draw the background for a trimmed section\n" + -"% takes the number of columns as a parameter\n" + -"\/DrawTrimBg { % <num> DrawTrimBox\n" + -" \/col exch def\n" + -" \n" + -" \/boxwidth \n" + -" col stackWidth mul \n" + -" def\n" + -" \n" + -" gsave\n" + -" 0.97 setgray\n" + -"\n" + -" newpath\n" + -" 0 0 moveto\n" + -" boxwidth 0 rlineto\n" + -" 0 yaxisHeight rlineto\n" + -" 0 yaxisHeight lineto\n" + -" closepath\n" + -" \n" + -" fill\n" + -" grestore\n" + -"} def\n" + -"\n" + -"\/DrawTrimEdge {\n" + -" gsave\n" + -" 0.2 setgray\n" + -" [2] 0 setdash\n" + -"\n" + -" newpath\n" + -" 0 0 moveto\n" + -" 0 yaxisHeight lineto\n" + -" \n" + -" stroke\n" + -"\n" + -"} def\n" + -"\n" + -"\n" + -"% Deprecated names\n" + -"\/startstack {StartStack} bind def\n" + -"\/endstack {EndStack} bind def\n" + -"\/makenumber {MakeNumber} bind def\n" + -"\/numchar { MakeSymbol } bind def\n" + -"\n" + -"%%EndProlog\n" + -"\n" + -"%%Page: 1 1\n" + -"StartLogo\n" + -"\n" + -_input("DATA") + "\n" + -"\n" + -"EndLogo\n" + -"\n" + -"%%EOF\n" - ); -}</script> - <script> -//====================================================================== -// start Alphabet object -//====================================================================== -var Alphabet = function(alphabet, background) { - "use strict"; - var i, j, sym, aliases, complement, comp_e_sym, ambigs, generate_background; - generate_background = (background == null); - if (generate_background) { - background = []; - for (i = 0; i < alphabet.ncore; i++) background[i] = 1.0 / alphabet.ncore; - } else if (alphabet.ncore != background.length) { - throw new Error("The background length does not match the alphabet length."); - } - this.name = alphabet.name; - this.like = (alphabet.like != null ? alphabet.like.toUpperCase() : null); - this.ncore = alphabet.ncore; - this.symbols = alphabet.symbols; - this.background = background; - this.genbg = generate_background; - this.encode = {}; - this.encode2core = {}; - this.complement = {}; - // check if all symbols are same case - var seen_uc = false; - var seen_lc = false; - var check_case = function (syms) { - var s, sym; - if (typeof syms === "string") { - for (s = 0; s < syms.length; s++) { - sym = syms.charAt(s); - if (sym >= 'a' && sym <= 'z') seen_lc = true; - else if (sym >= 'A' && sym <= 'Z') seen_uc = true; - } - } - }; - for (i = 0; i < this.symbols.length; i++) { - check_case(this.symbols[i].symbol); - check_case(this.symbols[i].aliases); - } - // now map symbols to indexes - var update_array = function(array, syms, index) { - var s, sym; - if (typeof syms === "string") { - for (s = 0; s < syms.length; s++) { - sym = syms.charAt(s); - array[sym] = index; - // when only a single case is used, then encode as case insensitive - if (seen_uc != seen_lc) { - if (sym >= 'a' && sym <= 'z') { - array[sym.toUpperCase()] = index; - } else if (sym >= 'A' && sym <= 'Z') { - array[sym.toLowerCase()] = index; - } - } - } - } - } - // map core symbols to index - for (i = 0; i < this.ncore; i++) { - update_array(this.encode2core, this.symbols[i].symbol, i); - update_array(this.encode, this.symbols[i].symbol, i); - update_array(this.encode2core, this.symbols[i].aliases, i); - update_array(this.encode, this.symbols[i].aliases, i); - } - // map ambigous symbols to index - ambigs = {}; - for (i = this.ncore; i < this.symbols.length; i++) { - update_array(this.encode, this.symbols[i].symbol, i); - update_array(this.encode, this.symbols[i].aliases, i); - ambigs[this.symbols[i].equals] = i; - } - // determine complements - for (i = 0; i < this.ncore; i++) { - complement = this.symbols[i].complement; - if (typeof complement === "string") { - this.complement[i] = this.encode2core[complement]; - } - } - next_symbol: - for (i = this.ncore; i < this.symbols.length; i++) { - complement = ""; - for (j = 0; j < this.symbols[i].equals.length; j++) { - comp_e_sym = this.complement[this.encode2core[this.symbols[i].equals.charAt(j)]]; - if (typeof comp_e_sym !== "number") continue next_symbol; - complement += this.symbols[comp_e_sym].symbol; - } - complement = complement.split("").sort().join(""); - if (typeof ambigs[complement] === "number") { - this.complement[i] = ambigs[complement]; - } - } - // determine case insensitivity - this.case_insensitive = true; - if (seen_uc == seen_lc) { - // when there is a mixture of cases it probably won't - // be case insensitive but we still need to check - loop: - for (i = 0; i < this.symbols.length; i++) { - sym = this.symbols[i].symbol; - if (sym >= 'A' && sym <= 'Z') { - if (this.encode[sym.toLowerCase()] != i) { - this.case_insensitive = false; - break loop; - } - } else if (sym >= 'a' && sym <= 'z') { - if (this.encode[sym.toUpperCase()] != i) { - this.case_insensitive = false; - break loop; - } - } - aliases = this.symbols[i].aliases; - if (aliases != null) { - for (j = 0; j < aliases.length; j++) { - sym = aliases.charAt(j); - if (sym >= 'A' && sym <= 'Z') { - if (this.encode[sym.toLowerCase()] != i) { - this.case_insensitive = false; - break loop; - } - } else if (sym >= 'a' && sym <= 'z') { - if (this.encode[sym.toUpperCase()] != i) { - this.case_insensitive = false; - break loop; - } - } - } - } - } - } - // normalise aliases to remove the prime symbol and eliminate - // the alternate cases when the alphabet is case insensitive - var seen, out; - for (i = 0; i < this.symbols.length; i++) { - sym = this.symbols[i].symbol; - aliases = this.symbols[i].aliases; - if (typeof aliases != "string") aliases = ""; - seen = {}; - out = []; - if (this.case_insensitive) { - sym = sym.toUpperCase(); - aliases = aliases.toUpperCase(); - } - seen[sym] = true; - for (j = 0; j < aliases.length; j++) { - if (!seen[aliases.charAt(j)]) { - seen[aliases.charAt(j)] = true; - out.push(aliases.charAt(j)); - } - } - this.symbols[i].aliases = out.sort().join(""); - } -}; -// return the name of the alphabet -Alphabet.prototype.get_alphabet_name = function() { - return this.name; -}; -// return if the alphabet can be complemented -Alphabet.prototype.has_complement = function() { - return (typeof this.symbols[0].complement === "string"); -}; -// return true if an uppercase letter has the same meaning as the lowercase form -Alphabet.prototype.is_case_insensitive = function() { - return this.case_insensitive; -}; -// return the information content of an alphabet letter -Alphabet.prototype.get_ic = function() { - return Math.log(this.ncore) / Math.LN2; -}; -// return the count of the core alphabet symbols -Alphabet.prototype.get_size_core = function() { - return this.ncore; -}; -// return the count of all alphabet symbols -Alphabet.prototype.get_size_full = function() { - return this.symbols.length; -}; -// return the symbol for the given alphabet index -Alphabet.prototype.get_symbol = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("Alphabet index out of bounds"); - } - return this.symbols[alph_index].symbol; -}; -// return the aliases for the given alphabet index -Alphabet.prototype.get_aliases = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("Alphabet index out of bounds"); - } - var sym_obj = this.symbols[alph_index]; - return (sym_obj.aliases != null ? sym_obj.aliases : ""); -}; -// return the name for the given alphabet index -Alphabet.prototype.get_name = function(alph_index) { - "use strict"; - var sym; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("Alphabet index out of bounds"); - } - sym = this.symbols[alph_index]; - return (typeof sym.name === "string" ? sym.name : sym.symbol); -}; -// return the alphabet it is like or null -Alphabet.prototype.get_like = function() { - "use strict"; - return this.like; -}; -// return the index of the complement for the given alphabet index -Alphabet.prototype.get_complement = function(alph_index) { - var comp_e_sym = this.complement[alph_index]; - if (typeof comp_e_sym === "number") { - return comp_e_sym; - } else { - return -1; - } -}; -// return a string containing the core symbols -Alphabet.prototype.get_symbols = function() { - "use strict"; - var i, core_symbols; - core_symbols = ""; - for (i = 0; i < this.ncore; i++) { - core_symbols += this.symbols[i].symbol; - } - return core_symbols; -}; -// return if the background was not a uniform generated background -Alphabet.prototype.has_bg = function() { - "use strict"; - return !this.genbg; -}; -// get the background frequency for the index -Alphabet.prototype.get_bg_freq = function(alph_index) { - "use strict"; - var freq, i, symbols; - if (alph_index >= 0) { - if (alph_index < this.ncore) { - return this.background[alph_index]; - } else if (alph_index < this.symbols.length) { - freq = 0; - symbols = this.symbols[alph_index].equals; - for (i = 0; i < symbols.length; i++) { - freq += this.background[this.encode2core[symbols.charAt(i)]]; - } - return freq; - } - } - throw new Error("The alphabet index is out of range."); -}; -// get the colour of the index -Alphabet.prototype.get_colour = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("BAD_ALPHABET_INDEX"); - } - if (typeof this.symbols[alph_index].colour != "string") { - return "black"; - } - return "#" + this.symbols[alph_index].colour; -}; -// get the rgb componets of the colour at the index -Alphabet.prototype.get_rgb = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("BAD_ALPHABET_INDEX"); - } - if (typeof this.symbols[alph_index].colour != "string") { - return {"red": 0, "green": 0, "blue": 0}; - } - var colour = this.symbols[alph_index].colour; - var red = parseInt(colour.substr(0, 2), 16) / 255; - var green = parseInt(colour.substr(2, 2), 16) / 255; - var blue = parseInt(colour.substr(4, 2), 16) / 255; - return {"red": red, "green": green, "blue": blue}; -}; -// convert a symbol into the index -Alphabet.prototype.get_index = function(letter) { - "use strict"; - var alph_index; - alph_index = this.encode[letter]; - if (typeof alph_index === "undefined") { - return -1; - } - return alph_index; -}; -// convert a symbol into the list of core indexes that it equals -Alphabet.prototype.get_indexes = function(letter) { - "use strict"; - var alph_index, comprise_str, i, comprise_list; - alph_index = this.encode[letter]; - if (typeof alph_index === "undefined") { - throw new Error("Unknown letter"); - } - comprise_str = this.symbols[alph_index].equals; - comprise_list = []; - if (typeof comprise_str == "string") { - for (i = 0; i < comprise_str.length; i++) { - comprise_list.push(this.encode2core[comprise_str.charAt(i)]); - } - } else { - comprise_list.push(alph_index); - } - return comprise_list; -}; -// check if a symbol is the primary way of representing the symbol in the alphabet -Alphabet.prototype.is_prime_symbol = function(letter) { - var alph_index; - alph_index = this.encode[letter]; - if (alph_index == null) return false; - if (this.is_case_insensitive()) { - return (this.symbols[alph_index].symbol.toUpperCase() == letter.toUpperCase()); - } else { - return (this.symbols[alph_index].symbol == letter); - } -}; -// compare 2 alphabets -Alphabet.prototype.equals = function(other) { - "use strict"; - var i, sym1, sym2; - // first check that it's actually an alphabet object - if (!(typeof other === "object" && other != null && other instanceof Alphabet)) { - return false; - } - // second shortcircuit if it's the same object - if (this === other) return true; - // compare - if (this.name !== other.name) return false; - if (this.ncore !== other.ncore) return false; - if (this.symbols.length !== other.symbols.length) return false; - for (i = 0; i < this.symbols.length; i++) { - sym1 = this.symbols[i]; - sym2 = other.symbols[i]; - if (sym1.symbol !== sym2.symbol) return false; - if (sym1.aliases !== sym2.aliases) return false; - if (sym1.name !== sym2.name) return false; - if (typeof sym1.colour !== typeof sym2.colour || - (typeof sym1.colour === "string" && typeof sym2.colour === "string" && - parseInt(sym1.colour, 16) != parseInt(sym2.colour, 16))) { - return false; - } - if (sym1.complement !== sym2.complement) return false; - if (sym1.equals !== sym2.equals) return false; - } - return true; -}; -Alphabet.prototype.check_core_subset = function(super_alph) { - var complement_same = true; - var seen_set = {}; - var sub_i, sub_symbol, super_i, super_symbol; - for (sub_i = 0; sub_i < this.ncore; sub_i++) { - sub_symbol = this.symbols[sub_i]; - super_i = super_alph.encode[sub_symbol.symbol]; - if (super_i == null) return 0; - super_symbol = super_alph.symbols[super_i]; - if (seen_set[super_i]) return 0; - seen_set[super_i] = true; - // check complement - if (sub_symbol.complement != null && super_symbol.complement != null) { - if (super_alph.encode[sub_symbol.complement] != super_alph.encode[super_symbol.complement]) { - complement_same = false; - } - } else if (sub_symbol.complement != null || super_symbol.complement != null) { - complement_same = false; - } - } - return (complement_same ? 1 : -1); -}; -// convert a sequence to its reverse complement -Alphabet.prototype.invcomp_seq = function(seq) { - "use strict"; - var syms, i, e_sym, comp_e_sym; - if (!this.has_complement()) throw new Error("Alphabet must be complementable"); - syms = seq.split(""); - for (i = 0; i < syms.length; i++) { - e_sym = this.encode[syms[i]]; - if (typeof e_sym === "undefined") { - e_sym = this.ncore; // wildcard - } - comp_e_sym = this.complement[e_sym]; - if (typeof comp_e_sym === "undefined") { - comp_e_sym = e_sym; // not complementable - } - syms[i] = this.symbols[comp_e_sym].symbol; - } - return syms.reverse().join(""); -}; -// convert the alphabet to the text version -Alphabet.prototype.as_text = function() { - "use strict"; - function name_as_text(name) { - var i, c, out; - out = "\""; - for (i = 0; i < name.length; i++) { - c = name.charAt(i); - if (c == "\"") { - out += "\\\""; - } else if (c == "/") { - out += "\\/"; - } else if (c == "\\") { - out += "\\\\"; - } else { - out += c; - } - } - out += "\""; - return out; - } - function symbol_as_text(sym) { - var out; - out = sym.symbol; - if (typeof sym.name === "string" && sym.name != sym.symbol) { - out += " " + name_as_text(sym.name); - } - if (typeof sym.colour === "string") { - out += " " + sym.colour; - } - return out; - } - var out, i, j, c, sym; - out = ""; - // output core symbols with 2 way complements - for (i = 0; i < this.ncore; i++) { - c = this.complement[i]; - if (typeof c === "number" && i < c && this.complement[c] === i) { - out += symbol_as_text(this.symbols[i]) + " ~ " + symbol_as_text(this.symbols[c]) + "\n"; - } - } - // output core symbols with no complement - for (i = 0; i < this.ncore; i++) { - if (typeof this.complement[i] === "undefined") { - out += symbol_as_text(this.symbols[i]) + "\n"; - } - } - // output ambiguous symbols that have comprising characters - for (i = this.ncore; i < this.symbols.length; i++) { - if (this.symbols[i].equals.length == 0) break; - out += symbol_as_text(this.symbols[i]) + " = " + this.symbols[i].equals + "\n"; - if (typeof this.symbols[i].aliases === "string") { - for (j = 0; j < this.symbols[i].aliases.length; j++) { - if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue; - out += this.symbols[i].aliases.charAt(j) + " = " + this.symbols[i].equals + "\n"; - } - } - } - // output aliases of core symbols - for (i = 0; i < this.ncore; i++) { - if (typeof this.symbols[i].aliases === "string") { - for (j = 0; j < this.symbols[i].aliases.length; j++) { - if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue; - out += this.symbols[i].aliases.charAt(j) + " = " + this.symbols[i].symbol + "\n"; - } - } - } - // output gap symbols - i = this.symbols.length - 1; - if (this.symbols[i].equals.length == 0) { - out += symbol_as_text(this.symbols[i]) + " =\n"; - if (typeof this.symbols[i].aliases === "string") { - for (j = 0; j < this.symbols[i].aliases.length; j++) { - if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue; - out += this.symbols[i].aliases.charAt(j) + " =\n"; - } - } - } - return out; -}; -// output the alphabet as it appears in minimal MEME format -Alphabet.prototype.as_meme = function() { - "use strict"; - function name_as_text(name) { - var i, c, out; - out = "\""; - for (i = 0; i < name.length; i++) { - c = name.charAt(i); - if (c == "\"") { - out += "\\\""; - } else if (c == "/") { - out += "\\/"; - } else if (c == "\\") { - out += "\\\\"; - } else { - out += c; - } - } - out += "\""; - return out; - } - if (this.equals(AlphStd.DNA)) { - return "ALPHABET= ACGT\n"; - } else if (this.equals(AlphStd.PROTEIN)) { - return "ALPHABET= ACDEFGHIKLMNPQRSTVWY\n"; - } else { - return "ALPHABET" + - (this.name != null ? " " + name_as_text(this.name) : "") + - (this.like != null ? " " + this.like + "-LIKE" : "") + "\n" + - this.as_text() + "END ALPHABET\n"; - } -}; - -// Returns a table showing all the letters in the alphabet -Alphabet.prototype.as_table = function() { - "use strict"; - var i, j, row, th, td, aliases, equals, sym; - var table = document.createElement("table"); - // create the core symbol header - row = table.insertRow(table.rows.length); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Symbol(s)")); - row.appendChild(th); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Name")); - row.appendChild(th); - th = document.createElement("th"); - if (this.has_complement()) { - th.appendChild(document.createTextNode("Complement")); - } - row.appendChild(th); - // list the core symbols - for (i = 0; i < this.ncore; i++) { - row = table.insertRow(table.rows.length); - td = document.createElement("td"); - if (this.symbols[i].colour != null) { - td.style.color = '#' + this.symbols[i].colour; - } - td.appendChild(document.createTextNode(this.symbols[i].symbol)); - aliases = this.get_aliases(i); - if (aliases.length > 0) { - td.appendChild(document.createTextNode(' ' + aliases.split('').join(' '))); - } - row.appendChild(td); - td = document.createElement("td"); - if (this.symbols[i].name != null) { - td.appendChild(document.createTextNode(this.symbols[i].name)); - } - row.appendChild(td); - td = document.createElement("td"); - if (this.symbols[i].complement != null) { - td.style.color = this.get_colour(this.get_index(this.symbols[i].complement)); - td.appendChild(document.createTextNode(this.symbols[i].complement)); - } - row.appendChild(td); - } - // create the ambiguous symbol header - row = table.insertRow(table.rows.length); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Symbol(s)")); - row.appendChild(th); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Name")); - row.appendChild(th); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Matches")); - row.appendChild(th); - // list the ambiguous symbols - for (i = this.ncore; i < this.symbols.length; i++) { - row = table.insertRow(table.rows.length); - td = document.createElement("td"); - if (this.symbols[i].colour != null) { - td.style.color = '#' + this.symbols[i].colour; - } - td.appendChild(document.createTextNode(this.symbols[i].symbol)); - aliases = this.get_aliases(i); - if (aliases.length > 0) { - td.appendChild(document.createTextNode(' ' + aliases.split('').join(' '))); - } - row.appendChild(td); - td = document.createElement("td"); - if (this.symbols[i].name != null) { - td.appendChild(document.createTextNode(this.symbols[i].name)); - } - row.appendChild(td); - td = document.createElement("td"); - equals = this.symbols[i].equals.split(''); - for (j = 0; j < equals.length; j++) { - if (j != 0) td.appendChild(document.createTextNode(' ')); - sym = document.createElement("span"); - sym.style.color = this.get_colour(this.get_index(equals[j])); - sym.appendChild(document.createTextNode(equals[j])); - td.appendChild(sym); - } - row.appendChild(td); - } - return table; -}; - -// returns a dictionary of the colours for EPS -Alphabet.prototype._as_eps_dict = function() { - "use strict"; - var i, sym, rgb; - var out = "/fullColourDict <<\n"; - for (i = 0; i < this.ncore; i++) { - sym = this.get_symbol(i); - sym = sym.replace(/\\/g, "\\\\"); - sym = sym.replace(/\(/g, "\\("); - sym = sym.replace(/\)/g, "\\)"); - rgb = this.get_rgb(i); - out += " (" + sym + ") [" + rgb.red.toFixed(4) + " " + rgb.green.toFixed(4) + " " + rgb.blue.toFixed(4) + "]\n"; - } - out += ">> def\n"; - out += "/mutedColourDict <<\n"; - for (i = 0; i < this.ncore; i++) { - sym = this.get_symbol(i); - sym = sym.replace(/\\/g, "\\\\"); - sym = sym.replace(/\(/g, "\\("); - sym = sym.replace(/\)/g, "\\)"); - rgb = Alphabet.lighten_colour(this.get_rgb(i)); - out += " (" + sym + ") [" + rgb.red.toFixed(4) + " " + rgb.green.toFixed(4) + " " + rgb.blue.toFixed(4) + "]\n"; - } - out += ">> def\n"; - return out; -}; - -// return the alphabet name or a list of primary symbols -Alphabet.prototype.toString = function() { - "use strict"; - if (this.name != null) { - return this.name; - } else { - return this.get_symbols(); - } -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Helper functions -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -// Convert a colour specified in RGB colourspace values into LAB colourspace -Alphabet.rgb2lab = function(rgb) { - "use strict"; - var xyzHelper, labHelper; - // XYZ helper - xyzHelper = function(value) { - if (value > 0.0445) { - value = (value + 0.055) / 1.055; - value = Math.pow(value, 2.4); - } else { - value /= 12.92; - } - value *= 100; - return value; - }; - // lab helper - labHelper = function(value) { - if (value > 0.008856) { - value = Math.pow(value, 1.0 / 3.0); - } else { - value = (7.787 * value) + (16.0 / 116.0); - } - return value; - }; - // convert into XYZ colourspace - var c1, c2, c3; - if (typeof rgb == "number") { - c1 = xyzHelper(((rgb >> 16) & 0xFF) / 255.0); - c2 = xyzHelper(((rgb >> 8) & 0xFF) / 255.0); - c3 = xyzHelper((rgb & 0xFF) / 255.0); - } else { - c1 = xyzHelper(rgb.red); - c2 = xyzHelper(rgb.green); - c3 = xyzHelper(rgb.blue); - } - var x = (c1 * 0.4124) + (c2 * 0.3576) + (c3 * 0.1805); - var y = (c1 * 0.2126) + (c2 * 0.7152) + (c3 * 0.0722); - var z = (c1 * 0.0193) + (c2 * 0.1192) + (c3 * 0.9505); - // convert into Lab colourspace - c1 = labHelper(x / 95.047); - c2 = labHelper(y / 100.0); - c3 = labHelper(z / 108.883); - var l = (116.0 * c2) - 16; - var a = 500.0 * (c1 - c2); - var b = 200.0 * (c2 - c3); - return {"l": l, "a": a, "b": b}; -}; - -// Convert a colour specified in HSV colourspace into RGB colourspace -Alphabet.hsv2rgb = function(hue, sat, value, output_object) { - // achromatic (grey) - var r = value; - var g = value; - var b = value; - if (sat != 0) { - var h = hue / 60.0; - var i = Math.floor(h); - var f = h - i; - var p = value * (1.0 - sat); - var q = value * (1.0 - (sat * f)); - var t = value * (1.0 - (sat * (1.0 - f))); - if (i == 0) { - r = value; - g = t; - b = p; - } else if (i == 1) { - r = q; - g = value; - b = p; - } else if (i == 2) { - r = p; - g = value; - b = t; - } else if (i == 3) { - r = p; - g = q; - b = value; - } else if (i == 4) { - r = t; - g = p; - b = value; - } else { - r = value; - g = p; - b = q; - } - } - if (output_object) { - return {"red": r, "green": g, "blue": b}; - } else { - return (Math.floor(r * 255) << 15) | (Math.floor(g * 255) << 8) | (Math.floor(b * 255)); - } -}; - -// Calculate a distance score between two colours in LAB colourspace -Alphabet.lab_dist = function(lab1, lab2) { - var c1 = Math.sqrt((lab1.l * lab1.l) + (lab1.a * lab1.a)); - var c2 = Math.sqrt((lab2.l * lab2.l) + (lab2.a * lab2.a)); - var dc = c1 - c2; - var dl = lab1.l - lab2.l; - var da = lab1.a - lab2.a; - var db = lab1.b - lab2.b; - // we don't want NaN due to rounding errors so fudge things a bit... - var dh = 0; - var dh_squared = (da * da) + (db * db) - (dc * dc); - if (dh_squared > 0) { - dh = Math.sqrt(dh_squared); - } - var first = dl; - var second = dc / (1.0 + (0.045 * c1)); - var third = dh / (1.0 + (0.015 * c1)); - return Math.sqrt((first * first) + (second * second) + (third * third)); -}; - -// convert an RGB value into a HSL value -Alphabet.rgb2hsl = function(rgb) { - "use strict"; - var min, max, delta, h, s, l, r, g, b; - if (typeof rgb == "number") { - r = ((rgb >> 16) & 0xFF) / 255.0; - g = ((rgb >> 8) & 0xFF) / 255.0; - b = (rgb & 0xFF) / 255.0; - } else { - r = rgb.red; - g = rgb.green; - b = rgb.blue; - } - min = Math.min(r, g, b); - max = Math.max(r, g, b); - delta = max - min; - l = min + (delta / 2); - if (max == min) { - h = 0; // achromatic (grayscale) - s = 0; - } else { - if (l > 0.5) { - s = delta / (2 - max - min); - } else { - s = delta / (max + min); - } - if (max == r) { - h = (g - b) / delta; - if (g < b) h += 6; - } else if (max == g) { - h = ((b - r) / delta) + 2; - } else { - h = ((r - g) / delta) + 4; - } - h /= 6; - } - return {"h": h, "s": s, "l": l}; -}; - -// convert a HSL value into an RGB value -Alphabet.hsl2rgb = function(hsl, output_object) { - "use strict"; - function _hue(p, q, t) { - "use strict"; - if (t < 0) t += 1; - else if (t > 1) t -= 1; - if (t < (1.0 / 6.0)) { - return p + ((q - p) * 6.0 * t); - } else if (t < 0.5) { - return q; - } else if (t < (2.0 / 3.0)) { - return p + ((q - p) * ((2.0 / 3.0) - t) * 6.0); - } else { - return p; - } - } - var r, g, b, p, q; - if (hsl.s == 0) { - // achromatic (grayscale) - r = hsl.l; - g = hsl.l; - b = hsl.l; - } else { - if (hsl.l < 0.5) { - q = hsl.l * (1 + hsl.s); - } else { - q = hsl.l + hsl.s - (hsl.l * hsl.s); - } - p = (2 * hsl.l) - q; - r = _hue(p, q, hsl.h + (1.0 / 3.0)); - g = _hue(p, q, hsl.h); - b = _hue(p, q, hsl.h - (1.0 / 3.0)); - } - if (output_object) { - return {"red": r, "green": g, "blue": b}; - } else { - return (Math.floor(r * 255) << 15) | (Math.floor(g * 255) << 8) | (Math.floor(b * 255)); - } -}; - -Alphabet.lighten_colour = function(rgb) { - "use strict"; - var hsl = Alphabet.rgb2hsl(rgb); - hsl.l += (1.0 - hsl.l) * 2 / 3; - return Alphabet.hsl2rgb(hsl, typeof rgb != "number"); -}; - -//====================================================================== -// end Alphabet object -//====================================================================== - -//====================================================================== -// start StandardAlphabet object -//====================================================================== - -// an extension of the alphabet object to support some additional fields -// only present in standard alphabets. -var StandardAlphabet = function(enum_code, enum_name, alphabet_data) { - Alphabet.apply(this, [alphabet_data]); - this.enum_code = enum_code; - this.enum_name = enum_name; -}; -StandardAlphabet.prototype = Alphabet.prototype; -StandardAlphabet.prototype.constructor = StandardAlphabet; - -// A unique code for this standard alphabet. -// This code will be a power of 2 to enable creation of bitsets for -// a selection of standard alphabets. -StandardAlphabet.prototype.get_code = function() { - return this.enum_code; -}; - -// A unique name for this standard alphabet. -// this name will be all upper case and the same as the property that -// refers to this alphabet in the AlphStd collection. -StandardAlphabet.prototype.get_enum = function() { - return this.enum_name; -}; - -//====================================================================== -// end StandardAlphabet object -//====================================================================== - -// A collection of standard alphabets. -var AlphStd = { - RNA: new StandardAlphabet(1, "RNA", { - "name": "RNA", - "like": "RNA", - "ncore": 4, - "symbols": [ - {"symbol": "A", "name": "Adenine", "colour": "CC0000"}, - {"symbol": "C", "name": "Cytosine", "colour": "0000CC"}, - {"symbol": "G", "name": "Guanine", "colour": "FFB300"}, - {"symbol": "U", "name": "Uracil", "colour": "008000", - "aliases": "T"}, - {"symbol": "N", "name": "Any base", "equals": "ACGU", "aliases": "X."}, - {"symbol": "V", "name": "Not U", "equals": "ACG"}, - {"symbol": "H", "name": "Not G", "equals": "ACU"}, - {"symbol": "D", "name": "Not C", "equals": "AGU"}, - {"symbol": "B", "name": "Not A", "equals": "CGU"}, - {"symbol": "M", "name": "Amino", "equals": "AC"}, - {"symbol": "R", "name": "Purine", "equals": "AG"}, - {"symbol": "W", "name": "Weak", "equals": "AU"}, - {"symbol": "S", "name": "Strong", "equals": "CG"}, - {"symbol": "Y", "name": "Pyrimidine", "equals": "CU"}, - {"symbol": "K", "name": "Keto", "equals": "GU"} - ] - }), - DNA: new StandardAlphabet(2, "DNA", { - "name": "DNA", - "like": "DNA", - "ncore": 4, - "symbols": [ - {"symbol": "A", "name": "Adenine", "colour": "CC0000", "complement": "T"}, - {"symbol": "C", "name": "Cytosine", "colour": "0000CC", "complement": "G"}, - {"symbol": "G", "name": "Guanine", "colour": "FFB300", "complement": "C"}, - {"symbol": "T", "name": "Thymine", "colour": "008000", "complement": "A", - "aliases": "U"}, - {"symbol": "N", "name": "Any base", "equals": "ACGT", "aliases": "X."}, - {"symbol": "V", "name": "Not T", "equals": "ACG"}, - {"symbol": "H", "name": "Not G", "equals": "ACT"}, - {"symbol": "D", "name": "Not C", "equals": "AGT"}, - {"symbol": "B", "name": "Not A", "equals": "CGT"}, - {"symbol": "M", "name": "Amino", "equals": "AC"}, - {"symbol": "R", "name": "Purine", "equals": "AG"}, - {"symbol": "W", "name": "Weak", "equals": "AT"}, - {"symbol": "S", "name": "Strong", "equals": "CG"}, - {"symbol": "Y", "name": "Pyrimidine", "equals": "CT"}, - {"symbol": "K", "name": "Keto", "equals": "GT"} - ] - }), - PROTEIN: new StandardAlphabet(4, "PROTEIN", { - "name": "Protein", - "like": "PROTEIN", - "ncore": 20, - "symbols": [ - {"symbol": "A", "name": "Alanine", "colour": "0000CC"}, - {"symbol": "C", "name": "Cysteine", "colour": "0000CC"}, - {"symbol": "D", "name": "Aspartic acid", "colour": "FF00FF"}, - {"symbol": "E", "name": "Glutamic acid", "colour": "FF00FF"}, - {"symbol": "F", "name": "Phenylalanine", "colour": "0000CC"}, - {"symbol": "G", "name": "Glycine", "colour": "FFB300"}, - {"symbol": "H", "name": "Histidine", "colour": "FFCCCC"}, - {"symbol": "I", "name": "Isoleucine", "colour": "0000CC"}, - {"symbol": "K", "name": "Lysine", "colour": "CC0000"}, - {"symbol": "L", "name": "Leucine", "colour": "0000CC"}, - {"symbol": "M", "name": "Methionine", "colour": "0000CC"}, - {"symbol": "N", "name": "Asparagine", "colour": "008000"}, - {"symbol": "P", "name": "Proline", "colour": "FFFF00"}, - {"symbol": "Q", "name": "Glutamine", "colour": "008000"}, - {"symbol": "R", "name": "Arginine", "colour": "CC0000"}, - {"symbol": "S", "name": "Serine", "colour": "008000"}, - {"symbol": "T", "name": "Threonine", "colour": "008000"}, - {"symbol": "V", "name": "Valine", "colour": "0000CC"}, - {"symbol": "W", "name": "Tryptophan", "colour": "0000CC"}, - {"symbol": "Y", "name": "Tyrosine", "colour": "33E6CC"}, - {"symbol": "X", "name": "Any amino acid", "equals": "ACDEFGHIKLMNPQRSTVWY", "aliases": "*."}, - {"symbol": "B", "name": "Asparagine or Aspartic acid", "equals": "DN"}, - {"symbol": "Z", "name": "Glutamine or Glutamic acid", "equals": "EQ"}, - {"symbol": "J", "name": "Leucine or Isoleucine", "equals": "IL"} - ] - }) -}; - -//====================================================================== -// start Symbol object -//====================================================================== -var Symbol = function(alph_index, scale, alphabet) { - "use strict"; - //variable prototype - this.symbol = alphabet.get_symbol(alph_index); - this.scale = scale; - this.colour = alphabet.get_colour(alph_index); -}; - -Symbol.prototype.get_symbol = function() { - "use strict"; - return this.symbol; -}; - -Symbol.prototype.get_scale = function() { - "use strict"; - return this.scale; -}; - -Symbol.prototype.get_colour = function() { - "use strict"; - return this.colour; -}; - -Symbol.prototype.toString = function() { - "use strict"; - return this.symbol + " " + (Math.round(this.scale*1000)/10) + "%"; -}; - -function compare_symbol(sym1, sym2) { - "use strict"; - if (sym1.get_scale() < sym2.get_scale()) { - return -1; - } else if (sym1.get_scale() > sym2.get_scale()) { - return 1; - } else { - return 0; - } -} -//====================================================================== -// end Symbol object -//====================================================================== - -//====================================================================== -// start Pspm object -//====================================================================== -var Pspm = function(matrix, name, ltrim, rtrim, nsites, evalue, pssm, alt) { - "use strict"; - var row, col, data, row_sum, delta, evalue_re; - if (typeof name !== "string") { - name = ""; - } - this.name = name; - //construct - if (matrix instanceof Pspm) { - // copy constructor - this.alph_length = matrix.alph_length; - this.motif_length = matrix.motif_length; - this.name = matrix.name; - this.alt = matrix.alt; - this.nsites = matrix.nsites; - this.evalue = matrix.evalue; - this.ltrim = matrix.ltrim; - this.rtrim = matrix.rtrim; - this.pspm = []; - for (row = 0; row < matrix.motif_length; row++) { - this.pspm[row] = []; - for (col = 0; col < matrix.alph_length; col++) { - this.pspm[row][col] = matrix.pspm[row][col]; - } - } - if (matrix.pssm != null) { - this.pssm = []; - for (row = 0; row < matrix.motif_length; row++) { - this.pspm[row] = []; - for (col = 0; col < matrix.alph_length; col++) { - this.pssm[row][col] = matrix.pssm[row][col]; - } - } - } - } else { - // check parameters - if (ltrim == null) { - ltrim = 0; - } else if (typeof ltrim !== "number" || ltrim % 1 !== 0 || ltrim < 0) { - throw new Error("ltrim must be a non-negative integer, got: " + ltrim); - } - if (rtrim == null) { - rtrim = 0; - } else if (typeof rtrim !== "number" || rtrim % 1 !== 0 || rtrim < 0) { - throw new Error("rtrim must be a non-negative integer, got: " + rtrim); - } - if (nsites != null) { - if (typeof nsites !== "number" || nsites < 0) { - throw new Error("nsites must be a positive number, got: " + nsites); - } else if (nsites == 0) { - nsites = null; - } - } - if (evalue != null) { - if (typeof evalue === "number") { - if (evalue < 0) { - throw new Error("evalue must be a non-negative number, got: " + evalue); - } - } else if (typeof evalue === "string") { - evalue_re = /^((?:[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)|inf)$/; - if (!evalue_re.test(evalue)) { - throw new Error("evalue must be a non-negative number, got: " + evalue); - } - } else { - throw new Error("evalue must be a non-negative number, got: " + evalue); - } - } - // set properties - this.name = name; - this.alt = alt; - this.nsites = nsites; - this.evalue = evalue; - this.ltrim = ltrim; - this.rtrim = rtrim; - if (typeof matrix === "string") { - // string constructor - data = parse_pspm_string(matrix); - this.alph_length = data["alph_length"]; - this.motif_length = data["motif_length"]; - this.pspm = data["pspm"]; - if (this.evalue == null) { - if (data["evalue"] != null) { - this.evalue = data["evalue"]; - } else { - this.evalue = 0; - } - } - if (this.nsites == null) { - if (typeof data["nsites"] === "number") { - this.nsites = data["nsites"]; - } else { - this.nsites = 20; - } - } - } else { - // assume pspm is a nested array - this.motif_length = matrix.length; - this.alph_length = (matrix.length > 0 ? matrix[0].length : 0); - if (this.nsites == null) { - this.nsites = 20; - } - if (this.evalue == null) { - this.evalue = 0; - } - this.pspm = []; - // copy pspm and check - for (row = 0; row < this.motif_length; row++) { - if (this.alph_length != matrix[row].length) { - throw new Error("COLUMN_MISMATCH"); - } - this.pspm[row] = []; - row_sum = 0; - for (col = 0; col < this.alph_length; col++) { - this.pspm[row][col] = matrix[row][col]; - row_sum += this.pspm[row][col]; - } - delta = 0.1; - if (isNaN(row_sum) || (row_sum > 1 && (row_sum - 1) > delta) || - (row_sum < 1 && (1 - row_sum) > delta)) { - throw new Error("INVALID_SUM"); - } - } - // copy pssm - if (pssm != null) { - this.pssm = []; - for (row = 0; row < this.motif_length; row++) { - this.pssm[row] = []; - for (col = 0; col < this.alph_length; col++) { - this.pssm[row][col] = pssm[row][col]; - } - } - } - } - } -}; - -Pspm.prototype.copy = function() { - "use strict"; - return new Pspm(this); -}; - -Pspm.prototype.reverse = function() { - "use strict"; - var x, y, temp, temp_trim; - //reverse - x = 0; - y = this.motif_length-1; - while (x < y) { - temp = this.pspm[x]; - this.pspm[x] = this.pspm[y]; - this.pspm[y] = temp; - x++; - y--; - } - // reverse pssm (if defined) - if (typeof this.pssm !== "undefined") { - //reverse - x = 0; - y = this.motif_length-1; - while (x < y) { - temp = this.pssm[x]; - this.pspm[x] = this.pssm[y]; - this.pssm[y] = temp; - x++; - y--; - } - } - //swap triming - temp_trim = this.ltrim; - this.ltrim = this.rtrim; - this.rtrim = temp_trim; - return this; //allow function chaining... -}; - -Pspm.prototype.reverse_complement = function(alphabet) { - "use strict"; - var x, y, temp, i, row, c, temp_trim; - if (this.alph_length != alphabet.get_size_core()) { - throw new Error("The alphabet size does not match the size of the pspm."); - } - if (!alphabet.has_complement()) { - throw new Error("The specified alphabet can not be complemented."); - } - // reverse motif - this.reverse(); - //complement - for (x = 0; x < this.motif_length; x++) { - row = this.pspm[x]; - for (i = 0; i < row.length; i++) { - c = alphabet.get_complement(i); - if (c < i) continue; - temp = row[i]; - row[i] = row[c]; - row[c] = temp; - } - } - // complement pssm (if defined) - if (typeof this.pssm !== "undefined") { - //complement - for (x = 0; x < this.motif_length; x++) { - row = this.pssm[x]; - for (i = 0; i < row.length; i++) { - c = alphabet.get_complement(i); - if (c < i) continue; - temp = row[i]; - row[i] = row[c]; - row[c] = temp; - } - } - } - return this; //allow function chaining... -}; - -Pspm.prototype.get_stack = function(position, alphabet, ssc) { - "use strict"; - var row, stack_ic, alphabet_ic, stack, i, sym; - if (this.alph_length != alphabet.get_size_core()) { - throw new Error("The alphabet size does not match the size of the pspm."); - } - row = this.pspm[position]; - stack_ic = this.get_stack_ic(position, alphabet); - if (ssc) stack_ic -= this.get_error(alphabet); - alphabet_ic = alphabet.get_ic(); - stack = []; - for (i = 0; i < this.alph_length; i++) { - sym = new Symbol(i, row[i]*stack_ic/alphabet_ic, alphabet); - if (sym.get_scale() <= 0) { - continue; - } - stack.push(sym); - } - stack.sort(compare_symbol); - return stack; -}; - -Pspm.prototype.get_stack_ic = function(position, alphabet) { - "use strict"; - var row, H, i; - if (this.alph_length != alphabet.get_size_core()) { - throw new Error("The alphabet size does not match the size fo the pspm."); - } - row = this.pspm[position]; - H = 0; - for (i = 0; i < this.alph_length; i++) { - if (row[i] === 0) { - continue; - } - H -= (row[i] * (Math.log(row[i]) / Math.LN2)); - } - return alphabet.get_ic() - H; -}; - -Pspm.prototype.get_error = function(alphabet) { - "use strict"; - if (this.nsites === 0) { - return 0; - } - return (alphabet.get_size_core()-1) / (2 * Math.LN2 * this.nsites); -}; - -Pspm.prototype.get_motif_length = function() { - "use strict"; - return this.motif_length; -}; - -Pspm.prototype.get_alph_length = function() { - "use strict"; - return this.alph_length; -}; - -Pspm.prototype.get_left_trim = function() { - "use strict"; - return this.ltrim; -}; - -Pspm.prototype.get_right_trim = function() { - "use strict"; - return this.rtrim; -}; - -Pspm.prototype.as_best_match = function(alphabet) { - "use strict"; - var match, odds, best_odds, best_index; - var i, j; - match = ""; - for (i = 0; i < this.motif_length; i++) { - best_index = 0; - best_odds = this.pspm[i][0] / alphabet.get_bg_freq(0); - for (j = 1; j < this.alph_length; j++) { - odds = this.pspm[i][j] / alphabet.get_bg_freq(j); - if (odds > best_odds) { - best_odds = odds; - best_index = j; - } - } - match += alphabet.get_symbol(best_index); - } - return match; -}; - -Pspm.prototype.as_count_matrix = function() { - "use strict"; - var count, count_text, text; - var i, j; - text = ""; - for (i = 0; i < this.motif_length; i++) { - if (i !== 0) { - text += "\n"; - } - for (j = 0; j < this.alph_length; j++) { - if (j !== 0) { - text += " "; - } - count = Math.round(this.nsites * this.pspm[i][j]); - count_text = "" + count; - // pad up to length of 4 - if (count_text.length < 4) { - text += (new Array(5 - count_text.length)).join(" ") + count_text; - } else { - text += count_text; - } - } - } - return text; -}; - -Pspm.prototype.as_probability_matrix = function() { - "use strict"; - var text; - var i, j; - text = ""; - for (i = 0; i < this.motif_length; i++) { - if (i !== 0) { - text += "\n"; - } - for (j = 0; j < this.alph_length; j++) { - if (j !== 0) { - text += " "; - } - text += this.pspm[i][j].toFixed(6); - } - } - return text; -}; - -Pspm.prototype.as_score_matrix = function(alphabet, pseudo) { - "use strict"; - var me, score, out, row, col, score_text; - me = this; - if (typeof this.pssm === "undefined") { - if (!(typeof alphabet === "object" && alphabet != null && alphabet instanceof Alphabet)) { - throw new Error("The alphabet is required to generate the pssm."); - } - if (typeof pseudo === "undefined") { - pseudo = 0.01; - } else if (typeof pseudo !== "number" || pseudo < 0) { - throw new Error("Expected positive number for pseudocount"); - } - score = function(row, col) { - "use strict"; - var p, bg, p2; - p = me.pspm[row][col]; - bg = alphabet.get_bg_freq(col); - p2 = (p * me.nsites + bg * pseudo) / (me.nsites + pseudo); - return (p2 > 0 ? Math.round((Math.log(p2 / bg) / Math.LN2) * 100) : -10000); - }; - } else { - score = function(row, col) { - "use strict"; - return me.pssm[row][col]; - }; - } - out = ""; - for (row = 0; row < this.motif_length; row++) { - for (col = 0; col < this.alph_length; col++) { - if (col !== 0) { - out += " "; - } - score_text = "" + score(row, col); - // pad out to 6 characters - if (score_text.length < 6) { - out += (new Array(7 - score_text.length)).join(" ") + score_text; - } else { - out += score_text; - } - } - out += "\n"; - } - return out; -} - -Pspm.prototype.as_pspm = function() { - "use strict"; - return "letter-probability matrix: alength= " + this.alph_length + - " w= " + this.motif_length + " nsites= " + this.nsites + - " E= " + (typeof this.evalue === "number" ? - this.evalue.toExponential() : this.evalue) + "\n" + - this.as_probability_matrix(); -}; - -Pspm.prototype.as_pssm = function(alphabet, pseudo) { - "use strict"; - return "log-odds matrix: alength= " + this.alph_length + - " w= " + this.motif_length + - " E= " + (typeof this.evalue == "number" ? - this.evalue.toExponential() : this.evalue) + "\n" + - this.as_score_matrix(alphabet, pseudo); -}; - -Pspm.prototype.as_meme = function(options) { - var with_header, with_pspm, with_pssm, version, alphabet, bg_source, pseudocount, strands; - var out, alen, i; - // get the options - if (typeof options !== "object" || options === null) { - options = {}; - } - with_header = (typeof options["with_header"] === "boolean" ? options["with_header"] : false); - with_pspm = (typeof options["with_pspm"] === "boolean" ? options["with_pspm"] : false); - with_pssm = (typeof options["with_pssm"] === "boolean" ? options["with_pssm"] : false); - if (!with_pspm && !with_pssm) with_pspm = true; - if (with_header) { - if (typeof options["version"] === "string" && /^\d+(?:\.\d+){0,2}$/.test(options["version"])) { - version = options["version"]; - } else if (typeof options["version"] === "number") { - version = options["version"].toFixed(0); - } else { - version = "4"; - } - if (typeof options["strands"] === "number" && options["strands"] === 1) { - strands = 1; - } else { - strands = 2; - } - if (typeof options["bg_source"] === "string") { - bg_source = options["bg_source"]; - } else { - bg_source = "unknown source"; - } - if (typeof options["alphabet"] === "object" && options["alphabet"] != null - && options["alphabet"] instanceof Alphabet) { - alphabet = options["alphabet"]; - } else { - throw new Error("The alphabet is required to generate the header."); - } - } - // now create the output - out = ""; - if (with_header) { - out = "MEME version " + version + "\n\n"; - out += alphabet.as_meme() + "\n"; - if (alphabet.has_complement()) { // assume DNA has both strands unless otherwise specified - out += "strands: " + (strands === 1 ? "+" : "+ -") + "\n\n"; - } - out += "Background letter frequencies (from " + bg_source + "):\n"; - alen = alphabet.get_size_core(); - for (i = 0; i < alen; i++) { - if (i !== 0) { - if (i % 9 === 0) { // maximum of nine entries per line - out += "\n"; - } else { - out += " "; - } - } - out += alphabet.get_symbol(i) + " " + alphabet.get_bg_freq(i).toFixed(3); - } - } - out += "\n\n"; - out += "MOTIF " + this.name + (this.alt == null ? "" : " " + this.alt); - if (with_pssm) { - out += "\n\n"; - out += this.as_pssm(options["alphabet"], options["pseudocount"]); - } - if (with_pspm) { - out += "\n\n"; - out += this.as_pspm(); - } - return out; -} - -Pspm.prototype.toString = function() { - "use strict"; - var str, i, row; - str = ""; - for (i = 0; i < this.pspm.length; i++) { - row = this.pspm[i]; - str += row.join("\t") + "\n"; - } - return str; -}; - -function parse_pspm_properties(str) { - "use strict"; - var parts, i, eqpos, before, after, properties, prop, num, num_re; - num_re = /^((?:[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)|inf)$/; - parts = trim(str).split(/\s+/); - // split up words containing = - for (i = 0; i < parts.length;) { - eqpos = parts[i].indexOf("="); - if (eqpos != -1) { - before = parts[i].substr(0, eqpos); - after = parts[i].substr(eqpos+1); - if (before.length > 0 && after.length > 0) { - parts.splice(i, 1, before, "=", after); - i += 3; - } else if (before.length > 0) { - parts.splice(i, 1, before, "="); - i += 2; - } else if (after.length > 0) { - parts.splice(i, 1, "=", after); - i += 2; - } else { - parts.splice(i, 1, "="); - i++; - } - } else { - i++; - } - } - properties = {}; - for (i = 0; i < parts.length; i += 3) { - if (parts.length - i < 3) { - throw new Error("Expected PSPM property was incomplete. "+ - "Remaing parts are: " + parts.slice(i).join(" ")); - } - if (parts[i+1] !== "=") { - throw new Error("Expected '=' in PSPM property between key and " + - "value but got " + parts[i+1]); - } - prop = parts[i].toLowerCase(); - num = parts[i+2]; - if (!num_re.test(num)) { - throw new Error("Expected numeric value for PSPM property '" + - prop + "' but got '" + num + "'"); - } - properties[prop] = num; - } - return properties; -} - -function parse_pspm_string(pspm_string) { - "use strict"; - var header_re, lines, first_line, line_num, col_num, alph_length, - motif_length, nsites, evalue, pspm, i, line, match, props, parts, - j, prob; - header_re = /^letter-probability\s+matrix:(.*)$/i; - lines = pspm_string.split(/\n/); - first_line = true; - line_num = 0; - col_num = 0; - alph_length; - motif_length; - nsites; - evalue; - pspm = []; - for (i = 0; i < lines.length; i++) { - line = trim(lines[i]); - if (line.length === 0) { - continue; - } - // check the first line for a header though allow matrices without it - if (first_line) { - first_line = false; - match = header_re.exec(line); - if (match !== null) { - props = parse_pspm_properties(match[1]); - if (props.hasOwnProperty("alength")) { - alph_length = parseFloat(props["alength"]); - if (alph_length != 4 && alph_length != 20) { - throw new Error("PSPM property alength should be 4 or 20" + - " but got " + alph_length); - } - } - if (props.hasOwnProperty("w")) { - motif_length = parseFloat(props["w"]); - if (motif_length % 1 !== 0 || motif_length < 1) { - throw new Error("PSPM property w should be an integer larger " + - "than zero but got " + motif_length); - } - } - if (props.hasOwnProperty("nsites")) { - nsites = parseFloat(props["nsites"]); - if (nsites <= 0) { - throw new Error("PSPM property nsites should be larger than " + - "zero but got " + nsites); - } - } - if (props.hasOwnProperty("e")) { - evalue = props["e"]; - if (evalue < 0) { - throw new Error("PSPM property evalue should be " + - "non-negative but got " + evalue); - } - } - continue; - } - } - pspm[line_num] = []; - col_num = 0; - parts = line.split(/\s+/); - for (j = 0; j < parts.length; j++) { - prob = parseFloat(parts[j]); - if (prob != parts[j] || prob < 0 || prob > 1) { - throw new Error("Expected probability but got '" + parts[j] + "'"); - } - pspm[line_num][col_num] = prob; - col_num++; - } - line_num++; - } - if (typeof motif_length === "number") { - if (pspm.length != motif_length) { - throw new Error("Expected PSPM to have a motif length of " + - motif_length + " but it was actually " + pspm.length); - } - } else { - motif_length = pspm.length; - } - if (typeof alph_length !== "number") { - alph_length = pspm[0].length; - if (alph_length != 4 && alph_length != 20) { - throw new Error("Expected length of first row in the PSPM to be " + - "either 4 or 20 but got " + alph_length); - } - } - for (i = 0; i < pspm.length; i++) { - if (pspm[i].length != alph_length) { - throw new Error("Expected PSPM row " + i + " to have a length of " + - alph_length + " but the length was " + pspm[i].length); - } - } - return {"pspm": pspm, "motif_length": motif_length, - "alph_length": alph_length, "nsites": nsites, "evalue": evalue}; -} -//====================================================================== -// end Pspm object -//====================================================================== - -//====================================================================== -// start Logo object -//====================================================================== - -var Logo = function(alphabet, options) { - "use strict"; - this.alphabet = alphabet; - this.fine_text = ""; - this.x_axis = 1; - this.y_axis = true; - this.xlate_nsyms = 1; - this.xlate_start = null; - this.xlate_end = null; - this.pspm_list = []; - this.pspm_column = []; - this.rows = 0; - this.columns = 0; - if (typeof options === "string") { - // the old method signature had fine_text here so we support that - this.fine_text = options; - } else if (typeof options === "object" && options != null) { - this.fine_text = (typeof options.fine_text === "string" ? options.fine_text : ""); - this.x_axis = (typeof options.x_axis === "boolean" ? (options.x_axis ? 1 : 0) : 1); - if (options.x_axis_hidden != null && options.x_axis_hidden) this.x_axis = -1; - this.y_axis = (typeof options.y_axis === "boolean" ? options.y_axis : true); - this.xlate_nsyms = (typeof options.xlate_nsyms === "number" ? options.xlate_nsyms : this.xlate_nsyms); - this.xlate_start = (typeof options.xlate_start === "number" ? options.xlate_start : this.xlate_start); - this.xlate_end = (typeof options.xlate_end === "number" ? options.xlate_end : this.xlate_end); - } -}; - -Logo.prototype.add_pspm = function(pspm, column) { - "use strict"; - var col; - if (typeof column === "undefined") { - column = 0; - } else if (column < 0) { - throw new Error("Column index out of bounds."); - } - this.pspm_list[this.rows] = pspm; - this.pspm_column[this.rows] = column; - this.rows++; - col = column + pspm.get_motif_length(); - if (col > this.columns) { - this.columns = col; - } -}; - -Logo.prototype.get_columns = function() { - "use strict"; - return this.columns; -}; - -Logo.prototype.get_xlate_nsyms = function() { - "use strict"; - return this.xlate_nsyms; -}; - -Logo.prototype.get_xlate_start = function() { - "use strict"; - return (this.xlate_start != null ? this.xlate_start : 0); -}; - -Logo.prototype.get_xlate_end = function() { - "use strict"; - return (this.xlate_end != null ? this.xlate_end : this.columns * this.xlate_nsyms); -}; - -Logo.prototype.get_xlate_columns = function() { - "use strict"; - return this.get_xlate_end() - this.get_xlate_start(); -}; - -Logo.prototype.get_rows = function() { - "use strict"; - return this.rows; -}; - -Logo.prototype.get_pspm = function(row_index) { - "use strict"; - if (row_index < 0 || row_index >= this.rows) { - throw new Error("INDEX_OUT_OF_BOUNDS"); - } - return this.pspm_list[row_index]; -}; - -Logo.prototype.get_offset = function(row_index) { - "use strict"; - if (row_index < 0 || row_index >= this.rows) { - throw new Error("INDEX_OUT_OF_BOUNDS"); - } - return this.pspm_column[row_index]; -}; - -Logo.prototype._as_eps_data = function(ssc, errbars) { - var i, j, pos, stack_pos, pspm, stack, sym, out; - out = ""; - for (i = 0; i < this.rows; i++) { - out += "\nStartLine\n"; - // Indent - for (j = 0; j < this.pspm_column[i]; j++) { - out += "() startstack\nendstack\n\n"; - } - pspm = this.pspm_list[i]; - if (pspm.get_left_trim() > 0) { - out += "MuteColour\nDrawTrimEdge\n" + pspm.get_left_trim() + " DrawTrimBg\n"; - } - for (pos = 0; pos < pspm.get_motif_length(); pos++) { - if (pos != 0 && pos == pspm.get_left_trim()) { // enable full colour - out += "DrawTrimEdge\nRestoreColour\n"; - } else if (pos == (pspm.get_motif_length() - pspm.get_right_trim())) { - out += "MuteColour\n" + pspm.get_right_trim() + " DrawTrimBg\n"; - } - out += "(" + (pos + 1) + ") startstack\n"; - stack = pspm.get_stack(pos, this.alphabet, ssc); - for (stack_pos = 0; stack_pos < stack.length; stack_pos++) { - sym = stack[stack_pos]; - out += " " + (sym.get_scale() * this.alphabet.get_ic()) + " (" + sym.get_symbol() + ") numchar\n"; - } - if (errbars) { - out += " " + pspm.get_error(this.alphabet) + " Ibeam\n"; - } - out += "endstack\n\n"; - } - if (pspm.get_right_trim() > 0 || pspm.get_left_trim() == pspm.get_motif_length()) { - out += "RestoreColour\n"; - } - out += "EndLine\n"; - } - return out; -}; - -Logo.prototype.as_eps = function(options) { - "use strict"; - if (this.xlate_nsyms != 1) throw new Error("Unsupported setting xlate_nsyms for EPS"); - if (this.xlate_start != null) throw new Error("Unsupported setting xlate_start for EPS"); - if (this.xlate_end != null) throw new Error("Unsupported setting xlate_end for EPS"); - - var LOGOHEIGHT = 7.5; // default height of line in cm - var cm2pts, height, width, now, ssc, errbars; - if (typeof options === "undefined") { - options = {}; - } - cm2pts = 72 / 2.54; - if (typeof options.logo_height == "number") { - height = options.logo_height; - } else { - height = LOGOHEIGHT * this.rows; - } - if (typeof options.logo_width == "number") { - width = options.logo_width; - } else { - width = this.columns + 2; - } - now = new Date(); - ssc = (typeof options.ssc == "boolean" ? options.ssc : false); - errbars = (typeof options.show_error_bar == "boolean" ? options.show_error_bar : ssc); - var values = { - "LOGOHEIGHT": height, - "LOGOWIDTH": width, - "BOUNDINGHEIGHT": Math.round(height * cm2pts), - "BOUNDINGWIDTH": Math.round(width * cm2pts), - "LOGOLINEHEIGHT": (height / this.rows), - "CHARSPERLINE": this.columns, - "BARBITS": this.alphabet.get_ic(), - "LOGOTYPE": (this.alphabet.has_complement() ? "NA" : "AA"), - "CREATIONDATE": now.getDate() + "." + (now.getMonth() + 1) + "." + now.getFullYear() + " " + now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds(), - "ERRORBARFRACTION": (typeof options.error_bar_fraction == "number" ? options.error_bar_fraction : 1.0), - "TICBITS": (typeof options.ticbits == "number" ? options.ticbits : 1.0), - "TITLE": (typeof options.title == "string" ? options.title : ""), - "FINEPRINT": (typeof options.fineprint == "string" ? options.fineprint : this.fine_text), - "XAXISLABEL": (typeof options.xaxislabel == "string" ? options.xaxislabel : ""), - "YAXISLABEL": (typeof options.yaxislabel == "string" ? options.yaxislabel : "bits"), - "SSC": ssc, - "YAXIS": (typeof options.show_y_axis == "boolean" ? options.show_y_axis : this.y_axis), - "SHOWENDS": (typeof options.show_ends == "boolean" ? options.show_ends : false), - "ERRBAR": errbars, - "OUTLINE": (typeof options.show_outline == "boolean" ? options.show_outline : false), - "NUMBERING": (typeof options.show_numbering == "boolean" ? options.show_numbering : this.x_axis != 0), - "SHOWINGBOX": (typeof options.show_box == "boolean" ? options.show_box : false), - "CREATOR": (typeof options.creator == "string" ? options.creator : "motif_logo.js"), - "FONTSIZE": (typeof options.label_font_size == "number" ? options.label_font_size : 12), - "TITLEFONTSIZE": (typeof options.title_font_size == "number" ? options.title_font_size : 12), - "SMALLFONTSIZE": (typeof options.small_font_size == "number" ? options.small_font_size : 6), - "TOPMARGIN" : (typeof options.top_margin == "number" ? options.top_margin : 0.9), - "BOTTOMMARGIN": (typeof options.bottom_margin == "number" ? options.bottom_margin : 0.9), - "COLORDICT": this.alphabet._as_eps_dict(), - "DATA": this._as_eps_data(ssc, errbars) - }; - // now this requires that the script containing the template has been imported! - return motif_logo_template(values); -}; - -//====================================================================== -// end Logo object -//====================================================================== - -// calculate the exact size (in pixels) of an object drawn on the -// canvas assuming that the background of the canvas is transparent. -function canvas_bounds(ctx, cwidth, cheight) { - "use strict"; - var data, r, c, top_line, bottom_line, left_line, right_line, - txt_width, txt_height; - - // extract the image data - data = ctx.getImageData(0, 0, cwidth, cheight).data; - - // set initial values - top_line = -1; bottom_line = -1; left_line = -1; right_line = -1; - txt_width = 0; txt_height = 0; - - // Find the top-most line with a non-transparent pixel - for (r = 0; r < cheight; r++) { - for (c = 0; c < cwidth; c++) { - if (data[r * cwidth * 4 + c * 4 + 3]) { - top_line = r; - break; - } - } - if (top_line != -1) { - break; - } - } - - // Only bother looking if we found at least one set pixel... - if (top_line != -1) { - - //find the last line with a non-transparent pixel - for (r = cheight-1; r >= top_line; r--) { - for(c = 0; c < cwidth; c++) { - if(data[r * cwidth * 4 + c * 4 + 3]) { - bottom_line = r; - break; - } - } - if (bottom_line != -1) { - break; - } - } - // calculate height - txt_height = bottom_line - top_line + 1; - - // Find the left-most line with a non-transparent pixel - for (c = 0; c < cwidth; c++) { - for (r = top_line; r <= bottom_line; r++) { - if (data[r * cwidth * 4 + c * 4 + 3]) { - left_line = c; - break; - } - } - if (left_line != -1) { - break; - } - } - - //find the right most line with a non-transparent pixel - for (c = cwidth-1; c >= left_line; c--) { - for(r = top_line; r <= bottom_line; r++) { - if(data[r * cwidth * 4 + c * 4 + 3]) { - right_line = c; - break; - } - } - if (right_line != -1) { - break; - } - } - txt_width = right_line - left_line + 1; - } - - //return the bounds - return {bound_top: top_line, bound_bottom: bottom_line, - bound_left: left_line, bound_right: right_line, width: txt_width, - height: txt_height}; -} - -//====================================================================== -// start RasterizedAlphabet -//====================================================================== - -// Rasterize Alphabet -// 1) Measure width of text at default font for all symbols in alphabet -// 2) sort in width ascending -// 3) Drop the top and bottom 10% (designed to ignore outliers like 'W' and 'I') -// 4) Calculate the average as the maximum scaling factor (designed to stop I becoming a rectangular blob). -// 5) Assume scale of zero would result in width of zero, interpolate scale required to make perfect width font -// 6) Draw text onto temp canvas at calculated scale -// 7) Find bounds of drawn text -// 8) Paint on to another canvas at the desired height (but only scaling width to fit if larger). -var RasterizedAlphabet = function(alphabet, logo_scale, font, width) { - "use strict"; - var default_size, safety_pad, canvas, ctx, middle, baseline, widths, sizes, - i, sym, size, tenpercent, avg_width, scale, - target_width, target_height; - //variable prototypes - this.alphabet = alphabet; - this.scale = logo_scale; - this.sym_cache = {}; - this.stack_num_cache = []; - this.scale_num_cache = []; - // size of canvas - default_size = 60; // size of measuring canvas - safety_pad = 20; // pixels to pad around so we don't miss the edges - // create a canvas to do our measuring - canvas = document.createElement("canvas"); - if (!canvas.getContext) throw new Error("No canvas support"); - canvas.width = default_size + 2 * safety_pad; - canvas.height = default_size + 2 * safety_pad; - middle = Math.round(canvas.width / 2); - baseline = Math.round(canvas.height - safety_pad); - ctx = canvas.getContext('2d'); - if (!supports_text(ctx)) throw new Error("Canvas does not support text"); - ctx.font = font; - ctx.textAlign = "center"; - ctx.translate(middle, baseline); - // list of widths - widths = []; - sizes = []; - //now measure each letter in the alphabet - for (i = 0; i < alphabet.get_size_core(); ++i) { - // reset the canvas - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.fillStyle = alphabet.get_colour(i); - // draw the test text - ctx.fillText(alphabet.get_symbol(i), 0, 0); - //measure - size = canvas_bounds(ctx, canvas.width, canvas.height); - if (size.width === 0) throw new Error("Invisible symbol!"); - widths.push(size.width); - sizes[i] = size; - } - //sort the widths - widths.sort(function(a,b) {return a - b;}); - //drop 10% of the items off each end - tenpercent = Math.floor(widths.length / 10); - for (i = 0; i < tenpercent; ++i) { - widths.pop(); - widths.shift(); - } - //calculate average width - avg_width = 0; - for (i = 0; i < widths.length; ++i) { - avg_width += widths[i]; - } - avg_width /= widths.length; - // calculate the target width - target_width = width * this.scale * 2; - // calculate scales - for (i = 0; i < alphabet.get_size_core(); ++i) { - sym = alphabet.get_symbol(i); - size = sizes[i]; - // calculate scale - scale = target_width / Math.max(avg_width, size.width); - // estimate scaled height - target_height = size.height * scale; - // create an appropriately sized canvas - canvas = document.createElement("canvas"); - canvas.width = target_width; - canvas.height = target_height + safety_pad * 2; - // calculate the middle - middle = Math.round(canvas.width / 2); - // calculate the baseline - baseline = Math.round(canvas.height - safety_pad); - // get the context and prepare to draw the rasterized text - ctx = canvas.getContext('2d'); - ctx.font = font; - ctx.fillStyle = alphabet.get_colour(i); - ctx.textAlign = "center"; - ctx.translate(middle, baseline); - ctx.save(); - ctx.scale(scale, scale); - // draw the text - ctx.fillText(sym, 0, 0); - ctx.restore(); - this.sym_cache[sym] = {"image": canvas, "size": canvas_bounds(ctx, canvas.width, canvas.height)}; - } -}; - -RasterizedAlphabet.prototype.get_alphabet = function() { - return this.alphabet; -}; - -RasterizedAlphabet.prototype.get_scale = function() { - return this.scale; -}; - -RasterizedAlphabet.prototype.draw_stack_sym = function(ctx, letter, dx, dy, dWidth, dHeight) { - "use strict"; - var entry, image, size; - entry = this.sym_cache[letter]; - image = entry.image; - size = entry.size; - ctx.drawImage(image, 0, size.bound_top -1, image.width, size.height+1, dx, dy, dWidth, dHeight); -}; - -RasterizedAlphabet.prototype.draw_stack_num = function(ctx, font, stack_width, index) { - var image, image_ctx, text_length; - if (index >= this.stack_num_cache.length) { - image = document.createElement("canvas"); - // measure the text - image_ctx = image.getContext('2d'); - image_ctx.save(); - image_ctx.font = font; - text_length = image_ctx.measureText("" + (index + 1)).width; - image_ctx.restore(); - // resize the canvas to fit - image.width = Math.ceil(stack_width); - image.height = Math.ceil(text_length); - // draw the text - image_ctx = image.getContext('2d'); - image_ctx.translate(Math.round(stack_width / 2), 0); - image_ctx.font = font; - image_ctx.textBaseline = "middle"; - image_ctx.textAlign = "right"; - image_ctx.rotate(-(Math.PI / 2)); - image_ctx.fillText("" + (index + 1), 0, 0); - this.stack_num_cache[index] = image; - } else { - image = this.stack_num_cache[index]; - } - ctx.drawImage(image, 0, 0); -} - -RasterizedAlphabet.prototype.draw_scale_num = function(ctx, font, num) { - var image, image_ctx, text_size, m_length; - if (num >= this.scale_num_cache.length) { - image = document.createElement("canvas"); - // measure the text - image_ctx = image.getContext('2d'); - image_ctx.font = font; - text_size = image_ctx.measureText("" + num); - if (text_size.actualBoundingBoxAscent && text_size.actualBoundingBoxDesent) { - // resize the canvas to fit - image.width = Math.ceil(text_size.width); - image.height = Math.ceil(text_size.actualBoundingBoxAscent + text_size.actualBoundingBoxDesent); - // draw the text - image_ctx = image.getContext('2d'); - image_ctx.font = font; - image_ctx.textAlign = "right"; - image_ctx.fillText("" + num, image.width, text_size.actualBoundingBoxAscent); - } else { - // measure width of 'm' to approximate height, we double it later anyway - m_length = image_ctx.measureText("m").width; - // resize the canvas to fit - image.width = Math.ceil(text_size.width); - image.height = Math.ceil(2 * m_length); - // draw the text - image_ctx = image.getContext('2d'); - image_ctx.font = font; - image_ctx.textAlign = "right"; - image_ctx.textBaseline = "middle"; - image_ctx.fillText("" + num, image.width, m_length); - } - this.scale_num_cache[num] = image; - } else { - image = this.scale_num_cache[num]; - } - ctx.drawImage(image, -image.width, -Math.round(image.height / 2)) -} - -//====================================================================== -// end RasterizedAlphabet -//====================================================================== - -//====================================================================== -// start LogoMetrics object -//====================================================================== - -var LogoMetrics = function(ctx, logo_columns, logo_rows, has_names, has_finetext, x_axis, y_axis) { - "use strict"; - var i, row_height; - //variable prototypes - this.pad_top = (has_names ? 5 : 0); - this.pad_left = (y_axis ? 10 : 0); - this.pad_right = (has_finetext ? 15 : 0); - this.pad_bottom = 0; - this.pad_middle = 20; - this.name_height = 14; - this.name_font = "bold " + this.name_height + "px Times, sans-serif"; - this.name_spacer = 0; - this.y_axis = y_axis; - this.y_label = "bits"; - this.y_label_height = 12; - this.y_label_font = "bold " + this.y_label_height + "px Helvetica, sans-serif"; - this.y_label_spacer = 3; - this.y_num_height = 12; - this.y_num_width = 0; - this.y_num_font = "bold " + this.y_num_height + "px Helvetica, sans-serif"; - this.y_tic_width = 5; - this.stack_pad_left = 0; - this.stack_font = "bold 25px Helvetica, sans-serif"; - this.stack_height = 90; - this.stack_width = 26; - this.stacks_pad_right = 5; - this.x_axis = x_axis; - this.x_num_above = 2; - this.x_num_height = 12; - this.x_num_width = 0; - this.x_num_font = "bold " + this.x_num_height + "px Helvetica, sans-serif"; - this.fine_txt_height = 6; - this.fine_txt_above = 2; - this.fine_txt_font = "normal " + this.fine_txt_height + "px Helvetica, sans-serif"; - this.letter_metrics = new Array(); - this.summed_width = 0; - this.summed_height = 0; - //calculate the width of the y axis numbers - ctx.font = this.y_num_font; - for (i = 0; i <= 2; i++) { - this.y_num_width = Math.max(this.y_num_width, ctx.measureText("" + i).width); - } - //calculate the width of the x axis numbers (but they are rotated so it becomes height) - if (x_axis == 1) { - ctx.font = this.x_num_font; - for (i = 1; i <= logo_columns; i++) { - this.x_num_width = Math.max(this.x_num_width, ctx.measureText("" + i).width); - } - } else if (x_axis == 0) { - this.x_num_height = 4; - this.x_num_width = 4; - } else { - this.x_num_height = 0; - this.x_num_width = 0; - } - - //calculate how much vertical space we want to draw this - //first we add the padding at the top and bottom since that's always there - this.summed_height += this.pad_top + this.pad_bottom; - //all except the last row have the same amount of space allocated to them - if (logo_rows > 1) { - row_height = this.stack_height + this.pad_middle; - if (has_names) { - row_height += this.name_height; - //the label is allowed to overlap into the spacer - row_height += Math.max(this.y_num_height/2, this.name_spacer); - //the label is allowed to overlap the space used by the other label - row_height += Math.max(this.y_num_height/2, this.x_num_height + this.x_num_above); - } else { - row_height += this.y_num_height/2; - //the label is allowed to overlap the space used by the other label - row_height += Math.max(this.y_num_height/2, this.x_num_height + this.x_num_above); - } - this.summed_height += row_height * (logo_rows - 1); - } - //the last row has the name and fine text below it but no padding - this.summed_height += this.stack_height + (this.y_axis ? this.y_num_height/2 : 0); - - var fine_txt_total = (has_finetext ? this.fine_txt_height + this.fine_txt_above : 0); - if (has_names) { - this.summed_height += fine_txt_total + this.name_height; - this.summed_height += Math.max((this.y_axis ? this.y_num_height/2 : 0), - this.x_num_height + this.x_num_above + this.name_spacer); - } else { - this.summed_height += Math.max((this.y_axis ? this.y_num_height/2 : 0), - this.x_num_height + this.x_num_above + fine_txt_total); - } - - //calculate how much horizontal space we want to draw this - //first add the padding at the left and right since that's always there - this.summed_width += this.pad_left + this.pad_right; - if (this.y_axis) { - //add on the space for the y-axis label - this.summed_width += this.y_label_height + this.y_label_spacer; - //add on the space for the y-axis - this.summed_width += this.y_num_width + this.y_tic_width; - } - //add on the space for the stacks - this.summed_width += (this.stack_pad_left + this.stack_width) * logo_columns; - //add on the padding after the stacks (an offset from the fine text) - this.summed_width += this.stacks_pad_right; - -}; - -//====================================================================== -// end LogoMetrics object -//====================================================================== - -//found this trick at http://talideon.com/weblog/2005/02/detecting-broken-images-js.cfm -function image_ok(img) { - "use strict"; - // During the onload event, IE correctly identifies any images that - // weren't downloaded as not complete. Others should too. Gecko-based - // browsers act like NS4 in that they report this incorrectly. - if (!img.complete) { - return false; - } - // However, they do have two very useful properties: naturalWidth and - // naturalHeight. These give the true size of the image. If it failed - // to load, either of these should be zero. - if (typeof img.naturalWidth !== "undefined" && img.naturalWidth === 0) { - return false; - } - // No other way of checking: assume it's ok. - return true; -} - -function supports_text(ctx) { - "use strict"; - if (!ctx.fillText) { - return false; - } - if (!ctx.measureText) { - return false; - } - return true; -} - -//draws the scale, returns the width -function draw_scale(ctx, metrics, alphabet_ic, raster) { - "use strict"; - var tic_height, i; - tic_height = metrics.stack_height / alphabet_ic; - ctx.save(); - ctx.translate(metrics.y_label_height, metrics.y_num_height/2); - //draw the axis label - ctx.save(); - ctx.font = metrics.y_label_font; - ctx.translate(0, metrics.stack_height/2); - ctx.rotate(-(Math.PI / 2)); - ctx.textAlign = "center"; - ctx.fillText("bits", 0, 0); - ctx.restore(); - - ctx.translate(metrics.y_label_spacer + metrics.y_num_width, 0); - - //draw the axis tics - ctx.save(); - ctx.translate(0, metrics.stack_height); - for (i = 0; i <= alphabet_ic; i++) { - //draw the number - ctx.save(); - ctx.translate(-1, 0); - raster.draw_scale_num(ctx, metrics.y_num_font, i); - ctx.restore(); - //draw the tic - ctx.fillRect(0, -1, metrics.y_tic_width, 2); - //prepare for next tic - ctx.translate(0, -tic_height); - } - ctx.restore(); - - ctx.fillRect(metrics.y_tic_width - 2, 0, 2, metrics.stack_height) - - ctx.restore(); -} - -function draw_stack_num(ctx, metrics, row_index, raster) { - "use strict"; - ctx.save(); - ctx.translate(0, Math.round(metrics.stack_height + metrics.x_num_above)); - if (metrics.x_axis == 1) { - raster.draw_stack_num(ctx, metrics.x_num_font, metrics.stack_width, row_index); - } else if (metrics.x_axis == 0) { - // draw dots instead of the numbers (good for small logos) - ctx.beginPath(); - var radius = Math.round(metrics.x_num_height / 2); - ctx.arc(Math.round(metrics.stack_width / 2), radius, radius, 0, 2 * Math.PI, false); - ctx.fill(); - } - ctx.restore(); -} - -function draw_stack(ctx, metrics, symbols, raster) { - "use strict"; - var preferred_pad, sym_min, i, sym, sym_height, pad; - preferred_pad = 0; - sym_min = 5; - - ctx.save();//1 - ctx.translate(0, metrics.stack_height); - for (i = 0; i < symbols.length; i++) { - sym = symbols[i]; - sym_height = metrics.stack_height * sym.get_scale(); - - pad = preferred_pad; - if (sym_height - pad < sym_min) { - pad = Math.min(pad, Math.max(0, sym_height - sym_min)); - } - sym_height -= pad; - - //translate to the correct position - ctx.translate(0, -(pad/2 + sym_height)); - - //draw - raster.draw_stack_sym(ctx, sym.get_symbol(), 0, 0, metrics.stack_width, sym_height); - //translate past the padding - ctx.translate(0, -(pad/2)); - } - ctx.restore();//1 -} - -function draw_dashed_line(ctx, pattern, start, x1, y1, x2, y2) { - "use strict"; - var x, y, len, i, dx, dy, tlen, theta, mulx, muly, lx, ly; - dx = x2 - x1; - dy = y2 - y1; - tlen = Math.pow(dx*dx + dy*dy, 0.5); - theta = Math.atan2(dy,dx); - mulx = Math.cos(theta); - muly = Math.sin(theta); - lx = []; - ly = []; - for (i = 0; i < pattern; ++i) { - lx.push(pattern[i] * mulx); - ly.push(pattern[i] * muly); - } - i = start; - x = x1; - y = y1; - len = 0; - ctx.beginPath(); - while (len + pattern[i] < tlen) { - ctx.moveTo(x, y); - x += lx[i]; - y += ly[i]; - ctx.lineTo(x, y); - len += pattern[i]; - i = (i + 1) % pattern.length; - x += lx[i]; - y += ly[i]; - len += pattern[i]; - i = (i + 1) % pattern.length; - } - if (len < tlen) { - ctx.moveTo(x, y); - x += mulx * (tlen - len); - y += muly * (tlen - len); - ctx.lineTo(x, y); - } - ctx.stroke(); -} - -function draw_trim_background(ctx, metrics, left_start, left_end, left_divider, right_start, right_end, right_divider) { - "use strict"; - var left_size = left_end - left_start; - var right_size = right_end - right_start; - var line_x; - - ctx.save();//s8 - ctx.fillStyle = "rgb(240, 240, 240)"; - if (left_size > 0) { - ctx.fillRect(left_start * metrics.stack_width, 0, left_size * metrics.stack_width, metrics.stack_height); - } - if (right_size > 0) { - ctx.fillRect(right_start * metrics.stack_width, 0, right_size * metrics.stack_width, metrics.stack_height); - } - ctx.fillStyle = "rgb(51, 51, 51)"; - if (left_size > 0 && left_divider) { - line_x = (left_end * metrics.stack_width) - 0.5; - draw_dashed_line(ctx, [3], 0, line_x, 0, line_x, metrics.stack_height); - } - if (right_size > 0 && right_divider) { - line_x = (right_start * metrics.stack_width) + 0.5; - draw_dashed_line(ctx, [3], 0, line_x, 0, line_x, metrics.stack_height); - } - ctx.restore();//s8 -} - -function size_logo_on_canvas(logo, canvas, show_names, scale) { - "use strict"; - var draw_name, draw_finetext, metrics; - draw_name = (typeof show_names === "boolean" ? show_names : (logo.get_rows() > 1)); - draw_finetext = (logo.fine_text.length > 0); - if (canvas.width !== 0 && canvas.height !== 0) { - return; - } - metrics = new LogoMetrics(canvas.getContext('2d'), - logo.get_xlate_columns(), logo.get_rows(), draw_name, draw_finetext, logo.x_axis, logo.y_axis); - if (typeof scale == "number") { - //resize the canvas to fit the scaled logo - canvas.width = metrics.summed_width * scale; - canvas.height = metrics.summed_height * scale; - } else { - if (canvas.width === 0 && canvas.height === 0) { - canvas.width = metrics.summed_width; - canvas.height = metrics.summed_height; - } else if (canvas.width === 0) { - canvas.width = metrics.summed_width * (canvas.height / metrics.summed_height); - } else if (canvas.height === 0) { - canvas.height = metrics.summed_height * (canvas.width / metrics.summed_width); - } - } -} - -function draw_logo_on_canvas(logo, canvas, show_names, scale) { - "use strict"; - var i, draw_name, draw_finetext, ctx, metrics, raster, pspm_i, pspm, - offset, col_index, motif_position, ssc; - ssc = false; - draw_name = (typeof show_names === "boolean" ? show_names : (logo.get_rows() > 1)); - draw_finetext = (logo.fine_text.length > 0); - ctx = canvas.getContext('2d'); - //assume that the user wants the canvas scaled equally so calculate what the best width for this image should be - metrics = new LogoMetrics(ctx, logo.get_xlate_columns(), logo.get_rows(), draw_name, draw_finetext, logo.x_axis, logo.y_axis); - if (typeof scale == "number") { - //resize the canvas to fit the scaled logo - canvas.width = metrics.summed_width * scale; - canvas.height = metrics.summed_height * scale; - } else { - if (canvas.width === 0 && canvas.height === 0) { - scale = 1; - canvas.width = metrics.summed_width; - canvas.height = metrics.summed_height; - } else if (canvas.width === 0) { - scale = canvas.height / metrics.summed_height; - canvas.width = metrics.summed_width * scale; - } else if (canvas.height === 0) { - scale = canvas.width / metrics.summed_width; - canvas.height = metrics.summed_height * scale; - } else { - scale = Math.min(canvas.width / metrics.summed_width, canvas.height / metrics.summed_height); - } - } - // cache the raster based on the assumption that we will be drawing a lot - // of logos the same size and alphabet - if (typeof draw_logo_on_canvas.raster_cache === "undefined") { - draw_logo_on_canvas.raster_cache = []; - } - for (i = 0; i < draw_logo_on_canvas.raster_cache.length; i++) { - raster = draw_logo_on_canvas.raster_cache[i]; - if (raster.get_alphabet().equals(logo.alphabet) && - Math.abs(raster.get_scale() - scale) < 0.1) break; - raster = null; - } - if (raster == null) { - raster = new RasterizedAlphabet(logo.alphabet, scale, metrics.stack_font, metrics.stack_width); - draw_logo_on_canvas.raster_cache.push(raster); - } - ctx = canvas.getContext('2d'); - ctx.save();//s1 - ctx.scale(scale, scale); - ctx.save();//s2 - ctx.save();//s7 - //create margin - ctx.translate(Math.round(metrics.pad_left), Math.round(metrics.pad_top)); - for (pspm_i = 0; pspm_i < logo.get_rows(); ++pspm_i) { - pspm = logo.get_pspm(pspm_i); - offset = logo.get_offset(pspm_i); - //optionally draw name if this isn't the last row or is the only row - if (draw_name && (logo.get_rows() == 1 || pspm_i != (logo.get_rows()-1))) { - ctx.save();//s4 - ctx.translate(Math.round(metrics.summed_width/2), Math.round(metrics.name_height)); - ctx.font = metrics.name_font; - ctx.textAlign = "center"; - ctx.fillText(pspm.name, 0, 0); - ctx.restore();//s4 - ctx.translate(0, Math.round(metrics.name_height + - Math.min(0, metrics.name_spacer - metrics.y_num_height/2))); - } - //draw scale - if (logo.y_axis) draw_scale(ctx, metrics, logo.alphabet.get_ic(), raster); - ctx.save();//s5 - //translate across past the scale - if (logo.y_axis) { - ctx.translate(Math.round(metrics.y_label_height + metrics.y_label_spacer + - metrics.y_num_width + metrics.y_tic_width), Math.round(metrics.y_num_height / 2)); - } - //draw the trimming background - if (pspm.get_left_trim() > 0 || pspm.get_right_trim() > 0) { - var left_start = offset * logo.get_xlate_nsyms(); - var left_end = (offset + pspm.get_left_trim()) * logo.get_xlate_nsyms(); - var left_divider = true; - if (left_end < logo.get_xlate_start() || left_start > logo.get_xlate_end()) { - // no overlap - left_start = 0; - left_end = 0; - left_divider = false; - } else { - if (left_start < logo.get_xlate_start()) { - left_start = logo.get_xlate_start(); - } - if (left_end > logo.get_xlate_end()) { - left_end = logo.get_xlate_end(); - left_divider = false; - } - left_start -= logo.get_xlate_start(); - left_end -= logo.get_xlate_start(); - if (left_end < left_start) { - left_start = 0; - left_end = 0; - left_divider = false; - } - } - var right_end = (offset + pspm.get_motif_length()) * logo.get_xlate_nsyms(); - //var right_start = right_end - (pspm.get_left_trim() * logo.get_xlate_nsyms()); - var right_start = right_end - (pspm.get_right_trim() * logo.get_xlate_nsyms()); - var right_divider = true; - if (right_end < logo.get_xlate_start() || right_start > logo.get_xlate_end()) { - // no overlap - right_start = 0; - right_end = 0; - right_divider = false; - } else { - if (right_start < logo.get_xlate_start()) { - right_start = logo.get_xlate_start(); - right_divider = false; - } - if (right_end > logo.get_xlate_end()) { - right_end = logo.get_xlate_end(); - } - right_start -= logo.get_xlate_start(); - right_end -= logo.get_xlate_start(); - if (right_end < right_start) { - right_start = 0; - right_end = 0; - right_divider = false; - } - } - draw_trim_background(ctx, metrics, left_start, left_end, left_divider, right_start, right_end, right_divider); - } - //draw letters - var xlate_col; - for (xlate_col = logo.get_xlate_start(); xlate_col < logo.get_xlate_end(); xlate_col++) { - ctx.translate(metrics.stack_pad_left,0); - col_index = Math.floor(xlate_col / logo.get_xlate_nsyms()); - if (xlate_col % logo.get_xlate_nsyms() == 0) { - if (col_index >= offset && col_index < (offset + pspm.get_motif_length())) { - motif_position = col_index - offset; - draw_stack_num(ctx, metrics, motif_position, raster); - draw_stack(ctx, metrics, pspm.get_stack(motif_position, logo.alphabet, ssc), raster); - } - } else { - if (col_index >= offset && col_index < (offset + pspm.get_motif_length())) { - ctx.save();// s5.1 - ctx.translate(0, Math.round(metrics.stack_height)); - // TODO draw a dot or dash or something to indicate continuity of the motif - ctx.restore(); //s5.1 - } - } - ctx.translate(Math.round(metrics.stack_width), 0); - } - ctx.restore();//s5 - ////optionally draw name if this is the last row but isn't the only row - if (draw_name && (logo.get_rows() != 1 && pspm_i == (logo.get_rows()-1))) { - //translate vertically past the stack and axis's - ctx.translate(0, metrics.y_num_height/2 + metrics.stack_height + - Math.max(metrics.y_num_height/2, metrics.x_num_above + metrics.x_num_width + metrics.name_spacer)); - - ctx.save();//s6 - ctx.translate(metrics.summed_width/2, metrics.name_height); - ctx.font = metrics.name_font; - ctx.textAlign = "center"; - ctx.fillText(pspm.name, 0, 0); - ctx.restore();//s6 - ctx.translate(0, metrics.name_height); - } else { - //translate vertically past the stack and axis's - ctx.translate(0, metrics.y_num_height/2 + metrics.stack_height + - Math.max(metrics.y_num_height/2, metrics.x_num_above + metrics.x_num_width)); - } - //if not the last row then add middle padding - if (pspm_i != (logo.get_rows() -1)) { - ctx.translate(0, metrics.pad_middle); - } - } - ctx.restore();//s7 - if (logo.fine_text.length > 0) { - ctx.translate(metrics.summed_width - metrics.pad_right, metrics.summed_height - metrics.pad_bottom); - ctx.font = metrics.fine_txt_font; - ctx.textAlign = "right"; - ctx.fillText(logo.fine_text, 0,0); - } - ctx.restore();//s2 - ctx.restore();//s1 -} - -function create_canvas(c_width, c_height, c_id, c_title, c_display) { - "use strict"; - var canvas = document.createElement("canvas"); - //check for canvas support before attempting anything - if (!canvas.getContext) { - return null; - } - var ctx = canvas.getContext('2d'); - //check for html5 text drawing support - if (!supports_text(ctx)) { - return null; - } - //size the canvas - canvas.width = c_width; - canvas.height = c_height; - canvas.id = c_id; - canvas.title = c_title; - canvas.style.display = c_display; - return canvas; -} - -function logo_1(alphabet, fine_text, pspm) { - "use strict"; - var logo = new Logo(alphabet, fine_text); - logo.add_pspm(pspm); - return logo; -} - -function logo_2(alphabet, fine_text, target, query, query_offset) { - "use strict"; - var logo = new Logo(alphabet, fine_text); - if (query_offset < 0) { - logo.add_pspm(target, -query_offset); - logo.add_pspm(query); - } else { - logo.add_pspm(target); - logo.add_pspm(query, query_offset); - } - return logo; -} - -/* - * Specifies an alternate source for an image. - * If the image with the image_id specified has - * not loaded then a generated logo will be used - * to replace it. - * - * Note that the image must either have dimensions - * or a scale must be set. - */ -function alternate_logo(logo, image_id, scale) { - "use strict"; - var image = document.getElementById(image_id); - if (!image) { - alert("Can't find specified image id (" + image_id + ")"); - return; - } - //if the image has loaded then there is no reason to use the canvas - if (image_ok(image)) { - return; - } - //the image has failed to load so replace it with a canvas if we can. - var canvas = create_canvas(image.width, image.height, image_id, image.title, image.style.display); - if (canvas === null) { - return; - } - //draw the logo on the canvas - draw_logo_on_canvas(logo, canvas, null, scale); - //replace the image with the canvas - image.parentNode.replaceChild(canvas, image); -} - -/* - * Specifes that the element with the specified id - * should be replaced with a generated logo. - */ -function replace_logo(logo, replace_id, scale, title_txt, display_style) { - "use strict"; - var element = document.getElementById(replace_id); - if (!replace_id) { - alert("Can't find specified id (" + replace_id + ")"); - return; - } - //found the element! - var canvas = create_canvas(50, 120, replace_id, title_txt, display_style); - if (canvas === null) { - return; - } - //draw the logo on the canvas - draw_logo_on_canvas(logo, canvas, null, scale); - //replace the element with the canvas - element.parentNode.replaceChild(canvas, element); -} - -/* - * Fast string trimming implementation found at - * http://blog.stevenlevithan.com/archives/faster-trim-javascript - * - * Note that regex is good at removing leading space but - * bad at removing trailing space as it has to first go through - * the whole string. - */ -function trim (str) { - "use strict"; - var ws, i; - str = str.replace(/^\s\s*/, ''); - ws = /\s/; i = str.length; - while (ws.test(str.charAt(--i))); - return str.slice(0, i + 1); -} -</script> - <script> -var current_motif = 0; -var dreme_alphabet = new Alphabet(data.alphabet, data.control_db.freqs); - -/* - * Create a pspm for the given motif data - */ -function motif_pspm(m) { - return new Pspm(m.pwm, m.id, 0, 0, m.nsites, m.evalue); -} - -/* - * Create a count matrix from the given motif data - */ -function motif_count_matrix(motif) { - return motif_pspm(motif).as_count_matrix(); -} - -/* - * Create a probablity matrix from the given motif data - */ -function motif_prob_matrix(motif) { - return motif_pspm(motif).as_probability_matrix(); -} - -/* - * Create a minimal meme format motif from the given motif data - */ -function motif_minimal_meme(motif) { - return motif_pspm(motif).as_meme({ - "with_header": true, - "with_pspm": true, - "with_pssm": false, - "version": data["version"], - "alphabet": dreme_alphabet, - "strands": (data.options.revcomp ? 2 : 1) - }); -} - -/* - * Fill in a template variable - */ -function set_tvar(template, tvar, value) { - var node; - node = find_child(template, tvar); - if (node === null) { - throw new Error("Template does not contain variable " + tvar); - } - node.innerHTML = ""; - if (typeof value !== "object") { - node.appendChild(document.createTextNode(value)); - } else { - node.appendChild(value); - } -} - -/* - * Make a canvas with the motif logo drawn on it. - */ -function make_logo(motif, height, rc) { - var pspm = new Pspm(motif["pwm"]); - if (rc) pspm = pspm.copy().reverse_complement(dreme_alphabet); - var logo = new Logo(dreme_alphabet); - logo.add_pspm(pspm, 0); - var canvas = document.createElement('canvas'); - canvas.height = height; - canvas.width = 0; - draw_logo_on_canvas(logo, canvas, false); - return canvas; -} - -/* - * Create a button designed to contain a single symbol - */ -function make_sym_btn(symbol, title, action) { - var box, sbox; - box = document.createElement("div"); - box.tabIndex = 0; - box.className = "sym_btn"; - sbox = document.createElement("span"); - if (typeof symbol == "string") { - sbox.appendChild(document.createTextNode(symbol)); - } else { - sbox.appendChild(symbol); - } - box.appendChild(sbox); - box.title = title; - box.addEventListener('click', action, false); - box.addEventListener('keydown', action, false); - return box; -} - -/* - * Create a pair of text spans with different classes. - * This is useful when using CSS to only display one of them. - */ -function text_pair(txt1, cls1, txt2, cls2) { - var container, part1, part2; - container = document.createElement("span"); - part1 = document.createElement("span"); - part1.appendChild(document.createTextNode(txt1)); - part1.className = cls1; - container.appendChild(part1); - part2 = document.createElement("span"); - part2.appendChild(document.createTextNode(txt2)); - part2.className = cls2; - container.appendChild(part2); - return container; -} - -/* - * Make a colourised sequence. - */ -function make_seq(seq) { - var i, j, letter, lbox, sbox; - sbox = document.createElement("span"); - for (i = 0; i < seq.length; i = j) { - letter = seq.charAt(i); - for (j = i+1; j < seq.length; j++) { - if (seq.charAt(j) !== letter) { - break; - } - } - lbox = document.createElement("span"); - lbox.style.color = dreme_alphabet.get_colour(dreme_alphabet.get_index(letter)); - lbox.appendChild(document.createTextNode(seq.substring(i, j))); - sbox.appendChild(lbox); - } - return sbox; -} - -/* - * Create a description element taking into account the newlines in the source text. - */ -function make_description(text) { - var i, j, lines, p; - var container = document.createElement("div"); - var paragraphs = text.split(/\n\n+/); - for (i = 0; i < paragraphs.length; i++) { - lines = paragraphs[i].split(/\n/); - p = document.createElement("p"); - p.appendChild(document.createTextNode(lines[0])); - for (j = 1; j < lines.length; j++) { - p.appendChild(document.createElement("br")); - p.appendChild(document.createTextNode(lines[j])); - } - container.appendChild(p); - } - return container; -} - -/* - * Make the table header for the discovered motifs. - */ -function make_motif_header() { - var row = document.createElement("tr"); - add_text_header_cell(row, "", "", "motif_ordinal"); - add_text_header_cell(row, "Motif", "pop_motifs_word", "motif_word"); - add_text_header_cell(row, "Logo", "pop_motifs_logo", "motif_logo"); - if (data.options.revcomp) { - add_text_header_cell(row, "RC Logo", "pop_motifs_rc_logo", "motif_logo"); - } - add_text_header_cell(row, "E-value", "pop_motifs_evalue", "motif_evalue"); - add_text_header_cell(row, "Unerased E-value", "pop_motifs_uevalue", "motif_evalue"); - add_text_header_cell(row, "More", "pop_more", "motif_more"); - add_text_header_cell(row, "Submit/Download", "pop_submit_dl", "motif_submit"); - row.className = "more"; - return row; -} - -/* - * Make a compact motif summary row for the discovered motifs. - */ -function make_motif_row(tbody, ordinal, motif) { - var row = document.createElement("tr"); - add_text_cell(row, "" + ordinal + ".", "motif_ordinal"); - add_text_cell(row, motif["id"], "motif_word"); - add_cell(row, make_logo(motif, 50, false), "motif_logo"); - if (data.options.revcomp) { - add_cell(row, make_logo(motif, 50, true), "motif_logo"); - } - add_text_cell(row, motif["evalue"], "motif_evalue"); - add_text_cell(row, motif["unerased_evalue"], "motif_evalue"); - add_cell(row, make_sym_btn(text_pair("\u21A7", "less", "\u21A5", "more"), "Show more information.", function(e) { toggle_class(tbody, "collapsed"); }, "\u21A5", ""), "motif_more"); - add_cell(row, make_sym_btn("\u21E2", "Submit the motif to another MEME Suite program or download it.", function(e) { action_show_outpop(e, ordinal); }), "motif_submit"); - return row; -} - -/* - * Make a sortable table of enriched matching rows. - */ -function make_motif_words(motif) { - var row, i, match; - var table = document.createElement("table"); - var thead = document.createElement("thead"); - row = document.createElement("tr"); - add_text_header_cell(row, "Word", "pop_match_word", "match_word", function(e) {sort_table(this, compare_words);}); - add_text_header_cell(row, "Positives", "pop_match_pos", "match_count", function(e) {sort_table(this, compare_counts);}); - add_text_header_cell(row, "Negatives", "pop_match_neg", "match_count", function(e) {sort_table(this, compare_counts);}); - add_text_header_cell(row, "P-value", "pop_match_pval", "match_evalue", function(e) {sort_table(this, compare_evalues);}); - add_text_header_cell(row, "E-value", "pop_match_eval", "match_evalue", function(e) {sort_table(this, compare_evalues);}); - thead.appendChild(row); - table.appendChild(thead); - var tbody = document.createElement("tbody"); - for (i = 0; i < motif.matches.length; i++) { - match = motif.matches[i]; - row = document.createElement("tr"); - add_cell(row, make_seq(match.seq), "match_word"); - add_text_cell(row, match.p + " / " + data.sequence_db.count, "match_count"); - add_text_cell(row, match.n + " / " + data.control_db.count, "match_count"); - add_text_cell(row, match.pvalue, "match_evalue"); - add_text_cell(row, match.evalue, "match_evalue"); - tbody.appendChild(row); - } - table.appendChild(tbody); - return table; -} - -/* - * Make an expanded view of a discovered motif. - */ -function make_motif_exp(tbody, ordinal, motif) { - "use strict"; - var box, pspm, logo_box; - box = $("tmpl_motif_expanded").cloneNode(true); - toggle_class(box, "template", false); - box.id = ""; - find_child(box, "tvar_logo").appendChild(make_logo(motif, 150, false)); - if (data.options.revcomp) { - find_child(box, "tvar_rclogo").appendChild(make_logo(motif, 150, true)); - } - set_tvar(box, "tvar_p", motif["p"]); - set_tvar(box, "tvar_p_total", data.sequence_db.count); - set_tvar(box, "tvar_n", motif["n"]); - set_tvar(box, "tvar_n_total", data.control_db.count); - set_tvar(box, "tvar_pvalue", motif["pvalue"]); - set_tvar(box, "tvar_evalue", motif["evalue"]); - set_tvar(box, "tvar_uevalue", motif["unerased_evalue"]); - set_tvar(box, "tvar_words", make_motif_words(motif)); - var cell = document.createElement("td"); - cell.colSpan = 8; - cell.appendChild(box); - var row = document.createElement("tr"); - row.className = "more"; - row.appendChild(cell); - return row; -} - -/* - * Convert a string containing a scientific number into the log of that number - * without having an intermediate representation of the number. - * This is intended to avoid underflow problems with the tiny evalues that - * MEME and DREME can create. - */ -function sci2log(scinum) { - "use strict"; - var ev_re, match, sig, exp; - ev_re = /^(.*)e(.*)$/; - if (match = ev_re.exec(scinum)) { - sig = parseFloat(match[1]); - exp = parseInt(match[2]); - return Math.log(sig) + (exp * Math.log(10)); - } - return 0; -} - -/* - * Create a table of discovered motifs. A fresh table body is used for each - * motif to make hiding/showing rows with css easier. - */ -function make_motifs() { - "use strict"; - var i, row, tbody, motif, ordinal; - // make the motifs table - var container = $("motifs"); - container.innerHTML = ""; // clear content - var table = document.createElement("table"); - // add a header that is always shown - var thead = document.createElement("thead"); - thead.appendChild(make_motif_header()); - table.appendChild(thead); - for (i = 0; i < data.motifs.length; i++) { - ordinal = i + 1; - motif = data.motifs[i]; - tbody = document.createElement("tbody"); - tbody.className = "collapsed"; - tbody.appendChild(make_motif_row(tbody, ordinal, motif)); - tbody.appendChild(make_motif_exp(tbody, ordinal, motif)); - // create a following header for every row except the last one - if ((i + 1) < data.motifs.length) tbody.appendChild(make_motif_header()); - table.appendChild(tbody); - } - container.appendChild(table); -} - -/* - * Create a table showing all the alphabet symbols, their names and frequencies. - */ -function make_alpha_bg(alph, freqs) { - function colour_symbol(index) { - var span = document.createElement("span"); - span.appendChild(document.createTextNode(alph.get_symbol(index))); - span.style.color = alph.get_colour(index); - span.className = "alpha_symbol"; - return span; - } - var table, thead, tbody, row, th, span, i; - // create table - table = document.createElement("table"); - table.className = "inputs"; - // create header - thead = document.createElement("thead"); - table.appendChild(thead); - row = thead.insertRow(thead.rows.length); - if (alph.has_complement()) { - add_text_header_cell(row, "Name", "pop_alph_name"); - add_text_header_cell(row, "Bg.", "pop_alph_control"); - add_text_header_cell(row, ""); - add_text_header_cell(row, ""); - add_text_header_cell(row, ""); - add_text_header_cell(row, "Bg.", "pop_alph_control"); - add_text_header_cell(row, "Name", "pop_alph_name"); - } else { - add_text_header_cell(row, ""); - add_text_header_cell(row, "Name", "pop_alph_name"); - add_text_header_cell(row, "Bg.", "pop_alph_control"); - } - // add alphabet entries - tbody = document.createElement("tbody"); - table.appendChild(tbody); - if (alph.has_complement()) { - for (i = 0; i < alph.get_size_core(); i++) { - var c = alph.get_complement(i); - if (i > c) continue; - row = tbody.insertRow(tbody.rows.length); - add_text_cell(row, alph.get_name(i)); - add_text_cell(row, "" + freqs[i].toFixed(3)); - add_cell(row, colour_symbol(i)); - add_text_cell(row, "~"); - add_cell(row, colour_symbol(c)); - add_text_cell(row, "" + freqs[c].toFixed(3)); - add_text_cell(row, alph.get_name(c)); - } - } else { - for (i = 0; i < alph.get_size_core(); i++) { - row = tbody.insertRow(tbody.rows.length); - add_cell(row, colour_symbol(i)); - add_text_cell(row, alph.get_name(i)); - add_text_cell(row, "" + freqs[i].toFixed(3)); - } - } - return table; -} - -/* - * Updates the format download text in the popup. - * This is called when either the format or current motif changes. - */ -function update_outpop_format(index) { - var motif = data.motifs[index]; - var fn = [motif_count_matrix, motif_prob_matrix, motif_minimal_meme]; - var suffix = ["_counts.txt", "_freqs.txt", ".meme"]; - var format = parseInt($("text_format").value); - var text = fn[format](motif); - prepare_download(text, "text/plain", motif.id + suffix[format], $("outpop_text_dl")); - $("outpop_text").value = text; -} - -/* - * Updates the motif logos and format download text in the popup. - * This is called whenever the current motif changes. - */ -function update_outpop_motif(index) { - "use strict"; - var motifs, motif, pspm, logo, canvas, num; - motifs = data["motifs"]; - if (index < 0 || index >= motifs.length) {return;} - current_motif = index; - motif = motifs[index]; - pspm = new Pspm(motif["pwm"]); - logo = new Logo(dreme_alphabet, ""); - logo.add_pspm(pspm, 0); - canvas = $("outpop_logo"); - canvas.width = canvas.width; // clear canvas - draw_logo_on_canvas(logo, canvas, false); - canvas = $("outpop_logo_rc"); - canvas.width = canvas.width; // clear rc canvas - if (data.options.revcomp) { - pspm.reverse_complement(dreme_alphabet); - logo = new Logo(dreme_alphabet, ""); - logo.add_pspm(pspm, 0); - draw_logo_on_canvas(logo, canvas, false); - } - num = $("outpop_num"); - num.innerHTML = ""; - num.appendChild(document.createTextNode("" + (index + 1))); - update_outpop_format(index); -} - - -/* - * Initialise and display the download popup. - */ -function action_show_outpop(e, ordinal) { - "use strict"; - function init() { - "use strict"; - var close_btn, next_btn, prev_btn, cancel_btn, do_btn; - var tab1, tab2, tab3; - var pnl1, pnl2, pnl3; - var format_list; - var tbl_submit, inputs, i, default_prog; - close_btn = $("outpop_close"); - close_btn.addEventListener("click", action_hide_outpop, false); - close_btn.addEventListener("keydown", action_hide_outpop, false); - next_btn = $("outpop_next"); - next_btn.addEventListener("click", action_outpop_next, false); - next_btn.addEventListener("keydown", action_outpop_next, false); - prev_btn = $("outpop_prev"); - prev_btn.addEventListener("click", action_outpop_prev, false); - prev_btn.addEventListener("keydown", action_outpop_prev, false); - cancel_btn = $("outpop_cancel"); - cancel_btn.addEventListener("click", action_hide_outpop, false); - do_btn = $("outpop_do"); - do_btn.addEventListener("click", action_outpop_submit, false); - tab1 = $("outpop_tab_1"); - tab1.tabIndex = 0; - tab1.addEventListener("click", action_outpop_tab, false); - tab1.addEventListener("keydown", action_outpop_tab, false); - tab2 = $("outpop_tab_2"); - tab2.tabIndex = 0; - tab2.addEventListener("click", action_outpop_tab, false); - tab2.addEventListener("keydown", action_outpop_tab, false); - tab3 = $("outpop_tab_3"); - tab3.tabIndex = 0; - tab3.addEventListener("click", action_outpop_tab, false); - tab3.addEventListener("keydown", action_outpop_tab, false); - pnl1 = $("outpop_pnl_1"); - pnl2 = $("outpop_pnl_2"); - pnl3 = $("outpop_pnl_3"); - toggle_class(tab1, "activeTab", true); - toggle_class(tab2, "activeTab", false); - toggle_class(tab3, "activeTab", false); - pnl1.style.display = "block"; - pnl2.style.display = "none"; - pnl3.style.display = "none"; - format_list = $("text_format"); - format_list.addEventListener("change", action_outpop_format, false); - // setup program selection - tbl_submit = $("programs"); - // when not dna, hide the inputs for programs that require dna motifs - toggle_class(tbl_submit, "alphabet_dna", dreme_alphabet.has_complement());//TODO FIXME alphabet_dna is a bad name for a field when allowing custom alphabets - // add a click listener for the radio buttons - inputs = tbl_submit.querySelectorAll("input[type='radio']"); - for (i = 0; i < inputs.length; i++) { - inputs[i].addEventListener("click", action_outpop_program, false); - } - // ensure that a default program option is selected for DNA and Protein - default_prog = document.getElementById(dreme_alphabet.has_complement() ? "submit_tomtom" : "submit_fimo"); - default_prog.checked = true; - action_outpop_program.call(default_prog); - // disable reverse-complement when not DNA - $("logo_rc_option").disabled = !dreme_alphabet.has_complement(); - // set errorbars on when ssc is on - $("logo_ssc").addEventListener("change", action_outpop_ssc, false); - } - // store the focused element - action_hide_outpop.last_active = document.activeElement; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - // hide the help popup - help_popup(); - // on first load initilize the popup - if (!action_show_outpop.ready) { - init(); - action_show_outpop.ready = true; - } - update_outpop_motif(ordinal - 1); - // display the download popup - $("grey_out_page").style.display = "block"; - $("download").style.display = "block"; - $("outpop_close").focus(); -} - -/* - * Hide the download popup. - */ -function action_hide_outpop(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - $("download").style.display = "none"; - $("grey_out_page").style.display = "none"; - if (typeof action_hide_outpop.last_active !== "undefined") { - action_hide_outpop.last_active.focus(); - } -} - -/* - * Show the next motif in the download popup. - */ -function action_outpop_next(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - update_outpop_motif(current_motif + 1); -} - -/* - * Show the previous motif in the download popup. - */ -function action_outpop_prev(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - update_outpop_motif(current_motif - 1); -} - -/* - * Highlight the selected row in the program list. - */ -function action_outpop_program() { - "use strict"; - var table, tr, rows, i; - tr = find_parent_tag(this, "TR"); - table = find_parent_tag(tr, "TABLE"); - rows = table.querySelectorAll("tr"); - for (i = 0; i < rows.length; i++) { - toggle_class(rows[i], "selected", rows[i] === tr); - } -} - -/* - * Enable error bars when small sample correction is enabled. - */ -function action_outpop_ssc() { - "use strict"; - $("logo_err").value = $("logo_ssc").value; -} - -/* - * Submit the motif to the selected program. - */ -function action_outpop_submit(e) { - "use strict"; - var form, input, program, motifs; - // find out which program is selected - var radios, i; - radios = document.getElementsByName("program"); - program = "fimo"; // default to fimo, since it works with all alphabet types - for (i = 0; i < radios.length; i++) { - if (radios[i].checked) program = radios[i].value; - } - - motifs = motif_minimal_meme(data.motifs[current_motif]); - form = document.createElement("form"); - form.setAttribute("method", "post"); - form.setAttribute("action", site_url + "/tools/" + program); - - input = document.createElement("input"); - input.setAttribute("type", "hidden"); - input.setAttribute("name", "motifs_embed"); - input.setAttribute("value", motifs); - form.appendChild(input); - - document.body.appendChild(form); - form.submit(); - document.body.removeChild(form); -} - -/* - * Download the format text. - * Wire the link containing the data URI text to a download button so it looks - * the same as the server submit stuff. - */ -function action_outpop_download_motif(e) { - $("outpop_text_dl").click(); -} - -/* - * Download the motif logo. - * The EPS format can be calculated locally in Javascript - */ -function action_outpop_download_logo(e) { - "use strict"; - var pspm, logo, eps; - var logo_rc, logo_ssc, logo_width, logo_height; - var motif = data.motifs[current_motif]; - if ($("logo_format").value == "0") { // EPS - logo_rc = ($("logo_rc").value == "1"); - logo_ssc = ($("logo_ssc").value == "1"); - logo_width = parseFloat($("logo_width").value); - if (isNaN(logo_width) || !isFinite(logo_width) || logo_width <= 0) logo_width = null; - logo_height = parseFloat($("logo_height").value); - if (isNaN(logo_height) || !isFinite(logo_height) || logo_height <= 0) logo_height = null; - // create a PSPM from the motif - pspm = motif_pspm(motif); - if (logo_rc) pspm.reverse_complement(dreme_alphabet); - logo = new Logo(dreme_alphabet); - logo.add_pspm(pspm, 0); - eps = logo.as_eps({"ssc": logo_ssc, "logo_width": logo_width, "logo_height": logo_height}); - prepare_download(eps, "application/postscript", motif.id + ".eps"); - } else { - $("logo_motifs").value = motif_minimal_meme(motif); - $("logo_form").submit(); - } -} - -/* - * Change the selected tab in the download popup. - */ -function action_outpop_tab(e) { - "use strict"; - var tab1, tab2, tab3, pnl1, pnl2, pnl3, do_btn; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - tab1 = $("outpop_tab_1"); - tab2 = $("outpop_tab_2"); - tab3 = $("outpop_tab_3"); - pnl1 = $("outpop_pnl_1"); - pnl2 = $("outpop_pnl_2"); - pnl3 = $("outpop_pnl_3"); - do_btn = $("outpop_do"); - - toggle_class(tab1, "activeTab", (this === tab1)); - toggle_class(tab2, "activeTab", (this === tab2)); - toggle_class(tab3, "activeTab", (this === tab3)); - pnl1.style.display = ((this === tab1) ? "block" : "none"); - pnl2.style.display = ((this === tab2) ? "block" : "none"); - pnl3.style.display = ((this === tab3) ? "block" : "none"); - do_btn.value = ((this === tab1) ? "Submit" : "Download"); - do_btn.removeEventListener("click", action_outpop_submit, false); - do_btn.removeEventListener("click", action_outpop_download_logo, false); - do_btn.removeEventListener("click", action_outpop_download_motif, false); - if (this === tab1) { - do_btn.addEventListener("click", action_outpop_submit, false); - } else if (this === tab2) { - do_btn.addEventListener("click", action_outpop_download_motif, false); - } else { - do_btn.addEventListener("click", action_outpop_download_logo, false); - } -} - -/* - * Update the text in the download format popup. - */ -function action_outpop_format() { - update_outpop_format(current_motif); -} - -/* - * Find all text nodes in the given container. - */ -function text_nodes(container) { - var textNodes = []; - var stack = [container]; - // depth first search to maintain ordering when flattened - while (stack.length > 0) { - var node = stack.pop(); - if (node.nodeType == Node.TEXT_NODE) { - textNodes.push(node); - } else { - for (var i = node.childNodes.length-1; i >= 0; i--) { - stack.push(node.childNodes[i]); - } - } - } - return textNodes; -} - -/* - * Get the text out of a specific text node. - */ -function node_text(node) { - if (node === undefined) { - return ''; - } else if (node.textContent) { - return node.textContent; - } else if (node.innerText) { - return node.innerText; - } else { - return ''; - } -} - -/* - * Get the text contained within the element. - */ -function elem_text(elem, separator) { - if (separator === undefined) separator = ''; - return text_nodes(elem).map(node_text).join(separator); -} - -/* - * Sort all rows in the first table body based on the column of the given element and the comparison function. - * The sort is not very fast and is intended for small tables only. - */ -function sort_table(colEle, compare_function) { - //find the parent of colEle that is either a td or th - var i, j; - var cell = colEle; - while (true) { - if (cell == null) return; - if (cell.nodeType == Node.ELEMENT_NODE && - (cell.tagName.toLowerCase() == "td" || cell.tagName.toLowerCase() == "th")) { - break; - } - cell = cell.parentNode; - } - //find the parent of cell that is a tr - var row = cell; - while (true) { - if (row == null) return; - if (row.nodeType == Node.ELEMENT_NODE && row.tagName.toLowerCase() == "tr") { - break; - } - row = row.parentNode; - } - //find the parent of row that is a table - var table = row; - while (true) { - if (table == null) return; - if (table.nodeType == Node.ELEMENT_NODE && table.tagName.toLowerCase() == "table") { - break; - } - table = table.parentNode; - } - var column_index = cell.cellIndex; - // do a bubble sort, because the tables are so small it doesn't matter - var change; - var trs = table.tBodies[0].getElementsByTagName('tr'); - var already_sorted = true; - var reverse = false; - while (true) { - do { - change = false; - for (i = 0; i < trs.length -1; i++) { - var v1 = elem_text(trs[i].cells[column_index]); - var v2 = elem_text(trs[i+1].cells[column_index]); - if (reverse) { - var tmp = v1; - v1 = v2; - v2 = tmp; - } - if (compare_function(v1, v2) > 0) { - exchange(trs[i], trs[i+1], table); - change = true; - already_sorted = false; - trs = table.tBodies[0].getElementsByTagName('tr'); - } - } - } while (change); - if (reverse) break;// we've sorted twice so exit - if (!already_sorted) break;// sort did something so exit - // when it's sorted one way already then sort the opposite way - reverse = true; - } - // put arrows on the headers - var headers = table.tHead.getElementsByTagName('tr'); - for (i = 0; i < headers.length; i++) { - for (j = 0; j < headers[i].cells.length; j++) { - var cell = headers[i].cells[j]; - var arrows = cell.getElementsByClassName("sort_arrow"); - var arrow; - if (arrows.length == 0) { - arrow = document.createElement("span"); - arrow.className = "sort_arrow"; - cell.insertBefore(arrow, cell.firstChild); - } else { - arrow = arrows[0]; - } - arrow.innerHTML = ""; - if (j == column_index) { - arrow.appendChild(document.createTextNode(reverse ? "\u25B2" : "\u25BC")); - } - } - } -} - -/* - * Swap two rows in a table. - */ -function exchange(oRowI, oRowJ, oTable) { - var i = oRowI.rowIndex; - var j = oRowJ.rowIndex; - if (i == j+1) { - oTable.tBodies[0].insertBefore(oRowI, oRowJ); - } if (j == i+1) { - oTable.tBodies[0].insertBefore(oRowJ, oRowI); - } else { - var tmpNode = oTable.tBodies[0].replaceChild(oRowI, oRowJ); - if(typeof(oRowI) != "undefined") { - oTable.tBodies[0].insertBefore(tmpNode, oRowI); - } else { - oTable.appendChild(tmpNode); - } - } -} - -/* - * Compare two E-values which may be very small. - */ -function compare_evalues(v1, v2) { - var e1 = sci2log(v1); - var e2 = sci2log(v2); - if (e1 < e2) return -1; - else if (e1 > e2) return 1; - return 0; -} - -/* - * Compare two counts. - */ -function compare_counts(v1, v2) { - var re = /(\d+)\s*\/\s*\d+/; - var m1 = re.exec(v1); - var m2 = re.exec(v2); - if (m1 == null && m2 == null) return 0; - if (m1 == null) return -1; - if (m2 == null) return 1; - return parseInt(m2[1]) - parseInt(m1[1]); -} - -/* - * Compare two sequence words. - */ -function compare_words(v1, v2) { - return v1.localeCompare(v2); -} - - -</script> - <style> -/* The following is the content of meme.css */ -body { background-color:white; font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif;} - -div.help { - display: inline-block; - margin: 0px; - padding: 0px; - width: 12px; - height: 13px; - cursor: pointer; - background-image: url(data:image/gif;base64,R0lGODlhDAANAIABANR0AP///yH5BAEAAAEALAAAAAAMAA0AAAIdhI8Xy22MIFgv1DttrrJ7mlGNNo4c+aFg6SQuUAAAOw==); -} - -div.help:hover { - background-image: url(data:image/gif;base64,R0lGODlhDAANAKEAANR0AP///9R0ANR0ACH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEAAAIALAAAAAAMAA0AAAIdDGynCe3PgoxONntvwqz2/z2K2ImjR0KhmSIZUgAAOw==); -} - -p.spaced { line-height: 1.8em;} - -span.citation { font-family: "Book Antiqua", "Palatino Linotype", serif; color: #004a4d;} - -p.pad { padding-left: 30px; padding-top: 5px; padding-bottom: 10px;} - -td.jump { font-size: 13px; color: #ffffff; background-color: #00666a; - font-family: Georgia, "Times New Roman", Times, serif;} - -a.jump { margin: 15px 0 0; font-style: normal; font-variant: small-caps; - font-weight: bolder; font-family: Georgia, "Times New Roman", Times, serif;} - -h2.mainh {font-size: 1.5em; font-style: normal; margin: 15px 0 0; - font-variant: small-caps; font-family: Georgia, "Times New Roman", Times, serif;} - -h2.line {border-bottom: 1px solid #CCCCCC; font-size: 1.5em; font-style: normal; - margin: 15px 0 0; padding-bottom: 3px; font-variant: small-caps; - font-family: Georgia, "Times New Roman", Times, serif;} - -h4 {border-bottom: 1px solid #CCCCCC; font-size: 1.2em; font-style: normal; - margin: 10px 0 0; padding-bottom: 3px; font-family: Georgia, "Times New Roman", Times, serif;} - -h5 {margin: 0px} - -a.help { font-size: 9px; font-style: normal; text-transform: uppercase; - font-family: Georgia, "Times New Roman", Times, serif;} - -div.pad { padding-left: 30px; padding-top: 5px; padding-bottom: 10px;} - -div.pad1 { margin: 10px 5px;} - -div.pad2 { margin: 25px 5px 5px;} -h2.pad2 { padding: 25px 5px 5px;} - -div.pad3 { padding: 5px 0px 10px 30px;} - -div.box { border: 2px solid #CCCCCC; padding:10px; overflow: hidden;} - -div.bar { border-left: 7px solid #00666a; padding:5px; margin-top:25px; } - -div.subsection {margin:25px 0px;} - -img {border:0px none;} - -th.majorth {text-align:left;} -th.minorth {font-weight:normal; text-align:left; width:8em; padding: 3px 0px;} -th.actionth {font-weight:normal; text-align:left;} - -.explain h5 {font-size:1em; margin-left: 1em;} - -div.doc {margin-left: 2em; margin-bottom: 3em;} - -th.trainingset { - border-bottom: thin dashed black; - font-weight:normal; - padding:0px 10px; -} -div.pop_content { - position:absolute; - z-index:50; - width:300px; - padding: 5px; - background: #E4ECEC; - font-size: 12px; - font-family: Arial; - border-style: double; - border-width: 3px; - border-color: #AA2244; - display:none; -} - -div.pop_content > *:first-child { - margin-top: 0px; -} - -div.pop_content h1, div.pop_content h2, div.pop_content h3, div.pop_content h4, -div.pop_content h5, div.pop_content h6, div.pop_content p { - margin: 0px; -} - -div.pop_content p + h1, div.pop_content p + h2, div.pop_content p + h3, -div.pop_content p + h4, div.pop_content p + h5, div.pop_content p + h6 { - margin-top: 5px; -} - -div.pop_content p + p { - margin-top: 5px; -} - -div.pop_content > *:last-child { - margin-bottom: 0px; -} - -div.pop_content div.pop_close { - /* old definition */ - float:right; - bottom: 0; -} - -div.pop_content span.pop_close, div.pop_content span.pop_back { - display: inline-block; - border: 2px outset #661429; - background-color: #CCC; - padding-left: 1px; - padding-right: 1px; - padding-top: 0px; - padding-bottom: 0px; - cursor: pointer; - color: #AA2244; /*#661429;*/ - font-weight: bold; -} - -div.pop_content span.pop_close:active, div.pop_content span.pop_back:active { - border-style: inset; -} - -div.pop_content span.pop_close { - float:right; - /*border: 2px outset #AA002B;*/ - /*color: #AA2244;*/ -} - -div.pop_content:not(.nested) .nested_only { - display: none; -} - -div.pop_back_sec { - margin-bottom: 5px; -} - -div.pop_close_sec { - margin-top: 5px; -} - -table.hide_advanced tr.advanced { - display: none; -} -span.show_more { - display: none; -} -table.hide_advanced span.show_more { - display: inline; -} -table.hide_advanced span.show_less { - display: none; -} - - -/***************************************************************************** - * Program logo styling - ****************************************************************************/ -div.prog_logo { - border-bottom: 0.25em solid #0f5f60; - height: 4.5em; - width: 24em; - display:inline-block; -} -div.prog_logo img { - float:left; - width: 4em; - border-style: none; - margin-right: 0.2em; -} -div.prog_logo h1, div.prog_logo h1:hover, div.prog_logo h1:active, div.prog_logo h1:visited { - margin:0; - padding:0; - font-family: Arial, Helvetica, sans-serif; - font-size: 3.2em; - line-height: 1em; - vertical-align: top; - display: block; - color: #026666; - letter-spacing: -0.06em; - text-shadow: 0.04em 0.06em 0.05em #666; -} -div.prog_logo h2, div.prog_logo h2:hover, div.prog_logo h2:active, div.prog_logo h2:visited { - display: block; - margin:0; - padding:0; - font-family: Helvetica, sans-serif; - font-size: 0.9em; - line-height: 1em; - letter-spacing: -0.06em; - color: black; -} - -div.big.prog_logo { - font-size: 18px; -} - -</style> - <style> /* dreme output specific css */ -div.header { - position: relative; - overflow: hidden; - margin-top: 15px; - margin-bottom: 5px; - margin-right: 3px; - margin-left: 3px; -} -div.header > h2 { - font-size: 1.5em; - font-style: normal; - margin: 0; - font-variant: small-caps; - font-family: Georgia, "Times New Roman", Times, serif; -} -div.header > span { - position: absolute; - right: 0; - bottom: 0; -} - -div.template { - position: absolute; - z-index: 1; - left: 0; - top: 0; - visibility: hidden; -} - -div.sym_btn { - display:inline-block; - text-decoration: underline; - cursor: pointer; - font-size: 20px; - line-height:20px; - text-align: center; - width: 20px; - height: 20px; - color: blue; -} -div.sym_btn:hover { - color: white; - background-color: blue; -} - -div.sym_btn.positioned { - position: absolute; - top: 0px; -} - -div.box + div.box { - margin-top: 5px; -} - -th.motif_ordinal { - -} -td.motif_ordinal { - text-align: right; - padding-right: 10px; - font-weight: bold; - font-size: large; -} -th.motif_word { - padding-right: 10px; -} -td.motif_word { - font-size:15px; - font-family: 'Courier New', Courier, monospace; - padding-right: 10px; -} -th.motif_logo { - padding-right: 10px; -} -td.motif_logo { - padding-right: 10px; -} -th.motif_evalue { - text-align:right; - padding-right: 10px; -} -td.motif_evalue { - text-align: right; - white-space: nowrap; - padding-right: 20px; -} -th.motif_more { - padding: 0 5px; -} -td.motif_more { - text-align: center; - padding: 0 5px; -} -th.motif_submit { - padding: 0 5px; -} -td.motif_submit { - text-align: center; - padding: 0 5px; -} -th.match_word { - padding-right: 10px; -} -td.match_word { - padding-right: 10px; - font-weight: bold; - font-size: large; - font-family: 'Courier New', Courier, monospace; -} -th.match_evalue, th.match_count { - text-align: right; - padding-right: 10px; -} -td.match_evalue, td.match_count { - text-align: right; - white-space: nowrap; - padding-right: 20px; -} - -div.tabArea { - font-size: 80%; - font-weight: bold; -} - -.norc div.tabArea { - display: none; -} - -span.tab, span.tab:visited { - cursor: pointer; - color: #888; - background-color: #ddd; - border: 2px solid #ccc; - padding: 2px 1em; - text-decoration: none; -} -span.tab.middle { - border-left-width: 0px; -} -div.tabArea.base span.tab { - border-top-width: 0px; -} -div.tabArea.top span.tab { - border-bottom-width: 0px; -} - -span.tab:hover { - background-color: #bbb; - border-color: #bbb; - color: #666; -} -span.tab.activeTab, span.tab.activeTab:hover, span.tab.activeTab:visited { - background-color: white; - color: black; - cursor: default; -} -div.tabMain { - border: 2px solid #ccc; - background-color: white; - padding: 10px; -} -div.tabMain.base { - margin-top: 5px; - display: inline-block; - max-width: 98%; -} - -div.tabMain.top { - margin-bottom: 5px; -} - -div.grey_background { - position:fixed; - z-index: 8; - background-color: #000; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; - opacity: 0.5; - left: 0; - top: 0; - width: 100%; - height: 100%; -} - -div.popup_wrapper { - position:fixed; - z-index:9; - width:100%; - height:0; - top:50%; - left:0; -} - -div.popup { - width: 600px; - z-index:9; - margin-left: auto; - margin-right: auto; - padding: 5px; - background-color: #FFF; - border-style: double; - border-width: 5px; - border-color: #00666a; - position:relative; -} -div.close { - cursor: pointer; - border: 1px solid black; - width:15px; - height:15px; - line-height:15px; /* this causes vertical centering */ - text-align:center; - background-color:#FFF; - color:#000; - font-size:15px; - font-family:monospace; -} - -div.close:hover { - color:#FFF; - background-color:#000; -} - -div.navnum { - width:100%; - height:20px; - line-height:20px; - text-align:center; - font-size:medium; -} - -div.navarrow { - font-size: 30px; - text-decoration:none; - cursor: pointer; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; -} - -div.navarrow > span.inactive { - display: inline; -} -div.navarrow > span.active { - display: none; -} - -div.navarrow:hover > span.active { - display: inline; -} -div.navarrow:hover > span.inactive { - display: none; -} - -table.programs { - width: 100%; -} - -table.programs tr { - background-color: #EFE; -} - -table.programs tr.selected { - background-color: #262; - color: #FFF; -} - -table.programs tr.dna_only { - display: none; -} - -table.programs.alphabet_dna tr.dna_only { - display: table-row; -} - -table.inputs { - margin-top: 20px; - border-collapse:collapse; -} -table.inputs * td, table.inputs * th { - padding-left: 15px; - padding-right: 15px; - padding-top: 1px; - padding-bottom: 1px; -} - /* program settings */ -span.strand_none, span.strand_given, span.strand_both { - display: none; -} -td.none span.strand_none, td.given span.strand_given, td.both span.strand_both { - display: inline; -} - -/* show the expanded motif only when the collapsed one is hidden */ -tbody *.less, tbody.collapsed *.more { - display: none; -} - -tbody.collapsed *.less { - display: inline; -} - </style> </head> <body data-scrollpad="true"> - <!-- --> - <div id="grey_out_page" class="grey_background" style="display:none;"> - </div> - - <!-- Help popups --> - <div class="pop_content" id="pop_"> - <p>Help poup.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_motifs_word"> - <p> The name of the motif uses the IUPAC codes for nucleotides which has a different letter to represent each of the 15 possible combinations. - </p> - <p> The name is itself a representation of the motif though the position - weight matrix is not directly equalivant as it is generated from the + weight matrix is not directly equivalent as it is generated from the sites found that matched the letters given in the name. - </p> - <p> - <a id="doc_alphabets_url" href="#"> - Read more about the MEME suite's use of the IUPAC alphabets. - </a> - <script>$("doc_alphabets_url").href = site_url + "/doc/alphabets.html";</script> - </p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motifs_logo"> - <p>The logo of the motif.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motifs_rc_logo"> - <p>The logo of the reverse complement motif.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motifs_evalue"> <p>The E-value is the enrichment p-value times the number of candidate motifs tested.</p> <p>The enrichment p-value is calculated using Fisher's Exact Test for enrichment of the motif in the positive sequences.</p> <p>Note that the counts used in Fisher's Exact Test are made after erasing sites that match previously found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motifs_uevalue"> <p>The E-value of the motif calculated without erasing the sites of previously found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_more"> <p>Show more information on the motif.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_submit_dl"> <p>Submit your motif to another MEME Suite program or download your motif.</p> <h5>Supported Programs</h5> - <dl> <dt>Tomtom</dt> <dd>Tomtom is a tool for searching for similar known motifs. - </dd> <dt>MAST</dt> <dd>MAST is a tool for searching biological sequence databases for sequences that contain one or more of a group of known motifs. - </dd> <dt>FIMO</dt> <dd>FIMO is a tool for searching biological sequence databases for sequences that contain one or more known motifs. - </dd> - <dt>GOMO</dt> - <dd>GOMO is a tool for identifying possible roles (Gene Ontology + <dt>GOMo</dt> + <dd>GOMo is a tool for identifying possible roles (Gene Ontology terms) for DNA binding motifs. - </dd> <dt>SpaMo</dt> <dd>SpaMo is a tool for inferring possible transcription factor complexes by finding motifs with enriched spacings. - </dd> - </dl> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motif_positives"> - <p># positive sequences matching the motif / # positive sequences.</p> - <p>Note these counts are made after erasing sites that match previously - found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motif_negatives"> - <p># negative sequences matching the motif / # negative sequences.</p> - <p>Note these counts are made after erasing sites that match previously - found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motif_pvalue"> - <p>The p-value of Fisher's Exact Test for enrichment of the motif in - the positive sequences.</p> - <p>Note that the counts used in Fisher's Exact Test are made after - erasing sites that match previously found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motif_evalue"> - <p>The E-value is the motif p-value times the number of candidate motifs - tested.</p> - <p>Note that the p-value was calculated with counts made after - erasing sites that match previously found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motif_uevalue"> - <p>The E-value of the motif calculated without erasing the sites of - previously found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_match_word"> - <p>All words matching the motif whose uncorrected p-value is less than - <span id="help_add_pv_thresh"></span>.</p> - <script>$("help_add_pv_thresh").innerHTML = data.options.add_pv_thresh;</script> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_match_pos"> - <p># positive sequences with matches to the word / # positive sequences.</p> - <p>Note these counts are made after erasing sites that match previously - found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_match_neg"> - <p># negative sequences with matches to the word / # negative sequences.</p> - <p>Note these counts are made after erasing sites that match previously - found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_match_pval"> - <p>The p-value of Fisher's Exact Test for enrichment of the word in - the positive sequences.</p> - <p>Note that the counts used in Fisher's Exact Test are made after - erasing sites that match previously found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_match_eval"> - <p>The word p-value times the number of candidates tested.</p> - <p>Note that the p-value was calculated with counts made after - erasing sites that match previously found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_seq_source"> - <p>The sequence file used by DREME to find the motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_seq_alph"> - <p>The alphabet of the sequences.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_seq_count"> - <p>The count of the sequences.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_alph_name"> - <p>The name of the alphabet symbol.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_alph_control"> - <p>The frequency of the alphabet symbol in the control dataset.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - - <!-- templates --> - - <div class="template box expanded_motif" id="tmpl_motif_expanded"> - <div> - <span class="tvar_logo"></span> - <span class="tvar_rclogo"></span> - </div> - <h4>Details</h4> - <table class="details"> - <thead> - <tr> - <th class="match_count">Positives <div class="help" data-topic="pop_motif_positives"></div></th> - <th class="match_count">Negatives <div class="help" data-topic="pop_motif_negatives"></div></th> - <th class="match_evalue">P-value <div class="help" data-topic="pop_motif_pvalue"></div></th> - <th class="match_evalue">E-value <div class="help" data-topic="pop_motif_evalue"></div></th> - <th class="match_evalue">Unerased E-value <div class="help" data-topic="pop_motif_uevalue"></div></th> - </tr> - </thead> - <tbody> - <tr> - <td class="match_count"> - <span class="tvar_p"></span> / <span class="tvar_p_total"></span> - </td> - <td class="match_count"> - <span class="tvar_n"></span> / <span class="tvar_n_total"></span> - </td> - <td class="tvar_pvalue match_evalue"></td> - <td class="tvar_evalue match_evalue"></td> - <td class="tvar_uevalue match_evalue"></td> - </tr> - </tbody> - </table> - <h4>Enriched Matching Words</h4> - <div class="tvar_words"></div> - </div> - - - <div class="popup_wrapper"> - <div class="popup" style="display:none; top: -150px;" id="download"> - <div> - <div style="float:right; "> - <div id="outpop_close" class="close" tabindex="0">x</div> - </div> - <h2 class="mainh" style="margin:0; padding:0;">Submit or Download</h2> - <div style="clear:both"></div> - </div> - <div style="height:100px"> - <div style="float:right; width: 30px;"> - <div id="outpop_prev" class="navarrow" tabindex="0"> - <span class="inactive">⇧</span><span class="active">⬆</span> - </div> - <div id="outpop_num" class="navnum"></div> - <div id="outpop_next" class="navarrow" tabindex="0"> - <span class="inactive">⇩</span><span class="active">⬇</span> - </div> - </div> - <div id="logo_box" style="height: 100px; margin-right: 40px;"> - <canvas id="outpop_logo" height="100" width="250"></canvas> - <canvas id="outpop_logo_rc" height="100" width="250"></canvas> - </div> - </div> - <div> - <!-- tabs start --> - <div class="tabArea top"> - <span id="outpop_tab_1" class="tab">Submit Motif</span><span - id="outpop_tab_2" class="tab middle">Download Motif</span><span - id="outpop_tab_3" class="tab middle">Download Logo</span> - </div> - <div class="tabMain top"> - <!-- Submit to another program --> - <div id="outpop_pnl_1"> - <h4 class="compact">Submit to program</h4> - <table id="programs" class="programs"> - <tr class="dna_only"> - <td><input type="radio" name="program" value="tomtom" id="submit_tomtom"></td> - <td><label for="submit_tomtom">Tomtom</label></td> - <td><label for="submit_tomtom">Find similar motifs in - published libraries or a library you supply.</label></td> - </tr> - <tr> - <td><input type="radio" name="program" value="fimo" id="submit_fimo"></td> - <td><label for="submit_fimo">FIMO</label></td> - <td><label for="submit_fimo">Find motif occurrences in - sequence data.</label></td> - </tr> - <tr> - <td><input type="radio" name="program" value="mast" id="submit_mast"></td> - <td><label for="submit_mast">MAST</label></td> - <td><label for="submit_mast">Rank sequences by affinity to - groups of motifs.</label></td> - </tr> - <tr class="dna_only"> - <td><input type="radio" name="program" value="gomo" id="submit_gomo"></td> - <td><label for="submit_gomo">GOMo</label></td> - <td><label for="submit_gomo">Identify possible roles (Gene - Ontology terms) for motifs.</label></td> - </tr> - <tr class="dna_only"> - <td><input type="radio" name="program" value="spamo" id="submit_spamo"></td> - <td><label for="submit_spamo">SpaMo</label></td> - <td><label for="submit_spamo">Find other motifs that are - enriched at specific close spacings which might imply the existance of a complex.</label></td> - </tr> - </table> - </div> - <!-- download text format --> - <div id="outpop_pnl_2"> - <div> - <label for="text_format">Format:</label> - <select id="text_format"> - <option value="0">Count Matrix</option> - <option value="1">Probability Matrix</option> - <option value="2">Minimal MEME</option> - </select> - </div> - <textarea id="outpop_text" name="content" - style="width:99%; white-space: pre; word-wrap: normal; overflow-x: scroll;" - rows="8" readonly="readonly" wrap="off"></textarea> - <a id="outpop_text_dl" download="meme.txt" href=""></a> - </div> - <!-- download logo format --> - <div id="outpop_pnl_3"> - <form id="logo_form" method="post" action=""> - <script>$("logo_form").action = site_url + "/utilities/generate_logo";</script> - <input type="hidden" name="program" value="DREME"/> - <input type="hidden" id="logo_motifs" name="motifs" value=""/> - <table> - <tr> - <td><label for="logo_format">Format:</label></td> - <td> - <select id="logo_format" name="png"> - <option value="1">PNG (for web)</option> - <option value="0">EPS (for publication)</option> - </select> - </td> - </tr> - <tr> - <td><label for="logo_rc">Orientation:</label></td> - <td> - <select id="logo_rc" name="rc1"> - <option value="0">Normal</option> - <option value="1" id="logo_rc_option">Reverse Complement</option> - </select> - </td> - </tr> - <tr> - <td><label for="logo_ssc">Small Sample Correction:</label></td> - <td> - <input type="hidden" id="logo_err" name="errbars" value="0"/> - <select id="logo_ssc" name="ssc"> - <option value="0">Off</option> - <option value="1">On</option> - </select> - </td> - </tr> - <tr> - <td><label for="logo_width">Width:</label></td> - <td> - <input type="text" id="logo_width" size="4" placeholder="default" name="width"/> cm - </td> - </tr> - <tr> - <td><label for="logo_height">Height:</label></td> - <td> - <input type="text" id="logo_height" size="4" placeholder="default" name="height"/> cm - </td> - </tr> - </table> - </form> - </div> - <!-- Buttons --> - <div> - <div style="float:left;"> - <input type="button" id="outpop_do" value="Submit" /> - </div> - <div style="float:right;"> - <input id="outpop_cancel" type="button" value="Cancel" /> - </div> - <div style="clear:both;"></div> - </div> - </div> - </div> - </div> - </div> - - - - <!-- Page starts here --> - <div id="top" class="pad1"> - <div class="prog_logo big"> - <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAAAd0SU1FB9wLGwYBMoyhiwgAACAASURBVHja7Z13fFRV9sC/503JpIeaKFVREBQVEEFFQVcUuyDouuraFoVV17IrayPjDP4U3XXXhrpiXxuKKF1dV8WCiEgXRUAQlJIYAilMf+f3x3szmVSSkICyOR/eh8wr9717z7mn3XPOhRZogRbYLQiQJiJGy1D8D0LHjh1/XrZsmQK9gU3Ap0mE0QL7KTx411136Z///GdV1ZhpmvrYY4+pqsZUVceNG6dAz5Zh2j/hnpKSEtM0TVVVrfq/qmosFtMxY8Yo8CPQHejucDjyfm0dbZFp1WGaxmJ3ppSWSiQUIhQKIWJxehGhpKSE1LQ0uvfowQHZ2exYt65D8dq1qzUaXR2LxTYCP7UM4a8MVFWA9mY0+nLhmjV63LHH6vMvvKATJkzQfn366CtPPKEDjjtOV61apeeedZZqMKgaCKju2KFmYaFqJKJaWqqqqoACR/9a+u5sQT+IiD77zDPbKCnR00aOZPHSpcydO5fLf/972rdvTzgcZsEnnzDmqquYPmsW/PxzxbMOB4NPOokRZ5+tB3XrJsAUYKmqOkQkVuVVKUBGDRbGz/vSvPlfBHcVDpB7XP/+Gz9/5x1mzJ/P1i1buPbaa1m/fj1du3alW5curPvqqxobCoVCpKSkIO3a1Wc89bCuBy51OZwu1RgiBqGYGf1uw09/Bd5t4QDNT+wKfPXoxIl9jzm6gkt/OmsWn3/4oRIMyrfLlzPuzjvp27cvHTt2ZNGXX+K/7baaW8zJITM1lflz5wL8ZtWqVWm9evXaVcv7Q2cN6hM68tAuR2MIhirFpUEef+MdBFK1RQQ0v6g/MC9PLxk5Uq+/7joIBECSJmwwKKqKR4RTTjyR0885h2effZaNa9Ywa9YstKQkoQzGwSwuJhwIwK5ddO3a9b+9evWqjQPoSf16qUOQles2gYLL5WDaBwu5dtSw8L/eeKdFB2huaJWTo0NOOMF8wOs1qiG/QhfghtGj+dMNN4DblhJlZVBaWg35AIYI7NgBbjcbNmwwjz766I+WLl16OfCDfUs3YB3AAdke6d7tYNR2Jv6wuZA2rbIwxbFPxfD/jBn4t7vv5uUnnzRsTNelEEIoBKWl1qH1YM7hMAXffWcsWbBgMLAB+AgoAtYC5SJCp86dUTPG89M/ACASi1mDH4u2+AH2Bvzhpps+p3Xrmi+mp2Oa5h613y4nh1WLFuHxeHTq1KmDVbWVqjJjxozU4cOH88rsj1FXKteMOh3D4eQ/ny/hjnwfn32zyWUYxtAWK6D54YW1X355WbcePSr32elk1EUX8cYbb1gzvvG+BEzA2b49msQ1RARVZe7cuTzzjwl079qB6R8s4PhThjF58mQADjroIDZs2CAtBLAXFMEaTwaDe4R8ALKzEbcbVUVVE4hP/t/lctGnTx9+c8op3HvffQm9YubMmZx77rlic2Rzbw7I/5oreNzJgwapqqI7dqA7d1pHSUnyVG5Uw0MGD6agoCCB7IQ+kcQFIpEIkydPZszYsQmuoaqEw2H95JNPdOHChTHgervJT4DTWzhA08OjwGWT7r8/u3xXhckei8W47c47obwcMjMtsy9OEHUojdhI/M2oUXwwb16dIqKqJVFaWkJmZlal60OGDJk7b968M1SVsWPH8uSTTxYC7WmBvQIbV6xcGQK0aM0a3bRsmW5fu1b1559NLSzUakdBgXXYawC7A0CXLVtW7fzMmTOrnTNNU03T1OXLl5u1ia4WaA4lQbXVmDFjcoFcIHfJ0qUXqKqaBQXVCMC0kZ+MtNogEAjoli1bar0ef/bee++tiXDMFszsQ+jbt+/r1111leqOHZWJIBBQ7913azgc1qaAeABCVUKqQgBvAO8BL7RgZu9xhd6nnnpqNLpzp8559VXVkhL9ZOZM/X79+j1Bdm1sP2KaZix+rqioSBctWqSqejPw2KhRo+IPxjp06KC0rOg2p82AkE8O4zkbiAJ6ySWXVJLRjUW2qmqrVq30+eefr3RrFWYQf4+pqjpq1Khq7zYMY4/0g5agxppgPCnARcC1GPRFSUF5gAn0VNVz69vMkiVLWLNmDRdeeGGt93Tu3JmNGzfu1slkGAZbt24lNze30jWHw4Fpmo3GYwv7SIY7GYKD8UA/INteQFaKEL7iqBNPPPHYhjTXp08f+vTpU+O1rVu38sc//pE5c+ZgmiaGUbtLJu5HqMNdfYXT6VwdjUY/b+EAdXm9DMNlmmYrAA/I6SKe6ao/JM38v2Pw52oPrgV9Seu06RugTzT62ZogNzeXbdu2ISIYhpFmmmagxRNYC7Gbptlnw5Il29Z/9dW2H1ev3jpddQPwQ79+/f5k32NNsSpStdeSXonZ99JLL+0RAkWEG2+8samUU7Zt2xb3KKppmptbREAd43Vwly5fdDniCLS42DoRDILb3fnRiRPzLzzrrIdVlX9MeoKCw36GSMUIpaWlJVh0UVHRHiPt4YcfbhqKruxyFiDUIsfrhpWAfjprlpplZVZUb1UHTyBgRfnGD1Xt0KlTvR0++xIcDodecMEFCvxDVXv/79nrM2lnzuAanUWdnV8InzocDu104IGqO3aY+vPPWqOrt7BQdds2jcRijTLzmsg5VO93RCyCNa+88kotKCgosTnC6f8rIkD/PGcsQ044AYAZL9XOgkdfdlnxibEYuzZvjkpOjrN1q1Yc1Llz4p4Lzz+fcePH21qBidMwGDhwIA8++CAn2O1XZcWjR4/mmmuuoX///k2ruIjw9ttvc/755+9enjudAGIYBu3atctUVXr16vXOqlWrOovIpv169pszeX/yP/9Z+0xOPqLRymy+yvHp7Nl61tChetbQoTpt6tRaF2x+qSLh6quvTvw9adIkE3hrw4YNjv3WDNSZDEZ5/6Hl9zhvGjsWzKZbOykH0tu2Tdjie9H9XCmYpCHPjR49mqeffjqZi5iq+jQwVkTM/c4MVCUfcM564y6u+8ufmxRRV1xxxb6xWUUSR0Ofa2clqdgSzOTVV181otHoNTNnzjxjv9MBzBl0EeUUNeD9e2Dkfc/z53xPnUGeN4wezcFHHlmvwX1j1iwAJk6cuNf7tmLFit16CavCww8/jMPhSHZ+sWDBAi688EL97W9/O0tVPSIS2m9EgDmda8XgSRRFKvqjigooQh85h+Xx819BaxO2nQ/ODGAjrA5A9WyeTA4kg1y2UCnO75cOJ510Eh9//HGN10aOHKmLFi2a98MPP5y834gAEYaikIx8+7wAhpr8oabnpgMvA5/Av4C+1Y5bWMRoIJUXBg0apL8G5KsqH3/8cY0iUFWZOnWqnHfeeUNUtcPeJoBUwFPHkdoYbqQ+BBiitYVMWYs57iqnYskv0trEoGlzjXGMX7du3R3RaNMlcDz55JN1c7VGKrFVg1DjiE++duutt6phGAtV1dhbBHBW6+zM0iM6tSkccFTPwv6HH1o44KiehUd0ap34PahPr0Kga4MJ4CjOUWgjUgvxKIiDc8yZpMVPReEkrZ/uk2hz69atr7344ot2i3sOY8aMqRXJt99+e40yf9q0aU2iRHbs2FEGDhx4wPr1689sbiXwcDEck3My044ePWKo4dRwRjQUILPtgZRt34rDeTCxWJSs1rk8PmUOKSkeCYWCDSR5OiXQpLYggLCCS8TCv0CmmBWELtDNThPeKZBdzzdtuPrqqyU1NVXPPPNMsrKyqs26hkJtil12dnaN7HvEiBEN1kPatGnD9OnTOe+88yqdnzRpkoiIpzk5wMnZGWkrhxxz+HG3XHRqqsPplPKyMlxZ7dkVCODMaEtZeRlpOe3419S5dOt8ANFYrDHy/5i4wocgKH9Xg0MFvkiewVolqNKexu+p5TFIq+/7fve733Wcm5PzStzbJyK43e4mHbjbbrutmgyvmmdQX+jatSu1ia4tW7asbS4O0Mntcn5wxx9GaUlJiQQiiivFQKNhHAaEy8pwuj1kt8njqTfepXvXA+nToyvzvlzZCK2HYxGsf8oKPNxunE5U3+Kv6uBdBI8qHlEOB76sLiBQA04GfPV840/dIPDEV1/dd5lhXP0TLAmrzveIyKlnnXV3z549uSknp/Qf27dnDh06lGHDhu2RLG+M4ygOmzZt4swzz+SCCy6o8f7PPvtsS3MRwPI22Zn61LT3JRwoQw0noIg4UP0Wp8uNwzAQEbp3PZDB/Xqxs2xXwzs8B6dGcNvs3BST2+V0ogAynI/N6SwTYYCCC8FTnQEkwNEwqYNDwbgZCoAPROSBL6CLMXv2rctmz85eC5suX7Yss3fv5lmMi0QiqGo1ziMiZGdns2LFCjp37kynTp3w+/01EoqtDJY0FwEEI6FAzgF5OQw6vi/ZuZ2qsDTFYRj4n5pKSXmAwcc0cqBCHC0ODrFlf1TdLK6CqWUKA5IxvhwkDCfsoSY3AHhCLQKIZ+x4gNgy0KOgpP9RR5kh1QNVVZrafEx28lRF7M6dO+vFXbZt2zYzLiKbRQfof2QvBg/sh5HZlrJdAcp2BSgPBO0jRFnAUvaGDuhNWKVR+XhacQiwQkJsq9RRk9fFVgvjKCgHUTjY/j0TCNOApItnraacWAUgNgI9kr4n8Hu4HejxCVwhIufbkT9ah07RoD5PmTIFwzBqVCDrS2hjxozh0ksvzW1WP4DGPTGqlO/4GTEMMGMJRBticGiXA4hEYxAO1J17V7sCmJpkq70vw6shsrwWV6fadPGFQkSg+6dW9a7dQtuK7glgSAXxuA3IFbgnaQhmPvroo2kvvviiTJkyhfnz51ebsa+++mqD+nzRRRdVUxAbsu6hqvztb3/ToqKi9LfeessNuJqFAFJcTsx4UqXhsIY8o03i7x+3FfH1uk10ymvbKOTbLP4uxEaFWb3CVtw5ZP9f0yw37OttU6mkI9QK7SALONh+7geFTp9bhHBI8jsdkGkTQeDyyy+XRy6++MCJQ4aQ4jJwuxy4nQYOw2DqM4/w6KOPNsi/EJ/p4XCYYDCIiDBz5sz6IF9FhKysLFHVZ4YPH74DiDQLAfxnwTI8bhcA6QceCmrCrh1JyFGcDgebC7ZbMe+N0XohB0BNtkuUFdUNapYqrBTlWnawIPnRKm8z+sHO+rzTsPP3HfCdAcUKrRwWAcTZglj0WNmpNV+15OgLYMLYU/nsoYP4+w0D6NPzIFYu/YqbLDEhDZ3NW7duZf369agq55xzTr0IZ+TIkfTs2fMqEflns4qAXcEQD7000+pQeBehcMTqY0paJXZkGILDYbDw63UYTkcjGQGFMrJ6oUXjZEKEOEHOZbJcTsy+1wW018revtKvbGKqr3SzxYgA6tiNFxFg1nhy+x4coaA0g+8Lc1mxqSsOw8CMmYrAIYcc8pWIMGHCBD744IN4mjGzZ8+u9UM6d+5Mz5496yP7TWDh+PHj5c0337z5m2++eS75YnNYAUuBYcUlZRTtLKNtNjhTMyAWhkAJVCm57zAMPl60ktRUD4FG+Nu1jjUEYxQlVe51A22A4hDsTIEihdxwPXUAJ7QywWXP9gKgvQluhSyjMmEkOqmzOBqTawpLiKalf+WcumQkaZ7VRCMRwsEyycnKCq9bt+4e4G2v1wswbs2aNfcfcsghnH322XsU26CqFBQUGHl5eZMsCca/apSDTQxnAEsNw+Bfb7yDw+nAiIYs5ljDfguC4HQ5oQEeOX2LTsDRtgqwraHjIrDhBNgKfA+kOmFIPblNOhADchXuAGKm1auOSRbJarGqh6PT6YPJuTj4dvgDrPv7zJNp3+pHwsEQS77bqNlpLkrLylxVfBEP9OvXL7t169bFzzzzTKMJIO4YysvLU9216wWgNRDYGwQAdrFkj8dj6WmGUaupVx4MIohCDXK8ts45SMewuJdq40usaoUdbzRABDgU3hZrrwBxWs/GrdJLgamAQ+dyACnI1PlDNslZW5Z/tvxC98at82MSLg+nOwkhEvnHy+8QicYEeDP5JSUlJSXFxcVnXH311Yfcd999DepTfJFpxIgRiAgbFi+Oh8gJtWnCzQBvJ3ynBdvrObkaKPs18aDRAIRrfcVHLc9nWRYoOTbCU0LWgpJD4Zn+VoiBiIGDCA+tWt/5xElPnb/11uzhOfD6tNUb1sy654XZcx+c8v5MPPpM4Q0l5yb67k36tnyuwcsaYN2bb7652lbidzvjwUpIFZFvZ8yY8U9AFi1bJpgmpw4e7Hn8iSfa7y0C2BFXmMLRmGUFZOVZXKBKR9I8KbYzr/khDVphKYJxKGggAXSsgWhjapmBAfueoKTQ86ftbd4cNvZv342KPtj3b/4FC4C/AOfbxygC/BGYjJerKymY+dyNn6fwsR1g8eLFh4kFNdr+yev9IsLAgQMBnjFN8xawah8RCjH12Wfd2dnZf9pbBHCl9U1JXj61TfHUrEZX4tpTiMJRgEcrMPiuzbu7NcDqSDYHDCzF0p0w5WBtaSDd3fGKDwdc1/rO464bt+kZbmRrjY35yQMW4+VBNNH0kYnr3sS5/r17917bt29fzjzzzER0kmmaiAiHdu/OgL59WfzBB0QikUqv+L/HHoNWrcjOztY/33jjnap6dnNbAYmPq8S2DAcYTUdvWuGTq7PAnzmdozEpM4azNsmMe99G5nr791H1fGerJCL4RKCvEzpbcSd8Y99jOohFx7cfNf/JS9Yu5C4b+V5yUcZWoiA/d+NjCV4mIVxGPjvwVzJJ7yGfUvxMXLly5aH2uRduvfXW30+bNo1Vq1bN9Hg8Zxd8842069TJKoAdDlf65uVLl743b/bsUwcff7zx1xtvVBE5CpjV7ARAJbepQGlBHaK+gSqA4BZLoIeBGnOAzHcRCeJVAy9wElbd3jgU1TyhdwuH2Q+8HYMrndaagClgKBTbDao4gtnzTlr93YZ/sslm688AF+InM2l2tyKfAEIaPo7HyybCDALgrwzEzTx8pPR6rJesYlXyN1z+97///fKMjAyXx+OJANF2HTo4CNSaFX76I5Mn6+Djj+emcePkhWnTzli6ePH/NbcIALghMcBij7DhqHGkXbYTyOPxXFw/9sJVGveKhqkWSWK+TT8JsdJGfk1UmdKYDomle84Pw4VRCKj1uyPQmQo38I8pMe75eGqSVePnanxJyAfwUYyfVOAa+3enj679aMW9H99bFLwn+Ln6NWKapq66flWNxFlWVhZpqNiipIQ+3bufoKr/anYCcDqdyypZ+6oEgoGqwbuEI1Fuu/J8cjLTFOhUrw4ZpCS5X6uy/KEYzEfoJdVV/Y72gMQX0x0NHIc0gc3HQ2SQlXi5zrAcLO74esMxML8//LsBQ/U1+TyOFx3yxJCH7njjjpM9Lo+ISIZhGPVhjY7vvv66Tg722cKF4HKBKrfecIOKyEnNTgAulyvJTWmha9eW7xEUl9NRKcwpHImi2mCTrDboIVW2hEl65veSNCkUFoiFyH71fGc/S5dMNBKxiSgSg28bOVSfIUxC+fCREY+s59GKHIZ6Qu+1dRealq0FBectWLBAAXr26SM9DjnksCVLlvTdGzoAYhgEy3bgycgmvU0eGijhgHatq/mw60fsu9ccpGK5tyZiidp/L7bPXwakaP11ALcJHye1G8WS/+4YBBs1QD4U+Bo45U/+PzXK9e5yuSq6XD3aWIEZp40cKSUbNyrl5fLa5Mn06dMnrVk5gL0Vm+XtKy4EEVLSMkGEDZsLKsKi7aybmy85m2CwYWOoDSeUDvbfZQthmgF3S8NCvdVIcqfO5oznT2POfxww5Xj4jn0Dg6KRSJyd0uGgg2q8qbSs7IzNP/0ksViMjPR0Jk+e3LwcQERmqypqmrTueDCoJpb+K0W0CIgKu4JNU91E6yYE077+qgGt1FoXkPrQ0nJwhaBrhUqxsN/duLIBTz+YyL6DBWaSuR0Oh2vMZDZEPuzQu3eJqmYempe3CXikua2ADBGxAkOo0AUioSrmSkome6sWssI2+0vi9nz8w7IWWG7eWmGXpVekAz/Cyr5geCD2M5hL+IWAmiaFRUU1LiCZqiERWSYiAaDL3jADUVW6dcy1RlmsSOBoMgGoWg6iRkYFST3PKbDQ0tYHUF0/UIEsl4XcOtcRBCKTuMYNWg6aB/IK9Iv9UghARKo5gqrg46SsrKz2e8MVXAnHoJDexqbS5HAMgWBZk7J7Tfo/mfdErb46arLt6/MuAzmojPSVU7i4OwT7gsyDfr+oqlyqWrHbWS1QUlJSvldcwTWlMZmmSVp2a3YW7UiSylEUSE9NaeIPoFwAFdJFCRh7mAp/LLo5j9e+DZAxEPgDHFP6S0G8y+UCtxsxDFrl5OAwjB9i9UwwbRYCSE1NTVFV0jzuauxZq85XO7Pz+Rkf4XanEA7Xf1JJ7d66dUQZpk7mohyCtQCkdbUT3s1YCItag7YB9wg4KvhLmvnDkmoR2/L/jfo+21wi4OGYaeqNvzuLmGnaYeL2QDprZlE/7yhtsC9Aa+7RQkyOM0awNp4cqyYxo3osQPJvtxN+U/fbytdD/zN/aciPm9zxgwZyuuYiAAUkGAoTLN2BiAFlRVbwlMOdUFhcTme1Ldb2WBE6h4XG+RRW0gOcGAYcYfdXbeSLwncmPG/fuxsZNHj3PNXLoc2K6b9wYigSupwbGNug527nZrxMx8uBe4sAKsynnUVWSFgSbYgITofBh4u+xu1qvBTanQEvlf9ok6R6isKiGBzeiJjCuuD4ZhvIfN7DyTtRjT6vj+gk7iJGvrUEXQdBtsPL53qvrsbHefjYvNcJoE3nQzFj8awgC11tsjO57OzB/PDTNis82jSJRmON4TMOcXNCXaZbTQShMMMJJw5M8utT+e+KJmJEGvBF/ya/0rJz04Gf05hIevq49C4dHuwgOkEnTr94+pXG3UYxXsprQH4PrEDQITEz1mGvKoGVNP9YLCGI4/hwuxw899qHiQCRcCRK6a5Ag6phYWn4DkyOISnAIXFtFjlqkpcsEW1q+MgDI3tXlIOOV1o+A3im0uRQbuGeKtE8Xt6ASkEoG/BhpeH6MPEyGS95+GqJAtpTeIiNm9kssk3ye3ftfT3wb5SX8PIZJrOZwL3cxFCUTvh5FqB/Xv8ruZNcHDyBn6K9SgAJuW6HhyngcDj3SN5rZQO+ZtYRpZc4yNDqzy5OQj6KpS9QOd4PDCbhY2MVNjwNHyOqEMQBeNmAcjF+PsdysZ6FFR3cfJDKSyu2rTDwsxYvxUC7Nultvp7749z/e+ubt7hv6H3xYNO3T+t2WtclY5fcszeVwKpmScULDQc7Nm+o17NL4IAaiUoxRHfLHQ6KZ2mQTlShVy3WY827bFRFvsWGR9Rw3xZ8dMXP53h5Dx8BlEnNrvr7+R5hjv0NrVCuL7qtqMexHY+VNFcaqvoR+UTxcf7EoRPz97YVUAnh5TsqZ25Z6wG1Y3ARdPsSvozC+Fq8iy8ma/k1EolB3wSq04hRS9yfNOVChDKKfD7GT64d5CE1yOamLBjQm3y+sAniIfJR8vnD+Nnjh8pd0gc/zqlfTxXqSH5tdgIQh5NYknPHNGO07nCQlRHkMFizcUul+7+EEQrLgWMEMudXDuOOY62Iiiz002tBRq5URnQ8O2JHLZ/q+XRPRaKfnfg5iXyOAYIog2v4rqvx8h7eSvpG48BHCD8D8NolboQr8PM0afyH/yP7uSXP6cjDR6qIPLbPCKDs581ktM2rpIkbTjfZGWm4nE4Wrfo+ce30aPQ0gdelIk1suLPCfKvNDGxXTfGciaHKwBruj5kwt5bmfmoSVuAlHcGNn1uQJI+cl1S8BPDzND5Ow5fIB2gKOAkvgo8X8LIVH4KXdVf2uVLI54p94QhKhP6nt26PiGHrAla9gFgsyvUXDSMQDNOv18EJVt5F9US1F2xs5LqB3+7GE5ii06tk95aSJkJ2LSKiqkNnrcIcAy48sWZTsKGzshyYZn/gNXjJJp8XUVrjs4paNDn4OBl4CC9ulP72uW54KUCYXdejzWYFHNyhPSJimYGGEzSGQ6Ns27KJtq1y2BUKgcbo0eVAAqEwrbMyMIp3uqtYbS7g8M/BcVwVbV8FEUUx6KIx+gIfJC5mcCbQVuIpRy5q3WHTgMIoXNKPKra0lwwUL5L0XqsYXVHco4iSDfyIn8cT8t0K8boLL0OB2cBDwN0Im5uV1fqI70S1KencbncdbzYC2Fq0w1oRVAVPBlq+nSlzP+LIzq1p1+aYRKZQLFEfUCv7kSvs80tdcC8VSRyIEFOTXRikq5WVcYr5Jh8aF6Dm2xgoN2Hlo/5HlFOD82kLdsx9FehnvW5HFXOvLVao9yuAQRTFQRQoRVmAUGqXoC0CnHgZh9IJpTtesvDxNF6eQ/Hhr+Id9HIYVuyBAEvwsU/jCZptLSAQClcIanEQDEdZvbmYEjMlYRq63W6m/OdzAqEwRTvLksmgIMlec8bssiwJ2Mk6YGVivV8ZKS477l7JQ+hjhyGEENAwTir0it33WSgGvkH4FlhVMr4kHViG8D1CayAHP53x0wc/vfHRFZgBPAisw0suEKiG/HwUK5l0FfD1HiE/n3FNgahm4QDJAaEgEA3iSXFxxx9GgghqmoghqEKq221XXDLi4rnIztm7LE4ADhgO/DfR4qWY5vREHJGqcChwhU5nKvCICh5bh1ibrAQohBywsR7sNEZS8GeWL+sTVT1fRKYnIWAW8Cx+W977GW4j/jzgRdTOcfAyFzgN2IKvCU1AaRrcNRcHGNOtY57l7bM9gPEUIVEzyTsIwXAET4qb1tnpcc3RNGGjWCHcaiPy5K9qswbssvCi/E2Fb9XgAtFEINKcKq7gsEKjQpAqId9C+NkIHrxMJZ8rbcLZBrwOvIcQxcst+DgDHw58VTyNzQVeO9MI4E+cz1+rW0PNzgFEhB8LiiqigtQEhxuJhSElA8JWZdBIOMzFw04gEAqT17YV5s/FCEwOw/1uuFEgw9L36Bi1qm58DqBvISqsUOhvl4lVxMrSTSDf0hVMtf6PU44a0wAADOxJREFUn3I2qcD18YqtJ1js3Y/gs7dq86JNMuO9OFBS8e+GcL38AZiAz/ae3sIgfVD/DVwo98veNwMPaJNTMdMjAUhrXaurWFUZecoATNMkBl96rLy7Fyo8v2Q54KoEgQ1HxeRf8ZTqeLl4iXMEQTD5UiN8KyDFy+gOuAVGD6SGlbOmYcmLbUSk2cUeXE3UsgehG16OrOJFrIrVc/FxAF4EL7dKpqwTkUzJl6v3jR+g0lqAQLicJKldjWNErcgh0wFb+kFU4Lvk5VyF3E+pZEerUPtSrQg7RXAA6wrnkgrc1h9ea0YzrJ9tBu6yZ36sidotx8cylP/aJibkEyJ5BTSfyfiIb2t/JcpoRXfh5SGEW+pyPze7J9CMRSzEh8vt11X+lnhmcHFJGbtgmwkLbYTPxpbX9hMnpVvr2xb2f2IpymqtzUOovI6DHRRzZHgbT/SHvze7/PUlqZy+Jk528NMOr+3UEYL4WJbk2ppuE8Ig4EH8dMfaMfRW/Gys61uanQBKCjYj8WqhalZUDgXEcLD42/VEojEem/IuLpcz8aUGbLft7PipzCgk0seN64iqEJUaOI/d/Eo5n1K5nED/2v3/vzaovnI5nmKdoGWMYxTwHj5a4eVRfLyOb/fBLM1OAK7UNKLhoB2IZev0CfvOwdpNW4nFYjgEypTCATbCTYvdB5NYhgGc+kVyAoda8Xw1sIAdmKxkfwMf99j6Raatb/TAYCxw76Aeg/6CnzTyeRz4x742AxOQ2ToPrSNGPVEvwDA40TTzAeZDZwP+A/TQCnkPMESS6wka/KhKTLWyG1FMJhvDKWV/BCUdtXZCE6QNPl57/MvHp8/fNH+aPaAd8FV4TfeZK7hCyzdxuOrOVkn1uGmdlU7fguDOhTBArLp58Uze5AQfF3AmtoUg5bxDGisQjrb3CUSEsLIXAjL2FfjZBTyLl+s0omNV9XC5XT5iIifjJYqvYTjdK9vGWYtCUWKRcC1EAqaVMpYr8K5ABxvzPyu8lMQFDIE+iXZ/S7kq/1TTrk5v7Rs03TiXH9jfQXno5d++/FdLg+YW8nkJu0DnL44A4gpf8eYNSKisxpKx9se8FN/JS+FHE07TuPPHeqrs2zwrGijJ3HsT4d9qEkL5gihj+F8AofCSIy+ZLSJiHGCkImTga7jes3cIQBwI0LZL90T5uNQUN0n1+uJOI6ddSvI7gcEDYEnMEgfrDNh16ZVMuOyaymvqci7l4uCPAscS5UQZYVXr+kWCFw/5XNpErT2Bl3mQKA/bqHLre4cAnCnWHLZdww7D4PE33sPpMDBVCYYjyRtHLVc49RirkDMu+DkTplx/Mb5VnVmFn8+q0ddZlMl5LDdGNCiGf19o8UHgVbw82ARtTQBOAejVvtdCfAxvHAHk4yOfmXjrXTO/8X7BlIxEQfUtQ4sItg9y5KGdMU0zTsWLIzDk2KSghmPAPOxe5n9+KFvxVY///xUqcTEaUBl9N0QQA/j6uq+vNk1zTuMkSYU78SWEQpQZ+PlwT74rNTVVO7RvzUWnHR93BliewMxcKN2G4XDwwLzpDOvQhz7du7Jm4xZ6z/n46xNUj64WljWeS1Bi3NOMbtx9AfHFoyYA0zQLDcNot2ciwM+l+LgZYSNeFC+X4G1qEWFxggm5r+PY6CAtxY0gvDx7Hk+53RdUQ76X36HsqIz8+Zn7iTkn5DeByPJiNhb5NesAPtbZixkLgbHkN5VHTatSLa/O+RhPiguny8VmkUiVGTKSGC7uSQ5qXDQK3K79hgsIfcnn/AZwjYer/P4C355NUqfdkA+pISJWWY6fI8hnIjALP5820htklYhRZYO7gKtWnMorfMp5pwwkGI4kfAVJbP8iYDJBKuLJ+eIWYCZEOmCtE/z6wccK8rmMpP0V6pjpU/BxUdLvl/FZNY/2nAD8NdfUxcsg8ilE6IFyCV5W4KvfDluVIFwOqZmwcyuSYmA4LKI9uEP76hWtLLb/AlBi+Ym/NICnQB8FvRKMf+5nFv3h9UD+DnxJSnp+EwWb7NYM9PEpftqhBBC6AB3twMbdTPgqhWAMB5QUgOEg3eXh6TffQ0Qo2F6FlsZzMcrLdrybsOVQB+gLIK+CXAuOt2BA4X6Ffj9nkV9rsgp4ObkS8r1kIPRtqtcb9fzIAPA8ynm28vJinaJNhEAwnCAGQwwrLkuVVzM/AXFgqtIxtyLML3RuaBjCYwl1IepciCttEX89+Wt6z/kdyELo+2UT59b9UnSBTnWoTq/ZiBe8DEK5CB9L9i4BWNxgJX7uxctHwH/JR/FyYhJbOiX+ZyQa5dQB1qbQhsNBSeFPliQIlFVgT8HjdlG0s8yOCMZEWWR/1TpWn5rJc08fyf0fLGHFsC/gmOftJw8mn6f2G+RbBH2pHcxRVel7Fz/xfX4PQTkFfxPkFO6RJ9DHEPy8gHAqMA8vx9lX1sRr0LicTuZ9ZW1yoKaJM8WDqsmM7C+4qei8Srs0/LClEIfDIGVGynsIp+HmFe5eOJVpvkugJAbGRXDsU/ZglaL0wZ8U+frrVwQVH0uRiiLUSVCSxAmm4cff1K937sGH/9f2JBaTz834eZ58lgNHqipOO9RLVUnNbGU5AtOzeOfdJXhS3PHVPwxDCF4TRLbLQGLi5a4VCrumoOEfIethkDH2bFhUbdOFX+aMdgC/QdmF8AJWfkFOPcLCT8FLb3yVts9bYre5EpLkfjwFLZ9DgG74G7913p7HA/hpRT7r8PIwPrLx8qg8IDbRWmG7ajggFkVRHA4rUbRjbmvmZixma7diPE95UId+ESyb1xVCr8Gx38PCiRC8CU6M4OXf+DjmVzKjY8B7NpK6JbHzOVh7FK/Cz4QanvwUrVjqTngKrXE9osq9t5DPQIQVifI0+4wALCLoRj4R8jkaMEzsDaPsAD1JyYRdxYm9/qKeGMHLggzddjzlgRCPx94lFnr8jyAvQb/vYeEEcE7Ce2w7YAE+OjdgBrpQ2iEU1icmrllZe+UxOrMScoUsfElRSz6ieHkT7L4KP9Rg++cA3yRi/5tEBHiTskkra58K5FCRVJFVp+3px0U+EZQRsQGxQ9Z/UnCa3RErGFSE7Fg6ZZlBUtJcXLJtCAK0ykq3zcZYAI5dAgvvwBF7lbuOPQblM6TyTty78ZTFgHeAMfALthYsS6ojXlYB1wMz8KGChBQFL2vw0ZX8JP+Ml09QzsHfdMiPc4D7azFNFDgQiODjbnuAb0bwxNGKcritqMzBzyybCFbHesZSnfMrPLYhwrgEWpmZzB+0mq7rc3FJ5eVrd9qNzwWdb9/K1cMGk7F9O7ABfz02dsznLWA7wiZ8jVsT30dE8CPQCS9DUd4ARuoOvfH292/X+96574JEZpFVfHKUbYI3eXSz7IadrrQR3BqlE0IaVkxeCJ+dj5/PowijgFyUE4AhrlmuAZGzI+fesXkkgrI6awcHl+XwwAFvcvyMXmwpLOZ3ZwyC9Na4gsXc88xbRA+68TPOes4gs+hKrMIQB9jf9yjCw/iS4vy8ZAPHAq/gox2/ZogrdF6+xcdhtnjItJXHTsBIfM2X0+DcjRw7ogbNcztwpR2eHEM5AR834KUz8APCBZEhkb84J7pY/4dtFLp2MiDSn+ScTDNeNNL2GEZvimA8mPeymVW0EFiDErMVIAOftRN3Jflp+c4v+NUjP1lX8HEYXhaggM8eLC/rsfYoajYCkEZSbW+U9ggG8B5KCTADP5fhZYkUSh5l5LXrlMXBgVx+Ez0JgqXMT/+G0vcCDO53OKkeD2ZaNs+lvc62B0rR0bHbtJ1+AzjxMy1pZjyFtd9uJjAK+BTffpPoUZNIU1tHUGAw/hr9A/vYD1DZVhW8HIdyDfkoyunaVt+lLRRHykihE0TDoCZhiWCq0io7g03fLufLo8ro9+khvNd9GeHW0ZsQXsbHX2wl9HK7ysZMhEvw8R/2d7C8gr9JKIp7xQvd9J24C2UGWLlrKeoiKjFu2zycmGny3oIVnH1aX/xZr3PnllGoKve2mUrqI6ndAuMCG7Ayf0pQyvGTQQs0KzRHUOgw/CyPk9ag8p5cuv0UAhKh+KfvibYx+XDV19y5ZRTRcIiH8mbieMZJcHRwNMpbKCUoHVqQ/2slAB+D8CKe+z0XuF9wU2IGOCCYzbK0DSw8ooRdrYJsWlWEAu+3W4G37CLMo00Q0hA+x4/gb+aKWi3QrBwAfKiIFOKEHms74ED4MHsF3QMHkvdjNtt3lmkwFObbnVujTy59d6drvnOjpmm0Vp9EC/zKCMAGx2ZHzAyHYmXbC2JXLTgilrOmNHZc58xYaSDMP16cPsN4zXHk+sHbMsO7wl1wM67Jc+pboJmsgPrBAlXNKy8uIJN0XA7LMxiOmfGNnQpLS8tIeO/2cb28FmiBFmiBFmiBFmiBFmiBFmiBFmiB/wH4f+jryq6sRdUDAAAAAElFTkSuQmCC" alt="DREME Logo"/> - <h1>DREME</h1> - <h2>Discriminative Regular Expression Motif Elicitation</h2> - </div> - <p class="spaced"> - For further information on how to interpret these results or to get a - copy of the MEME software please access - <a href="http://meme.nbcr.net/">http://meme.nbcr.net</a>. - </p> - <p> - If you use DREME in your research please cite the following paper:<br /> - <span class="citation"> - Timothy L. Bailey, "DREME: Motif discovery in transcription factor ChIP-seq data", <i>Bioinformatics</i>, <b>27</b>(12):1653-1659, 2011. - <a href="http://bioinformatics.oxfordjournals.org/content/27/12/1653">[full text]</a> - </span> - </p> - </div> - <!-- navigation --> - <div class="pad2"> - <a class="jump" href="#motifs_sec">Discovered Motifs</a> - | - <a class="jump" href="#inputs_sec">Inputs & Settings</a> - | - <a class="jump" href="#info_sec">Program information</a> - </div> - <!-- alert the user when their browser is not up to the task --> - <noscript><h1 style="color:red">Javascript is required to view these results!</h1></noscript> - <h1 id="html5_warning" style="color:red; display:none;">Your browser does not support canvas!</h1> - <script> - if (!window.HTMLCanvasElement) $("html5_warning").style.display = "block"; - </script> - <!-- description --> - <div id="description_section" style="display:none"> - <div id="description" class="header"> - <h2>Description</h2> - </div> - <div id="description_text" class="box"> - </div> - </div> - <script> - if (data.description) { - $("description_text").innerHTML = ""; - $("description_text").appendChild(make_description(data.description)); - $("description_section").style.display = "block"; - } - </script> - <!-- motifs --> - <div id="motifs_sec" class="header"> - <h2>Discovered Motifs</h2> - <span><a href="#inputs_sec">Next</a> <a href="#">Top</a></span> - </div> - <div id="motifs" class="box"> - <p>No motifs were discovered!</p> - </div> - <script>make_motifs();</script> - <!-- inputs and settings --> - <div id="inputs_sec" class="header"> - <h2>Inputs & Settings</h2> - <span><a href="#motifs_sec">Previous</a> <a href="#info_sec">Next</a> <a href="#">Top</a></span> - </div> - <div class="box"> - <h4>Sequences</h4> - <table id="seq_info" class="inputs"> - <tr><th>Source <div class="help" data-topic="pop_seq_source"></div></th> - <th>Alphabet <div class="help" data-topic="pop_seq_alph"></div></th> - <th>Sequence Count <div class="help" data-topic="pop_seq_count"></div></th> - </tr> - <tr> - <td id="ins_seq_source"></td> - <td id="ins_seq_alphabet"></td> - <td id="ins_seq_count"></td> - </tr> - </table> - <script> - { - var db = data.sequence_db; - $("ins_seq_source").innerHTML = db.file; - $("ins_seq_alphabet").innerHTML = dreme_alphabet.get_alphabet_name(); - $("ins_seq_count").innerHTML = db.count; - } - </script> - <h4>Control Sequences</h4> - <table id="seq_info" class="inputs"> - <tr><th>Source <div class="help" data-topic="pop_seq_source"></div></th> - <th>Sequence Count <div class="help" data-topic="pop_seq_count"></div></th> - </tr> - <tr> - <td id="ins_cseq_source"></td> - <td id="ins_cseq_count"></td> - </tr> - </table> - <script> - { - var db = data.control_db; - if (db.from == "shuffled") { - $("ins_cseq_source").innerHTML = "Shuffled Sequences"; - } else { - $("ins_cseq_source").innerHTML = db.file; - } - $("ins_cseq_count").innerHTML = db.count; - } - </script> - <h4>Background</h4> - <span id="alpha_bg"></span> - <script> - { - $("alpha_bg").appendChild(make_alpha_bg(dreme_alphabet, data.control_db.freqs)); - } - </script> - <h4>Other Settings</h4> - <table id="tbl_settings" class="inputs hide_advanced"> - <tr> - <th>Strand Handling</th> - <td id="opt_strand"> - <span class="strand_none">This alphabet only has one strand</span> - <span class="strand_given">Only the given strand is processed</span> - <span class="strand_both">Both the given and reverse complement strands are processed</span> - </td> - </tr> - <tr><th># REs to Generalize</th><td id="opt_ngen"></td></tr> - <tr><th>Shuffle Seed</th><td id="opt_seed"></td></tr> - <tr><th>E-value Threshold</th><td id="opt_stop_evalue"></td></tr> - <tr><th>Max Motif Count</th><td id="opt_stop_count"></td></tr> - <tr><th>Max Run Time</th><td id="opt_stop_time"></td></tr> - </table> - <script> - { - $("opt_strand").className = (dreme_alphabet.has_complement() ? (data.options.revcomp ? "both" : "given") : "none"); - $("opt_ngen").innerHTML = data.options.ngen; - $("opt_seed").innerHTML = data.options.seed; - $("opt_stop_evalue").innerHTML = data.options.stop.evalue; - $("opt_stop_count").innerHTML = (typeof data.options.stop.count == "number" ? data.options.stop.count : "No maximum motif count."); - $("opt_stop_time").innerHTML = (typeof data.options.stop.time == "number" ? data.options.stop.time + " seconds." : "No maximum running time."); - } - </script> - </div> - <!-- list information on this program --> - <div id="info_sec" class="bar" style="position:relative"> - <div style="position: absolute; right: 0;"><a href="#inputs_sec">Previous</a> <a href="#">Top</a></div> - <div class="subsection"> - <h5 id="version">DREME version</h5> - <span id="ins_version"></span> - (Release date: <span id="ins_release"></span>)<br> - </div> - <script> - $("ins_version").innerHTML = data["version"]; - $("ins_release").innerHTML = data["release"]; - </script> - <div class="subsection"> - <h5 id="reference">Reference</h5> - <span class="citation"> - Timothy L. Bailey, "DREME: Motif discovery in transcription factor ChIP-seq data", <i>Bioinformatics</i>, <b>27</b>(12):1653-1659, 2011. - <a href="http://bioinformatics.oxfordjournals.org/content/27/12/1653">[full text]</a> - </span> - </div> - <div class="subsection"> - <h5 id="command">Command line</h5> - <textarea id="cmd" rows="3" style="width:100%;" readonly="readonly"> - </textarea> - <script>$("cmd").value = data["cmd"].join(" ");</script> - </div> - </div> - </body> </html>
--- a/test-data/dreme_output_test1.txt Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/dreme_output_test1.txt Wed Dec 11 18:05:35 2019 -0500 @@ -1,12 +1,7 @@ -# DREME 4.12.0 -# command: dreme -o ./dreme_test1_out -p dreme_test_sites.fa -norc -rna -s 1 -# positives: 1000 from dreme_test_sites.fa (Thu Apr 26 15:09:03 CEST 2018) +# DREME 5.0.5 # negatives: 1000 from shuffled positives -# host: ThinkPad-T450s -# when: Thu May 03 13:22:29 CEST 2018 -MEME version 4.12.0 - +MEME version 5.0.5 ALPHABET "RNA" RNA-LIKE A "Adenine" CC0000 C "Cytosine" 0000CC @@ -27,20 +22,15 @@ K "Keto" = GU T = U END ALPHABET - Background letter frequencies (from dataset): A 0.221 C 0.245 G 0.221 U 0.312 - - MOTIF UUYUCY DREME-1 - # Word Pos Neg P-value E-value # BEST UUYUCY 387 210 2.6e-018 1.2e-013 # UUUUCC 147 75 1.8e-007 8.1e-003 # UUUUCU 155 94 2.2e-005 1.0e+000 # UUCUCU 94 51 1.3e-004 6.1e+000 # UUCUCC 75 42 1.1e-003 5.0e+001 - letter-probability matrix: alength= 4 w= 6 nsites= 459 E= 1.2e-013 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000 @@ -48,29 +38,21 @@ 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.474946 0.000000 0.525054 - - MOTIF YAGG DREME-2 - # Word Pos Neg P-value E-value # BEST YAGG 600 416 1.1e-016 5.1e-012 # CAGG 441 304 1.5e-010 6.6e-006 # UAGG 232 165 1.1e-004 4.7e+000 - letter-probability matrix: alength= 4 w= 4 nsites= 793 E= 5.1e-012 0.000000 0.692308 0.000000 0.307692 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000 0.000000 - - MOTIF GAAGAW DREME-3 - # Word Pos Neg P-value E-value # BEST GAAGAW 81 22 8.2e-010 3.4e-005 # GAAGAU 45 7 2.4e-008 9.9e-004 # GAAGAA 40 16 7.9e-004 3.3e+001 - letter-probability matrix: alength= 4 w= 6 nsites= 89 E= 3.4e-005 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 @@ -78,17 +60,13 @@ 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.494382 0.000000 0.000000 0.505618 - - MOTIF SMUGGA DREME-4 - # Word Pos Neg P-value E-value # BEST SMUGGA 110 47 9.1e-008 3.7e-003 # GAUGGA 22 6 1.7e-003 7.1e+001 # GCUGGA 33 14 3.6e-003 1.5e+002 # CCUGGA 32 15 8.6e-003 3.5e+002 # CAUGGA 29 13 9.1e-003 3.7e+002 - letter-probability matrix: alength= 4 w= 6 nsites= 119 E= 3.7e-003 0.000000 0.529412 0.470588 0.000000 0.428571 0.571429 0.000000 0.000000 @@ -96,7 +74,4 @@ 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 - - # Stopping reason: E-value threshold exceeded -# Running time: 13.95 seconds
--- a/test-data/dreme_output_test1.xml Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/dreme_output_test1.xml Wed Dec 11 18:05:35 2019 -0500 @@ -1,7 +1,5 @@ -<dreme version="4.12.0" release="Tue Jun 27 16:22:50 2017 -0700"> +<dreme version="5.0.5" release="Mon Mar 18 20:12:19 2019 -0700"> <model> - <command_line>dreme -o ./dreme_test1_out -p dreme_test_sites.fa -norc -rna -s 1</command_line> - <positives name="dreme test sites" count="1000" file="dreme_test_sites.fa" last_mod_date="Thu Apr 26 15:09:03 CEST 2018" /> <negatives name="shuffled positive sequences" count="1000" from="shuffled"/> <alphabet name="RNA" like="rna"> <letter id="A" symbol="A" name="Adenine" colour="CC0000"/> @@ -26,8 +24,6 @@ <ngen>100</ngen> <add_pv_thresh>0.01</add_pv_thresh> <seed>1</seed> - <host>ThinkPad-T450s</host> - <when>Thu May 03 13:22:29 CEST 2018</when> </model> <motifs> <motif id="m01" alt="DREME-1" seq="UUYUCY" length="6" nsites="459" p="387" n="210" pvalue="2.6e-018" evalue="1.2e-013" unerased_evalue="1.2e-013"> @@ -73,5 +69,4 @@ <match seq="CAUGGA" p="29" n="13" pvalue="9.1e-003" evalue="3.7e+002"/> </motif> </motifs> - <run_time cpu="13.95" real="13.95" stop="evalue"/> </dreme>
--- a/test-data/dreme_output_test2.html Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/dreme_output_test2.html Wed Dec 11 18:05:35 2019 -0500 @@ -7,10 +7,10 @@ // @JSON_VAR data var data = { "program": "dreme", - "version": "4.12.0", - "release": "Tue Jun 27 16:22:50 2017 -0700", + "version": "5.0.5", + "release": "Mon Mar 18 20:12:19 2019 -0700", "cmd": [ - "dreme", "-o", "./dreme_test2_out", "-p", "dreme_test_sites.fa", + "dreme", "-o", "./dreme_out", "-p", "-norc", "-rna", "-s", "1", "-e", "1e-05", "-g", "100", "-mink", "4", "-maxk", "10" ], @@ -36,80 +36,57 @@ "symbol": "C", "name": "Cytosine", "colour": "0000CC" - }, { "symbol": "G", "name": "Guanine", "colour": "FFB300" - }, { "symbol": "U", "aliases": "T", "name": "Uracil", "colour": "008000" - }, { "symbol": "N", "aliases": "X.", "name": "Any base", "equals": "ACGU" - }, { "symbol": "V", "name": "Not U", "equals": "ACG" - }, { "symbol": "H", "name": "Not G", "equals": "ACU" - }, { "symbol": "D", "name": "Not C", "equals": "AGU" - }, { "symbol": "B", "name": "Not A", "equals": "CGU" - }, { "symbol": "M", "name": "Amino", "equals": "AC" - }, { "symbol": "R", "name": "Purine", "equals": "AG" - }, { "symbol": "W", "name": "Weak", "equals": "AU" - }, { "symbol": "S", "name": "Strong", "equals": "CG" - }, { "symbol": "Y", "name": "Pyrimidine", "equals": "CU" - }, { "symbol": "K", "name": "Keto", "equals": "GU" - } - ] - }, "background": { "freqs": [0.221, 0.245, 0.221, 0.312] - }, "sequence_db": { - "name": "dreme test sites", - "file": "dreme_test_sites.fa", - "lmod": "Thu Apr 26 15:09:03 CEST 2018", "count": 1000 - }, "control_db": { "name": "shuffled positive sequences", "from": "shuffled", "count": 1000, "freqs": [0.221, 0.245, 0.221, 0.312] - }, "motifs": [ - { "db": 0, "id": "UUYUCY", "alt": "DREME-1", @@ -127,5993 +104,64 @@ [0.000000, 0.000000, 0.000000, 1.000000], [0.000000, 1.000000, 0.000000, 0.000000], [0.000000, 0.474946, 0.000000, 0.525054] - ], "matches": [ - { "seq": "UUUUCC", "p": 147, "n": 75, "pvalue": "1.8e-007", "evalue": "2.2e-002" - }, { - "seq": "UUUUCU", - "p": 155, - "n": 94, - "pvalue": "2.2e-005", - "evalue": "2.8e+000" - }, { - "seq": "UUCUCU", - "p": 94, - "n": 51, - "pvalue": "1.3e-004", - "evalue": "1.7e+001" - }, { - "seq": "UUCUCC", - "p": 75, - "n": 42, - "pvalue": "1.1e-003", - "evalue": "1.4e+002" - } - ] - }, { - "db": 0, - "id": "YAGG", - "alt": "DREME-2", - "len": 4, - "nsites": 793, - "evalue": "1.4e-011", - "p": 600, - "n": 416, - "pvalue": "1.1e-016", - "unerased_evalue": "6.3e-012", - "pwm": [ - [0.000000, 0.692308, 0.000000, 0.307692], - [1.000000, 0.000000, 0.000000, 0.000000], - [0.000000, 0.000000, 1.000000, 0.000000], - [0.000000, 0.000000, 1.000000, 0.000000] - ], - "matches": [ - { - "seq": "CAGG", - "p": 441, - "n": 304, - "pvalue": "1.5e-010", - "evalue": "1.8e-005" - }, { - "seq": "UAGG", - "p": 232, - "n": 165, - "pvalue": "1.1e-004", - "evalue": "1.3e+001" - } - ] - } - ], - "runtime": { - "host": "ThinkPad-T450s", - "when": "Thu May 03 13:22:11 CEST 2018", - "cpu": 15.97, - "real": 15.97, - "stop": "evalue" - } - }; </script> - <script> var site_url = "http://meme-suite.org"; -</script> - <script> - -/* - * $ - * - * Shorthand function for getElementById - */ -function $(el) { - return document.getElementById(el); -} - - -/* - * See http://stackoverflow.com/a/5450113/66387 - * Does string multiplication like the perl x operator. - */ -function string_mult(pattern, count) { - if (count < 1) return ''; - var result = ''; - while (count > 1) { - if (count & 1) result += pattern; - count >>= 1, pattern += pattern; - } - return result + pattern; -} - -/* - * See http://stackoverflow.com/questions/814613/how-to-read-get-data-from-a-url-using-javascript - * Slightly modified with information from - * https://developer.mozilla.org/en/DOM/window.location - */ -function parse_params() { - "use strict"; - var search, queryStart, queryEnd, query, params, nvPairs, i, nv, n, v; - search = window.location.search; - queryStart = search.indexOf("?") + 1; - queryEnd = search.indexOf("#") + 1 || search.length + 1; - query = search.slice(queryStart, queryEnd - 1); - - if (query === search || query === "") return {}; - - params = {}; - nvPairs = query.replace(/\+/g, " ").split("&"); - - for (i = 0; i < nvPairs.length; i++) { - nv = nvPairs[i].split("="); - n = decodeURIComponent(nv[0]); - v = decodeURIComponent(nv[1]); - // allow a name to be used multiple times - // storing each value in the array - if (!(n in params)) { - params[n] = []; - } - params[n].push(nv.length === 2 ? v : null); - } - return params; -} - -/* - * coords - * - * Calculates the x and y offset of an element. - * From http://www.quirksmode.org/js/findpos.html - * with alterations to take into account scrolling regions - */ -function coords(elem) { - var myX = myY = 0; - if (elem.getBoundingClientRect) { - var rect; - rect = elem.getBoundingClientRect(); - myX = rect.left + ((typeof window.pageXOffset !== "undefined") ? - window.pageXOffset : document.body.scrollLeft); - myY = rect.top + ((typeof window.pageYOffset !== "undefined") ? - window.pageYOffset : document.body.scrollTop); - } else { - // this fall back doesn't properly handle absolutely positioned elements - // inside a scrollable box - var node; - if (elem.offsetParent) { - // subtract all scrolling - node = elem; - do { - myX -= node.scrollLeft ? node.scrollLeft : 0; - myY -= node.scrollTop ? node.scrollTop : 0; - } while (node = node.parentNode); - // this will include the page scrolling (which is unwanted) so add it back on - myX += (typeof window.pageXOffset !== "undefined") ? window.pageXOffset : document.body.scrollLeft; - myY += (typeof window.pageYOffset !== "undefined") ? window.pageYOffset : document.body.scrollTop; - // sum up offsets - node = elem; - do { - myX += node.offsetLeft; - myY += node.offsetTop; - } while (node = node.offsetParent); - } - } - return [myX, myY]; -} - -/* - * position_popup - * - * Positions a popup relative to an anchor element. - * - * The avaliable positions are: - * 0 - Centered below the anchor. - */ -function position_popup(anchor, popup, position) { - "use strict"; - var a_x, a_y, a_w, a_h, p_x, p_y, p_w, p_h; - var a_xy, spacer, margin, scrollbar, page_w; - // define constants - spacer = 5; - margin = 15; - scrollbar = 15; - // define the positions and widths - a_xy = coords(anchor); - a_x = a_xy[0]; - a_y = a_xy[1]; - a_w = anchor.offsetWidth; - a_h = anchor.offsetHeight; - p_w = popup.offsetWidth; - p_h = popup.offsetHeight; - page_w = null; - if (window.innerWidth) { - page_w = window.innerWidth; - } else if (document.body) { - page_w = document.body.clientWidth; - } - // check the position type is defined - if (typeof position !== "number") { - position = 0; - } - // calculate the popup position - switch (position) { - case 1: - p_x = a_x + a_w + spacer; - p_y = a_y + (a_h / 2) - (p_h / 2); - break; - case 0: - default: - p_x = a_x + (a_w / 2) - (p_w / 2); - p_y = a_y + a_h + spacer; - break; - } - // constrain the popup position - if (p_x < margin) { - p_x = margin; - } else if (page_w != null && (p_x + p_w) > (page_w - margin - scrollbar)) { - p_x = page_w - margin - scrollbar - p_w; - } - if (p_y < margin) { - p_y = margin; - } - // position the popup - popup.style.left = p_x + "px"; - popup.style.top = p_y + "px"; -} - -function lookup_help_popup(popup_id) { - var _body, pop, info; - pop = document.getElementById(popup_id); - if (pop == null) { - _body = document.getElementsByTagName("body")[0]; - pop = document.createElement("div"); - pop.className = "pop_content"; - pop.id = popup_id; - pop.style.backgroundColor = "#FFC"; - pop.style.borderColor = "black"; - info = document.createElement("p"); - info.style.fontWeight = "bold"; - info.appendChild(document.createTextNode("Error: No popup for topic \"" + popup_id + "\".")); - pop.appendChild(info); - // this might cause problems with the menu, but as this only happens - // when something is already wrong I don't think that's too much of a problem - _body.insertBefore(pop, _body.firstChild); - } - if (document.getElementsByTagName('body')[0].hasAttribute("data-autobtns")) { - if (!/\bauto_buttons\b/.test(pop.className)) { - pop.className += " auto_buttons"; - var back_btn_sec = document.createElement("div"); - back_btn_sec.className = "nested_only pop_back_sec"; - var back_btn = document.createElement("span"); - back_btn.className = "pop_back"; - back_btn.appendChild(document.createTextNode("<< back")); - back_btn.addEventListener("click", function(e) { - help_return(); - }, false); - back_btn_sec.appendChild(back_btn); - pop.insertBefore(back_btn_sec, pop.firstChild); - var close_btn_sec = document.createElement("div"); - close_btn_sec.className = "pop_close_sec"; - var close_btn = document.createElement("span"); - close_btn.className = "pop_close"; - close_btn.appendChild(document.createTextNode("close")); - close_btn.addEventListener("click", function(e) { - help_popup(); - }, false); - close_btn_sec.appendChild(close_btn); - pop.appendChild(close_btn_sec); - } - } - return pop; -} - -/* - * help_popup - * - * Moves around help pop-ups so they appear - * below an activator. - */ -function help_popup(activator, popup_id) { - "use strict"; - var pop; - // set default values - if (typeof help_popup.popup === "undefined") { - help_popup.popup = []; - } - if (typeof help_popup.activator === "undefined") { - help_popup.activator = null; - } - var last_pop = (help_popup.popup.length > 0 ? help_popup.popup[help_popup.popup.length - 1] : null); - if (typeof(activator) == "undefined") { // no activator so hide - if (last_pop != null) { - last_pop.style.display = 'none'; - help_popup.popup = []; - } - return; - } - pop = lookup_help_popup(popup_id); - if (pop == last_pop) { - if (activator == help_popup.activator) { - //hide popup (as we've already shown it for the current help button) - last_pop.style.display = 'none'; - help_popup.popup = []; - return; // toggling complete! - } - } else if (last_pop != null) { - //activating different popup so hide current one - last_pop.style.display = 'none'; - } - help_popup.popup = [pop]; - help_popup.activator = activator; - toggle_class(pop, "nested", false); - //must make the popup visible to measure it or it has zero width - pop.style.display = 'block'; - position_popup(activator, pop); -} - -/* - * help_refine - * - * Intended for links within a help popup. Stores a stack of state so - * you can go back. - */ -function help_refine(popup_id) { - if (help_popup.popup == null || help_popup.popup.length == 0 || help_popup.activator == null) { - throw new Error("Can not refine a help popup when one is not shown!"); - } - var pop = lookup_help_popup(popup_id); - var last_pop = help_popup.popup[help_popup.popup.length - 1]; - if (pop == last_pop) return; // slightly odd, but no real cause for alarm - help_popup.popup.push(pop); - toggle_class(pop, "nested", true); - last_pop.style.display = "none"; - //must make the popup visible to measure it or it has zero width - pop.style.display = "block"; - position_popup(help_popup.activator, pop); -} - -/* - * help_return - * - * Intended for links within a help popup. Stores a stack of state so - * you can go back. - */ -function help_return() { - if (help_popup.popup == null || help_popup.popup.length == 0 || help_popup.activator == null) { - throw new Error("Can not return to a earlier help popup when one is not shown!"); - } - var last_pop = help_popup.popup.pop(); - last_pop.style.display = "none"; - var pop = (help_popup.popup.length > 0 ? help_popup.popup[help_popup.popup.length - 1] : null); - if (pop != null) { - toggle_class(pop, "nested", help_popup.popup.length > 1); - pop.style.display = "block"; - position_popup(help_popup.activator, pop); - } else { - help_popup.activator = null; - } -} - -/* - * update_scroll_pad - * - * Creates padding at the bottom of the page to allow - * scrolling of anything into view. - */ -function update_scroll_pad() { - var page, pad; - page = (document.compatMode === "CSS1Compat") ? document.documentElement : document.body; - pad = $("scrollpad"); - if (pad === null) { - pad = document.createElement("div"); - pad.id = 'scrollpad'; - document.getElementsByTagName('body')[0].appendChild(pad); - } - pad.style.height = Math.abs(page.clientHeight - 100) + "px"; -} - -function substitute_classes(node, remove, add) { - "use strict"; - var list, all, i, cls, classes; - list = node.className.split(/\s+/); - all = {}; - for (i = 0; i < list.length; i++) { - if (list[i].length > 0) all[list[i]] = true; - } - for (i = 0; i < remove.length; i++) { - if (all.hasOwnProperty(remove[i])) { - delete all[remove[i]]; - } - } - for (i = 0; i < add.length; i++) { - all[add[i]] = true; - } - classes = ""; - for (cls in all) { - classes += cls + " "; - } - node.className = classes; -} - -/* - * toggle_class - * - * Adds or removes a class from the node. If the parameter 'enabled' is not - * passed then the existence of the class will be toggled, otherwise it will be - * included if enabled is true. - */ -function toggle_class(node, cls, enabled) { - var classes = node.className; - var list = classes.replace(/^\s+/, '').replace(/\s+$/, '').split(/\s+/); - var found = false; - for (var i = 0; i < list.length; i++) { - if (list[i] == cls) { - list.splice(i, 1); - i--; - found = true; - } - } - if (typeof enabled == "undefined") { - if (!found) list.push(cls); - } else { - if (enabled) list.push(cls); - } - node.className = list.join(" "); -} - -/* - * find_child - * - * Searches child nodes in depth first order and returns the first it finds - * with the className specified. - * TODO replace with querySelector - */ -function find_child(node, className) { - var pattern; - if (node == null || typeof node !== "object") { - return null; - } - if (typeof className === "string") { - pattern = new RegExp("\\b" + className + "\\b"); - } else { - pattern = className; - } - if (node.nodeType == Node.ELEMENT_NODE && - pattern.test(node.className)) { - return node; - } else { - var result = null; - for (var i = 0; i < node.childNodes.length; i++) { - result = find_child(node.childNodes[i], pattern); - if (result != null) break; - } - return result; - } -} - -/* - * find_parent - * - * Searches parent nodes outwards from the node and returns the first it finds - * with the className specified. - */ -function find_parent(node, className) { - var pattern; - pattern = new RegExp("\\b" + className + "\\b"); - do { - if (node.nodeType == Node.ELEMENT_NODE && - pattern.test(node.className)) { - return node; - } - } while (node = node.parentNode); - return null; -} - -/* - * find_parent_tag - * - * Searches parent nodes outwards from the node and returns the first it finds - * with the tag name specified. HTML tags should be specified in upper case. - */ -function find_parent_tag(node, tag_name) { - do { - if (node.nodeType == Node.ELEMENT_NODE && node.tagName == tag_name) { - return node; - } - } while (node = node.parentNode); - return null; -} - -/* - * __toggle_help - * - * Uses the 'topic' property of the this object to - * toggle display of a help topic. - * - * This function is not intended to be called directly. - */ -function __toggle_help(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - - help_popup(this, this.getAttribute("data-topic")); -} - -function setup_help_button(button) { - "use strict"; - var topic; - if (button.hasAttribute("data-topic")) { - topic = button.getAttribute("data-topic"); - if (document.getElementById(topic) != null) { - button.tabIndex = "0"; // make keyboard selectable - button.addEventListener("click", function() { - help_popup(button, topic); - }, false); - button.addEventListener("keydown", function(e) { - // toggle only on Enter or Spacebar, let other keys do their thing - if (e.keyCode !== 13 && e.keyCode !== 32) return; - // stop a submit or something like that - e.preventDefault(); - help_popup(button, topic); - }, false); - } else { - button.style.visibility = "hidden"; - } - } - button.className += " active"; -} - -/* - * help_button - * - * Makes a help button for the passed topic. - */ -function help_button(topic) { - var btn = document.createElement("div"); - btn.className = "help"; - btn.setAttribute("data-topic", topic); - setup_help_button(btn); - return btn; -} - -/* - * prepare_download - * - * Sets the attributes of a link to setup a file download using the given content. - * If no link is provided then create one and click it. - */ -function prepare_download(content, mimetype, filename, link) { - "use strict"; - // if no link is provided then create one and click it - var click_link = false; - if (!link) { - link = document.createElement("a"); - click_link = true; - } - try { - // Use a BLOB to convert the text into a data URL. - // We could do this manually with a base 64 conversion. - // This will only be supported on modern browsers, - // hence the try block. - var blob = new Blob([content], {type: mimetype}); - var reader = new FileReader(); - reader.onloadend = function() { - // If we're lucky the browser will also support the download - // attribute which will let us suggest a file name to save the link. - // Otherwise it is likely that the filename will be unintelligible. - link.setAttribute("download", filename); - link.href = reader.result; - if (click_link) { - // must add the link to click it - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } - } - reader.readAsDataURL(blob); - } catch (error) { - if (console && console.log) console.log(error); - // probably an old browser - link.href = ""; - link.visible = false; - } -} - -/* - * add_cell - * - * Add a cell to the table row. - */ -function add_cell(row, node, cls, click_action) { - var cell = row.insertCell(row.cells.length); - if (node) cell.appendChild(node); - if (cls && cls !== "") cell.className = cls; - if (click_action) cell.addEventListener("click", click_action, false); -} - -/* - * add_header_cell - * - * Add a header cell to the table row. - */ -function add_header_cell(row, node, help_topic, cls, colspan) { - var th = document.createElement("th"); - if (node) th.appendChild(node); - if (help_topic && help_topic !== "") th.appendChild(help_button(help_topic)); - if (cls && cls !== "") th.className = cls; - if (typeof colspan == "number" && colspan > 1) th.colSpan = colspan; - row.appendChild(th); -} - -/* - * add_text_cell - * - * Add a text cell to the table row. - */ -function add_text_cell(row, text, cls, action) { - var node = null; - if (typeof(text) != 'undefined') node = document.createTextNode(text); - add_cell(row, node, cls, action); -} - -/* - * add_text_header_cell - * - * Add a text header cell to the table row. - */ -function add_text_header_cell(row, text, help_topic, cls, action, colspan) { - var node = null; - if (typeof(text) != 'undefined') { - var nbsp = (help_topic ? "\u00A0" : ""); - var str = "" + text; - var parts = str.split(/\n/); - if (parts.length === 1) { - if (action) { - node = document.createElement("span"); - node.appendChild(document.createTextNode(str + nbsp)); - } else { - node = document.createTextNode(str + nbsp); - } - } else { - node = document.createElement("span"); - for (var i = 0; i < parts.length; i++) { - if (i !== 0) { - node.appendChild(document.createElement("br")); - } - node.appendChild(document.createTextNode(parts[i])); - } - } - if (action) { - node.addEventListener("click", action, false); - node.style.cursor = "pointer"; - } - } - add_header_cell(row, node, help_topic, cls, colspan); -} - -function setup_help() { - "use strict"; - var help_buttons, i; - help_buttons = document.querySelectorAll(".help:not(.active)"); - for (i = 0; i < help_buttons.length; i++) { - setup_help_button(help_buttons[i]); - } -} - -function setup_scrollpad() { - "use strict"; - if (document.getElementsByTagName('body')[0].hasAttribute("data-scrollpad") && document.getElementById("scrollpad") == null) { - window.addEventListener("resize", update_scroll_pad, false); - update_scroll_pad(); - } -} - -// anon function to avoid polluting global scope -(function() { - "use strict"; - window.addEventListener("load", function load(evt) { - window.removeEventListener("load", load, false); - setup_help(); - setup_scrollpad(); - }, false); -})(); - -/* - * make_link - * - * Creates a text node and if a URL is specified it surrounds it with a link. - * If the URL doesn't begin with "http://" it automatically adds it, as - * relative links don't make much sense in this context. - */ -function make_link(text, url) { - var textNode = null; - var link = null; - if (typeof text !== "undefined" && text !== null) textNode = document.createTextNode(text); - if (typeof url === "string") { - if (url.indexOf("//") == -1) { - url = "http://" + url; - } - link = document.createElement('a'); - link.href = url; - if (textNode) link.appendChild(textNode); - return link; - } - return textNode; -} -</script> - <script> -function motif_logo_template(inputs) { - function _input(name) { - if (typeof inputs[name] === "undefined") { - throw new Error("Missing template variable: " + name); - } - return inputs[name]; - } - return ( -"%!PS-Adobe-3.0 EPSF-3.0\n" + -"%%Title: Sequence Logo : " + _input("TITLE") + "\n" + -"%%Creator: " + _input("CREATOR") + "\n" + -"%%CreationDate: " + _input("CREATIONDATE") + "\n" + -"%%BoundingBox: 0 0 " + _input("BOUNDINGWIDTH") + " " + _input("BOUNDINGHEIGHT") + " \n" + -"%%Pages: 0\n" + -"%%DocumentFonts: \n" + -"%%EndComments\n" + -"\n" + -"% ---- CONSTANTS ----\n" + -"\/cmfactor 72 2.54 div def % defines points -> cm conversion\n" + -"\/cm {cmfactor mul} bind def % defines centimeters\n" + -"\n" + -"% ---- VARIABLES ----\n" + -"\n" + -"% NA = Nucleic Acid, AA = Amino Acid\n" + -"\/logoType (" + _input("LOGOTYPE") + ") def \n" + -"\n" + -"\/logoTitle (" + _input("TITLE") + ") def\n" + -"\n" + -"% Dimensions in cm\n" + -"\/logoWidth " + _input("LOGOWIDTH") + " cm def\n" + -"\/logoHeight " + _input("LOGOLINEHEIGHT") + " cm def\n" + -"\/totalHeight " + _input("LOGOHEIGHT") + " cm def\n" + -"\n" + -"\/yaxis " + _input("YAXIS") + " def\n" + -"\/yaxisLabel (" + _input("YAXISLABEL") + ") def\n" + -"\/yaxisBits " + _input("BARBITS") + " def % bits\n" + -"\/yaxisTicBits " + _input("TICBITS") + " def\n" + -"\n" + -"\/xaxis " + _input("NUMBERING") + " def\n" + -"\/xaxisLabel (" + _input("XAXISLABEL") + ") def\n" + -"\/showEnds (" + _input("SHOWENDS") + ") def \n" + -"\n" + -"\/showFineprint true def\n" + -"\/fineprint (" + _input("FINEPRINT") + ") def\n" + -"\n" + -"\/charsPerLine " + _input("CHARSPERLINE") + " def\n" + -"\n" + -"\/showingBox " + _input("SHOWINGBOX") + " def \n" + -"\/shrinking false def % true falses\n" + -"\/shrink 1.0 def\n" + -"\/outline " + _input("OUTLINE") + " def\n" + -"\n" + -"\/IbeamFraction " + _input("ERRORBARFRACTION") + " def\n" + -"\/IbeamGray 0.50 def\n" + -"\/IbeamLineWidth 0.5 def\n" + -"\n" + -"\/fontsize " + _input("FONTSIZE") + " def\n" + -"\/titleFontsize " + _input("TITLEFONTSIZE") + " def\n" + -"\/smallFontsize " + _input("SMALLFONTSIZE") + " def\n" + -"\n" + -"\/topMargin " + _input("TOPMARGIN") + " cm def\n" + -"\/bottomMargin " + _input("BOTTOMMARGIN") + " cm def\n" + -"\n" + -"\/defaultColor [0 0 0] def \n" + -"\n" + -_input("COLORDICT") + "\n" + -"\n" + -"\/colorDict fullColourDict def\n" + -"\n" + -"% ---- DERIVED PARAMETERS ----\n" + -"\n" + -"\/leftMargin\n" + -" fontsize 3.5 mul\n" + -"\n" + -"def \n" + -"\n" + -"\/rightMargin \n" + -" %Add extra room if showing ends\n" + -" showEnds (false) eq { fontsize}{fontsize 1.5 mul} ifelse\n" + -"def\n" + -"\n" + -"\/yaxisHeight \n" + -" logoHeight \n" + -" bottomMargin sub \n" + -" topMargin sub\n" + -"def\n" + -"\n" + -"\/ticWidth fontsize 2 div def\n" + -"\n" + -"\/pointsPerBit yaxisHeight yaxisBits div def\n" + -"\n" + -"\/stackMargin 1 def\n" + -"\n" + -"% Do not add space aroung characters if characters are boxed\n" + -"\/charRightMargin \n" + -" showingBox { 0.0 } {stackMargin} ifelse\n" + -"def\n" + -"\n" + -"\/charTopMargin \n" + -" showingBox { 0.0 } {stackMargin} ifelse\n" + -"def\n" + -"\n" + -"\/charWidth\n" + -" logoWidth\n" + -" leftMargin sub\n" + -" rightMargin sub\n" + -" charsPerLine div\n" + -" charRightMargin sub\n" + -"def\n" + -"\n" + -"\/charWidth4 charWidth 4 div def\n" + -"\/charWidth2 charWidth 2 div def\n" + -"\n" + -"\/stackWidth \n" + -" charWidth charRightMargin add\n" + -"def\n" + -" \n" + -"\/numberFontsize \n" + -" fontsize charWidth lt {fontsize}{charWidth} ifelse\n" + -"def\n" + -"\n" + -"% movements to place 5'\/N and 3'\/C symbols\n" + -"\/leftEndDeltaX fontsize neg def\n" + -"\/leftEndDeltaY fontsize 1.5 mul neg def\n" + -"\/rightEndDeltaX fontsize 0.25 mul def\n" + -"\/rightEndDeltaY leftEndDeltaY def\n" + -"\n" + -"% Outline width is proporional to charWidth, \n" + -"% but no less that 1 point\n" + -"\/outlinewidth \n" + -" charWidth 32 div dup 1 gt {}{pop 1} ifelse\n" + -"def\n" + -"\n" + -"\n" + -"% ---- PROCEDURES ----\n" + -"\n" + -"\/StartLogo { \n" + -" % Save state\n" + -" save \n" + -" gsave \n" + -"\n" + -" % Print Logo Title, top center \n" + -" gsave \n" + -" SetStringFont\n" + -"\n" + -" logoWidth 2 div\n" + -" logoTitle\n" + -" stringwidth pop 2 div sub\n" + -" totalHeight\n" + -" titleFontsize sub\n" + -" moveto\n" + -"\n" + -" logoTitle\n" + -" show\n" + -" grestore\n" + -"\n" + -" % Print X-axis label, bottom center\n" + -" gsave\n" + -" SetStringFont\n" + -"\n" + -" logoWidth 2 div\n" + -" xaxisLabel\n" + -" stringwidth pop 2 div sub\n" + -" 0\n" + -" titleFontsize 3 div\n" + -" add\n" + -" moveto\n" + -"\n" + -" xaxisLabel\n" + -" show\n" + -" grestore\n" + -"\n" + -" % Show Fine Print\n" + -" showFineprint {\n" + -" gsave\n" + -" SetSmallFont\n" + -" logoWidth\n" + -" fineprint stringwidth pop sub\n" + -" smallFontsize sub\n" + -" smallFontsize 3 div\n" + -" moveto\n" + -" \n" + -" fineprint show\n" + -" grestore\n" + -" } if\n" + -"\n" + -" % Move to lower left corner of last line, first stack\n" + -" leftMargin bottomMargin translate\n" + -"\n" + -" % Move above first line ready for StartLine \n" + -" 0 totalHeight translate\n" + -"\n" + -" SetLogoFont\n" + -"} bind def\n" + -"\n" + -"\/EndLogo { \n" + -" grestore \n" + -" showpage \n" + -" restore \n" + -"} bind def\n" + -"\n" + -"\n" + -"\/StartLine { \n" + -" % move down to the bottom of the line:\n" + -" 0 logoHeight neg translate\n" + -" \n" + -" gsave \n" + -" yaxis { MakeYaxis } if\n" + -" xaxis { showEnds (true) eq {ShowLeftEnd} if } if\n" + -"} bind def\n" + -"\n" + -"\/EndLine{ \n" + -" xaxis { showEnds (true) eq {ShowRightEnd} if } if\n" + -" grestore \n" + -"} bind def\n" + -"\n" + -"\n" + -"\/MakeYaxis {\n" + -" gsave \n" + -" stackMargin neg 0 translate\n" + -" ShowYaxisBar\n" + -" ShowYaxisLabel\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/ShowYaxisBar { \n" + -" gsave \n" + -" SetStringFont\n" + -"\n" + -" \/str 10 string def % string to hold number \n" + -" \/smallgap stackMargin 2 div def\n" + -"\n" + -" % Draw first tic and bar\n" + -" gsave \n" + -" ticWidth neg 0 moveto \n" + -" ticWidth 0 rlineto \n" + -" 0 yaxisHeight rlineto\n" + -" stroke\n" + -" grestore\n" + -"\n" + -" \n" + -" % Draw the tics\n" + -" % initial increment limit proc for\n" + -" 0 yaxisTicBits yaxisBits abs %cvi\n" + -" {\/loopnumber exch def\n" + -"\n" + -" % convert the number coming from the loop to a string\n" + -" % and find its width\n" + -" loopnumber 10 str cvrs\n" + -" \/stringnumber exch def % string representing the number\n" + -"\n" + -" stringnumber stringwidth pop\n" + -" \/numberwidth exch def % width of number to show\n" + -"\n" + -" \/halfnumberheight\n" + -" stringnumber CharBoxHeight 2 div\n" + -" def\n" + -"\n" + -" numberwidth % move back width of number\n" + -" neg loopnumber pointsPerBit mul % shift on y axis\n" + -" halfnumberheight sub % down half the digit\n" + -"\n" + -" moveto % move back the width of the string\n" + -"\n" + -" ticWidth neg smallgap sub % Move back a bit more \n" + -" 0 rmoveto % move back the width of the tic \n" + -"\n" + -" stringnumber show\n" + -" smallgap 0 rmoveto % Make a small gap \n" + -"\n" + -" % now show the tic mark\n" + -" 0 halfnumberheight rmoveto % shift up again\n" + -" ticWidth 0 rlineto\n" + -" stroke\n" + -" } for\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\/ShowYaxisLabel {\n" + -" gsave\n" + -" SetStringFont\n" + -"\n" + -" % How far we move left depends on the size of\n" + -" % the tic labels.\n" + -" \/str 10 string def % string to hold number \n" + -" yaxisBits yaxisTicBits div cvi yaxisTicBits mul \n" + -" str cvs stringwidth pop\n" + -" ticWidth 1.5 mul add neg \n" + -"\n" + -"\n" + -" yaxisHeight\n" + -" yaxisLabel stringwidth pop\n" + -" sub 2 div\n" + -"\n" + -" translate\n" + -" 90 rotate\n" + -" 0 0 moveto\n" + -" yaxisLabel show\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/StartStack { % <stackNumber> startstack\n" + -" xaxis {MakeNumber}{pop} ifelse\n" + -" gsave\n" + -"} bind def\n" + -"\n" + -"\/EndStack {\n" + -" grestore\n" + -" stackWidth 0 translate\n" + -"} bind def\n" + -"\n" + -"\n" + -"% Draw a character whose height is proportional to symbol bits\n" + -"\/MakeSymbol{ % charbits character MakeSymbol\n" + -" gsave\n" + -" \/char exch def\n" + -" \/bits exch def\n" + -"\n" + -" \/bitsHeight \n" + -" bits pointsPerBit mul \n" + -" def\n" + -"\n" + -" \/charHeight \n" + -" bitsHeight charTopMargin sub\n" + -" dup \n" + -" 0.0 gt {}{pop 0.0} ifelse % if neg replace with zero \n" + -" def \n" + -" \n" + -" charHeight 0.0 gt {\n" + -" char SetColor\n" + -" charWidth charHeight char ShowChar\n" + -"\n" + -" showingBox { % Unfilled box\n" + -" 0 0 charWidth charHeight false ShowBox\n" + -" } if\n" + -"\n" + -"\n" + -" } if\n" + -"\n" + -" grestore\n" + -"\n" + -" 0 bitsHeight translate \n" + -"} bind def\n" + -"\n" + -"\n" + -"\/ShowChar { % <width> <height> <char> ShowChar\n" + -" gsave\n" + -" \/tc exch def % The character\n" + -" \/ysize exch def % the y size of the character\n" + -" \/xsize exch def % the x size of the character\n" + -"\n" + -" \/xmulfactor 1 def \n" + -" \/ymulfactor 1 def\n" + -" \/limmulfactor 0.01 def\n" + -" \/drawable true def\n" + -"\n" + -" \n" + -" % if ysize is negative, make everything upside down!\n" + -" ysize 0 lt {\n" + -" % put ysize normal in this orientation\n" + -" \/ysize ysize abs def\n" + -" xsize ysize translate\n" + -" 180 rotate\n" + -" } if\n" + -"\n" + -" shrinking {\n" + -" xsize 1 shrink sub 2 div mul\n" + -" ysize 1 shrink sub 2 div mul translate \n" + -"\n" + -" shrink shrink scale\n" + -" } if\n" + -"\n" + -" % Calculate the font scaling factors\n" + -" % Loop twice to catch small correction due to first scaling\n" + -" 2 {\n" + -" gsave\n" + -" xmulfactor ymulfactor scale\n" + -" \n" + -" ysize % desired size of character in points\n" + -" tc CharBoxHeight \n" + -" dup 0.0 ne {\n" + -" div % factor by which to scale up the character\n" + -" \/ymulfactor exch def\n" + -" } % end if\n" + -" {pop pop}\n" + -" ifelse\n" + -"\n" + -" xsize % desired size of character in points\n" + -" tc CharBoxWidth \n" + -" dup 0.0 ne {\n" + -" div % factor by which to scale up the character\n" + -" \/xmulfactor exch def\n" + -" } % end if\n" + -" {pop pop}\n" + -" ifelse\n" + -" grestore\n" + -" % if the multiplication factors get too small we need to avoid a crash\n" + -" xmulfactor limmulfactor lt {\n" + -" \/xmulfactor 1 def\n" + -" \/drawable false def\n" + -" } if\n" + -" ymulfactor limmulfactor lt {\n" + -" \/ymulfactor 1 def\n" + -" \/drawable false def\n" + -" } if\n" + -" } repeat\n" + -"\n" + -" % Adjust horizontal position if the symbol is an I\n" + -" tc (I) eq {\n" + -" charWidth 2 div % half of requested character width\n" + -" tc CharBoxWidth 2 div % half of the actual character\n" + -" sub 0 translate\n" + -" % Avoid x scaling for I \n" + -" \/xmulfactor 1 def \n" + -" } if\n" + -"\n" + -"\n" + -" % ---- Finally, draw the character\n" + -" drawable { \n" + -" newpath\n" + -" xmulfactor ymulfactor scale\n" + -"\n" + -" % Move lower left corner of character to start point\n" + -" tc CharBox pop pop % llx lly : Lower left corner\n" + -" exch neg exch neg\n" + -" moveto\n" + -"\n" + -" outline { % outline characters:\n" + -" outlinewidth setlinewidth\n" + -" tc true charpath\n" + -" gsave 1 setgray fill grestore\n" + -" clip stroke\n" + -" } { % regular characters\n" + -" tc show\n" + -" } ifelse\n" + -" } if\n" + -"\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/ShowBox { % x1 y1 x2 y2 filled ShowBox\n" + -" gsave\n" + -" \/filled exch def \n" + -" \/y2 exch def\n" + -" \/x2 exch def\n" + -" \/y1 exch def\n" + -" \/x1 exch def\n" + -" newpath\n" + -" x1 y1 moveto\n" + -" x2 y1 lineto\n" + -" x2 y2 lineto\n" + -" x1 y2 lineto\n" + -" closepath\n" + -"\n" + -" clip\n" + -" \n" + -" filled {\n" + -" fill\n" + -" }{ \n" + -" 0 setgray stroke \n" + -" } ifelse\n" + -"\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/MakeNumber { % number MakeNumber\n" + -" gsave\n" + -" SetNumberFont\n" + -" stackWidth 0 translate\n" + -" 90 rotate % rotate so the number fits\n" + -" dup stringwidth pop % find the length of the number\n" + -" neg % prepare for move\n" + -" stackMargin sub % Move back a bit\n" + -" charWidth (0) CharBoxHeight % height of numbers\n" + -" sub 2 div %\n" + -" moveto % move back to provide space\n" + -" show\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/Ibeam{ % heightInBits Ibeam\n" + -" gsave\n" + -" % Make an Ibeam of twice the given height in bits\n" + -" \/height exch pointsPerBit mul def \n" + -" \/heightDRAW height IbeamFraction mul def\n" + -"\n" + -" IbeamLineWidth setlinewidth\n" + -" IbeamGray setgray \n" + -"\n" + -" charWidth2 height neg translate\n" + -" ShowIbar\n" + -" newpath\n" + -" 0 0 moveto\n" + -" 0 heightDRAW rlineto\n" + -" stroke\n" + -" newpath\n" + -" 0 height moveto\n" + -" 0 height rmoveto\n" + -" currentpoint translate\n" + -" ShowIbar\n" + -" newpath\n" + -" 0 0 moveto\n" + -" 0 heightDRAW neg rlineto\n" + -" currentpoint translate\n" + -" stroke\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/ShowIbar { % make a horizontal bar\n" + -" gsave\n" + -" newpath\n" + -" charWidth4 neg 0 moveto\n" + -" charWidth4 0 lineto\n" + -" stroke\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/ShowLeftEnd {\n" + -" gsave\n" + -" SetStringFont\n" + -" leftEndDeltaX leftEndDeltaY moveto\n" + -" logoType (NA) eq {(5) show ShowPrime} if\n" + -" logoType (AA) eq {(N) show} if\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/ShowRightEnd { \n" + -" gsave\n" + -" SetStringFont\n" + -" rightEndDeltaX rightEndDeltaY moveto\n" + -" logoType (NA) eq {(3) show ShowPrime} if\n" + -" logoType (AA) eq {(C) show} if\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"\/ShowPrime {\n" + -" gsave\n" + -" SetPrimeFont\n" + -" (\\242) show \n" + -" grestore\n" + -"} bind def\n" + -"\n" + -" \n" + -"\/SetColor{ % <char> SetColor\n" + -" dup colorDict exch known {\n" + -" colorDict exch get aload pop setrgbcolor\n" + -" } {\n" + -" pop\n" + -" defaultColor aload pop setrgbcolor\n" + -" } ifelse \n" + -"} bind def\n" + -"\n" + -"% define fonts\n" + -"\/SetTitleFont {\/Times-Bold findfont titleFontsize scalefont setfont} bind def\n" + -"\/SetLogoFont {\/Helvetica-Bold findfont charWidth scalefont setfont} bind def\n" + -"\/SetStringFont{\/Helvetica-Bold findfont fontsize scalefont setfont} bind def\n" + -"\/SetPrimeFont {\/Symbol findfont fontsize scalefont setfont} bind def\n" + -"\/SetSmallFont {\/Helvetica findfont smallFontsize scalefont setfont} bind def\n" + -"\n" + -"\/SetNumberFont {\n" + -" \/Helvetica-Bold findfont \n" + -" numberFontsize\n" + -" scalefont\n" + -" setfont\n" + -"} bind def\n" + -"\n" + -"%Take a single character and return the bounding box\n" + -"\/CharBox { % <char> CharBox <lx> <ly> <ux> <uy>\n" + -" gsave\n" + -" newpath\n" + -" 0 0 moveto\n" + -" % take the character off the stack and use it here:\n" + -" true charpath \n" + -" flattenpath \n" + -" pathbbox % compute bounding box of 1 pt. char => lx ly ux uy\n" + -" % the path is here, but toss it away ...\n" + -" grestore\n" + -"} bind def\n" + -"\n" + -"\n" + -"% The height of a characters bounding box\n" + -"\/CharBoxHeight { % <char> CharBoxHeight <num>\n" + -" CharBox\n" + -" exch pop sub neg exch pop\n" + -"} bind def\n" + -"\n" + -"\n" + -"% The width of a characters bounding box\n" + -"\/CharBoxWidth { % <char> CharBoxHeight <num>\n" + -" CharBox\n" + -" pop exch pop sub neg \n" + -"} bind def\n" + -"\n" + -"% Set the colour scheme to be faded to indicate trimming\n" + -"\/MuteColour {\n" + -" \/colorDict mutedColourDict def\n" + -"} def\n" + -"\n" + -"% Restore the colour scheme to the normal colours\n" + -"\/RestoreColour {\n" + -" \/colorDict fullColourDict def\n" + -"} def\n" + -"\n" + -"% Draw the background for a trimmed section\n" + -"% takes the number of columns as a parameter\n" + -"\/DrawTrimBg { % <num> DrawTrimBox\n" + -" \/col exch def\n" + -" \n" + -" \/boxwidth \n" + -" col stackWidth mul \n" + -" def\n" + -" \n" + -" gsave\n" + -" 0.97 setgray\n" + -"\n" + -" newpath\n" + -" 0 0 moveto\n" + -" boxwidth 0 rlineto\n" + -" 0 yaxisHeight rlineto\n" + -" 0 yaxisHeight lineto\n" + -" closepath\n" + -" \n" + -" fill\n" + -" grestore\n" + -"} def\n" + -"\n" + -"\/DrawTrimEdge {\n" + -" gsave\n" + -" 0.2 setgray\n" + -" [2] 0 setdash\n" + -"\n" + -" newpath\n" + -" 0 0 moveto\n" + -" 0 yaxisHeight lineto\n" + -" \n" + -" stroke\n" + -"\n" + -"} def\n" + -"\n" + -"\n" + -"% Deprecated names\n" + -"\/startstack {StartStack} bind def\n" + -"\/endstack {EndStack} bind def\n" + -"\/makenumber {MakeNumber} bind def\n" + -"\/numchar { MakeSymbol } bind def\n" + -"\n" + -"%%EndProlog\n" + -"\n" + -"%%Page: 1 1\n" + -"StartLogo\n" + -"\n" + -_input("DATA") + "\n" + -"\n" + -"EndLogo\n" + -"\n" + -"%%EOF\n" - ); -}</script> - <script> -//====================================================================== -// start Alphabet object -//====================================================================== -var Alphabet = function(alphabet, background) { - "use strict"; - var i, j, sym, aliases, complement, comp_e_sym, ambigs, generate_background; - generate_background = (background == null); - if (generate_background) { - background = []; - for (i = 0; i < alphabet.ncore; i++) background[i] = 1.0 / alphabet.ncore; - } else if (alphabet.ncore != background.length) { - throw new Error("The background length does not match the alphabet length."); - } - this.name = alphabet.name; - this.like = (alphabet.like != null ? alphabet.like.toUpperCase() : null); - this.ncore = alphabet.ncore; - this.symbols = alphabet.symbols; - this.background = background; - this.genbg = generate_background; - this.encode = {}; - this.encode2core = {}; - this.complement = {}; - // check if all symbols are same case - var seen_uc = false; - var seen_lc = false; - var check_case = function (syms) { - var s, sym; - if (typeof syms === "string") { - for (s = 0; s < syms.length; s++) { - sym = syms.charAt(s); - if (sym >= 'a' && sym <= 'z') seen_lc = true; - else if (sym >= 'A' && sym <= 'Z') seen_uc = true; - } - } - }; - for (i = 0; i < this.symbols.length; i++) { - check_case(this.symbols[i].symbol); - check_case(this.symbols[i].aliases); - } - // now map symbols to indexes - var update_array = function(array, syms, index) { - var s, sym; - if (typeof syms === "string") { - for (s = 0; s < syms.length; s++) { - sym = syms.charAt(s); - array[sym] = index; - // when only a single case is used, then encode as case insensitive - if (seen_uc != seen_lc) { - if (sym >= 'a' && sym <= 'z') { - array[sym.toUpperCase()] = index; - } else if (sym >= 'A' && sym <= 'Z') { - array[sym.toLowerCase()] = index; - } - } - } - } - } - // map core symbols to index - for (i = 0; i < this.ncore; i++) { - update_array(this.encode2core, this.symbols[i].symbol, i); - update_array(this.encode, this.symbols[i].symbol, i); - update_array(this.encode2core, this.symbols[i].aliases, i); - update_array(this.encode, this.symbols[i].aliases, i); - } - // map ambigous symbols to index - ambigs = {}; - for (i = this.ncore; i < this.symbols.length; i++) { - update_array(this.encode, this.symbols[i].symbol, i); - update_array(this.encode, this.symbols[i].aliases, i); - ambigs[this.symbols[i].equals] = i; - } - // determine complements - for (i = 0; i < this.ncore; i++) { - complement = this.symbols[i].complement; - if (typeof complement === "string") { - this.complement[i] = this.encode2core[complement]; - } - } - next_symbol: - for (i = this.ncore; i < this.symbols.length; i++) { - complement = ""; - for (j = 0; j < this.symbols[i].equals.length; j++) { - comp_e_sym = this.complement[this.encode2core[this.symbols[i].equals.charAt(j)]]; - if (typeof comp_e_sym !== "number") continue next_symbol; - complement += this.symbols[comp_e_sym].symbol; - } - complement = complement.split("").sort().join(""); - if (typeof ambigs[complement] === "number") { - this.complement[i] = ambigs[complement]; - } - } - // determine case insensitivity - this.case_insensitive = true; - if (seen_uc == seen_lc) { - // when there is a mixture of cases it probably won't - // be case insensitive but we still need to check - loop: - for (i = 0; i < this.symbols.length; i++) { - sym = this.symbols[i].symbol; - if (sym >= 'A' && sym <= 'Z') { - if (this.encode[sym.toLowerCase()] != i) { - this.case_insensitive = false; - break loop; - } - } else if (sym >= 'a' && sym <= 'z') { - if (this.encode[sym.toUpperCase()] != i) { - this.case_insensitive = false; - break loop; - } - } - aliases = this.symbols[i].aliases; - if (aliases != null) { - for (j = 0; j < aliases.length; j++) { - sym = aliases.charAt(j); - if (sym >= 'A' && sym <= 'Z') { - if (this.encode[sym.toLowerCase()] != i) { - this.case_insensitive = false; - break loop; - } - } else if (sym >= 'a' && sym <= 'z') { - if (this.encode[sym.toUpperCase()] != i) { - this.case_insensitive = false; - break loop; - } - } - } - } - } - } - // normalise aliases to remove the prime symbol and eliminate - // the alternate cases when the alphabet is case insensitive - var seen, out; - for (i = 0; i < this.symbols.length; i++) { - sym = this.symbols[i].symbol; - aliases = this.symbols[i].aliases; - if (typeof aliases != "string") aliases = ""; - seen = {}; - out = []; - if (this.case_insensitive) { - sym = sym.toUpperCase(); - aliases = aliases.toUpperCase(); - } - seen[sym] = true; - for (j = 0; j < aliases.length; j++) { - if (!seen[aliases.charAt(j)]) { - seen[aliases.charAt(j)] = true; - out.push(aliases.charAt(j)); - } - } - this.symbols[i].aliases = out.sort().join(""); - } -}; -// return the name of the alphabet -Alphabet.prototype.get_alphabet_name = function() { - return this.name; -}; -// return if the alphabet can be complemented -Alphabet.prototype.has_complement = function() { - return (typeof this.symbols[0].complement === "string"); -}; -// return true if an uppercase letter has the same meaning as the lowercase form -Alphabet.prototype.is_case_insensitive = function() { - return this.case_insensitive; -}; -// return the information content of an alphabet letter -Alphabet.prototype.get_ic = function() { - return Math.log(this.ncore) / Math.LN2; -}; -// return the count of the core alphabet symbols -Alphabet.prototype.get_size_core = function() { - return this.ncore; -}; -// return the count of all alphabet symbols -Alphabet.prototype.get_size_full = function() { - return this.symbols.length; -}; -// return the symbol for the given alphabet index -Alphabet.prototype.get_symbol = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("Alphabet index out of bounds"); - } - return this.symbols[alph_index].symbol; -}; -// return the aliases for the given alphabet index -Alphabet.prototype.get_aliases = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("Alphabet index out of bounds"); - } - var sym_obj = this.symbols[alph_index]; - return (sym_obj.aliases != null ? sym_obj.aliases : ""); -}; -// return the name for the given alphabet index -Alphabet.prototype.get_name = function(alph_index) { - "use strict"; - var sym; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("Alphabet index out of bounds"); - } - sym = this.symbols[alph_index]; - return (typeof sym.name === "string" ? sym.name : sym.symbol); -}; -// return the alphabet it is like or null -Alphabet.prototype.get_like = function() { - "use strict"; - return this.like; -}; -// return the index of the complement for the given alphabet index -Alphabet.prototype.get_complement = function(alph_index) { - var comp_e_sym = this.complement[alph_index]; - if (typeof comp_e_sym === "number") { - return comp_e_sym; - } else { - return -1; - } -}; -// return a string containing the core symbols -Alphabet.prototype.get_symbols = function() { - "use strict"; - var i, core_symbols; - core_symbols = ""; - for (i = 0; i < this.ncore; i++) { - core_symbols += this.symbols[i].symbol; - } - return core_symbols; -}; -// return if the background was not a uniform generated background -Alphabet.prototype.has_bg = function() { - "use strict"; - return !this.genbg; -}; -// get the background frequency for the index -Alphabet.prototype.get_bg_freq = function(alph_index) { - "use strict"; - var freq, i, symbols; - if (alph_index >= 0) { - if (alph_index < this.ncore) { - return this.background[alph_index]; - } else if (alph_index < this.symbols.length) { - freq = 0; - symbols = this.symbols[alph_index].equals; - for (i = 0; i < symbols.length; i++) { - freq += this.background[this.encode2core[symbols.charAt(i)]]; - } - return freq; - } - } - throw new Error("The alphabet index is out of range."); -}; -// get the colour of the index -Alphabet.prototype.get_colour = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("BAD_ALPHABET_INDEX"); - } - if (typeof this.symbols[alph_index].colour != "string") { - return "black"; - } - return "#" + this.symbols[alph_index].colour; -}; -// get the rgb componets of the colour at the index -Alphabet.prototype.get_rgb = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("BAD_ALPHABET_INDEX"); - } - if (typeof this.symbols[alph_index].colour != "string") { - return {"red": 0, "green": 0, "blue": 0}; - } - var colour = this.symbols[alph_index].colour; - var red = parseInt(colour.substr(0, 2), 16) / 255; - var green = parseInt(colour.substr(2, 2), 16) / 255; - var blue = parseInt(colour.substr(4, 2), 16) / 255; - return {"red": red, "green": green, "blue": blue}; -}; -// convert a symbol into the index -Alphabet.prototype.get_index = function(letter) { - "use strict"; - var alph_index; - alph_index = this.encode[letter]; - if (typeof alph_index === "undefined") { - return -1; - } - return alph_index; -}; -// convert a symbol into the list of core indexes that it equals -Alphabet.prototype.get_indexes = function(letter) { - "use strict"; - var alph_index, comprise_str, i, comprise_list; - alph_index = this.encode[letter]; - if (typeof alph_index === "undefined") { - throw new Error("Unknown letter"); - } - comprise_str = this.symbols[alph_index].equals; - comprise_list = []; - if (typeof comprise_str == "string") { - for (i = 0; i < comprise_str.length; i++) { - comprise_list.push(this.encode2core[comprise_str.charAt(i)]); - } - } else { - comprise_list.push(alph_index); - } - return comprise_list; -}; -// check if a symbol is the primary way of representing the symbol in the alphabet -Alphabet.prototype.is_prime_symbol = function(letter) { - var alph_index; - alph_index = this.encode[letter]; - if (alph_index == null) return false; - if (this.is_case_insensitive()) { - return (this.symbols[alph_index].symbol.toUpperCase() == letter.toUpperCase()); - } else { - return (this.symbols[alph_index].symbol == letter); - } -}; -// compare 2 alphabets -Alphabet.prototype.equals = function(other) { - "use strict"; - var i, sym1, sym2; - // first check that it's actually an alphabet object - if (!(typeof other === "object" && other != null && other instanceof Alphabet)) { - return false; - } - // second shortcircuit if it's the same object - if (this === other) return true; - // compare - if (this.name !== other.name) return false; - if (this.ncore !== other.ncore) return false; - if (this.symbols.length !== other.symbols.length) return false; - for (i = 0; i < this.symbols.length; i++) { - sym1 = this.symbols[i]; - sym2 = other.symbols[i]; - if (sym1.symbol !== sym2.symbol) return false; - if (sym1.aliases !== sym2.aliases) return false; - if (sym1.name !== sym2.name) return false; - if (typeof sym1.colour !== typeof sym2.colour || - (typeof sym1.colour === "string" && typeof sym2.colour === "string" && - parseInt(sym1.colour, 16) != parseInt(sym2.colour, 16))) { - return false; - } - if (sym1.complement !== sym2.complement) return false; - if (sym1.equals !== sym2.equals) return false; - } - return true; -}; -Alphabet.prototype.check_core_subset = function(super_alph) { - var complement_same = true; - var seen_set = {}; - var sub_i, sub_symbol, super_i, super_symbol; - for (sub_i = 0; sub_i < this.ncore; sub_i++) { - sub_symbol = this.symbols[sub_i]; - super_i = super_alph.encode[sub_symbol.symbol]; - if (super_i == null) return 0; - super_symbol = super_alph.symbols[super_i]; - if (seen_set[super_i]) return 0; - seen_set[super_i] = true; - // check complement - if (sub_symbol.complement != null && super_symbol.complement != null) { - if (super_alph.encode[sub_symbol.complement] != super_alph.encode[super_symbol.complement]) { - complement_same = false; - } - } else if (sub_symbol.complement != null || super_symbol.complement != null) { - complement_same = false; - } - } - return (complement_same ? 1 : -1); -}; -// convert a sequence to its reverse complement -Alphabet.prototype.invcomp_seq = function(seq) { - "use strict"; - var syms, i, e_sym, comp_e_sym; - if (!this.has_complement()) throw new Error("Alphabet must be complementable"); - syms = seq.split(""); - for (i = 0; i < syms.length; i++) { - e_sym = this.encode[syms[i]]; - if (typeof e_sym === "undefined") { - e_sym = this.ncore; // wildcard - } - comp_e_sym = this.complement[e_sym]; - if (typeof comp_e_sym === "undefined") { - comp_e_sym = e_sym; // not complementable - } - syms[i] = this.symbols[comp_e_sym].symbol; - } - return syms.reverse().join(""); -}; -// convert the alphabet to the text version -Alphabet.prototype.as_text = function() { - "use strict"; - function name_as_text(name) { - var i, c, out; - out = "\""; - for (i = 0; i < name.length; i++) { - c = name.charAt(i); - if (c == "\"") { - out += "\\\""; - } else if (c == "/") { - out += "\\/"; - } else if (c == "\\") { - out += "\\\\"; - } else { - out += c; - } - } - out += "\""; - return out; - } - function symbol_as_text(sym) { - var out; - out = sym.symbol; - if (typeof sym.name === "string" && sym.name != sym.symbol) { - out += " " + name_as_text(sym.name); - } - if (typeof sym.colour === "string") { - out += " " + sym.colour; - } - return out; - } - var out, i, j, c, sym; - out = ""; - // output core symbols with 2 way complements - for (i = 0; i < this.ncore; i++) { - c = this.complement[i]; - if (typeof c === "number" && i < c && this.complement[c] === i) { - out += symbol_as_text(this.symbols[i]) + " ~ " + symbol_as_text(this.symbols[c]) + "\n"; - } - } - // output core symbols with no complement - for (i = 0; i < this.ncore; i++) { - if (typeof this.complement[i] === "undefined") { - out += symbol_as_text(this.symbols[i]) + "\n"; - } - } - // output ambiguous symbols that have comprising characters - for (i = this.ncore; i < this.symbols.length; i++) { - if (this.symbols[i].equals.length == 0) break; - out += symbol_as_text(this.symbols[i]) + " = " + this.symbols[i].equals + "\n"; - if (typeof this.symbols[i].aliases === "string") { - for (j = 0; j < this.symbols[i].aliases.length; j++) { - if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue; - out += this.symbols[i].aliases.charAt(j) + " = " + this.symbols[i].equals + "\n"; - } - } - } - // output aliases of core symbols - for (i = 0; i < this.ncore; i++) { - if (typeof this.symbols[i].aliases === "string") { - for (j = 0; j < this.symbols[i].aliases.length; j++) { - if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue; - out += this.symbols[i].aliases.charAt(j) + " = " + this.symbols[i].symbol + "\n"; - } - } - } - // output gap symbols - i = this.symbols.length - 1; - if (this.symbols[i].equals.length == 0) { - out += symbol_as_text(this.symbols[i]) + " =\n"; - if (typeof this.symbols[i].aliases === "string") { - for (j = 0; j < this.symbols[i].aliases.length; j++) { - if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue; - out += this.symbols[i].aliases.charAt(j) + " =\n"; - } - } - } - return out; -}; -// output the alphabet as it appears in minimal MEME format -Alphabet.prototype.as_meme = function() { - "use strict"; - function name_as_text(name) { - var i, c, out; - out = "\""; - for (i = 0; i < name.length; i++) { - c = name.charAt(i); - if (c == "\"") { - out += "\\\""; - } else if (c == "/") { - out += "\\/"; - } else if (c == "\\") { - out += "\\\\"; - } else { - out += c; - } - } - out += "\""; - return out; - } - if (this.equals(AlphStd.DNA)) { - return "ALPHABET= ACGT\n"; - } else if (this.equals(AlphStd.PROTEIN)) { - return "ALPHABET= ACDEFGHIKLMNPQRSTVWY\n"; - } else { - return "ALPHABET" + - (this.name != null ? " " + name_as_text(this.name) : "") + - (this.like != null ? " " + this.like + "-LIKE" : "") + "\n" + - this.as_text() + "END ALPHABET\n"; - } -}; - -// Returns a table showing all the letters in the alphabet -Alphabet.prototype.as_table = function() { - "use strict"; - var i, j, row, th, td, aliases, equals, sym; - var table = document.createElement("table"); - // create the core symbol header - row = table.insertRow(table.rows.length); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Symbol(s)")); - row.appendChild(th); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Name")); - row.appendChild(th); - th = document.createElement("th"); - if (this.has_complement()) { - th.appendChild(document.createTextNode("Complement")); - } - row.appendChild(th); - // list the core symbols - for (i = 0; i < this.ncore; i++) { - row = table.insertRow(table.rows.length); - td = document.createElement("td"); - if (this.symbols[i].colour != null) { - td.style.color = '#' + this.symbols[i].colour; - } - td.appendChild(document.createTextNode(this.symbols[i].symbol)); - aliases = this.get_aliases(i); - if (aliases.length > 0) { - td.appendChild(document.createTextNode(' ' + aliases.split('').join(' '))); - } - row.appendChild(td); - td = document.createElement("td"); - if (this.symbols[i].name != null) { - td.appendChild(document.createTextNode(this.symbols[i].name)); - } - row.appendChild(td); - td = document.createElement("td"); - if (this.symbols[i].complement != null) { - td.style.color = this.get_colour(this.get_index(this.symbols[i].complement)); - td.appendChild(document.createTextNode(this.symbols[i].complement)); - } - row.appendChild(td); - } - // create the ambiguous symbol header - row = table.insertRow(table.rows.length); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Symbol(s)")); - row.appendChild(th); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Name")); - row.appendChild(th); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Matches")); - row.appendChild(th); - // list the ambiguous symbols - for (i = this.ncore; i < this.symbols.length; i++) { - row = table.insertRow(table.rows.length); - td = document.createElement("td"); - if (this.symbols[i].colour != null) { - td.style.color = '#' + this.symbols[i].colour; - } - td.appendChild(document.createTextNode(this.symbols[i].symbol)); - aliases = this.get_aliases(i); - if (aliases.length > 0) { - td.appendChild(document.createTextNode(' ' + aliases.split('').join(' '))); - } - row.appendChild(td); - td = document.createElement("td"); - if (this.symbols[i].name != null) { - td.appendChild(document.createTextNode(this.symbols[i].name)); - } - row.appendChild(td); - td = document.createElement("td"); - equals = this.symbols[i].equals.split(''); - for (j = 0; j < equals.length; j++) { - if (j != 0) td.appendChild(document.createTextNode(' ')); - sym = document.createElement("span"); - sym.style.color = this.get_colour(this.get_index(equals[j])); - sym.appendChild(document.createTextNode(equals[j])); - td.appendChild(sym); - } - row.appendChild(td); - } - return table; -}; - -// returns a dictionary of the colours for EPS -Alphabet.prototype._as_eps_dict = function() { - "use strict"; - var i, sym, rgb; - var out = "/fullColourDict <<\n"; - for (i = 0; i < this.ncore; i++) { - sym = this.get_symbol(i); - sym = sym.replace(/\\/g, "\\\\"); - sym = sym.replace(/\(/g, "\\("); - sym = sym.replace(/\)/g, "\\)"); - rgb = this.get_rgb(i); - out += " (" + sym + ") [" + rgb.red.toFixed(4) + " " + rgb.green.toFixed(4) + " " + rgb.blue.toFixed(4) + "]\n"; - } - out += ">> def\n"; - out += "/mutedColourDict <<\n"; - for (i = 0; i < this.ncore; i++) { - sym = this.get_symbol(i); - sym = sym.replace(/\\/g, "\\\\"); - sym = sym.replace(/\(/g, "\\("); - sym = sym.replace(/\)/g, "\\)"); - rgb = Alphabet.lighten_colour(this.get_rgb(i)); - out += " (" + sym + ") [" + rgb.red.toFixed(4) + " " + rgb.green.toFixed(4) + " " + rgb.blue.toFixed(4) + "]\n"; - } - out += ">> def\n"; - return out; -}; - -// return the alphabet name or a list of primary symbols -Alphabet.prototype.toString = function() { - "use strict"; - if (this.name != null) { - return this.name; - } else { - return this.get_symbols(); - } -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Helper functions -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -// Convert a colour specified in RGB colourspace values into LAB colourspace -Alphabet.rgb2lab = function(rgb) { - "use strict"; - var xyzHelper, labHelper; - // XYZ helper - xyzHelper = function(value) { - if (value > 0.0445) { - value = (value + 0.055) / 1.055; - value = Math.pow(value, 2.4); - } else { - value /= 12.92; - } - value *= 100; - return value; - }; - // lab helper - labHelper = function(value) { - if (value > 0.008856) { - value = Math.pow(value, 1.0 / 3.0); - } else { - value = (7.787 * value) + (16.0 / 116.0); - } - return value; - }; - // convert into XYZ colourspace - var c1, c2, c3; - if (typeof rgb == "number") { - c1 = xyzHelper(((rgb >> 16) & 0xFF) / 255.0); - c2 = xyzHelper(((rgb >> 8) & 0xFF) / 255.0); - c3 = xyzHelper((rgb & 0xFF) / 255.0); - } else { - c1 = xyzHelper(rgb.red); - c2 = xyzHelper(rgb.green); - c3 = xyzHelper(rgb.blue); - } - var x = (c1 * 0.4124) + (c2 * 0.3576) + (c3 * 0.1805); - var y = (c1 * 0.2126) + (c2 * 0.7152) + (c3 * 0.0722); - var z = (c1 * 0.0193) + (c2 * 0.1192) + (c3 * 0.9505); - // convert into Lab colourspace - c1 = labHelper(x / 95.047); - c2 = labHelper(y / 100.0); - c3 = labHelper(z / 108.883); - var l = (116.0 * c2) - 16; - var a = 500.0 * (c1 - c2); - var b = 200.0 * (c2 - c3); - return {"l": l, "a": a, "b": b}; -}; - -// Convert a colour specified in HSV colourspace into RGB colourspace -Alphabet.hsv2rgb = function(hue, sat, value, output_object) { - // achromatic (grey) - var r = value; - var g = value; - var b = value; - if (sat != 0) { - var h = hue / 60.0; - var i = Math.floor(h); - var f = h - i; - var p = value * (1.0 - sat); - var q = value * (1.0 - (sat * f)); - var t = value * (1.0 - (sat * (1.0 - f))); - if (i == 0) { - r = value; - g = t; - b = p; - } else if (i == 1) { - r = q; - g = value; - b = p; - } else if (i == 2) { - r = p; - g = value; - b = t; - } else if (i == 3) { - r = p; - g = q; - b = value; - } else if (i == 4) { - r = t; - g = p; - b = value; - } else { - r = value; - g = p; - b = q; - } - } - if (output_object) { - return {"red": r, "green": g, "blue": b}; - } else { - return (Math.floor(r * 255) << 15) | (Math.floor(g * 255) << 8) | (Math.floor(b * 255)); - } -}; - -// Calculate a distance score between two colours in LAB colourspace -Alphabet.lab_dist = function(lab1, lab2) { - var c1 = Math.sqrt((lab1.l * lab1.l) + (lab1.a * lab1.a)); - var c2 = Math.sqrt((lab2.l * lab2.l) + (lab2.a * lab2.a)); - var dc = c1 - c2; - var dl = lab1.l - lab2.l; - var da = lab1.a - lab2.a; - var db = lab1.b - lab2.b; - // we don't want NaN due to rounding errors so fudge things a bit... - var dh = 0; - var dh_squared = (da * da) + (db * db) - (dc * dc); - if (dh_squared > 0) { - dh = Math.sqrt(dh_squared); - } - var first = dl; - var second = dc / (1.0 + (0.045 * c1)); - var third = dh / (1.0 + (0.015 * c1)); - return Math.sqrt((first * first) + (second * second) + (third * third)); -}; - -// convert an RGB value into a HSL value -Alphabet.rgb2hsl = function(rgb) { - "use strict"; - var min, max, delta, h, s, l, r, g, b; - if (typeof rgb == "number") { - r = ((rgb >> 16) & 0xFF) / 255.0; - g = ((rgb >> 8) & 0xFF) / 255.0; - b = (rgb & 0xFF) / 255.0; - } else { - r = rgb.red; - g = rgb.green; - b = rgb.blue; - } - min = Math.min(r, g, b); - max = Math.max(r, g, b); - delta = max - min; - l = min + (delta / 2); - if (max == min) { - h = 0; // achromatic (grayscale) - s = 0; - } else { - if (l > 0.5) { - s = delta / (2 - max - min); - } else { - s = delta / (max + min); - } - if (max == r) { - h = (g - b) / delta; - if (g < b) h += 6; - } else if (max == g) { - h = ((b - r) / delta) + 2; - } else { - h = ((r - g) / delta) + 4; - } - h /= 6; - } - return {"h": h, "s": s, "l": l}; -}; - -// convert a HSL value into an RGB value -Alphabet.hsl2rgb = function(hsl, output_object) { - "use strict"; - function _hue(p, q, t) { - "use strict"; - if (t < 0) t += 1; - else if (t > 1) t -= 1; - if (t < (1.0 / 6.0)) { - return p + ((q - p) * 6.0 * t); - } else if (t < 0.5) { - return q; - } else if (t < (2.0 / 3.0)) { - return p + ((q - p) * ((2.0 / 3.0) - t) * 6.0); - } else { - return p; - } - } - var r, g, b, p, q; - if (hsl.s == 0) { - // achromatic (grayscale) - r = hsl.l; - g = hsl.l; - b = hsl.l; - } else { - if (hsl.l < 0.5) { - q = hsl.l * (1 + hsl.s); - } else { - q = hsl.l + hsl.s - (hsl.l * hsl.s); - } - p = (2 * hsl.l) - q; - r = _hue(p, q, hsl.h + (1.0 / 3.0)); - g = _hue(p, q, hsl.h); - b = _hue(p, q, hsl.h - (1.0 / 3.0)); - } - if (output_object) { - return {"red": r, "green": g, "blue": b}; - } else { - return (Math.floor(r * 255) << 15) | (Math.floor(g * 255) << 8) | (Math.floor(b * 255)); - } -}; - -Alphabet.lighten_colour = function(rgb) { - "use strict"; - var hsl = Alphabet.rgb2hsl(rgb); - hsl.l += (1.0 - hsl.l) * 2 / 3; - return Alphabet.hsl2rgb(hsl, typeof rgb != "number"); -}; - -//====================================================================== -// end Alphabet object -//====================================================================== - -//====================================================================== -// start StandardAlphabet object -//====================================================================== - -// an extension of the alphabet object to support some additional fields -// only present in standard alphabets. -var StandardAlphabet = function(enum_code, enum_name, alphabet_data) { - Alphabet.apply(this, [alphabet_data]); - this.enum_code = enum_code; - this.enum_name = enum_name; -}; -StandardAlphabet.prototype = Alphabet.prototype; -StandardAlphabet.prototype.constructor = StandardAlphabet; - -// A unique code for this standard alphabet. -// This code will be a power of 2 to enable creation of bitsets for -// a selection of standard alphabets. -StandardAlphabet.prototype.get_code = function() { - return this.enum_code; -}; - -// A unique name for this standard alphabet. -// this name will be all upper case and the same as the property that -// refers to this alphabet in the AlphStd collection. -StandardAlphabet.prototype.get_enum = function() { - return this.enum_name; -}; - -//====================================================================== -// end StandardAlphabet object -//====================================================================== - -// A collection of standard alphabets. -var AlphStd = { - RNA: new StandardAlphabet(1, "RNA", { - "name": "RNA", - "like": "RNA", - "ncore": 4, - "symbols": [ - {"symbol": "A", "name": "Adenine", "colour": "CC0000"}, - {"symbol": "C", "name": "Cytosine", "colour": "0000CC"}, - {"symbol": "G", "name": "Guanine", "colour": "FFB300"}, - {"symbol": "U", "name": "Uracil", "colour": "008000", - "aliases": "T"}, - {"symbol": "N", "name": "Any base", "equals": "ACGU", "aliases": "X."}, - {"symbol": "V", "name": "Not U", "equals": "ACG"}, - {"symbol": "H", "name": "Not G", "equals": "ACU"}, - {"symbol": "D", "name": "Not C", "equals": "AGU"}, - {"symbol": "B", "name": "Not A", "equals": "CGU"}, - {"symbol": "M", "name": "Amino", "equals": "AC"}, - {"symbol": "R", "name": "Purine", "equals": "AG"}, - {"symbol": "W", "name": "Weak", "equals": "AU"}, - {"symbol": "S", "name": "Strong", "equals": "CG"}, - {"symbol": "Y", "name": "Pyrimidine", "equals": "CU"}, - {"symbol": "K", "name": "Keto", "equals": "GU"} - ] - }), - DNA: new StandardAlphabet(2, "DNA", { - "name": "DNA", - "like": "DNA", - "ncore": 4, - "symbols": [ - {"symbol": "A", "name": "Adenine", "colour": "CC0000", "complement": "T"}, - {"symbol": "C", "name": "Cytosine", "colour": "0000CC", "complement": "G"}, - {"symbol": "G", "name": "Guanine", "colour": "FFB300", "complement": "C"}, - {"symbol": "T", "name": "Thymine", "colour": "008000", "complement": "A", - "aliases": "U"}, - {"symbol": "N", "name": "Any base", "equals": "ACGT", "aliases": "X."}, - {"symbol": "V", "name": "Not T", "equals": "ACG"}, - {"symbol": "H", "name": "Not G", "equals": "ACT"}, - {"symbol": "D", "name": "Not C", "equals": "AGT"}, - {"symbol": "B", "name": "Not A", "equals": "CGT"}, - {"symbol": "M", "name": "Amino", "equals": "AC"}, - {"symbol": "R", "name": "Purine", "equals": "AG"}, - {"symbol": "W", "name": "Weak", "equals": "AT"}, - {"symbol": "S", "name": "Strong", "equals": "CG"}, - {"symbol": "Y", "name": "Pyrimidine", "equals": "CT"}, - {"symbol": "K", "name": "Keto", "equals": "GT"} - ] - }), - PROTEIN: new StandardAlphabet(4, "PROTEIN", { - "name": "Protein", - "like": "PROTEIN", - "ncore": 20, - "symbols": [ - {"symbol": "A", "name": "Alanine", "colour": "0000CC"}, - {"symbol": "C", "name": "Cysteine", "colour": "0000CC"}, - {"symbol": "D", "name": "Aspartic acid", "colour": "FF00FF"}, - {"symbol": "E", "name": "Glutamic acid", "colour": "FF00FF"}, - {"symbol": "F", "name": "Phenylalanine", "colour": "0000CC"}, - {"symbol": "G", "name": "Glycine", "colour": "FFB300"}, - {"symbol": "H", "name": "Histidine", "colour": "FFCCCC"}, - {"symbol": "I", "name": "Isoleucine", "colour": "0000CC"}, - {"symbol": "K", "name": "Lysine", "colour": "CC0000"}, - {"symbol": "L", "name": "Leucine", "colour": "0000CC"}, - {"symbol": "M", "name": "Methionine", "colour": "0000CC"}, - {"symbol": "N", "name": "Asparagine", "colour": "008000"}, - {"symbol": "P", "name": "Proline", "colour": "FFFF00"}, - {"symbol": "Q", "name": "Glutamine", "colour": "008000"}, - {"symbol": "R", "name": "Arginine", "colour": "CC0000"}, - {"symbol": "S", "name": "Serine", "colour": "008000"}, - {"symbol": "T", "name": "Threonine", "colour": "008000"}, - {"symbol": "V", "name": "Valine", "colour": "0000CC"}, - {"symbol": "W", "name": "Tryptophan", "colour": "0000CC"}, - {"symbol": "Y", "name": "Tyrosine", "colour": "33E6CC"}, - {"symbol": "X", "name": "Any amino acid", "equals": "ACDEFGHIKLMNPQRSTVWY", "aliases": "*."}, - {"symbol": "B", "name": "Asparagine or Aspartic acid", "equals": "DN"}, - {"symbol": "Z", "name": "Glutamine or Glutamic acid", "equals": "EQ"}, - {"symbol": "J", "name": "Leucine or Isoleucine", "equals": "IL"} - ] - }) -}; - -//====================================================================== -// start Symbol object -//====================================================================== -var Symbol = function(alph_index, scale, alphabet) { - "use strict"; - //variable prototype - this.symbol = alphabet.get_symbol(alph_index); - this.scale = scale; - this.colour = alphabet.get_colour(alph_index); -}; - -Symbol.prototype.get_symbol = function() { - "use strict"; - return this.symbol; -}; - -Symbol.prototype.get_scale = function() { - "use strict"; - return this.scale; -}; - -Symbol.prototype.get_colour = function() { - "use strict"; - return this.colour; -}; - -Symbol.prototype.toString = function() { - "use strict"; - return this.symbol + " " + (Math.round(this.scale*1000)/10) + "%"; -}; - -function compare_symbol(sym1, sym2) { - "use strict"; - if (sym1.get_scale() < sym2.get_scale()) { - return -1; - } else if (sym1.get_scale() > sym2.get_scale()) { - return 1; - } else { - return 0; - } -} -//====================================================================== -// end Symbol object -//====================================================================== - -//====================================================================== -// start Pspm object -//====================================================================== -var Pspm = function(matrix, name, ltrim, rtrim, nsites, evalue, pssm, alt) { - "use strict"; - var row, col, data, row_sum, delta, evalue_re; - if (typeof name !== "string") { - name = ""; - } - this.name = name; - //construct - if (matrix instanceof Pspm) { - // copy constructor - this.alph_length = matrix.alph_length; - this.motif_length = matrix.motif_length; - this.name = matrix.name; - this.alt = matrix.alt; - this.nsites = matrix.nsites; - this.evalue = matrix.evalue; - this.ltrim = matrix.ltrim; - this.rtrim = matrix.rtrim; - this.pspm = []; - for (row = 0; row < matrix.motif_length; row++) { - this.pspm[row] = []; - for (col = 0; col < matrix.alph_length; col++) { - this.pspm[row][col] = matrix.pspm[row][col]; - } - } - if (matrix.pssm != null) { - this.pssm = []; - for (row = 0; row < matrix.motif_length; row++) { - this.pspm[row] = []; - for (col = 0; col < matrix.alph_length; col++) { - this.pssm[row][col] = matrix.pssm[row][col]; - } - } - } - } else { - // check parameters - if (ltrim == null) { - ltrim = 0; - } else if (typeof ltrim !== "number" || ltrim % 1 !== 0 || ltrim < 0) { - throw new Error("ltrim must be a non-negative integer, got: " + ltrim); - } - if (rtrim == null) { - rtrim = 0; - } else if (typeof rtrim !== "number" || rtrim % 1 !== 0 || rtrim < 0) { - throw new Error("rtrim must be a non-negative integer, got: " + rtrim); - } - if (nsites != null) { - if (typeof nsites !== "number" || nsites < 0) { - throw new Error("nsites must be a positive number, got: " + nsites); - } else if (nsites == 0) { - nsites = null; - } - } - if (evalue != null) { - if (typeof evalue === "number") { - if (evalue < 0) { - throw new Error("evalue must be a non-negative number, got: " + evalue); - } - } else if (typeof evalue === "string") { - evalue_re = /^((?:[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)|inf)$/; - if (!evalue_re.test(evalue)) { - throw new Error("evalue must be a non-negative number, got: " + evalue); - } - } else { - throw new Error("evalue must be a non-negative number, got: " + evalue); - } - } - // set properties - this.name = name; - this.alt = alt; - this.nsites = nsites; - this.evalue = evalue; - this.ltrim = ltrim; - this.rtrim = rtrim; - if (typeof matrix === "string") { - // string constructor - data = parse_pspm_string(matrix); - this.alph_length = data["alph_length"]; - this.motif_length = data["motif_length"]; - this.pspm = data["pspm"]; - if (this.evalue == null) { - if (data["evalue"] != null) { - this.evalue = data["evalue"]; - } else { - this.evalue = 0; - } - } - if (this.nsites == null) { - if (typeof data["nsites"] === "number") { - this.nsites = data["nsites"]; - } else { - this.nsites = 20; - } - } - } else { - // assume pspm is a nested array - this.motif_length = matrix.length; - this.alph_length = (matrix.length > 0 ? matrix[0].length : 0); - if (this.nsites == null) { - this.nsites = 20; - } - if (this.evalue == null) { - this.evalue = 0; - } - this.pspm = []; - // copy pspm and check - for (row = 0; row < this.motif_length; row++) { - if (this.alph_length != matrix[row].length) { - throw new Error("COLUMN_MISMATCH"); - } - this.pspm[row] = []; - row_sum = 0; - for (col = 0; col < this.alph_length; col++) { - this.pspm[row][col] = matrix[row][col]; - row_sum += this.pspm[row][col]; - } - delta = 0.1; - if (isNaN(row_sum) || (row_sum > 1 && (row_sum - 1) > delta) || - (row_sum < 1 && (1 - row_sum) > delta)) { - throw new Error("INVALID_SUM"); - } - } - // copy pssm - if (pssm != null) { - this.pssm = []; - for (row = 0; row < this.motif_length; row++) { - this.pssm[row] = []; - for (col = 0; col < this.alph_length; col++) { - this.pssm[row][col] = pssm[row][col]; - } - } - } - } - } -}; - -Pspm.prototype.copy = function() { - "use strict"; - return new Pspm(this); -}; - -Pspm.prototype.reverse = function() { - "use strict"; - var x, y, temp, temp_trim; - //reverse - x = 0; - y = this.motif_length-1; - while (x < y) { - temp = this.pspm[x]; - this.pspm[x] = this.pspm[y]; - this.pspm[y] = temp; - x++; - y--; - } - // reverse pssm (if defined) - if (typeof this.pssm !== "undefined") { - //reverse - x = 0; - y = this.motif_length-1; - while (x < y) { - temp = this.pssm[x]; - this.pspm[x] = this.pssm[y]; - this.pssm[y] = temp; - x++; - y--; - } - } - //swap triming - temp_trim = this.ltrim; - this.ltrim = this.rtrim; - this.rtrim = temp_trim; - return this; //allow function chaining... -}; - -Pspm.prototype.reverse_complement = function(alphabet) { - "use strict"; - var x, y, temp, i, row, c, temp_trim; - if (this.alph_length != alphabet.get_size_core()) { - throw new Error("The alphabet size does not match the size of the pspm."); - } - if (!alphabet.has_complement()) { - throw new Error("The specified alphabet can not be complemented."); - } - // reverse motif - this.reverse(); - //complement - for (x = 0; x < this.motif_length; x++) { - row = this.pspm[x]; - for (i = 0; i < row.length; i++) { - c = alphabet.get_complement(i); - if (c < i) continue; - temp = row[i]; - row[i] = row[c]; - row[c] = temp; - } - } - // complement pssm (if defined) - if (typeof this.pssm !== "undefined") { - //complement - for (x = 0; x < this.motif_length; x++) { - row = this.pssm[x]; - for (i = 0; i < row.length; i++) { - c = alphabet.get_complement(i); - if (c < i) continue; - temp = row[i]; - row[i] = row[c]; - row[c] = temp; - } - } - } - return this; //allow function chaining... -}; - -Pspm.prototype.get_stack = function(position, alphabet, ssc) { - "use strict"; - var row, stack_ic, alphabet_ic, stack, i, sym; - if (this.alph_length != alphabet.get_size_core()) { - throw new Error("The alphabet size does not match the size of the pspm."); - } - row = this.pspm[position]; - stack_ic = this.get_stack_ic(position, alphabet); - if (ssc) stack_ic -= this.get_error(alphabet); - alphabet_ic = alphabet.get_ic(); - stack = []; - for (i = 0; i < this.alph_length; i++) { - sym = new Symbol(i, row[i]*stack_ic/alphabet_ic, alphabet); - if (sym.get_scale() <= 0) { - continue; - } - stack.push(sym); - } - stack.sort(compare_symbol); - return stack; -}; - -Pspm.prototype.get_stack_ic = function(position, alphabet) { - "use strict"; - var row, H, i; - if (this.alph_length != alphabet.get_size_core()) { - throw new Error("The alphabet size does not match the size fo the pspm."); - } - row = this.pspm[position]; - H = 0; - for (i = 0; i < this.alph_length; i++) { - if (row[i] === 0) { - continue; - } - H -= (row[i] * (Math.log(row[i]) / Math.LN2)); - } - return alphabet.get_ic() - H; -}; - -Pspm.prototype.get_error = function(alphabet) { - "use strict"; - if (this.nsites === 0) { - return 0; - } - return (alphabet.get_size_core()-1) / (2 * Math.LN2 * this.nsites); -}; - -Pspm.prototype.get_motif_length = function() { - "use strict"; - return this.motif_length; -}; - -Pspm.prototype.get_alph_length = function() { - "use strict"; - return this.alph_length; -}; - -Pspm.prototype.get_left_trim = function() { - "use strict"; - return this.ltrim; -}; - -Pspm.prototype.get_right_trim = function() { - "use strict"; - return this.rtrim; -}; - -Pspm.prototype.as_best_match = function(alphabet) { - "use strict"; - var match, odds, best_odds, best_index; - var i, j; - match = ""; - for (i = 0; i < this.motif_length; i++) { - best_index = 0; - best_odds = this.pspm[i][0] / alphabet.get_bg_freq(0); - for (j = 1; j < this.alph_length; j++) { - odds = this.pspm[i][j] / alphabet.get_bg_freq(j); - if (odds > best_odds) { - best_odds = odds; - best_index = j; - } - } - match += alphabet.get_symbol(best_index); - } - return match; -}; - -Pspm.prototype.as_count_matrix = function() { - "use strict"; - var count, count_text, text; - var i, j; - text = ""; - for (i = 0; i < this.motif_length; i++) { - if (i !== 0) { - text += "\n"; - } - for (j = 0; j < this.alph_length; j++) { - if (j !== 0) { - text += " "; - } - count = Math.round(this.nsites * this.pspm[i][j]); - count_text = "" + count; - // pad up to length of 4 - if (count_text.length < 4) { - text += (new Array(5 - count_text.length)).join(" ") + count_text; - } else { - text += count_text; - } - } - } - return text; -}; - -Pspm.prototype.as_probability_matrix = function() { - "use strict"; - var text; - var i, j; - text = ""; - for (i = 0; i < this.motif_length; i++) { - if (i !== 0) { - text += "\n"; - } - for (j = 0; j < this.alph_length; j++) { - if (j !== 0) { - text += " "; - } - text += this.pspm[i][j].toFixed(6); - } - } - return text; -}; - -Pspm.prototype.as_score_matrix = function(alphabet, pseudo) { - "use strict"; - var me, score, out, row, col, score_text; - me = this; - if (typeof this.pssm === "undefined") { - if (!(typeof alphabet === "object" && alphabet != null && alphabet instanceof Alphabet)) { - throw new Error("The alphabet is required to generate the pssm."); - } - if (typeof pseudo === "undefined") { - pseudo = 0.01; - } else if (typeof pseudo !== "number" || pseudo < 0) { - throw new Error("Expected positive number for pseudocount"); - } - score = function(row, col) { - "use strict"; - var p, bg, p2; - p = me.pspm[row][col]; - bg = alphabet.get_bg_freq(col); - p2 = (p * me.nsites + bg * pseudo) / (me.nsites + pseudo); - return (p2 > 0 ? Math.round((Math.log(p2 / bg) / Math.LN2) * 100) : -10000); - }; - } else { - score = function(row, col) { - "use strict"; - return me.pssm[row][col]; - }; - } - out = ""; - for (row = 0; row < this.motif_length; row++) { - for (col = 0; col < this.alph_length; col++) { - if (col !== 0) { - out += " "; - } - score_text = "" + score(row, col); - // pad out to 6 characters - if (score_text.length < 6) { - out += (new Array(7 - score_text.length)).join(" ") + score_text; - } else { - out += score_text; - } - } - out += "\n"; - } - return out; -} - -Pspm.prototype.as_pspm = function() { - "use strict"; - return "letter-probability matrix: alength= " + this.alph_length + - " w= " + this.motif_length + " nsites= " + this.nsites + - " E= " + (typeof this.evalue === "number" ? - this.evalue.toExponential() : this.evalue) + "\n" + - this.as_probability_matrix(); -}; - -Pspm.prototype.as_pssm = function(alphabet, pseudo) { - "use strict"; - return "log-odds matrix: alength= " + this.alph_length + - " w= " + this.motif_length + - " E= " + (typeof this.evalue == "number" ? - this.evalue.toExponential() : this.evalue) + "\n" + - this.as_score_matrix(alphabet, pseudo); -}; - -Pspm.prototype.as_meme = function(options) { - var with_header, with_pspm, with_pssm, version, alphabet, bg_source, pseudocount, strands; - var out, alen, i; - // get the options - if (typeof options !== "object" || options === null) { - options = {}; - } - with_header = (typeof options["with_header"] === "boolean" ? options["with_header"] : false); - with_pspm = (typeof options["with_pspm"] === "boolean" ? options["with_pspm"] : false); - with_pssm = (typeof options["with_pssm"] === "boolean" ? options["with_pssm"] : false); - if (!with_pspm && !with_pssm) with_pspm = true; - if (with_header) { - if (typeof options["version"] === "string" && /^\d+(?:\.\d+){0,2}$/.test(options["version"])) { - version = options["version"]; - } else if (typeof options["version"] === "number") { - version = options["version"].toFixed(0); - } else { - version = "4"; - } - if (typeof options["strands"] === "number" && options["strands"] === 1) { - strands = 1; - } else { - strands = 2; - } - if (typeof options["bg_source"] === "string") { - bg_source = options["bg_source"]; - } else { - bg_source = "unknown source"; - } - if (typeof options["alphabet"] === "object" && options["alphabet"] != null - && options["alphabet"] instanceof Alphabet) { - alphabet = options["alphabet"]; - } else { - throw new Error("The alphabet is required to generate the header."); - } - } - // now create the output - out = ""; - if (with_header) { - out = "MEME version " + version + "\n\n"; - out += alphabet.as_meme() + "\n"; - if (alphabet.has_complement()) { // assume DNA has both strands unless otherwise specified - out += "strands: " + (strands === 1 ? "+" : "+ -") + "\n\n"; - } - out += "Background letter frequencies (from " + bg_source + "):\n"; - alen = alphabet.get_size_core(); - for (i = 0; i < alen; i++) { - if (i !== 0) { - if (i % 9 === 0) { // maximum of nine entries per line - out += "\n"; - } else { - out += " "; - } - } - out += alphabet.get_symbol(i) + " " + alphabet.get_bg_freq(i).toFixed(3); - } - } - out += "\n\n"; - out += "MOTIF " + this.name + (this.alt == null ? "" : " " + this.alt); - if (with_pssm) { - out += "\n\n"; - out += this.as_pssm(options["alphabet"], options["pseudocount"]); - } - if (with_pspm) { - out += "\n\n"; - out += this.as_pspm(); - } - return out; -} - -Pspm.prototype.toString = function() { - "use strict"; - var str, i, row; - str = ""; - for (i = 0; i < this.pspm.length; i++) { - row = this.pspm[i]; - str += row.join("\t") + "\n"; - } - return str; -}; - -function parse_pspm_properties(str) { - "use strict"; - var parts, i, eqpos, before, after, properties, prop, num, num_re; - num_re = /^((?:[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)|inf)$/; - parts = trim(str).split(/\s+/); - // split up words containing = - for (i = 0; i < parts.length;) { - eqpos = parts[i].indexOf("="); - if (eqpos != -1) { - before = parts[i].substr(0, eqpos); - after = parts[i].substr(eqpos+1); - if (before.length > 0 && after.length > 0) { - parts.splice(i, 1, before, "=", after); - i += 3; - } else if (before.length > 0) { - parts.splice(i, 1, before, "="); - i += 2; - } else if (after.length > 0) { - parts.splice(i, 1, "=", after); - i += 2; - } else { - parts.splice(i, 1, "="); - i++; - } - } else { - i++; - } - } - properties = {}; - for (i = 0; i < parts.length; i += 3) { - if (parts.length - i < 3) { - throw new Error("Expected PSPM property was incomplete. "+ - "Remaing parts are: " + parts.slice(i).join(" ")); - } - if (parts[i+1] !== "=") { - throw new Error("Expected '=' in PSPM property between key and " + - "value but got " + parts[i+1]); - } - prop = parts[i].toLowerCase(); - num = parts[i+2]; - if (!num_re.test(num)) { - throw new Error("Expected numeric value for PSPM property '" + - prop + "' but got '" + num + "'"); - } - properties[prop] = num; - } - return properties; -} - -function parse_pspm_string(pspm_string) { - "use strict"; - var header_re, lines, first_line, line_num, col_num, alph_length, - motif_length, nsites, evalue, pspm, i, line, match, props, parts, - j, prob; - header_re = /^letter-probability\s+matrix:(.*)$/i; - lines = pspm_string.split(/\n/); - first_line = true; - line_num = 0; - col_num = 0; - alph_length; - motif_length; - nsites; - evalue; - pspm = []; - for (i = 0; i < lines.length; i++) { - line = trim(lines[i]); - if (line.length === 0) { - continue; - } - // check the first line for a header though allow matrices without it - if (first_line) { - first_line = false; - match = header_re.exec(line); - if (match !== null) { - props = parse_pspm_properties(match[1]); - if (props.hasOwnProperty("alength")) { - alph_length = parseFloat(props["alength"]); - if (alph_length != 4 && alph_length != 20) { - throw new Error("PSPM property alength should be 4 or 20" + - " but got " + alph_length); - } - } - if (props.hasOwnProperty("w")) { - motif_length = parseFloat(props["w"]); - if (motif_length % 1 !== 0 || motif_length < 1) { - throw new Error("PSPM property w should be an integer larger " + - "than zero but got " + motif_length); - } - } - if (props.hasOwnProperty("nsites")) { - nsites = parseFloat(props["nsites"]); - if (nsites <= 0) { - throw new Error("PSPM property nsites should be larger than " + - "zero but got " + nsites); - } - } - if (props.hasOwnProperty("e")) { - evalue = props["e"]; - if (evalue < 0) { - throw new Error("PSPM property evalue should be " + - "non-negative but got " + evalue); - } - } - continue; - } - } - pspm[line_num] = []; - col_num = 0; - parts = line.split(/\s+/); - for (j = 0; j < parts.length; j++) { - prob = parseFloat(parts[j]); - if (prob != parts[j] || prob < 0 || prob > 1) { - throw new Error("Expected probability but got '" + parts[j] + "'"); - } - pspm[line_num][col_num] = prob; - col_num++; - } - line_num++; - } - if (typeof motif_length === "number") { - if (pspm.length != motif_length) { - throw new Error("Expected PSPM to have a motif length of " + - motif_length + " but it was actually " + pspm.length); - } - } else { - motif_length = pspm.length; - } - if (typeof alph_length !== "number") { - alph_length = pspm[0].length; - if (alph_length != 4 && alph_length != 20) { - throw new Error("Expected length of first row in the PSPM to be " + - "either 4 or 20 but got " + alph_length); - } - } - for (i = 0; i < pspm.length; i++) { - if (pspm[i].length != alph_length) { - throw new Error("Expected PSPM row " + i + " to have a length of " + - alph_length + " but the length was " + pspm[i].length); - } - } - return {"pspm": pspm, "motif_length": motif_length, - "alph_length": alph_length, "nsites": nsites, "evalue": evalue}; -} -//====================================================================== -// end Pspm object -//====================================================================== - -//====================================================================== -// start Logo object -//====================================================================== - -var Logo = function(alphabet, options) { - "use strict"; - this.alphabet = alphabet; - this.fine_text = ""; - this.x_axis = 1; - this.y_axis = true; - this.xlate_nsyms = 1; - this.xlate_start = null; - this.xlate_end = null; - this.pspm_list = []; - this.pspm_column = []; - this.rows = 0; - this.columns = 0; - if (typeof options === "string") { - // the old method signature had fine_text here so we support that - this.fine_text = options; - } else if (typeof options === "object" && options != null) { - this.fine_text = (typeof options.fine_text === "string" ? options.fine_text : ""); - this.x_axis = (typeof options.x_axis === "boolean" ? (options.x_axis ? 1 : 0) : 1); - if (options.x_axis_hidden != null && options.x_axis_hidden) this.x_axis = -1; - this.y_axis = (typeof options.y_axis === "boolean" ? options.y_axis : true); - this.xlate_nsyms = (typeof options.xlate_nsyms === "number" ? options.xlate_nsyms : this.xlate_nsyms); - this.xlate_start = (typeof options.xlate_start === "number" ? options.xlate_start : this.xlate_start); - this.xlate_end = (typeof options.xlate_end === "number" ? options.xlate_end : this.xlate_end); - } -}; - -Logo.prototype.add_pspm = function(pspm, column) { - "use strict"; - var col; - if (typeof column === "undefined") { - column = 0; - } else if (column < 0) { - throw new Error("Column index out of bounds."); - } - this.pspm_list[this.rows] = pspm; - this.pspm_column[this.rows] = column; - this.rows++; - col = column + pspm.get_motif_length(); - if (col > this.columns) { - this.columns = col; - } -}; - -Logo.prototype.get_columns = function() { - "use strict"; - return this.columns; -}; - -Logo.prototype.get_xlate_nsyms = function() { - "use strict"; - return this.xlate_nsyms; -}; - -Logo.prototype.get_xlate_start = function() { - "use strict"; - return (this.xlate_start != null ? this.xlate_start : 0); -}; - -Logo.prototype.get_xlate_end = function() { - "use strict"; - return (this.xlate_end != null ? this.xlate_end : this.columns * this.xlate_nsyms); -}; - -Logo.prototype.get_xlate_columns = function() { - "use strict"; - return this.get_xlate_end() - this.get_xlate_start(); -}; - -Logo.prototype.get_rows = function() { - "use strict"; - return this.rows; -}; - -Logo.prototype.get_pspm = function(row_index) { - "use strict"; - if (row_index < 0 || row_index >= this.rows) { - throw new Error("INDEX_OUT_OF_BOUNDS"); - } - return this.pspm_list[row_index]; -}; - -Logo.prototype.get_offset = function(row_index) { - "use strict"; - if (row_index < 0 || row_index >= this.rows) { - throw new Error("INDEX_OUT_OF_BOUNDS"); - } - return this.pspm_column[row_index]; -}; - -Logo.prototype._as_eps_data = function(ssc, errbars) { - var i, j, pos, stack_pos, pspm, stack, sym, out; - out = ""; - for (i = 0; i < this.rows; i++) { - out += "\nStartLine\n"; - // Indent - for (j = 0; j < this.pspm_column[i]; j++) { - out += "() startstack\nendstack\n\n"; - } - pspm = this.pspm_list[i]; - if (pspm.get_left_trim() > 0) { - out += "MuteColour\nDrawTrimEdge\n" + pspm.get_left_trim() + " DrawTrimBg\n"; - } - for (pos = 0; pos < pspm.get_motif_length(); pos++) { - if (pos != 0 && pos == pspm.get_left_trim()) { // enable full colour - out += "DrawTrimEdge\nRestoreColour\n"; - } else if (pos == (pspm.get_motif_length() - pspm.get_right_trim())) { - out += "MuteColour\n" + pspm.get_right_trim() + " DrawTrimBg\n"; - } - out += "(" + (pos + 1) + ") startstack\n"; - stack = pspm.get_stack(pos, this.alphabet, ssc); - for (stack_pos = 0; stack_pos < stack.length; stack_pos++) { - sym = stack[stack_pos]; - out += " " + (sym.get_scale() * this.alphabet.get_ic()) + " (" + sym.get_symbol() + ") numchar\n"; - } - if (errbars) { - out += " " + pspm.get_error(this.alphabet) + " Ibeam\n"; - } - out += "endstack\n\n"; - } - if (pspm.get_right_trim() > 0 || pspm.get_left_trim() == pspm.get_motif_length()) { - out += "RestoreColour\n"; - } - out += "EndLine\n"; - } - return out; -}; - -Logo.prototype.as_eps = function(options) { - "use strict"; - if (this.xlate_nsyms != 1) throw new Error("Unsupported setting xlate_nsyms for EPS"); - if (this.xlate_start != null) throw new Error("Unsupported setting xlate_start for EPS"); - if (this.xlate_end != null) throw new Error("Unsupported setting xlate_end for EPS"); - - var LOGOHEIGHT = 7.5; // default height of line in cm - var cm2pts, height, width, now, ssc, errbars; - if (typeof options === "undefined") { - options = {}; - } - cm2pts = 72 / 2.54; - if (typeof options.logo_height == "number") { - height = options.logo_height; - } else { - height = LOGOHEIGHT * this.rows; - } - if (typeof options.logo_width == "number") { - width = options.logo_width; - } else { - width = this.columns + 2; - } - now = new Date(); - ssc = (typeof options.ssc == "boolean" ? options.ssc : false); - errbars = (typeof options.show_error_bar == "boolean" ? options.show_error_bar : ssc); - var values = { - "LOGOHEIGHT": height, - "LOGOWIDTH": width, - "BOUNDINGHEIGHT": Math.round(height * cm2pts), - "BOUNDINGWIDTH": Math.round(width * cm2pts), - "LOGOLINEHEIGHT": (height / this.rows), - "CHARSPERLINE": this.columns, - "BARBITS": this.alphabet.get_ic(), - "LOGOTYPE": (this.alphabet.has_complement() ? "NA" : "AA"), - "CREATIONDATE": now.getDate() + "." + (now.getMonth() + 1) + "." + now.getFullYear() + " " + now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds(), - "ERRORBARFRACTION": (typeof options.error_bar_fraction == "number" ? options.error_bar_fraction : 1.0), - "TICBITS": (typeof options.ticbits == "number" ? options.ticbits : 1.0), - "TITLE": (typeof options.title == "string" ? options.title : ""), - "FINEPRINT": (typeof options.fineprint == "string" ? options.fineprint : this.fine_text), - "XAXISLABEL": (typeof options.xaxislabel == "string" ? options.xaxislabel : ""), - "YAXISLABEL": (typeof options.yaxislabel == "string" ? options.yaxislabel : "bits"), - "SSC": ssc, - "YAXIS": (typeof options.show_y_axis == "boolean" ? options.show_y_axis : this.y_axis), - "SHOWENDS": (typeof options.show_ends == "boolean" ? options.show_ends : false), - "ERRBAR": errbars, - "OUTLINE": (typeof options.show_outline == "boolean" ? options.show_outline : false), - "NUMBERING": (typeof options.show_numbering == "boolean" ? options.show_numbering : this.x_axis != 0), - "SHOWINGBOX": (typeof options.show_box == "boolean" ? options.show_box : false), - "CREATOR": (typeof options.creator == "string" ? options.creator : "motif_logo.js"), - "FONTSIZE": (typeof options.label_font_size == "number" ? options.label_font_size : 12), - "TITLEFONTSIZE": (typeof options.title_font_size == "number" ? options.title_font_size : 12), - "SMALLFONTSIZE": (typeof options.small_font_size == "number" ? options.small_font_size : 6), - "TOPMARGIN" : (typeof options.top_margin == "number" ? options.top_margin : 0.9), - "BOTTOMMARGIN": (typeof options.bottom_margin == "number" ? options.bottom_margin : 0.9), - "COLORDICT": this.alphabet._as_eps_dict(), - "DATA": this._as_eps_data(ssc, errbars) - }; - // now this requires that the script containing the template has been imported! - return motif_logo_template(values); -}; - -//====================================================================== -// end Logo object -//====================================================================== - -// calculate the exact size (in pixels) of an object drawn on the -// canvas assuming that the background of the canvas is transparent. -function canvas_bounds(ctx, cwidth, cheight) { - "use strict"; - var data, r, c, top_line, bottom_line, left_line, right_line, - txt_width, txt_height; - - // extract the image data - data = ctx.getImageData(0, 0, cwidth, cheight).data; - - // set initial values - top_line = -1; bottom_line = -1; left_line = -1; right_line = -1; - txt_width = 0; txt_height = 0; - - // Find the top-most line with a non-transparent pixel - for (r = 0; r < cheight; r++) { - for (c = 0; c < cwidth; c++) { - if (data[r * cwidth * 4 + c * 4 + 3]) { - top_line = r; - break; - } - } - if (top_line != -1) { - break; - } - } - - // Only bother looking if we found at least one set pixel... - if (top_line != -1) { - - //find the last line with a non-transparent pixel - for (r = cheight-1; r >= top_line; r--) { - for(c = 0; c < cwidth; c++) { - if(data[r * cwidth * 4 + c * 4 + 3]) { - bottom_line = r; - break; - } - } - if (bottom_line != -1) { - break; - } - } - // calculate height - txt_height = bottom_line - top_line + 1; - - // Find the left-most line with a non-transparent pixel - for (c = 0; c < cwidth; c++) { - for (r = top_line; r <= bottom_line; r++) { - if (data[r * cwidth * 4 + c * 4 + 3]) { - left_line = c; - break; - } - } - if (left_line != -1) { - break; - } - } - - //find the right most line with a non-transparent pixel - for (c = cwidth-1; c >= left_line; c--) { - for(r = top_line; r <= bottom_line; r++) { - if(data[r * cwidth * 4 + c * 4 + 3]) { - right_line = c; - break; - } - } - if (right_line != -1) { - break; - } - } - txt_width = right_line - left_line + 1; - } - - //return the bounds - return {bound_top: top_line, bound_bottom: bottom_line, - bound_left: left_line, bound_right: right_line, width: txt_width, - height: txt_height}; -} - -//====================================================================== -// start RasterizedAlphabet -//====================================================================== - -// Rasterize Alphabet -// 1) Measure width of text at default font for all symbols in alphabet -// 2) sort in width ascending -// 3) Drop the top and bottom 10% (designed to ignore outliers like 'W' and 'I') -// 4) Calculate the average as the maximum scaling factor (designed to stop I becoming a rectangular blob). -// 5) Assume scale of zero would result in width of zero, interpolate scale required to make perfect width font -// 6) Draw text onto temp canvas at calculated scale -// 7) Find bounds of drawn text -// 8) Paint on to another canvas at the desired height (but only scaling width to fit if larger). -var RasterizedAlphabet = function(alphabet, logo_scale, font, width) { - "use strict"; - var default_size, safety_pad, canvas, ctx, middle, baseline, widths, sizes, - i, sym, size, tenpercent, avg_width, scale, - target_width, target_height; - //variable prototypes - this.alphabet = alphabet; - this.scale = logo_scale; - this.sym_cache = {}; - this.stack_num_cache = []; - this.scale_num_cache = []; - // size of canvas - default_size = 60; // size of measuring canvas - safety_pad = 20; // pixels to pad around so we don't miss the edges - // create a canvas to do our measuring - canvas = document.createElement("canvas"); - if (!canvas.getContext) throw new Error("No canvas support"); - canvas.width = default_size + 2 * safety_pad; - canvas.height = default_size + 2 * safety_pad; - middle = Math.round(canvas.width / 2); - baseline = Math.round(canvas.height - safety_pad); - ctx = canvas.getContext('2d'); - if (!supports_text(ctx)) throw new Error("Canvas does not support text"); - ctx.font = font; - ctx.textAlign = "center"; - ctx.translate(middle, baseline); - // list of widths - widths = []; - sizes = []; - //now measure each letter in the alphabet - for (i = 0; i < alphabet.get_size_core(); ++i) { - // reset the canvas - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.fillStyle = alphabet.get_colour(i); - // draw the test text - ctx.fillText(alphabet.get_symbol(i), 0, 0); - //measure - size = canvas_bounds(ctx, canvas.width, canvas.height); - if (size.width === 0) throw new Error("Invisible symbol!"); - widths.push(size.width); - sizes[i] = size; - } - //sort the widths - widths.sort(function(a,b) {return a - b;}); - //drop 10% of the items off each end - tenpercent = Math.floor(widths.length / 10); - for (i = 0; i < tenpercent; ++i) { - widths.pop(); - widths.shift(); - } - //calculate average width - avg_width = 0; - for (i = 0; i < widths.length; ++i) { - avg_width += widths[i]; - } - avg_width /= widths.length; - // calculate the target width - target_width = width * this.scale * 2; - // calculate scales - for (i = 0; i < alphabet.get_size_core(); ++i) { - sym = alphabet.get_symbol(i); - size = sizes[i]; - // calculate scale - scale = target_width / Math.max(avg_width, size.width); - // estimate scaled height - target_height = size.height * scale; - // create an appropriately sized canvas - canvas = document.createElement("canvas"); - canvas.width = target_width; - canvas.height = target_height + safety_pad * 2; - // calculate the middle - middle = Math.round(canvas.width / 2); - // calculate the baseline - baseline = Math.round(canvas.height - safety_pad); - // get the context and prepare to draw the rasterized text - ctx = canvas.getContext('2d'); - ctx.font = font; - ctx.fillStyle = alphabet.get_colour(i); - ctx.textAlign = "center"; - ctx.translate(middle, baseline); - ctx.save(); - ctx.scale(scale, scale); - // draw the text - ctx.fillText(sym, 0, 0); - ctx.restore(); - this.sym_cache[sym] = {"image": canvas, "size": canvas_bounds(ctx, canvas.width, canvas.height)}; - } -}; - -RasterizedAlphabet.prototype.get_alphabet = function() { - return this.alphabet; -}; - -RasterizedAlphabet.prototype.get_scale = function() { - return this.scale; -}; - -RasterizedAlphabet.prototype.draw_stack_sym = function(ctx, letter, dx, dy, dWidth, dHeight) { - "use strict"; - var entry, image, size; - entry = this.sym_cache[letter]; - image = entry.image; - size = entry.size; - ctx.drawImage(image, 0, size.bound_top -1, image.width, size.height+1, dx, dy, dWidth, dHeight); -}; - -RasterizedAlphabet.prototype.draw_stack_num = function(ctx, font, stack_width, index) { - var image, image_ctx, text_length; - if (index >= this.stack_num_cache.length) { - image = document.createElement("canvas"); - // measure the text - image_ctx = image.getContext('2d'); - image_ctx.save(); - image_ctx.font = font; - text_length = image_ctx.measureText("" + (index + 1)).width; - image_ctx.restore(); - // resize the canvas to fit - image.width = Math.ceil(stack_width); - image.height = Math.ceil(text_length); - // draw the text - image_ctx = image.getContext('2d'); - image_ctx.translate(Math.round(stack_width / 2), 0); - image_ctx.font = font; - image_ctx.textBaseline = "middle"; - image_ctx.textAlign = "right"; - image_ctx.rotate(-(Math.PI / 2)); - image_ctx.fillText("" + (index + 1), 0, 0); - this.stack_num_cache[index] = image; - } else { - image = this.stack_num_cache[index]; - } - ctx.drawImage(image, 0, 0); -} - -RasterizedAlphabet.prototype.draw_scale_num = function(ctx, font, num) { - var image, image_ctx, text_size, m_length; - if (num >= this.scale_num_cache.length) { - image = document.createElement("canvas"); - // measure the text - image_ctx = image.getContext('2d'); - image_ctx.font = font; - text_size = image_ctx.measureText("" + num); - if (text_size.actualBoundingBoxAscent && text_size.actualBoundingBoxDesent) { - // resize the canvas to fit - image.width = Math.ceil(text_size.width); - image.height = Math.ceil(text_size.actualBoundingBoxAscent + text_size.actualBoundingBoxDesent); - // draw the text - image_ctx = image.getContext('2d'); - image_ctx.font = font; - image_ctx.textAlign = "right"; - image_ctx.fillText("" + num, image.width, text_size.actualBoundingBoxAscent); - } else { - // measure width of 'm' to approximate height, we double it later anyway - m_length = image_ctx.measureText("m").width; - // resize the canvas to fit - image.width = Math.ceil(text_size.width); - image.height = Math.ceil(2 * m_length); - // draw the text - image_ctx = image.getContext('2d'); - image_ctx.font = font; - image_ctx.textAlign = "right"; - image_ctx.textBaseline = "middle"; - image_ctx.fillText("" + num, image.width, m_length); - } - this.scale_num_cache[num] = image; - } else { - image = this.scale_num_cache[num]; - } - ctx.drawImage(image, -image.width, -Math.round(image.height / 2)) -} - //====================================================================== // end RasterizedAlphabet //====================================================================== - //====================================================================== // start LogoMetrics object //====================================================================== - -var LogoMetrics = function(ctx, logo_columns, logo_rows, has_names, has_finetext, x_axis, y_axis) { - "use strict"; - var i, row_height; - //variable prototypes - this.pad_top = (has_names ? 5 : 0); - this.pad_left = (y_axis ? 10 : 0); - this.pad_right = (has_finetext ? 15 : 0); - this.pad_bottom = 0; - this.pad_middle = 20; - this.name_height = 14; - this.name_font = "bold " + this.name_height + "px Times, sans-serif"; - this.name_spacer = 0; - this.y_axis = y_axis; - this.y_label = "bits"; - this.y_label_height = 12; - this.y_label_font = "bold " + this.y_label_height + "px Helvetica, sans-serif"; - this.y_label_spacer = 3; - this.y_num_height = 12; - this.y_num_width = 0; - this.y_num_font = "bold " + this.y_num_height + "px Helvetica, sans-serif"; - this.y_tic_width = 5; - this.stack_pad_left = 0; - this.stack_font = "bold 25px Helvetica, sans-serif"; - this.stack_height = 90; - this.stack_width = 26; - this.stacks_pad_right = 5; - this.x_axis = x_axis; - this.x_num_above = 2; - this.x_num_height = 12; - this.x_num_width = 0; - this.x_num_font = "bold " + this.x_num_height + "px Helvetica, sans-serif"; - this.fine_txt_height = 6; - this.fine_txt_above = 2; - this.fine_txt_font = "normal " + this.fine_txt_height + "px Helvetica, sans-serif"; - this.letter_metrics = new Array(); - this.summed_width = 0; - this.summed_height = 0; - //calculate the width of the y axis numbers - ctx.font = this.y_num_font; - for (i = 0; i <= 2; i++) { - this.y_num_width = Math.max(this.y_num_width, ctx.measureText("" + i).width); - } - //calculate the width of the x axis numbers (but they are rotated so it becomes height) - if (x_axis == 1) { - ctx.font = this.x_num_font; - for (i = 1; i <= logo_columns; i++) { - this.x_num_width = Math.max(this.x_num_width, ctx.measureText("" + i).width); - } - } else if (x_axis == 0) { - this.x_num_height = 4; - this.x_num_width = 4; - } else { - this.x_num_height = 0; - this.x_num_width = 0; - } - - //calculate how much vertical space we want to draw this - //first we add the padding at the top and bottom since that's always there - this.summed_height += this.pad_top + this.pad_bottom; - //all except the last row have the same amount of space allocated to them - if (logo_rows > 1) { - row_height = this.stack_height + this.pad_middle; - if (has_names) { - row_height += this.name_height; - //the label is allowed to overlap into the spacer - row_height += Math.max(this.y_num_height/2, this.name_spacer); - //the label is allowed to overlap the space used by the other label - row_height += Math.max(this.y_num_height/2, this.x_num_height + this.x_num_above); - } else { - row_height += this.y_num_height/2; - //the label is allowed to overlap the space used by the other label - row_height += Math.max(this.y_num_height/2, this.x_num_height + this.x_num_above); - } - this.summed_height += row_height * (logo_rows - 1); - } - //the last row has the name and fine text below it but no padding - this.summed_height += this.stack_height + (this.y_axis ? this.y_num_height/2 : 0); - - var fine_txt_total = (has_finetext ? this.fine_txt_height + this.fine_txt_above : 0); - if (has_names) { - this.summed_height += fine_txt_total + this.name_height; - this.summed_height += Math.max((this.y_axis ? this.y_num_height/2 : 0), - this.x_num_height + this.x_num_above + this.name_spacer); - } else { - this.summed_height += Math.max((this.y_axis ? this.y_num_height/2 : 0), - this.x_num_height + this.x_num_above + fine_txt_total); - } - - //calculate how much horizontal space we want to draw this - //first add the padding at the left and right since that's always there - this.summed_width += this.pad_left + this.pad_right; - if (this.y_axis) { - //add on the space for the y-axis label - this.summed_width += this.y_label_height + this.y_label_spacer; - //add on the space for the y-axis - this.summed_width += this.y_num_width + this.y_tic_width; - } - //add on the space for the stacks - this.summed_width += (this.stack_pad_left + this.stack_width) * logo_columns; - //add on the padding after the stacks (an offset from the fine text) - this.summed_width += this.stacks_pad_right; - -}; - -//====================================================================== -// end LogoMetrics object -//====================================================================== - -//found this trick at http://talideon.com/weblog/2005/02/detecting-broken-images-js.cfm -function image_ok(img) { - "use strict"; - // During the onload event, IE correctly identifies any images that - // weren't downloaded as not complete. Others should too. Gecko-based - // browsers act like NS4 in that they report this incorrectly. - if (!img.complete) { - return false; - } - // However, they do have two very useful properties: naturalWidth and - // naturalHeight. These give the true size of the image. If it failed - // to load, either of these should be zero. - if (typeof img.naturalWidth !== "undefined" && img.naturalWidth === 0) { - return false; - } - // No other way of checking: assume it's ok. - return true; -} - -function supports_text(ctx) { - "use strict"; - if (!ctx.fillText) { - return false; - } - if (!ctx.measureText) { - return false; - } - return true; -} - -//draws the scale, returns the width -function draw_scale(ctx, metrics, alphabet_ic, raster) { - "use strict"; - var tic_height, i; - tic_height = metrics.stack_height / alphabet_ic; - ctx.save(); - ctx.translate(metrics.y_label_height, metrics.y_num_height/2); - //draw the axis label - ctx.save(); - ctx.font = metrics.y_label_font; - ctx.translate(0, metrics.stack_height/2); - ctx.rotate(-(Math.PI / 2)); - ctx.textAlign = "center"; - ctx.fillText("bits", 0, 0); - ctx.restore(); - - ctx.translate(metrics.y_label_spacer + metrics.y_num_width, 0); - - //draw the axis tics - ctx.save(); - ctx.translate(0, metrics.stack_height); - for (i = 0; i <= alphabet_ic; i++) { - //draw the number - ctx.save(); - ctx.translate(-1, 0); - raster.draw_scale_num(ctx, metrics.y_num_font, i); - ctx.restore(); - //draw the tic - ctx.fillRect(0, -1, metrics.y_tic_width, 2); - //prepare for next tic - ctx.translate(0, -tic_height); - } - ctx.restore(); - - ctx.fillRect(metrics.y_tic_width - 2, 0, 2, metrics.stack_height) - - ctx.restore(); -} - -function draw_stack_num(ctx, metrics, row_index, raster) { - "use strict"; - ctx.save(); - ctx.translate(0, Math.round(metrics.stack_height + metrics.x_num_above)); - if (metrics.x_axis == 1) { - raster.draw_stack_num(ctx, metrics.x_num_font, metrics.stack_width, row_index); - } else if (metrics.x_axis == 0) { - // draw dots instead of the numbers (good for small logos) - ctx.beginPath(); - var radius = Math.round(metrics.x_num_height / 2); - ctx.arc(Math.round(metrics.stack_width / 2), radius, radius, 0, 2 * Math.PI, false); - ctx.fill(); - } - ctx.restore(); -} - -function draw_stack(ctx, metrics, symbols, raster) { - "use strict"; - var preferred_pad, sym_min, i, sym, sym_height, pad; - preferred_pad = 0; - sym_min = 5; - - ctx.save();//1 - ctx.translate(0, metrics.stack_height); - for (i = 0; i < symbols.length; i++) { - sym = symbols[i]; - sym_height = metrics.stack_height * sym.get_scale(); - - pad = preferred_pad; - if (sym_height - pad < sym_min) { - pad = Math.min(pad, Math.max(0, sym_height - sym_min)); - } - sym_height -= pad; - - //translate to the correct position - ctx.translate(0, -(pad/2 + sym_height)); - - //draw - raster.draw_stack_sym(ctx, sym.get_symbol(), 0, 0, metrics.stack_width, sym_height); - //translate past the padding - ctx.translate(0, -(pad/2)); - } - ctx.restore();//1 -} - -function draw_dashed_line(ctx, pattern, start, x1, y1, x2, y2) { - "use strict"; - var x, y, len, i, dx, dy, tlen, theta, mulx, muly, lx, ly; - dx = x2 - x1; - dy = y2 - y1; - tlen = Math.pow(dx*dx + dy*dy, 0.5); - theta = Math.atan2(dy,dx); - mulx = Math.cos(theta); - muly = Math.sin(theta); - lx = []; - ly = []; - for (i = 0; i < pattern; ++i) { - lx.push(pattern[i] * mulx); - ly.push(pattern[i] * muly); - } - i = start; - x = x1; - y = y1; - len = 0; - ctx.beginPath(); - while (len + pattern[i] < tlen) { - ctx.moveTo(x, y); - x += lx[i]; - y += ly[i]; - ctx.lineTo(x, y); - len += pattern[i]; - i = (i + 1) % pattern.length; - x += lx[i]; - y += ly[i]; - len += pattern[i]; - i = (i + 1) % pattern.length; - } - if (len < tlen) { - ctx.moveTo(x, y); - x += mulx * (tlen - len); - y += muly * (tlen - len); - ctx.lineTo(x, y); - } - ctx.stroke(); -} - -function draw_trim_background(ctx, metrics, left_start, left_end, left_divider, right_start, right_end, right_divider) { - "use strict"; - var left_size = left_end - left_start; - var right_size = right_end - right_start; - var line_x; - - ctx.save();//s8 - ctx.fillStyle = "rgb(240, 240, 240)"; - if (left_size > 0) { - ctx.fillRect(left_start * metrics.stack_width, 0, left_size * metrics.stack_width, metrics.stack_height); - } - if (right_size > 0) { - ctx.fillRect(right_start * metrics.stack_width, 0, right_size * metrics.stack_width, metrics.stack_height); - } - ctx.fillStyle = "rgb(51, 51, 51)"; - if (left_size > 0 && left_divider) { - line_x = (left_end * metrics.stack_width) - 0.5; - draw_dashed_line(ctx, [3], 0, line_x, 0, line_x, metrics.stack_height); - } - if (right_size > 0 && right_divider) { - line_x = (right_start * metrics.stack_width) + 0.5; - draw_dashed_line(ctx, [3], 0, line_x, 0, line_x, metrics.stack_height); - } - ctx.restore();//s8 -} - -function size_logo_on_canvas(logo, canvas, show_names, scale) { - "use strict"; - var draw_name, draw_finetext, metrics; - draw_name = (typeof show_names === "boolean" ? show_names : (logo.get_rows() > 1)); - draw_finetext = (logo.fine_text.length > 0); - if (canvas.width !== 0 && canvas.height !== 0) { - return; - } - metrics = new LogoMetrics(canvas.getContext('2d'), - logo.get_xlate_columns(), logo.get_rows(), draw_name, draw_finetext, logo.x_axis, logo.y_axis); - if (typeof scale == "number") { - //resize the canvas to fit the scaled logo - canvas.width = metrics.summed_width * scale; - canvas.height = metrics.summed_height * scale; - } else { - if (canvas.width === 0 && canvas.height === 0) { - canvas.width = metrics.summed_width; - canvas.height = metrics.summed_height; - } else if (canvas.width === 0) { - canvas.width = metrics.summed_width * (canvas.height / metrics.summed_height); - } else if (canvas.height === 0) { - canvas.height = metrics.summed_height * (canvas.width / metrics.summed_width); - } - } -} - -function draw_logo_on_canvas(logo, canvas, show_names, scale) { - "use strict"; - var i, draw_name, draw_finetext, ctx, metrics, raster, pspm_i, pspm, - offset, col_index, motif_position, ssc; - ssc = false; - draw_name = (typeof show_names === "boolean" ? show_names : (logo.get_rows() > 1)); - draw_finetext = (logo.fine_text.length > 0); - ctx = canvas.getContext('2d'); - //assume that the user wants the canvas scaled equally so calculate what the best width for this image should be - metrics = new LogoMetrics(ctx, logo.get_xlate_columns(), logo.get_rows(), draw_name, draw_finetext, logo.x_axis, logo.y_axis); - if (typeof scale == "number") { - //resize the canvas to fit the scaled logo - canvas.width = metrics.summed_width * scale; - canvas.height = metrics.summed_height * scale; - } else { - if (canvas.width === 0 && canvas.height === 0) { - scale = 1; - canvas.width = metrics.summed_width; - canvas.height = metrics.summed_height; - } else if (canvas.width === 0) { - scale = canvas.height / metrics.summed_height; - canvas.width = metrics.summed_width * scale; - } else if (canvas.height === 0) { - scale = canvas.width / metrics.summed_width; - canvas.height = metrics.summed_height * scale; - } else { - scale = Math.min(canvas.width / metrics.summed_width, canvas.height / metrics.summed_height); - } - } - // cache the raster based on the assumption that we will be drawing a lot - // of logos the same size and alphabet - if (typeof draw_logo_on_canvas.raster_cache === "undefined") { - draw_logo_on_canvas.raster_cache = []; - } - for (i = 0; i < draw_logo_on_canvas.raster_cache.length; i++) { - raster = draw_logo_on_canvas.raster_cache[i]; - if (raster.get_alphabet().equals(logo.alphabet) && - Math.abs(raster.get_scale() - scale) < 0.1) break; - raster = null; - } - if (raster == null) { - raster = new RasterizedAlphabet(logo.alphabet, scale, metrics.stack_font, metrics.stack_width); - draw_logo_on_canvas.raster_cache.push(raster); - } - ctx = canvas.getContext('2d'); - ctx.save();//s1 - ctx.scale(scale, scale); - ctx.save();//s2 - ctx.save();//s7 - //create margin - ctx.translate(Math.round(metrics.pad_left), Math.round(metrics.pad_top)); - for (pspm_i = 0; pspm_i < logo.get_rows(); ++pspm_i) { - pspm = logo.get_pspm(pspm_i); - offset = logo.get_offset(pspm_i); - //optionally draw name if this isn't the last row or is the only row - if (draw_name && (logo.get_rows() == 1 || pspm_i != (logo.get_rows()-1))) { - ctx.save();//s4 - ctx.translate(Math.round(metrics.summed_width/2), Math.round(metrics.name_height)); - ctx.font = metrics.name_font; - ctx.textAlign = "center"; - ctx.fillText(pspm.name, 0, 0); - ctx.restore();//s4 - ctx.translate(0, Math.round(metrics.name_height + - Math.min(0, metrics.name_spacer - metrics.y_num_height/2))); - } - //draw scale - if (logo.y_axis) draw_scale(ctx, metrics, logo.alphabet.get_ic(), raster); - ctx.save();//s5 - //translate across past the scale - if (logo.y_axis) { - ctx.translate(Math.round(metrics.y_label_height + metrics.y_label_spacer + - metrics.y_num_width + metrics.y_tic_width), Math.round(metrics.y_num_height / 2)); - } - //draw the trimming background - if (pspm.get_left_trim() > 0 || pspm.get_right_trim() > 0) { - var left_start = offset * logo.get_xlate_nsyms(); - var left_end = (offset + pspm.get_left_trim()) * logo.get_xlate_nsyms(); - var left_divider = true; - if (left_end < logo.get_xlate_start() || left_start > logo.get_xlate_end()) { - // no overlap - left_start = 0; - left_end = 0; - left_divider = false; - } else { - if (left_start < logo.get_xlate_start()) { - left_start = logo.get_xlate_start(); - } - if (left_end > logo.get_xlate_end()) { - left_end = logo.get_xlate_end(); - left_divider = false; - } - left_start -= logo.get_xlate_start(); - left_end -= logo.get_xlate_start(); - if (left_end < left_start) { - left_start = 0; - left_end = 0; - left_divider = false; - } - } - var right_end = (offset + pspm.get_motif_length()) * logo.get_xlate_nsyms(); - //var right_start = right_end - (pspm.get_left_trim() * logo.get_xlate_nsyms()); - var right_start = right_end - (pspm.get_right_trim() * logo.get_xlate_nsyms()); - var right_divider = true; - if (right_end < logo.get_xlate_start() || right_start > logo.get_xlate_end()) { - // no overlap - right_start = 0; - right_end = 0; - right_divider = false; - } else { - if (right_start < logo.get_xlate_start()) { - right_start = logo.get_xlate_start(); - right_divider = false; - } - if (right_end > logo.get_xlate_end()) { - right_end = logo.get_xlate_end(); - } - right_start -= logo.get_xlate_start(); - right_end -= logo.get_xlate_start(); - if (right_end < right_start) { - right_start = 0; - right_end = 0; - right_divider = false; - } - } - draw_trim_background(ctx, metrics, left_start, left_end, left_divider, right_start, right_end, right_divider); - } - //draw letters - var xlate_col; - for (xlate_col = logo.get_xlate_start(); xlate_col < logo.get_xlate_end(); xlate_col++) { - ctx.translate(metrics.stack_pad_left,0); - col_index = Math.floor(xlate_col / logo.get_xlate_nsyms()); - if (xlate_col % logo.get_xlate_nsyms() == 0) { - if (col_index >= offset && col_index < (offset + pspm.get_motif_length())) { - motif_position = col_index - offset; - draw_stack_num(ctx, metrics, motif_position, raster); - draw_stack(ctx, metrics, pspm.get_stack(motif_position, logo.alphabet, ssc), raster); - } - } else { - if (col_index >= offset && col_index < (offset + pspm.get_motif_length())) { - ctx.save();// s5.1 - ctx.translate(0, Math.round(metrics.stack_height)); - // TODO draw a dot or dash or something to indicate continuity of the motif - ctx.restore(); //s5.1 - } - } - ctx.translate(Math.round(metrics.stack_width), 0); - } - ctx.restore();//s5 - ////optionally draw name if this is the last row but isn't the only row - if (draw_name && (logo.get_rows() != 1 && pspm_i == (logo.get_rows()-1))) { - //translate vertically past the stack and axis's - ctx.translate(0, metrics.y_num_height/2 + metrics.stack_height + - Math.max(metrics.y_num_height/2, metrics.x_num_above + metrics.x_num_width + metrics.name_spacer)); - - ctx.save();//s6 - ctx.translate(metrics.summed_width/2, metrics.name_height); - ctx.font = metrics.name_font; - ctx.textAlign = "center"; - ctx.fillText(pspm.name, 0, 0); - ctx.restore();//s6 - ctx.translate(0, metrics.name_height); - } else { - //translate vertically past the stack and axis's - ctx.translate(0, metrics.y_num_height/2 + metrics.stack_height + - Math.max(metrics.y_num_height/2, metrics.x_num_above + metrics.x_num_width)); - } - //if not the last row then add middle padding - if (pspm_i != (logo.get_rows() -1)) { - ctx.translate(0, metrics.pad_middle); - } - } - ctx.restore();//s7 - if (logo.fine_text.length > 0) { - ctx.translate(metrics.summed_width - metrics.pad_right, metrics.summed_height - metrics.pad_bottom); - ctx.font = metrics.fine_txt_font; - ctx.textAlign = "right"; - ctx.fillText(logo.fine_text, 0,0); - } - ctx.restore();//s2 - ctx.restore();//s1 -} - -function create_canvas(c_width, c_height, c_id, c_title, c_display) { - "use strict"; - var canvas = document.createElement("canvas"); - //check for canvas support before attempting anything - if (!canvas.getContext) { - return null; - } - var ctx = canvas.getContext('2d'); - //check for html5 text drawing support - if (!supports_text(ctx)) { - return null; - } - //size the canvas - canvas.width = c_width; - canvas.height = c_height; - canvas.id = c_id; - canvas.title = c_title; - canvas.style.display = c_display; - return canvas; -} - -function logo_1(alphabet, fine_text, pspm) { - "use strict"; - var logo = new Logo(alphabet, fine_text); - logo.add_pspm(pspm); - return logo; -} - -function logo_2(alphabet, fine_text, target, query, query_offset) { - "use strict"; - var logo = new Logo(alphabet, fine_text); - if (query_offset < 0) { - logo.add_pspm(target, -query_offset); - logo.add_pspm(query); - } else { - logo.add_pspm(target); - logo.add_pspm(query, query_offset); - } - return logo; -} - -/* - * Specifies an alternate source for an image. - * If the image with the image_id specified has - * not loaded then a generated logo will be used - * to replace it. - * - * Note that the image must either have dimensions - * or a scale must be set. - */ -function alternate_logo(logo, image_id, scale) { - "use strict"; - var image = document.getElementById(image_id); - if (!image) { - alert("Can't find specified image id (" + image_id + ")"); - return; - } - //if the image has loaded then there is no reason to use the canvas - if (image_ok(image)) { - return; - } - //the image has failed to load so replace it with a canvas if we can. - var canvas = create_canvas(image.width, image.height, image_id, image.title, image.style.display); - if (canvas === null) { - return; - } - //draw the logo on the canvas - draw_logo_on_canvas(logo, canvas, null, scale); - //replace the image with the canvas - image.parentNode.replaceChild(canvas, image); -} - -/* - * Specifes that the element with the specified id - * should be replaced with a generated logo. - */ -function replace_logo(logo, replace_id, scale, title_txt, display_style) { - "use strict"; - var element = document.getElementById(replace_id); - if (!replace_id) { - alert("Can't find specified id (" + replace_id + ")"); - return; - } - //found the element! - var canvas = create_canvas(50, 120, replace_id, title_txt, display_style); - if (canvas === null) { - return; - } - //draw the logo on the canvas - draw_logo_on_canvas(logo, canvas, null, scale); - //replace the element with the canvas - element.parentNode.replaceChild(canvas, element); -} - -/* - * Fast string trimming implementation found at - * http://blog.stevenlevithan.com/archives/faster-trim-javascript - * - * Note that regex is good at removing leading space but - * bad at removing trailing space as it has to first go through - * the whole string. - */ -function trim (str) { - "use strict"; - var ws, i; - str = str.replace(/^\s\s*/, ''); - ws = /\s/; i = str.length; - while (ws.test(str.charAt(--i))); - return str.slice(0, i + 1); -} -</script> - <script> -var current_motif = 0; -var dreme_alphabet = new Alphabet(data.alphabet, data.control_db.freqs); - -/* - * Create a pspm for the given motif data - */ -function motif_pspm(m) { - return new Pspm(m.pwm, m.id, 0, 0, m.nsites, m.evalue); -} - -/* - * Create a count matrix from the given motif data - */ -function motif_count_matrix(motif) { - return motif_pspm(motif).as_count_matrix(); -} - -/* - * Create a probablity matrix from the given motif data - */ -function motif_prob_matrix(motif) { - return motif_pspm(motif).as_probability_matrix(); -} - -/* - * Create a minimal meme format motif from the given motif data - */ -function motif_minimal_meme(motif) { - return motif_pspm(motif).as_meme({ - "with_header": true, - "with_pspm": true, - "with_pssm": false, - "version": data["version"], - "alphabet": dreme_alphabet, - "strands": (data.options.revcomp ? 2 : 1) - }); -} - -/* - * Fill in a template variable - */ -function set_tvar(template, tvar, value) { - var node; - node = find_child(template, tvar); - if (node === null) { - throw new Error("Template does not contain variable " + tvar); - } - node.innerHTML = ""; - if (typeof value !== "object") { - node.appendChild(document.createTextNode(value)); - } else { - node.appendChild(value); - } -} - -/* - * Make a canvas with the motif logo drawn on it. - */ -function make_logo(motif, height, rc) { - var pspm = new Pspm(motif["pwm"]); - if (rc) pspm = pspm.copy().reverse_complement(dreme_alphabet); - var logo = new Logo(dreme_alphabet); - logo.add_pspm(pspm, 0); - var canvas = document.createElement('canvas'); - canvas.height = height; - canvas.width = 0; - draw_logo_on_canvas(logo, canvas, false); - return canvas; -} - -/* - * Create a button designed to contain a single symbol - */ -function make_sym_btn(symbol, title, action) { - var box, sbox; - box = document.createElement("div"); - box.tabIndex = 0; - box.className = "sym_btn"; - sbox = document.createElement("span"); - if (typeof symbol == "string") { - sbox.appendChild(document.createTextNode(symbol)); - } else { - sbox.appendChild(symbol); - } - box.appendChild(sbox); - box.title = title; - box.addEventListener('click', action, false); - box.addEventListener('keydown', action, false); - return box; -} - -/* - * Create a pair of text spans with different classes. - * This is useful when using CSS to only display one of them. - */ -function text_pair(txt1, cls1, txt2, cls2) { - var container, part1, part2; - container = document.createElement("span"); - part1 = document.createElement("span"); - part1.appendChild(document.createTextNode(txt1)); - part1.className = cls1; - container.appendChild(part1); - part2 = document.createElement("span"); - part2.appendChild(document.createTextNode(txt2)); - part2.className = cls2; - container.appendChild(part2); - return container; -} - -/* - * Make a colourised sequence. - */ -function make_seq(seq) { - var i, j, letter, lbox, sbox; - sbox = document.createElement("span"); - for (i = 0; i < seq.length; i = j) { - letter = seq.charAt(i); - for (j = i+1; j < seq.length; j++) { - if (seq.charAt(j) !== letter) { - break; - } - } - lbox = document.createElement("span"); - lbox.style.color = dreme_alphabet.get_colour(dreme_alphabet.get_index(letter)); - lbox.appendChild(document.createTextNode(seq.substring(i, j))); - sbox.appendChild(lbox); - } - return sbox; -} - -/* - * Create a description element taking into account the newlines in the source text. - */ -function make_description(text) { - var i, j, lines, p; - var container = document.createElement("div"); - var paragraphs = text.split(/\n\n+/); - for (i = 0; i < paragraphs.length; i++) { - lines = paragraphs[i].split(/\n/); - p = document.createElement("p"); - p.appendChild(document.createTextNode(lines[0])); - for (j = 1; j < lines.length; j++) { - p.appendChild(document.createElement("br")); - p.appendChild(document.createTextNode(lines[j])); - } - container.appendChild(p); - } - return container; -} - -/* - * Make the table header for the discovered motifs. - */ -function make_motif_header() { - var row = document.createElement("tr"); - add_text_header_cell(row, "", "", "motif_ordinal"); - add_text_header_cell(row, "Motif", "pop_motifs_word", "motif_word"); - add_text_header_cell(row, "Logo", "pop_motifs_logo", "motif_logo"); - if (data.options.revcomp) { - add_text_header_cell(row, "RC Logo", "pop_motifs_rc_logo", "motif_logo"); - } - add_text_header_cell(row, "E-value", "pop_motifs_evalue", "motif_evalue"); - add_text_header_cell(row, "Unerased E-value", "pop_motifs_uevalue", "motif_evalue"); - add_text_header_cell(row, "More", "pop_more", "motif_more"); - add_text_header_cell(row, "Submit/Download", "pop_submit_dl", "motif_submit"); - row.className = "more"; - return row; -} - -/* - * Make a compact motif summary row for the discovered motifs. - */ -function make_motif_row(tbody, ordinal, motif) { - var row = document.createElement("tr"); - add_text_cell(row, "" + ordinal + ".", "motif_ordinal"); - add_text_cell(row, motif["id"], "motif_word"); - add_cell(row, make_logo(motif, 50, false), "motif_logo"); - if (data.options.revcomp) { - add_cell(row, make_logo(motif, 50, true), "motif_logo"); - } - add_text_cell(row, motif["evalue"], "motif_evalue"); - add_text_cell(row, motif["unerased_evalue"], "motif_evalue"); - add_cell(row, make_sym_btn(text_pair("\u21A7", "less", "\u21A5", "more"), "Show more information.", function(e) { toggle_class(tbody, "collapsed"); }, "\u21A5", ""), "motif_more"); - add_cell(row, make_sym_btn("\u21E2", "Submit the motif to another MEME Suite program or download it.", function(e) { action_show_outpop(e, ordinal); }), "motif_submit"); - return row; -} - -/* - * Make a sortable table of enriched matching rows. - */ -function make_motif_words(motif) { - var row, i, match; - var table = document.createElement("table"); - var thead = document.createElement("thead"); - row = document.createElement("tr"); - add_text_header_cell(row, "Word", "pop_match_word", "match_word", function(e) {sort_table(this, compare_words);}); - add_text_header_cell(row, "Positives", "pop_match_pos", "match_count", function(e) {sort_table(this, compare_counts);}); - add_text_header_cell(row, "Negatives", "pop_match_neg", "match_count", function(e) {sort_table(this, compare_counts);}); - add_text_header_cell(row, "P-value", "pop_match_pval", "match_evalue", function(e) {sort_table(this, compare_evalues);}); - add_text_header_cell(row, "E-value", "pop_match_eval", "match_evalue", function(e) {sort_table(this, compare_evalues);}); - thead.appendChild(row); - table.appendChild(thead); - var tbody = document.createElement("tbody"); - for (i = 0; i < motif.matches.length; i++) { - match = motif.matches[i]; - row = document.createElement("tr"); - add_cell(row, make_seq(match.seq), "match_word"); - add_text_cell(row, match.p + " / " + data.sequence_db.count, "match_count"); - add_text_cell(row, match.n + " / " + data.control_db.count, "match_count"); - add_text_cell(row, match.pvalue, "match_evalue"); - add_text_cell(row, match.evalue, "match_evalue"); - tbody.appendChild(row); - } - table.appendChild(tbody); - return table; -} - -/* - * Make an expanded view of a discovered motif. - */ -function make_motif_exp(tbody, ordinal, motif) { - "use strict"; - var box, pspm, logo_box; - box = $("tmpl_motif_expanded").cloneNode(true); - toggle_class(box, "template", false); - box.id = ""; - find_child(box, "tvar_logo").appendChild(make_logo(motif, 150, false)); - if (data.options.revcomp) { - find_child(box, "tvar_rclogo").appendChild(make_logo(motif, 150, true)); - } - set_tvar(box, "tvar_p", motif["p"]); - set_tvar(box, "tvar_p_total", data.sequence_db.count); - set_tvar(box, "tvar_n", motif["n"]); - set_tvar(box, "tvar_n_total", data.control_db.count); - set_tvar(box, "tvar_pvalue", motif["pvalue"]); - set_tvar(box, "tvar_evalue", motif["evalue"]); - set_tvar(box, "tvar_uevalue", motif["unerased_evalue"]); - set_tvar(box, "tvar_words", make_motif_words(motif)); - var cell = document.createElement("td"); - cell.colSpan = 8; - cell.appendChild(box); - var row = document.createElement("tr"); - row.className = "more"; - row.appendChild(cell); - return row; -} - -/* - * Convert a string containing a scientific number into the log of that number - * without having an intermediate representation of the number. - * This is intended to avoid underflow problems with the tiny evalues that - * MEME and DREME can create. - */ -function sci2log(scinum) { - "use strict"; - var ev_re, match, sig, exp; - ev_re = /^(.*)e(.*)$/; - if (match = ev_re.exec(scinum)) { - sig = parseFloat(match[1]); - exp = parseInt(match[2]); - return Math.log(sig) + (exp * Math.log(10)); - } - return 0; -} - -/* - * Create a table of discovered motifs. A fresh table body is used for each - * motif to make hiding/showing rows with css easier. - */ -function make_motifs() { - "use strict"; - var i, row, tbody, motif, ordinal; - // make the motifs table - var container = $("motifs"); - container.innerHTML = ""; // clear content - var table = document.createElement("table"); - // add a header that is always shown - var thead = document.createElement("thead"); - thead.appendChild(make_motif_header()); - table.appendChild(thead); - for (i = 0; i < data.motifs.length; i++) { - ordinal = i + 1; - motif = data.motifs[i]; - tbody = document.createElement("tbody"); - tbody.className = "collapsed"; - tbody.appendChild(make_motif_row(tbody, ordinal, motif)); - tbody.appendChild(make_motif_exp(tbody, ordinal, motif)); - // create a following header for every row except the last one - if ((i + 1) < data.motifs.length) tbody.appendChild(make_motif_header()); - table.appendChild(tbody); - } - container.appendChild(table); -} - -/* - * Create a table showing all the alphabet symbols, their names and frequencies. - */ -function make_alpha_bg(alph, freqs) { - function colour_symbol(index) { - var span = document.createElement("span"); - span.appendChild(document.createTextNode(alph.get_symbol(index))); - span.style.color = alph.get_colour(index); - span.className = "alpha_symbol"; - return span; - } - var table, thead, tbody, row, th, span, i; - // create table - table = document.createElement("table"); - table.className = "inputs"; - // create header - thead = document.createElement("thead"); - table.appendChild(thead); - row = thead.insertRow(thead.rows.length); - if (alph.has_complement()) { - add_text_header_cell(row, "Name", "pop_alph_name"); - add_text_header_cell(row, "Bg.", "pop_alph_control"); - add_text_header_cell(row, ""); - add_text_header_cell(row, ""); - add_text_header_cell(row, ""); - add_text_header_cell(row, "Bg.", "pop_alph_control"); - add_text_header_cell(row, "Name", "pop_alph_name"); - } else { - add_text_header_cell(row, ""); - add_text_header_cell(row, "Name", "pop_alph_name"); - add_text_header_cell(row, "Bg.", "pop_alph_control"); - } - // add alphabet entries - tbody = document.createElement("tbody"); - table.appendChild(tbody); - if (alph.has_complement()) { - for (i = 0; i < alph.get_size_core(); i++) { - var c = alph.get_complement(i); - if (i > c) continue; - row = tbody.insertRow(tbody.rows.length); - add_text_cell(row, alph.get_name(i)); - add_text_cell(row, "" + freqs[i].toFixed(3)); - add_cell(row, colour_symbol(i)); - add_text_cell(row, "~"); - add_cell(row, colour_symbol(c)); - add_text_cell(row, "" + freqs[c].toFixed(3)); - add_text_cell(row, alph.get_name(c)); - } - } else { - for (i = 0; i < alph.get_size_core(); i++) { - row = tbody.insertRow(tbody.rows.length); - add_cell(row, colour_symbol(i)); - add_text_cell(row, alph.get_name(i)); - add_text_cell(row, "" + freqs[i].toFixed(3)); - } - } - return table; -} - -/* - * Updates the format download text in the popup. - * This is called when either the format or current motif changes. - */ -function update_outpop_format(index) { - var motif = data.motifs[index]; - var fn = [motif_count_matrix, motif_prob_matrix, motif_minimal_meme]; - var suffix = ["_counts.txt", "_freqs.txt", ".meme"]; - var format = parseInt($("text_format").value); - var text = fn[format](motif); - prepare_download(text, "text/plain", motif.id + suffix[format], $("outpop_text_dl")); - $("outpop_text").value = text; -} - -/* - * Updates the motif logos and format download text in the popup. - * This is called whenever the current motif changes. - */ -function update_outpop_motif(index) { - "use strict"; - var motifs, motif, pspm, logo, canvas, num; - motifs = data["motifs"]; - if (index < 0 || index >= motifs.length) {return;} - current_motif = index; - motif = motifs[index]; - pspm = new Pspm(motif["pwm"]); - logo = new Logo(dreme_alphabet, ""); - logo.add_pspm(pspm, 0); - canvas = $("outpop_logo"); - canvas.width = canvas.width; // clear canvas - draw_logo_on_canvas(logo, canvas, false); - canvas = $("outpop_logo_rc"); - canvas.width = canvas.width; // clear rc canvas - if (data.options.revcomp) { - pspm.reverse_complement(dreme_alphabet); - logo = new Logo(dreme_alphabet, ""); - logo.add_pspm(pspm, 0); - draw_logo_on_canvas(logo, canvas, false); - } - num = $("outpop_num"); - num.innerHTML = ""; - num.appendChild(document.createTextNode("" + (index + 1))); - update_outpop_format(index); -} - - -/* * Initialise and display the download popup. - */ -function action_show_outpop(e, ordinal) { - "use strict"; - function init() { - "use strict"; - var close_btn, next_btn, prev_btn, cancel_btn, do_btn; - var tab1, tab2, tab3; - var pnl1, pnl2, pnl3; - var format_list; - var tbl_submit, inputs, i, default_prog; - close_btn = $("outpop_close"); - close_btn.addEventListener("click", action_hide_outpop, false); - close_btn.addEventListener("keydown", action_hide_outpop, false); - next_btn = $("outpop_next"); - next_btn.addEventListener("click", action_outpop_next, false); - next_btn.addEventListener("keydown", action_outpop_next, false); - prev_btn = $("outpop_prev"); - prev_btn.addEventListener("click", action_outpop_prev, false); - prev_btn.addEventListener("keydown", action_outpop_prev, false); - cancel_btn = $("outpop_cancel"); - cancel_btn.addEventListener("click", action_hide_outpop, false); - do_btn = $("outpop_do"); - do_btn.addEventListener("click", action_outpop_submit, false); - tab1 = $("outpop_tab_1"); - tab1.tabIndex = 0; - tab1.addEventListener("click", action_outpop_tab, false); - tab1.addEventListener("keydown", action_outpop_tab, false); - tab2 = $("outpop_tab_2"); - tab2.tabIndex = 0; - tab2.addEventListener("click", action_outpop_tab, false); - tab2.addEventListener("keydown", action_outpop_tab, false); - tab3 = $("outpop_tab_3"); - tab3.tabIndex = 0; - tab3.addEventListener("click", action_outpop_tab, false); - tab3.addEventListener("keydown", action_outpop_tab, false); - pnl1 = $("outpop_pnl_1"); - pnl2 = $("outpop_pnl_2"); - pnl3 = $("outpop_pnl_3"); - toggle_class(tab1, "activeTab", true); - toggle_class(tab2, "activeTab", false); - toggle_class(tab3, "activeTab", false); - pnl1.style.display = "block"; - pnl2.style.display = "none"; - pnl3.style.display = "none"; - format_list = $("text_format"); - format_list.addEventListener("change", action_outpop_format, false); - // setup program selection - tbl_submit = $("programs"); - // when not dna, hide the inputs for programs that require dna motifs - toggle_class(tbl_submit, "alphabet_dna", dreme_alphabet.has_complement());//TODO FIXME alphabet_dna is a bad name for a field when allowing custom alphabets - // add a click listener for the radio buttons - inputs = tbl_submit.querySelectorAll("input[type='radio']"); - for (i = 0; i < inputs.length; i++) { - inputs[i].addEventListener("click", action_outpop_program, false); - } - // ensure that a default program option is selected for DNA and Protein - default_prog = document.getElementById(dreme_alphabet.has_complement() ? "submit_tomtom" : "submit_fimo"); - default_prog.checked = true; - action_outpop_program.call(default_prog); - // disable reverse-complement when not DNA - $("logo_rc_option").disabled = !dreme_alphabet.has_complement(); - // set errorbars on when ssc is on - $("logo_ssc").addEventListener("change", action_outpop_ssc, false); - } - // store the focused element - action_hide_outpop.last_active = document.activeElement; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - // hide the help popup - help_popup(); - // on first load initilize the popup - if (!action_show_outpop.ready) { - init(); - action_show_outpop.ready = true; - } - update_outpop_motif(ordinal - 1); - // display the download popup - $("grey_out_page").style.display = "block"; - $("download").style.display = "block"; - $("outpop_close").focus(); -} - -/* - * Hide the download popup. - */ -function action_hide_outpop(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - $("download").style.display = "none"; - $("grey_out_page").style.display = "none"; - if (typeof action_hide_outpop.last_active !== "undefined") { - action_hide_outpop.last_active.focus(); - } -} - -/* - * Show the next motif in the download popup. - */ -function action_outpop_next(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - update_outpop_motif(current_motif + 1); -} - -/* - * Show the previous motif in the download popup. - */ -function action_outpop_prev(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - update_outpop_motif(current_motif - 1); -} - -/* - * Highlight the selected row in the program list. - */ -function action_outpop_program() { - "use strict"; - var table, tr, rows, i; - tr = find_parent_tag(this, "TR"); - table = find_parent_tag(tr, "TABLE"); - rows = table.querySelectorAll("tr"); - for (i = 0; i < rows.length; i++) { - toggle_class(rows[i], "selected", rows[i] === tr); - } -} - -/* - * Enable error bars when small sample correction is enabled. - */ -function action_outpop_ssc() { - "use strict"; - $("logo_err").value = $("logo_ssc").value; -} - -/* - * Submit the motif to the selected program. - */ -function action_outpop_submit(e) { - "use strict"; - var form, input, program, motifs; - // find out which program is selected - var radios, i; - radios = document.getElementsByName("program"); - program = "fimo"; // default to fimo, since it works with all alphabet types - for (i = 0; i < radios.length; i++) { - if (radios[i].checked) program = radios[i].value; - } - - motifs = motif_minimal_meme(data.motifs[current_motif]); - form = document.createElement("form"); - form.setAttribute("method", "post"); - form.setAttribute("action", site_url + "/tools/" + program); - - input = document.createElement("input"); - input.setAttribute("type", "hidden"); - input.setAttribute("name", "motifs_embed"); - input.setAttribute("value", motifs); - form.appendChild(input); - - document.body.appendChild(form); - form.submit(); - document.body.removeChild(form); -} - -/* - * Download the format text. - * Wire the link containing the data URI text to a download button so it looks - * the same as the server submit stuff. - */ -function action_outpop_download_motif(e) { - $("outpop_text_dl").click(); -} - -/* - * Download the motif logo. - * The EPS format can be calculated locally in Javascript - */ -function action_outpop_download_logo(e) { - "use strict"; - var pspm, logo, eps; - var logo_rc, logo_ssc, logo_width, logo_height; - var motif = data.motifs[current_motif]; - if ($("logo_format").value == "0") { // EPS - logo_rc = ($("logo_rc").value == "1"); - logo_ssc = ($("logo_ssc").value == "1"); - logo_width = parseFloat($("logo_width").value); - if (isNaN(logo_width) || !isFinite(logo_width) || logo_width <= 0) logo_width = null; - logo_height = parseFloat($("logo_height").value); - if (isNaN(logo_height) || !isFinite(logo_height) || logo_height <= 0) logo_height = null; - // create a PSPM from the motif - pspm = motif_pspm(motif); - if (logo_rc) pspm.reverse_complement(dreme_alphabet); - logo = new Logo(dreme_alphabet); - logo.add_pspm(pspm, 0); - eps = logo.as_eps({"ssc": logo_ssc, "logo_width": logo_width, "logo_height": logo_height}); - prepare_download(eps, "application/postscript", motif.id + ".eps"); - } else { - $("logo_motifs").value = motif_minimal_meme(motif); - $("logo_form").submit(); - } -} - -/* - * Change the selected tab in the download popup. - */ -function action_outpop_tab(e) { - "use strict"; - var tab1, tab2, tab3, pnl1, pnl2, pnl3, do_btn; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - tab1 = $("outpop_tab_1"); - tab2 = $("outpop_tab_2"); - tab3 = $("outpop_tab_3"); - pnl1 = $("outpop_pnl_1"); - pnl2 = $("outpop_pnl_2"); - pnl3 = $("outpop_pnl_3"); - do_btn = $("outpop_do"); - - toggle_class(tab1, "activeTab", (this === tab1)); - toggle_class(tab2, "activeTab", (this === tab2)); - toggle_class(tab3, "activeTab", (this === tab3)); - pnl1.style.display = ((this === tab1) ? "block" : "none"); - pnl2.style.display = ((this === tab2) ? "block" : "none"); - pnl3.style.display = ((this === tab3) ? "block" : "none"); - do_btn.value = ((this === tab1) ? "Submit" : "Download"); - do_btn.removeEventListener("click", action_outpop_submit, false); - do_btn.removeEventListener("click", action_outpop_download_logo, false); - do_btn.removeEventListener("click", action_outpop_download_motif, false); - if (this === tab1) { - do_btn.addEventListener("click", action_outpop_submit, false); - } else if (this === tab2) { - do_btn.addEventListener("click", action_outpop_download_motif, false); - } else { - do_btn.addEventListener("click", action_outpop_download_logo, false); - } -} - -/* - * Update the text in the download format popup. - */ -function action_outpop_format() { - update_outpop_format(current_motif); -} - -/* - * Find all text nodes in the given container. - */ -function text_nodes(container) { - var textNodes = []; - var stack = [container]; - // depth first search to maintain ordering when flattened - while (stack.length > 0) { - var node = stack.pop(); - if (node.nodeType == Node.TEXT_NODE) { - textNodes.push(node); - } else { - for (var i = node.childNodes.length-1; i >= 0; i--) { - stack.push(node.childNodes[i]); - } - } - } - return textNodes; -} - -/* - * Get the text out of a specific text node. - */ -function node_text(node) { - if (node === undefined) { - return ''; - } else if (node.textContent) { - return node.textContent; - } else if (node.innerText) { - return node.innerText; - } else { - return ''; - } -} - -/* - * Get the text contained within the element. - */ -function elem_text(elem, separator) { - if (separator === undefined) separator = ''; - return text_nodes(elem).map(node_text).join(separator); -} - -/* - * Sort all rows in the first table body based on the column of the given element and the comparison function. - * The sort is not very fast and is intended for small tables only. - */ -function sort_table(colEle, compare_function) { - //find the parent of colEle that is either a td or th - var i, j; - var cell = colEle; - while (true) { - if (cell == null) return; - if (cell.nodeType == Node.ELEMENT_NODE && - (cell.tagName.toLowerCase() == "td" || cell.tagName.toLowerCase() == "th")) { - break; - } - cell = cell.parentNode; - } - //find the parent of cell that is a tr - var row = cell; - while (true) { - if (row == null) return; - if (row.nodeType == Node.ELEMENT_NODE && row.tagName.toLowerCase() == "tr") { - break; - } - row = row.parentNode; - } - //find the parent of row that is a table - var table = row; - while (true) { - if (table == null) return; - if (table.nodeType == Node.ELEMENT_NODE && table.tagName.toLowerCase() == "table") { - break; - } - table = table.parentNode; - } - var column_index = cell.cellIndex; - // do a bubble sort, because the tables are so small it doesn't matter - var change; - var trs = table.tBodies[0].getElementsByTagName('tr'); - var already_sorted = true; - var reverse = false; - while (true) { - do { - change = false; - for (i = 0; i < trs.length -1; i++) { - var v1 = elem_text(trs[i].cells[column_index]); - var v2 = elem_text(trs[i+1].cells[column_index]); - if (reverse) { - var tmp = v1; - v1 = v2; - v2 = tmp; - } - if (compare_function(v1, v2) > 0) { - exchange(trs[i], trs[i+1], table); - change = true; - already_sorted = false; - trs = table.tBodies[0].getElementsByTagName('tr'); - } - } - } while (change); - if (reverse) break;// we've sorted twice so exit - if (!already_sorted) break;// sort did something so exit - // when it's sorted one way already then sort the opposite way - reverse = true; - } - // put arrows on the headers - var headers = table.tHead.getElementsByTagName('tr'); - for (i = 0; i < headers.length; i++) { - for (j = 0; j < headers[i].cells.length; j++) { - var cell = headers[i].cells[j]; - var arrows = cell.getElementsByClassName("sort_arrow"); - var arrow; - if (arrows.length == 0) { - arrow = document.createElement("span"); - arrow.className = "sort_arrow"; - cell.insertBefore(arrow, cell.firstChild); - } else { - arrow = arrows[0]; - } - arrow.innerHTML = ""; - if (j == column_index) { - arrow.appendChild(document.createTextNode(reverse ? "\u25B2" : "\u25BC")); - } - } - } -} - -/* - * Swap two rows in a table. - */ -function exchange(oRowI, oRowJ, oTable) { - var i = oRowI.rowIndex; - var j = oRowJ.rowIndex; - if (i == j+1) { - oTable.tBodies[0].insertBefore(oRowI, oRowJ); - } if (j == i+1) { - oTable.tBodies[0].insertBefore(oRowJ, oRowI); - } else { - var tmpNode = oTable.tBodies[0].replaceChild(oRowI, oRowJ); - if(typeof(oRowI) != "undefined") { - oTable.tBodies[0].insertBefore(tmpNode, oRowI); - } else { - oTable.appendChild(tmpNode); - } - } -} - -/* - * Compare two E-values which may be very small. - */ -function compare_evalues(v1, v2) { - var e1 = sci2log(v1); - var e2 = sci2log(v2); - if (e1 < e2) return -1; - else if (e1 > e2) return 1; - return 0; -} - -/* - * Compare two counts. - */ -function compare_counts(v1, v2) { - var re = /(\d+)\s*\/\s*\d+/; - var m1 = re.exec(v1); - var m2 = re.exec(v2); - if (m1 == null && m2 == null) return 0; - if (m1 == null) return -1; - if (m2 == null) return 1; - return parseInt(m2[1]) - parseInt(m1[1]); -} - -/* - * Compare two sequence words. - */ -function compare_words(v1, v2) { - return v1.localeCompare(v2); -} - - -</script> - <style> -/* The following is the content of meme.css */ -body { background-color:white; font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif;} - -div.help { - display: inline-block; - margin: 0px; - padding: 0px; - width: 12px; - height: 13px; - cursor: pointer; - background-image: url(data:image/gif;base64,R0lGODlhDAANAIABANR0AP///yH5BAEAAAEALAAAAAAMAA0AAAIdhI8Xy22MIFgv1DttrrJ7mlGNNo4c+aFg6SQuUAAAOw==); -} - -div.help:hover { - background-image: url(data:image/gif;base64,R0lGODlhDAANAKEAANR0AP///9R0ANR0ACH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEAAAIALAAAAAAMAA0AAAIdDGynCe3PgoxONntvwqz2/z2K2ImjR0KhmSIZUgAAOw==); -} - -p.spaced { line-height: 1.8em;} - -span.citation { font-family: "Book Antiqua", "Palatino Linotype", serif; color: #004a4d;} - -p.pad { padding-left: 30px; padding-top: 5px; padding-bottom: 10px;} - -td.jump { font-size: 13px; color: #ffffff; background-color: #00666a; - font-family: Georgia, "Times New Roman", Times, serif;} - -a.jump { margin: 15px 0 0; font-style: normal; font-variant: small-caps; - font-weight: bolder; font-family: Georgia, "Times New Roman", Times, serif;} - -h2.mainh {font-size: 1.5em; font-style: normal; margin: 15px 0 0; - font-variant: small-caps; font-family: Georgia, "Times New Roman", Times, serif;} - -h2.line {border-bottom: 1px solid #CCCCCC; font-size: 1.5em; font-style: normal; - margin: 15px 0 0; padding-bottom: 3px; font-variant: small-caps; - font-family: Georgia, "Times New Roman", Times, serif;} - -h4 {border-bottom: 1px solid #CCCCCC; font-size: 1.2em; font-style: normal; - margin: 10px 0 0; padding-bottom: 3px; font-family: Georgia, "Times New Roman", Times, serif;} - -h5 {margin: 0px} - -a.help { font-size: 9px; font-style: normal; text-transform: uppercase; - font-family: Georgia, "Times New Roman", Times, serif;} - -div.pad { padding-left: 30px; padding-top: 5px; padding-bottom: 10px;} - -div.pad1 { margin: 10px 5px;} - -div.pad2 { margin: 25px 5px 5px;} -h2.pad2 { padding: 25px 5px 5px;} - -div.pad3 { padding: 5px 0px 10px 30px;} - -div.box { border: 2px solid #CCCCCC; padding:10px; overflow: hidden;} - -div.bar { border-left: 7px solid #00666a; padding:5px; margin-top:25px; } - -div.subsection {margin:25px 0px;} - -img {border:0px none;} - -th.majorth {text-align:left;} -th.minorth {font-weight:normal; text-align:left; width:8em; padding: 3px 0px;} -th.actionth {font-weight:normal; text-align:left;} - -.explain h5 {font-size:1em; margin-left: 1em;} - -div.doc {margin-left: 2em; margin-bottom: 3em;} - -th.trainingset { - border-bottom: thin dashed black; - font-weight:normal; - padding:0px 10px; -} -div.pop_content { - position:absolute; - z-index:50; - width:300px; - padding: 5px; - background: #E4ECEC; - font-size: 12px; - font-family: Arial; - border-style: double; - border-width: 3px; - border-color: #AA2244; - display:none; -} - -div.pop_content > *:first-child { - margin-top: 0px; -} - -div.pop_content h1, div.pop_content h2, div.pop_content h3, div.pop_content h4, -div.pop_content h5, div.pop_content h6, div.pop_content p { - margin: 0px; -} - -div.pop_content p + h1, div.pop_content p + h2, div.pop_content p + h3, -div.pop_content p + h4, div.pop_content p + h5, div.pop_content p + h6 { - margin-top: 5px; -} - -div.pop_content p + p { - margin-top: 5px; -} - -div.pop_content > *:last-child { - margin-bottom: 0px; -} - -div.pop_content div.pop_close { - /* old definition */ - float:right; - bottom: 0; -} - -div.pop_content span.pop_close, div.pop_content span.pop_back { - display: inline-block; - border: 2px outset #661429; - background-color: #CCC; - padding-left: 1px; - padding-right: 1px; - padding-top: 0px; - padding-bottom: 0px; - cursor: pointer; - color: #AA2244; /*#661429;*/ - font-weight: bold; -} - -div.pop_content span.pop_close:active, div.pop_content span.pop_back:active { - border-style: inset; -} - -div.pop_content span.pop_close { - float:right; - /*border: 2px outset #AA002B;*/ - /*color: #AA2244;*/ -} - -div.pop_content:not(.nested) .nested_only { - display: none; -} - -div.pop_back_sec { - margin-bottom: 5px; -} - -div.pop_close_sec { - margin-top: 5px; -} - -table.hide_advanced tr.advanced { - display: none; -} -span.show_more { - display: none; -} -table.hide_advanced span.show_more { - display: inline; -} -table.hide_advanced span.show_less { - display: none; -} - - -/***************************************************************************** - * Program logo styling - ****************************************************************************/ -div.prog_logo { - border-bottom: 0.25em solid #0f5f60; - height: 4.5em; - width: 24em; - display:inline-block; -} -div.prog_logo img { - float:left; - width: 4em; - border-style: none; - margin-right: 0.2em; -} -div.prog_logo h1, div.prog_logo h1:hover, div.prog_logo h1:active, div.prog_logo h1:visited { - margin:0; - padding:0; - font-family: Arial, Helvetica, sans-serif; - font-size: 3.2em; - line-height: 1em; - vertical-align: top; - display: block; - color: #026666; - letter-spacing: -0.06em; - text-shadow: 0.04em 0.06em 0.05em #666; -} -div.prog_logo h2, div.prog_logo h2:hover, div.prog_logo h2:active, div.prog_logo h2:visited { - display: block; - margin:0; - padding:0; - font-family: Helvetica, sans-serif; - font-size: 0.9em; - line-height: 1em; - letter-spacing: -0.06em; - color: black; -} - -div.big.prog_logo { - font-size: 18px; -} - -</style> - <style> -/* dreme output specific css */ -div.header { - position: relative; - overflow: hidden; - margin-top: 15px; - margin-bottom: 5px; - margin-right: 3px; - margin-left: 3px; -} -div.header > h2 { - font-size: 1.5em; - font-style: normal; - margin: 0; - font-variant: small-caps; - font-family: Georgia, "Times New Roman", Times, serif; -} -div.header > span { - position: absolute; - right: 0; - bottom: 0; -} - -div.template { - position: absolute; - z-index: 1; - left: 0; - top: 0; - visibility: hidden; -} - -div.sym_btn { - display:inline-block; - text-decoration: underline; - cursor: pointer; - font-size: 20px; - line-height:20px; - text-align: center; - width: 20px; - height: 20px; - color: blue; -} -div.sym_btn:hover { - color: white; - background-color: blue; -} - -div.sym_btn.positioned { - position: absolute; - top: 0px; -} - -div.box + div.box { - margin-top: 5px; -} - -th.motif_ordinal { - -} -td.motif_ordinal { - text-align: right; - padding-right: 10px; - font-weight: bold; - font-size: large; -} -th.motif_word { - padding-right: 10px; -} -td.motif_word { - font-size:15px; - font-family: 'Courier New', Courier, monospace; - padding-right: 10px; -} -th.motif_logo { - padding-right: 10px; -} -td.motif_logo { - padding-right: 10px; -} -th.motif_evalue { - text-align:right; - padding-right: 10px; -} -td.motif_evalue { - text-align: right; - white-space: nowrap; - padding-right: 20px; -} -th.motif_more { - padding: 0 5px; -} -td.motif_more { - text-align: center; - padding: 0 5px; -} -th.motif_submit { - padding: 0 5px; -} -td.motif_submit { - text-align: center; - padding: 0 5px; -} -th.match_word { - padding-right: 10px; -} -td.match_word { - padding-right: 10px; - font-weight: bold; - font-size: large; - font-family: 'Courier New', Courier, monospace; -} -th.match_evalue, th.match_count { - text-align: right; - padding-right: 10px; -} -td.match_evalue, td.match_count { - text-align: right; - white-space: nowrap; - padding-right: 20px; -} - -div.tabArea { - font-size: 80%; - font-weight: bold; -} - -.norc div.tabArea { - display: none; -} - -span.tab, span.tab:visited { - cursor: pointer; - color: #888; - background-color: #ddd; - border: 2px solid #ccc; - padding: 2px 1em; - text-decoration: none; -} -span.tab.middle { - border-left-width: 0px; -} -div.tabArea.base span.tab { - border-top-width: 0px; -} -div.tabArea.top span.tab { - border-bottom-width: 0px; -} - -span.tab:hover { - background-color: #bbb; - border-color: #bbb; - color: #666; -} -span.tab.activeTab, span.tab.activeTab:hover, span.tab.activeTab:visited { - background-color: white; - color: black; - cursor: default; -} -div.tabMain { - border: 2px solid #ccc; - background-color: white; - padding: 10px; -} -div.tabMain.base { - margin-top: 5px; - display: inline-block; - max-width: 98%; -} - -div.tabMain.top { - margin-bottom: 5px; -} - -div.grey_background { - position:fixed; - z-index: 8; - background-color: #000; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; - opacity: 0.5; - left: 0; - top: 0; - width: 100%; - height: 100%; -} - -div.popup_wrapper { - position:fixed; - z-index:9; - width:100%; - height:0; - top:50%; - left:0; -} - -div.popup { - width: 600px; - z-index:9; - margin-left: auto; - margin-right: auto; - padding: 5px; - background-color: #FFF; - border-style: double; - border-width: 5px; - border-color: #00666a; - position:relative; -} -div.close { - cursor: pointer; - border: 1px solid black; - width:15px; - height:15px; - line-height:15px; /* this causes vertical centering */ - text-align:center; - background-color:#FFF; - color:#000; - font-size:15px; - font-family:monospace; -} - -div.close:hover { - color:#FFF; - background-color:#000; -} - -div.navnum { - width:100%; - height:20px; - line-height:20px; - text-align:center; - font-size:medium; -} - -div.navarrow { - font-size: 30px; - text-decoration:none; - cursor: pointer; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; -} - -div.navarrow > span.inactive { - display: inline; -} -div.navarrow > span.active { - display: none; -} - -div.navarrow:hover > span.active { - display: inline; -} -div.navarrow:hover > span.inactive { - display: none; -} - -table.programs { - width: 100%; -} - -table.programs tr { - background-color: #EFE; -} - -table.programs tr.selected { - background-color: #262; - color: #FFF; -} - -table.programs tr.dna_only { - display: none; -} - -table.programs.alphabet_dna tr.dna_only { - display: table-row; -} - -table.inputs { - margin-top: 20px; - border-collapse:collapse; -} -table.inputs * td, table.inputs * th { - padding-left: 15px; - padding-right: 15px; - padding-top: 1px; - padding-bottom: 1px; -} - -/* program settings */ -span.strand_none, span.strand_given, span.strand_both { - display: none; -} -td.none span.strand_none, td.given span.strand_given, td.both span.strand_both { - display: inline; -} - -/* show the expanded motif only when the collapsed one is hidden */ -tbody *.less, tbody.collapsed *.more { - display: none; -} - -tbody.collapsed *.less { - display: inline; -} - </style> </head> <body data-scrollpad="true"> <!-- --> <div id="grey_out_page" class="grey_background" style="display:none;"> - </div> - - <!-- Help popups --> - <div class="pop_content" id="pop_"> - <p>Help poup.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_motifs_word"> - <p> The name of the motif uses the IUPAC codes for nucleotides which has a different letter to represent each of the 15 possible combinations. - </p> - <p> The name is itself a representation of the motif though the position - weight matrix is not directly equalivant as it is generated from the + weight matrix is not directly equivalent as it is generated from the sites found that matched the letters given in the name. - </p> - <p> - <a id="doc_alphabets_url" href="#"> - Read more about the MEME suite's use of the IUPAC alphabets. - </a> - <script>$("doc_alphabets_url").href = site_url + "/doc/alphabets.html";</script> - </p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motifs_logo"> <p>The logo of the motif.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motifs_rc_logo"> <p>The logo of the reverse complement motif.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motifs_evalue"> <p>The E-value is the enrichment p-value times the number of candidate motifs tested.</p> <p>The enrichment p-value is calculated using Fisher's Exact Test for enrichment of the motif in the positive sequences.</p> <p>Note that the counts used in Fisher's Exact Test are made after erasing sites that match previously found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motifs_uevalue"> <p>The E-value of the motif calculated without erasing the sites of previously found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_more"> <p>Show more information on the motif.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_submit_dl"> <p>Submit your motif to another MEME Suite program or download your motif.</p> <h5>Supported Programs</h5> - <dl> <dt>Tomtom</dt> <dd>Tomtom is a tool for searching for similar known motifs. - </dd> <dt>MAST</dt> <dd>MAST is a tool for searching biological sequence databases for sequences that contain one or more of a group of known motifs. - </dd> <dt>FIMO</dt> <dd>FIMO is a tool for searching biological sequence databases for sequences that contain one or more known motifs. - </dd> - <dt>GOMO</dt> - <dd>GOMO is a tool for identifying possible roles (Gene Ontology + <dt>GOMo</dt> + <dd>GOMo is a tool for identifying possible roles (Gene Ontology terms) for DNA binding motifs. - </dd> <dt>SpaMo</dt> <dd>SpaMo is a tool for inferring possible transcription factor complexes by finding motifs with enriched spacings. - </dd> - </dl> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motif_positives"> - <p># positive sequences matching the motif / # positive sequences.</p> - <p>Note these counts are made after erasing sites that match previously - found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motif_negatives"> - <p># negative sequences matching the motif / # negative sequences.</p> - <p>Note these counts are made after erasing sites that match previously - found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motif_pvalue"> - <p>The p-value of Fisher's Exact Test for enrichment of the motif in - the positive sequences.</p> - <p>Note that the counts used in Fisher's Exact Test are made after - erasing sites that match previously found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motif_evalue"> - <p>The E-value is the motif p-value times the number of candidate motifs - tested.</p> - <p>Note that the p-value was calculated with counts made after - erasing sites that match previously found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motif_uevalue"> - <p>The E-value of the motif calculated without erasing the sites of - previously found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_match_word"> - <p>All words matching the motif whose uncorrected p-value is less than - <span id="help_add_pv_thresh"></span>.</p> - <script>$("help_add_pv_thresh").innerHTML = data.options.add_pv_thresh;</script> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_match_pos"> - <p># positive sequences with matches to the word / # positive sequences.</p> - <p>Note these counts are made after erasing sites that match previously - found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_match_neg"> - <p># negative sequences with matches to the word / # negative sequences.</p> - <p>Note these counts are made after erasing sites that match previously - found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_match_pval"> - <p>The p-value of Fisher's Exact Test for enrichment of the word in - the positive sequences.</p> - <p>Note that the counts used in Fisher's Exact Test are made after - erasing sites that match previously found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_match_eval"> - <p>The word p-value times the number of candidates tested.</p> - <p>Note that the p-value was calculated with counts made after - erasing sites that match previously found motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_seq_source"> - <p>The sequence file used by DREME to find the motifs.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_seq_alph"> - <p>The alphabet of the sequences.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_seq_count"> - <p>The count of the sequences.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_alph_name"> - <p>The name of the alphabet symbol.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_alph_control"> - <p>The frequency of the alphabet symbol in the control dataset.</p> - <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div> - </div> - - <!-- templates --> - - <div class="template box expanded_motif" id="tmpl_motif_expanded"> - <div> - <span class="tvar_logo"></span> - <span class="tvar_rclogo"></span> - </div> - <h4>Details</h4> - <table class="details"> - <thead> - <tr> - <th class="match_count">Positives <div class="help" data-topic="pop_motif_positives"></div></th> - <th class="match_count">Negatives <div class="help" data-topic="pop_motif_negatives"></div></th> - <th class="match_evalue">P-value <div class="help" data-topic="pop_motif_pvalue"></div></th> - <th class="match_evalue">E-value <div class="help" data-topic="pop_motif_evalue"></div></th> - <th class="match_evalue">Unerased E-value <div class="help" data-topic="pop_motif_uevalue"></div></th> - </tr> - </thead> - <tbody> - <tr> - <td class="match_count"> - <span class="tvar_p"></span> / <span class="tvar_p_total"></span> - </td> - <td class="match_count"> - <span class="tvar_n"></span> / <span class="tvar_n_total"></span> - </td> - <td class="tvar_pvalue match_evalue"></td> - <td class="tvar_evalue match_evalue"></td> - <td class="tvar_uevalue match_evalue"></td> - </tr> - </tbody> - </table> - <h4>Enriched Matching Words</h4> - <div class="tvar_words"></div> - </div> - - - <div class="popup_wrapper"> - <div class="popup" style="display:none; top: -150px;" id="download"> - <div> - <div style="float:right; "> - <div id="outpop_close" class="close" tabindex="0">x</div> - </div> - <h2 class="mainh" style="margin:0; padding:0;">Submit or Download</h2> - <div style="clear:both"></div> - </div> - <div style="height:100px"> - <div style="float:right; width: 30px;"> - <div id="outpop_prev" class="navarrow" tabindex="0"> - <span class="inactive">⇧</span><span class="active">⬆</span> - </div> - <div id="outpop_num" class="navnum"></div> - <div id="outpop_next" class="navarrow" tabindex="0"> - <span class="inactive">⇩</span><span class="active">⬇</span> - </div> - </div> - <div id="logo_box" style="height: 100px; margin-right: 40px;"> - <canvas id="outpop_logo" height="100" width="250"></canvas> - <canvas id="outpop_logo_rc" height="100" width="250"></canvas> - </div> - </div> - <div> - <!-- tabs start --> - <div class="tabArea top"> - <span id="outpop_tab_1" class="tab">Submit Motif</span><span - id="outpop_tab_2" class="tab middle">Download Motif</span><span - id="outpop_tab_3" class="tab middle">Download Logo</span> - </div> - <div class="tabMain top"> - <!-- Submit to another program --> - <div id="outpop_pnl_1"> - <h4 class="compact">Submit to program</h4> - <table id="programs" class="programs"> - <tr class="dna_only"> - <td><input type="radio" name="program" value="tomtom" id="submit_tomtom"></td> - <td><label for="submit_tomtom">Tomtom</label></td> - <td><label for="submit_tomtom">Find similar motifs in - published libraries or a library you supply.</label></td> - </tr> - <tr> - <td><input type="radio" name="program" value="fimo" id="submit_fimo"></td> - <td><label for="submit_fimo">FIMO</label></td> - <td><label for="submit_fimo">Find motif occurrences in - sequence data.</label></td> - </tr> - <tr> - <td><input type="radio" name="program" value="mast" id="submit_mast"></td> - <td><label for="submit_mast">MAST</label></td> - <td><label for="submit_mast">Rank sequences by affinity to - groups of motifs.</label></td> - </tr> - <tr class="dna_only"> - <td><input type="radio" name="program" value="gomo" id="submit_gomo"></td> - <td><label for="submit_gomo">GOMo</label></td> - <td><label for="submit_gomo">Identify possible roles (Gene - Ontology terms) for motifs.</label></td> - </tr> - <tr class="dna_only"> - <td><input type="radio" name="program" value="spamo" id="submit_spamo"></td> - <td><label for="submit_spamo">SpaMo</label></td> - <td><label for="submit_spamo">Find other motifs that are - enriched at specific close spacings which might imply the existance of a complex.</label></td> - </tr> - </table> - </div> - <!-- download text format --> - <div id="outpop_pnl_2"> - <div> - <label for="text_format">Format:</label> - <select id="text_format"> - <option value="0">Count Matrix</option> - <option value="1">Probability Matrix</option> - <option value="2">Minimal MEME</option> - </select> - </div> - <textarea id="outpop_text" name="content" - style="width:99%; white-space: pre; word-wrap: normal; overflow-x: scroll;" - rows="8" readonly="readonly" wrap="off"></textarea> - <a id="outpop_text_dl" download="meme.txt" href=""></a> - </div> - <!-- download logo format --> - <div id="outpop_pnl_3"> - <form id="logo_form" method="post" action=""> - <script>$("logo_form").action = site_url + "/utilities/generate_logo";</script> - <input type="hidden" name="program" value="DREME"/> - <input type="hidden" id="logo_motifs" name="motifs" value=""/> - <table> - <tr> - <td><label for="logo_format">Format:</label></td> - <td> - <select id="logo_format" name="png"> - <option value="1">PNG (for web)</option> - <option value="0">EPS (for publication)</option> - </select> - </td> - </tr> - <tr> - <td><label for="logo_rc">Orientation:</label></td> - <td> - <select id="logo_rc" name="rc1"> - <option value="0">Normal</option> - <option value="1" id="logo_rc_option">Reverse Complement</option> - </select> - </td> - </tr> - <tr> - <td><label for="logo_ssc">Small Sample Correction:</label></td> - <td> - <input type="hidden" id="logo_err" name="errbars" value="0"/> - <select id="logo_ssc" name="ssc"> - <option value="0">Off</option> - <option value="1">On</option> - </select> - </td> - </tr> - <tr> - <td><label for="logo_width">Width:</label></td> - <td> - <input type="text" id="logo_width" size="4" placeholder="default" name="width"/> cm - </td> - </tr> - <tr> - <td><label for="logo_height">Height:</label></td> - <td> - <input type="text" id="logo_height" size="4" placeholder="default" name="height"/> cm - </td> - </tr> - </table> - </form> - </div> - <!-- Buttons --> - <div> - <div style="float:left;"> - <input type="button" id="outpop_do" value="Submit" /> - </div> - <div style="float:right;"> - <input id="outpop_cancel" type="button" value="Cancel" /> - </div> - <div style="clear:both;"></div> - </div> - </div> - </div> - </div> - </div> - - - <!-- Page starts here --> - <div id="top" class="pad1"> - <div class="prog_logo big"> - <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAAAd0SU1FB9wLGwYBMoyhiwgAACAASURBVHja7Z13fFRV9sC/503JpIeaKFVREBQVEEFFQVcUuyDouuraFoVV17IrayPjDP4U3XXXhrpiXxuKKF1dV8WCiEgXRUAQlJIYAilMf+f3x3szmVSSkICyOR/eh8wr9717z7mn3XPOhRZogRbYLQiQJiJGy1D8D0LHjh1/XrZsmQK9gU3Ap0mE0QL7KTx411136Z///GdV1ZhpmvrYY4+pqsZUVceNG6dAz5Zh2j/hnpKSEtM0TVVVrfq/qmosFtMxY8Yo8CPQHejucDjyfm0dbZFp1WGaxmJ3ppSWSiQUIhQKIWJxehGhpKSE1LQ0uvfowQHZ2exYt65D8dq1qzUaXR2LxTYCP7UM4a8MVFWA9mY0+nLhmjV63LHH6vMvvKATJkzQfn366CtPPKEDjjtOV61apeeedZZqMKgaCKju2KFmYaFqJKJaWqqqqoACR/9a+u5sQT+IiD77zDPbKCnR00aOZPHSpcydO5fLf/972rdvTzgcZsEnnzDmqquYPmsW/PxzxbMOB4NPOokRZ5+tB3XrJsAUYKmqOkQkVuVVKUBGDRbGz/vSvPlfBHcVDpB7XP/+Gz9/5x1mzJ/P1i1buPbaa1m/fj1du3alW5curPvqqxobCoVCpKSkIO3a1Wc89bCuBy51OZwu1RgiBqGYGf1uw09/Bd5t4QDNT+wKfPXoxIl9jzm6gkt/OmsWn3/4oRIMyrfLlzPuzjvp27cvHTt2ZNGXX+K/7baaW8zJITM1lflz5wL8ZtWqVWm9evXaVcv7Q2cN6hM68tAuR2MIhirFpUEef+MdBFK1RQQ0v6g/MC9PLxk5Uq+/7joIBECSJmwwKKqKR4RTTjyR0885h2effZaNa9Ywa9YstKQkoQzGwSwuJhwIwK5ddO3a9b+9evWqjQPoSf16qUOQles2gYLL5WDaBwu5dtSw8L/eeKdFB2huaJWTo0NOOMF8wOs1qiG/QhfghtGj+dMNN4DblhJlZVBaWg35AIYI7NgBbjcbNmwwjz766I+WLl16OfCDfUs3YB3AAdke6d7tYNR2Jv6wuZA2rbIwxbFPxfD/jBn4t7vv5uUnnzRsTNelEEIoBKWl1qH1YM7hMAXffWcsWbBgMLAB+AgoAtYC5SJCp86dUTPG89M/ACASi1mDH4u2+AH2Bvzhpps+p3Xrmi+mp2Oa5h613y4nh1WLFuHxeHTq1KmDVbWVqjJjxozU4cOH88rsj1FXKteMOh3D4eQ/ny/hjnwfn32zyWUYxtAWK6D54YW1X355WbcePSr32elk1EUX8cYbb1gzvvG+BEzA2b49msQ1RARVZe7cuTzzjwl079qB6R8s4PhThjF58mQADjroIDZs2CAtBLAXFMEaTwaDe4R8ALKzEbcbVUVVE4hP/t/lctGnTx9+c8op3HvffQm9YubMmZx77rlic2Rzbw7I/5oreNzJgwapqqI7dqA7d1pHSUnyVG5Uw0MGD6agoCCB7IQ+kcQFIpEIkydPZszYsQmuoaqEw2H95JNPdOHChTHgervJT4DTWzhA08OjwGWT7r8/u3xXhckei8W47c47obwcMjMtsy9OEHUojdhI/M2oUXwwb16dIqKqJVFaWkJmZlal60OGDJk7b968M1SVsWPH8uSTTxYC7WmBvQIbV6xcGQK0aM0a3bRsmW5fu1b1559NLSzUakdBgXXYawC7A0CXLVtW7fzMmTOrnTNNU03T1OXLl5u1ia4WaA4lQbXVmDFjcoFcIHfJ0qUXqKqaBQXVCMC0kZ+MtNogEAjoli1bar0ef/bee++tiXDMFszsQ+jbt+/r1111leqOHZWJIBBQ7913azgc1qaAeABCVUKqQgBvAO8BL7RgZu9xhd6nnnpqNLpzp8559VXVkhL9ZOZM/X79+j1Bdm1sP2KaZix+rqioSBctWqSqejPw2KhRo+IPxjp06KC0rOg2p82AkE8O4zkbiAJ6ySWXVJLRjUW2qmqrVq30+eefr3RrFWYQf4+pqjpq1Khq7zYMY4/0g5agxppgPCnARcC1GPRFSUF5gAn0VNVz69vMkiVLWLNmDRdeeGGt93Tu3JmNGzfu1slkGAZbt24lNze30jWHw4Fpmo3GYwv7SIY7GYKD8UA/INteQFaKEL7iqBNPPPHYhjTXp08f+vTpU+O1rVu38sc//pE5c+ZgmiaGUbtLJu5HqMNdfYXT6VwdjUY/b+EAdXm9DMNlmmYrAA/I6SKe6ao/JM38v2Pw52oPrgV9Seu06RugTzT62ZogNzeXbdu2ISIYhpFmmmagxRNYC7Gbptlnw5Il29Z/9dW2H1ev3jpddQPwQ79+/f5k32NNsSpStdeSXonZ99JLL+0RAkWEG2+8samUU7Zt2xb3KKppmptbREAd43Vwly5fdDniCLS42DoRDILb3fnRiRPzLzzrrIdVlX9MeoKCw36GSMUIpaWlJVh0UVHRHiPt4YcfbhqKruxyFiDUIsfrhpWAfjprlpplZVZUb1UHTyBgRfnGD1Xt0KlTvR0++xIcDodecMEFCvxDVXv/79nrM2lnzuAanUWdnV8InzocDu104IGqO3aY+vPPWqOrt7BQdds2jcRijTLzmsg5VO93RCyCNa+88kotKCgosTnC6f8rIkD/PGcsQ044AYAZL9XOgkdfdlnxibEYuzZvjkpOjrN1q1Yc1Llz4p4Lzz+fcePH21qBidMwGDhwIA8++CAn2O1XZcWjR4/mmmuuoX///k2ruIjw9ttvc/755+9enjudAGIYBu3atctUVXr16vXOqlWrOovIpv169pszeX/yP/9Z+0xOPqLRymy+yvHp7Nl61tChetbQoTpt6tRaF2x+qSLh6quvTvw9adIkE3hrw4YNjv3WDNSZDEZ5/6Hl9zhvGjsWzKZbOykH0tu2Tdjie9H9XCmYpCHPjR49mqeffjqZi5iq+jQwVkTM/c4MVCUfcM564y6u+8ufmxRRV1xxxb6xWUUSR0Ofa2clqdgSzOTVV181otHoNTNnzjxjv9MBzBl0EeUUNeD9e2Dkfc/z53xPnUGeN4wezcFHHlmvwX1j1iwAJk6cuNf7tmLFit16CavCww8/jMPhSHZ+sWDBAi688EL97W9/O0tVPSIS2m9EgDmda8XgSRRFKvqjigooQh85h+Xx819BaxO2nQ/ODGAjrA5A9WyeTA4kg1y2UCnO75cOJ510Eh9//HGN10aOHKmLFi2a98MPP5y834gAEYaikIx8+7wAhpr8oabnpgMvA5/Av4C+1Y5bWMRoIJUXBg0apL8G5KsqH3/8cY0iUFWZOnWqnHfeeUNUtcPeJoBUwFPHkdoYbqQ+BBiitYVMWYs57iqnYskv0trEoGlzjXGMX7du3R3RaNMlcDz55JN1c7VGKrFVg1DjiE++duutt6phGAtV1dhbBHBW6+zM0iM6tSkccFTPwv6HH1o44KiehUd0ap34PahPr0Kga4MJ4CjOUWgjUgvxKIiDc8yZpMVPReEkrZ/uk2hz69atr7344ot2i3sOY8aMqRXJt99+e40yf9q0aU2iRHbs2FEGDhx4wPr1689sbiXwcDEck3My044ePWKo4dRwRjQUILPtgZRt34rDeTCxWJSs1rk8PmUOKSkeCYWCDSR5OiXQpLYggLCCS8TCv0CmmBWELtDNThPeKZBdzzdtuPrqqyU1NVXPPPNMsrKyqs26hkJtil12dnaN7HvEiBEN1kPatGnD9OnTOe+88yqdnzRpkoiIpzk5wMnZGWkrhxxz+HG3XHRqqsPplPKyMlxZ7dkVCODMaEtZeRlpOe3419S5dOt8ANFYrDHy/5i4wocgKH9Xg0MFvkiewVolqNKexu+p5TFIq+/7fve733Wcm5PzStzbJyK43e4mHbjbbrutmgyvmmdQX+jatSu1ia4tW7asbS4O0Mntcn5wxx9GaUlJiQQiiivFQKNhHAaEy8pwuj1kt8njqTfepXvXA+nToyvzvlzZCK2HYxGsf8oKPNxunE5U3+Kv6uBdBI8qHlEOB76sLiBQA04GfPV840/dIPDEV1/dd5lhXP0TLAmrzveIyKlnnXV3z549uSknp/Qf27dnDh06lGHDhu2RLG+M4ygOmzZt4swzz+SCCy6o8f7PPvtsS3MRwPI22Zn61LT3JRwoQw0noIg4UP0Wp8uNwzAQEbp3PZDB/Xqxs2xXwzs8B6dGcNvs3BST2+V0ogAynI/N6SwTYYCCC8FTnQEkwNEwqYNDwbgZCoAPROSBL6CLMXv2rctmz85eC5suX7Yss3fv5lmMi0QiqGo1ziMiZGdns2LFCjp37kynTp3w+/01EoqtDJY0FwEEI6FAzgF5OQw6vi/ZuZ2qsDTFYRj4n5pKSXmAwcc0cqBCHC0ODrFlf1TdLK6CqWUKA5IxvhwkDCfsoSY3AHhCLQKIZ+x4gNgy0KOgpP9RR5kh1QNVVZrafEx28lRF7M6dO+vFXbZt2zYzLiKbRQfof2QvBg/sh5HZlrJdAcp2BSgPBO0jRFnAUvaGDuhNWKVR+XhacQiwQkJsq9RRk9fFVgvjKCgHUTjY/j0TCNOApItnraacWAUgNgI9kr4n8Hu4HejxCVwhIufbkT9ah07RoD5PmTIFwzBqVCDrS2hjxozh0ksvzW1WP4DGPTGqlO/4GTEMMGMJRBticGiXA4hEYxAO1J17V7sCmJpkq70vw6shsrwWV6fadPGFQkSg+6dW9a7dQtuK7glgSAXxuA3IFbgnaQhmPvroo2kvvviiTJkyhfnz51ebsa+++mqD+nzRRRdVUxAbsu6hqvztb3/ToqKi9LfeessNuJqFAFJcTsx4UqXhsIY8o03i7x+3FfH1uk10ymvbKOTbLP4uxEaFWb3CVtw5ZP9f0yw37OttU6mkI9QK7SALONh+7geFTp9bhHBI8jsdkGkTQeDyyy+XRy6++MCJQ4aQ4jJwuxy4nQYOw2DqM4/w6KOPNsi/EJ/p4XCYYDCIiDBz5sz6IF9FhKysLFHVZ4YPH74DiDQLAfxnwTI8bhcA6QceCmrCrh1JyFGcDgebC7ZbMe+N0XohB0BNtkuUFdUNapYqrBTlWnawIPnRKm8z+sHO+rzTsPP3HfCdAcUKrRwWAcTZglj0WNmpNV+15OgLYMLYU/nsoYP4+w0D6NPzIFYu/YqbLDEhDZ3NW7duZf369agq55xzTr0IZ+TIkfTs2fMqEflns4qAXcEQD7000+pQeBehcMTqY0paJXZkGILDYbDw63UYTkcjGQGFMrJ6oUXjZEKEOEHOZbJcTsy+1wW018revtKvbGKqr3SzxYgA6tiNFxFg1nhy+x4coaA0g+8Lc1mxqSsOw8CMmYrAIYcc8pWIMGHCBD744IN4mjGzZ8+u9UM6d+5Mz5496yP7TWDh+PHj5c0337z5m2++eS75YnNYAUuBYcUlZRTtLKNtNjhTMyAWhkAJVCm57zAMPl60ktRUD4FG+Nu1jjUEYxQlVe51A22A4hDsTIEihdxwPXUAJ7QywWXP9gKgvQluhSyjMmEkOqmzOBqTawpLiKalf+WcumQkaZ7VRCMRwsEyycnKCq9bt+4e4G2v1wswbs2aNfcfcsghnH322XsU26CqFBQUGHl5eZMsCca/apSDTQxnAEsNw+Bfb7yDw+nAiIYs5ljDfguC4HQ5oQEeOX2LTsDRtgqwraHjIrDhBNgKfA+kOmFIPblNOhADchXuAGKm1auOSRbJarGqh6PT6YPJuTj4dvgDrPv7zJNp3+pHwsEQS77bqNlpLkrLylxVfBEP9OvXL7t169bFzzzzTKMJIO4YysvLU9216wWgNRDYGwQAdrFkj8dj6WmGUaupVx4MIohCDXK8ts45SMewuJdq40usaoUdbzRABDgU3hZrrwBxWs/GrdJLgamAQ+dyACnI1PlDNslZW5Z/tvxC98at82MSLg+nOwkhEvnHy+8QicYEeDP5JSUlJSXFxcVnXH311Yfcd999DepTfJFpxIgRiAgbFi+Oh8gJtWnCzQBvJ3ynBdvrObkaKPs18aDRAIRrfcVHLc9nWRYoOTbCU0LWgpJD4Zn+VoiBiIGDCA+tWt/5xElPnb/11uzhOfD6tNUb1sy654XZcx+c8v5MPPpM4Q0l5yb67k36tnyuwcsaYN2bb7652lbidzvjwUpIFZFvZ8yY8U9AFi1bJpgmpw4e7Hn8iSfa7y0C2BFXmMLRmGUFZOVZXKBKR9I8KbYzr/khDVphKYJxKGggAXSsgWhjapmBAfueoKTQ86ftbd4cNvZv342KPtj3b/4FC4C/AOfbxygC/BGYjJerKymY+dyNn6fwsR1g8eLFh4kFNdr+yev9IsLAgQMBnjFN8xawah8RCjH12Wfd2dnZf9pbBHCl9U1JXj61TfHUrEZX4tpTiMJRgEcrMPiuzbu7NcDqSDYHDCzF0p0w5WBtaSDd3fGKDwdc1/rO464bt+kZbmRrjY35yQMW4+VBNNH0kYnr3sS5/r17917bt29fzjzzzER0kmmaiAiHdu/OgL59WfzBB0QikUqv+L/HHoNWrcjOztY/33jjnap6dnNbAYmPq8S2DAcYTUdvWuGTq7PAnzmdozEpM4azNsmMe99G5nr791H1fGerJCL4RKCvEzpbcSd8Y99jOohFx7cfNf/JS9Yu5C4b+V5yUcZWoiA/d+NjCV4mIVxGPjvwVzJJ7yGfUvxMXLly5aH2uRduvfXW30+bNo1Vq1bN9Hg8Zxd8842069TJKoAdDlf65uVLl743b/bsUwcff7zx1xtvVBE5CpjV7ARAJbepQGlBHaK+gSqA4BZLoIeBGnOAzHcRCeJVAy9wElbd3jgU1TyhdwuH2Q+8HYMrndaagClgKBTbDao4gtnzTlr93YZ/sslm688AF+InM2l2tyKfAEIaPo7HyybCDALgrwzEzTx8pPR6rJesYlXyN1z+97///fKMjAyXx+OJANF2HTo4CNSaFX76I5Mn6+Djj+emcePkhWnTzli6ePH/NbcIALghMcBij7DhqHGkXbYTyOPxXFw/9sJVGveKhqkWSWK+TT8JsdJGfk1UmdKYDomle84Pw4VRCKj1uyPQmQo38I8pMe75eGqSVePnanxJyAfwUYyfVOAa+3enj679aMW9H99bFLwn+Ln6NWKapq66flWNxFlWVhZpqNiipIQ+3bufoKr/anYCcDqdyypZ+6oEgoGqwbuEI1Fuu/J8cjLTFOhUrw4ZpCS5X6uy/KEYzEfoJdVV/Y72gMQX0x0NHIc0gc3HQ2SQlXi5zrAcLO74esMxML8//LsBQ/U1+TyOFx3yxJCH7njjjpM9Lo+ISIZhGPVhjY7vvv66Tg722cKF4HKBKrfecIOKyEnNTgAulyvJTWmha9eW7xEUl9NRKcwpHImi2mCTrDboIVW2hEl65veSNCkUFoiFyH71fGc/S5dMNBKxiSgSg28bOVSfIUxC+fCREY+s59GKHIZ6Qu+1dRealq0FBectWLBAAXr26SM9DjnksCVLlvTdGzoAYhgEy3bgycgmvU0eGijhgHatq/mw60fsu9ccpGK5tyZiidp/L7bPXwakaP11ALcJHye1G8WS/+4YBBs1QD4U+Bo45U/+PzXK9e5yuSq6XD3aWIEZp40cKSUbNyrl5fLa5Mn06dMnrVk5gL0Vm+XtKy4EEVLSMkGEDZsLKsKi7aybmy85m2CwYWOoDSeUDvbfZQthmgF3S8NCvdVIcqfO5oznT2POfxww5Xj4jn0Dg6KRSJyd0uGgg2q8qbSs7IzNP/0ksViMjPR0Jk+e3LwcQERmqypqmrTueDCoJpb+K0W0CIgKu4JNU91E6yYE077+qgGt1FoXkPrQ0nJwhaBrhUqxsN/duLIBTz+YyL6DBWaSuR0Oh2vMZDZEPuzQu3eJqmYempe3CXikua2ADBGxAkOo0AUioSrmSkome6sWssI2+0vi9nz8w7IWWG7eWmGXpVekAz/Cyr5geCD2M5hL+IWAmiaFRUU1LiCZqiERWSYiAaDL3jADUVW6dcy1RlmsSOBoMgGoWg6iRkYFST3PKbDQ0tYHUF0/UIEsl4XcOtcRBCKTuMYNWg6aB/IK9Iv9UghARKo5gqrg46SsrKz2e8MVXAnHoJDexqbS5HAMgWBZk7J7Tfo/mfdErb46arLt6/MuAzmojPSVU7i4OwT7gsyDfr+oqlyqWrHbWS1QUlJSvldcwTWlMZmmSVp2a3YW7UiSylEUSE9NaeIPoFwAFdJFCRh7mAp/LLo5j9e+DZAxEPgDHFP6S0G8y+UCtxsxDFrl5OAwjB9i9UwwbRYCSE1NTVFV0jzuauxZq85XO7Pz+Rkf4XanEA7Xf1JJ7d66dUQZpk7mohyCtQCkdbUT3s1YCItag7YB9wg4KvhLmvnDkmoR2/L/jfo+21wi4OGYaeqNvzuLmGnaYeL2QDprZlE/7yhtsC9Aa+7RQkyOM0awNp4cqyYxo3osQPJvtxN+U/fbytdD/zN/aciPm9zxgwZyuuYiAAUkGAoTLN2BiAFlRVbwlMOdUFhcTme1Ldb2WBE6h4XG+RRW0gOcGAYcYfdXbeSLwncmPG/fuxsZNHj3PNXLoc2K6b9wYigSupwbGNug527nZrxMx8uBe4sAKsynnUVWSFgSbYgITofBh4u+xu1qvBTanQEvlf9ok6R6isKiGBzeiJjCuuD4ZhvIfN7DyTtRjT6vj+gk7iJGvrUEXQdBtsPL53qvrsbHefjYvNcJoE3nQzFj8awgC11tsjO57OzB/PDTNis82jSJRmON4TMOcXNCXaZbTQShMMMJJw5M8utT+e+KJmJEGvBF/ya/0rJz04Gf05hIevq49C4dHuwgOkEnTr94+pXG3UYxXsprQH4PrEDQITEz1mGvKoGVNP9YLCGI4/hwuxw899qHiQCRcCRK6a5Ag6phYWn4DkyOISnAIXFtFjlqkpcsEW1q+MgDI3tXlIOOV1o+A3im0uRQbuGeKtE8Xt6ASkEoG/BhpeH6MPEyGS95+GqJAtpTeIiNm9kssk3ye3ftfT3wb5SX8PIZJrOZwL3cxFCUTvh5FqB/Xv8ruZNcHDyBn6K9SgAJuW6HhyngcDj3SN5rZQO+ZtYRpZc4yNDqzy5OQj6KpS9QOd4PDCbhY2MVNjwNHyOqEMQBeNmAcjF+PsdysZ6FFR3cfJDKSyu2rTDwsxYvxUC7Nultvp7749z/e+ubt7hv6H3xYNO3T+t2WtclY5fcszeVwKpmScULDQc7Nm+o17NL4IAaiUoxRHfLHQ6KZ2mQTlShVy3WY827bFRFvsWGR9Rw3xZ8dMXP53h5Dx8BlEnNrvr7+R5hjv0NrVCuL7qtqMexHY+VNFcaqvoR+UTxcf7EoRPz97YVUAnh5TsqZ25Z6wG1Y3ARdPsSvozC+Fq8iy8ma/k1EolB3wSq04hRS9yfNOVChDKKfD7GT64d5CE1yOamLBjQm3y+sAniIfJR8vnD+Nnjh8pd0gc/zqlfTxXqSH5tdgIQh5NYknPHNGO07nCQlRHkMFizcUul+7+EEQrLgWMEMudXDuOOY62Iiiz002tBRq5URnQ8O2JHLZ/q+XRPRaKfnfg5iXyOAYIog2v4rqvx8h7eSvpG48BHCD8D8NolboQr8PM0afyH/yP7uSXP6cjDR6qIPLbPCKDs581ktM2rpIkbTjfZGWm4nE4Wrfo+ce30aPQ0gdelIk1suLPCfKvNDGxXTfGciaHKwBruj5kwt5bmfmoSVuAlHcGNn1uQJI+cl1S8BPDzND5Ow5fIB2gKOAkvgo8X8LIVH4KXdVf2uVLI54p94QhKhP6nt26PiGHrAla9gFgsyvUXDSMQDNOv18EJVt5F9US1F2xs5LqB3+7GE5ii06tk95aSJkJ2LSKiqkNnrcIcAy48sWZTsKGzshyYZn/gNXjJJp8XUVrjs4paNDn4OBl4CC9ulP72uW54KUCYXdejzWYFHNyhPSJimYGGEzSGQ6Ns27KJtq1y2BUKgcbo0eVAAqEwrbMyMIp3uqtYbS7g8M/BcVwVbV8FEUUx6KIx+gIfJC5mcCbQVuIpRy5q3WHTgMIoXNKPKra0lwwUL5L0XqsYXVHco4iSDfyIn8cT8t0K8boLL0OB2cBDwN0Im5uV1fqI70S1KencbncdbzYC2Fq0w1oRVAVPBlq+nSlzP+LIzq1p1+aYRKZQLFEfUCv7kSvs80tdcC8VSRyIEFOTXRikq5WVcYr5Jh8aF6Dm2xgoN2Hlo/5HlFOD82kLdsx9FehnvW5HFXOvLVao9yuAQRTFQRQoRVmAUGqXoC0CnHgZh9IJpTtesvDxNF6eQ/Hhr+Id9HIYVuyBAEvwsU/jCZptLSAQClcIanEQDEdZvbmYEjMlYRq63W6m/OdzAqEwRTvLksmgIMlec8bssiwJ2Mk6YGVivV8ZKS477l7JQ+hjhyGEENAwTir0it33WSgGvkH4FlhVMr4kHViG8D1CayAHP53x0wc/vfHRFZgBPAisw0suEKiG/HwUK5l0FfD1HiE/n3FNgahm4QDJAaEgEA3iSXFxxx9GgghqmoghqEKq221XXDLi4rnIztm7LE4ADhgO/DfR4qWY5vREHJGqcChwhU5nKvCICh5bh1ibrAQohBywsR7sNEZS8GeWL+sTVT1fRKYnIWAW8Cx+W977GW4j/jzgRdTOcfAyFzgN2IKvCU1AaRrcNRcHGNOtY57l7bM9gPEUIVEzyTsIwXAET4qb1tnpcc3RNGGjWCHcaiPy5K9qswbssvCi/E2Fb9XgAtFEINKcKq7gsEKjQpAqId9C+NkIHrxMJZ8rbcLZBrwOvIcQxcst+DgDHw58VTyNzQVeO9MI4E+cz1+rW0PNzgFEhB8LiiqigtQEhxuJhSElA8JWZdBIOMzFw04gEAqT17YV5s/FCEwOw/1uuFEgw9L36Bi1qm58DqBvISqsUOhvl4lVxMrSTSDf0hVMtf6PU44a0wAADOxJREFUn3I2qcD18YqtJ1js3Y/gs7dq86JNMuO9OFBS8e+GcL38AZiAz/ae3sIgfVD/DVwo98veNwMPaJNTMdMjAUhrXaurWFUZecoATNMkBl96rLy7Fyo8v2Q54KoEgQ1HxeRf8ZTqeLl4iXMEQTD5UiN8KyDFy+gOuAVGD6SGlbOmYcmLbUSk2cUeXE3UsgehG16OrOJFrIrVc/FxAF4EL7dKpqwTkUzJl6v3jR+g0lqAQLicJKldjWNErcgh0wFb+kFU4Lvk5VyF3E+pZEerUPtSrQg7RXAA6wrnkgrc1h9ea0YzrJ9tBu6yZ36sidotx8cylP/aJibkEyJ5BTSfyfiIb2t/JcpoRXfh5SGEW+pyPze7J9CMRSzEh8vt11X+lnhmcHFJGbtgmwkLbYTPxpbX9hMnpVvr2xb2f2IpymqtzUOovI6DHRRzZHgbT/SHvze7/PUlqZy+Jk528NMOr+3UEYL4WJbk2ppuE8Ig4EH8dMfaMfRW/Gys61uanQBKCjYj8WqhalZUDgXEcLD42/VEojEem/IuLpcz8aUGbLft7PipzCgk0seN64iqEJUaOI/d/Eo5n1K5nED/2v3/vzaovnI5nmKdoGWMYxTwHj5a4eVRfLyOb/fBLM1OAK7UNKLhoB2IZev0CfvOwdpNW4nFYjgEypTCATbCTYvdB5NYhgGc+kVyAoda8Xw1sIAdmKxkfwMf99j6Raatb/TAYCxw76Aeg/6CnzTyeRz4x742AxOQ2ToPrSNGPVEvwDA40TTzAeZDZwP+A/TQCnkPMESS6wka/KhKTLWyG1FMJhvDKWV/BCUdtXZCE6QNPl57/MvHp8/fNH+aPaAd8FV4TfeZK7hCyzdxuOrOVkn1uGmdlU7fguDOhTBArLp58Uze5AQfF3AmtoUg5bxDGisQjrb3CUSEsLIXAjL2FfjZBTyLl+s0omNV9XC5XT5iIifjJYqvYTjdK9vGWYtCUWKRcC1EAqaVMpYr8K5ABxvzPyu8lMQFDIE+iXZ/S7kq/1TTrk5v7Rs03TiXH9jfQXno5d++/FdLg+YW8nkJu0DnL44A4gpf8eYNSKisxpKx9se8FN/JS+FHE07TuPPHeqrs2zwrGijJ3HsT4d9qEkL5gihj+F8AofCSIy+ZLSJiHGCkImTga7jes3cIQBwI0LZL90T5uNQUN0n1+uJOI6ddSvI7gcEDYEnMEgfrDNh16ZVMuOyaymvqci7l4uCPAscS5UQZYVXr+kWCFw/5XNpErT2Bl3mQKA/bqHLre4cAnCnWHLZdww7D4PE33sPpMDBVCYYjyRtHLVc49RirkDMu+DkTplx/Mb5VnVmFn8+q0ddZlMl5LDdGNCiGf19o8UHgVbw82ARtTQBOAejVvtdCfAxvHAHk4yOfmXjrXTO/8X7BlIxEQfUtQ4sItg9y5KGdMU0zTsWLIzDk2KSghmPAPOxe5n9+KFvxVY///xUqcTEaUBl9N0QQA/j6uq+vNk1zTuMkSYU78SWEQpQZ+PlwT74rNTVVO7RvzUWnHR93BliewMxcKN2G4XDwwLzpDOvQhz7du7Jm4xZ6z/n46xNUj64WljWeS1Bi3NOMbtx9AfHFoyYA0zQLDcNot2ciwM+l+LgZYSNeFC+X4G1qEWFxggm5r+PY6CAtxY0gvDx7Hk+53RdUQ76X36HsqIz8+Zn7iTkn5DeByPJiNhb5NesAPtbZixkLgbHkN5VHTatSLa/O+RhPiguny8VmkUiVGTKSGC7uSQ5qXDQK3K79hgsIfcnn/AZwjYer/P4C355NUqfdkA+pISJWWY6fI8hnIjALP5820htklYhRZYO7gKtWnMorfMp5pwwkGI4kfAVJbP8iYDJBKuLJ+eIWYCZEOmCtE/z6wccK8rmMpP0V6pjpU/BxUdLvl/FZNY/2nAD8NdfUxcsg8ilE6IFyCV5W4KvfDluVIFwOqZmwcyuSYmA4LKI9uEP76hWtLLb/AlBi+Ym/NICnQB8FvRKMf+5nFv3h9UD+DnxJSnp+EwWb7NYM9PEpftqhBBC6AB3twMbdTPgqhWAMB5QUgOEg3eXh6TffQ0Qo2F6FlsZzMcrLdrybsOVQB+gLIK+CXAuOt2BA4X6Ffj9nkV9rsgp4ObkS8r1kIPRtqtcb9fzIAPA8ynm28vJinaJNhEAwnCAGQwwrLkuVVzM/AXFgqtIxtyLML3RuaBjCYwl1IepciCttEX89+Wt6z/kdyELo+2UT59b9UnSBTnWoTq/ZiBe8DEK5CB9L9i4BWNxgJX7uxctHwH/JR/FyYhJbOiX+ZyQa5dQB1qbQhsNBSeFPliQIlFVgT8HjdlG0s8yOCMZEWWR/1TpWn5rJc08fyf0fLGHFsC/gmOftJw8mn6f2G+RbBH2pHcxRVel7Fz/xfX4PQTkFfxPkFO6RJ9DHEPy8gHAqMA8vx9lX1sRr0LicTuZ9ZW1yoKaJM8WDqsmM7C+4qei8Srs0/LClEIfDIGVGynsIp+HmFe5eOJVpvkugJAbGRXDsU/ZglaL0wZ8U+frrVwQVH0uRiiLUSVCSxAmm4cff1K937sGH/9f2JBaTz834eZ58lgNHqipOO9RLVUnNbGU5AtOzeOfdJXhS3PHVPwxDCF4TRLbLQGLi5a4VCrumoOEfIethkDH2bFhUbdOFX+aMdgC/QdmF8AJWfkFOPcLCT8FLb3yVts9bYre5EpLkfjwFLZ9DgG74G7913p7HA/hpRT7r8PIwPrLx8qg8IDbRWmG7ajggFkVRHA4rUbRjbmvmZixma7diPE95UId+ESyb1xVCr8Gx38PCiRC8CU6M4OXf+DjmVzKjY8B7NpK6JbHzOVh7FK/Cz4QanvwUrVjqTngKrXE9osq9t5DPQIQVifI0+4wALCLoRj4R8jkaMEzsDaPsAD1JyYRdxYm9/qKeGMHLggzddjzlgRCPx94lFnr8jyAvQb/vYeEEcE7Ce2w7YAE+OjdgBrpQ2iEU1icmrllZe+UxOrMScoUsfElRSz6ieHkT7L4KP9Rg++cA3yRi/5tEBHiTskkra58K5FCRVJFVp+3px0U+EZQRsQGxQ9Z/UnCa3RErGFSE7Fg6ZZlBUtJcXLJtCAK0ykq3zcZYAI5dAgvvwBF7lbuOPQblM6TyTty78ZTFgHeAMfALthYsS6ojXlYB1wMz8KGChBQFL2vw0ZX8JP+Ml09QzsHfdMiPc4D7azFNFDgQiODjbnuAb0bwxNGKcritqMzBzyybCFbHesZSnfMrPLYhwrgEWpmZzB+0mq7rc3FJ5eVrd9qNzwWdb9/K1cMGk7F9O7ABfz02dsznLWA7wiZ8jVsT30dE8CPQCS9DUd4ARuoOvfH292/X+96574JEZpFVfHKUbYI3eXSz7IadrrQR3BqlE0IaVkxeCJ+dj5/PowijgFyUE4AhrlmuAZGzI+fesXkkgrI6awcHl+XwwAFvcvyMXmwpLOZ3ZwyC9Na4gsXc88xbRA+68TPOes4gs+hKrMIQB9jf9yjCw/iS4vy8ZAPHAq/gox2/ZogrdF6+xcdhtnjItJXHTsBIfM2X0+DcjRw7ogbNcztwpR2eHEM5AR834KUz8APCBZEhkb84J7pY/4dtFLp2MiDSn+ScTDNeNNL2GEZvimA8mPeymVW0EFiDErMVIAOftRN3Jflp+c4v+NUjP1lX8HEYXhaggM8eLC/rsfYoajYCkEZSbW+U9ggG8B5KCTADP5fhZYkUSh5l5LXrlMXBgVx+Ez0JgqXMT/+G0vcCDO53OKkeD2ZaNs+lvc62B0rR0bHbtJ1+AzjxMy1pZjyFtd9uJjAK+BTffpPoUZNIU1tHUGAw/hr9A/vYD1DZVhW8HIdyDfkoyunaVt+lLRRHykihE0TDoCZhiWCq0io7g03fLufLo8ro9+khvNd9GeHW0ZsQXsbHX2wl9HK7ysZMhEvw8R/2d7C8gr9JKIp7xQvd9J24C2UGWLlrKeoiKjFu2zycmGny3oIVnH1aX/xZr3PnllGoKve2mUrqI6ndAuMCG7Ayf0pQyvGTQQs0KzRHUOgw/CyPk9ag8p5cuv0UAhKh+KfvibYx+XDV19y5ZRTRcIiH8mbieMZJcHRwNMpbKCUoHVqQ/2slAB+D8CKe+z0XuF9wU2IGOCCYzbK0DSw8ooRdrYJsWlWEAu+3W4G37CLMo00Q0hA+x4/gb+aKWi3QrBwAfKiIFOKEHms74ED4MHsF3QMHkvdjNtt3lmkwFObbnVujTy59d6drvnOjpmm0Vp9EC/zKCMAGx2ZHzAyHYmXbC2JXLTgilrOmNHZc58xYaSDMP16cPsN4zXHk+sHbMsO7wl1wM67Jc+pboJmsgPrBAlXNKy8uIJN0XA7LMxiOmfGNnQpLS8tIeO/2cb28FmiBFmiBFmiBFmiBFmiBFmiBFmiB/wH4f+jryq6sRdUDAAAAAElFTkSuQmCC" alt="DREME Logo"/> <h1>DREME</h1> <h2>Discriminative Regular Expression Motif Elicitation</h2> - </div> - <p class="spaced"> - For further information on how to interpret these results or to get a - copy of the MEME software please access - <a href="http://meme.nbcr.net/">http://meme.nbcr.net</a>. - </p> - <p> + For further information on how to interpret these results please access + To get a copy of the MEME software please access If you use DREME in your research please cite the following paper:<br /> - <span class="citation"> Timothy L. Bailey, "DREME: Motif discovery in transcription factor ChIP-seq data", <i>Bioinformatics</i>, <b>27</b>(12):1653-1659, 2011. - <a href="http://bioinformatics.oxfordjournals.org/content/27/12/1653">[full text]</a> - </span> - </p> - </div> - <!-- navigation --> - <div class="pad2"> - <a class="jump" href="#motifs_sec">Discovered Motifs</a> - | - <a class="jump" href="#inputs_sec">Inputs & Settings</a> - | - <a class="jump" href="#info_sec">Program information</a> - </div> - <!-- alert the user when their browser is not up to the task --> - <noscript><h1 style="color:red">Javascript is required to view these results!</h1></noscript> - <h1 id="html5_warning" style="color:red; display:none;">Your browser does not support canvas!</h1> - <script> - if (!window.HTMLCanvasElement) $("html5_warning").style.display = "block"; - </script> - <!-- description --> - <div id="description_section" style="display:none"> - <div id="description" class="header"> - <h2>Description</h2> - </div> - <div id="description_text" class="box"> - </div> - </div> - <script> - if (data.description) { - $("description_text").innerHTML = ""; - $("description_text").appendChild(make_description(data.description)); - $("description_section").style.display = "block"; - } - </script> - <!-- motifs --> - <div id="motifs_sec" class="header"> - <h2>Discovered Motifs</h2> - <span><a href="#inputs_sec">Next</a> <a href="#">Top</a></span> - </div> - <div id="motifs" class="box"> - <p>No motifs were discovered!</p> - </div> - <script>make_motifs();</script> - <!-- inputs and settings --> - <div id="inputs_sec" class="header"> - <h2>Inputs & Settings</h2> - <span><a href="#motifs_sec">Previous</a> <a href="#info_sec">Next</a> <a href="#">Top</a></span> - </div> - <div class="box"> - <h4>Sequences</h4> - <table id="seq_info" class="inputs"> - <tr><th>Source <div class="help" data-topic="pop_seq_source"></div></th> - <th>Alphabet <div class="help" data-topic="pop_seq_alph"></div></th> - <th>Sequence Count <div class="help" data-topic="pop_seq_count"></div></th> - </tr> - <tr> - <td id="ins_seq_source"></td> - <td id="ins_seq_alphabet"></td> - <td id="ins_seq_count"></td> - </tr> - </table> - <script> - { - var db = data.sequence_db; - $("ins_seq_source").innerHTML = db.file; - $("ins_seq_alphabet").innerHTML = dreme_alphabet.get_alphabet_name(); - $("ins_seq_count").innerHTML = db.count; - } - </script> - <h4>Control Sequences</h4> - <table id="seq_info" class="inputs"> - <tr><th>Source <div class="help" data-topic="pop_seq_source"></div></th> - <th>Sequence Count <div class="help" data-topic="pop_seq_count"></div></th> - </tr> - <tr> - <td id="ins_cseq_source"></td> - <td id="ins_cseq_count"></td> - </tr> - </table> - <script> - { - var db = data.control_db; - if (db.from == "shuffled") { - $("ins_cseq_source").innerHTML = "Shuffled Sequences"; - } else { - $("ins_cseq_source").innerHTML = db.file; - } - $("ins_cseq_count").innerHTML = db.count; - } - </script> - <h4>Background</h4> - <span id="alpha_bg"></span> - <script> - { - $("alpha_bg").appendChild(make_alpha_bg(dreme_alphabet, data.control_db.freqs)); - } - </script> - <h4>Other Settings</h4> - <table id="tbl_settings" class="inputs hide_advanced"> - <tr> - <th>Strand Handling</th> - <td id="opt_strand"> - <span class="strand_none">This alphabet only has one strand</span> - <span class="strand_given">Only the given strand is processed</span> - <span class="strand_both">Both the given and reverse complement strands are processed</span> - </td> - </tr> - <tr><th># REs to Generalize</th><td id="opt_ngen"></td></tr> - <tr><th>Shuffle Seed</th><td id="opt_seed"></td></tr> - <tr><th>E-value Threshold</th><td id="opt_stop_evalue"></td></tr> - <tr><th>Max Motif Count</th><td id="opt_stop_count"></td></tr> - <tr><th>Max Run Time</th><td id="opt_stop_time"></td></tr> - </table> - <script> - { - $("opt_strand").className = (dreme_alphabet.has_complement() ? (data.options.revcomp ? "both" : "given") : "none"); - $("opt_ngen").innerHTML = data.options.ngen; - $("opt_seed").innerHTML = data.options.seed; - $("opt_stop_evalue").innerHTML = data.options.stop.evalue; - $("opt_stop_count").innerHTML = (typeof data.options.stop.count == "number" ? data.options.stop.count : "No maximum motif count."); - $("opt_stop_time").innerHTML = (typeof data.options.stop.time == "number" ? data.options.stop.time + " seconds." : "No maximum running time."); - } - </script> - </div> - <!-- list information on this program --> - <div id="info_sec" class="bar" style="position:relative"> - <div style="position: absolute; right: 0;"><a href="#inputs_sec">Previous</a> <a href="#">Top</a></div> - <div class="subsection"> - <h5 id="version">DREME version</h5> - <span id="ins_version"></span> - (Release date: <span id="ins_release"></span>)<br> - </div> - <script> - $("ins_version").innerHTML = data["version"]; - $("ins_release").innerHTML = data["release"]; - </script> - <div class="subsection"> - <h5 id="reference">Reference</h5> - <span class="citation"> - Timothy L. Bailey, "DREME: Motif discovery in transcription factor ChIP-seq data", <i>Bioinformatics</i>, <b>27</b>(12):1653-1659, 2011. - <a href="http://bioinformatics.oxfordjournals.org/content/27/12/1653">[full text]</a> - </span> - </div> - <div class="subsection"> - <h5 id="command">Command line</h5> - <textarea id="cmd" rows="3" style="width:100%;" readonly="readonly"> - </textarea> - <script>$("cmd").value = data["cmd"].join(" ");</script> - </div> - </div> - </body> </html>
--- a/test-data/dreme_output_test2.txt Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/dreme_output_test2.txt Wed Dec 11 18:05:35 2019 -0500 @@ -1,12 +1,7 @@ -# DREME 4.12.0 -# command: dreme -o ./dreme_test2_out -p dreme_test_sites.fa -norc -rna -s 1 -e 1e-05 -g 100 -mink 4 -maxk 10 -# positives: 1000 from dreme_test_sites.fa (Thu Apr 26 15:09:03 CEST 2018) +# DREME 5.0.5 # negatives: 1000 from shuffled positives -# host: ThinkPad-T450s -# when: Thu May 03 13:22:11 CEST 2018 -MEME version 4.12.0 - +MEME version 5.0.5 ALPHABET "RNA" RNA-LIKE A "Adenine" CC0000 C "Cytosine" 0000CC @@ -27,20 +22,15 @@ K "Keto" = GU T = U END ALPHABET - Background letter frequencies (from dataset): A 0.221 C 0.245 G 0.221 U 0.312 - - MOTIF UUYUCY DREME-1 - # Word Pos Neg P-value E-value # BEST UUYUCY 387 210 2.6e-018 3.3e-013 # UUUUCC 147 75 1.8e-007 2.2e-002 # UUUUCU 155 94 2.2e-005 2.8e+000 # UUCUCU 94 51 1.3e-004 1.7e+001 # UUCUCC 75 42 1.1e-003 1.4e+002 - letter-probability matrix: alength= 4 w= 6 nsites= 459 E= 3.3e-013 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000 @@ -48,21 +38,14 @@ 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.474946 0.000000 0.525054 - - MOTIF YAGG DREME-2 - # Word Pos Neg P-value E-value # BEST YAGG 600 416 1.1e-016 1.4e-011 # CAGG 441 304 1.5e-010 1.8e-005 # UAGG 232 165 1.1e-004 1.3e+001 - letter-probability matrix: alength= 4 w= 4 nsites= 793 E= 1.4e-011 0.000000 0.692308 0.000000 0.307692 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000 0.000000 - - # Stopping reason: E-value threshold exceeded -# Running time: 15.97 seconds
--- a/test-data/dreme_output_test2.xml Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/dreme_output_test2.xml Wed Dec 11 18:05:35 2019 -0500 @@ -1,7 +1,5 @@ -<dreme version="4.12.0" release="Tue Jun 27 16:22:50 2017 -0700"> +<dreme version="5.0.5" release="Mon Mar 18 20:12:19 2019 -0700"> <model> - <command_line>dreme -o ./dreme_test2_out -p dreme_test_sites.fa -norc -rna -s 1 -e 1e-05 -g 100 -mink 4 -maxk 10</command_line> - <positives name="dreme test sites" count="1000" file="dreme_test_sites.fa" last_mod_date="Thu Apr 26 15:09:03 CEST 2018" /> <negatives name="shuffled positive sequences" count="1000" from="shuffled"/> <alphabet name="RNA" like="rna"> <letter id="A" symbol="A" name="Adenine" colour="CC0000"/> @@ -26,8 +24,6 @@ <ngen>100</ngen> <add_pv_thresh>0.01</add_pv_thresh> <seed>1</seed> - <host>ThinkPad-T450s</host> - <when>Thu May 03 13:22:11 CEST 2018</when> </model> <motifs> <motif id="m01" alt="DREME-1" seq="UUYUCY" length="6" nsites="459" p="387" n="210" pvalue="2.6e-018" evalue="3.3e-013" unerased_evalue="3.3e-013"> @@ -51,5 +47,4 @@ <match seq="UAGG" p="232" n="165" pvalue="1.1e-004" evalue="1.3e+001"/> </motif> </motifs> - <run_time cpu="15.97" real="15.97" stop="evalue"/> </dreme>
--- a/test-data/fimo_output_test1.gff Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/fimo_output_test1.gff Wed Dec 11 18:05:35 2019 -0500 @@ -1,9 +1,9 @@ ##gff-version 3 -chrM fimo nucleotide_motif 2299 2306 46.6 - . Name=TACTAAYM_chrM-;Alias=MEME-1;ID=TACTAAYM-MEME-1-1-chrM;pvalue=2.18e-05;qvalue= 0.142;sequence=TACTAACA; -chrM fimo nucleotide_motif 6529 6536 46.6 + . Name=TACTAAYM_chrM+;Alias=MEME-1;ID=TACTAAYM-MEME-1-2-chrM;pvalue=2.18e-05;qvalue= 0.142;sequence=TACTAACA; -chrM fimo nucleotide_motif 7741 7748 46.6 + . Name=TACTAAYM_chrM+;Alias=MEME-1;ID=TACTAAYM-MEME-1-3-chrM;pvalue=2.18e-05;qvalue= 0.142;sequence=TACTAACA; -chrM fimo nucleotide_motif 13656 13663 46.6 + . Name=TACTAAYM_chrM+;Alias=MEME-1;ID=TACTAAYM-MEME-1-4-chrM;pvalue=2.18e-05;qvalue= 0.142;sequence=TACTAACA; -chrM fimo nucleotide_motif 13740 13747 46.6 + . Name=TACTAAYM_chrM+;Alias=MEME-1;ID=TACTAAYM-MEME-1-5-chrM;pvalue=2.18e-05;qvalue= 0.142;sequence=TACTAACA; +chrM fimo nucleotide_motif 6529 6536 46.6 + . Name=TACTAAYM_chrM+;Alias=MEME-1;ID=TACTAAYM-MEME-1-1-chrM;pvalue=2.18e-05;qvalue= 0.142;sequence=TACTAACA; +chrM fimo nucleotide_motif 7741 7748 46.6 + . Name=TACTAAYM_chrM+;Alias=MEME-1;ID=TACTAAYM-MEME-1-2-chrM;pvalue=2.18e-05;qvalue= 0.142;sequence=TACTAACA; +chrM fimo nucleotide_motif 13656 13663 46.6 + . Name=TACTAAYM_chrM+;Alias=MEME-1;ID=TACTAAYM-MEME-1-3-chrM;pvalue=2.18e-05;qvalue= 0.142;sequence=TACTAACA; +chrM fimo nucleotide_motif 13740 13747 46.6 + . Name=TACTAAYM_chrM+;Alias=MEME-1;ID=TACTAAYM-MEME-1-4-chrM;pvalue=2.18e-05;qvalue= 0.142;sequence=TACTAACA; +chrM fimo nucleotide_motif 2299 2306 46.6 - . Name=TACTAAYM_chrM-;Alias=MEME-1;ID=TACTAAYM-MEME-1-5-chrM;pvalue=2.18e-05;qvalue= 0.142;sequence=TACTAACA; chrM fimo nucleotide_motif 861 868 44 + . Name=TACTAAYM_chrM+;Alias=MEME-1;ID=TACTAAYM-MEME-1-6-chrM;pvalue=3.96e-05;qvalue= 0.185;sequence=TACTAACC; chrM fimo nucleotide_motif 9346 9353 44 + . Name=TACTAAYM_chrM+;Alias=MEME-1;ID=TACTAAYM-MEME-1-7-chrM;pvalue=3.96e-05;qvalue= 0.185;sequence=TACTAACC; chrM fimo nucleotide_motif 3767 3774 41.8 + . Name=TACTAAYM_chrM+;Alias=MEME-1;ID=TACTAAYM-MEME-1-8-chrM;pvalue=6.62e-05;qvalue= 0.216;sequence=TACTAATA;
--- a/test-data/fimo_output_test1.html Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/fimo_output_test1.html Wed Dec 11 18:05:35 2019 -0500 @@ -7,9 +7,8 @@ <style type="text/css"> td.left {text-align: left;} td.right {text-align: right; padding-right: 1cm;} -</style> </head> -<body bgcolor="#D5F0FF"> +<body color="#000000"> <a name="top_buttons"></a> <hr> <table summary="buttons" align="left" cellspacing="0"> @@ -17,98 +16,36 @@ <td bgcolor="#00FFFF"><a href="#database_and_motifs"><b>Database and Motifs</b></a></td> <td bgcolor="#DDFFDD"><a href="#sec_i"><b>High-scoring Motif Occurences</b></a></td> <td bgcolor="#DDDDFF"><a href="#debugging_information"><b>Debugging Information</b></a></td> +<td bgcolor="#FFDD00"><a href="fimo.tsv""><b>Results in TSV Format</b></a></td> +<td bgcolor="#FFDDFF"><a href="fimo.gff""><b>Results in GFF3 Format</b></a></td> </tr> </table> -<br/> -<br/> -<hr/> <center><big><b>FIMO - Motif search tool</b></big></center> -<hr> -<p> -FIMO version 4.12.0, (Release date: Tue Jun 27 16:22:50 2017 -0700) -</p> -<p> -For further information on how to interpret these results -or to get a copy of the FIMO software please access -<a href="http://meme.nbcr.net">http://meme.nbcr.net</a></p> +FIMO version 5.0.5, (Release date: Mon Mar 18 20:12:19 2019 -0700) +For further information on how to interpret these results please access <a href="http://meme-suite.org/doc/fimo-output-format.html">http://meme-suite.org/doc/fimo-output-format.html</a>.<br> +To get a copy of the FIMO software please access <a href="http://meme-suite.org">http://meme-suite.org</a> <p>If you use FIMO in your research, please cite the following paper:<br> Charles E. Grant, Timothy L. Bailey, and William Stafford Noble, "FIMO: Scanning for occurrences of a given motif", <i>Bioinformatics</i>, <b>27</b>(7):1017-1018, 2011. -<a href="http://bioinformatics.oxfordjournals.org/content/27/7/1017">[full text]</a></p> -<hr> <center><big><b><a name="database_and_motifs">DATABASE AND MOTIFS</a></b></big></center> -<hr> -<div style="padding-left: 0.75in; line-height: 1em; font-family: monospace;"> -<p> - DATABASE hsa_chrM.fa - <br /> Database contains 1 sequences, 16569 residues -</p> -<p> - MOTIFS meme_fimo_input_1.xml (DNA) - <table> - <thead> - <tr> - <th style="border-bottom: 1px dashed;">MOTIF</th> - <th style="border-bottom: 1px dashed; padding-left: 1em;">WIDTH</th> - <th style="border-bottom: 1px dashed; padding-left: 1em;text-align:left;" > BEST POSSIBLE MATCH - </th> - </tr> - </thead> - <tbody> - <tr> - <td style="text-align:right;">TACTAAYM</td> - <td style="text-align:right;padding-left: 1em;">8</td> - <td style="text-align:left;padding-left: 1em;">TACTAACA</td> - </tr> - </tbody> - </table> -</p> -<p> Random model letter frequencies (--nrdb--): -<br/> - A 0.275 C 0.225 G 0.225 T 0.275 </p> -</div> -<hr> <center><big><b><a name="sec_i">SECTION I: HIGH-SCORING MOTIF OCCURENCES</a></b></big></center> -<hr> -<ul> -<li> There were 11 motif occurences with a p-value less than 0.0001. - The full set of motif occurences can be seen in the -tab-delimited plain text output file -<a href="fimo.txt">fimo.txt</a>, -the GFF file -<a href="fimo.gff">fimo.gff</a> -which may be suitable for uploading to the -<a href="http://genome.ucsc.edu/cgi-bin/hgTables">UCSC Genome Table Browser</a> -(assuming the FASTA input sequences included genomic coordinates in UCSC or Galaxy format), -or the XML file -<a href="fimo.xml">fimo.xml</a>. -</li> -<li> -The p-value of a motif occurrence is defined as the +TSV (tab-delimited values) output file +The <i>p</i>-value of a motif occurrence is defined as the probability of a random sequence of the same length as the motif matching that position of the sequence with as good or better a score. -</li> -<li> The score for the match of a position in a sequence to a motif is computed by summing the appropriate entries from each column of the position-dependent scoring matrix that represents the motif. -</li> -<li> The q-value of a motif occurrence is defined as the false discovery rate if the occurrence is accepted as significant. -</li> -<li>The table is sorted by increasing p-value.</li> -</ul> -<table border="1"> -<thead> -<tr> +<li>The table is sorted by increasing <i>p</i>-value.</li> <th>Motif ID</th> <th>Alt ID</th> <th>Sequence Name</th> @@ -118,21 +55,6 @@ <th>p-value</th> <th>q-value</th> <th>Matched Sequence</th> -</tr> -</thead> -<tbody> - <tr> - <td style="text-align:left;">TACTAAYM</td> - <td style="text-align:left;">MEME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">2299</td> - <td style="text-align:left;">2306</td> - <td style="text-align:left;">2.18e-05</td> - <td style="text-align:left;">0.142</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TACTAACA</td> - </tr> - <tr> <td style="text-align:left;">TACTAAYM</td> <td style="text-align:left;">MEME-1</td> <td style="text-align:left;">chrM</td> @@ -142,159 +64,10 @@ <td style="text-align:left;">2.18e-05</td> <td style="text-align:left;">0.142</td> <td style="text-align:left;font-size:x-large;font-family:monospace;">TACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">TACTAAYM</td> - <td style="text-align:left;">MEME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7741</td> - <td style="text-align:left;">7748</td> - <td style="text-align:left;">2.18e-05</td> - <td style="text-align:left;">0.142</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">TACTAAYM</td> - <td style="text-align:left;">MEME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13656</td> - <td style="text-align:left;">13663</td> - <td style="text-align:left;">2.18e-05</td> - <td style="text-align:left;">0.142</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">TACTAAYM</td> - <td style="text-align:left;">MEME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13740</td> - <td style="text-align:left;">13747</td> - <td style="text-align:left;">2.18e-05</td> - <td style="text-align:left;">0.142</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">TACTAAYM</td> - <td style="text-align:left;">MEME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">861</td> - <td style="text-align:left;">868</td> - <td style="text-align:left;">3.96e-05</td> - <td style="text-align:left;">0.185</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TACTAACC</td> - </tr> - <tr> - <td style="text-align:left;">TACTAAYM</td> - <td style="text-align:left;">MEME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9346</td> - <td style="text-align:left;">9353</td> - <td style="text-align:left;">3.96e-05</td> - <td style="text-align:left;">0.185</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TACTAACC</td> - </tr> - <tr> - <td style="text-align:left;">TACTAAYM</td> - <td style="text-align:left;">MEME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3767</td> - <td style="text-align:left;">3774</td> - <td style="text-align:left;">6.62e-05</td> - <td style="text-align:left;">0.216</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TACTAATA</td> - </tr> - <tr> - <td style="text-align:left;">TACTAAYM</td> - <td style="text-align:left;">MEME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5497</td> - <td style="text-align:left;">5504</td> - <td style="text-align:left;">6.62e-05</td> - <td style="text-align:left;">0.216</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TACTAATA</td> - </tr> - <tr> - <td style="text-align:left;">TACTAAYM</td> - <td style="text-align:left;">MEME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10105</td> - <td style="text-align:left;">10112</td> - <td style="text-align:left;">6.62e-05</td> - <td style="text-align:left;">0.216</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TACTAATA</td> - </tr> - <tr> - <td style="text-align:left;">TACTAAYM</td> - <td style="text-align:left;">MEME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10959</td> - <td style="text-align:left;">10966</td> - <td style="text-align:left;">8.79e-05</td> - <td style="text-align:left;">0.261</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TACTAACT</td> - </tr> -</tbody> </table> - <hr> <center><big><b><a name="debugging_information">DEBUGGING INFORMATION</a></b></big></center> -<hr> -<p> -Command line: -</p> -<pre> -fimo -oc fimo_test1_out meme_fimo_input_1.xml hsa_chrM.fa -</pre> -<p> -Settings: -</p> -<pre> -<table> - <tr> - <td style="padding-right: 2em">output_directory = fimo_test1_out</td> - <td style="padding-left: 5em; padding-right: 2em">MEME file name = meme_fimo_input_1.xml</td> - <td style="padding-left: 5em; padding-right: 2em">sequence file name = hsa_chrM.fa</td> - </tr> <tr> - <td style="padding-right: 2em">background file name = --nrdb--</td> - <td style="padding-left: 5em; padding-right: 2em">alphabet = DNA</td> - <td style="padding-left: 5em; padding-right: 2em">max stored scores = 100000</td> - </tr> <tr> - <td style="padding-right: 2em">allow clobber = true</td> - <td style="padding-left: 5em; padding-right: 2em">compute q-values = true</td> - <td style="padding-left: 5em; padding-right: 2em">parse genomic coord. = false</td> - </tr> - <tr> - <td style="padding-right: 2em">text only = false</td> - <td style="padding-left: 5em; padding-right: 2em">scan both strands = true</td> - <td style="padding-left: 5em; padding-right: 2em">max strand = false</td> - </tr> - <tr> - <td style="padding-right: 2em">threshold type = p-value</td> - <td style="padding-left: 5em; padding-right: 2em">output theshold = 0.0001</td> - <td style="padding-left: 5em; padding-right: 2em">pseudocount = 0.1</td> - </tr> - <tr> - <td style="padding-right: 2em">alpha = 1</td> - <td style="padding-left: 5em; padding-right: 2em">verbosity = 2</td> - <td style="padding-left: 5em; padding-right: 2em"></td> - </tr> - -</table> -</pre> -<p> This information can be useful in the event you wish to report a problem with the FIMO software. -</p> -<hr> -<span style="background-color: #DDDDFF"><a href="#top_buttons"><b>Go to top</b></a></span> </body> </html>
--- a/test-data/fimo_output_test1.txt Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/fimo_output_test1.txt Wed Dec 11 18:05:35 2019 -0500 @@ -1,9 +1,9 @@ -# motif_id motif_alt_id sequence_name start stop strand score p-value q-value matched_sequence -TACTAAYM MEME-1 chrM 2299 2306 - 12.9701 2.18e-05 0.142 TACTAACA +motif_id motif_alt_id sequence_name start stop strand score p-value q-value matched_sequence TACTAAYM MEME-1 chrM 6529 6536 + 12.9701 2.18e-05 0.142 TACTAACA TACTAAYM MEME-1 chrM 7741 7748 + 12.9701 2.18e-05 0.142 TACTAACA TACTAAYM MEME-1 chrM 13656 13663 + 12.9701 2.18e-05 0.142 TACTAACA TACTAAYM MEME-1 chrM 13740 13747 + 12.9701 2.18e-05 0.142 TACTAACA +TACTAAYM MEME-1 chrM 2299 2306 - 12.9701 2.18e-05 0.142 TACTAACA TACTAAYM MEME-1 chrM 861 868 + 12.2836 3.96e-05 0.185 TACTAACC TACTAAYM MEME-1 chrM 9346 9353 + 12.2836 3.96e-05 0.185 TACTAACC TACTAAYM MEME-1 chrM 3767 3774 + 11.7164 6.62e-05 0.216 TACTAATA
--- a/test-data/fimo_output_test1.xml Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/fimo_output_test1.xml Wed Dec 11 18:05:35 2019 -0500 @@ -1,16 +1,12 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Begin document body --> -<fimo version="4.12.0" release="Tue Jun 27 16:22:50 2017 -0700"> +<fimo version="5.0.5" release="Mon Mar 18 20:12:19 2019 -0700"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= xmlns:fimo="http://noble.gs.washington.edu/schema/fimo" > -<command-line>fimo -oc fimo_test1_out meme_fimo_input_1.xml hsa_chrM.fa</command-line> <settings> -<setting name="output directory">fimo_test1_out</setting> -<setting name="MEME file name">meme_fimo_input_1.xml</setting> -<setting name="sequence file name">hsa_chrM.fa</setting> <setting name="background file name">--nrdb--</setting> -<setting name="allow clobber">true</setting> +<setting name="allow clobber">false</setting> <setting name="compute q-values">true</setting> <setting name="parse genomic coord.">false</setting> <setting name="text only">false</setting>
--- a/test-data/fimo_output_test2.gff Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/fimo_output_test2.gff Wed Dec 11 18:05:35 2019 -0500 @@ -1,12 +1,12 @@ ##gff-version 3 -chrM fimo nucleotide_motif 440 446 40.9 + . Name=ACTAAYH_chrM+;Alias=DREME-1;ID=ACTAAYH-DREME-1-1-chrM;pvalue=8.2e-05;qvalue= 0.327;sequence=ACTAACA; -chrM fimo nucleotide_motif 2093 2099 40.9 - . Name=ACTAAYH_chrM-;Alias=DREME-1;ID=ACTAAYH-DREME-1-2-chrM;pvalue=8.2e-05;qvalue= 0.327;sequence=ACTAACA; -chrM fimo nucleotide_motif 2299 2305 40.9 - . Name=ACTAAYH_chrM-;Alias=DREME-1;ID=ACTAAYH-DREME-1-3-chrM;pvalue=8.2e-05;qvalue= 0.327;sequence=ACTAACA; -chrM fimo nucleotide_motif 5186 5192 40.9 + . Name=ACTAAYH_chrM+;Alias=DREME-1;ID=ACTAAYH-DREME-1-4-chrM;pvalue=8.2e-05;qvalue= 0.327;sequence=ACTAACA; -chrM fimo nucleotide_motif 6530 6536 40.9 + . Name=ACTAAYH_chrM+;Alias=DREME-1;ID=ACTAAYH-DREME-1-5-chrM;pvalue=8.2e-05;qvalue= 0.327;sequence=ACTAACA; -chrM fimo nucleotide_motif 7742 7748 40.9 + . Name=ACTAAYH_chrM+;Alias=DREME-1;ID=ACTAAYH-DREME-1-6-chrM;pvalue=8.2e-05;qvalue= 0.327;sequence=ACTAACA; -chrM fimo nucleotide_motif 13657 13663 40.9 + . Name=ACTAAYH_chrM+;Alias=DREME-1;ID=ACTAAYH-DREME-1-7-chrM;pvalue=8.2e-05;qvalue= 0.327;sequence=ACTAACA; -chrM fimo nucleotide_motif 13741 13747 40.9 + . Name=ACTAAYH_chrM+;Alias=DREME-1;ID=ACTAAYH-DREME-1-8-chrM;pvalue=8.2e-05;qvalue= 0.327;sequence=ACTAACA; -chrM fimo nucleotide_motif 510 516 43.8 + . Name=CCAGCAY_chrM+;Alias=DREME-5;ID=CCAGCAY-DREME-5-1-chrM;pvalue=4.15e-05;qvalue= 0.668;sequence=CCAGCAC; -chrM fimo nucleotide_motif 5137 5143 43.8 + . Name=CCAGCAY_chrM+;Alias=DREME-5;ID=CCAGCAY-DREME-5-2-chrM;pvalue=4.15e-05;qvalue= 0.668;sequence=CCAGCAC; +chrM fimo nucleotide_motif 440 446 40.9 + . Name=ACTAAYH_chrM+;Alias=DREME-1;ID=ACTAAYH-DREME-1-1-chrM;pvalue=8.2e-05;qvalue= 0.332;sequence=ACTAACA; +chrM fimo nucleotide_motif 2093 2099 40.9 - . Name=ACTAAYH_chrM-;Alias=DREME-1;ID=ACTAAYH-DREME-1-2-chrM;pvalue=8.2e-05;qvalue= 0.332;sequence=ACTAACA; +chrM fimo nucleotide_motif 2299 2305 40.9 - . Name=ACTAAYH_chrM-;Alias=DREME-1;ID=ACTAAYH-DREME-1-3-chrM;pvalue=8.2e-05;qvalue= 0.332;sequence=ACTAACA; +chrM fimo nucleotide_motif 5186 5192 40.9 + . Name=ACTAAYH_chrM+;Alias=DREME-1;ID=ACTAAYH-DREME-1-4-chrM;pvalue=8.2e-05;qvalue= 0.332;sequence=ACTAACA; +chrM fimo nucleotide_motif 6530 6536 40.9 + . Name=ACTAAYH_chrM+;Alias=DREME-1;ID=ACTAAYH-DREME-1-5-chrM;pvalue=8.2e-05;qvalue= 0.332;sequence=ACTAACA; +chrM fimo nucleotide_motif 7742 7748 40.9 + . Name=ACTAAYH_chrM+;Alias=DREME-1;ID=ACTAAYH-DREME-1-6-chrM;pvalue=8.2e-05;qvalue= 0.332;sequence=ACTAACA; +chrM fimo nucleotide_motif 13657 13663 40.9 + . Name=ACTAAYH_chrM+;Alias=DREME-1;ID=ACTAAYH-DREME-1-7-chrM;pvalue=8.2e-05;qvalue= 0.332;sequence=ACTAACA; +chrM fimo nucleotide_motif 13741 13747 40.9 + . Name=ACTAAYH_chrM+;Alias=DREME-1;ID=ACTAAYH-DREME-1-8-chrM;pvalue=8.2e-05;qvalue= 0.332;sequence=ACTAACA; +chrM fimo nucleotide_motif 510 516 43.8 + . Name=CCAGCAY_chrM+;Alias=DREME-5;ID=CCAGCAY-DREME-5-1-chrM;pvalue=4.15e-05;qvalue= 0.683;sequence=CCAGCAC; +chrM fimo nucleotide_motif 5137 5143 43.8 + . Name=CCAGCAY_chrM+;Alias=DREME-5;ID=CCAGCAY-DREME-5-2-chrM;pvalue=4.15e-05;qvalue= 0.683;sequence=CCAGCAC; chrM fimo nucleotide_motif 4241 4247 40.3 + . Name=CCAGCAY_chrM+;Alias=DREME-5;ID=CCAGCAY-DREME-5-3-chrM;pvalue=9.37e-05;qvalue= 1;sequence=CCAGCAT;
--- a/test-data/fimo_output_test2.html Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/fimo_output_test2.html Wed Dec 11 18:05:35 2019 -0500 @@ -9,7 +9,7 @@ td.right {text-align: right; padding-right: 1cm;} </style> </head> -<body bgcolor="#D5F0FF"> +<body color="#000000"> <a name="top_buttons"></a> <hr> <table summary="buttons" align="left" cellspacing="0"> @@ -17,123 +17,44 @@ <td bgcolor="#00FFFF"><a href="#database_and_motifs"><b>Database and Motifs</b></a></td> <td bgcolor="#DDFFDD"><a href="#sec_i"><b>High-scoring Motif Occurences</b></a></td> <td bgcolor="#DDDDFF"><a href="#debugging_information"><b>Debugging Information</b></a></td> +<td bgcolor="#FFDD00"><a href="fimo.tsv""><b>Results in TSV Format</b></a></td> +<td bgcolor="#FFDDFF"><a href="fimo.gff""><b>Results in GFF3 Format</b></a></td> </tr> </table> -<br/> -<br/> -<hr/> <center><big><b>FIMO - Motif search tool</b></big></center> -<hr> -<p> -FIMO version 4.12.0, (Release date: Tue Jun 27 16:22:50 2017 -0700) -</p> -<p> -For further information on how to interpret these results -or to get a copy of the FIMO software please access -<a href="http://meme.nbcr.net">http://meme.nbcr.net</a></p> +FIMO version 5.0.5, (Release date: Mon Mar 18 20:12:19 2019 -0700) +For further information on how to interpret these results please access <a href="http://meme-suite.org/doc/fimo-output-format.html">http://meme-suite.org/doc/fimo-output-format.html</a>.<br> +To get a copy of the FIMO software please access <a href="http://meme-suite.org">http://meme-suite.org</a> <p>If you use FIMO in your research, please cite the following paper:<br> Charles E. Grant, Timothy L. Bailey, and William Stafford Noble, "FIMO: Scanning for occurrences of a given motif", <i>Bioinformatics</i>, <b>27</b>(7):1017-1018, 2011. -<a href="http://bioinformatics.oxfordjournals.org/content/27/7/1017">[full text]</a></p> -<hr> <center><big><b><a name="database_and_motifs">DATABASE AND MOTIFS</a></b></big></center> -<hr> -<div style="padding-left: 0.75in; line-height: 1em; font-family: monospace;"> -<p> - DATABASE hsa_chrM.fa - <br /> Database contains 1 sequences, 16569 residues -</p> -<p> - MOTIFS dreme_fimo_input_1.xml (DNA) <table> <thead> - <tr> - <th style="border-bottom: 1px dashed;">MOTIF</th> - <th style="border-bottom: 1px dashed; padding-left: 1em;">WIDTH</th> - <th style="border-bottom: 1px dashed; padding-left: 1em;text-align:left;" > - BEST POSSIBLE MATCH - </th> - </tr> </thead> <tbody> - <tr> - <td style="text-align:right;">ACTAAYH</td> - <td style="text-align:right;padding-left: 1em;">7</td> - <td style="text-align:left;padding-left: 1em;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:right;">YTAACA</td> - <td style="text-align:right;padding-left: 1em;">6</td> - <td style="text-align:left;padding-left: 1em;">TTAACA</td> - </tr> - <tr> - <td style="text-align:right;">TCTGT</td> - <td style="text-align:right;padding-left: 1em;">5</td> - <td style="text-align:left;padding-left: 1em;">TCTGT</td> - </tr> - <tr> - <td style="text-align:right;">SCCAGG</td> - <td style="text-align:right;padding-left: 1em;">6</td> - <td style="text-align:left;padding-left: 1em;">CCCAGG</td> - </tr> - <tr> - <td style="text-align:right;">CCAGCAY</td> - <td style="text-align:right;padding-left: 1em;">7</td> - <td style="text-align:left;padding-left: 1em;">CCAGCAC</td> - </tr> - <tr> - <td style="text-align:right;">GMATGT</td> - <td style="text-align:right;padding-left: 1em;">6</td> - <td style="text-align:left;padding-left: 1em;">GAATGT</td> - </tr> </tbody> </table> -</p> -<p> -Random model letter frequencies (fimo_background_probs_hsa_chrM.txt): -<br/> - A 0.278 C 0.222 G 0.222 T 0.278 </p> -</div> -<hr> <center><big><b><a name="sec_i">SECTION I: HIGH-SCORING MOTIF OCCURENCES</a></b></big></center> -<hr> -<ul> -<li> There were 11 motif occurences with a p-value less than 0.0001. - The full set of motif occurences can be seen in the -tab-delimited plain text output file -<a href="fimo.txt">fimo.txt</a>, -the GFF file -<a href="fimo.gff">fimo.gff</a> +TSV (tab-delimited values) output file +the GFF3 file which may be suitable for uploading to the -<a href="http://genome.ucsc.edu/cgi-bin/hgTables">UCSC Genome Table Browser</a> (assuming the FASTA input sequences included genomic coordinates in UCSC or Galaxy format), or the XML file -<a href="fimo.xml">fimo.xml</a>. -</li> -<li> -The p-value of a motif occurrence is defined as the +The <i>p</i>-value of a motif occurrence is defined as the probability of a random sequence of the same length as the motif matching that position of the sequence with as good or better a score. -</li> -<li> The score for the match of a position in a sequence to a motif is computed by summing the appropriate entries from each column of the position-dependent scoring matrix that represents the motif. -</li> -<li> The q-value of a motif occurrence is defined as the false discovery rate if the occurrence is accepted as significant. -</li> -<li>The table is sorted by increasing p-value.</li> -</ul> -<table border="1"> -<thead> -<tr> +<li>The table is sorted by increasing <i>p</i>-value.</li> <th>Motif ID</th> <th>Alt ID</th> <th>Sequence Name</th> @@ -143,9 +64,6 @@ <th>p-value</th> <th>q-value</th> <th>Matched Sequence</th> -</tr> -</thead> -<tbody> <tr> <td style="text-align:left;">CCAGCAY</td> <td style="text-align:left;">DREME-5</td> @@ -154,172 +72,19 @@ <td style="text-align:left;">510</td> <td style="text-align:left;">516</td> <td style="text-align:left;">4.15e-05</td> - <td style="text-align:left;">0.668</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCAGCAC</td> - </tr> - <tr> - <td style="text-align:left;">CCAGCAY</td> - <td style="text-align:left;">DREME-5</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5137</td> - <td style="text-align:left;">5143</td> - <td style="text-align:left;">4.15e-05</td> - <td style="text-align:left;">0.668</td> + <td style="text-align:left;">0.683</td> <td style="text-align:left;font-size:x-large;font-family:monospace;">CCAGCAC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">440</td> - <td style="text-align:left;">446</td> - <td style="text-align:left;">8.2e-05</td> - <td style="text-align:left;">0.327</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> <td style="text-align:left;">2093</td> <td style="text-align:left;">2099</td> <td style="text-align:left;">8.2e-05</td> - <td style="text-align:left;">0.327</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">2299</td> - <td style="text-align:left;">2305</td> - <td style="text-align:left;">8.2e-05</td> - <td style="text-align:left;">0.327</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5186</td> - <td style="text-align:left;">5192</td> - <td style="text-align:left;">8.2e-05</td> - <td style="text-align:left;">0.327</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6530</td> - <td style="text-align:left;">6536</td> - <td style="text-align:left;">8.2e-05</td> - <td style="text-align:left;">0.327</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7742</td> - <td style="text-align:left;">7748</td> - <td style="text-align:left;">8.2e-05</td> - <td style="text-align:left;">0.327</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13657</td> - <td style="text-align:left;">13663</td> - <td style="text-align:left;">8.2e-05</td> - <td style="text-align:left;">0.327</td> + <td style="text-align:left;">0.332</td> <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13741</td> - <td style="text-align:left;">13747</td> - <td style="text-align:left;">8.2e-05</td> - <td style="text-align:left;">0.327</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">CCAGCAY</td> - <td style="text-align:left;">DREME-5</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4241</td> - <td style="text-align:left;">4247</td> - <td style="text-align:left;">9.37e-05</td> - <td style="text-align:left;">1</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCAGCAT</td> - </tr> -</tbody> -</table> - <hr> <center><big><b><a name="debugging_information">DEBUGGING INFORMATION</a></b></big></center> -<hr> -<p> Command line: -</p> -<pre> -fimo -oc fimo_test2_out --bgfile fimo_background_probs_hsa_chrM.txt dreme_fimo_input_1.xml hsa_chrM.fa -</pre> -<p> Settings: -</p> -<pre> -<table> - <tr> - <td style="padding-right: 2em">output_directory = fimo_test2_out</td> - <td style="padding-left: 5em; padding-right: 2em">MEME file name = dreme_fimo_input_1.xml</td> - <td style="padding-left: 5em; padding-right: 2em">sequence file name = hsa_chrM.fa</td> - </tr> <tr> - <td style="padding-right: 2em">background file name = fimo_background_probs_hsa_chrM.txt</td> - <td style="padding-left: 5em; padding-right: 2em">alphabet = DNA</td> - <td style="padding-left: 5em; padding-right: 2em">max stored scores = 100000</td> - </tr> <tr> - <td style="padding-right: 2em">allow clobber = true</td> - <td style="padding-left: 5em; padding-right: 2em">compute q-values = true</td> - <td style="padding-left: 5em; padding-right: 2em">parse genomic coord. = false</td> - </tr> - <tr> - <td style="padding-right: 2em">text only = false</td> - <td style="padding-left: 5em; padding-right: 2em">scan both strands = true</td> - <td style="padding-left: 5em; padding-right: 2em">max strand = false</td> - </tr> - <tr> - <td style="padding-right: 2em">threshold type = p-value</td> - <td style="padding-left: 5em; padding-right: 2em">output theshold = 0.0001</td> - <td style="padding-left: 5em; padding-right: 2em">pseudocount = 0.1</td> - </tr> - <tr> - <td style="padding-right: 2em">alpha = 1</td> - <td style="padding-left: 5em; padding-right: 2em">verbosity = 2</td> - <td style="padding-left: 5em; padding-right: 2em"></td> - </tr> - -</table> -</pre> -<p> This information can be useful in the event you wish to report a problem with the FIMO software. -</p> -<hr> -<span style="background-color: #DDDDFF"><a href="#top_buttons"><b>Go to top</b></a></span> </body> </html>
--- a/test-data/fimo_output_test2.txt Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/fimo_output_test2.txt Wed Dec 11 18:05:35 2019 -0500 @@ -1,12 +1,12 @@ -# motif_id motif_alt_id sequence_name start stop strand score p-value q-value matched_sequence -CCAGCAY DREME-5 chrM 510 516 + 13.5843 4.15e-05 0.668 CCAGCAC -CCAGCAY DREME-5 chrM 5137 5143 + 13.5843 4.15e-05 0.668 CCAGCAC -ACTAAYH DREME-1 chrM 440 446 + 11.7385 8.2e-05 0.327 ACTAACA -ACTAAYH DREME-1 chrM 2093 2099 - 11.7385 8.2e-05 0.327 ACTAACA -ACTAAYH DREME-1 chrM 2299 2305 - 11.7385 8.2e-05 0.327 ACTAACA -ACTAAYH DREME-1 chrM 5186 5192 + 11.7385 8.2e-05 0.327 ACTAACA -ACTAAYH DREME-1 chrM 6530 6536 + 11.7385 8.2e-05 0.327 ACTAACA -ACTAAYH DREME-1 chrM 7742 7748 + 11.7385 8.2e-05 0.327 ACTAACA -ACTAAYH DREME-1 chrM 13657 13663 + 11.7385 8.2e-05 0.327 ACTAACA -ACTAAYH DREME-1 chrM 13741 13747 + 11.7385 8.2e-05 0.327 ACTAACA +motif_id motif_alt_id sequence_name start stop strand score p-value q-value matched_sequence +CCAGCAY DREME-5 chrM 510 516 + 13.5843 4.15e-05 0.683 CCAGCAC +CCAGCAY DREME-5 chrM 5137 5143 + 13.5843 4.15e-05 0.683 CCAGCAC +ACTAAYH DREME-1 chrM 440 446 + 11.7286 8.2e-05 0.332 ACTAACA +ACTAAYH DREME-1 chrM 2093 2099 - 11.7286 8.2e-05 0.332 ACTAACA +ACTAAYH DREME-1 chrM 2299 2305 - 11.7286 8.2e-05 0.332 ACTAACA +ACTAAYH DREME-1 chrM 5186 5192 + 11.7286 8.2e-05 0.332 ACTAACA +ACTAAYH DREME-1 chrM 6530 6536 + 11.7286 8.2e-05 0.332 ACTAACA +ACTAAYH DREME-1 chrM 7742 7748 + 11.7286 8.2e-05 0.332 ACTAACA +ACTAAYH DREME-1 chrM 13657 13663 + 11.7286 8.2e-05 0.332 ACTAACA +ACTAAYH DREME-1 chrM 13741 13747 + 11.7286 8.2e-05 0.332 ACTAACA CCAGCAY DREME-5 chrM 4241 4247 + 13.1461 9.37e-05 1 CCAGCAT
--- a/test-data/fimo_output_test2.xml Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/fimo_output_test2.xml Wed Dec 11 18:05:35 2019 -0500 @@ -1,16 +1,11 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Begin document body --> -<fimo version="4.12.0" release="Tue Jun 27 16:22:50 2017 -0700"> +<fimo version="5.0.5" release="Mon Mar 18 20:12:19 2019 -0700"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= xmlns:fimo="http://noble.gs.washington.edu/schema/fimo" > -<command-line>fimo -oc fimo_test2_out --bgfile fimo_background_probs_hsa_chrM.txt dreme_fimo_input_1.xml hsa_chrM.fa</command-line> <settings> -<setting name="output directory">fimo_test2_out</setting> -<setting name="MEME file name">dreme_fimo_input_1.xml</setting> -<setting name="sequence file name">hsa_chrM.fa</setting> -<setting name="background file name">fimo_background_probs_hsa_chrM.txt</setting> -<setting name="allow clobber">true</setting> +<setting name="allow clobber">false</setting> <setting name="compute q-values">true</setting> <setting name="parse genomic coord.">false</setting> <setting name="text only">false</setting> @@ -45,7 +40,6 @@ <motif name="SCCAGG" alt="DREME-4" width="6" best-possible-match="CCCAGG"/> <motif name="CCAGCAY" alt="DREME-5" width="7" best-possible-match="CCAGCAC"/> <motif name="GMATGT" alt="DREME-6" width="6" best-possible-match="GAATGT"/> -<background source="fimo_background_probs_hsa_chrM.txt"> <value letter="A">0.278</value> <value letter="C">0.222</value> <value letter="G">0.222</value>
--- a/test-data/fimo_output_test3.html Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/fimo_output_test3.html Wed Dec 11 18:05:35 2019 -0500 @@ -5,48 +5,23 @@ <meta charset="UTF-8"> <title>FIMO Results</title> <style type="text/css"> -td.left {text-align: left;} -td.right {text-align: right; padding-right: 1cm;} -</style> </head> -<body bgcolor="#D5F0FF"> -<a name="top_buttons"></a> -<hr> -<table summary="buttons" align="left" cellspacing="0"> -<tr> +<body color="#000000"> <td bgcolor="#00FFFF"><a href="#database_and_motifs"><b>Database and Motifs</b></a></td> <td bgcolor="#DDFFDD"><a href="#sec_i"><b>High-scoring Motif Occurences</b></a></td> <td bgcolor="#DDDDFF"><a href="#debugging_information"><b>Debugging Information</b></a></td> -</tr> -</table> -<br/> -<br/> -<hr/> +<td bgcolor="#FFDD00"><a href="fimo.tsv""><b>Results in TSV Format</b></a></td> +<td bgcolor="#FFDDFF"><a href="fimo.gff""><b>Results in GFF3 Format</b></a></td> <center><big><b>FIMO - Motif search tool</b></big></center> -<hr> -<p> -FIMO version 4.12.0, (Release date: Tue Jun 27 16:22:50 2017 -0700) -</p> -<p> -For further information on how to interpret these results -or to get a copy of the FIMO software please access -<a href="http://meme.nbcr.net">http://meme.nbcr.net</a></p> +FIMO version 5.0.5, (Release date: Mon Mar 18 20:12:19 2019 -0700) +For further information on how to interpret these results please access <a href="http://meme-suite.org/doc/fimo-output-format.html">http://meme-suite.org/doc/fimo-output-format.html</a>.<br> +To get a copy of the FIMO software please access <a href="http://meme-suite.org">http://meme-suite.org</a> <p>If you use FIMO in your research, please cite the following paper:<br> Charles E. Grant, Timothy L. Bailey, and William Stafford Noble, "FIMO: Scanning for occurrences of a given motif", <i>Bioinformatics</i>, <b>27</b>(7):1017-1018, 2011. -<a href="http://bioinformatics.oxfordjournals.org/content/27/7/1017">[full text]</a></p> -<hr> <center><big><b><a name="database_and_motifs">DATABASE AND MOTIFS</a></b></big></center> -<hr> -<div style="padding-left: 0.75in; line-height: 1em; font-family: monospace;"> -<p> - DATABASE hsa_chrM.fa - <br /> Database contains 1 sequences, 16569 residues -</p> -<p> - MOTIFS dreme_fimo_input_1.xml (DNA) <table> <thead> <tr> @@ -63,74 +38,29 @@ <td style="text-align:right;padding-left: 1em;">7</td> <td style="text-align:left;padding-left: 1em;">ACTAACA</td> </tr> - <tr> - <td style="text-align:right;">YTAACA</td> - <td style="text-align:right;padding-left: 1em;">6</td> - <td style="text-align:left;padding-left: 1em;">TTAACA</td> - </tr> - <tr> - <td style="text-align:right;">TCTGT</td> - <td style="text-align:right;padding-left: 1em;">5</td> - <td style="text-align:left;padding-left: 1em;">TCTGT</td> - </tr> - <tr> - <td style="text-align:right;">SCCAGG</td> - <td style="text-align:right;padding-left: 1em;">6</td> - <td style="text-align:left;padding-left: 1em;">CCCAGG</td> - </tr> - <tr> - <td style="text-align:right;">CCAGCAY</td> - <td style="text-align:right;padding-left: 1em;">7</td> - <td style="text-align:left;padding-left: 1em;">CCAGCAC</td> - </tr> - <tr> - <td style="text-align:right;">GMATGT</td> - <td style="text-align:right;padding-left: 1em;">6</td> - <td style="text-align:left;padding-left: 1em;">GAATGT</td> - </tr> </tbody> </table> </p> <p> Random model letter frequencies (--uniform--): -<br/> - A 0.250 C 0.250 G 0.250 T 0.250 </p> -</div> -<hr> <center><big><b><a name="sec_i">SECTION I: HIGH-SCORING MOTIF OCCURENCES</a></b></big></center> -<hr> -<ul> -<li> There were 517 motif occurences with a p-value less than 0.01. - The full set of motif occurences can be seen in the -tab-delimited plain text output file -<a href="fimo.txt">fimo.txt</a>, -the GFF file -<a href="fimo.gff">fimo.gff</a> +TSV (tab-delimited values) output file +the GFF3 file which may be suitable for uploading to the -<a href="http://genome.ucsc.edu/cgi-bin/hgTables">UCSC Genome Table Browser</a> (assuming the FASTA input sequences included genomic coordinates in UCSC or Galaxy format), or the XML file -<a href="fimo.xml">fimo.xml</a>. -</li> -<li> -The p-value of a motif occurrence is defined as the +The <i>p</i>-value of a motif occurrence is defined as the probability of a random sequence of the same length as the motif matching that position of the sequence with as good or better a score. -</li> -<li> The score for the match of a position in a sequence to a motif is computed by summing the appropriate entries from each column of the position-dependent scoring matrix that represents the motif. -</li> -<li> The q-value of a motif occurrence is defined as the false discovery rate if the occurrence is accepted as significant. -</li> -<li>The table is sorted by increasing p-value.</li> -</ul> +<li>The table is sorted by increasing <i>p</i>-value.</li> <table border="1"> <thead> <tr> @@ -156,5736 +86,7 @@ <td style="text-align:left;">6.1e-05</td> <td style="text-align:left;">0.239</td> <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">2093</td> - <td style="text-align:left;">2099</td> - <td style="text-align:left;">6.1e-05</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">2299</td> - <td style="text-align:left;">2305</td> - <td style="text-align:left;">6.1e-05</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5186</td> - <td style="text-align:left;">5192</td> - <td style="text-align:left;">6.1e-05</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6530</td> - <td style="text-align:left;">6536</td> - <td style="text-align:left;">6.1e-05</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7742</td> - <td style="text-align:left;">7748</td> - <td style="text-align:left;">6.1e-05</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13657</td> - <td style="text-align:left;">13663</td> - <td style="text-align:left;">6.1e-05</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13741</td> - <td style="text-align:left;">13747</td> - <td style="text-align:left;">6.1e-05</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3768</td> - <td style="text-align:left;">3774</td> - <td style="text-align:left;">0.000122</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5498</td> - <td style="text-align:left;">5504</td> - <td style="text-align:left;">0.000122</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7736</td> - <td style="text-align:left;">7742</td> - <td style="text-align:left;">0.000122</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9872</td> - <td style="text-align:left;">9878</td> - <td style="text-align:left;">0.000122</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10106</td> - <td style="text-align:left;">10112</td> - <td style="text-align:left;">0.000122</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10313</td> - <td style="text-align:left;">10319</td> - <td style="text-align:left;">0.000122</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11818</td> - <td style="text-align:left;">11824</td> - <td style="text-align:left;">0.000122</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15903</td> - <td style="text-align:left;">15909</td> - <td style="text-align:left;">0.000122</td> - <td style="text-align:left;">0.239</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7732</td> - <td style="text-align:left;">7738</td> - <td style="text-align:left;">0.000183</td> - <td style="text-align:left;">0.294</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10960</td> - <td style="text-align:left;">10966</td> - <td style="text-align:left;">0.000183</td> - <td style="text-align:left;">0.294</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">862</td> - <td style="text-align:left;">868</td> - <td style="text-align:left;">0.000244</td> - <td style="text-align:left;">0.294</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1832</td> - <td style="text-align:left;">1838</td> - <td style="text-align:left;">0.000244</td> - <td style="text-align:left;">0.294</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8679</td> - <td style="text-align:left;">8685</td> - <td style="text-align:left;">0.000244</td> - <td style="text-align:left;">0.294</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8770</td> - <td style="text-align:left;">8776</td> - <td style="text-align:left;">0.000244</td> - <td style="text-align:left;">0.294</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9347</td> - <td style="text-align:left;">9353</td> - <td style="text-align:left;">0.000244</td> - <td style="text-align:left;">0.294</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9359</td> - <td style="text-align:left;">9365</td> - <td style="text-align:left;">0.000244</td> - <td style="text-align:left;">0.294</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10302</td> - <td style="text-align:left;">10308</td> - <td style="text-align:left;">0.000244</td> - <td style="text-align:left;">0.294</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14765</td> - <td style="text-align:left;">14771</td> - <td style="text-align:left;">0.000244</td> - <td style="text-align:left;">0.294</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4466</td> - <td style="text-align:left;">4472</td> - <td style="text-align:left;">0.000305</td> - <td style="text-align:left;">0.302</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11248</td> - <td style="text-align:left;">11254</td> - <td style="text-align:left;">0.000305</td> - <td style="text-align:left;">0.302</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">475</td> - <td style="text-align:left;">481</td> - <td style="text-align:left;">0.000366</td> - <td style="text-align:left;">0.302</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7930</td> - <td style="text-align:left;">7936</td> - <td style="text-align:left;">0.000366</td> - <td style="text-align:left;">0.302</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8649</td> - <td style="text-align:left;">8655</td> - <td style="text-align:left;">0.000366</td> - <td style="text-align:left;">0.302</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8670</td> - <td style="text-align:left;">8676</td> - <td style="text-align:left;">0.000366</td> - <td style="text-align:left;">0.302</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10768</td> - <td style="text-align:left;">10774</td> - <td style="text-align:left;">0.000366</td> - <td style="text-align:left;">0.302</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11053</td> - <td style="text-align:left;">11059</td> - <td style="text-align:left;">0.000366</td> - <td style="text-align:left;">0.302</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11101</td> - <td style="text-align:left;">11107</td> - <td style="text-align:left;">0.000366</td> - <td style="text-align:left;">0.302</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12720</td> - <td style="text-align:left;">12726</td> - <td style="text-align:left;">0.000366</td> - <td style="text-align:left;">0.302</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13149</td> - <td style="text-align:left;">13155</td> - <td style="text-align:left;">0.000366</td> - <td style="text-align:left;">0.302</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14216</td> - <td style="text-align:left;">14222</td> - <td style="text-align:left;">0.000366</td> - <td style="text-align:left;">0.302</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">678</td> - <td style="text-align:left;">684</td> - <td style="text-align:left;">0.000549</td> - <td style="text-align:left;">0.366</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1435</td> - <td style="text-align:left;">1441</td> - <td style="text-align:left;">0.000549</td> - <td style="text-align:left;">0.366</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1524</td> - <td style="text-align:left;">1530</td> - <td style="text-align:left;">0.000549</td> - <td style="text-align:left;">0.366</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">2035</td> - <td style="text-align:left;">2041</td> - <td style="text-align:left;">0.000549</td> - <td style="text-align:left;">0.366</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8440</td> - <td style="text-align:left;">8446</td> - <td style="text-align:left;">0.000549</td> - <td style="text-align:left;">0.366</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">9995</td> - <td style="text-align:left;">10001</td> - <td style="text-align:left;">0.000549</td> - <td style="text-align:left;">0.366</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10225</td> - <td style="text-align:left;">10231</td> - <td style="text-align:left;">0.000549</td> - <td style="text-align:left;">0.366</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">12725</td> - <td style="text-align:left;">12731</td> - <td style="text-align:left;">0.000549</td> - <td style="text-align:left;">0.366</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14393</td> - <td style="text-align:left;">14399</td> - <td style="text-align:left;">0.000549</td> - <td style="text-align:left;">0.366</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2294</td> - <td style="text-align:left;">2300</td> - <td style="text-align:left;">0.00061</td> - <td style="text-align:left;">0.398</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAATG</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">206</td> - <td style="text-align:left;">212</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">237</td> - <td style="text-align:left;">243</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">370</td> - <td style="text-align:left;">376</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1630</td> - <td style="text-align:left;">1636</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1702</td> - <td style="text-align:left;">1708</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACCA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2309</td> - <td style="text-align:left;">2315</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2363</td> - <td style="text-align:left;">2369</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTGACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2370</td> - <td style="text-align:left;">2376</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2395</td> - <td style="text-align:left;">2401</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2761</td> - <td style="text-align:left;">2767</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2784</td> - <td style="text-align:left;">2790</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACCA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">3191</td> - <td style="text-align:left;">3197</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAGT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3756</td> - <td style="text-align:left;">3762</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3873</td> - <td style="text-align:left;">3879</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGCA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3991</td> - <td style="text-align:left;">3997</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">4445</td> - <td style="text-align:left;">4451</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4734</td> - <td style="text-align:left;">4740</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACCA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5061</td> - <td style="text-align:left;">5067</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5177</td> - <td style="text-align:left;">5183</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5391</td> - <td style="text-align:left;">5397</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5680</td> - <td style="text-align:left;">5686</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">5686</td> - <td style="text-align:left;">5692</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAGT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6595</td> - <td style="text-align:left;">6601</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7146</td> - <td style="text-align:left;">7152</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7286</td> - <td style="text-align:left;">7292</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7714</td> - <td style="text-align:left;">7720</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7720</td> - <td style="text-align:left;">7726</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8344</td> - <td style="text-align:left;">8350</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8374</td> - <td style="text-align:left;">8380</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAAT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8460</td> - <td style="text-align:left;">8466</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACCA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9010</td> - <td style="text-align:left;">9016</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9257</td> - <td style="text-align:left;">9263</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9351</td> - <td style="text-align:left;">9357</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10127</td> - <td style="text-align:left;">10133</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACCA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10295</td> - <td style="text-align:left;">10301</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10496</td> - <td style="text-align:left;">10502</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGCA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10792</td> - <td style="text-align:left;">10798</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACCA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10798</td> - <td style="text-align:left;">10804</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTGACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10939</td> - <td style="text-align:left;">10945</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11023</td> - <td style="text-align:left;">11029</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11258</td> - <td style="text-align:left;">11264</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11314</td> - <td style="text-align:left;">11320</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11593</td> - <td style="text-align:left;">11599</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11650</td> - <td style="text-align:left;">11656</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11768</td> - <td style="text-align:left;">11774</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">11901</td> - <td style="text-align:left;">11907</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGCA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11941</td> - <td style="text-align:left;">11947</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12026</td> - <td style="text-align:left;">12032</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12245</td> - <td style="text-align:left;">12251</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12412</td> - <td style="text-align:left;">12418</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12530</td> - <td style="text-align:left;">12536</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTGACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">12617</td> - <td style="text-align:left;">12623</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACGAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12736</td> - <td style="text-align:left;">12742</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13161</td> - <td style="text-align:left;">13167</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13626</td> - <td style="text-align:left;">13632</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13797</td> - <td style="text-align:left;">13803</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13830</td> - <td style="text-align:left;">13836</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13858</td> - <td style="text-align:left;">13864</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14185</td> - <td style="text-align:left;">14191</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14189</td> - <td style="text-align:left;">14195</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14548</td> - <td style="text-align:left;">14554</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14569</td> - <td style="text-align:left;">14575</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15469</td> - <td style="text-align:left;">15475</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15599</td> - <td style="text-align:left;">15605</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">16227</td> - <td style="text-align:left;">16233</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">16277</td> - <td style="text-align:left;">16283</td> - <td style="text-align:left;">0.00165</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">852</td> - <td style="text-align:left;">858</td> - <td style="text-align:left;">0.00177</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAGC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">1449</td> - <td style="text-align:left;">1455</td> - <td style="text-align:left;">0.00177</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAGC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4913</td> - <td style="text-align:left;">4919</td> - <td style="text-align:left;">0.00177</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAAC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11278</td> - <td style="text-align:left;">11284</td> - <td style="text-align:left;">0.00177</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAAC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13686</td> - <td style="text-align:left;">13692</td> - <td style="text-align:left;">0.00177</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAAC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14582</td> - <td style="text-align:left;">14588</td> - <td style="text-align:left;">0.00177</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAAC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14636</td> - <td style="text-align:left;">14642</td> - <td style="text-align:left;">0.00177</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAAC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15703</td> - <td style="text-align:left;">15709</td> - <td style="text-align:left;">0.00177</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAGC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">152</td> - <td style="text-align:left;">158</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">234</td> - <td style="text-align:left;">240</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">472</td> - <td style="text-align:left;">478</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">645</td> - <td style="text-align:left;">651</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">671</td> - <td style="text-align:left;">677</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">2305</td> - <td style="text-align:left;">2311</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">2529</td> - <td style="text-align:left;">2535</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">2744</td> - <td style="text-align:left;">2750</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2880</td> - <td style="text-align:left;">2886</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4158</td> - <td style="text-align:left;">4164</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4206</td> - <td style="text-align:left;">4212</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4301</td> - <td style="text-align:left;">4307</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4679</td> - <td style="text-align:left;">4685</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4728</td> - <td style="text-align:left;">4734</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4754</td> - <td style="text-align:left;">4760</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5036</td> - <td style="text-align:left;">5042</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5103</td> - <td style="text-align:left;">5109</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5153</td> - <td style="text-align:left;">5159</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">5962</td> - <td style="text-align:left;">5968</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6110</td> - <td style="text-align:left;">6116</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6155</td> - <td style="text-align:left;">6161</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6527</td> - <td style="text-align:left;">6533</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">6973</td> - <td style="text-align:left;">6979</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7295</td> - <td style="text-align:left;">7301</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7301</td> - <td style="text-align:left;">7307</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">7300</td> - <td style="text-align:left;">7306</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7349</td> - <td style="text-align:left;">7355</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">7351</td> - <td style="text-align:left;">7357</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">7522</td> - <td style="text-align:left;">7528</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8739</td> - <td style="text-align:left;">8745</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">8738</td> - <td style="text-align:left;">8744</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">8945</td> - <td style="text-align:left;">8951</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8982</td> - <td style="text-align:left;">8988</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">9613</td> - <td style="text-align:left;">9619</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9656</td> - <td style="text-align:left;">9662</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10055</td> - <td style="text-align:left;">10061</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10103</td> - <td style="text-align:left;">10109</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10246</td> - <td style="text-align:left;">10252</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10315</td> - <td style="text-align:left;">10321</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10336</td> - <td style="text-align:left;">10342</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10368</td> - <td style="text-align:left;">10374</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10526</td> - <td style="text-align:left;">10532</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10525</td> - <td style="text-align:left;">10531</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10574</td> - <td style="text-align:left;">10580</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10657</td> - <td style="text-align:left;">10663</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10699</td> - <td style="text-align:left;">10705</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10788</td> - <td style="text-align:left;">10794</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10858</td> - <td style="text-align:left;">10864</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10954</td> - <td style="text-align:left;">10960</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11873</td> - <td style="text-align:left;">11879</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">11958</td> - <td style="text-align:left;">11964</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12333</td> - <td style="text-align:left;">12339</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12349</td> - <td style="text-align:left;">12355</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12425</td> - <td style="text-align:left;">12431</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">12471</td> - <td style="text-align:left;">12477</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTGATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12933</td> - <td style="text-align:left;">12939</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12972</td> - <td style="text-align:left;">12978</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13269</td> - <td style="text-align:left;">13275</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">13274</td> - <td style="text-align:left;">13280</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">13566</td> - <td style="text-align:left;">13572</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14210</td> - <td style="text-align:left;">14216</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14213</td> - <td style="text-align:left;">14219</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14251</td> - <td style="text-align:left;">14257</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14314</td> - <td style="text-align:left;">14320</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14510</td> - <td style="text-align:left;">14516</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14545</td> - <td style="text-align:left;">14551</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14773</td> - <td style="text-align:left;">14779</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">15627</td> - <td style="text-align:left;">15633</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15838</td> - <td style="text-align:left;">15844</td> - <td style="text-align:left;">0.00269</td> - <td style="text-align:left;">0.441</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">193</td> - <td style="text-align:left;">199</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">714</td> - <td style="text-align:left;">720</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1860</td> - <td style="text-align:left;">1866</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1870</td> - <td style="text-align:left;">1876</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2220</td> - <td style="text-align:left;">2226</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACCT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2901</td> - <td style="text-align:left;">2907</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4154</td> - <td style="text-align:left;">4160</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">4283</td> - <td style="text-align:left;">4289</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5099</td> - <td style="text-align:left;">5105</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5156</td> - <td style="text-align:left;">5162</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">5555</td> - <td style="text-align:left;">5561</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6142</td> - <td style="text-align:left;">6148</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTGACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6678</td> - <td style="text-align:left;">6684</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7169</td> - <td style="text-align:left;">7175</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8304</td> - <td style="text-align:left;">8310</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8456</td> - <td style="text-align:left;">8462</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8817</td> - <td style="text-align:left;">8823</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">8949</td> - <td style="text-align:left;">8955</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9120</td> - <td style="text-align:left;">9126</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTGACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9852</td> - <td style="text-align:left;">9858</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10025</td> - <td style="text-align:left;">10031</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10964</td> - <td style="text-align:left;">10970</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACCT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11293</td> - <td style="text-align:left;">11299</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11347</td> - <td style="text-align:left;">11353</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGCT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12226</td> - <td style="text-align:left;">12232</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">12516</td> - <td style="text-align:left;">12522</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13850</td> - <td style="text-align:left;">13856</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACCT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13862</td> - <td style="text-align:left;">13868</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14206</td> - <td style="text-align:left;">14212</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15185</td> - <td style="text-align:left;">15191</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15189</td> - <td style="text-align:left;">15195</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15603</td> - <td style="text-align:left;">15609</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15844</td> - <td style="text-align:left;">15850</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15848</td> - <td style="text-align:left;">15854</td> - <td style="text-align:left;">0.0036</td> - <td style="text-align:left;">0.501</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">21</td> - <td style="text-align:left;">27</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">381</td> - <td style="text-align:left;">387</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">529</td> - <td style="text-align:left;">535</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">547</td> - <td style="text-align:left;">553</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">823</td> - <td style="text-align:left;">829</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">873</td> - <td style="text-align:left;">879</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">910</td> - <td style="text-align:left;">916</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">978</td> - <td style="text-align:left;">984</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">1569</td> - <td style="text-align:left;">1575</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1596</td> - <td style="text-align:left;">1602</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACGAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1991</td> - <td style="text-align:left;">1997</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2578</td> - <td style="text-align:left;">2584</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2765</td> - <td style="text-align:left;">2771</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">3031</td> - <td style="text-align:left;">3037</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACGAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">3225</td> - <td style="text-align:left;">3231</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3883</td> - <td style="text-align:left;">3889</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4101</td> - <td style="text-align:left;">4107</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4191</td> - <td style="text-align:left;">4197</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4598</td> - <td style="text-align:left;">4604</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4874</td> - <td style="text-align:left;">4880</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGCC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5237</td> - <td style="text-align:left;">5243</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5839</td> - <td style="text-align:left;">5845</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5931</td> - <td style="text-align:left;">5937</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6335</td> - <td style="text-align:left;">6341</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7228</td> - <td style="text-align:left;">7234</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACCC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7781</td> - <td style="text-align:left;">7787</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8315</td> - <td style="text-align:left;">8321</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8508</td> - <td style="text-align:left;">8514</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8721</td> - <td style="text-align:left;">8727</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACGAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8805</td> - <td style="text-align:left;">8811</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9003</td> - <td style="text-align:left;">9009</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9076</td> - <td style="text-align:left;">9082</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9124</td> - <td style="text-align:left;">9130</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11548</td> - <td style="text-align:left;">11554</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11852</td> - <td style="text-align:left;">11858</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11876</td> - <td style="text-align:left;">11882</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11905</td> - <td style="text-align:left;">11911</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12013</td> - <td style="text-align:left;">12019</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12336</td> - <td style="text-align:left;">12342</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12363</td> - <td style="text-align:left;">12369</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13295</td> - <td style="text-align:left;">13301</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13672</td> - <td style="text-align:left;">13678</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13854</td> - <td style="text-align:left;">13860</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13998</td> - <td style="text-align:left;">14004</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14124</td> - <td style="text-align:left;">14130</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14384</td> - <td style="text-align:left;">14390</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14401</td> - <td style="text-align:left;">14407</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14624</td> - <td style="text-align:left;">14630</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14786</td> - <td style="text-align:left;">14792</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14910</td> - <td style="text-align:left;">14916</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15193</td> - <td style="text-align:left;">15199</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15631</td> - <td style="text-align:left;">15637</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15748</td> - <td style="text-align:left;">15754</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">16066</td> - <td style="text-align:left;">16072</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">16281</td> - <td style="text-align:left;">16287</td> - <td style="text-align:left;">0.00452</td> - <td style="text-align:left;">0.505</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">211</td> - <td style="text-align:left;">217</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">210</td> - <td style="text-align:left;">216</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">214</td> - <td style="text-align:left;">220</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">1961</td> - <td style="text-align:left;">1967</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2188</td> - <td style="text-align:left;">2194</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">3771</td> - <td style="text-align:left;">3777</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">3923</td> - <td style="text-align:left;">3929</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">4469</td> - <td style="text-align:left;">4475</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4543</td> - <td style="text-align:left;">4549</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTGATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5085</td> - <td style="text-align:left;">5091</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6146</td> - <td style="text-align:left;">6152</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7087</td> - <td style="text-align:left;">7093</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTGATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7304</td> - <td style="text-align:left;">7310</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8041</td> - <td style="text-align:left;">8047</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8221</td> - <td style="text-align:left;">8227</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">8220</td> - <td style="text-align:left;">8226</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8795</td> - <td style="text-align:left;">8801</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8946</td> - <td style="text-align:left;">8952</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8973</td> - <td style="text-align:left;">8979</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9042</td> - <td style="text-align:left;">9048</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9111</td> - <td style="text-align:left;">9117</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">9538</td> - <td style="text-align:left;">9544</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9680</td> - <td style="text-align:left;">9686</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9953</td> - <td style="text-align:left;">9959</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10004</td> - <td style="text-align:left;">10010</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10029</td> - <td style="text-align:left;">10035</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10028</td> - <td style="text-align:left;">10034</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10109</td> - <td style="text-align:left;">10115</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10112</td> - <td style="text-align:left;">10118</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10402</td> - <td style="text-align:left;">10408</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10438</td> - <td style="text-align:left;">10444</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10852</td> - <td style="text-align:left;">10858</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10855</td> - <td style="text-align:left;">10861</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10876</td> - <td style="text-align:left;">10882</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11500</td> - <td style="text-align:left;">11506</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12378</td> - <td style="text-align:left;">12384</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12584</td> - <td style="text-align:left;">12590</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">12679</td> - <td style="text-align:left;">12685</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTGATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12708</td> - <td style="text-align:left;">12714</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">13013</td> - <td style="text-align:left;">13019</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13350</td> - <td style="text-align:left;">13356</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13611</td> - <td style="text-align:left;">13617</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">14296</td> - <td style="text-align:left;">14302</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14782</td> - <td style="text-align:left;">14788</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">14781</td> - <td style="text-align:left;">14787</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14793</td> - <td style="text-align:left;">14799</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15178</td> - <td style="text-align:left;">15184</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15856</td> - <td style="text-align:left;">15862</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">16003</td> - <td style="text-align:left;">16009</td> - <td style="text-align:left;">0.00543</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAATT</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">1074</td> - <td style="text-align:left;">1080</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2270</td> - <td style="text-align:left;">2276</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3081</td> - <td style="text-align:left;">3087</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3345</td> - <td style="text-align:left;">3351</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">3824</td> - <td style="text-align:left;">3830</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3924</td> - <td style="text-align:left;">3930</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4470</td> - <td style="text-align:left;">4476</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4520</td> - <td style="text-align:left;">4526</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4737</td> - <td style="text-align:left;">4743</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4747</td> - <td style="text-align:left;">4753</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4757</td> - <td style="text-align:left;">4763</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5120</td> - <td style="text-align:left;">5126</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5354</td> - <td style="text-align:left;">5360</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5378</td> - <td style="text-align:left;">5384</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5453</td> - <td style="text-align:left;">5459</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5501</td> - <td style="text-align:left;">5507</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5707</td> - <td style="text-align:left;">5713</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5921</td> - <td style="text-align:left;">5927</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6095</td> - <td style="text-align:left;">6101</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">6145</td> - <td style="text-align:left;">6151</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6158</td> - <td style="text-align:left;">6164</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6307</td> - <td style="text-align:left;">6313</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6467</td> - <td style="text-align:left;">6473</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6659</td> - <td style="text-align:left;">6665</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6682</td> - <td style="text-align:left;">6688</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">6982</td> - <td style="text-align:left;">6988</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">8007</td> - <td style="text-align:left;">8013</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8422</td> - <td style="text-align:left;">8428</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8589</td> - <td style="text-align:left;">8595</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTGATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9093</td> - <td style="text-align:left;">9099</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9214</td> - <td style="text-align:left;">9220</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10079</td> - <td style="text-align:left;">10085</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10337</td> - <td style="text-align:left;">10343</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10387</td> - <td style="text-align:left;">10393</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10658</td> - <td style="text-align:left;">10664</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10700</td> - <td style="text-align:left;">10706</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11007</td> - <td style="text-align:left;">11013</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11065</td> - <td style="text-align:left;">11071</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11134</td> - <td style="text-align:left;">11140</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11239</td> - <td style="text-align:left;">11245</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11290</td> - <td style="text-align:left;">11296</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11734</td> - <td style="text-align:left;">11740</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11959</td> - <td style="text-align:left;">11965</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12676</td> - <td style="text-align:left;">12682</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12699</td> - <td style="text-align:left;">12705</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12952</td> - <td style="text-align:left;">12958</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13113</td> - <td style="text-align:left;">13119</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13419</td> - <td style="text-align:left;">13425</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14118</td> - <td style="text-align:left;">14124</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14136</td> - <td style="text-align:left;">14142</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14366</td> - <td style="text-align:left;">14372</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14890</td> - <td style="text-align:left;">14896</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14907</td> - <td style="text-align:left;">14913</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15475</td> - <td style="text-align:left;">15481</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15652</td> - <td style="text-align:left;">15658</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15832</td> - <td style="text-align:left;">15838</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15951</td> - <td style="text-align:left;">15957</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAATC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">16013</td> - <td style="text-align:left;">16019</td> - <td style="text-align:left;">0.00635</td> - <td style="text-align:left;">0.514</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATTC</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">197</td> - <td style="text-align:left;">203</td> - <td style="text-align:left;">0.00647</td> - <td style="text-align:left;">0.521</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAAG</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8713</td> - <td style="text-align:left;">8719</td> - <td style="text-align:left;">0.00647</td> - <td style="text-align:left;">0.521</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAAAG</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">28</td> - <td style="text-align:left;">34</td> - <td style="text-align:left;">0.00739</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCACG</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">1322</td> - <td style="text-align:left;">1328</td> - <td style="text-align:left;">0.00739</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAACG</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2910</td> - <td style="text-align:left;">2916</td> - <td style="text-align:left;">0.00739</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAACG</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">3035</td> - <td style="text-align:left;">3041</td> - <td style="text-align:left;">0.00739</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACG</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5106</td> - <td style="text-align:left;">5112</td> - <td style="text-align:left;">0.00739</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACCG</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">7218</td> - <td style="text-align:left;">7224</td> - <td style="text-align:left;">0.00739</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAACG</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8381</td> - <td style="text-align:left;">8387</td> - <td style="text-align:left;">0.00739</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACCG</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10580</td> - <td style="text-align:left;">10586</td> - <td style="text-align:left;">0.00739</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATCG</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11760</td> - <td style="text-align:left;">11766</td> - <td style="text-align:left;">0.00739</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACGAACG</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13546</td> - <td style="text-align:left;">13552</td> - <td style="text-align:left;">0.00739</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAACG</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13663</td> - <td style="text-align:left;">13669</td> - <td style="text-align:left;">0.00739</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAACG</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">57</td> - <td style="text-align:left;">63</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACGAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">284</td> - <td style="text-align:left;">290</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">331</td> - <td style="text-align:left;">337</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">361</td> - <td style="text-align:left;">367</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">608</td> - <td style="text-align:left;">614</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTGAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">682</td> - <td style="text-align:left;">688</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">946</td> - <td style="text-align:left;">952</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">972</td> - <td style="text-align:left;">978</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1019</td> - <td style="text-align:left;">1025</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1057</td> - <td style="text-align:left;">1063</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1142</td> - <td style="text-align:left;">1148</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1162</td> - <td style="text-align:left;">1168</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1384</td> - <td style="text-align:left;">1390</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1864</td> - <td style="text-align:left;">1870</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1894</td> - <td style="text-align:left;">1900</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1922</td> - <td style="text-align:left;">1928</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">1932</td> - <td style="text-align:left;">1938</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2124</td> - <td style="text-align:left;">2130</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2148</td> - <td style="text-align:left;">2154</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2175</td> - <td style="text-align:left;">2181</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2192</td> - <td style="text-align:left;">2198</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2224</td> - <td style="text-align:left;">2230</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2350</td> - <td style="text-align:left;">2356</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2463</td> - <td style="text-align:left;">2469</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2500</td> - <td style="text-align:left;">2506</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">2658</td> - <td style="text-align:left;">2664</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2798</td> - <td style="text-align:left;">2804</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">2855</td> - <td style="text-align:left;">2861</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">3065</td> - <td style="text-align:left;">3071</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3262</td> - <td style="text-align:left;">3268</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3378</td> - <td style="text-align:left;">3384</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACGAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3441</td> - <td style="text-align:left;">3447</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3486</td> - <td style="text-align:left;">3492</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3558</td> - <td style="text-align:left;">3564</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">3677</td> - <td style="text-align:left;">3683</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4021</td> - <td style="text-align:left;">4027</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4087</td> - <td style="text-align:left;">4093</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4259</td> - <td style="text-align:left;">4265</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4334</td> - <td style="text-align:left;">4340</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">4586</td> - <td style="text-align:left;">4592</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4602</td> - <td style="text-align:left;">4608</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4778</td> - <td style="text-align:left;">4784</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4784</td> - <td style="text-align:left;">4790</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">4807</td> - <td style="text-align:left;">4813</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">4868</td> - <td style="text-align:left;">4874</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">5002</td> - <td style="text-align:left;">5008</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">5075</td> - <td style="text-align:left;">5081</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5128</td> - <td style="text-align:left;">5134</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5280</td> - <td style="text-align:left;">5286</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5405</td> - <td style="text-align:left;">5411</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5533</td> - <td style="text-align:left;">5539</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5670</td> - <td style="text-align:left;">5676</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">5938</td> - <td style="text-align:left;">5944</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">6106</td> - <td style="text-align:left;">6112</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">6376</td> - <td style="text-align:left;">6382</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">6451</td> - <td style="text-align:left;">6457</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACGAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">7445</td> - <td style="text-align:left;">7451</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">7581</td> - <td style="text-align:left;">7587</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">7692</td> - <td style="text-align:left;">7698</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">7800</td> - <td style="text-align:left;">7806</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8230</td> - <td style="text-align:left;">8236</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">8323</td> - <td style="text-align:left;">8329</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8335</td> - <td style="text-align:left;">8341</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8494</td> - <td style="text-align:left;">8500</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8521</td> - <td style="text-align:left;">8527</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8531</td> - <td style="text-align:left;">8537</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACGAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">8757</td> - <td style="text-align:left;">8763</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8881</td> - <td style="text-align:left;">8887</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">TCTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">8887</td> - <td style="text-align:left;">8893</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">9173</td> - <td style="text-align:left;">9179</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">9236</td> - <td style="text-align:left;">9242</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">9706</td> - <td style="text-align:left;">9712</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">9796</td> - <td style="text-align:left;">9802</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">9987</td> - <td style="text-align:left;">9993</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10075</td> - <td style="text-align:left;">10081</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10243</td> - <td style="text-align:left;">10249</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10333</td> - <td style="text-align:left;">10339</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10376</td> - <td style="text-align:left;">10382</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10379</td> - <td style="text-align:left;">10385</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">10630</td> - <td style="text-align:left;">10636</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">10762</td> - <td style="text-align:left;">10768</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11029</td> - <td style="text-align:left;">11035</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACGAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">11367</td> - <td style="text-align:left;">11373</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11602</td> - <td style="text-align:left;">11608</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">11646</td> - <td style="text-align:left;">11652</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11751</td> - <td style="text-align:left;">11757</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">11757</td> - <td style="text-align:left;">11763</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12152</td> - <td style="text-align:left;">12158</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">12295</td> - <td style="text-align:left;">12301</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">12311</td> - <td style="text-align:left;">12317</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12327</td> - <td style="text-align:left;">12333</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12352</td> - <td style="text-align:left;">12358</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTATAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12416</td> - <td style="text-align:left;">12422</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACAAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12509</td> - <td style="text-align:left;">12515</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">12662</td> - <td style="text-align:left;">12668</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">13109</td> - <td style="text-align:left;">13115</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AGTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13263</td> - <td style="text-align:left;">13269</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13422</td> - <td style="text-align:left;">13428</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13667</td> - <td style="text-align:left;">13673</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACGAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13791</td> - <td style="text-align:left;">13797</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13866</td> - <td style="text-align:left;">13872</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTTAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">13872</td> - <td style="text-align:left;">13878</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">13894</td> - <td style="text-align:left;">13900</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14007</td> - <td style="text-align:left;">14013</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14023</td> - <td style="text-align:left;">14029</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">CCTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14405</td> - <td style="text-align:left;">14411</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACCAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14501</td> - <td style="text-align:left;">14507</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ATTAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14687</td> - <td style="text-align:left;">14693</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14732</td> - <td style="text-align:left;">14738</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">14776</td> - <td style="text-align:left;">14782</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15072</td> - <td style="text-align:left;">15078</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15607</td> - <td style="text-align:left;">15613</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15874</td> - <td style="text-align:left;">15880</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTCAAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">-</td> - <td style="text-align:left;">15892</td> - <td style="text-align:left;">15898</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTACAA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">15995</td> - <td style="text-align:left;">16001</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">GCTAAGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">16269</td> - <td style="text-align:left;">16275</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">ACTAGGA</td> - </tr> - <tr> - <td style="text-align:left;">ACTAAYH</td> - <td style="text-align:left;">DREME-1</td> - <td style="text-align:left;">chrM</td> - <td style="text-align:center;">+</td> - <td style="text-align:left;">16553</td> - <td style="text-align:left;">16559</td> - <td style="text-align:left;">0.00922</td> - <td style="text-align:left;">0.559</td> - <td style="text-align:left;font-size:x-large;font-family:monospace;">AATAAGA</td> - </tr> -</tbody> -</table> - -<hr> -<center><big><b><a name="debugging_information">DEBUGGING INFORMATION</a></b></big></center> -<hr> -<p> -Command line: -</p> -<pre> -fimo -o ./fimo_test4_out --thresh 0.01 --bgfile --uniform-- --max-stored-scores 100000 --motif ACTAAYH --motif-pseudo 0.1 dreme_fimo_input_1.xml hsa_chrM.fa -</pre> -<p> -Settings: -</p> -<pre> -<table> - <tr> - <td style="padding-right: 2em">output_directory = ./fimo_test4_out</td> - <td style="padding-left: 5em; padding-right: 2em">MEME file name = dreme_fimo_input_1.xml</td> - <td style="padding-left: 5em; padding-right: 2em">sequence file name = hsa_chrM.fa</td> - </tr> <tr> - <td style="padding-right: 2em">background file name = --uniform--</td> - <td style="padding-left: 5em; padding-right: 2em">alphabet = DNA</td> - <td style="padding-left: 5em; padding-right: 2em">max stored scores = 100000</td> - </tr> <tr> - <td style="padding-right: 2em">allow clobber = false</td> - <td style="padding-left: 5em; padding-right: 2em">compute q-values = true</td> - <td style="padding-left: 5em; padding-right: 2em">parse genomic coord. = false</td> - </tr> - <tr> - <td style="padding-right: 2em">text only = false</td> - <td style="padding-left: 5em; padding-right: 2em">scan both strands = true</td> - <td style="padding-left: 5em; padding-right: 2em">max strand = false</td> - </tr> - <tr> - <td style="padding-right: 2em">threshold type = p-value</td> - <td style="padding-left: 5em; padding-right: 2em">output theshold = 0.01</td> - <td style="padding-left: 5em; padding-right: 2em">pseudocount = 0.1</td> - </tr> - <tr> - <td style="padding-right: 2em">alpha = 1</td> - <td style="padding-left: 5em; padding-right: 2em">verbosity = 2</td> - <td style="padding-left: 5em; padding-right: 2em"></td> - </tr> - -</table> -</pre> -<p> This information can be useful in the event you wish to report a problem with the FIMO software. -</p> -<hr> -<span style="background-color: #DDDDFF"><a href="#top_buttons"><b>Go to top</b></a></span> </body> </html>
--- a/test-data/fimo_output_test3.txt Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/fimo_output_test3.txt Wed Dec 11 18:05:35 2019 -0500 @@ -1,4 +1,4 @@ -# motif_id motif_alt_id sequence_name start stop strand score p-value q-value matched_sequence +motif_id motif_alt_id sequence_name start stop strand score p-value q-value matched_sequence ACTAAYH DREME-1 chrM 440 446 + 12.1831 6.1e-05 0.239 ACTAACA ACTAAYH DREME-1 chrM 2093 2099 - 12.1831 6.1e-05 0.239 ACTAACA ACTAAYH DREME-1 chrM 2299 2305 - 12.1831 6.1e-05 0.239 ACTAACA @@ -20,499 +20,3 @@ ACTAAYH DREME-1 chrM 862 868 + 11.2394 0.000244 0.294 ACTAACC ACTAAYH DREME-1 chrM 1832 1838 + 11.2394 0.000244 0.294 ACTAACC ACTAAYH DREME-1 chrM 8679 8685 + 11.2394 0.000244 0.294 ACTAACC -ACTAAYH DREME-1 chrM 8770 8776 + 11.2394 0.000244 0.294 ACTAACC -ACTAAYH DREME-1 chrM 9347 9353 + 11.2394 0.000244 0.294 ACTAACC -ACTAAYH DREME-1 chrM 9359 9365 + 11.2394 0.000244 0.294 ACTAACC -ACTAAYH DREME-1 chrM 10302 10308 + 11.2394 0.000244 0.294 ACTAACC -ACTAAYH DREME-1 chrM 14765 14771 + 11.2394 0.000244 0.294 ACTAACC -ACTAAYH DREME-1 chrM 4466 4472 + 10.8592 0.000305 0.302 ACTAATT -ACTAAYH DREME-1 chrM 11248 11254 + 10.8592 0.000305 0.302 ACTAATT -ACTAAYH DREME-1 chrM 475 481 + 10.6479 0.000366 0.302 ACTAATC -ACTAAYH DREME-1 chrM 7930 7936 + 10.6479 0.000366 0.302 ACTAATC -ACTAAYH DREME-1 chrM 8649 8655 + 10.6479 0.000366 0.302 ACTAATC -ACTAAYH DREME-1 chrM 8670 8676 + 10.6479 0.000366 0.302 ACTAATC -ACTAAYH DREME-1 chrM 10768 10774 + 10.6479 0.000366 0.302 ACTAATC -ACTAAYH DREME-1 chrM 11053 11059 + 10.6479 0.000366 0.302 ACTAATC -ACTAAYH DREME-1 chrM 11101 11107 + 10.6479 0.000366 0.302 ACTAATC -ACTAAYH DREME-1 chrM 12720 12726 + 10.6479 0.000366 0.302 ACTAATC -ACTAAYH DREME-1 chrM 13149 13155 + 10.6479 0.000366 0.302 ACTAATC -ACTAAYH DREME-1 chrM 14216 14222 + 10.6479 0.000366 0.302 ACTAATC -ACTAAYH DREME-1 chrM 678 684 - -1.07042 0.000549 0.366 ACTAAGA -ACTAAYH DREME-1 chrM 1435 1441 + -1.07042 0.000549 0.366 ACTAAGA -ACTAAYH DREME-1 chrM 1524 1530 + -1.07042 0.000549 0.366 ACTAAAA -ACTAAYH DREME-1 chrM 2035 2041 - -1.07042 0.000549 0.366 ACTAAGA -ACTAAYH DREME-1 chrM 8440 8446 + -1.07042 0.000549 0.366 ACTAAAA -ACTAAYH DREME-1 chrM 9995 10001 - -1.07042 0.000549 0.366 ACTAAAA -ACTAAYH DREME-1 chrM 10225 10231 - -1.07042 0.000549 0.366 ACTAAGA -ACTAAYH DREME-1 chrM 12725 12731 - -1.07042 0.000549 0.366 ACTAAGA -ACTAAYH DREME-1 chrM 14393 14399 + -1.07042 0.000549 0.366 ACTAAAA -ACTAAYH DREME-1 chrM 2294 2300 + -1.30986 0.00061 0.398 ACTAATG -ACTAAYH DREME-1 chrM 206 212 - -1.80282 0.00165 0.441 ATTAACA -ACTAAYH DREME-1 chrM 237 243 + -1.80282 0.00165 0.441 AATAACA -ACTAAYH DREME-1 chrM 370 376 + -1.80282 0.00165 0.441 CCTAACA -ACTAAYH DREME-1 chrM 1630 1636 + -1.80282 0.00165 0.441 ACTTACA -ACTAAYH DREME-1 chrM 1702 1708 + -1.80282 0.00165 0.441 ACTACCA -ACTAAYH DREME-1 chrM 2309 2315 + -1.80282 0.00165 0.441 AGTAACA -ACTAAYH DREME-1 chrM 2363 2369 + -1.80282 0.00165 0.441 ACTGACA -ACTAAYH DREME-1 chrM 2370 2376 + -1.80282 0.00165 0.441 ATTAACA -ACTAAYH DREME-1 chrM 2395 2401 + -1.80282 0.00165 0.441 ACCAACA -ACTAAYH DREME-1 chrM 2761 2767 + -1.80282 0.00165 0.441 CCTAACA -ACTAAYH DREME-1 chrM 2784 2790 + -1.80282 0.00165 0.441 ACTACCA -ACTAAYH DREME-1 chrM 3191 3197 - -1.80282 0.00165 0.441 ACTAAGT -ACTAAYH DREME-1 chrM 3756 3762 + -1.80282 0.00165 0.441 ACTATCA -ACTAAYH DREME-1 chrM 3873 3879 + -1.80282 0.00165 0.441 ACTAGCA -ACTAAYH DREME-1 chrM 3991 3997 + -1.80282 0.00165 0.441 ACAAACA -ACTAAYH DREME-1 chrM 4445 4451 - -1.80282 0.00165 0.441 ACCAACA -ACTAAYH DREME-1 chrM 4734 4740 + -1.80282 0.00165 0.441 ACTACCA -ACTAAYH DREME-1 chrM 5061 5067 + -1.80282 0.00165 0.441 CCTAACA -ACTAAYH DREME-1 chrM 5177 5183 + -1.80282 0.00165 0.441 GCTAACA -ACTAAYH DREME-1 chrM 5391 5397 + -1.80282 0.00165 0.441 TCTAACA -ACTAAYH DREME-1 chrM 5680 5686 + -1.80282 0.00165 0.441 ACAAACA -ACTAAYH DREME-1 chrM 5686 5692 - -1.80282 0.00165 0.441 ACTAAGT -ACTAAYH DREME-1 chrM 6595 6601 + -1.80282 0.00165 0.441 ACCAACA -ACTAAYH DREME-1 chrM 7146 7152 + -1.80282 0.00165 0.441 ACTATCA -ACTAAYH DREME-1 chrM 7286 7292 + -1.80282 0.00165 0.441 TCTAACA -ACTAAYH DREME-1 chrM 7714 7720 + -1.80282 0.00165 0.441 CCTAACA -ACTAAYH DREME-1 chrM 7720 7726 + -1.80282 0.00165 0.441 ACTCACA -ACTAAYH DREME-1 chrM 8344 8350 + -1.80282 0.00165 0.441 ACCAACA -ACTAAYH DREME-1 chrM 8374 8380 + -1.80282 0.00165 0.441 ACTAAAT -ACTAAYH DREME-1 chrM 8460 8466 + -1.80282 0.00165 0.441 ACTACCA -ACTAAYH DREME-1 chrM 9010 9016 + -1.80282 0.00165 0.441 GCTAACA -ACTAAYH DREME-1 chrM 9257 9263 + -1.80282 0.00165 0.441 CCTAACA -ACTAAYH DREME-1 chrM 9351 9357 + -1.80282 0.00165 0.441 ACCAACA -ACTAAYH DREME-1 chrM 10127 10133 + -1.80282 0.00165 0.441 ACTACCA -ACTAAYH DREME-1 chrM 10295 10301 + -1.80282 0.00165 0.441 ACAAACA -ACTAAYH DREME-1 chrM 10496 10502 + -1.80282 0.00165 0.441 ACTAGCA -ACTAAYH DREME-1 chrM 10792 10798 + -1.80282 0.00165 0.441 ACTACCA -ACTAAYH DREME-1 chrM 10798 10804 + -1.80282 0.00165 0.441 ACTGACA -ACTAAYH DREME-1 chrM 10939 10945 + -1.80282 0.00165 0.441 CCTAACA -ACTAAYH DREME-1 chrM 11023 11029 + -1.80282 0.00165 0.441 ACTATCA -ACTAAYH DREME-1 chrM 11258 11264 + -1.80282 0.00165 0.441 ACTCACA -ACTAAYH DREME-1 chrM 11314 11320 + -1.80282 0.00165 0.441 ACTATCA -ACTAAYH DREME-1 chrM 11593 11599 + -1.80282 0.00165 0.441 ACAAACA -ACTAAYH DREME-1 chrM 11650 11656 + -1.80282 0.00165 0.441 AGTAACA -ACTAAYH DREME-1 chrM 11768 11774 + -1.80282 0.00165 0.441 ACTCACA -ACTAAYH DREME-1 chrM 11901 11907 - -1.80282 0.00165 0.441 ACTAGCA -ACTAAYH DREME-1 chrM 11941 11947 + -1.80282 0.00165 0.441 ACTTACA -ACTAAYH DREME-1 chrM 12026 12032 + -1.80282 0.00165 0.441 ATTAACA -ACTAAYH DREME-1 chrM 12245 12251 + -1.80282 0.00165 0.441 TCTAACA -ACTAAYH DREME-1 chrM 12412 12418 + -1.80282 0.00165 0.441 CCTAACA -ACTAAYH DREME-1 chrM 12530 12536 + -1.80282 0.00165 0.441 ACTGACA -ACTAAYH DREME-1 chrM 12617 12623 - -1.80282 0.00165 0.441 ACGAACA -ACTAAYH DREME-1 chrM 12736 12742 + -1.80282 0.00165 0.441 GCTAACA -ACTAAYH DREME-1 chrM 13161 13167 + -1.80282 0.00165 0.441 TCTAACA -ACTAAYH DREME-1 chrM 13626 13632 + -1.80282 0.00165 0.441 CCTAACA -ACTAAYH DREME-1 chrM 13797 13803 + -1.80282 0.00165 0.441 ACTCACA -ACTAAYH DREME-1 chrM 13830 13836 + -1.80282 0.00165 0.441 TCTAACA -ACTAAYH DREME-1 chrM 13858 13864 + -1.80282 0.00165 0.441 ACCAACA -ACTAAYH DREME-1 chrM 14185 14191 + -1.80282 0.00165 0.441 ACCAACA -ACTAAYH DREME-1 chrM 14189 14195 + -1.80282 0.00165 0.441 ACAAACA -ACTAAYH DREME-1 chrM 14548 14554 + -1.80282 0.00165 0.441 AATAACA -ACTAAYH DREME-1 chrM 14569 14575 + -1.80282 0.00165 0.441 GCTAACA -ACTAAYH DREME-1 chrM 15469 15475 + -1.80282 0.00165 0.441 ATTAACA -ACTAAYH DREME-1 chrM 15599 15605 + -1.80282 0.00165 0.441 CCTAACA -ACTAAYH DREME-1 chrM 16227 16233 + -1.80282 0.00165 0.441 ACTATCA -ACTAAYH DREME-1 chrM 16277 16283 + -1.80282 0.00165 0.441 ACCAACA -ACTAAYH DREME-1 chrM 852 858 + -2.01408 0.00177 0.441 ACTAAGC -ACTAAYH DREME-1 chrM 1449 1455 - -2.01408 0.00177 0.441 ACTAAGC -ACTAAYH DREME-1 chrM 4913 4919 + -2.01408 0.00177 0.441 ACTAAAC -ACTAAYH DREME-1 chrM 11278 11284 + -2.01408 0.00177 0.441 ACTAAAC -ACTAAYH DREME-1 chrM 13686 13692 + -2.01408 0.00177 0.441 ACTAAAC -ACTAAYH DREME-1 chrM 14582 14588 + -2.01408 0.00177 0.441 ACTAAAC -ACTAAYH DREME-1 chrM 14636 14642 + -2.01408 0.00177 0.441 ACTAAAC -ACTAAYH DREME-1 chrM 15703 15709 + -2.01408 0.00177 0.441 ACTAAGC -ACTAAYH DREME-1 chrM 152 158 - -2.39437 0.00269 0.441 AATAATA -ACTAAYH DREME-1 chrM 234 240 + -2.39437 0.00269 0.441 AATAATA -ACTAAYH DREME-1 chrM 472 478 + -2.39437 0.00269 0.441 ACTACTA -ACTAAYH DREME-1 chrM 645 651 + -2.39437 0.00269 0.441 ACAAATA -ACTAAYH DREME-1 chrM 671 677 - -2.39437 0.00269 0.441 GCTAATA -ACTAAYH DREME-1 chrM 2305 2311 - -2.39437 0.00269 0.441 ACTTATA -ACTAAYH DREME-1 chrM 2529 2535 - -2.39437 0.00269 0.441 TCTAATA -ACTAAYH DREME-1 chrM 2744 2750 - -2.39437 0.00269 0.441 ATTAATA -ACTAAYH DREME-1 chrM 2880 2886 + -2.39437 0.00269 0.441 ACTACTA -ACTAAYH DREME-1 chrM 4158 4164 + -2.39437 0.00269 0.441 ACTCATA -ACTAAYH DREME-1 chrM 4206 4212 + -2.39437 0.00269 0.441 ACTTATA -ACTAAYH DREME-1 chrM 4301 4307 + -2.39437 0.00269 0.441 AATAATA -ACTAAYH DREME-1 chrM 4679 4685 + -2.39437 0.00269 0.441 TCTAATA -ACTAAYH DREME-1 chrM 4728 4734 + -2.39437 0.00269 0.441 ACCAATA -ACTAAYH DREME-1 chrM 4754 4760 + -2.39437 0.00269 0.441 ATTAATA -ACTAAYH DREME-1 chrM 5036 5042 + -2.39437 0.00269 0.441 AATAATA -ACTAAYH DREME-1 chrM 5103 5109 + -2.39437 0.00269 0.441 ACTACTA -ACTAAYH DREME-1 chrM 5153 5159 + -2.39437 0.00269 0.441 ACTACTA -ACTAAYH DREME-1 chrM 5962 5968 - -2.39437 0.00269 0.441 AATAATA -ACTAAYH DREME-1 chrM 6110 6116 + -2.39437 0.00269 0.441 AGTAATA -ACTAAYH DREME-1 chrM 6155 6161 + -2.39437 0.00269 0.441 CCTAATA -ACTAAYH DREME-1 chrM 6527 6533 + -2.39437 0.00269 0.441 ACTACTA -ACTAAYH DREME-1 chrM 6973 6979 - -2.39437 0.00269 0.441 GCTAATA -ACTAAYH DREME-1 chrM 7295 7301 + -2.39437 0.00269 0.441 AGTAATA -ACTAAYH DREME-1 chrM 7301 7307 + -2.39437 0.00269 0.441 ATTAATA -ACTAAYH DREME-1 chrM 7300 7306 - -2.39437 0.00269 0.441 ATTAATA -ACTAAYH DREME-1 chrM 7349 7355 + -2.39437 0.00269 0.441 CCTAATA -ACTAAYH DREME-1 chrM 7351 7357 - -2.39437 0.00269 0.441 ACTATTA -ACTAAYH DREME-1 chrM 7522 7528 - -2.39437 0.00269 0.441 TCTAATA -ACTAAYH DREME-1 chrM 8739 8745 + -2.39437 0.00269 0.441 ACTAGTA -ACTAAYH DREME-1 chrM 8738 8744 - -2.39437 0.00269 0.441 ACTAGTA -ACTAAYH DREME-1 chrM 8945 8951 - -2.39437 0.00269 0.441 ACTAGTA -ACTAAYH DREME-1 chrM 8982 8988 + -2.39437 0.00269 0.441 ACCAATA -ACTAAYH DREME-1 chrM 9613 9619 - -2.39437 0.00269 0.441 AGTAATA -ACTAAYH DREME-1 chrM 9656 9662 + -2.39437 0.00269 0.441 TCTAATA -ACTAAYH DREME-1 chrM 10055 10061 + -2.39437 0.00269 0.441 AGTAATA -ACTAAYH DREME-1 chrM 10103 10109 + -2.39437 0.00269 0.441 ACTACTA -ACTAAYH DREME-1 chrM 10246 10252 - -2.39437 0.00269 0.441 AATAATA -ACTAAYH DREME-1 chrM 10315 10321 - -2.39437 0.00269 0.441 ACTATTA -ACTAAYH DREME-1 chrM 10336 10342 - -2.39437 0.00269 0.441 ATTAATA -ACTAAYH DREME-1 chrM 10368 10374 - -2.39437 0.00269 0.441 ACTCATA -ACTAAYH DREME-1 chrM 10526 10532 + -2.39437 0.00269 0.441 ACTAGTA -ACTAAYH DREME-1 chrM 10525 10531 - -2.39437 0.00269 0.441 ACTAGTA -ACTAAYH DREME-1 chrM 10574 10580 + -2.39437 0.00269 0.441 AATAATA -ACTAAYH DREME-1 chrM 10657 10663 - -2.39437 0.00269 0.441 ACTAGTA -ACTAAYH DREME-1 chrM 10699 10705 - -2.39437 0.00269 0.441 ACTAGTA -ACTAAYH DREME-1 chrM 10788 10794 - -2.39437 0.00269 0.441 AGTAATA -ACTAAYH DREME-1 chrM 10858 10864 - -2.39437 0.00269 0.441 GCTAATA -ACTAAYH DREME-1 chrM 10954 10960 + -2.39437 0.00269 0.441 CCTAATA -ACTAAYH DREME-1 chrM 11873 11879 + -2.39437 0.00269 0.441 ACTATTA -ACTAAYH DREME-1 chrM 11958 11964 - -2.39437 0.00269 0.441 ACTAGTA -ACTAAYH DREME-1 chrM 12333 12339 + -2.39437 0.00269 0.441 AGTAATA -ACTAAYH DREME-1 chrM 12349 12355 + -2.39437 0.00269 0.441 ACTACTA -ACTAAYH DREME-1 chrM 12425 12431 + -2.39437 0.00269 0.441 ACTCATA -ACTAAYH DREME-1 chrM 12471 12477 - -2.39437 0.00269 0.441 ACTGATA -ACTAAYH DREME-1 chrM 12933 12939 + -2.39437 0.00269 0.441 ACAAATA -ACTAAYH DREME-1 chrM 12972 12978 + -2.39437 0.00269 0.441 ACTACTA -ACTAAYH DREME-1 chrM 13269 13275 + -2.39437 0.00269 0.441 ACTCATA -ACTAAYH DREME-1 chrM 13274 13280 - -2.39437 0.00269 0.441 ACTATTA -ACTAAYH DREME-1 chrM 13566 13572 - -2.39437 0.00269 0.441 AGTAATA -ACTAAYH DREME-1 chrM 14210 14216 + -2.39437 0.00269 0.441 ACTACTA -ACTAAYH DREME-1 chrM 14213 14219 + -2.39437 0.00269 0.441 ACTACTA -ACTAAYH DREME-1 chrM 14251 14257 + -2.39437 0.00269 0.441 ACCAATA -ACTAAYH DREME-1 chrM 14314 14320 + -2.39437 0.00269 0.441 ACTATTA -ACTAAYH DREME-1 chrM 14510 14516 + -2.39437 0.00269 0.441 ACTATTA -ACTAAYH DREME-1 chrM 14545 14551 + -2.39437 0.00269 0.441 AATAATA -ACTAAYH DREME-1 chrM 14773 14779 + -2.39437 0.00269 0.441 CCTAATA -ACTAAYH DREME-1 chrM 15627 15633 - -2.39437 0.00269 0.441 AGTAATA -ACTAAYH DREME-1 chrM 15838 15844 + -2.39437 0.00269 0.441 CCTAATA -ACTAAYH DREME-1 chrM 193 199 + -2.53521 0.0036 0.501 ACTTACT -ACTAAYH DREME-1 chrM 714 720 - -2.53521 0.0036 0.501 ACTCACT -ACTAAYH DREME-1 chrM 1860 1866 + -2.53521 0.0036 0.501 ATTAACT -ACTAAYH DREME-1 chrM 1870 1876 + -2.53521 0.0036 0.501 AATAACT -ACTAAYH DREME-1 chrM 2220 2226 + -2.53521 0.0036 0.501 ACTACCT -ACTAAYH DREME-1 chrM 2901 2907 + -2.53521 0.0036 0.501 AATAACT -ACTAAYH DREME-1 chrM 4154 4160 + -2.53521 0.0036 0.501 ACCAACT -ACTAAYH DREME-1 chrM 4283 4289 - -2.53521 0.0036 0.501 AGTAACT -ACTAAYH DREME-1 chrM 5099 5105 + -2.53521 0.0036 0.501 CCTAACT -ACTAAYH DREME-1 chrM 5156 5162 + -2.53521 0.0036 0.501 ACTATCT -ACTAAYH DREME-1 chrM 5555 5561 - -2.53521 0.0036 0.501 ACTTACT -ACTAAYH DREME-1 chrM 6142 6148 + -2.53521 0.0036 0.501 ACTGACT -ACTAAYH DREME-1 chrM 6678 6684 + -2.53521 0.0036 0.501 ACTTACT -ACTAAYH DREME-1 chrM 7169 7175 + -2.53521 0.0036 0.501 TCTAACT -ACTAAYH DREME-1 chrM 8304 8310 + -2.53521 0.0036 0.501 GCTAACT -ACTAAYH DREME-1 chrM 8456 8462 + -2.53521 0.0036 0.501 ACAAACT -ACTAAYH DREME-1 chrM 8817 8823 + -2.53521 0.0036 0.501 ACTATCT -ACTAAYH DREME-1 chrM 8949 8955 - -2.53521 0.0036 0.501 AATAACT -ACTAAYH DREME-1 chrM 9120 9126 + -2.53521 0.0036 0.501 ACTGACT -ACTAAYH DREME-1 chrM 9852 9858 + -2.53521 0.0036 0.501 ACTATCT -ACTAAYH DREME-1 chrM 10025 10031 + -2.53521 0.0036 0.501 ATTAACT -ACTAAYH DREME-1 chrM 10964 10970 + -2.53521 0.0036 0.501 ACTACCT -ACTAAYH DREME-1 chrM 11293 11299 + -2.53521 0.0036 0.501 ACTCACT -ACTAAYH DREME-1 chrM 11347 11353 + -2.53521 0.0036 0.501 ACTAGCT -ACTAAYH DREME-1 chrM 12226 12232 + -2.53521 0.0036 0.501 GCTAACT -ACTAAYH DREME-1 chrM 12516 12522 - -2.53521 0.0036 0.501 AATAACT -ACTAAYH DREME-1 chrM 13850 13856 + -2.53521 0.0036 0.501 ACTACCT -ACTAAYH DREME-1 chrM 13862 13868 + -2.53521 0.0036 0.501 ACAAACT -ACTAAYH DREME-1 chrM 14206 14212 + -2.53521 0.0036 0.501 AGTAACT -ACTAAYH DREME-1 chrM 15185 15191 + -2.53521 0.0036 0.501 ACAAACT -ACTAAYH DREME-1 chrM 15189 15195 + -2.53521 0.0036 0.501 ACTTACT -ACTAAYH DREME-1 chrM 15603 15609 + -2.53521 0.0036 0.501 ACAAACT -ACTAAYH DREME-1 chrM 15844 15850 + -2.53521 0.0036 0.501 ACCAACT -ACTAAYH DREME-1 chrM 15848 15854 + -2.53521 0.0036 0.501 ACTATCT -ACTAAYH DREME-1 chrM 21 27 + -2.74648 0.00452 0.505 ATTAACC -ACTAAYH DREME-1 chrM 381 387 + -2.74648 0.00452 0.505 CCTAACC -ACTAAYH DREME-1 chrM 529 535 + -2.74648 0.00452 0.505 GCTAACC -ACTAAYH DREME-1 chrM 547 553 + -2.74648 0.00452 0.505 ACCAACC -ACTAAYH DREME-1 chrM 823 829 + -2.74648 0.00452 0.505 ATTAACC -ACTAAYH DREME-1 chrM 873 879 - -2.74648 0.00452 0.505 ACCAACC -ACTAAYH DREME-1 chrM 910 916 + -2.74648 0.00452 0.505 ATTAACC -ACTAAYH DREME-1 chrM 978 984 + -2.74648 0.00452 0.505 ACTCACC -ACTAAYH DREME-1 chrM 1569 1575 - -2.74648 0.00452 0.505 ACTTACC -ACTAAYH DREME-1 chrM 1596 1602 + -2.74648 0.00452 0.505 ACGAACC -ACTAAYH DREME-1 chrM 1991 1997 + -2.74648 0.00452 0.505 ACAAACC -ACTAAYH DREME-1 chrM 2578 2584 + -2.74648 0.00452 0.505 CCTAACC -ACTAAYH DREME-1 chrM 2765 2771 + -2.74648 0.00452 0.505 ACAAACC -ACTAAYH DREME-1 chrM 3031 3037 - -2.74648 0.00452 0.505 ACGAACC -ACTAAYH DREME-1 chrM 3225 3231 - -2.74648 0.00452 0.505 ACAAACC -ACTAAYH DREME-1 chrM 3883 3889 + -2.74648 0.00452 0.505 ACCAACC -ACTAAYH DREME-1 chrM 4101 4107 + -2.74648 0.00452 0.505 TCTAACC -ACTAAYH DREME-1 chrM 4191 4197 + -2.74648 0.00452 0.505 ACTCACC -ACTAAYH DREME-1 chrM 4598 4604 + -2.74648 0.00452 0.505 TCTAACC -ACTAAYH DREME-1 chrM 4874 4880 + -2.74648 0.00452 0.505 ACTAGCC -ACTAAYH DREME-1 chrM 5237 5243 + -2.74648 0.00452 0.505 GCTAACC -ACTAAYH DREME-1 chrM 5839 5845 + -2.74648 0.00452 0.505 CCTAACC -ACTAAYH DREME-1 chrM 5931 5937 + -2.74648 0.00452 0.505 ACAAACC -ACTAAYH DREME-1 chrM 6335 6341 + -2.74648 0.00452 0.505 CCTAACC -ACTAAYH DREME-1 chrM 7228 7234 + -2.74648 0.00452 0.505 ACTACCC -ACTAAYH DREME-1 chrM 7781 7787 + -2.74648 0.00452 0.505 ACTATCC -ACTAAYH DREME-1 chrM 8315 8321 + -2.74648 0.00452 0.505 ATTAACC -ACTAAYH DREME-1 chrM 8508 8514 + -2.74648 0.00452 0.505 ACAAACC -ACTAAYH DREME-1 chrM 8721 8727 + -2.74648 0.00452 0.505 ACGAACC -ACTAAYH DREME-1 chrM 8805 8811 + -2.74648 0.00452 0.505 ACCAACC -ACTAAYH DREME-1 chrM 9003 9009 + -2.74648 0.00452 0.505 CCTAACC -ACTAAYH DREME-1 chrM 9076 9082 + -2.74648 0.00452 0.505 ATTAACC -ACTAAYH DREME-1 chrM 9124 9130 + -2.74648 0.00452 0.505 ACTATCC -ACTAAYH DREME-1 chrM 11548 11554 + -2.74648 0.00452 0.505 ACTATCC -ACTAAYH DREME-1 chrM 11852 11858 + -2.74648 0.00452 0.505 GCTAACC -ACTAAYH DREME-1 chrM 11876 11882 + -2.74648 0.00452 0.505 ATTAACC -ACTAAYH DREME-1 chrM 11905 11911 + -2.74648 0.00452 0.505 AGTAACC -ACTAAYH DREME-1 chrM 12013 12019 + -2.74648 0.00452 0.505 ACTCACC -ACTAAYH DREME-1 chrM 12336 12342 + -2.74648 0.00452 0.505 AATAACC -ACTAAYH DREME-1 chrM 12363 12369 + -2.74648 0.00452 0.505 CCTAACC -ACTAAYH DREME-1 chrM 13295 13301 + -2.74648 0.00452 0.505 ACCAACC -ACTAAYH DREME-1 chrM 13672 13678 + -2.74648 0.00452 0.505 AATAACC -ACTAAYH DREME-1 chrM 13854 13860 + -2.74648 0.00452 0.505 CCTAACC -ACTAAYH DREME-1 chrM 13998 14004 + -2.74648 0.00452 0.505 CCTAACC -ACTAAYH DREME-1 chrM 14124 14130 + -2.74648 0.00452 0.505 CCTAACC -ACTAAYH DREME-1 chrM 14384 14390 + -2.74648 0.00452 0.505 GCTAACC -ACTAAYH DREME-1 chrM 14401 14407 + -2.74648 0.00452 0.505 ACTCACC -ACTAAYH DREME-1 chrM 14624 14630 + -2.74648 0.00452 0.505 ACAAACC -ACTAAYH DREME-1 chrM 14786 14792 + -2.74648 0.00452 0.505 ATTAACC -ACTAAYH DREME-1 chrM 14910 14916 + -2.74648 0.00452 0.505 ACTCACC -ACTAAYH DREME-1 chrM 15193 15199 + -2.74648 0.00452 0.505 ACTATCC -ACTAAYH DREME-1 chrM 15631 15637 + -2.74648 0.00452 0.505 ACTATCC -ACTAAYH DREME-1 chrM 15748 15754 + -2.74648 0.00452 0.505 TCTAACC -ACTAAYH DREME-1 chrM 16066 16072 + -2.74648 0.00452 0.505 ACTCACC -ACTAAYH DREME-1 chrM 16281 16287 + -2.74648 0.00452 0.505 ACAAACC -ACTAAYH DREME-1 chrM 211 217 + -3.12676 0.00543 0.514 ATTAATT -ACTAAYH DREME-1 chrM 210 216 - -3.12676 0.00543 0.514 ATTAATT -ACTAAYH DREME-1 chrM 214 220 - -3.12676 0.00543 0.514 ATTAATT -ACTAAYH DREME-1 chrM 1961 1967 - -3.12676 0.00543 0.514 ACTATTT -ACTAAYH DREME-1 chrM 2188 2194 + -3.12676 0.00543 0.514 ACCAATT -ACTAAYH DREME-1 chrM 3771 3777 - -3.12676 0.00543 0.514 ACTTATT -ACTAAYH DREME-1 chrM 3923 3929 - -3.12676 0.00543 0.514 ACTAGTT -ACTAAYH DREME-1 chrM 4469 4475 - -3.12676 0.00543 0.514 ATTAATT -ACTAAYH DREME-1 chrM 4543 4549 + -3.12676 0.00543 0.514 ACTGATT -ACTAAYH DREME-1 chrM 5085 5091 + -3.12676 0.00543 0.514 ACTATTT -ACTAAYH DREME-1 chrM 6146 6152 + -3.12676 0.00543 0.514 ACTAGTT -ACTAAYH DREME-1 chrM 7087 7093 + -3.12676 0.00543 0.514 ACTGATT -ACTAAYH DREME-1 chrM 7304 7310 + -3.12676 0.00543 0.514 AATAATT -ACTAAYH DREME-1 chrM 8041 8047 + -3.12676 0.00543 0.514 AATAATT -ACTAAYH DREME-1 chrM 8221 8227 + -3.12676 0.00543 0.514 ATTAATT -ACTAAYH DREME-1 chrM 8220 8226 - -3.12676 0.00543 0.514 ATTAATT -ACTAAYH DREME-1 chrM 8795 8801 + -3.12676 0.00543 0.514 ACTCATT -ACTAAYH DREME-1 chrM 8946 8952 + -3.12676 0.00543 0.514 ACTAGTT -ACTAAYH DREME-1 chrM 8973 8979 + -3.12676 0.00543 0.514 ACTCATT -ACTAAYH DREME-1 chrM 9042 9048 + -3.12676 0.00543 0.514 CCTAATT -ACTAAYH DREME-1 chrM 9111 9117 + -3.12676 0.00543 0.514 TCTAATT -ACTAAYH DREME-1 chrM 9538 9544 - -3.12676 0.00543 0.514 CCTAATT -ACTAAYH DREME-1 chrM 9680 9686 + -3.12676 0.00543 0.514 AATAATT -ACTAAYH DREME-1 chrM 9953 9959 + -3.12676 0.00543 0.514 ACTATTT -ACTAAYH DREME-1 chrM 10004 10010 - -3.12676 0.00543 0.514 ACTATTT -ACTAAYH DREME-1 chrM 10029 10035 + -3.12676 0.00543 0.514 ACTAGTT -ACTAAYH DREME-1 chrM 10028 10034 - -3.12676 0.00543 0.514 ACTAGTT -ACTAAYH DREME-1 chrM 10109 10115 + -3.12676 0.00543 0.514 AATAATT -ACTAAYH DREME-1 chrM 10112 10118 - -3.12676 0.00543 0.514 AATAATT -ACTAAYH DREME-1 chrM 10402 10408 - -3.12676 0.00543 0.514 ACCAATT -ACTAAYH DREME-1 chrM 10438 10444 + -3.12676 0.00543 0.514 ACTCATT -ACTAAYH DREME-1 chrM 10852 10858 + -3.12676 0.00543 0.514 CCTAATT -ACTAAYH DREME-1 chrM 10855 10861 - -3.12676 0.00543 0.514 AATAATT -ACTAAYH DREME-1 chrM 10876 10882 + -3.12676 0.00543 0.514 ACTATTT -ACTAAYH DREME-1 chrM 11500 11506 + -3.12676 0.00543 0.514 ACTCATT -ACTAAYH DREME-1 chrM 12378 12384 + -3.12676 0.00543 0.514 CCTAATT -ACTAAYH DREME-1 chrM 12584 12590 + -3.12676 0.00543 0.514 ACTACTT -ACTAAYH DREME-1 chrM 12679 12685 - -3.12676 0.00543 0.514 ACTGATT -ACTAAYH DREME-1 chrM 12708 12714 + -3.12676 0.00543 0.514 CCTAATT -ACTAAYH DREME-1 chrM 13013 13019 - -3.12676 0.00543 0.514 CCTAATT -ACTAAYH DREME-1 chrM 13350 13356 + -3.12676 0.00543 0.514 ACTATTT -ACTAAYH DREME-1 chrM 13611 13617 + -3.12676 0.00543 0.514 AATAATT -ACTAAYH DREME-1 chrM 14296 14302 - -3.12676 0.00543 0.514 AATAATT -ACTAAYH DREME-1 chrM 14782 14788 + -3.12676 0.00543 0.514 ATTAATT -ACTAAYH DREME-1 chrM 14781 14787 - -3.12676 0.00543 0.514 ATTAATT -ACTAAYH DREME-1 chrM 14793 14799 + -3.12676 0.00543 0.514 ACTCATT -ACTAAYH DREME-1 chrM 15178 15184 + -3.12676 0.00543 0.514 AGTAATT -ACTAAYH DREME-1 chrM 15856 15862 + -3.12676 0.00543 0.514 CCTAATT -ACTAAYH DREME-1 chrM 16003 16009 + -3.12676 0.00543 0.514 TCTAATT -ACTAAYH DREME-1 chrM 1074 1080 - -3.33803 0.00635 0.514 TCTAATC -ACTAAYH DREME-1 chrM 2270 2276 + -3.33803 0.00635 0.514 ACCAATC -ACTAAYH DREME-1 chrM 3081 3087 + -3.33803 0.00635 0.514 AGTAATC -ACTAAYH DREME-1 chrM 3345 3351 + -3.33803 0.00635 0.514 TCTAATC -ACTAAYH DREME-1 chrM 3824 3830 - -3.33803 0.00635 0.514 AGTAATC -ACTAAYH DREME-1 chrM 3924 3930 + -3.33803 0.00635 0.514 ACTAGTC -ACTAAYH DREME-1 chrM 4470 4476 + -3.33803 0.00635 0.514 ATTAATC -ACTAAYH DREME-1 chrM 4520 4526 + -3.33803 0.00635 0.514 ACTCATC -ACTAAYH DREME-1 chrM 4737 4743 + -3.33803 0.00635 0.514 ACCAATC -ACTAAYH DREME-1 chrM 4747 4753 + -3.33803 0.00635 0.514 ACTCATC -ACTAAYH DREME-1 chrM 4757 4763 + -3.33803 0.00635 0.514 AATAATC -ACTAAYH DREME-1 chrM 5120 5126 + -3.33803 0.00635 0.514 ACTACTC -ACTAAYH DREME-1 chrM 5354 5360 + -3.33803 0.00635 0.514 CCTAATC -ACTAAYH DREME-1 chrM 5378 5384 + -3.33803 0.00635 0.514 ACTACTC -ACTAAYH DREME-1 chrM 5453 5459 + -3.33803 0.00635 0.514 ACTCATC -ACTAAYH DREME-1 chrM 5501 5507 + -3.33803 0.00635 0.514 AATAATC -ACTAAYH DREME-1 chrM 5707 5713 + -3.33803 0.00635 0.514 CCTAATC -ACTAAYH DREME-1 chrM 5921 5927 + -3.33803 0.00635 0.514 ACTATTC -ACTAAYH DREME-1 chrM 6095 6101 + -3.33803 0.00635 0.514 AATAATC -ACTAAYH DREME-1 chrM 6145 6151 - -3.33803 0.00635 0.514 ACTAGTC -ACTAAYH DREME-1 chrM 6158 6164 + -3.33803 0.00635 0.514 AATAATC -ACTAAYH DREME-1 chrM 6307 6313 + -3.33803 0.00635 0.514 ACTACTC -ACTAAYH DREME-1 chrM 6467 6473 + -3.33803 0.00635 0.514 CCTAATC -ACTAAYH DREME-1 chrM 6659 6665 + -3.33803 0.00635 0.514 AATAATC -ACTAAYH DREME-1 chrM 6682 6688 + -3.33803 0.00635 0.514 ACTACTC -ACTAAYH DREME-1 chrM 6982 6988 + -3.33803 0.00635 0.514 ACTCATC -ACTAAYH DREME-1 chrM 8007 8013 - -3.33803 0.00635 0.514 ACTACTC -ACTAAYH DREME-1 chrM 8422 8428 + -3.33803 0.00635 0.514 ACTATTC -ACTAAYH DREME-1 chrM 8589 8595 + -3.33803 0.00635 0.514 ACTGATC -ACTAAYH DREME-1 chrM 9093 9099 + -3.33803 0.00635 0.514 ACTTATC -ACTAAYH DREME-1 chrM 9214 9220 + -3.33803 0.00635 0.514 ACCAATC -ACTAAYH DREME-1 chrM 10079 10085 + -3.33803 0.00635 0.514 AATAATC -ACTAAYH DREME-1 chrM 10337 10343 + -3.33803 0.00635 0.514 ATTAATC -ACTAAYH DREME-1 chrM 10387 10393 - -3.33803 0.00635 0.514 TCTAATC -ACTAAYH DREME-1 chrM 10658 10664 + -3.33803 0.00635 0.514 ACTAGTC -ACTAAYH DREME-1 chrM 10700 10706 + -3.33803 0.00635 0.514 ACTAGTC -ACTAAYH DREME-1 chrM 11007 11013 + -3.33803 0.00635 0.514 ACTTATC -ACTAAYH DREME-1 chrM 11065 11071 + -3.33803 0.00635 0.514 ACAAATC -ACTAAYH DREME-1 chrM 11134 11140 + -3.33803 0.00635 0.514 ACTTATC -ACTAAYH DREME-1 chrM 11239 11245 + -3.33803 0.00635 0.514 ACTCATC -ACTAAYH DREME-1 chrM 11290 11296 + -3.33803 0.00635 0.514 ACTACTC -ACTAAYH DREME-1 chrM 11734 11740 + -3.33803 0.00635 0.514 ACTATTC -ACTAAYH DREME-1 chrM 11959 11965 + -3.33803 0.00635 0.514 ACTAGTC -ACTAAYH DREME-1 chrM 12676 12682 + -3.33803 0.00635 0.514 ATTAATC -ACTAAYH DREME-1 chrM 12699 12705 + -3.33803 0.00635 0.514 ACTCATC -ACTAAYH DREME-1 chrM 12952 12958 + -3.33803 0.00635 0.514 GCTAATC -ACTAAYH DREME-1 chrM 13113 13119 + -3.33803 0.00635 0.514 ACTCATC -ACTAAYH DREME-1 chrM 13419 13425 + -3.33803 0.00635 0.514 ACTACTC -ACTAAYH DREME-1 chrM 14118 14124 + -3.33803 0.00635 0.514 ACTCATC -ACTAAYH DREME-1 chrM 14136 14142 + -3.33803 0.00635 0.514 CCTAATC -ACTAAYH DREME-1 chrM 14366 14372 + -3.33803 0.00635 0.514 ACCAATC -ACTAAYH DREME-1 chrM 14890 14896 + -3.33803 0.00635 0.514 ACTATTC -ACTAAYH DREME-1 chrM 14907 14913 + -3.33803 0.00635 0.514 ACTACTC -ACTAAYH DREME-1 chrM 15475 15481 + -3.33803 0.00635 0.514 ACTATTC -ACTAAYH DREME-1 chrM 15652 15658 + -3.33803 0.00635 0.514 AATAATC -ACTAAYH DREME-1 chrM 15832 15838 + -3.33803 0.00635 0.514 CCTAATC -ACTAAYH DREME-1 chrM 15951 15957 + -3.33803 0.00635 0.514 ACAAATC -ACTAAYH DREME-1 chrM 16013 16019 + -3.33803 0.00635 0.514 ACTATTC -ACTAAYH DREME-1 chrM 197 203 + -13.9718 0.00647 0.521 ACTAAAG -ACTAAYH DREME-1 chrM 8713 8719 + -13.9718 0.00647 0.521 ACTAAAG -ACTAAYH DREME-1 chrM 28 34 + -14.7042 0.00739 0.559 ACTCACG -ACTAAYH DREME-1 chrM 1322 1328 - -14.7042 0.00739 0.559 CCTAACG -ACTAAYH DREME-1 chrM 2910 2916 + -14.7042 0.00739 0.559 ACCAACG -ACTAAYH DREME-1 chrM 3035 3041 - -14.7042 0.00739 0.559 ACAAACG -ACTAAYH DREME-1 chrM 5106 5112 + -14.7042 0.00739 0.559 ACTACCG -ACTAAYH DREME-1 chrM 7218 7224 - -14.7042 0.00739 0.559 AGTAACG -ACTAAYH DREME-1 chrM 8381 8387 + -14.7042 0.00739 0.559 ACTACCG -ACTAAYH DREME-1 chrM 10580 10586 + -14.7042 0.00739 0.559 ACTATCG -ACTAAYH DREME-1 chrM 11760 11766 + -14.7042 0.00739 0.559 ACGAACG -ACTAAYH DREME-1 chrM 13546 13552 + -14.7042 0.00739 0.559 ACAAACG -ACTAAYH DREME-1 chrM 13663 13669 + -14.7042 0.00739 0.559 ATTAACG -ACTAAYH DREME-1 chrM 57 63 - -15.0563 0.00922 0.559 ACGAAAA -ACTAAYH DREME-1 chrM 284 290 + -15.0563 0.00922 0.559 ACAAAAA -ACTAAYH DREME-1 chrM 331 337 + -15.0563 0.00922 0.559 ACTTAAA -ACTAAYH DREME-1 chrM 361 367 + -15.0563 0.00922 0.559 ACAAAGA -ACTAAYH DREME-1 chrM 608 614 + -15.0563 0.00922 0.559 ACTGAAA -ACTAAYH DREME-1 chrM 682 688 + -15.0563 0.00922 0.559 AGTAAGA -ACTAAYH DREME-1 chrM 946 952 - -15.0563 0.00922 0.559 TCTAAAA -ACTAAYH DREME-1 chrM 972 978 + -15.0563 0.00922 0.559 GCTAAAA -ACTAAYH DREME-1 chrM 1019 1025 + -15.0563 0.00922 0.559 ACTACGA -ACTAAYH DREME-1 chrM 1057 1063 + -15.0563 0.00922 0.559 GCTAAGA -ACTAAYH DREME-1 chrM 1142 1148 + -15.0563 0.00922 0.559 ACTACGA -ACTAAYH DREME-1 chrM 1162 1168 + -15.0563 0.00922 0.559 ACTCAAA -ACTAAYH DREME-1 chrM 1384 1390 + -15.0563 0.00922 0.559 ACTACGA -ACTAAYH DREME-1 chrM 1864 1870 + -15.0563 0.00922 0.559 ACTAGAA -ACTAAYH DREME-1 chrM 1894 1900 + -15.0563 0.00922 0.559 GCTAAGA -ACTAAYH DREME-1 chrM 1922 1928 + -15.0563 0.00922 0.559 CCTAAGA -ACTAAYH DREME-1 chrM 1932 1938 + -15.0563 0.00922 0.559 GCTAAAA -ACTAAYH DREME-1 chrM 2124 2130 + -15.0563 0.00922 0.559 ACTAGGA -ACTAAYH DREME-1 chrM 2148 2154 + -15.0563 0.00922 0.559 AGTAAAA -ACTAAYH DREME-1 chrM 2175 2181 + -15.0563 0.00922 0.559 CCTAAAA -ACTAAYH DREME-1 chrM 2192 2198 + -15.0563 0.00922 0.559 ATTAAGA -ACTAAYH DREME-1 chrM 2224 2230 + -15.0563 0.00922 0.559 CCTAAAA -ACTAAYH DREME-1 chrM 2350 2356 + -15.0563 0.00922 0.559 ATTAAAA -ACTAAYH DREME-1 chrM 2463 2469 + -15.0563 0.00922 0.559 AGTAAAA -ACTAAYH DREME-1 chrM 2500 2506 + -15.0563 0.00922 0.559 ACCAAAA -ACTAAYH DREME-1 chrM 2658 2664 - -15.0563 0.00922 0.559 AGTAAGA -ACTAAYH DREME-1 chrM 2798 2804 + -15.0563 0.00922 0.559 ATTAAAA -ACTAAYH DREME-1 chrM 2855 2861 + -15.0563 0.00922 0.559 GCTAAGA -ACTAAYH DREME-1 chrM 3065 3071 - -15.0563 0.00922 0.559 ACTCAGA -ACTAAYH DREME-1 chrM 3262 3268 + -15.0563 0.00922 0.559 ACTTAAA -ACTAAYH DREME-1 chrM 3378 3384 + -15.0563 0.00922 0.559 ACGAAAA -ACTAAYH DREME-1 chrM 3441 3447 + -15.0563 0.00922 0.559 ACTACAA -ACTAAYH DREME-1 chrM 3486 3492 + -15.0563 0.00922 0.559 CCTAAAA -ACTAAYH DREME-1 chrM 3558 3564 + -15.0563 0.00922 0.559 ACTATGA -ACTAAYH DREME-1 chrM 3677 3683 + -15.0563 0.00922 0.559 ACTCAAA -ACTAAYH DREME-1 chrM 4021 4027 + -15.0563 0.00922 0.559 ACTACAA -ACTAAYH DREME-1 chrM 4087 4093 + -15.0563 0.00922 0.559 ACCAAGA -ACTAAYH DREME-1 chrM 4259 4265 + -15.0563 0.00922 0.559 CCTAAGA -ACTAAYH DREME-1 chrM 4334 4340 + -15.0563 0.00922 0.559 ACTATGA -ACTAAYH DREME-1 chrM 4586 4592 - -15.0563 0.00922 0.559 AATAAAA -ACTAAYH DREME-1 chrM 4602 4608 + -15.0563 0.00922 0.559 ACCAAAA -ACTAAYH DREME-1 chrM 4778 4784 + -15.0563 0.00922 0.559 AATAAAA -ACTAAYH DREME-1 chrM 4784 4790 + -15.0563 0.00922 0.559 ACTAGGA -ACTAAYH DREME-1 chrM 4807 4813 - -15.0563 0.00922 0.559 ACTCAGA -ACTAAYH DREME-1 chrM 4868 4874 + -15.0563 0.00922 0.559 ACAAAAA -ACTAAYH DREME-1 chrM 5002 5008 - -15.0563 0.00922 0.559 GCTAAGA -ACTAAYH DREME-1 chrM 5075 5081 - -15.0563 0.00922 0.559 ATTAAGA -ACTAAYH DREME-1 chrM 5128 5134 + -15.0563 0.00922 0.559 ACTTAAA -ACTAAYH DREME-1 chrM 5280 5286 + -15.0563 0.00922 0.559 ACAAAAA -ACTAAYH DREME-1 chrM 5405 5411 + -15.0563 0.00922 0.559 AATAAAA -ACTAAYH DREME-1 chrM 5533 5539 + -15.0563 0.00922 0.559 ACCAAGA -ACTAAYH DREME-1 chrM 5670 5676 + -15.0563 0.00922 0.559 ACTTAAA -ACTAAYH DREME-1 chrM 5938 5944 + -15.0563 0.00922 0.559 ACAAAGA -ACTAAYH DREME-1 chrM 6106 6112 - -15.0563 0.00922 0.559 ACTATGA -ACTAAYH DREME-1 chrM 6376 6382 - -15.0563 0.00922 0.559 CCTAAGA -ACTAAYH DREME-1 chrM 6451 6457 - -15.0563 0.00922 0.559 ACGAAGA -ACTAAYH DREME-1 chrM 7445 7451 + -15.0563 0.00922 0.559 ACAAAAA -ACTAAYH DREME-1 chrM 7581 7587 - -15.0563 0.00922 0.559 ATTAAGA -ACTAAYH DREME-1 chrM 7692 7698 - -15.0563 0.00922 0.559 ACTAGGA -ACTAAYH DREME-1 chrM 7800 7806 - -15.0563 0.00922 0.559 ACTAGGA -ACTAAYH DREME-1 chrM 8230 8236 + -15.0563 0.00922 0.559 CCTAAAA -ACTAAYH DREME-1 chrM 8323 8329 - -15.0563 0.00922 0.559 ACTTAAA -ACTAAYH DREME-1 chrM 8335 8341 + -15.0563 0.00922 0.559 ATTAAGA -ACTAAYH DREME-1 chrM 8494 8500 + -15.0563 0.00922 0.559 AATAAAA -ACTAAYH DREME-1 chrM 8521 8527 + -15.0563 0.00922 0.559 ACCAAAA -ACTAAYH DREME-1 chrM 8531 8537 + -15.0563 0.00922 0.559 ACGAAAA -ACTAAYH DREME-1 chrM 8757 8763 - -15.0563 0.00922 0.559 AATAAAA -ACTAAYH DREME-1 chrM 8881 8887 + -15.0563 0.00922 0.559 TCTAAGA -ACTAAYH DREME-1 chrM 8887 8893 + -15.0563 0.00922 0.559 ATTAAAA -ACTAAYH DREME-1 chrM 9173 9179 - -15.0563 0.00922 0.559 ACTAGAA -ACTAAYH DREME-1 chrM 9236 9242 + -15.0563 0.00922 0.559 AGTAAAA -ACTAAYH DREME-1 chrM 9706 9712 - -15.0563 0.00922 0.559 AGTAAAA -ACTAAYH DREME-1 chrM 9796 9802 - -15.0563 0.00922 0.559 ACAAAAA -ACTAAYH DREME-1 chrM 9987 9993 - -15.0563 0.00922 0.559 AGTAAGA -ACTAAYH DREME-1 chrM 10075 10081 - -15.0563 0.00922 0.559 ATTAAAA -ACTAAYH DREME-1 chrM 10243 10249 - -15.0563 0.00922 0.559 AATAAGA -ACTAAYH DREME-1 chrM 10333 10339 - -15.0563 0.00922 0.559 AATAAGA -ACTAAYH DREME-1 chrM 10376 10382 + -15.0563 0.00922 0.559 ACTACAA -ACTAAYH DREME-1 chrM 10379 10385 + -15.0563 0.00922 0.559 ACAAAAA -ACTAAYH DREME-1 chrM 10630 10636 - -15.0563 0.00922 0.559 GCTAAGA -ACTAAYH DREME-1 chrM 10762 10768 + -15.0563 0.00922 0.559 GCTAAAA -ACTAAYH DREME-1 chrM 11029 11035 + -15.0563 0.00922 0.559 ACGAAAA -ACTAAYH DREME-1 chrM 11367 11373 - -15.0563 0.00922 0.559 ACTATAA -ACTAAYH DREME-1 chrM 11602 11608 + -15.0563 0.00922 0.559 CCTAAAA -ACTAAYH DREME-1 chrM 11646 11652 - -15.0563 0.00922 0.559 ACTACGA -ACTAAYH DREME-1 chrM 11751 11757 + -15.0563 0.00922 0.559 ACTCAAA -ACTAAYH DREME-1 chrM 11757 11763 + -15.0563 0.00922 0.559 ACTACGA -ACTAAYH DREME-1 chrM 12152 12158 + -15.0563 0.00922 0.559 ACCAAAA -ACTAAYH DREME-1 chrM 12295 12301 - -15.0563 0.00922 0.559 CCTAAGA -ACTAAYH DREME-1 chrM 12311 12317 - -15.0563 0.00922 0.559 ACCAAAA -ACTAAYH DREME-1 chrM 12327 12333 + -15.0563 0.00922 0.559 AATAAAA -ACTAAYH DREME-1 chrM 12352 12358 + -15.0563 0.00922 0.559 ACTATAA -ACTAAYH DREME-1 chrM 12416 12422 + -15.0563 0.00922 0.559 ACAAAAA -ACTAAYH DREME-1 chrM 12509 12515 + -15.0563 0.00922 0.559 ACCAAGA -ACTAAYH DREME-1 chrM 12662 12668 + -15.0563 0.00922 0.559 ACTCAGA -ACTAAYH DREME-1 chrM 13109 13115 - -15.0563 0.00922 0.559 AGTAAGA -ACTAAYH DREME-1 chrM 13263 13269 + -15.0563 0.00922 0.559 ACTAGGA -ACTAAYH DREME-1 chrM 13422 13428 + -15.0563 0.00922 0.559 ACTCAAA -ACTAAYH DREME-1 chrM 13667 13673 + -15.0563 0.00922 0.559 ACGAAAA -ACTAAYH DREME-1 chrM 13791 13797 + -15.0563 0.00922 0.559 CCTAAAA -ACTAAYH DREME-1 chrM 13866 13872 + -15.0563 0.00922 0.559 ACTTAAA -ACTAAYH DREME-1 chrM 13872 13878 + -15.0563 0.00922 0.559 AATAAAA -ACTAAYH DREME-1 chrM 13894 13900 - -15.0563 0.00922 0.559 AATAAAA -ACTAAYH DREME-1 chrM 14007 14013 + -15.0563 0.00922 0.559 ACTAGAA -ACTAAYH DREME-1 chrM 14023 14029 + -15.0563 0.00922 0.559 CCTAAAA -ACTAAYH DREME-1 chrM 14405 14411 + -15.0563 0.00922 0.559 ACCAAGA -ACTAAYH DREME-1 chrM 14501 14507 + -15.0563 0.00922 0.559 ATTAAAA -ACTAAYH DREME-1 chrM 14687 14693 + -15.0563 0.00922 0.559 ACTACAA -ACTAAYH DREME-1 chrM 14732 14738 + -15.0563 0.00922 0.559 ACTACAA -ACTAAYH DREME-1 chrM 14776 14782 + -15.0563 0.00922 0.559 AATAAAA -ACTAAYH DREME-1 chrM 15072 15078 + -15.0563 0.00922 0.559 ACTCAGA -ACTAAYH DREME-1 chrM 15607 15613 + -15.0563 0.00922 0.559 ACTAGGA -ACTAAYH DREME-1 chrM 15874 15880 + -15.0563 0.00922 0.559 ACTCAAA -ACTAAYH DREME-1 chrM 15892 15898 - -15.0563 0.00922 0.559 ACTACAA -ACTAAYH DREME-1 chrM 15995 16001 + -15.0563 0.00922 0.559 GCTAAGA -ACTAAYH DREME-1 chrM 16269 16275 + -15.0563 0.00922 0.559 ACTAGGA -ACTAAYH DREME-1 chrM 16553 16559 + -15.0563 0.00922 0.559 AATAAGA
--- a/test-data/fimo_output_test3.xml Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/fimo_output_test3.xml Wed Dec 11 18:05:35 2019 -0500 @@ -1,14 +1,10 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Begin document body --> -<fimo version="4.12.0" release="Tue Jun 27 16:22:50 2017 -0700"> +<fimo version="5.0.5" release="Mon Mar 18 20:12:19 2019 -0700"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= xmlns:fimo="http://noble.gs.washington.edu/schema/fimo" > -<command-line>fimo -o ./fimo_test4_out --thresh 0.01 --bgfile --uniform-- --max-stored-scores 100000 --motif ACTAAYH --motif-pseudo 0.1 dreme_fimo_input_1.xml hsa_chrM.fa</command-line> <settings> -<setting name="output directory">./fimo_test4_out</setting> -<setting name="MEME file name">dreme_fimo_input_1.xml</setting> -<setting name="sequence file name">hsa_chrM.fa</setting> <setting name="background file name">--uniform--</setting> <setting name="allow clobber">false</setting> <setting name="compute q-values">true</setting>
--- a/test-data/meme_output_test1.html Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/meme_output_test1.html Wed Dec 11 18:05:35 2019 -0500 @@ -7,7999 +7,18 @@ // @JSON_VAR data var data = { "program": "MEME", - "version": "4.12.0", - "release": "Tue Jun 27 16:22:50 2017 -0700", + "version": "5.0.5", + "release": "Mon Mar 18 20:12:19 2019 -0700", "stop_reason": "Stopped because requested number of motifs (1) found.", "cmd": [ - "meme", "meme_input_1.fasta", "-o", "meme_test1_out", "-nostatus", - "-maxsize", "1000000" + "meme", + "-o", + "-nostatus", "-maxsize", "1000000" ], "options": { - "mod": "zoops", - "revcomp": false, - "nmotifs": 1, - "minw": 8, - "maxw": 50, - "minsites": 2, - "maxsites": 30, - "wnsites": 0.8, - "spmap": "pam", - "spfuzz": 120, - "maxwords": -1, - "prior": "megap", - "b": 7500, - "maxiter": 50, - "distance": 1e-05, - "wg": 11, - "ws": 1, - "noendgaps": false, - "substring": true - }, - "alphabet": { - "name": "Protein", - "like": "protein", - "ncore": 20, - "symbols": [ - { - "symbol": "A", - "name": "Alanine", - "colour": "0000CC" - }, { - "symbol": "C", - "name": "Cysteine", - "colour": "0000CC" - }, { - "symbol": "D", - "name": "Aspartic acid", - "colour": "FF00FF" - }, { - "symbol": "E", - "name": "Glutamic acid", - "colour": "FF00FF" - }, { - "symbol": "F", - "name": "Phenylalanine", - "colour": "0000CC" - }, { - "symbol": "G", - "name": "Glycine", - "colour": "FFB300" - }, { - "symbol": "H", - "name": "Histidine", - "colour": "FFCCCC" - }, { - "symbol": "I", - "name": "Isoleucine", - "colour": "0000CC" - }, { - "symbol": "K", - "name": "Lysine", - "colour": "CC0000" - }, { - "symbol": "L", - "name": "Leucine", - "colour": "0000CC" - }, { - "symbol": "M", - "name": "Methionine", - "colour": "0000CC" - }, { - "symbol": "N", - "name": "Asparagine", - "colour": "008000" - }, { - "symbol": "P", - "name": "Proline", - "colour": "FFFF00" - }, { - "symbol": "Q", - "name": "Glutamine", - "colour": "008000" - }, { - "symbol": "R", - "name": "Arginine", - "colour": "CC0000" - }, { - "symbol": "S", - "name": "Serine", - "colour": "008000" - }, { - "symbol": "T", - "name": "Threonine", - "colour": "008000" - }, { - "symbol": "V", - "name": "Valine", - "colour": "0000CC" - }, { - "symbol": "W", - "name": "Tryptophan", - "colour": "0000CC" - }, { - "symbol": "Y", - "name": "Tyrosine", - "colour": "33E6CC" - }, { - "symbol": "X", - "aliases": "*.", - "name": "Any amino acid", - "equals": "ACDEFGHIKLMNPQRSTVWY" - }, { - "symbol": "B", - "name": "Asparagine or Aspartic acid", - "equals": "DN" - }, { - "symbol": "Z", - "name": "Glutamine or Glutamic acid", - "equals": "EQ" - }, { - "symbol": "J", - "name": "Leucine or Isoleucine", - "equals": "IL" - } - ] - }, - "background": { - "freqs": [ - 0.291, 0.229, 0.001, 0.001, 0.001, 0.255, 0.001, 0.001, 0.001, - 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.215, 0.001, - 0.001, 0.001 - ] - }, - "sequence_db": { - "source": "meme_input_1.fasta", - "psp_source": "prior30.plib", - "freqs": [ - 0.294, 0.231, 0.000, 0.000, 0.000, 0.257, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.217, 0.000, - 0.000, 0.000 - ], - "sequences": [ - { - "name": "chr21_19617074_19617124_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_26934381_26934431_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_28217753_28217803_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31710037_31710087_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31744582_31744632_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31768316_31768366_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31914206_31914256_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31933633_31933683_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31962741_31962791_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31964683_31964733_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31973364_31973414_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31992870_31992920_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_32185595_32185645_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_32202076_32202126_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_32253899_32253949_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_32410820_32410870_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_36411748_36411798_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_37838750_37838800_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_45705687_45705737_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_45971413_45971463_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_45978668_45978718_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_45993530_45993580_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_46020421_46020471_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_46031920_46031970_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_46046964_46047014_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_46057197_46057247_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_46086869_46086919_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_46102103_46102153_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_47517957_47518007_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_47575506_47575556_-", - "length": 50, - "weight": 1.000000 - } - ] }, "motifs": [ - { - "db": 0, - "id": "GGGGTATAAAA", - "alt": "MEME-1", - "len": 11, - "nsites": 25, - "evalue": "2.4e-011", - "ic": 40.0, - "re": 13.8, - "llr": 239, - "bt": 5.33554, - "time": 0.772000, - "psm": [ - [ - -32, -680, 91, 77, 7, 138, -20, 55, 64, 107, 11, 150, 142, 72, - 87, 396, -148, 221, -140, -36 - ], [ - -11, -680, 89, 76, 7, 137, -21, 55, 63, 107, 10, 149, 141, 71, - 87, 396, -239, 220, -140, -36 - ], [ - -79, 41, 4, 21, -7, 44, -62, 42, -5, 99, 0, 99, 138, 52, 42, - 399, -46, 223, -173, -68 - ], [ - 11, -677, 48, 47, -2, 127, -43, 46, 27, 101, 3, 124, 138, 60, - 62, 397, -235, 220, -160, -55 - ], [ - -596, -820, 12, -21, -53, -267, -74, 37, 16, 44, -37, 98, 31, - 9, 19, 319, 212, 127, -193, -95 - ], [ - 165, -261, 70, 110, 77, -521, -4, 147, 95, 201, 90, 121, 124, - 91, 107, 425, -527, 314, -95, 8 - ], [ - -838, -990, -89, -149, -151, -841, -161, -117, -113, -66, - -209, -68, -69, -129, -91, 111, 221, -55, -255, -173 - ], [ - 176, -858, -79, -103, -115, -717, -148, -95, -108, -17, -162, - -61, -12, -95, -69, 193, -737, 52, -240, -153 - ], [ - 134, -686, 0, 16, -12, -553, -68, 44, -8, 96, -9, 88, 124, 41, - 36, 384, 11, 216, -177, -71 - ], [ - 165, -261, 70, 110, 77, -521, -4, 147, 95, 201, 90, 121, 124, - 91, 107, 425, -527, 314, -95, 8 - ], [ - 147, -614, 89, 129, 93, -121, 12, 160, 113, 217, 108, 144, - 144, 111, 125, 447, -241, 332, -81, 22 - ] - ], - "pwm": [ - [ - 0.240000, 0.000000, 0.000000, 0.000000, 0.000000, 0.680000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.080000, 0.000000, - 0.000000, 0.000000 - ], [ - 0.280000, 0.000000, 0.000000, 0.000000, 0.000000, 0.680000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.040000, 0.000000, - 0.000000, 0.000000 - ], [ - 0.160000, 0.320000, 0.000000, 0.000000, 0.000000, 0.360000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.160000, 0.000000, - 0.000000, 0.000000 - ], [ - 0.320000, 0.000000, 0.000000, 0.000000, 0.000000, 0.640000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.040000, 0.000000, - 0.000000, 0.000000 - ], [ - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.040000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.960000, 0.000000, - 0.000000, 0.000000 - ], [ - 0.960000, 0.040000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000 - ], [ - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 0.000000 - ], [ - 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000 - ], [ - 0.760000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.240000, 0.000000, - 0.000000, 0.000000 - ], [ - 0.960000, 0.040000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000 - ], [ - 0.840000, 0.000000, 0.000000, 0.000000, 0.000000, 0.120000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.040000, 0.000000, - 0.000000, 0.000000 - ] - ], - "sites": [ - { - "seq": 24, - "pos": 12, - "rc": false, - "pvalue": 1.06e-06, - "lflank": "AAGGCCAGGA", - "match": "GGGGTATAAAA", - "rflank": "GCCTGAGAGC" - }, { - "seq": 25, - "pos": 36, - "rc": false, - "pvalue": 3.41e-06, - "lflank": "ACAGGCCCTG", - "match": "GGCATATAAAA", - "rflank": "GCC" - }, { - "seq": 19, - "pos": 9, - "rc": false, - "pvalue": 3.41e-06, - "lflank": "CAGGCCCTG", - "match": "GGCATATAAAA", - "rflank": "GCCCCAGCAG" - }, { - "seq": 9, - "pos": 13, - "rc": false, - "pvalue": 3.41e-06, - "lflank": "GATTCACTGA", - "match": "GGCATATAAAA", - "rflank": "GGCCCTCTGC" - }, { - "seq": 21, - "pos": 7, - "rc": false, - "pvalue": 4.00e-06, - "lflank": "CCAAGGA", - "match": "GGAGTATAAAA", - "rflank": "GCCCCACAAA" - }, { - "seq": 13, - "pos": 13, - "rc": false, - "pvalue": 5.01e-06, - "lflank": "CCACCAGCTT", - "match": "GAGGTATAAAA", - "rflank": "AGCCCTGTAC" - }, { - "seq": 23, - "pos": 15, - "rc": false, - "pvalue": 6.06e-06, - "lflank": "ATACCCAGGG", - "match": "AGGGTATAAAA", - "rflank": "CCTCAGCAGC" - }, { - "seq": 15, - "pos": 21, - "rc": false, - "pvalue": 8.67e-06, - "lflank": "AATCACTGAG", - "match": "GATGTATAAAA", - "rflank": "GTCCCAGGGA" - }, { - "seq": 12, - "pos": 18, - "rc": false, - "pvalue": 8.67e-06, - "lflank": "CACCAGAGCT", - "match": "GGGATATATAA", - "rflank": "AGAAGGTTCT" - }, { - "seq": 11, - "pos": 16, - "rc": false, - "pvalue": 8.67e-06, - "lflank": "CACTATTGAA", - "match": "GATGTATAAAA", - "rflank": "TTTCATTTGC" - }, { - "seq": 22, - "pos": 2, - "rc": false, - "pvalue": 1.21e-05, - "lflank": "GA", - "match": "GACATATAAAA", - "rflank": "GCCAACATCC" - }, { - "seq": 28, - "pos": 32, - "rc": false, - "pvalue": 1.59e-05, - "lflank": "CCGGCGGGGC", - "match": "GGGGTATAAAG", - "rflank": "GGGGCGG" - }, { - "seq": 20, - "pos": 4, - "rc": false, - "pvalue": 1.59e-05, - "lflank": "CAGA", - "match": "GGGGTATAAAG", - "rflank": "GTTCCGACCA" - }, { - "seq": 6, - "pos": 15, - "rc": false, - "pvalue": 1.68e-05, - "lflank": "CCCACTACTT", - "match": "AGAGTATAAAA", - "rflank": "TCATTCTGAG" - }, { - "seq": 14, - "pos": 19, - "rc": false, - "pvalue": 2.03e-05, - "lflank": "CACCAGCAAG", - "match": "GATATATAAAA", - "rflank": "GCTCAGGAGT" - }, { - "seq": 4, - "pos": 12, - "rc": false, - "pvalue": 3.06e-05, - "lflank": "CAGGTCTAAG", - "match": "AGCATATATAA", - "rflank": "CTTGGAGTCC" - }, { - "seq": 0, - "pos": 39, - "rc": false, - "pvalue": 3.06e-05, - "lflank": "CCTCGGGACG", - "match": "TGGGTATATAA", - "rflank": "" - }, { - "seq": 18, - "pos": 37, - "rc": false, - "pvalue": 3.82e-05, - "lflank": "CGTGGTCGCG", - "match": "GGGGTATAACA", - "rflank": "GC" - }, { - "seq": 5, - "pos": 0, - "rc": false, - "pvalue": 3.82e-05, - "lflank": "", - "match": "AACGTATATAA", - "rflank": "ATGGTCCTGT" - }, { - "seq": 29, - "pos": 30, - "rc": false, - "pvalue": 4.02e-05, - "lflank": "GCTGCCGGTG", - "match": "AGCGTATAAAG", - "rflank": "GCCCTGGCG" - }, { - "seq": 1, - "pos": 27, - "rc": false, - "pvalue": 5.52e-05, - "lflank": "AGTCACAAGT", - "match": "GAGTTATAAAA", - "rflank": "GGGTCGCACG" - }, { - "seq": 3, - "pos": 14, - "rc": false, - "pvalue": 5.94e-05, - "lflank": "CCCAGGTTTC", - "match": "TGAGTATATAA", - "rflank": "TCGCCGCACC" - }, { - "seq": 16, - "pos": 22, - "rc": false, - "pvalue": 6.78e-05, - "lflank": "AGTTTCAGTT", - "match": "GGCATCTAAAA", - "rflank": "attatataac" - }, { - "seq": 7, - "pos": 2, - "rc": false, - "pvalue": 2.08e-04, - "lflank": "TC", - "match": "AGAGTATATAT", - "rflank": "AAATGTTCCT" - }, { - "seq": 8, - "pos": 13, - "rc": false, - "pvalue": 4.05e-04, - "lflank": "TATAACTCAG", - "match": "GTTGGATAAAA", - "rflank": "TAATTTGTAC" - } - ] - } - ], "scan": [ - { - "pvalue": 1.22e-03, - "sites": [ - { - "motif": 0, - "pos": 39, - "rc": false, - "pvalue": 3.06e-05 - } - ] - }, { - "pvalue": 2.21e-03, - "sites": [ - { - "motif": 0, - "pos": 27, - "rc": false, - "pvalue": 5.52e-05 - } - ] - }, { - "pvalue": 7.29e-01, - "sites": [] - }, { - "pvalue": 2.37e-03, - "sites": [ - { - "motif": 0, - "pos": 14, - "rc": false, - "pvalue": 5.94e-05 - } - ] - }, { - "pvalue": 1.22e-03, - "sites": [ - { - "motif": 0, - "pos": 12, - "rc": false, - "pvalue": 3.06e-05 - } - ] - }, { - "pvalue": 1.53e-03, - "sites": [ - { - "motif": 0, - "pos": 0, - "rc": false, - "pvalue": 3.82e-05 - } - ] - }, { - "pvalue": 6.70e-04, - "sites": [ - { - "motif": 0, - "pos": 15, - "rc": false, - "pvalue": 1.68e-05 - } - ] - }, { - "pvalue": 1.81e-03, - "sites": [ - { - "motif": 0, - "pos": 4, - "rc": false, - "pvalue": 4.54e-05 - } - ] - }, { - "pvalue": 1.61e-02, - "sites": [] - }, { - "pvalue": 1.36e-04, - "sites": [ - { - "motif": 0, - "pos": 13, - "rc": false, - "pvalue": 3.41e-06 - } - ] - }, { - "pvalue": 1.99e-01, - "sites": [] - }, { - "pvalue": 3.47e-04, - "sites": [ - { - "motif": 0, - "pos": 16, - "rc": false, - "pvalue": 8.67e-06 - } - ] - }, { - "pvalue": 3.47e-04, - "sites": [ - { - "motif": 0, - "pos": 18, - "rc": false, - "pvalue": 8.67e-06 - } - ] - }, { - "pvalue": 2.01e-04, - "sites": [ - { - "motif": 0, - "pos": 13, - "rc": false, - "pvalue": 5.01e-06 - } - ] - }, { - "pvalue": 8.11e-04, - "sites": [ - { - "motif": 0, - "pos": 19, - "rc": false, - "pvalue": 2.03e-05 - } - ] - }, { - "pvalue": 3.47e-04, - "sites": [ - { - "motif": 0, - "pos": 21, - "rc": false, - "pvalue": 8.67e-06 - } - ] - }, { - "pvalue": 2.71e-03, - "sites": [ - { - "motif": 0, - "pos": 22, - "rc": false, - "pvalue": 6.78e-05 - } - ] - }, { - "pvalue": 8.23e-02, - "sites": [] - }, { - "pvalue": 1.53e-03, - "sites": [ - { - "motif": 0, - "pos": 37, - "rc": false, - "pvalue": 3.82e-05 - } - ] - }, { - "pvalue": 1.36e-04, - "sites": [ - { - "motif": 0, - "pos": 9, - "rc": false, - "pvalue": 3.41e-06 - } - ] - }, { - "pvalue": 6.37e-04, - "sites": [ - { - "motif": 0, - "pos": 4, - "rc": false, - "pvalue": 1.59e-05 - } - ] - }, { - "pvalue": 1.60e-04, - "sites": [ - { - "motif": 0, - "pos": 7, - "rc": false, - "pvalue": 4.00e-06 - } - ] - }, { - "pvalue": 4.83e-04, - "sites": [ - { - "motif": 0, - "pos": 2, - "rc": false, - "pvalue": 1.21e-05 - } - ] - }, { - "pvalue": 2.43e-04, - "sites": [ - { - "motif": 0, - "pos": 15, - "rc": false, - "pvalue": 6.06e-06 - } - ] - }, { - "pvalue": 4.26e-05, - "sites": [ - { - "motif": 0, - "pos": 12, - "rc": false, - "pvalue": 1.06e-06 - } - ] - }, { - "pvalue": 1.36e-04, - "sites": [ - { - "motif": 0, - "pos": 36, - "rc": false, - "pvalue": 3.41e-06 - } - ] - }, { - "pvalue": 4.30e-02, - "sites": [] - }, { - "pvalue": 4.30e-02, - "sites": [] - }, { - "pvalue": 6.37e-04, - "sites": [ - { - "motif": 0, - "pos": 32, - "rc": false, - "pvalue": 1.59e-05 - } - ] - }, { - "pvalue": 1.61e-03, - "sites": [ - { - "motif": 0, - "pos": 30, - "rc": false, - "pvalue": 4.02e-05 - } - ] - } - ] - }; </script> - <script> var site_url = "http://meme-suite.org"; -</script> - <script> - -/* - * $ - * - * Shorthand function for getElementById - */ -function $(el) { - return document.getElementById(el); -} - - -/* - * See http://stackoverflow.com/a/5450113/66387 - * Does string multiplication like the perl x operator. - */ -function string_mult(pattern, count) { - if (count < 1) return ''; - var result = ''; - while (count > 1) { - if (count & 1) result += pattern; - count >>= 1, pattern += pattern; - } - return result + pattern; -} - -/* - * See http://stackoverflow.com/questions/814613/how-to-read-get-data-from-a-url-using-javascript - * Slightly modified with information from - * https://developer.mozilla.org/en/DOM/window.location - */ -function parse_params() { - "use strict"; - var search, queryStart, queryEnd, query, params, nvPairs, i, nv, n, v; - search = window.location.search; - queryStart = search.indexOf("?") + 1; - queryEnd = search.indexOf("#") + 1 || search.length + 1; - query = search.slice(queryStart, queryEnd - 1); - - if (query === search || query === "") return {}; - - params = {}; - nvPairs = query.replace(/\+/g, " ").split("&"); - - for (i = 0; i < nvPairs.length; i++) { - nv = nvPairs[i].split("="); - n = decodeURIComponent(nv[0]); - v = decodeURIComponent(nv[1]); - // allow a name to be used multiple times - // storing each value in the array - if (!(n in params)) { - params[n] = []; - } - params[n].push(nv.length === 2 ? v : null); - } - return params; -} - -/* - * coords - * - * Calculates the x and y offset of an element. - * From http://www.quirksmode.org/js/findpos.html - * with alterations to take into account scrolling regions - */ -function coords(elem) { - var myX = myY = 0; - if (elem.getBoundingClientRect) { - var rect; - rect = elem.getBoundingClientRect(); - myX = rect.left + ((typeof window.pageXOffset !== "undefined") ? - window.pageXOffset : document.body.scrollLeft); - myY = rect.top + ((typeof window.pageYOffset !== "undefined") ? - window.pageYOffset : document.body.scrollTop); - } else { - // this fall back doesn't properly handle absolutely positioned elements - // inside a scrollable box - var node; - if (elem.offsetParent) { - // subtract all scrolling - node = elem; - do { - myX -= node.scrollLeft ? node.scrollLeft : 0; - myY -= node.scrollTop ? node.scrollTop : 0; - } while (node = node.parentNode); - // this will include the page scrolling (which is unwanted) so add it back on - myX += (typeof window.pageXOffset !== "undefined") ? window.pageXOffset : document.body.scrollLeft; - myY += (typeof window.pageYOffset !== "undefined") ? window.pageYOffset : document.body.scrollTop; - // sum up offsets - node = elem; - do { - myX += node.offsetLeft; - myY += node.offsetTop; - } while (node = node.offsetParent); - } - } - return [myX, myY]; -} - -/* - * position_popup - * - * Positions a popup relative to an anchor element. - * - * The avaliable positions are: - * 0 - Centered below the anchor. - */ -function position_popup(anchor, popup, position) { - "use strict"; - var a_x, a_y, a_w, a_h, p_x, p_y, p_w, p_h; - var a_xy, spacer, margin, scrollbar, page_w; - // define constants - spacer = 5; - margin = 15; - scrollbar = 15; - // define the positions and widths - a_xy = coords(anchor); - a_x = a_xy[0]; - a_y = a_xy[1]; - a_w = anchor.offsetWidth; - a_h = anchor.offsetHeight; - p_w = popup.offsetWidth; - p_h = popup.offsetHeight; - page_w = null; - if (window.innerWidth) { - page_w = window.innerWidth; - } else if (document.body) { - page_w = document.body.clientWidth; - } - // check the position type is defined - if (typeof position !== "number") { - position = 0; - } - // calculate the popup position - switch (position) { - case 1: - p_x = a_x + a_w + spacer; - p_y = a_y + (a_h / 2) - (p_h / 2); - break; - case 0: - default: - p_x = a_x + (a_w / 2) - (p_w / 2); - p_y = a_y + a_h + spacer; - break; - } - // constrain the popup position - if (p_x < margin) { - p_x = margin; - } else if (page_w != null && (p_x + p_w) > (page_w - margin - scrollbar)) { - p_x = page_w - margin - scrollbar - p_w; - } - if (p_y < margin) { - p_y = margin; - } - // position the popup - popup.style.left = p_x + "px"; - popup.style.top = p_y + "px"; -} - -function lookup_help_popup(popup_id) { - var _body, pop, info; - pop = document.getElementById(popup_id); - if (pop == null) { - _body = document.getElementsByTagName("body")[0]; - pop = document.createElement("div"); - pop.className = "pop_content"; - pop.id = popup_id; - pop.style.backgroundColor = "#FFC"; - pop.style.borderColor = "black"; - info = document.createElement("p"); - info.style.fontWeight = "bold"; - info.appendChild(document.createTextNode("Error: No popup for topic \"" + popup_id + "\".")); - pop.appendChild(info); - // this might cause problems with the menu, but as this only happens - // when something is already wrong I don't think that's too much of a problem - _body.insertBefore(pop, _body.firstChild); - } - if (document.getElementsByTagName('body')[0].hasAttribute("data-autobtns")) { - if (!/\bauto_buttons\b/.test(pop.className)) { - pop.className += " auto_buttons"; - var back_btn_sec = document.createElement("div"); - back_btn_sec.className = "nested_only pop_back_sec"; - var back_btn = document.createElement("span"); - back_btn.className = "pop_back"; - back_btn.appendChild(document.createTextNode("<< back")); - back_btn.addEventListener("click", function(e) { - help_return(); - }, false); - back_btn_sec.appendChild(back_btn); - pop.insertBefore(back_btn_sec, pop.firstChild); - var close_btn_sec = document.createElement("div"); - close_btn_sec.className = "pop_close_sec"; - var close_btn = document.createElement("span"); - close_btn.className = "pop_close"; - close_btn.appendChild(document.createTextNode("close")); - close_btn.addEventListener("click", function(e) { - help_popup(); - }, false); - close_btn_sec.appendChild(close_btn); - pop.appendChild(close_btn_sec); - } - } - return pop; -} - -/* - * help_popup - * - * Moves around help pop-ups so they appear - * below an activator. - */ -function help_popup(activator, popup_id) { - "use strict"; - var pop; - // set default values - if (typeof help_popup.popup === "undefined") { - help_popup.popup = []; - } - if (typeof help_popup.activator === "undefined") { - help_popup.activator = null; - } - var last_pop = (help_popup.popup.length > 0 ? help_popup.popup[help_popup.popup.length - 1] : null); - if (typeof(activator) == "undefined") { // no activator so hide - if (last_pop != null) { - last_pop.style.display = 'none'; - help_popup.popup = []; - } - return; - } - pop = lookup_help_popup(popup_id); - if (pop == last_pop) { - if (activator == help_popup.activator) { - //hide popup (as we've already shown it for the current help button) - last_pop.style.display = 'none'; - help_popup.popup = []; - return; // toggling complete! - } - } else if (last_pop != null) { - //activating different popup so hide current one - last_pop.style.display = 'none'; - } - help_popup.popup = [pop]; - help_popup.activator = activator; - toggle_class(pop, "nested", false); - //must make the popup visible to measure it or it has zero width - pop.style.display = 'block'; - position_popup(activator, pop); -} - -/* - * help_refine - * - * Intended for links within a help popup. Stores a stack of state so - * you can go back. - */ -function help_refine(popup_id) { - if (help_popup.popup == null || help_popup.popup.length == 0 || help_popup.activator == null) { - throw new Error("Can not refine a help popup when one is not shown!"); - } - var pop = lookup_help_popup(popup_id); - var last_pop = help_popup.popup[help_popup.popup.length - 1]; - if (pop == last_pop) return; // slightly odd, but no real cause for alarm - help_popup.popup.push(pop); - toggle_class(pop, "nested", true); - last_pop.style.display = "none"; - //must make the popup visible to measure it or it has zero width - pop.style.display = "block"; - position_popup(help_popup.activator, pop); -} - -/* - * help_return - * - * Intended for links within a help popup. Stores a stack of state so - * you can go back. - */ -function help_return() { - if (help_popup.popup == null || help_popup.popup.length == 0 || help_popup.activator == null) { - throw new Error("Can not return to a earlier help popup when one is not shown!"); - } - var last_pop = help_popup.popup.pop(); - last_pop.style.display = "none"; - var pop = (help_popup.popup.length > 0 ? help_popup.popup[help_popup.popup.length - 1] : null); - if (pop != null) { - toggle_class(pop, "nested", help_popup.popup.length > 1); - pop.style.display = "block"; - position_popup(help_popup.activator, pop); - } else { - help_popup.activator = null; - } -} - -/* - * update_scroll_pad - * - * Creates padding at the bottom of the page to allow - * scrolling of anything into view. - */ -function update_scroll_pad() { - var page, pad; - page = (document.compatMode === "CSS1Compat") ? document.documentElement : document.body; - pad = $("scrollpad"); - if (pad === null) { - pad = document.createElement("div"); - pad.id = 'scrollpad'; - document.getElementsByTagName('body')[0].appendChild(pad); - } - pad.style.height = Math.abs(page.clientHeight - 100) + "px"; -} - -function substitute_classes(node, remove, add) { - "use strict"; - var list, all, i, cls, classes; - list = node.className.split(/\s+/); - all = {}; - for (i = 0; i < list.length; i++) { - if (list[i].length > 0) all[list[i]] = true; - } - for (i = 0; i < remove.length; i++) { - if (all.hasOwnProperty(remove[i])) { - delete all[remove[i]]; - } - } - for (i = 0; i < add.length; i++) { - all[add[i]] = true; - } - classes = ""; - for (cls in all) { - classes += cls + " "; - } - node.className = classes; -} - -/* - * toggle_class - * - * Adds or removes a class from the node. If the parameter 'enabled' is not - * passed then the existence of the class will be toggled, otherwise it will be - * included if enabled is true. - */ -function toggle_class(node, cls, enabled) { - var classes = node.className; - var list = classes.replace(/^\s+/, '').replace(/\s+$/, '').split(/\s+/); - var found = false; - for (var i = 0; i < list.length; i++) { - if (list[i] == cls) { - list.splice(i, 1); - i--; - found = true; - } - } - if (typeof enabled == "undefined") { - if (!found) list.push(cls); - } else { - if (enabled) list.push(cls); - } - node.className = list.join(" "); -} - -/* - * find_child - * - * Searches child nodes in depth first order and returns the first it finds - * with the className specified. - * TODO replace with querySelector - */ -function find_child(node, className) { - var pattern; - if (node == null || typeof node !== "object") { - return null; - } - if (typeof className === "string") { - pattern = new RegExp("\\b" + className + "\\b"); - } else { - pattern = className; - } - if (node.nodeType == Node.ELEMENT_NODE && - pattern.test(node.className)) { - return node; - } else { - var result = null; - for (var i = 0; i < node.childNodes.length; i++) { - result = find_child(node.childNodes[i], pattern); - if (result != null) break; - } - return result; - } -} - -/* - * find_parent - * - * Searches parent nodes outwards from the node and returns the first it finds - * with the className specified. - */ -function find_parent(node, className) { - var pattern; - pattern = new RegExp("\\b" + className + "\\b"); - do { - if (node.nodeType == Node.ELEMENT_NODE && - pattern.test(node.className)) { - return node; - } - } while (node = node.parentNode); - return null; -} - -/* - * find_parent_tag - * - * Searches parent nodes outwards from the node and returns the first it finds - * with the tag name specified. HTML tags should be specified in upper case. - */ -function find_parent_tag(node, tag_name) { - do { - if (node.nodeType == Node.ELEMENT_NODE && node.tagName == tag_name) { - return node; - } - } while (node = node.parentNode); - return null; -} - -/* - * __toggle_help - * - * Uses the 'topic' property of the this object to - * toggle display of a help topic. - * - * This function is not intended to be called directly. - */ -function __toggle_help(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - - help_popup(this, this.getAttribute("data-topic")); -} - -function setup_help_button(button) { - "use strict"; - var topic; - if (button.hasAttribute("data-topic")) { - topic = button.getAttribute("data-topic"); - if (document.getElementById(topic) != null) { - button.tabIndex = "0"; // make keyboard selectable - button.addEventListener("click", function() { - help_popup(button, topic); - }, false); - button.addEventListener("keydown", function(e) { - // toggle only on Enter or Spacebar, let other keys do their thing - if (e.keyCode !== 13 && e.keyCode !== 32) return; - // stop a submit or something like that - e.preventDefault(); - help_popup(button, topic); - }, false); - } else { - button.style.visibility = "hidden"; - } - } - button.className += " active"; -} - -/* - * help_button - * - * Makes a help button for the passed topic. - */ -function help_button(topic) { - var btn = document.createElement("div"); - btn.className = "help"; - btn.setAttribute("data-topic", topic); - setup_help_button(btn); - return btn; -} - -/* - * prepare_download - * - * Sets the attributes of a link to setup a file download using the given content. - * If no link is provided then create one and click it. - */ -function prepare_download(content, mimetype, filename, link) { - "use strict"; - // if no link is provided then create one and click it - var click_link = false; - if (!link) { - link = document.createElement("a"); - click_link = true; - } - try { - // Use a BLOB to convert the text into a data URL. - // We could do this manually with a base 64 conversion. - // This will only be supported on modern browsers, - // hence the try block. - var blob = new Blob([content], {type: mimetype}); - var reader = new FileReader(); - reader.onloadend = function() { - // If we're lucky the browser will also support the download - // attribute which will let us suggest a file name to save the link. - // Otherwise it is likely that the filename will be unintelligible. - link.setAttribute("download", filename); - link.href = reader.result; - if (click_link) { - // must add the link to click it - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } - } - reader.readAsDataURL(blob); - } catch (error) { - if (console && console.log) console.log(error); - // probably an old browser - link.href = ""; - link.visible = false; - } -} - -/* - * add_cell - * - * Add a cell to the table row. - */ -function add_cell(row, node, cls, click_action) { - var cell = row.insertCell(row.cells.length); - if (node) cell.appendChild(node); - if (cls && cls !== "") cell.className = cls; - if (click_action) cell.addEventListener("click", click_action, false); -} - -/* - * add_header_cell - * - * Add a header cell to the table row. - */ -function add_header_cell(row, node, help_topic, cls, colspan) { - var th = document.createElement("th"); - if (node) th.appendChild(node); - if (help_topic && help_topic !== "") th.appendChild(help_button(help_topic)); - if (cls && cls !== "") th.className = cls; - if (typeof colspan == "number" && colspan > 1) th.colSpan = colspan; - row.appendChild(th); -} - -/* - * add_text_cell - * - * Add a text cell to the table row. - */ -function add_text_cell(row, text, cls, action) { - var node = null; - if (typeof(text) != 'undefined') node = document.createTextNode(text); - add_cell(row, node, cls, action); -} - -/* - * add_text_header_cell - * - * Add a text header cell to the table row. - */ -function add_text_header_cell(row, text, help_topic, cls, action, colspan) { - var node = null; - if (typeof(text) != 'undefined') { - var nbsp = (help_topic ? "\u00A0" : ""); - var str = "" + text; - var parts = str.split(/\n/); - if (parts.length === 1) { - if (action) { - node = document.createElement("span"); - node.appendChild(document.createTextNode(str + nbsp)); - } else { - node = document.createTextNode(str + nbsp); - } - } else { - node = document.createElement("span"); - for (var i = 0; i < parts.length; i++) { - if (i !== 0) { - node.appendChild(document.createElement("br")); - } - node.appendChild(document.createTextNode(parts[i])); - } - } - if (action) { - node.addEventListener("click", action, false); - node.style.cursor = "pointer"; - } - } - add_header_cell(row, node, help_topic, cls, colspan); -} - -function setup_help() { - "use strict"; - var help_buttons, i; - help_buttons = document.querySelectorAll(".help:not(.active)"); - for (i = 0; i < help_buttons.length; i++) { - setup_help_button(help_buttons[i]); - } -} - -function setup_scrollpad() { - "use strict"; - if (document.getElementsByTagName('body')[0].hasAttribute("data-scrollpad") && document.getElementById("scrollpad") == null) { - window.addEventListener("resize", update_scroll_pad, false); - update_scroll_pad(); - } -} - -// anon function to avoid polluting global scope -(function() { - "use strict"; - window.addEventListener("load", function load(evt) { - window.removeEventListener("load", load, false); - setup_help(); - setup_scrollpad(); - }, false); -})(); - -/* - * make_link - * - * Creates a text node and if a URL is specified it surrounds it with a link. - * If the URL doesn't begin with "http://" it automatically adds it, as - * relative links don't make much sense in this context. - */ -function make_link(text, url) { - var textNode = null; - var link = null; - if (typeof text !== "undefined" && text !== null) textNode = document.createTextNode(text); - if (typeof url === "string") { - if (url.indexOf("//") == -1) { - url = "http://" + url; - } - link = document.createElement('a'); - link.href = url; - if (textNode) link.appendChild(textNode); - return link; - } - return textNode; -} -</script> - <script> - // - // return true if any part of the passed element is visible in the viewport - // - function element_in_viewport(elem) { - var rect; - try { - rect = elem.getBoundingClientRect(); - } catch (e) { - return false; - } - return ( - rect.top < (window.innerHeight || document.body.clientHeight) && - rect.bottom > 0 && - rect.left < (window.innerWidth || document.body.clientWidth) && - rect.right > 0 - ); - } - - // - // Functions to delay a drawing task until it is required or it would not lag the display to do so - // - - // a list of items still to be drawn - var drawable_list = []; - // the delay between drawing objects that are not currently visible - var draw_delay = 1; - // the delay after a user interaction - var user_delay = 300; - // the delay after a user has stopped scrolling and is viewing the stuff drawn on the current page - var stop_delay = 300; - // the timer handle; allows resetting of the timer after user interactions - var draw_timer = null; - - // - // Drawable - // - // elem - a page element which defines the position on the page that drawing is to be done - // task - an object with the method run which takes care of painting the object - // - var Drawable = function(elem, task) { - this.elem = elem; - this.task = task; - } - - // - // Drawable.is_visible - // - // Determines if the element is visible in the viewport - // - Drawable.prototype.is_visible = function() { - return element_in_viewport(this.elem); - } - - // - // Drawable.run - // - // Run the task held by the drawable - Drawable.prototype.run = function() { - if (this.task) this.task.run(); - this.task = null; - } - - // - // Drawable.run - // - // Run the task iff visible - // returns true if the task ran or has already run - Drawable.prototype.run_visible = function() { - if (this.task) { - if (element_in_viewport(this.elem)) { - this.task.run(); - this.task = null; - return true; - } - return false; - } else { - return true; - } - } - - // - // draw_on_screen - // - // Checks each drawable object and draws those on screen. - // - function draw_on_screen() { - var found = false; - for (var i = 0; i < drawable_list.length; i++) { - if (drawable_list[i].run_visible()) { - drawable_list.splice(i--, 1); - found = true; - } - } - return found; - } - - // - // process_draw_tasks - // - // Called on a delay to process the next avaliable - // draw task. - // - function process_draw_tasks() { - var delay = draw_delay; - draw_timer = null; - if (drawable_list.length == 0) return; //no more tasks - if (draw_on_screen()) { - delay = stop_delay; //give the user a chance to scroll - } else { - //get next task - var drawable = drawable_list.shift(); - drawable.task.run(); - } - //allow UI updates between tasks - draw_timer = window.setTimeout("process_draw_tasks()", delay); - } - - // - // delayed_process_draw_tasks - // - // Call process_draw_tasks after a short delay. - // The delay serves to group multiple redundant events. - // Should be set as event handler for onscroll and onresize. - // - function delayed_process_draw_tasks() { - //reset the timer - if (drawable_list.length > 0) { - if (draw_timer != null) clearTimeout(draw_timer); - draw_timer = window.setTimeout("process_draw_tasks()", user_delay); - } - } - - // - // add_draw_task - // - // Add a drawing task to be called immediately if it is - // visible, or to be called on a delay to reduce stuttering - // effect on the web browser. - function add_draw_task(elem, task) { - drawable = new Drawable(elem, task); - if (drawable.is_visible()) { - task.run(); - } else { - drawable_list.push(drawable); - //reset timer - if (draw_timer != null) clearTimeout(draw_timer); - draw_timer = window.setTimeout("process_draw_tasks()", user_delay); - } - } - -</script> - <script> -//====================================================================== -// start Alphabet object -//====================================================================== -var Alphabet = function(alphabet, background) { - "use strict"; - var i, j, sym, aliases, complement, comp_e_sym, ambigs, generate_background; - generate_background = (background == null); - if (generate_background) { - background = []; - for (i = 0; i < alphabet.ncore; i++) background[i] = 1.0 / alphabet.ncore; - } else if (alphabet.ncore != background.length) { - throw new Error("The background length does not match the alphabet length."); - } - this.name = alphabet.name; - this.like = (alphabet.like != null ? alphabet.like.toUpperCase() : null); - this.ncore = alphabet.ncore; - this.symbols = alphabet.symbols; - this.background = background; - this.genbg = generate_background; - this.encode = {}; - this.encode2core = {}; - this.complement = {}; - // check if all symbols are same case - var seen_uc = false; - var seen_lc = false; - var check_case = function (syms) { - var s, sym; - if (typeof syms === "string") { - for (s = 0; s < syms.length; s++) { - sym = syms.charAt(s); - if (sym >= 'a' && sym <= 'z') seen_lc = true; - else if (sym >= 'A' && sym <= 'Z') seen_uc = true; - } - } - }; - for (i = 0; i < this.symbols.length; i++) { - check_case(this.symbols[i].symbol); - check_case(this.symbols[i].aliases); - } - // now map symbols to indexes - var update_array = function(array, syms, index) { - var s, sym; - if (typeof syms === "string") { - for (s = 0; s < syms.length; s++) { - sym = syms.charAt(s); - array[sym] = index; - // when only a single case is used, then encode as case insensitive - if (seen_uc != seen_lc) { - if (sym >= 'a' && sym <= 'z') { - array[sym.toUpperCase()] = index; - } else if (sym >= 'A' && sym <= 'Z') { - array[sym.toLowerCase()] = index; - } - } - } - } - } - // map core symbols to index - for (i = 0; i < this.ncore; i++) { - update_array(this.encode2core, this.symbols[i].symbol, i); - update_array(this.encode, this.symbols[i].symbol, i); - update_array(this.encode2core, this.symbols[i].aliases, i); - update_array(this.encode, this.symbols[i].aliases, i); - } - // map ambigous symbols to index - ambigs = {}; - for (i = this.ncore; i < this.symbols.length; i++) { - update_array(this.encode, this.symbols[i].symbol, i); - update_array(this.encode, this.symbols[i].aliases, i); - ambigs[this.symbols[i].equals] = i; - } - // determine complements - for (i = 0; i < this.ncore; i++) { - complement = this.symbols[i].complement; - if (typeof complement === "string") { - this.complement[i] = this.encode2core[complement]; - } - } - next_symbol: - for (i = this.ncore; i < this.symbols.length; i++) { - complement = ""; - for (j = 0; j < this.symbols[i].equals.length; j++) { - comp_e_sym = this.complement[this.encode2core[this.symbols[i].equals.charAt(j)]]; - if (typeof comp_e_sym !== "number") continue next_symbol; - complement += this.symbols[comp_e_sym].symbol; - } - complement = complement.split("").sort().join(""); - if (typeof ambigs[complement] === "number") { - this.complement[i] = ambigs[complement]; - } - } - // determine case insensitivity - this.case_insensitive = true; - if (seen_uc == seen_lc) { - // when there is a mixture of cases it probably won't - // be case insensitive but we still need to check - loop: - for (i = 0; i < this.symbols.length; i++) { - sym = this.symbols[i].symbol; - if (sym >= 'A' && sym <= 'Z') { - if (this.encode[sym.toLowerCase()] != i) { - this.case_insensitive = false; - break loop; - } - } else if (sym >= 'a' && sym <= 'z') { - if (this.encode[sym.toUpperCase()] != i) { - this.case_insensitive = false; - break loop; - } - } - aliases = this.symbols[i].aliases; - if (aliases != null) { - for (j = 0; j < aliases.length; j++) { - sym = aliases.charAt(j); - if (sym >= 'A' && sym <= 'Z') { - if (this.encode[sym.toLowerCase()] != i) { - this.case_insensitive = false; - break loop; - } - } else if (sym >= 'a' && sym <= 'z') { - if (this.encode[sym.toUpperCase()] != i) { - this.case_insensitive = false; - break loop; - } - } - } - } - } - } - // normalise aliases to remove the prime symbol and eliminate - // the alternate cases when the alphabet is case insensitive - var seen, out; - for (i = 0; i < this.symbols.length; i++) { - sym = this.symbols[i].symbol; - aliases = this.symbols[i].aliases; - if (typeof aliases != "string") aliases = ""; - seen = {}; - out = []; - if (this.case_insensitive) { - sym = sym.toUpperCase(); - aliases = aliases.toUpperCase(); - } - seen[sym] = true; - for (j = 0; j < aliases.length; j++) { - if (!seen[aliases.charAt(j)]) { - seen[aliases.charAt(j)] = true; - out.push(aliases.charAt(j)); - } - } - this.symbols[i].aliases = out.sort().join(""); - } -}; -// return the name of the alphabet -Alphabet.prototype.get_alphabet_name = function() { - return this.name; -}; -// return if the alphabet can be complemented -Alphabet.prototype.has_complement = function() { - return (typeof this.symbols[0].complement === "string"); -}; -// return true if an uppercase letter has the same meaning as the lowercase form -Alphabet.prototype.is_case_insensitive = function() { - return this.case_insensitive; -}; -// return the information content of an alphabet letter -Alphabet.prototype.get_ic = function() { - return Math.log(this.ncore) / Math.LN2; -}; -// return the count of the core alphabet symbols -Alphabet.prototype.get_size_core = function() { - return this.ncore; -}; -// return the count of all alphabet symbols -Alphabet.prototype.get_size_full = function() { - return this.symbols.length; -}; -// return the symbol for the given alphabet index -Alphabet.prototype.get_symbol = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("Alphabet index out of bounds"); - } - return this.symbols[alph_index].symbol; -}; -// return the aliases for the given alphabet index -Alphabet.prototype.get_aliases = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("Alphabet index out of bounds"); - } - var sym_obj = this.symbols[alph_index]; - return (sym_obj.aliases != null ? sym_obj.aliases : ""); -}; -// return the name for the given alphabet index -Alphabet.prototype.get_name = function(alph_index) { - "use strict"; - var sym; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("Alphabet index out of bounds"); - } - sym = this.symbols[alph_index]; - return (typeof sym.name === "string" ? sym.name : sym.symbol); -}; -// return the alphabet it is like or null -Alphabet.prototype.get_like = function() { - "use strict"; - return this.like; -}; -// return the index of the complement for the given alphabet index -Alphabet.prototype.get_complement = function(alph_index) { - var comp_e_sym = this.complement[alph_index]; - if (typeof comp_e_sym === "number") { - return comp_e_sym; - } else { - return -1; - } -}; -// return a string containing the core symbols -Alphabet.prototype.get_symbols = function() { - "use strict"; - var i, core_symbols; - core_symbols = ""; - for (i = 0; i < this.ncore; i++) { - core_symbols += this.symbols[i].symbol; - } - return core_symbols; -}; -// return if the background was not a uniform generated background -Alphabet.prototype.has_bg = function() { - "use strict"; - return !this.genbg; -}; -// get the background frequency for the index -Alphabet.prototype.get_bg_freq = function(alph_index) { - "use strict"; - var freq, i, symbols; - if (alph_index >= 0) { - if (alph_index < this.ncore) { - return this.background[alph_index]; - } else if (alph_index < this.symbols.length) { - freq = 0; - symbols = this.symbols[alph_index].equals; - for (i = 0; i < symbols.length; i++) { - freq += this.background[this.encode2core[symbols.charAt(i)]]; - } - return freq; - } - } - throw new Error("The alphabet index is out of range."); -}; -// get the colour of the index -Alphabet.prototype.get_colour = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("BAD_ALPHABET_INDEX"); - } - if (typeof this.symbols[alph_index].colour != "string") { - return "black"; - } - return "#" + this.symbols[alph_index].colour; -}; -// get the rgb componets of the colour at the index -Alphabet.prototype.get_rgb = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("BAD_ALPHABET_INDEX"); - } - if (typeof this.symbols[alph_index].colour != "string") { - return {"red": 0, "green": 0, "blue": 0}; - } - var colour = this.symbols[alph_index].colour; - var red = parseInt(colour.substr(0, 2), 16) / 255; - var green = parseInt(colour.substr(2, 2), 16) / 255; - var blue = parseInt(colour.substr(4, 2), 16) / 255; - return {"red": red, "green": green, "blue": blue}; -}; -// convert a symbol into the index -Alphabet.prototype.get_index = function(letter) { - "use strict"; - var alph_index; - alph_index = this.encode[letter]; - if (typeof alph_index === "undefined") { - return -1; - } - return alph_index; -}; -// convert a symbol into the list of core indexes that it equals -Alphabet.prototype.get_indexes = function(letter) { - "use strict"; - var alph_index, comprise_str, i, comprise_list; - alph_index = this.encode[letter]; - if (typeof alph_index === "undefined") { - throw new Error("Unknown letter"); - } - comprise_str = this.symbols[alph_index].equals; - comprise_list = []; - if (typeof comprise_str == "string") { - for (i = 0; i < comprise_str.length; i++) { - comprise_list.push(this.encode2core[comprise_str.charAt(i)]); - } - } else { - comprise_list.push(alph_index); - } - return comprise_list; -}; -// check if a symbol is the primary way of representing the symbol in the alphabet -Alphabet.prototype.is_prime_symbol = function(letter) { - var alph_index; - alph_index = this.encode[letter]; - if (alph_index == null) return false; - if (this.is_case_insensitive()) { - return (this.symbols[alph_index].symbol.toUpperCase() == letter.toUpperCase()); - } else { - return (this.symbols[alph_index].symbol == letter); - } -}; -// compare 2 alphabets -Alphabet.prototype.equals = function(other) { - "use strict"; - var i, sym1, sym2; - // first check that it's actually an alphabet object - if (!(typeof other === "object" && other != null && other instanceof Alphabet)) { - return false; - } - // second shortcircuit if it's the same object - if (this === other) return true; - // compare - if (this.name !== other.name) return false; - if (this.ncore !== other.ncore) return false; - if (this.symbols.length !== other.symbols.length) return false; - for (i = 0; i < this.symbols.length; i++) { - sym1 = this.symbols[i]; - sym2 = other.symbols[i]; - if (sym1.symbol !== sym2.symbol) return false; - if (sym1.aliases !== sym2.aliases) return false; - if (sym1.name !== sym2.name) return false; - if (typeof sym1.colour !== typeof sym2.colour || - (typeof sym1.colour === "string" && typeof sym2.colour === "string" && - parseInt(sym1.colour, 16) != parseInt(sym2.colour, 16))) { - return false; - } - if (sym1.complement !== sym2.complement) return false; - if (sym1.equals !== sym2.equals) return false; - } - return true; -}; -Alphabet.prototype.check_core_subset = function(super_alph) { - var complement_same = true; - var seen_set = {}; - var sub_i, sub_symbol, super_i, super_symbol; - for (sub_i = 0; sub_i < this.ncore; sub_i++) { - sub_symbol = this.symbols[sub_i]; - super_i = super_alph.encode[sub_symbol.symbol]; - if (super_i == null) return 0; - super_symbol = super_alph.symbols[super_i]; - if (seen_set[super_i]) return 0; - seen_set[super_i] = true; - // check complement - if (sub_symbol.complement != null && super_symbol.complement != null) { - if (super_alph.encode[sub_symbol.complement] != super_alph.encode[super_symbol.complement]) { - complement_same = false; - } - } else if (sub_symbol.complement != null || super_symbol.complement != null) { - complement_same = false; - } - } - return (complement_same ? 1 : -1); -}; -// convert a sequence to its reverse complement -Alphabet.prototype.invcomp_seq = function(seq) { - "use strict"; - var syms, i, e_sym, comp_e_sym; - if (!this.has_complement()) throw new Error("Alphabet must be complementable"); - syms = seq.split(""); - for (i = 0; i < syms.length; i++) { - e_sym = this.encode[syms[i]]; - if (typeof e_sym === "undefined") { - e_sym = this.ncore; // wildcard - } - comp_e_sym = this.complement[e_sym]; - if (typeof comp_e_sym === "undefined") { - comp_e_sym = e_sym; // not complementable - } - syms[i] = this.symbols[comp_e_sym].symbol; - } - return syms.reverse().join(""); -}; -// convert the alphabet to the text version -Alphabet.prototype.as_text = function() { - "use strict"; - function name_as_text(name) { - var i, c, out; - out = "\""; - for (i = 0; i < name.length; i++) { - c = name.charAt(i); - if (c == "\"") { - out += "\\\""; - } else if (c == "/") { - out += "\\/"; - } else if (c == "\\") { - out += "\\\\"; - } else { - out += c; - } - } - out += "\""; - return out; - } - function symbol_as_text(sym) { - var out; - out = sym.symbol; - if (typeof sym.name === "string" && sym.name != sym.symbol) { - out += " " + name_as_text(sym.name); - } - if (typeof sym.colour === "string") { - out += " " + sym.colour; - } - return out; - } - var out, i, j, c, sym; - out = ""; - // output core symbols with 2 way complements - for (i = 0; i < this.ncore; i++) { - c = this.complement[i]; - if (typeof c === "number" && i < c && this.complement[c] === i) { - out += symbol_as_text(this.symbols[i]) + " ~ " + symbol_as_text(this.symbols[c]) + "\n"; - } - } - // output core symbols with no complement - for (i = 0; i < this.ncore; i++) { - if (typeof this.complement[i] === "undefined") { - out += symbol_as_text(this.symbols[i]) + "\n"; - } - } - // output ambiguous symbols that have comprising characters - for (i = this.ncore; i < this.symbols.length; i++) { - if (this.symbols[i].equals.length == 0) break; - out += symbol_as_text(this.symbols[i]) + " = " + this.symbols[i].equals + "\n"; - if (typeof this.symbols[i].aliases === "string") { - for (j = 0; j < this.symbols[i].aliases.length; j++) { - if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue; - out += this.symbols[i].aliases.charAt(j) + " = " + this.symbols[i].equals + "\n"; - } - } - } - // output aliases of core symbols - for (i = 0; i < this.ncore; i++) { - if (typeof this.symbols[i].aliases === "string") { - for (j = 0; j < this.symbols[i].aliases.length; j++) { - if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue; - out += this.symbols[i].aliases.charAt(j) + " = " + this.symbols[i].symbol + "\n"; - } - } - } - // output gap symbols - i = this.symbols.length - 1; - if (this.symbols[i].equals.length == 0) { - out += symbol_as_text(this.symbols[i]) + " =\n"; - if (typeof this.symbols[i].aliases === "string") { - for (j = 0; j < this.symbols[i].aliases.length; j++) { - if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue; - out += this.symbols[i].aliases.charAt(j) + " =\n"; - } - } - } - return out; -}; -// output the alphabet as it appears in minimal MEME format -Alphabet.prototype.as_meme = function() { - "use strict"; - function name_as_text(name) { - var i, c, out; - out = "\""; - for (i = 0; i < name.length; i++) { - c = name.charAt(i); - if (c == "\"") { - out += "\\\""; - } else if (c == "/") { - out += "\\/"; - } else if (c == "\\") { - out += "\\\\"; - } else { - out += c; - } - } - out += "\""; - return out; - } - if (this.equals(AlphStd.DNA)) { - return "ALPHABET= ACGT\n"; - } else if (this.equals(AlphStd.PROTEIN)) { - return "ALPHABET= ACDEFGHIKLMNPQRSTVWY\n"; - } else { - return "ALPHABET" + - (this.name != null ? " " + name_as_text(this.name) : "") + - (this.like != null ? " " + this.like + "-LIKE" : "") + "\n" + - this.as_text() + "END ALPHABET\n"; - } -}; - -// Returns a table showing all the letters in the alphabet -Alphabet.prototype.as_table = function() { - "use strict"; - var i, j, row, th, td, aliases, equals, sym; - var table = document.createElement("table"); - // create the core symbol header - row = table.insertRow(table.rows.length); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Symbol(s)")); - row.appendChild(th); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Name")); - row.appendChild(th); - th = document.createElement("th"); - if (this.has_complement()) { - th.appendChild(document.createTextNode("Complement")); - } - row.appendChild(th); - // list the core symbols - for (i = 0; i < this.ncore; i++) { - row = table.insertRow(table.rows.length); - td = document.createElement("td"); - if (this.symbols[i].colour != null) { - td.style.color = '#' + this.symbols[i].colour; - } - td.appendChild(document.createTextNode(this.symbols[i].symbol)); - aliases = this.get_aliases(i); - if (aliases.length > 0) { - td.appendChild(document.createTextNode(' ' + aliases.split('').join(' '))); - } - row.appendChild(td); - td = document.createElement("td"); - if (this.symbols[i].name != null) { - td.appendChild(document.createTextNode(this.symbols[i].name)); - } - row.appendChild(td); - td = document.createElement("td"); - if (this.symbols[i].complement != null) { - td.style.color = this.get_colour(this.get_index(this.symbols[i].complement)); - td.appendChild(document.createTextNode(this.symbols[i].complement)); - } - row.appendChild(td); - } - // create the ambiguous symbol header - row = table.insertRow(table.rows.length); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Symbol(s)")); - row.appendChild(th); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Name")); - row.appendChild(th); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Matches")); - row.appendChild(th); - // list the ambiguous symbols - for (i = this.ncore; i < this.symbols.length; i++) { - row = table.insertRow(table.rows.length); - td = document.createElement("td"); - if (this.symbols[i].colour != null) { - td.style.color = '#' + this.symbols[i].colour; - } - td.appendChild(document.createTextNode(this.symbols[i].symbol)); - aliases = this.get_aliases(i); - if (aliases.length > 0) { - td.appendChild(document.createTextNode(' ' + aliases.split('').join(' '))); - } - row.appendChild(td); - td = document.createElement("td"); - if (this.symbols[i].name != null) { - td.appendChild(document.createTextNode(this.symbols[i].name)); - } - row.appendChild(td); - td = document.createElement("td"); - equals = this.symbols[i].equals.split(''); - for (j = 0; j < equals.length; j++) { - if (j != 0) td.appendChild(document.createTextNode(' ')); - sym = document.createElement("span"); - sym.style.color = this.get_colour(this.get_index(equals[j])); - sym.appendChild(document.createTextNode(equals[j])); - td.appendChild(sym); - } - row.appendChild(td); - } - return table; -}; - -// returns a dictionary of the colours for EPS -Alphabet.prototype._as_eps_dict = function() { - "use strict"; - var i, sym, rgb; - var out = "/fullColourDict <<\n"; - for (i = 0; i < this.ncore; i++) { - sym = this.get_symbol(i); - sym = sym.replace(/\\/g, "\\\\"); - sym = sym.replace(/\(/g, "\\("); - sym = sym.replace(/\)/g, "\\)"); - rgb = this.get_rgb(i); - out += " (" + sym + ") [" + rgb.red.toFixed(4) + " " + rgb.green.toFixed(4) + " " + rgb.blue.toFixed(4) + "]\n"; - } - out += ">> def\n"; - out += "/mutedColourDict <<\n"; - for (i = 0; i < this.ncore; i++) { - sym = this.get_symbol(i); - sym = sym.replace(/\\/g, "\\\\"); - sym = sym.replace(/\(/g, "\\("); - sym = sym.replace(/\)/g, "\\)"); - rgb = Alphabet.lighten_colour(this.get_rgb(i)); - out += " (" + sym + ") [" + rgb.red.toFixed(4) + " " + rgb.green.toFixed(4) + " " + rgb.blue.toFixed(4) + "]\n"; - } - out += ">> def\n"; - return out; -}; - -// return the alphabet name or a list of primary symbols -Alphabet.prototype.toString = function() { - "use strict"; - if (this.name != null) { - return this.name; - } else { - return this.get_symbols(); - } -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Helper functions -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -// Convert a colour specified in RGB colourspace values into LAB colourspace -Alphabet.rgb2lab = function(rgb) { - "use strict"; - var xyzHelper, labHelper; - // XYZ helper - xyzHelper = function(value) { - if (value > 0.0445) { - value = (value + 0.055) / 1.055; - value = Math.pow(value, 2.4); - } else { - value /= 12.92; - } - value *= 100; - return value; - }; - // lab helper - labHelper = function(value) { - if (value > 0.008856) { - value = Math.pow(value, 1.0 / 3.0); - } else { - value = (7.787 * value) + (16.0 / 116.0); - } - return value; - }; - // convert into XYZ colourspace - var c1, c2, c3; - if (typeof rgb == "number") { - c1 = xyzHelper(((rgb >> 16) & 0xFF) / 255.0); - c2 = xyzHelper(((rgb >> 8) & 0xFF) / 255.0); - c3 = xyzHelper((rgb & 0xFF) / 255.0); - } else { - c1 = xyzHelper(rgb.red); - c2 = xyzHelper(rgb.green); - c3 = xyzHelper(rgb.blue); - } - var x = (c1 * 0.4124) + (c2 * 0.3576) + (c3 * 0.1805); - var y = (c1 * 0.2126) + (c2 * 0.7152) + (c3 * 0.0722); - var z = (c1 * 0.0193) + (c2 * 0.1192) + (c3 * 0.9505); - // convert into Lab colourspace - c1 = labHelper(x / 95.047); - c2 = labHelper(y / 100.0); - c3 = labHelper(z / 108.883); - var l = (116.0 * c2) - 16; - var a = 500.0 * (c1 - c2); - var b = 200.0 * (c2 - c3); - return {"l": l, "a": a, "b": b}; -}; - -// Convert a colour specified in HSV colourspace into RGB colourspace -Alphabet.hsv2rgb = function(hue, sat, value, output_object) { - // achromatic (grey) - var r = value; - var g = value; - var b = value; - if (sat != 0) { - var h = hue / 60.0; - var i = Math.floor(h); - var f = h - i; - var p = value * (1.0 - sat); - var q = value * (1.0 - (sat * f)); - var t = value * (1.0 - (sat * (1.0 - f))); - if (i == 0) { - r = value; - g = t; - b = p; - } else if (i == 1) { - r = q; - g = value; - b = p; - } else if (i == 2) { - r = p; - g = value; - b = t; - } else if (i == 3) { - r = p; - g = q; - b = value; - } else if (i == 4) { - r = t; - g = p; - b = value; - } else { - r = value; - g = p; - b = q; - } - } - if (output_object) { - return {"red": r, "green": g, "blue": b}; - } else { - return (Math.floor(r * 255) << 15) | (Math.floor(g * 255) << 8) | (Math.floor(b * 255)); - } -}; - -// Calculate a distance score between two colours in LAB colourspace -Alphabet.lab_dist = function(lab1, lab2) { - var c1 = Math.sqrt((lab1.l * lab1.l) + (lab1.a * lab1.a)); - var c2 = Math.sqrt((lab2.l * lab2.l) + (lab2.a * lab2.a)); - var dc = c1 - c2; - var dl = lab1.l - lab2.l; - var da = lab1.a - lab2.a; - var db = lab1.b - lab2.b; - // we don't want NaN due to rounding errors so fudge things a bit... - var dh = 0; - var dh_squared = (da * da) + (db * db) - (dc * dc); - if (dh_squared > 0) { - dh = Math.sqrt(dh_squared); - } - var first = dl; - var second = dc / (1.0 + (0.045 * c1)); - var third = dh / (1.0 + (0.015 * c1)); - return Math.sqrt((first * first) + (second * second) + (third * third)); -}; - -// convert an RGB value into a HSL value -Alphabet.rgb2hsl = function(rgb) { - "use strict"; - var min, max, delta, h, s, l, r, g, b; - if (typeof rgb == "number") { - r = ((rgb >> 16) & 0xFF) / 255.0; - g = ((rgb >> 8) & 0xFF) / 255.0; - b = (rgb & 0xFF) / 255.0; - } else { - r = rgb.red; - g = rgb.green; - b = rgb.blue; - } - min = Math.min(r, g, b); - max = Math.max(r, g, b); - delta = max - min; - l = min + (delta / 2); - if (max == min) { - h = 0; // achromatic (grayscale) - s = 0; - } else { - if (l > 0.5) { - s = delta / (2 - max - min); - } else { - s = delta / (max + min); - } - if (max == r) { - h = (g - b) / delta; - if (g < b) h += 6; - } else if (max == g) { - h = ((b - r) / delta) + 2; - } else { - h = ((r - g) / delta) + 4; - } - h /= 6; - } - return {"h": h, "s": s, "l": l}; -}; - -// convert a HSL value into an RGB value -Alphabet.hsl2rgb = function(hsl, output_object) { - "use strict"; - function _hue(p, q, t) { - "use strict"; - if (t < 0) t += 1; - else if (t > 1) t -= 1; - if (t < (1.0 / 6.0)) { - return p + ((q - p) * 6.0 * t); - } else if (t < 0.5) { - return q; - } else if (t < (2.0 / 3.0)) { - return p + ((q - p) * ((2.0 / 3.0) - t) * 6.0); - } else { - return p; - } - } - var r, g, b, p, q; - if (hsl.s == 0) { - // achromatic (grayscale) - r = hsl.l; - g = hsl.l; - b = hsl.l; - } else { - if (hsl.l < 0.5) { - q = hsl.l * (1 + hsl.s); - } else { - q = hsl.l + hsl.s - (hsl.l * hsl.s); - } - p = (2 * hsl.l) - q; - r = _hue(p, q, hsl.h + (1.0 / 3.0)); - g = _hue(p, q, hsl.h); - b = _hue(p, q, hsl.h - (1.0 / 3.0)); - } - if (output_object) { - return {"red": r, "green": g, "blue": b}; - } else { - return (Math.floor(r * 255) << 15) | (Math.floor(g * 255) << 8) | (Math.floor(b * 255)); - } -}; - -Alphabet.lighten_colour = function(rgb) { - "use strict"; - var hsl = Alphabet.rgb2hsl(rgb); - hsl.l += (1.0 - hsl.l) * 2 / 3; - return Alphabet.hsl2rgb(hsl, typeof rgb != "number"); -}; - -//====================================================================== -// end Alphabet object -//====================================================================== - -//====================================================================== -// start StandardAlphabet object -//====================================================================== - -// an extension of the alphabet object to support some additional fields -// only present in standard alphabets. -var StandardAlphabet = function(enum_code, enum_name, alphabet_data) { - Alphabet.apply(this, [alphabet_data]); - this.enum_code = enum_code; - this.enum_name = enum_name; -}; -StandardAlphabet.prototype = Alphabet.prototype; -StandardAlphabet.prototype.constructor = StandardAlphabet; - -// A unique code for this standard alphabet. -// This code will be a power of 2 to enable creation of bitsets for -// a selection of standard alphabets. -StandardAlphabet.prototype.get_code = function() { - return this.enum_code; -}; - -// A unique name for this standard alphabet. -// this name will be all upper case and the same as the property that -// refers to this alphabet in the AlphStd collection. -StandardAlphabet.prototype.get_enum = function() { - return this.enum_name; -}; - -//====================================================================== -// end StandardAlphabet object -//====================================================================== - -// A collection of standard alphabets. -var AlphStd = { - RNA: new StandardAlphabet(1, "RNA", { - "name": "RNA", - "like": "RNA", - "ncore": 4, - "symbols": [ - {"symbol": "A", "name": "Adenine", "colour": "CC0000"}, - {"symbol": "C", "name": "Cytosine", "colour": "0000CC"}, - {"symbol": "G", "name": "Guanine", "colour": "FFB300"}, - {"symbol": "U", "name": "Uracil", "colour": "008000", - "aliases": "T"}, - {"symbol": "N", "name": "Any base", "equals": "ACGU", "aliases": "X."}, - {"symbol": "V", "name": "Not U", "equals": "ACG"}, - {"symbol": "H", "name": "Not G", "equals": "ACU"}, - {"symbol": "D", "name": "Not C", "equals": "AGU"}, - {"symbol": "B", "name": "Not A", "equals": "CGU"}, - {"symbol": "M", "name": "Amino", "equals": "AC"}, - {"symbol": "R", "name": "Purine", "equals": "AG"}, - {"symbol": "W", "name": "Weak", "equals": "AU"}, - {"symbol": "S", "name": "Strong", "equals": "CG"}, - {"symbol": "Y", "name": "Pyrimidine", "equals": "CU"}, - {"symbol": "K", "name": "Keto", "equals": "GU"} - ] - }), - DNA: new StandardAlphabet(2, "DNA", { - "name": "DNA", - "like": "DNA", - "ncore": 4, - "symbols": [ - {"symbol": "A", "name": "Adenine", "colour": "CC0000", "complement": "T"}, - {"symbol": "C", "name": "Cytosine", "colour": "0000CC", "complement": "G"}, - {"symbol": "G", "name": "Guanine", "colour": "FFB300", "complement": "C"}, - {"symbol": "T", "name": "Thymine", "colour": "008000", "complement": "A", - "aliases": "U"}, - {"symbol": "N", "name": "Any base", "equals": "ACGT", "aliases": "X."}, - {"symbol": "V", "name": "Not T", "equals": "ACG"}, - {"symbol": "H", "name": "Not G", "equals": "ACT"}, - {"symbol": "D", "name": "Not C", "equals": "AGT"}, - {"symbol": "B", "name": "Not A", "equals": "CGT"}, - {"symbol": "M", "name": "Amino", "equals": "AC"}, - {"symbol": "R", "name": "Purine", "equals": "AG"}, - {"symbol": "W", "name": "Weak", "equals": "AT"}, - {"symbol": "S", "name": "Strong", "equals": "CG"}, - {"symbol": "Y", "name": "Pyrimidine", "equals": "CT"}, - {"symbol": "K", "name": "Keto", "equals": "GT"} - ] - }), - PROTEIN: new StandardAlphabet(4, "PROTEIN", { - "name": "Protein", - "like": "PROTEIN", - "ncore": 20, - "symbols": [ - {"symbol": "A", "name": "Alanine", "colour": "0000CC"}, - {"symbol": "C", "name": "Cysteine", "colour": "0000CC"}, - {"symbol": "D", "name": "Aspartic acid", "colour": "FF00FF"}, - {"symbol": "E", "name": "Glutamic acid", "colour": "FF00FF"}, - {"symbol": "F", "name": "Phenylalanine", "colour": "0000CC"}, - {"symbol": "G", "name": "Glycine", "colour": "FFB300"}, - {"symbol": "H", "name": "Histidine", "colour": "FFCCCC"}, - {"symbol": "I", "name": "Isoleucine", "colour": "0000CC"}, - {"symbol": "K", "name": "Lysine", "colour": "CC0000"}, - {"symbol": "L", "name": "Leucine", "colour": "0000CC"}, - {"symbol": "M", "name": "Methionine", "colour": "0000CC"}, - {"symbol": "N", "name": "Asparagine", "colour": "008000"}, - {"symbol": "P", "name": "Proline", "colour": "FFFF00"}, - {"symbol": "Q", "name": "Glutamine", "colour": "008000"}, - {"symbol": "R", "name": "Arginine", "colour": "CC0000"}, - {"symbol": "S", "name": "Serine", "colour": "008000"}, - {"symbol": "T", "name": "Threonine", "colour": "008000"}, - {"symbol": "V", "name": "Valine", "colour": "0000CC"}, - {"symbol": "W", "name": "Tryptophan", "colour": "0000CC"}, - {"symbol": "Y", "name": "Tyrosine", "colour": "33E6CC"}, - {"symbol": "X", "name": "Any amino acid", "equals": "ACDEFGHIKLMNPQRSTVWY", "aliases": "*."}, - {"symbol": "B", "name": "Asparagine or Aspartic acid", "equals": "DN"}, - {"symbol": "Z", "name": "Glutamine or Glutamic acid", "equals": "EQ"}, - {"symbol": "J", "name": "Leucine or Isoleucine", "equals": "IL"} - ] - }) -}; - -//====================================================================== -// start Symbol object -//====================================================================== -var Symbol = function(alph_index, scale, alphabet) { - "use strict"; - //variable prototype - this.symbol = alphabet.get_symbol(alph_index); - this.scale = scale; - this.colour = alphabet.get_colour(alph_index); -}; - -Symbol.prototype.get_symbol = function() { - "use strict"; - return this.symbol; -}; - -Symbol.prototype.get_scale = function() { - "use strict"; - return this.scale; -}; - -Symbol.prototype.get_colour = function() { - "use strict"; - return this.colour; -}; - -Symbol.prototype.toString = function() { - "use strict"; - return this.symbol + " " + (Math.round(this.scale*1000)/10) + "%"; -}; - -function compare_symbol(sym1, sym2) { - "use strict"; - if (sym1.get_scale() < sym2.get_scale()) { - return -1; - } else if (sym1.get_scale() > sym2.get_scale()) { - return 1; - } else { - return 0; - } -} -//====================================================================== -// end Symbol object -//====================================================================== - -//====================================================================== -// start Pspm object -//====================================================================== -var Pspm = function(matrix, name, ltrim, rtrim, nsites, evalue, pssm, alt) { - "use strict"; - var row, col, data, row_sum, delta, evalue_re; - if (typeof name !== "string") { - name = ""; - } - this.name = name; - //construct - if (matrix instanceof Pspm) { - // copy constructor - this.alph_length = matrix.alph_length; - this.motif_length = matrix.motif_length; - this.name = matrix.name; - this.alt = matrix.alt; - this.nsites = matrix.nsites; - this.evalue = matrix.evalue; - this.ltrim = matrix.ltrim; - this.rtrim = matrix.rtrim; - this.pspm = []; - for (row = 0; row < matrix.motif_length; row++) { - this.pspm[row] = []; - for (col = 0; col < matrix.alph_length; col++) { - this.pspm[row][col] = matrix.pspm[row][col]; - } - } - if (matrix.pssm != null) { - this.pssm = []; - for (row = 0; row < matrix.motif_length; row++) { - this.pspm[row] = []; - for (col = 0; col < matrix.alph_length; col++) { - this.pssm[row][col] = matrix.pssm[row][col]; - } - } - } - } else { - // check parameters - if (ltrim == null) { - ltrim = 0; - } else if (typeof ltrim !== "number" || ltrim % 1 !== 0 || ltrim < 0) { - throw new Error("ltrim must be a non-negative integer, got: " + ltrim); - } - if (rtrim == null) { - rtrim = 0; - } else if (typeof rtrim !== "number" || rtrim % 1 !== 0 || rtrim < 0) { - throw new Error("rtrim must be a non-negative integer, got: " + rtrim); - } - if (nsites != null) { - if (typeof nsites !== "number" || nsites < 0) { - throw new Error("nsites must be a positive number, got: " + nsites); - } else if (nsites == 0) { - nsites = null; - } - } - if (evalue != null) { - if (typeof evalue === "number") { - if (evalue < 0) { - throw new Error("evalue must be a non-negative number, got: " + evalue); - } - } else if (typeof evalue === "string") { - evalue_re = /^((?:[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)|inf)$/; - if (!evalue_re.test(evalue)) { - throw new Error("evalue must be a non-negative number, got: " + evalue); - } - } else { - throw new Error("evalue must be a non-negative number, got: " + evalue); - } - } - // set properties - this.name = name; - this.alt = alt; - this.nsites = nsites; - this.evalue = evalue; - this.ltrim = ltrim; - this.rtrim = rtrim; - if (typeof matrix === "string") { - // string constructor - data = parse_pspm_string(matrix); - this.alph_length = data["alph_length"]; - this.motif_length = data["motif_length"]; - this.pspm = data["pspm"]; - if (this.evalue == null) { - if (data["evalue"] != null) { - this.evalue = data["evalue"]; - } else { - this.evalue = 0; - } - } - if (this.nsites == null) { - if (typeof data["nsites"] === "number") { - this.nsites = data["nsites"]; - } else { - this.nsites = 20; - } - } - } else { - // assume pspm is a nested array - this.motif_length = matrix.length; - this.alph_length = (matrix.length > 0 ? matrix[0].length : 0); - if (this.nsites == null) { - this.nsites = 20; - } - if (this.evalue == null) { - this.evalue = 0; - } - this.pspm = []; - // copy pspm and check - for (row = 0; row < this.motif_length; row++) { - if (this.alph_length != matrix[row].length) { - throw new Error("COLUMN_MISMATCH"); - } - this.pspm[row] = []; - row_sum = 0; - for (col = 0; col < this.alph_length; col++) { - this.pspm[row][col] = matrix[row][col]; - row_sum += this.pspm[row][col]; - } - delta = 0.1; - if (isNaN(row_sum) || (row_sum > 1 && (row_sum - 1) > delta) || - (row_sum < 1 && (1 - row_sum) > delta)) { - throw new Error("INVALID_SUM"); - } - } - // copy pssm - if (pssm != null) { - this.pssm = []; - for (row = 0; row < this.motif_length; row++) { - this.pssm[row] = []; - for (col = 0; col < this.alph_length; col++) { - this.pssm[row][col] = pssm[row][col]; - } - } - } - } - } -}; - -Pspm.prototype.copy = function() { - "use strict"; - return new Pspm(this); -}; - -Pspm.prototype.reverse = function() { - "use strict"; - var x, y, temp, temp_trim; - //reverse - x = 0; - y = this.motif_length-1; - while (x < y) { - temp = this.pspm[x]; - this.pspm[x] = this.pspm[y]; - this.pspm[y] = temp; - x++; - y--; - } - // reverse pssm (if defined) - if (typeof this.pssm !== "undefined") { - //reverse - x = 0; - y = this.motif_length-1; - while (x < y) { - temp = this.pssm[x]; - this.pspm[x] = this.pssm[y]; - this.pssm[y] = temp; - x++; - y--; - } - } - //swap triming - temp_trim = this.ltrim; - this.ltrim = this.rtrim; - this.rtrim = temp_trim; - return this; //allow function chaining... -}; - -Pspm.prototype.reverse_complement = function(alphabet) { - "use strict"; - var x, y, temp, i, row, c, temp_trim; - if (this.alph_length != alphabet.get_size_core()) { - throw new Error("The alphabet size does not match the size of the pspm."); - } - if (!alphabet.has_complement()) { - throw new Error("The specified alphabet can not be complemented."); - } - // reverse motif - this.reverse(); - //complement - for (x = 0; x < this.motif_length; x++) { - row = this.pspm[x]; - for (i = 0; i < row.length; i++) { - c = alphabet.get_complement(i); - if (c < i) continue; - temp = row[i]; - row[i] = row[c]; - row[c] = temp; - } - } - // complement pssm (if defined) - if (typeof this.pssm !== "undefined") { - //complement - for (x = 0; x < this.motif_length; x++) { - row = this.pssm[x]; - for (i = 0; i < row.length; i++) { - c = alphabet.get_complement(i); - if (c < i) continue; - temp = row[i]; - row[i] = row[c]; - row[c] = temp; - } - } - } - return this; //allow function chaining... -}; - -Pspm.prototype.get_stack = function(position, alphabet, ssc) { - "use strict"; - var row, stack_ic, alphabet_ic, stack, i, sym; - if (this.alph_length != alphabet.get_size_core()) { - throw new Error("The alphabet size does not match the size of the pspm."); - } - row = this.pspm[position]; - stack_ic = this.get_stack_ic(position, alphabet); - if (ssc) stack_ic -= this.get_error(alphabet); - alphabet_ic = alphabet.get_ic(); - stack = []; - for (i = 0; i < this.alph_length; i++) { - sym = new Symbol(i, row[i]*stack_ic/alphabet_ic, alphabet); - if (sym.get_scale() <= 0) { - continue; - } - stack.push(sym); - } - stack.sort(compare_symbol); - return stack; -}; - -Pspm.prototype.get_stack_ic = function(position, alphabet) { - "use strict"; - var row, H, i; - if (this.alph_length != alphabet.get_size_core()) { - throw new Error("The alphabet size does not match the size fo the pspm."); - } - row = this.pspm[position]; - H = 0; - for (i = 0; i < this.alph_length; i++) { - if (row[i] === 0) { - continue; - } - H -= (row[i] * (Math.log(row[i]) / Math.LN2)); - } - return alphabet.get_ic() - H; -}; - -Pspm.prototype.get_error = function(alphabet) { - "use strict"; - if (this.nsites === 0) { - return 0; - } - return (alphabet.get_size_core()-1) / (2 * Math.LN2 * this.nsites); -}; - -Pspm.prototype.get_motif_length = function() { - "use strict"; - return this.motif_length; -}; - -Pspm.prototype.get_alph_length = function() { - "use strict"; - return this.alph_length; -}; - -Pspm.prototype.get_left_trim = function() { - "use strict"; - return this.ltrim; -}; - -Pspm.prototype.get_right_trim = function() { - "use strict"; - return this.rtrim; -}; - -Pspm.prototype.as_best_match = function(alphabet) { - "use strict"; - var match, odds, best_odds, best_index; - var i, j; - match = ""; - for (i = 0; i < this.motif_length; i++) { - best_index = 0; - best_odds = this.pspm[i][0] / alphabet.get_bg_freq(0); - for (j = 1; j < this.alph_length; j++) { - odds = this.pspm[i][j] / alphabet.get_bg_freq(j); - if (odds > best_odds) { - best_odds = odds; - best_index = j; - } - } - match += alphabet.get_symbol(best_index); - } - return match; -}; - -Pspm.prototype.as_count_matrix = function() { - "use strict"; - var count, count_text, text; - var i, j; - text = ""; - for (i = 0; i < this.motif_length; i++) { - if (i !== 0) { - text += "\n"; - } - for (j = 0; j < this.alph_length; j++) { - if (j !== 0) { - text += " "; - } - count = Math.round(this.nsites * this.pspm[i][j]); - count_text = "" + count; - // pad up to length of 4 - if (count_text.length < 4) { - text += (new Array(5 - count_text.length)).join(" ") + count_text; - } else { - text += count_text; - } - } - } - return text; -}; - -Pspm.prototype.as_probability_matrix = function() { - "use strict"; - var text; - var i, j; - text = ""; - for (i = 0; i < this.motif_length; i++) { - if (i !== 0) { - text += "\n"; - } - for (j = 0; j < this.alph_length; j++) { - if (j !== 0) { - text += " "; - } - text += this.pspm[i][j].toFixed(6); - } - } - return text; -}; - -Pspm.prototype.as_score_matrix = function(alphabet, pseudo) { - "use strict"; - var me, score, out, row, col, score_text; - me = this; - if (typeof this.pssm === "undefined") { - if (!(typeof alphabet === "object" && alphabet != null && alphabet instanceof Alphabet)) { - throw new Error("The alphabet is required to generate the pssm."); - } - if (typeof pseudo === "undefined") { - pseudo = 0.01; - } else if (typeof pseudo !== "number" || pseudo < 0) { - throw new Error("Expected positive number for pseudocount"); - } - score = function(row, col) { - "use strict"; - var p, bg, p2; - p = me.pspm[row][col]; - bg = alphabet.get_bg_freq(col); - p2 = (p * me.nsites + bg * pseudo) / (me.nsites + pseudo); - return (p2 > 0 ? Math.round((Math.log(p2 / bg) / Math.LN2) * 100) : -10000); - }; - } else { - score = function(row, col) { - "use strict"; - return me.pssm[row][col]; - }; - } - out = ""; - for (row = 0; row < this.motif_length; row++) { - for (col = 0; col < this.alph_length; col++) { - if (col !== 0) { - out += " "; - } - score_text = "" + score(row, col); - // pad out to 6 characters - if (score_text.length < 6) { - out += (new Array(7 - score_text.length)).join(" ") + score_text; - } else { - out += score_text; - } - } - out += "\n"; - } - return out; -} - -Pspm.prototype.as_pspm = function() { - "use strict"; - return "letter-probability matrix: alength= " + this.alph_length + - " w= " + this.motif_length + " nsites= " + this.nsites + - " E= " + (typeof this.evalue === "number" ? - this.evalue.toExponential() : this.evalue) + "\n" + - this.as_probability_matrix(); -}; - -Pspm.prototype.as_pssm = function(alphabet, pseudo) { - "use strict"; - return "log-odds matrix: alength= " + this.alph_length + - " w= " + this.motif_length + - " E= " + (typeof this.evalue == "number" ? - this.evalue.toExponential() : this.evalue) + "\n" + - this.as_score_matrix(alphabet, pseudo); -}; - -Pspm.prototype.as_meme = function(options) { - var with_header, with_pspm, with_pssm, version, alphabet, bg_source, pseudocount, strands; - var out, alen, i; - // get the options - if (typeof options !== "object" || options === null) { - options = {}; - } - with_header = (typeof options["with_header"] === "boolean" ? options["with_header"] : false); - with_pspm = (typeof options["with_pspm"] === "boolean" ? options["with_pspm"] : false); - with_pssm = (typeof options["with_pssm"] === "boolean" ? options["with_pssm"] : false); - if (!with_pspm && !with_pssm) with_pspm = true; - if (with_header) { - if (typeof options["version"] === "string" && /^\d+(?:\.\d+){0,2}$/.test(options["version"])) { - version = options["version"]; - } else if (typeof options["version"] === "number") { - version = options["version"].toFixed(0); - } else { - version = "4"; - } - if (typeof options["strands"] === "number" && options["strands"] === 1) { - strands = 1; - } else { - strands = 2; - } - if (typeof options["bg_source"] === "string") { - bg_source = options["bg_source"]; - } else { - bg_source = "unknown source"; - } - if (typeof options["alphabet"] === "object" && options["alphabet"] != null - && options["alphabet"] instanceof Alphabet) { - alphabet = options["alphabet"]; - } else { - throw new Error("The alphabet is required to generate the header."); - } - } - // now create the output - out = ""; - if (with_header) { - out = "MEME version " + version + "\n\n"; - out += alphabet.as_meme() + "\n"; - if (alphabet.has_complement()) { // assume DNA has both strands unless otherwise specified - out += "strands: " + (strands === 1 ? "+" : "+ -") + "\n\n"; - } - out += "Background letter frequencies (from " + bg_source + "):\n"; - alen = alphabet.get_size_core(); - for (i = 0; i < alen; i++) { - if (i !== 0) { - if (i % 9 === 0) { // maximum of nine entries per line - out += "\n"; - } else { - out += " "; - } - } - out += alphabet.get_symbol(i) + " " + alphabet.get_bg_freq(i).toFixed(3); - } - } - out += "\n\n"; - out += "MOTIF " + this.name + (this.alt == null ? "" : " " + this.alt); - if (with_pssm) { - out += "\n\n"; - out += this.as_pssm(options["alphabet"], options["pseudocount"]); - } - if (with_pspm) { - out += "\n\n"; - out += this.as_pspm(); - } - return out; -} - -Pspm.prototype.toString = function() { - "use strict"; - var str, i, row; - str = ""; - for (i = 0; i < this.pspm.length; i++) { - row = this.pspm[i]; - str += row.join("\t") + "\n"; - } - return str; -}; - -function parse_pspm_properties(str) { - "use strict"; - var parts, i, eqpos, before, after, properties, prop, num, num_re; - num_re = /^((?:[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)|inf)$/; - parts = trim(str).split(/\s+/); - // split up words containing = - for (i = 0; i < parts.length;) { - eqpos = parts[i].indexOf("="); - if (eqpos != -1) { - before = parts[i].substr(0, eqpos); - after = parts[i].substr(eqpos+1); - if (before.length > 0 && after.length > 0) { - parts.splice(i, 1, before, "=", after); - i += 3; - } else if (before.length > 0) { - parts.splice(i, 1, before, "="); - i += 2; - } else if (after.length > 0) { - parts.splice(i, 1, "=", after); - i += 2; - } else { - parts.splice(i, 1, "="); - i++; - } - } else { - i++; - } - } - properties = {}; - for (i = 0; i < parts.length; i += 3) { - if (parts.length - i < 3) { - throw new Error("Expected PSPM property was incomplete. "+ - "Remaing parts are: " + parts.slice(i).join(" ")); - } - if (parts[i+1] !== "=") { - throw new Error("Expected '=' in PSPM property between key and " + - "value but got " + parts[i+1]); - } - prop = parts[i].toLowerCase(); - num = parts[i+2]; - if (!num_re.test(num)) { - throw new Error("Expected numeric value for PSPM property '" + - prop + "' but got '" + num + "'"); - } - properties[prop] = num; - } - return properties; -} - -function parse_pspm_string(pspm_string) { - "use strict"; - var header_re, lines, first_line, line_num, col_num, alph_length, - motif_length, nsites, evalue, pspm, i, line, match, props, parts, - j, prob; - header_re = /^letter-probability\s+matrix:(.*)$/i; - lines = pspm_string.split(/\n/); - first_line = true; - line_num = 0; - col_num = 0; - alph_length; - motif_length; - nsites; - evalue; - pspm = []; - for (i = 0; i < lines.length; i++) { - line = trim(lines[i]); - if (line.length === 0) { - continue; - } - // check the first line for a header though allow matrices without it - if (first_line) { - first_line = false; - match = header_re.exec(line); - if (match !== null) { - props = parse_pspm_properties(match[1]); - if (props.hasOwnProperty("alength")) { - alph_length = parseFloat(props["alength"]); - if (alph_length != 4 && alph_length != 20) { - throw new Error("PSPM property alength should be 4 or 20" + - " but got " + alph_length); - } - } - if (props.hasOwnProperty("w")) { - motif_length = parseFloat(props["w"]); - if (motif_length % 1 !== 0 || motif_length < 1) { - throw new Error("PSPM property w should be an integer larger " + - "than zero but got " + motif_length); - } - } - if (props.hasOwnProperty("nsites")) { - nsites = parseFloat(props["nsites"]); - if (nsites <= 0) { - throw new Error("PSPM property nsites should be larger than " + - "zero but got " + nsites); - } - } - if (props.hasOwnProperty("e")) { - evalue = props["e"]; - if (evalue < 0) { - throw new Error("PSPM property evalue should be " + - "non-negative but got " + evalue); - } - } - continue; - } - } - pspm[line_num] = []; - col_num = 0; - parts = line.split(/\s+/); - for (j = 0; j < parts.length; j++) { - prob = parseFloat(parts[j]); - if (prob != parts[j] || prob < 0 || prob > 1) { - throw new Error("Expected probability but got '" + parts[j] + "'"); - } - pspm[line_num][col_num] = prob; - col_num++; - } - line_num++; - } - if (typeof motif_length === "number") { - if (pspm.length != motif_length) { - throw new Error("Expected PSPM to have a motif length of " + - motif_length + " but it was actually " + pspm.length); - } - } else { - motif_length = pspm.length; - } - if (typeof alph_length !== "number") { - alph_length = pspm[0].length; - if (alph_length != 4 && alph_length != 20) { - throw new Error("Expected length of first row in the PSPM to be " + - "either 4 or 20 but got " + alph_length); - } - } - for (i = 0; i < pspm.length; i++) { - if (pspm[i].length != alph_length) { - throw new Error("Expected PSPM row " + i + " to have a length of " + - alph_length + " but the length was " + pspm[i].length); - } - } - return {"pspm": pspm, "motif_length": motif_length, - "alph_length": alph_length, "nsites": nsites, "evalue": evalue}; -} -//====================================================================== -// end Pspm object -//====================================================================== - -//====================================================================== -// start Logo object -//====================================================================== - -var Logo = function(alphabet, options) { - "use strict"; - this.alphabet = alphabet; - this.fine_text = ""; - this.x_axis = 1; - this.y_axis = true; - this.xlate_nsyms = 1; - this.xlate_start = null; - this.xlate_end = null; - this.pspm_list = []; - this.pspm_column = []; - this.rows = 0; - this.columns = 0; - if (typeof options === "string") { - // the old method signature had fine_text here so we support that - this.fine_text = options; - } else if (typeof options === "object" && options != null) { - this.fine_text = (typeof options.fine_text === "string" ? options.fine_text : ""); - this.x_axis = (typeof options.x_axis === "boolean" ? (options.x_axis ? 1 : 0) : 1); - if (options.x_axis_hidden != null && options.x_axis_hidden) this.x_axis = -1; - this.y_axis = (typeof options.y_axis === "boolean" ? options.y_axis : true); - this.xlate_nsyms = (typeof options.xlate_nsyms === "number" ? options.xlate_nsyms : this.xlate_nsyms); - this.xlate_start = (typeof options.xlate_start === "number" ? options.xlate_start : this.xlate_start); - this.xlate_end = (typeof options.xlate_end === "number" ? options.xlate_end : this.xlate_end); - } -}; - -Logo.prototype.add_pspm = function(pspm, column) { - "use strict"; - var col; - if (typeof column === "undefined") { - column = 0; - } else if (column < 0) { - throw new Error("Column index out of bounds."); - } - this.pspm_list[this.rows] = pspm; - this.pspm_column[this.rows] = column; - this.rows++; - col = column + pspm.get_motif_length(); - if (col > this.columns) { - this.columns = col; - } -}; - -Logo.prototype.get_columns = function() { - "use strict"; - return this.columns; -}; - -Logo.prototype.get_xlate_nsyms = function() { - "use strict"; - return this.xlate_nsyms; -}; - -Logo.prototype.get_xlate_start = function() { - "use strict"; - return (this.xlate_start != null ? this.xlate_start : 0); -}; - -Logo.prototype.get_xlate_end = function() { - "use strict"; - return (this.xlate_end != null ? this.xlate_end : this.columns * this.xlate_nsyms); -}; - -Logo.prototype.get_xlate_columns = function() { - "use strict"; - return this.get_xlate_end() - this.get_xlate_start(); -}; - -Logo.prototype.get_rows = function() { - "use strict"; - return this.rows; -}; - -Logo.prototype.get_pspm = function(row_index) { - "use strict"; - if (row_index < 0 || row_index >= this.rows) { - throw new Error("INDEX_OUT_OF_BOUNDS"); - } - return this.pspm_list[row_index]; -}; - -Logo.prototype.get_offset = function(row_index) { - "use strict"; - if (row_index < 0 || row_index >= this.rows) { - throw new Error("INDEX_OUT_OF_BOUNDS"); - } - return this.pspm_column[row_index]; -}; - -Logo.prototype._as_eps_data = function(ssc, errbars) { - var i, j, pos, stack_pos, pspm, stack, sym, out; - out = ""; - for (i = 0; i < this.rows; i++) { - out += "\nStartLine\n"; - // Indent - for (j = 0; j < this.pspm_column[i]; j++) { - out += "() startstack\nendstack\n\n"; - } - pspm = this.pspm_list[i]; - if (pspm.get_left_trim() > 0) { - out += "MuteColour\nDrawTrimEdge\n" + pspm.get_left_trim() + " DrawTrimBg\n"; - } - for (pos = 0; pos < pspm.get_motif_length(); pos++) { - if (pos != 0 && pos == pspm.get_left_trim()) { // enable full colour - out += "DrawTrimEdge\nRestoreColour\n"; - } else if (pos == (pspm.get_motif_length() - pspm.get_right_trim())) { - out += "MuteColour\n" + pspm.get_right_trim() + " DrawTrimBg\n"; - } - out += "(" + (pos + 1) + ") startstack\n"; - stack = pspm.get_stack(pos, this.alphabet, ssc); - for (stack_pos = 0; stack_pos < stack.length; stack_pos++) { - sym = stack[stack_pos]; - out += " " + (sym.get_scale() * this.alphabet.get_ic()) + " (" + sym.get_symbol() + ") numchar\n"; - } - if (errbars) { - out += " " + pspm.get_error(this.alphabet) + " Ibeam\n"; - } - out += "endstack\n\n"; - } - if (pspm.get_right_trim() > 0 || pspm.get_left_trim() == pspm.get_motif_length()) { - out += "RestoreColour\n"; - } - out += "EndLine\n"; - } - return out; -}; - -Logo.prototype.as_eps = function(options) { - "use strict"; - if (this.xlate_nsyms != 1) throw new Error("Unsupported setting xlate_nsyms for EPS"); - if (this.xlate_start != null) throw new Error("Unsupported setting xlate_start for EPS"); - if (this.xlate_end != null) throw new Error("Unsupported setting xlate_end for EPS"); - - var LOGOHEIGHT = 7.5; // default height of line in cm - var cm2pts, height, width, now, ssc, errbars; - if (typeof options === "undefined") { - options = {}; - } - cm2pts = 72 / 2.54; - if (typeof options.logo_height == "number") { - height = options.logo_height; - } else { - height = LOGOHEIGHT * this.rows; - } - if (typeof options.logo_width == "number") { - width = options.logo_width; - } else { - width = this.columns + 2; - } - now = new Date(); - ssc = (typeof options.ssc == "boolean" ? options.ssc : false); - errbars = (typeof options.show_error_bar == "boolean" ? options.show_error_bar : ssc); - var values = { - "LOGOHEIGHT": height, - "LOGOWIDTH": width, - "BOUNDINGHEIGHT": Math.round(height * cm2pts), - "BOUNDINGWIDTH": Math.round(width * cm2pts), - "LOGOLINEHEIGHT": (height / this.rows), - "CHARSPERLINE": this.columns, - "BARBITS": this.alphabet.get_ic(), - "LOGOTYPE": (this.alphabet.has_complement() ? "NA" : "AA"), - "CREATIONDATE": now.getDate() + "." + (now.getMonth() + 1) + "." + now.getFullYear() + " " + now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds(), - "ERRORBARFRACTION": (typeof options.error_bar_fraction == "number" ? options.error_bar_fraction : 1.0), - "TICBITS": (typeof options.ticbits == "number" ? options.ticbits : 1.0), - "TITLE": (typeof options.title == "string" ? options.title : ""), - "FINEPRINT": (typeof options.fineprint == "string" ? options.fineprint : this.fine_text), - "XAXISLABEL": (typeof options.xaxislabel == "string" ? options.xaxislabel : ""), - "YAXISLABEL": (typeof options.yaxislabel == "string" ? options.yaxislabel : "bits"), - "SSC": ssc, - "YAXIS": (typeof options.show_y_axis == "boolean" ? options.show_y_axis : this.y_axis), - "SHOWENDS": (typeof options.show_ends == "boolean" ? options.show_ends : false), - "ERRBAR": errbars, - "OUTLINE": (typeof options.show_outline == "boolean" ? options.show_outline : false), - "NUMBERING": (typeof options.show_numbering == "boolean" ? options.show_numbering : this.x_axis != 0), - "SHOWINGBOX": (typeof options.show_box == "boolean" ? options.show_box : false), - "CREATOR": (typeof options.creator == "string" ? options.creator : "motif_logo.js"), - "FONTSIZE": (typeof options.label_font_size == "number" ? options.label_font_size : 12), - "TITLEFONTSIZE": (typeof options.title_font_size == "number" ? options.title_font_size : 12), - "SMALLFONTSIZE": (typeof options.small_font_size == "number" ? options.small_font_size : 6), - "TOPMARGIN" : (typeof options.top_margin == "number" ? options.top_margin : 0.9), - "BOTTOMMARGIN": (typeof options.bottom_margin == "number" ? options.bottom_margin : 0.9), - "COLORDICT": this.alphabet._as_eps_dict(), - "DATA": this._as_eps_data(ssc, errbars) - }; - // now this requires that the script containing the template has been imported! - return motif_logo_template(values); -}; - -//====================================================================== -// end Logo object -//====================================================================== - -// calculate the exact size (in pixels) of an object drawn on the -// canvas assuming that the background of the canvas is transparent. -function canvas_bounds(ctx, cwidth, cheight) { - "use strict"; - var data, r, c, top_line, bottom_line, left_line, right_line, - txt_width, txt_height; - - // extract the image data - data = ctx.getImageData(0, 0, cwidth, cheight).data; - - // set initial values - top_line = -1; bottom_line = -1; left_line = -1; right_line = -1; - txt_width = 0; txt_height = 0; - - // Find the top-most line with a non-transparent pixel - for (r = 0; r < cheight; r++) { - for (c = 0; c < cwidth; c++) { - if (data[r * cwidth * 4 + c * 4 + 3]) { - top_line = r; - break; - } - } - if (top_line != -1) { - break; - } - } - - // Only bother looking if we found at least one set pixel... - if (top_line != -1) { - - //find the last line with a non-transparent pixel - for (r = cheight-1; r >= top_line; r--) { - for(c = 0; c < cwidth; c++) { - if(data[r * cwidth * 4 + c * 4 + 3]) { - bottom_line = r; - break; - } - } - if (bottom_line != -1) { - break; - } - } - // calculate height - txt_height = bottom_line - top_line + 1; - - // Find the left-most line with a non-transparent pixel - for (c = 0; c < cwidth; c++) { - for (r = top_line; r <= bottom_line; r++) { - if (data[r * cwidth * 4 + c * 4 + 3]) { - left_line = c; - break; - } - } - if (left_line != -1) { - break; - } - } - - //find the right most line with a non-transparent pixel - for (c = cwidth-1; c >= left_line; c--) { - for(r = top_line; r <= bottom_line; r++) { - if(data[r * cwidth * 4 + c * 4 + 3]) { - right_line = c; - break; - } - } - if (right_line != -1) { - break; - } - } - txt_width = right_line - left_line + 1; - } - - //return the bounds - return {bound_top: top_line, bound_bottom: bottom_line, - bound_left: left_line, bound_right: right_line, width: txt_width, - height: txt_height}; -} - -//====================================================================== -// start RasterizedAlphabet -//====================================================================== - -// Rasterize Alphabet -// 1) Measure width of text at default font for all symbols in alphabet -// 2) sort in width ascending -// 3) Drop the top and bottom 10% (designed to ignore outliers like 'W' and 'I') -// 4) Calculate the average as the maximum scaling factor (designed to stop I becoming a rectangular blob). -// 5) Assume scale of zero would result in width of zero, interpolate scale required to make perfect width font -// 6) Draw text onto temp canvas at calculated scale -// 7) Find bounds of drawn text -// 8) Paint on to another canvas at the desired height (but only scaling width to fit if larger). -var RasterizedAlphabet = function(alphabet, logo_scale, font, width) { - "use strict"; - var default_size, safety_pad, canvas, ctx, middle, baseline, widths, sizes, - i, sym, size, tenpercent, avg_width, scale, - target_width, target_height; - //variable prototypes - this.alphabet = alphabet; - this.scale = logo_scale; - this.sym_cache = {}; - this.stack_num_cache = []; - this.scale_num_cache = []; - // size of canvas - default_size = 60; // size of measuring canvas - safety_pad = 20; // pixels to pad around so we don't miss the edges - // create a canvas to do our measuring - canvas = document.createElement("canvas"); - if (!canvas.getContext) throw new Error("No canvas support"); - canvas.width = default_size + 2 * safety_pad; - canvas.height = default_size + 2 * safety_pad; - middle = Math.round(canvas.width / 2); - baseline = Math.round(canvas.height - safety_pad); - ctx = canvas.getContext('2d'); - if (!supports_text(ctx)) throw new Error("Canvas does not support text"); - ctx.font = font; - ctx.textAlign = "center"; - ctx.translate(middle, baseline); - // list of widths - widths = []; - sizes = []; - //now measure each letter in the alphabet - for (i = 0; i < alphabet.get_size_core(); ++i) { - // reset the canvas - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.fillStyle = alphabet.get_colour(i); - // draw the test text - ctx.fillText(alphabet.get_symbol(i), 0, 0); - //measure - size = canvas_bounds(ctx, canvas.width, canvas.height); - if (size.width === 0) throw new Error("Invisible symbol!"); - widths.push(size.width); - sizes[i] = size; - } - //sort the widths - widths.sort(function(a,b) {return a - b;}); - //drop 10% of the items off each end - tenpercent = Math.floor(widths.length / 10); - for (i = 0; i < tenpercent; ++i) { - widths.pop(); - widths.shift(); - } - //calculate average width - avg_width = 0; - for (i = 0; i < widths.length; ++i) { - avg_width += widths[i]; - } - avg_width /= widths.length; - // calculate the target width - target_width = width * this.scale * 2; - // calculate scales - for (i = 0; i < alphabet.get_size_core(); ++i) { - sym = alphabet.get_symbol(i); - size = sizes[i]; - // calculate scale - scale = target_width / Math.max(avg_width, size.width); - // estimate scaled height - target_height = size.height * scale; - // create an appropriately sized canvas - canvas = document.createElement("canvas"); - canvas.width = target_width; - canvas.height = target_height + safety_pad * 2; - // calculate the middle - middle = Math.round(canvas.width / 2); - // calculate the baseline - baseline = Math.round(canvas.height - safety_pad); - // get the context and prepare to draw the rasterized text - ctx = canvas.getContext('2d'); - ctx.font = font; - ctx.fillStyle = alphabet.get_colour(i); - ctx.textAlign = "center"; - ctx.translate(middle, baseline); - ctx.save(); - ctx.scale(scale, scale); - // draw the text - ctx.fillText(sym, 0, 0); - ctx.restore(); - this.sym_cache[sym] = {"image": canvas, "size": canvas_bounds(ctx, canvas.width, canvas.height)}; - } -}; - -RasterizedAlphabet.prototype.get_alphabet = function() { - return this.alphabet; -}; - -RasterizedAlphabet.prototype.get_scale = function() { - return this.scale; -}; - -RasterizedAlphabet.prototype.draw_stack_sym = function(ctx, letter, dx, dy, dWidth, dHeight) { - "use strict"; - var entry, image, size; - entry = this.sym_cache[letter]; - image = entry.image; - size = entry.size; - ctx.drawImage(image, 0, size.bound_top -1, image.width, size.height+1, dx, dy, dWidth, dHeight); -}; - -RasterizedAlphabet.prototype.draw_stack_num = function(ctx, font, stack_width, index) { - var image, image_ctx, text_length; - if (index >= this.stack_num_cache.length) { - image = document.createElement("canvas"); - // measure the text - image_ctx = image.getContext('2d'); - image_ctx.save(); - image_ctx.font = font; - text_length = image_ctx.measureText("" + (index + 1)).width; - image_ctx.restore(); - // resize the canvas to fit - image.width = Math.ceil(stack_width); - image.height = Math.ceil(text_length); - // draw the text - image_ctx = image.getContext('2d'); - image_ctx.translate(Math.round(stack_width / 2), 0); - image_ctx.font = font; - image_ctx.textBaseline = "middle"; - image_ctx.textAlign = "right"; - image_ctx.rotate(-(Math.PI / 2)); - image_ctx.fillText("" + (index + 1), 0, 0); - this.stack_num_cache[index] = image; - } else { - image = this.stack_num_cache[index]; - } - ctx.drawImage(image, 0, 0); -} - -RasterizedAlphabet.prototype.draw_scale_num = function(ctx, font, num) { - var image, image_ctx, text_size, m_length; - if (num >= this.scale_num_cache.length) { - image = document.createElement("canvas"); - // measure the text - image_ctx = image.getContext('2d'); - image_ctx.font = font; - text_size = image_ctx.measureText("" + num); - if (text_size.actualBoundingBoxAscent && text_size.actualBoundingBoxDesent) { - // resize the canvas to fit - image.width = Math.ceil(text_size.width); - image.height = Math.ceil(text_size.actualBoundingBoxAscent + text_size.actualBoundingBoxDesent); - // draw the text - image_ctx = image.getContext('2d'); - image_ctx.font = font; - image_ctx.textAlign = "right"; - image_ctx.fillText("" + num, image.width, text_size.actualBoundingBoxAscent); - } else { - // measure width of 'm' to approximate height, we double it later anyway - m_length = image_ctx.measureText("m").width; - // resize the canvas to fit - image.width = Math.ceil(text_size.width); - image.height = Math.ceil(2 * m_length); - // draw the text - image_ctx = image.getContext('2d'); - image_ctx.font = font; - image_ctx.textAlign = "right"; - image_ctx.textBaseline = "middle"; - image_ctx.fillText("" + num, image.width, m_length); - } - this.scale_num_cache[num] = image; - } else { - image = this.scale_num_cache[num]; - } - ctx.drawImage(image, -image.width, -Math.round(image.height / 2)) -} - -//====================================================================== -// end RasterizedAlphabet -//====================================================================== - -//====================================================================== -// start LogoMetrics object -//====================================================================== - -var LogoMetrics = function(ctx, logo_columns, logo_rows, has_names, has_finetext, x_axis, y_axis) { - "use strict"; - var i, row_height; - //variable prototypes - this.pad_top = (has_names ? 5 : 0); - this.pad_left = (y_axis ? 10 : 0); - this.pad_right = (has_finetext ? 15 : 0); - this.pad_bottom = 0; - this.pad_middle = 20; - this.name_height = 14; - this.name_font = "bold " + this.name_height + "px Times, sans-serif"; - this.name_spacer = 0; - this.y_axis = y_axis; - this.y_label = "bits"; - this.y_label_height = 12; - this.y_label_font = "bold " + this.y_label_height + "px Helvetica, sans-serif"; - this.y_label_spacer = 3; - this.y_num_height = 12; - this.y_num_width = 0; - this.y_num_font = "bold " + this.y_num_height + "px Helvetica, sans-serif"; - this.y_tic_width = 5; - this.stack_pad_left = 0; - this.stack_font = "bold 25px Helvetica, sans-serif"; - this.stack_height = 90; - this.stack_width = 26; - this.stacks_pad_right = 5; - this.x_axis = x_axis; - this.x_num_above = 2; - this.x_num_height = 12; - this.x_num_width = 0; - this.x_num_font = "bold " + this.x_num_height + "px Helvetica, sans-serif"; - this.fine_txt_height = 6; - this.fine_txt_above = 2; - this.fine_txt_font = "normal " + this.fine_txt_height + "px Helvetica, sans-serif"; - this.letter_metrics = new Array(); - this.summed_width = 0; - this.summed_height = 0; - //calculate the width of the y axis numbers - ctx.font = this.y_num_font; - for (i = 0; i <= 2; i++) { - this.y_num_width = Math.max(this.y_num_width, ctx.measureText("" + i).width); - } - //calculate the width of the x axis numbers (but they are rotated so it becomes height) - if (x_axis == 1) { - ctx.font = this.x_num_font; - for (i = 1; i <= logo_columns; i++) { - this.x_num_width = Math.max(this.x_num_width, ctx.measureText("" + i).width); - } - } else if (x_axis == 0) { - this.x_num_height = 4; - this.x_num_width = 4; - } else { - this.x_num_height = 0; - this.x_num_width = 0; - } - - //calculate how much vertical space we want to draw this - //first we add the padding at the top and bottom since that's always there - this.summed_height += this.pad_top + this.pad_bottom; - //all except the last row have the same amount of space allocated to them - if (logo_rows > 1) { - row_height = this.stack_height + this.pad_middle; - if (has_names) { - row_height += this.name_height; - //the label is allowed to overlap into the spacer - row_height += Math.max(this.y_num_height/2, this.name_spacer); - //the label is allowed to overlap the space used by the other label - row_height += Math.max(this.y_num_height/2, this.x_num_height + this.x_num_above); - } else { - row_height += this.y_num_height/2; - //the label is allowed to overlap the space used by the other label - row_height += Math.max(this.y_num_height/2, this.x_num_height + this.x_num_above); - } - this.summed_height += row_height * (logo_rows - 1); - } - //the last row has the name and fine text below it but no padding - this.summed_height += this.stack_height + (this.y_axis ? this.y_num_height/2 : 0); - - var fine_txt_total = (has_finetext ? this.fine_txt_height + this.fine_txt_above : 0); - if (has_names) { - this.summed_height += fine_txt_total + this.name_height; - this.summed_height += Math.max((this.y_axis ? this.y_num_height/2 : 0), - this.x_num_height + this.x_num_above + this.name_spacer); - } else { - this.summed_height += Math.max((this.y_axis ? this.y_num_height/2 : 0), - this.x_num_height + this.x_num_above + fine_txt_total); - } - - //calculate how much horizontal space we want to draw this - //first add the padding at the left and right since that's always there - this.summed_width += this.pad_left + this.pad_right; - if (this.y_axis) { - //add on the space for the y-axis label - this.summed_width += this.y_label_height + this.y_label_spacer; - //add on the space for the y-axis - this.summed_width += this.y_num_width + this.y_tic_width; - } - //add on the space for the stacks - this.summed_width += (this.stack_pad_left + this.stack_width) * logo_columns; - //add on the padding after the stacks (an offset from the fine text) - this.summed_width += this.stacks_pad_right; - -}; - -//====================================================================== -// end LogoMetrics object -//====================================================================== - -//found this trick at http://talideon.com/weblog/2005/02/detecting-broken-images-js.cfm -function image_ok(img) { - "use strict"; - // During the onload event, IE correctly identifies any images that - // weren't downloaded as not complete. Others should too. Gecko-based - // browsers act like NS4 in that they report this incorrectly. - if (!img.complete) { - return false; - } - // However, they do have two very useful properties: naturalWidth and - // naturalHeight. These give the true size of the image. If it failed - // to load, either of these should be zero. - if (typeof img.naturalWidth !== "undefined" && img.naturalWidth === 0) { - return false; - } - // No other way of checking: assume it's ok. - return true; -} - -function supports_text(ctx) { - "use strict"; - if (!ctx.fillText) { - return false; - } - if (!ctx.measureText) { - return false; - } - return true; -} - -//draws the scale, returns the width -function draw_scale(ctx, metrics, alphabet_ic, raster) { - "use strict"; - var tic_height, i; - tic_height = metrics.stack_height / alphabet_ic; - ctx.save(); - ctx.translate(metrics.y_label_height, metrics.y_num_height/2); - //draw the axis label - ctx.save(); - ctx.font = metrics.y_label_font; - ctx.translate(0, metrics.stack_height/2); - ctx.rotate(-(Math.PI / 2)); - ctx.textAlign = "center"; - ctx.fillText("bits", 0, 0); - ctx.restore(); - - ctx.translate(metrics.y_label_spacer + metrics.y_num_width, 0); - - //draw the axis tics - ctx.save(); - ctx.translate(0, metrics.stack_height); - for (i = 0; i <= alphabet_ic; i++) { - //draw the number - ctx.save(); - ctx.translate(-1, 0); - raster.draw_scale_num(ctx, metrics.y_num_font, i); - ctx.restore(); - //draw the tic - ctx.fillRect(0, -1, metrics.y_tic_width, 2); - //prepare for next tic - ctx.translate(0, -tic_height); - } - ctx.restore(); - - ctx.fillRect(metrics.y_tic_width - 2, 0, 2, metrics.stack_height) - - ctx.restore(); -} - -function draw_stack_num(ctx, metrics, row_index, raster) { - "use strict"; - ctx.save(); - ctx.translate(0, Math.round(metrics.stack_height + metrics.x_num_above)); - if (metrics.x_axis == 1) { - raster.draw_stack_num(ctx, metrics.x_num_font, metrics.stack_width, row_index); - } else if (metrics.x_axis == 0) { - // draw dots instead of the numbers (good for small logos) - ctx.beginPath(); - var radius = Math.round(metrics.x_num_height / 2); - ctx.arc(Math.round(metrics.stack_width / 2), radius, radius, 0, 2 * Math.PI, false); - ctx.fill(); - } - ctx.restore(); -} - -function draw_stack(ctx, metrics, symbols, raster) { - "use strict"; - var preferred_pad, sym_min, i, sym, sym_height, pad; - preferred_pad = 0; - sym_min = 5; - - ctx.save();//1 - ctx.translate(0, metrics.stack_height); - for (i = 0; i < symbols.length; i++) { - sym = symbols[i]; - sym_height = metrics.stack_height * sym.get_scale(); - - pad = preferred_pad; - if (sym_height - pad < sym_min) { - pad = Math.min(pad, Math.max(0, sym_height - sym_min)); - } - sym_height -= pad; - - //translate to the correct position - ctx.translate(0, -(pad/2 + sym_height)); - - //draw - raster.draw_stack_sym(ctx, sym.get_symbol(), 0, 0, metrics.stack_width, sym_height); - //translate past the padding - ctx.translate(0, -(pad/2)); - } - ctx.restore();//1 -} - -function draw_dashed_line(ctx, pattern, start, x1, y1, x2, y2) { - "use strict"; - var x, y, len, i, dx, dy, tlen, theta, mulx, muly, lx, ly; - dx = x2 - x1; - dy = y2 - y1; - tlen = Math.pow(dx*dx + dy*dy, 0.5); - theta = Math.atan2(dy,dx); - mulx = Math.cos(theta); - muly = Math.sin(theta); - lx = []; - ly = []; - for (i = 0; i < pattern; ++i) { - lx.push(pattern[i] * mulx); - ly.push(pattern[i] * muly); - } - i = start; - x = x1; - y = y1; - len = 0; - ctx.beginPath(); - while (len + pattern[i] < tlen) { - ctx.moveTo(x, y); - x += lx[i]; - y += ly[i]; - ctx.lineTo(x, y); - len += pattern[i]; - i = (i + 1) % pattern.length; - x += lx[i]; - y += ly[i]; - len += pattern[i]; - i = (i + 1) % pattern.length; - } - if (len < tlen) { - ctx.moveTo(x, y); - x += mulx * (tlen - len); - y += muly * (tlen - len); - ctx.lineTo(x, y); - } - ctx.stroke(); -} - -function draw_trim_background(ctx, metrics, left_start, left_end, left_divider, right_start, right_end, right_divider) { - "use strict"; - var left_size = left_end - left_start; - var right_size = right_end - right_start; - var line_x; - - ctx.save();//s8 - ctx.fillStyle = "rgb(240, 240, 240)"; - if (left_size > 0) { - ctx.fillRect(left_start * metrics.stack_width, 0, left_size * metrics.stack_width, metrics.stack_height); - } - if (right_size > 0) { - ctx.fillRect(right_start * metrics.stack_width, 0, right_size * metrics.stack_width, metrics.stack_height); - } - ctx.fillStyle = "rgb(51, 51, 51)"; - if (left_size > 0 && left_divider) { - line_x = (left_end * metrics.stack_width) - 0.5; - draw_dashed_line(ctx, [3], 0, line_x, 0, line_x, metrics.stack_height); - } - if (right_size > 0 && right_divider) { - line_x = (right_start * metrics.stack_width) + 0.5; - draw_dashed_line(ctx, [3], 0, line_x, 0, line_x, metrics.stack_height); - } - ctx.restore();//s8 -} - -function size_logo_on_canvas(logo, canvas, show_names, scale) { - "use strict"; - var draw_name, draw_finetext, metrics; - draw_name = (typeof show_names === "boolean" ? show_names : (logo.get_rows() > 1)); - draw_finetext = (logo.fine_text.length > 0); - if (canvas.width !== 0 && canvas.height !== 0) { - return; - } - metrics = new LogoMetrics(canvas.getContext('2d'), - logo.get_xlate_columns(), logo.get_rows(), draw_name, draw_finetext, logo.x_axis, logo.y_axis); - if (typeof scale == "number") { - //resize the canvas to fit the scaled logo - canvas.width = metrics.summed_width * scale; - canvas.height = metrics.summed_height * scale; - } else { - if (canvas.width === 0 && canvas.height === 0) { - canvas.width = metrics.summed_width; - canvas.height = metrics.summed_height; - } else if (canvas.width === 0) { - canvas.width = metrics.summed_width * (canvas.height / metrics.summed_height); - } else if (canvas.height === 0) { - canvas.height = metrics.summed_height * (canvas.width / metrics.summed_width); - } - } -} -function draw_logo_on_canvas(logo, canvas, show_names, scale) { - "use strict"; - var i, draw_name, draw_finetext, ctx, metrics, raster, pspm_i, pspm, - offset, col_index, motif_position, ssc; - ssc = false; - draw_name = (typeof show_names === "boolean" ? show_names : (logo.get_rows() > 1)); - draw_finetext = (logo.fine_text.length > 0); - ctx = canvas.getContext('2d'); - //assume that the user wants the canvas scaled equally so calculate what the best width for this image should be - metrics = new LogoMetrics(ctx, logo.get_xlate_columns(), logo.get_rows(), draw_name, draw_finetext, logo.x_axis, logo.y_axis); - if (typeof scale == "number") { - //resize the canvas to fit the scaled logo - canvas.width = metrics.summed_width * scale; - canvas.height = metrics.summed_height * scale; - } else { - if (canvas.width === 0 && canvas.height === 0) { - scale = 1; - canvas.width = metrics.summed_width; - canvas.height = metrics.summed_height; - } else if (canvas.width === 0) { - scale = canvas.height / metrics.summed_height; - canvas.width = metrics.summed_width * scale; - } else if (canvas.height === 0) { - scale = canvas.width / metrics.summed_width; - canvas.height = metrics.summed_height * scale; - } else { - scale = Math.min(canvas.width / metrics.summed_width, canvas.height / metrics.summed_height); - } - } - // cache the raster based on the assumption that we will be drawing a lot - // of logos the same size and alphabet - if (typeof draw_logo_on_canvas.raster_cache === "undefined") { - draw_logo_on_canvas.raster_cache = []; - } - for (i = 0; i < draw_logo_on_canvas.raster_cache.length; i++) { - raster = draw_logo_on_canvas.raster_cache[i]; - if (raster.get_alphabet().equals(logo.alphabet) && - Math.abs(raster.get_scale() - scale) < 0.1) break; - raster = null; - } - if (raster == null) { - raster = new RasterizedAlphabet(logo.alphabet, scale, metrics.stack_font, metrics.stack_width); - draw_logo_on_canvas.raster_cache.push(raster); - } - ctx = canvas.getContext('2d'); - ctx.save();//s1 - ctx.scale(scale, scale); - ctx.save();//s2 - ctx.save();//s7 - //create margin - ctx.translate(Math.round(metrics.pad_left), Math.round(metrics.pad_top)); - for (pspm_i = 0; pspm_i < logo.get_rows(); ++pspm_i) { - pspm = logo.get_pspm(pspm_i); - offset = logo.get_offset(pspm_i); - //optionally draw name if this isn't the last row or is the only row - if (draw_name && (logo.get_rows() == 1 || pspm_i != (logo.get_rows()-1))) { - ctx.save();//s4 - ctx.translate(Math.round(metrics.summed_width/2), Math.round(metrics.name_height)); - ctx.font = metrics.name_font; - ctx.textAlign = "center"; - ctx.fillText(pspm.name, 0, 0); - ctx.restore();//s4 - ctx.translate(0, Math.round(metrics.name_height + - Math.min(0, metrics.name_spacer - metrics.y_num_height/2))); - } - //draw scale - if (logo.y_axis) draw_scale(ctx, metrics, logo.alphabet.get_ic(), raster); - ctx.save();//s5 - //translate across past the scale - if (logo.y_axis) { - ctx.translate(Math.round(metrics.y_label_height + metrics.y_label_spacer + - metrics.y_num_width + metrics.y_tic_width), Math.round(metrics.y_num_height / 2)); - } - //draw the trimming background - if (pspm.get_left_trim() > 0 || pspm.get_right_trim() > 0) { - var left_start = offset * logo.get_xlate_nsyms(); - var left_end = (offset + pspm.get_left_trim()) * logo.get_xlate_nsyms(); - var left_divider = true; - if (left_end < logo.get_xlate_start() || left_start > logo.get_xlate_end()) { - // no overlap - left_start = 0; - left_end = 0; - left_divider = false; - } else { - if (left_start < logo.get_xlate_start()) { - left_start = logo.get_xlate_start(); - } - if (left_end > logo.get_xlate_end()) { - left_end = logo.get_xlate_end(); - left_divider = false; - } - left_start -= logo.get_xlate_start(); - left_end -= logo.get_xlate_start(); - if (left_end < left_start) { - left_start = 0; - left_end = 0; - left_divider = false; - } - } - var right_end = (offset + pspm.get_motif_length()) * logo.get_xlate_nsyms(); - //var right_start = right_end - (pspm.get_left_trim() * logo.get_xlate_nsyms()); - var right_start = right_end - (pspm.get_right_trim() * logo.get_xlate_nsyms()); - var right_divider = true; - if (right_end < logo.get_xlate_start() || right_start > logo.get_xlate_end()) { - // no overlap - right_start = 0; - right_end = 0; - right_divider = false; - } else { - if (right_start < logo.get_xlate_start()) { - right_start = logo.get_xlate_start(); - right_divider = false; - } - if (right_end > logo.get_xlate_end()) { - right_end = logo.get_xlate_end(); - } - right_start -= logo.get_xlate_start(); - right_end -= logo.get_xlate_start(); - if (right_end < right_start) { - right_start = 0; - right_end = 0; - right_divider = false; - } - } - draw_trim_background(ctx, metrics, left_start, left_end, left_divider, right_start, right_end, right_divider); - } - //draw letters - var xlate_col; - for (xlate_col = logo.get_xlate_start(); xlate_col < logo.get_xlate_end(); xlate_col++) { - ctx.translate(metrics.stack_pad_left,0); - col_index = Math.floor(xlate_col / logo.get_xlate_nsyms()); - if (xlate_col % logo.get_xlate_nsyms() == 0) { - if (col_index >= offset && col_index < (offset + pspm.get_motif_length())) { - motif_position = col_index - offset; - draw_stack_num(ctx, metrics, motif_position, raster); - draw_stack(ctx, metrics, pspm.get_stack(motif_position, logo.alphabet, ssc), raster); - } - } else { - if (col_index >= offset && col_index < (offset + pspm.get_motif_length())) { - ctx.save();// s5.1 - ctx.translate(0, Math.round(metrics.stack_height)); - // TODO draw a dot or dash or something to indicate continuity of the motif - ctx.restore(); //s5.1 - } - } - ctx.translate(Math.round(metrics.stack_width), 0); - } - ctx.restore();//s5 - ////optionally draw name if this is the last row but isn't the only row - if (draw_name && (logo.get_rows() != 1 && pspm_i == (logo.get_rows()-1))) { - //translate vertically past the stack and axis's - ctx.translate(0, metrics.y_num_height/2 + metrics.stack_height + - Math.max(metrics.y_num_height/2, metrics.x_num_above + metrics.x_num_width + metrics.name_spacer)); - - ctx.save();//s6 - ctx.translate(metrics.summed_width/2, metrics.name_height); - ctx.font = metrics.name_font; - ctx.textAlign = "center"; - ctx.fillText(pspm.name, 0, 0); - ctx.restore();//s6 - ctx.translate(0, metrics.name_height); - } else { - //translate vertically past the stack and axis's - ctx.translate(0, metrics.y_num_height/2 + metrics.stack_height + - Math.max(metrics.y_num_height/2, metrics.x_num_above + metrics.x_num_width)); - } - //if not the last row then add middle padding - if (pspm_i != (logo.get_rows() -1)) { - ctx.translate(0, metrics.pad_middle); - } - } - ctx.restore();//s7 - if (logo.fine_text.length > 0) { - ctx.translate(metrics.summed_width - metrics.pad_right, metrics.summed_height - metrics.pad_bottom); - ctx.font = metrics.fine_txt_font; - ctx.textAlign = "right"; - ctx.fillText(logo.fine_text, 0,0); - } - ctx.restore();//s2 - ctx.restore();//s1 -} - -function create_canvas(c_width, c_height, c_id, c_title, c_display) { - "use strict"; - var canvas = document.createElement("canvas"); - //check for canvas support before attempting anything - if (!canvas.getContext) { - return null; - } - var ctx = canvas.getContext('2d'); - //check for html5 text drawing support - if (!supports_text(ctx)) { - return null; - } - //size the canvas - canvas.width = c_width; - canvas.height = c_height; - canvas.id = c_id; - canvas.title = c_title; - canvas.style.display = c_display; - return canvas; -} - -function logo_1(alphabet, fine_text, pspm) { - "use strict"; - var logo = new Logo(alphabet, fine_text); - logo.add_pspm(pspm); - return logo; -} - -function logo_2(alphabet, fine_text, target, query, query_offset) { - "use strict"; - var logo = new Logo(alphabet, fine_text); - if (query_offset < 0) { - logo.add_pspm(target, -query_offset); - logo.add_pspm(query); - } else { - logo.add_pspm(target); - logo.add_pspm(query, query_offset); - } - return logo; -} - -/* - * Specifies an alternate source for an image. - * If the image with the image_id specified has - * not loaded then a generated logo will be used - * to replace it. - * - * Note that the image must either have dimensions - * or a scale must be set. - */ -function alternate_logo(logo, image_id, scale) { - "use strict"; - var image = document.getElementById(image_id); - if (!image) { - alert("Can't find specified image id (" + image_id + ")"); - return; - } - //if the image has loaded then there is no reason to use the canvas - if (image_ok(image)) { - return; - } - //the image has failed to load so replace it with a canvas if we can. - var canvas = create_canvas(image.width, image.height, image_id, image.title, image.style.display); - if (canvas === null) { - return; - } - //draw the logo on the canvas - draw_logo_on_canvas(logo, canvas, null, scale); - //replace the image with the canvas - image.parentNode.replaceChild(canvas, image); -} - -/* - * Specifes that the element with the specified id - * should be replaced with a generated logo. - */ -function replace_logo(logo, replace_id, scale, title_txt, display_style) { - "use strict"; - var element = document.getElementById(replace_id); - if (!replace_id) { - alert("Can't find specified id (" + replace_id + ")"); - return; - } - //found the element! - var canvas = create_canvas(50, 120, replace_id, title_txt, display_style); - if (canvas === null) { - return; - } - //draw the logo on the canvas - draw_logo_on_canvas(logo, canvas, null, scale); - //replace the element with the canvas - element.parentNode.replaceChild(canvas, element); -} - -/* - * Fast string trimming implementation found at - * http://blog.stevenlevithan.com/archives/faster-trim-javascript - * - * Note that regex is good at removing leading space but - * bad at removing trailing space as it has to first go through - * the whole string. - */ -function trim (str) { - "use strict"; - var ws, i; - str = str.replace(/^\s\s*/, ''); - ws = /\s/; i = str.length; - while (ws.test(str.charAt(--i))); - return str.slice(0, i + 1); -} -</script> - <script> - -// PRIVATE GLOBAL (uhoh) -var _block_colour_lookup = {}; - -function block_colour(index) { - function hsl2rgb(hue, saturation, lightness) { - "use strict"; - function _hue(p, q, t) { - "use strict"; - if (t < 0) t += 1; - else if (t > 1) t -= 1; - if (t < (1.0 / 6.0)) { - return p + ((q - p) * 6.0 * t); - } else if (t < 0.5) { - return q; - } else if (t < (2.0 / 3.0)) { - return p + ((q - p) * ((2.0 / 3.0) - t) * 6.0); - } else { - return p; - } - } - function _pad_hex(value) { - var hex = Math.round(value * 255).toString(16); - if (hex.length < 2) hex = "0" + hex; - return hex; - } - var r, g, b, p, q; - if (saturation == 0) { - // achromatic (grayscale) - r = lightness; - g = lightness; - b = lightness; - } else { - if (lightness < 0.5) { - q = lightness * (1 + saturation); - } else { - q = lightness + saturation - (lightness * saturation); - } - p = (2 * lightness) - q; - r = _hue(p, q, hue + (1.0 / 3.0)); - g = _hue(p, q, hue); - b = _hue(p, q, hue - (1.0 / 3.0)); - } - return "#" + _pad_hex(r) + _pad_hex(g) + _pad_hex(b); - } - if (typeof index !== "number" || index % 1 !== 0 || index < 0) return "#000000"; - // check for override - if (_block_colour_lookup[index] == null) { - var start = 0; //red - var sat = 100; - var light = 50; - var divisions = 1 << Math.ceil(Math.log(index + 1) / Math.LN2); - hue = start + (360 / divisions) * ((index - (divisions >> 1)) * 2 + 1); - // colour input fields only support values in the form #RRGGBB - _block_colour_lookup[index] = hsl2rgb(hue / 360, sat / 100, light / 100); - } - return _block_colour_lookup[index]; -} - -function set_block_colour(index, new_colour) { - _block_colour_lookup[index] = new_colour; - var blocks = document.querySelectorAll("div.block_motif[data-colour-index=\"" + index + "\"]"); - var i; - for (i = 0; i < blocks.length; i++) { - blocks[i].style.backgroundColor = new_colour; - } - var swatches = document.querySelectorAll("div.legend_swatch[data-colour-index=\"" + index + "\"]"); - var picker; - for (i = 0; i < swatches.length; i++) { - swatches[i].style.backgroundColor = new_colour; - picker = swatches[i].querySelector("input[type=\"color\"]"); - if (picker != null) picker.value = new_colour; - } -} - -function make_block_legend_entry(motif_name, motif_colour_index) { - if (typeof make_block_legend_entry.has_colour_picker !== "boolean") { - // test if colour picker is supported, based off Modernizer - // see http://stackoverflow.com/a/7787648/66387 - make_block_legend_entry.has_colour_picker = (function() { - var doc_ele = document.documentElement; - // We first check to see if the type we give it sticks.. - var input_ele = document.createElement('input'); - input_ele.setAttribute('type', 'color'); - var value_ok = input_ele.type !== 'text'; - if (value_ok) { - // If the type does, we feed it a textual value, which shouldn't be valid. - // If the value doesn't stick, we know there's input sanitization which infers a custom UI - var smile = ':)'; - input_ele.value = smile; - input_ele.style.cssText = 'position:absolute;visibility:hidden;'; - // chuck into DOM and force reflow for Opera bug in 11.00 - // github.com/Modernizr/Modernizr/issues#issue/159 - doc_ele.appendChild(input_ele); - doc_ele.offsetWidth; - value_ok = input_ele.value != smile; - doc_ele.removeChild(input_ele); - } - return value_ok; - })(); - } - var entry = document.createElement("div"); - entry.className = "legend_entry"; - var swatch; - swatch = document.createElement("div"); - swatch.className = "legend_swatch"; - swatch.setAttribute("data-colour-index", motif_colour_index); - swatch.style.backgroundColor = block_colour(motif_colour_index); - if (make_block_legend_entry.has_colour_picker) { - var picker = document.createElement("input"); - picker.type = "color"; - picker.value = block_colour(motif_colour_index); - picker.addEventListener("change", function(e) { - set_block_colour(motif_colour_index, picker.value); - }, false); - swatch.addEventListener("click", function(e) { - picker.click(); - }, false); - swatch.appendChild(picker); - } - entry.appendChild(swatch); - var name = document.createElement("div"); - name.className = "legend_text"; - name.appendChild(document.createTextNode(motif_name)); - entry.appendChild(name); - return entry; -} - -function make_block_ruler(max_len) { - var container = document.createElement("div"); - container.className = "block_container"; - var step; - if (max_len < 50) { - step = 1; - } else if (max_len < 100) { - step = 2; - } else if (max_len < 200) { - step = 4; - } else if (max_len < 500) { - step = 10; - } else if (max_len < 1000) { - step = 20; - } else if (max_len < 2000) { - step = 40; - } else if (max_len < 5000) { - step = 100; - } else if (max_len < 10000) { - step = 200; - } else if (max_len < 20000) { - step = 400; - } else { - step = Math.floor(max_len / 20000) * 400; - } - var peroid; - if (max_len < 10) { - peroid = 1; - } else if (max_len < 20) { - peroid = 2; - } else { - peroid = 5; - } - var i, cycle, offset, tic, label; - for (i = 0, cycle = 0; i < max_len; i += step, cycle = (cycle + 1) % peroid) { - offset = "" + ((i / max_len) * 100) + "%"; - tic = document.createElement("div"); - tic.style.left = offset; - tic.className = (cycle == 0 ? "tic_major" : "tic_minor"); - container.appendChild(tic); - if (cycle == 0) { - label = document.createElement("div"); - label.className = "tic_label"; - label.style.left = offset; - label.appendChild(document.createTextNode(i)); - container.appendChild(label); - } - } - return container; -} - -function _calculate_block_needle_drag_pos(e, data) { - var mouse; - e = e || window.event; - if (e.pageX || ev.pageY) { - mouse = {"x": e.pageX, "y": e.pageY}; - } else { - mouse = { - x:e.clientX + document.body.scrollLeft - document.body.clientLeft, - y:e.clientY + document.body.scrollTop - document.body.clientTop - }; - } - var cont = data.container; - var dragable_length = cont.clientWidth - - (cont.style.paddingLeft ? cont.style.paddingLeft : 0) - - (cont.style.paddingRight ? cont.style.paddingRight : 0); - //I believe that the offset parent is the body - //otherwise I would need to make this recursive - //maybe clientLeft would work, but the explanation of - //it is hard to understand and it apparently doesn't work - //in firefox 2. - var diff = mouse.x - cont.offsetLeft; - if (diff < 0) diff = 0; - if (diff > dragable_length) diff = dragable_length; - var pos = Math.round(diff / dragable_length * data.max); - if (pos > data.len) pos = data.len; - return pos; -} - -function _update_block_needle_drag(e, data, done) { - "use strict"; - var pos = _calculate_block_needle_drag_pos(e, data); - // read the needle positions - var left = parseInt(data.llabel.textContent, 10) - data.off - 1; - var right = parseInt(data.rlabel.textContent, 10) - data.off; - // validate needle positions - if (left >= data.len) left = data.len - 1; - if (left < 0) left = 0; - if (right > data.len) right = data.len; - if (right <= left) right = left + 1; - // calculate the new needle positions - if (data.moveboth) { - var size = right - left; - if (data.isleft) { - if ((pos + size) > data.len) pos = data.len - size; - left = pos; - right = pos + size; - } else { - if ((pos - size) < 0) pos = size; - left = pos - size; - right = pos; - } - } else { - if (data.isleft) { - if (pos >= right) pos = right - 1; - left = pos; - } else { - if (pos <= left) pos = left + 1; - right = pos; - } - } - // update the needle positions - data.lneedle.style.left = "" + (left / data.max * 100) + "%"; - data.llabel.textContent = "" + (left + data.off + 1); - data.rneedle.style.left = "" + (right / data.max * 100) + "%"; - data.rlabel.textContent = "" + (right + data.off); - data.handler(left, right, done); -} - -function _make_block_needle_drag_start_handler(isleft, data) { - return function (e) { - data.isleft = isleft; - data.moveboth = !(e.shiftKey); - document.addEventListener("mousemove", data.drag_during, false); - document.addEventListener("mouseup", data.drag_end, false); - }; -} - -function _make_block_needle_drag_end_handler(data) { - return function (e) { - document.removeEventListener("mousemove", data.drag_during, false); - document.removeEventListener("mouseup", data.drag_end, false); - _update_block_needle_drag(e, data, true); - }; -} - -function _make_block_needle_drag_during_handler(data) { - return function (e) { - _update_block_needle_drag(e, data, false); - }; -} - -// private function used by make_block_container -function _make_block_needle(isleft, value, data) { - var vbar = document.createElement('div'); - vbar.className = "block_needle " + (isleft ? "left" : "right"); - vbar.style.left = "" + (value / data.max * 100)+ "%"; - var label = document.createElement('div'); - label.className = "block_handle " + (isleft ? "left" : "right"); - // The needles sit between the sequence positions, so the left one sits at the - // start and the right at the end. This is why 1 is added to the displayed - // value for a left handle as the user doesn't need to know about this detail - label.textContent = "" + (isleft ? value + data.off + 1 : value + data.off); - label.unselectable = "on"; // so IE and Opera don't select the text, others are done in css - label.title = "Drag to move the displayed range. Hold shift and drag to change " + (isleft ? "lower" : "upper") + " bound of the range."; - vbar.appendChild(label); - if (isleft) { - data.lneedle = vbar; - data.llabel = label; - } else { - data.rneedle = vbar; - data.rlabel = label; - } - label.addEventListener("mousedown", _make_block_needle_drag_start_handler(isleft, data), false); - return vbar; -} - -function make_block_container(is_stranded, has_both_strands, max_len, show_len, offset, range_handler) { - offset = (offset != null ? offset : 0); - // make the container for the block diagram - var container = document.createElement("div"); - container.className = "block_container"; - container.setAttribute("data-max", max_len); - container.setAttribute("data-off", offset); - if (is_stranded) { - var plus = document.createElement("div"); - plus.appendChild(document.createTextNode("+")); - plus.className = "block_plus_sym"; - container.appendChild(plus); - if (has_both_strands) { - var minus = document.createElement("div"); - minus.appendChild(document.createTextNode("-")); - minus.className = "block_minus_sym"; - container.appendChild(minus); - } - } - var rule = document.createElement("div"); - rule.className = "block_rule"; - rule.style.width = ((show_len / max_len) * 100) + "%"; - container.appendChild(rule); - if (range_handler != null) { - var range_data = { - "max": max_len, - "len": show_len, - "off": offset, - "handler": range_handler, - "container": container, - "lneedle": null, "llabel": null, - "rneedle": null, "rlabel": null, - "isleft": false, "moveboth" : false - }; - range_data.drag_during = _make_block_needle_drag_during_handler(range_data); - range_data.drag_end = _make_block_needle_drag_end_handler(range_data); - container.appendChild(_make_block_needle(false, 1, range_data)); // add right first so z-index works - container.appendChild(_make_block_needle(true, 0, range_data)); - } - return container; -} - -function make_block_label(container, max_len, pos, length, message) { - "use strict"; - var label = document.createElement("div"); - label.className = "block_label"; - label.style.left = (((pos + (length / 2)) / max_len) * 100) + "%"; - label.appendChild(document.createTextNode(message)); - container.appendChild(label); -} - -function make_block(container, max_len, - site_pos, site_len, site_pvalue, site_rc, site_colour_index, site_secondary) { - "use strict"; - var block_height, block, block_region1, block_region2; - var max_block_height = 12; - var max_pvalue = 1e-10; - // calculate the height of the block - block_height = (site_pvalue < max_pvalue ? max_block_height : - (Math.log(site_pvalue) / Math.log(max_pvalue)) * max_block_height); - if (block_height < 1) block_height = 1; - // create a block to represent the motif - block = document.createElement("div"); - block.className = "block_motif" + (site_secondary ? " scanned_site" : "") + (site_rc ? " bottom" : " top"); - block.style.left = ((site_pos / max_len) * 100) + "%"; - block.style.top = (!site_rc ? max_block_height - block_height : - max_block_height + 1) + "px"; - block.style.width = ((site_len / max_len) * 100) + "%"; - block.style.height = block_height + "px"; - block.style.backgroundColor = block_colour(site_colour_index); - block.setAttribute("data-colour-index", site_colour_index); - // add to container - container.appendChild(block); - var activator = function (e) { - toggle_class(block, "active", true); - var new_e = new e.constructor(e.type, e); - block.dispatchEvent(new_e); - }; - var deactivator = function (e) { - toggle_class(block, "active", false); - var new_e = new e.constructor(e.type, e); - block.dispatchEvent(new_e); - } - // create a larger region to detect mouseover for the block - block_region1 = document.createElement("div"); - block_region1.className = "block_region top" + - (site_secondary ? " scanned_site" : "") + (site_rc ? "" : " main"); - block_region1.style.left = block.style.left; - block_region1.style.width = block.style.width; - block_region1.addEventListener('mouseover', activator, false); - block_region1.addEventListener('mouseout', deactivator, false); - container.appendChild(block_region1); - block_region2 = document.createElement("div"); - block_region2.className = "block_region bottom" + - (site_secondary ? " scanned_site" : "") + (site_rc ? " main" : ""); - block_region2.style.left = block.style.left; - block_region2.style.width = block.style.width; - block_region2.addEventListener('mouseover', activator, false); - block_region2.addEventListener('mouseout', deactivator, false); - container.appendChild(block_region2); - return block; -} - -function set_block_needle_positions(containingNode, start, end) { - var container, lneedle, llabel, rneedle, rlabel, max, off, left, right; - container = (/\bblock_container\b/.test(containingNode.className) ? containingNode : containingNode.querySelector(".block_container")); - max = parseInt(container.getAttribute("data-max"), 10); - off = parseInt(container.getAttribute("data-off"), 10); - left = start - off; - right = end - off; - lneedle = containingNode.querySelector(".block_needle.left"); - llabel = lneedle.querySelector(".block_handle.left"); - rneedle = containingNode.querySelector(".block_needle.right"); - rlabel = rneedle.querySelector(".block_handle.right"); - // update the needle positions - lneedle.style.left = "" + (left / max * 100) + "%"; - llabel.textContent = "" + (left + off + 1); - rneedle.style.left = "" + (right / max * 100) + "%"; - rlabel.textContent = "" + (right + off); -} - -function get_block_needle_positions(containingNode) { - var container, llabel, rlabel, max, off, left, right; - container = (/\bblock_container\b/.test(containingNode.className) ? containingNode : containingNode.querySelector(".block_container")); - max = parseInt(container.getAttribute("data-max"), 10); - off = parseInt(container.getAttribute("data-off"), 10); - llabel = containingNode.querySelector(".block_needle.left > .block_handle.left"); - rlabel = containingNode.querySelector(".block_needle.right > .block_handle.right"); - left = parseInt(llabel.textContent, 10) - off - 1; - right = parseInt(rlabel.textContent, 10) - off; - return {"start": left + off, "end": right + off}; -} -</script> - <script> -function make_alpha_bg_table(alph, freqs) { - function colour_symbol(index) { - var span = document.createElement("span"); - span.appendChild(document.createTextNode(alph.get_symbol(index))); - span.style.color = alph.get_colour(index); - span.className = "alpha_symbol"; - return span; - } - var table, thead, tbody, row, th, span, i; - // create table - table = document.createElement("table"); - table.className = "alpha_bg_table"; - // create header - thead = document.createElement("thead"); - table.appendChild(thead); - row = thead.insertRow(thead.rows.length); - if (alph.has_complement()) { - add_text_header_cell(row, "Name", "pop_alph_name"); - if (freqs != null) add_text_header_cell(row, "Freq.", "pop_alph_freq"); - if (alph.has_bg()) add_text_header_cell(row, "Bg.", "pop_alph_bg"); - add_text_header_cell(row, ""); - add_text_header_cell(row, ""); - add_text_header_cell(row, ""); - if (alph.has_bg()) add_text_header_cell(row, "Bg.", "pop_alph_bg"); - if (freqs != null) add_text_header_cell(row, "Freq.", "pop_alph_freq"); - add_text_header_cell(row, "Name", "pop_alph_name"); - } else { - add_text_header_cell(row, ""); - add_text_header_cell(row, "Name", "pop_alph_name"); - if (freqs != null) add_text_header_cell(row, "Freq.", "pop_alph_freq"); - if (alph.has_bg()) add_text_header_cell(row, "Bg.", "pop_alph_bg"); - } - // add alphabet entries - tbody = document.createElement("tbody"); - table.appendChild(tbody); - if (alph.has_complement()) { - for (i = 0; i < alph.get_size_core(); i++) { - var c = alph.get_complement(i); - if (i > c) continue; - row = tbody.insertRow(tbody.rows.length); - add_text_cell(row, alph.get_name(i)); - if (freqs != null) add_text_cell(row, "" + freqs[i].toFixed(3)); - if (alph.has_bg()) add_text_cell(row, "" + alph.get_bg_freq(i).toFixed(3)); - add_cell(row, colour_symbol(i)); - add_text_cell(row, "~"); - add_cell(row, colour_symbol(c)); - if (alph.has_bg()) add_text_cell(row, "" + alph.get_bg_freq(c).toFixed(3)); - if (freqs != null) add_text_cell(row, "" + freqs[c].toFixed(3)); - add_text_cell(row, alph.get_name(c)); - } - } else { - for (i = 0; i < alph.get_size_core(); i++) { - row = tbody.insertRow(tbody.rows.length); - add_cell(row, colour_symbol(i)); - add_text_cell(row, alph.get_name(i)); - if (freqs != null) add_text_cell(row, "" + freqs[i].toFixed(3)); - if (alph.has_bg()) add_text_cell(row, "" + alph.get_bg_freq(i).toFixed(3)); - } - } - return table; -} - -</script> - <script> -var current_motif = 0; -var meme_alphabet = new Alphabet(data.alphabet, data.background.freqs); - -var DelayLogoTask = function(logo, canvas) { - this.logo = logo; - this.canvas = canvas; -}; - -DelayLogoTask.prototype.run = function () { - draw_logo_on_canvas(this.logo, this.canvas, false); -}; - -function motif_pspm(index) { - var motif, pwm, psm, name, ltrim, rtrim, nsites, evalue; - // get motif - motif = data["motifs"][index]; - // get motif paramters - pwm = motif["pwm"]; - psm = motif["psm"]; - name = "" + (index + 1); ltrim = 0; rtrim = 0; - nsites = motif["nsites"]; evalue = motif["evalue"]; - // make pspm - return new Pspm(pwm, name, ltrim, rtrim, nsites, evalue, psm); -} - -function motif_count_matrix(index) { - return motif_pspm(index).as_count_matrix(); -} - -function motif_prob_matrix(index) { - return motif_pspm(index).as_probability_matrix(); -} - -function motif_minimal_meme(index) { - return motif_pspm(index).as_meme({ - "with_header": true, - "with_pspm": true, - "with_pssm": true, - "version": data["version"], - "alphabet": meme_alphabet, - "strands": (meme_alphabet.has_complement() && data.options.revcomp ? 2 : 1) - }); -} - -function motif_fasta(index) { - "use strict"; - var motif, sites, site, seq, sequences, sequence, i, num, counter, out; - counter = {}; - sequences = data["sequence_db"]["sequences"]; - motif = data["motifs"][index]; - sites = motif["sites"]; - out = ""; - for (i = 0; i < sites.length; i++) { - site = sites[i]; - seq = site["seq"]; - sequence = sequences[seq]; - counter[seq] = (num = counter[seq]) ? (++num) : (num = 1); // inc counter - if (i !== 0) {out += "\n";} - out += ">" + sequence["name"] + "_site_" + num + " offset= " + site["pos"] + - (site["rc"] ? " RC\n" : "\n"); - out += site["match"]; - } - return out; -} - -function motif_raw(index) { - "use strict"; - var sites, i, out; - sites = data["motifs"][index]["sites"]; - out = ""; - for (i = 0; i < sites.length; i++) { - if (i !== 0) {out += "\n";} - out += sites[i]["match"]; - } - return out; -} - -function clone_template(template) { - "use strict"; - var node, help_btns, i, button; - node = $(template).cloneNode(true); - toggle_class(node, "template", false); - node.id = ""; - help_btns = node.querySelectorAll(".help"); - for (i = 0; i < help_btns.length; i++) { - button = help_btns[i]; - if (button.hasAttribute("data-topic")) { - button.tabIndex = "0"; - button.addEventListener("click", __toggle_help, false); - button.addEventListener("keydown", __toggle_help, false); - } - } - return node; -} - -function set_tvar(template, tvar, value) { - var node; - node = find_child(template, tvar); - if (node === null) { - throw new Error("Template does not contain variable " + tvar); - } - node.innerHTML = ""; - if (typeof value !== "object") { - node.appendChild(document.createTextNode(value)); - } else { - node.appendChild(value); - } -} - -function make_logo(alphabet, pspm, rc, offset, className) { - if (rc) pspm = pspm.copy().reverse_complement(alphabet); - var logo = new Logo(alphabet, ""); - logo.add_pspm(pspm, offset); - var canvas = document.createElement('canvas'); - canvas.height = 50; - canvas.width = 0; - canvas.className = className; - size_logo_on_canvas(logo, canvas, false); - add_draw_task(canvas, new DelayLogoTask(logo, canvas)); - return canvas; -} - -function make_small_logo(alphabet, pspm, options) { - if (typeof options === "undefined") options = {}; - if (options.rc) pspm = pspm.copy().reverse_complement(alphabet); - var logo = new Logo(alphabet, {x_axis: false, y_axis: false}); - logo.add_pspm(pspm, (typeof options.offset === "number" ? options.offset : 0)); - var canvas = document.createElement('canvas'); - if (typeof options.className === "string") canvas.className = options.className; - if (typeof options.width === "number" && options.width > 0) { - canvas.height = 0; - canvas.width = options.width; - draw_logo_on_canvas(logo, canvas, false); - } else { - draw_logo_on_canvas(logo, canvas, false, 1/3); - } - return canvas; -} - -function make_large_logo(alphabet, pspm, rc, offset, className) { - if (rc) pspm = pspm.copy().reverse_complement(alphabet); - var logo = new Logo(alphabet, ""); - logo.add_pspm(pspm, offset); - var canvas = document.createElement('canvas'); - canvas.height = 200; - canvas.width = 0; - canvas.className = className; - size_logo_on_canvas(logo, canvas, false); - add_draw_task(canvas, new DelayLogoTask(logo, canvas)); - return canvas; -} - -function make_sym_btn(symbol, title, action) { - var box; - box = document.createElement("div"); - box.tabIndex = 0; - box.className = "sym_btn"; - box.appendChild(document.createTextNode(symbol)); - box.title = title; - box.addEventListener('click', action, false); - box.addEventListener('keydown', action, false); - return box; -} - -function make_seq(alphabet, seq) { - var i, j, letter, lbox, sbox; - sbox = document.createElement("span"); - for (i = 0; i < seq.length; i = j) { - letter = seq.charAt(i); - for (j = i+1; j < seq.length; j++) { - if (seq.charAt(j) !== letter) { - break; - } - } - lbox = document.createElement("span"); - lbox.style.color = alphabet.get_colour(alphabet.get_index(letter)); - lbox.appendChild(document.createTextNode(seq.substring(i, j))); - sbox.appendChild(lbox); - } - return sbox; -} - -// -// make_pv_text -// -// Returns the string p-value, with the p italicised. -/// -function make_pv_text() { - var pv_text = document.createElement("span"); - var pv_italic_text = document.createElement("span"); - pv_italic_text.appendChild(document.createTextNode("p")); - pv_italic_text.style.fontStyle = "italic"; - pv_text.appendChild(pv_italic_text); - pv_text.appendChild(document.createTextNode("-value")); - return pv_text; -} - -function append_site_entries(tbody, motif, site_index, count) { - "use strict"; - var i, end; - var sites, site, sequences, sequence; - var rbody; - if (typeof count !== "number") { - count = 20; - } - sequences = data["sequence_db"]["sequences"]; - sites = motif["sites"]; - end = Math.min(site_index + count, sites.length); - for (i = site_index; i < end; i++) { - site = sites[i]; - sequence = sequences[site["seq"]]; - - rbody = tbody.insertRow(tbody.rows.length); - add_text_cell(rbody, "" + (site["seq"] + 1) + ".", "site_num"); - add_text_cell(rbody, sequence["name"], "site_name"); - add_text_cell(rbody, site["rc"] ? "-" : "+", "site_strand"); - add_text_cell(rbody, site["pos"] + 1, "site_start"); - add_text_cell(rbody, site["pvalue"].toExponential(2), "site_pvalue"); - add_text_cell(rbody, site["lflank"], "site lflank"); - add_cell(rbody, make_seq(meme_alphabet, site["match"]), "site match"); - add_text_cell(rbody, site["rflank"], "site rflank"); - } - return i; -} - -function make_site_entries() { - "use strict"; - var region; - region = this; - if (region.data_site_index >= region.data_motif["sites"].length) { - // all sites created - region.removeEventListener('scroll', make_site_entries, false); - return; - } - // if there's still 100 pixels to scroll than don't do anything yet - if (region.scrollHeight - (region.scrollTop + region.offsetHeight) > 100) { - return; - } - - region.data_site_index = append_site_entries( - find_child(region, "sites_tbl").tBodies[0], - region.data_motif, region.data_site_index, 20 - ); -} - -function make_sites(motif) { - "use strict"; - function add_site_header(row, title, nopad, help_topic, tag_class) { - var div, divcp, th; - th = document.createElement("th"); - div = document.createElement("div"); - div.className = "sites_th_inner"; - if (typeof title !== "object") { - title = document.createTextNode("" + title); - } - div.appendChild(title); - if (help_topic) { - div.appendChild(document.createTextNode("\xA0")); - div.appendChild(help_button(help_topic)); - } - divcp = div.cloneNode(true); - divcp.className = "sites_th_hidden"; - th.appendChild(div); - th.appendChild(divcp); - if (nopad) { - th.className = "nopad"; - } - if (tag_class) { - th.className += " " + tag_class; - } - row.appendChild(th); - } - var outer_tbl, inner_tbl, tbl, thead, tbody, rhead; - - outer_tbl = document.createElement("div"); - outer_tbl.className = "sites_outer"; - - inner_tbl = document.createElement("div"); - inner_tbl.className = "sites_inner"; - outer_tbl.appendChild(inner_tbl); - - tbl = document.createElement("table"); - tbl.className = "sites_tbl"; - inner_tbl.appendChild(tbl); - - thead = document.createElement("thead"); - tbl.appendChild(thead); - tbody = document.createElement("tbody"); - tbl.appendChild(tbody); - - rhead = thead.insertRow(thead.rows.length); - add_site_header(rhead, "", true); - add_site_header(rhead, "Name", false, "pop_seq_name"); - add_site_header(rhead, "Strand", false, "pop_site_strand", "site_strand_title"); - add_site_header(rhead, "Start", false, "pop_site_start"); - add_site_header(rhead, make_pv_text(), false, "pop_site_pvalue"); - add_site_header(rhead, "", false); - add_site_header(rhead, "Sites", true, "pop_site_match"); - add_site_header(rhead, "", false); - - inner_tbl.data_motif = motif; - inner_tbl.data_site_index = append_site_entries(tbody, motif, 0, 20); - if (inner_tbl.data_site_index < motif["sites"].length) { - inner_tbl.addEventListener('scroll', make_site_entries, false); - } - return outer_tbl; -} - -function make_motif_table_entry(row, alphabet, ordinal, motif, colw) { - "use strict"; - function ev_sig(evalue_str) { - "use strict"; - var ev_re, match, sig, exp, num; - ev_re = /^(.*)e(.*)$/; - if (match = ev_re.exec(evalue_str)) { - sig = parseFloat(match[1]); - exp = parseInt(match[2]); - if (exp >= 0) { - return false; - } else if (exp <= -3) { - return true; - } else { - return sig * Math.pow(10, exp) <= 0.05; - } - } - return true; - } - function make_preview(alphabet, motif) { - "use strict"; - var pspm, preview, preview_rc; - var box, btn_box, logo_box, btn_plus, btn_minus; - if (motif["preview_logo"]) { - preview = motif["preview_logo"]; - preview_rc = motif["preview_logo_rc"]; - } else { - pspm = new Pspm(motif["pwm"]); - preview = make_logo(alphabet, pspm); - motif["preview_logo"] = preview; - if (alphabet.has_complement()) { - preview_rc = make_logo(alphabet, pspm, true, 0, "logo_rc"); - motif["preview_logo_rc"] = preview_rc; - } - } - if (preview_rc) { - btn_plus = document.createElement("div"); - btn_plus.appendChild(document.createTextNode("+")); - btn_plus.className = "preview_btn plus"; - btn_plus.tabIndex = "0"; - btn_plus.addEventListener("click", action_btn_rc, false); - btn_plus.addEventListener("keydown", action_btn_rc, false); - btn_minus = document.createElement("div"); - btn_minus.appendChild(document.createTextNode("-")); - btn_minus.className = "preview_btn minus"; - btn_minus.tabIndex = "0"; - btn_minus.addEventListener("click", action_btn_rc, false); - btn_minus.addEventListener("keydown", action_btn_rc, false); - btn_box = document.createElement("div"); - btn_box.className = "preview_btn_box"; - btn_box.appendChild(btn_plus); - btn_box.appendChild(btn_minus); - } - logo_box = document.createElement("div"); - logo_box.className = "preview_logo_box"; - logo_box.appendChild(preview); - if (preview_rc) logo_box.appendChild(preview_rc); - box = document.createElement("div"); - box.className = "preview_box"; - if (preview_rc) box.appendChild(btn_box); - box.appendChild(logo_box); - if (preview_rc) { - if (motif["rc"]) { - btn_minus.className += " active"; - logo_box.className += " show_rc_logo"; - } else { - btn_plus.className += " active"; - } - } - return box; - } - var pspm, preview, preview_rc, c; - row.data_motif = motif; - row.data_ordinal = ordinal; - if (!ev_sig(motif["evalue"])) { - row.style.opacity = 0.4; - } - add_text_cell(row, "" + ordinal + ".", "motif_ordinal"); - add_cell(row, make_preview(alphabet, motif), "motif_logo"); - add_text_cell(row, motif["evalue"], "motif_evalue"); - add_text_cell(row, motif["nsites"], "motif_nsites"); - add_text_cell(row, motif["len"], "motif_width"); - add_cell(row, make_sym_btn("\u21A7", "Show more information.", - action_show_more), "motif_more"); - add_cell(row, - make_sym_btn("\u21E2", - "Submit the motif to another MEME Suite program or download it.", - action_show_outpop), - "motif_submit"); - if (colw) { - for (c = 0; c < row.cells.length; c++) { - row.cells[c].style.minWidth = colw[c] + "px"; - } - } -} - -function make_motifs_table(alphabet, start_ordinal, motifs, colw, stop_reason) { - var i, j; - var tbl, thead, tbody, tfoot, row, preview; - var motif, pspm; - - tbl = document.createElement("table"); - - thead = document.createElement("thead"); - tbl.appendChild(thead); - tbody = document.createElement("tbody"); - tbl.appendChild(tbody); - tfoot = document.createElement("tfoot"); - tbl.appendChild(tfoot); - - row = thead.insertRow(thead.rows.length); - add_text_header_cell(row, "", "", "motif_ordinal"); - add_text_header_cell(row, "Logo", "", "motif_logo"); - add_text_header_cell(row, "E-value", "pop_ev", "motif_evalue"); - add_text_header_cell(row, "Sites", "pop_sites", "motif_nsites"); - add_text_header_cell(row, "Width", "pop_width", "motif_width"); - add_text_header_cell(row, "More", "pop_more", "motif_more"); - add_text_header_cell(row, "Submit/Download", "pop_submit_dl", "motif_submit"); - - for (i = 0; i < motifs.length; i++) { - row = tbody.insertRow(tbody.rows.length); - make_motif_table_entry(row, alphabet, start_ordinal + i, motifs[i], colw); - } - - row = tfoot.insertRow(tfoot.rows.length); - add_text_header_cell(row, stop_reason, "", "stop_reason", "", 6); - - return tbl; -} - -function make_expanded_motif(alphabet, ordinal, motif, less_x, submit_x) { - "use strict"; - var box, pspm, logo_box, large_logo, large_logo_rc, tab_logo, tab_logo_rc; - var btn, offset, norc; - - box = clone_template("tmpl_motif_expanded"); - box.data_motif = motif; - box.data_ordinal = ordinal; - - pspm = new Pspm(motif["pwm"]); - if (typeof motif["rc"] !== "boolean") { - motif["rc"] = false; - } - if (motif["large_logo"]) { - large_logo = motif["large_logo"]; - large_logo_rc = motif["large_logo_rc"]; - } else { - large_logo = make_large_logo(alphabet, pspm, false, 0); - motif["large_logo"] = large_logo; - if (alphabet.has_complement()) { - large_logo_rc = make_large_logo(alphabet, pspm, true, 0, "logo_rc"); - motif["large_logo_rc"] = large_logo_rc; - } - } - norc = (large_logo_rc == null); - toggle_class(box, "norc", norc); - - logo_box = find_child(box, "tvar_logo"); - logo_box.appendChild(large_logo); - if (large_logo_rc) logo_box.appendChild(large_logo_rc); - toggle_class(logo_box, "show_rc_logo", motif["rc"]); - - tab_logo = find_child(box, "tvar_tab"); - tab_logo_rc = find_child(box, "tvar_tab_rc"); - - toggle_class(tab_logo, "activeTab", !motif["rc"]); - toggle_class(tab_logo_rc, "activeTab", motif["rc"]); - - tab_logo.addEventListener('click', action_rc_tab, false); - tab_logo.addEventListener('keydown', action_rc_tab, false); - tab_logo_rc.addEventListener('click', action_rc_tab, false); - tab_logo_rc.addEventListener('keydown', action_rc_tab, false); - - set_tvar(box, "tvar_ordinal", ordinal); - set_tvar(box, "tvar_evalue", motif["evalue"]); - set_tvar(box, "tvar_width", motif["len"]); - set_tvar(box, "tvar_site_count", motif["nsites"]); - set_tvar(box, "tvar_llr", motif["llr"]); - set_tvar(box, "tvar_ic", motif["ic"]); - set_tvar(box, "tvar_re", motif["re"]); - set_tvar(box, "tvar_bt", motif["bt"]); - set_tvar(box, "tvar_sites", make_sites(motif)); - - offset = 32; // 1* 5px padding + 2 * 10px padding + 2 * 2px border + 3px ?? - - btn = find_child(box, "tvar_less"); - btn.style.left = (less_x - offset) + "px"; - btn.addEventListener('click', action_show_less, false); - btn.addEventListener('keydown', action_show_less, false); - btn = find_child(box, "tvar_submit"); - btn.style.left = (submit_x - offset) + "px"; - btn.addEventListener('click', action_show_outpop, false); - btn.addEventListener('keydown', action_show_outpop, false); - return box; -} - - -// -// -/// -function make_motifs() { - "use strict"; - function pixel_value(str_in) { - "use strict"; - var px_re, match; - px_re = /^(\d+)px$/; - if (match = px_re.exec(str_in)) { - return parseInt(match[1], 10); - } - return 0; - } - var container, tbl; - var colw, r, row, c, cell, cell_style, pad_left, pad_right; - - // make the motifs table - container = $("motifs"); - container.innerHTML = ""; // clear content - - tbl = make_motifs_table(meme_alphabet, 1, data["motifs"], colw, data["stop_reason"]); - container.appendChild(tbl); - - // measure table column widths - colw = []; - row = tbl.tBodies[0].rows[0]; - for (c = 0; c < row.cells.length; c++) { - var padLeft, padRight; - cell = row.cells[c]; - cell_style = window.getComputedStyle(cell, null); - pad_left = pixel_value(cell_style.getPropertyValue("padding-left")); - pad_right = pixel_value(cell_style.getPropertyValue("padding-right")); - colw[c] = cell.clientWidth - pad_left - pad_right; - if (typeof colw[c] !== "number" || colw[c] < 0) { - colw[c] = 1; - } - } - - // set minimum table column widths on each row so later when we remove rows it still aligns - for (r = 0; r < tbl.tBodies[0].rows.length; r++) { - row = tbl.tBodies[0].rows[r]; - for (c = 0; c < row.cells.length; c++) { - row.cells[c].style.minWidth = colw[c] + "px"; - } - } - - // store the table column widths so we can create rows latter with the same minimums - container.data_colw = colw; - - // calculate the x offset for the buttons - row = tbl.tBodies[0].rows[0]; - container.data_more_x = coords(find_child(find_child(row, "motif_more"), "sym_btn"))[0]; - container.data_submit_x = coords(find_child(find_child(row, "motif_submit"), "sym_btn"))[0]; - - draw_on_screen(); -} - -function make_meme_block(container, max_seq_len, is_scan, site) { - "use strict"; - var motif = data.motifs[site.motif]; - var block = make_block(container, max_seq_len, site.pos, motif.len, - site.pvalue, site.rc, site.motif, is_scan); - var handler = (is_scan ? - make_scan_popup(site, motif, block) : - make_block_popup(site, motif, block)); - block.addEventListener("mouseover", handler, false); - block.addEventListener("mouseout", handler, false); -} - -function append_blocks_entries(tbody, seq_index, count) { - "use strict"; - var i, end, j; - var max_pvalue, max_block_height, max_seq_len, sequences; - var sequence, sites, scans, scan; - var container, plus, minus, rule, row; - // define some constants - max_seq_len = data.sequence_db.max_length; - // determine how many to load - end = Math.min(seq_index + count, data.sequence_db.sequences.length); - for (i = seq_index; i < end; i++) { - // get the sequence - sequence = data.sequence_db.sequences[i]; - // make the containers for the block diagram - container = make_block_container(meme_alphabet.has_complement(), - data.options.revcomp, max_seq_len, sequence.length); - // create blocks for the motif sites - sites = sequence["sites"]; - for (j = 0; j < sites.length; j++) - make_meme_block(container, max_seq_len, false, sites[j]); - // create blocks for the scanned sites - scan = data.scan[i]; - for (j = 0; j < scan.sites.length; j++) - make_meme_block(container, max_seq_len, true, scan.sites[j]); - // create a row for the sequence - row = tbody.insertRow(tbody.rows.length); - toggle_class(row, "empty_seq", sites.length == 0 && scan.sites.length == 0); - toggle_class(row, "only_scan", sites.length == 0 && scan.sites.length > 0); - add_text_cell(row, (i + 1) + ".", "blockdiag_num"); - add_text_cell(row, sequence["name"], "blockdiag_name"); - add_text_cell(row, scan["pvalue"].toExponential(2), "blockdiag_pvalue"); - add_cell(row, container, "block_td"); - } - return end; -} - -function make_blocks_entries() { - "use strict"; - var region; - region = this; - if (region.data_blocks_index >= data["sequence_db"]["sequences"].length) { - // all sites created - region.removeEventListener('scroll', make_blocks_entries, false); - return; - } - // if there's still 100 pixels to scroll than don't do anything yet - if (region.scrollHeight - (region.scrollTop + region.offsetHeight) > 100) { - return; - } - - region.data_blocks_index = append_blocks_entries( - find_child(region, "blocks_tbl").tBodies[0], - region.data_blocks_index, 20 - ); -} - -function make_blocks() { - "use strict"; - function add_seqs_filter(container, id, checked, label_text, help_topic) { - "use strict"; - var label, radio; - radio = document.createElement("input"); - radio.type = "radio"; - radio.name = "seqs_display"; - radio.id = id; - radio.checked = checked; - radio.addEventListener('click', action_seqs_filter, false); - label = document.createElement("label"); - label.appendChild(document.createTextNode(label_text)); - label.htmlFor = id; - container.appendChild(radio); - container.appendChild(label); - if (help_topic) { - container.appendChild(document.createTextNode("\xA0")); - container.appendChild(help_button(help_topic)); - } - } - function add_blocks_header(row, title, nopad, help_topic) { - "use strict"; - var div, divcp, th; - th = document.createElement("th"); - div = document.createElement("div"); - div.className = "blocks_th_inner"; - if (typeof title !== "object") { - title = document.createTextNode("" + title); - } - div.appendChild(title); - if (help_topic) { - div.appendChild(document.createTextNode("\xA0")); - div.appendChild(help_button(help_topic)); - } - divcp = div.cloneNode(true); - divcp.className = "blocks_th_hidden"; - th.appendChild(div); - th.appendChild(divcp); - if (nopad) { - th.className = "nopad"; - } - row.appendChild(th); - } - var container; - var page, view_height, outer_tbl, inner_tbl, tbl, thead, tbody, rhead; - var in_view, i, seq_count; - - page = (document.compatMode === "CSS1Compat") ? document.documentElement : document.body; - view_height = Math.max(page.clientHeight - 300, 300); - - container = $("blocks"); - toggle_class(container, "hide_empty_seqs", true); - toggle_class(container, "hide_only_scan", true); - container.innerHTML = ""; - add_seqs_filter(container, "rdo_sites_only", true, "Only Motif Sites", "pop_motif_sites"); - add_seqs_filter(container, "rdo_sites_and_scan", false, "Motif Sites+Scanned Sites", "pop_scanned_sites"); - add_seqs_filter(container, "rdo_all_seqs", false, "All Sequences", "pop_all_sequences"); - - outer_tbl = document.createElement("div"); - outer_tbl.className = "blocks_outer"; - - inner_tbl = document.createElement("div"); - inner_tbl.id = "blocks_scroll"; - inner_tbl.className = "blocks_inner"; - inner_tbl.style.maxHeight = view_height + "px"; - outer_tbl.appendChild(inner_tbl); - - tbl = document.createElement("table"); - tbl.className = "blocks_tbl"; - inner_tbl.appendChild(tbl); - - thead = document.createElement("thead"); - tbl.appendChild(thead); - tbody = document.createElement("tbody"); - tbl.appendChild(tbody); - - rhead = thead.insertRow(thead.rows.length); - add_blocks_header(rhead, "", true); - add_blocks_header(rhead, "Name", false, "pop_seq_name"); - add_blocks_header(rhead, make_pv_text(), false, "pop_seq_pvalue"); - add_blocks_header(rhead, "Motif Location", false, "pop_motif_location"); - - container.appendChild(outer_tbl); - - - seq_count = data["sequence_db"]["sequences"].length; - in_view = Math.max(Math.ceil(view_height / 25), 1); - i = append_blocks_entries(tbody, 0, in_view); - - while (i < seq_count && inner_tbl.scrollHeight - (inner_tbl.scrollTop + inner_tbl.offsetHeight) < 400) { - i = append_blocks_entries(tbody, i, 20); - } - inner_tbl.data_blocks_index = i; - if (i < seq_count) { - inner_tbl.addEventListener('scroll', make_blocks_entries, false); - } -} - -function make_scan_popup(site, motif) { - return function (e) { - "use strict"; - var pop, xy, padding, edge_padding, pop_left, pop_top, page_width; - var lflank, match, rflank, pspm; - if (!e) var e = window.event; - pop = make_scan_popup.pop; - if (e.type === "mouseover") { - if (pop) return; - pop = clone_template("tmpl_scan_info"); - pspm = new Pspm(motif.pwm); - if (site.rc) pspm.reverse_complement(meme_alphabet); - set_tvar(pop, "tvar_logo", make_small_logo(meme_alphabet, pspm, {"className": "scan_logo"})); - set_tvar(pop, "tvar_motif", motif.id); - set_tvar(pop, "tvar_pvalue", site.pvalue.toExponential(2)); - set_tvar(pop, "tvar_start", site.pos + 1); - set_tvar(pop, "tvar_end", site.pos + motif.len); - - document.body.appendChild(pop); - position_popup(this, pop); - make_scan_popup.pop = pop; - } else if (e.type === "mouseout") { - if (pop) { - pop.parentNode.removeChild(pop); - make_scan_popup.pop = null; - } - } - }; -} - -function make_block_popup(site, motif, block) { - return function (e) { - "use strict"; - var pop; - var lflank, match, rflank, pspm, ruler, match_seq, match_width; - if (!e) var e = window.event; - pop = make_block_popup.pop; - if (e.type === "mouseover") { - if (pop) return; - pop = clone_template("tmpl_block_info"); - pspm = new Pspm(motif.pwm); - if (site.rc) { // must be dna - pspm.reverse_complement(meme_alphabet); - lflank = meme_alphabet.invcomp_seq(site.rflank); - match = meme_alphabet.invcomp_seq(site.match); - rflank = meme_alphabet.invcomp_seq(site.lflank); - } else { - lflank = site.lflank; - match = site.match; - rflank = site.rflank; - } - ruler = document.getElementById("measure_match"); - match_seq = make_seq(meme_alphabet, match); - ruler.innerHTML = ""; - ruler.appendChild(match_seq); - match_width = ruler.clientWidth; - ruler.removeChild(match_seq); - set_tvar(pop, "tvar_lflank", lflank); - set_tvar(pop, "tvar_match", match_seq); - set_tvar(pop, "tvar_rflank", rflank); - set_tvar(pop, "tvar_logo_pad", lflank); - set_tvar(pop, "tvar_logo", make_small_logo(meme_alphabet, pspm, {"width": match_width})); - set_tvar(pop, "tvar_motif", motif.id); - set_tvar(pop, "tvar_pvalue", site.pvalue.toExponential(2)); - set_tvar(pop, "tvar_start", site.pos + 1); - set_tvar(pop, "tvar_end", site.pos + motif.len); - - document.body.appendChild(pop); - position_popup(block, pop); - make_block_popup.pop = pop; - } else if (e.type === "mouseout") { - if (pop) { - pop.parentNode.removeChild(pop); - make_block_popup.pop = null; - } - } - }; -} - -function update_outpop_format(index) { - switch(parseInt($("text_format").value)) { - case 0: // count matrix - $("outpop_text").value = motif_count_matrix(index); - $("text_name").value = "motif_" + (index + 1) + "_counts.txt"; - break; - case 1: // prob matrix - $("outpop_text").value = motif_prob_matrix(index); - $("text_name").value = "motif_" + (index + 1) + "_freqs.txt"; - break; - case 2: // minimal meme - $("outpop_text").value = motif_minimal_meme(index); - $("text_name").value = "motif_" + (index + 1) + ".txt"; - break; - case 3: // fasta - $("outpop_text").value = motif_fasta(index); - $("text_name").value = "motif_" + (index + 1) + "_fasta.txt"; - break; - case 4: // raw - $("outpop_text").value = motif_raw(index); - $("text_name").value = "motif_" + (index + 1) + "_raw.txt"; - break; - default: - throw new Error("Unknown motif format"); - } -} - -function update_outpop_motif(index) { - "use strict"; - var motifs, motif, pspm, logo, canvas, num; - motifs = data["motifs"]; - if (index < 0 || index >= motifs.length) {return;} - current_motif = index; - motif = motifs[index]; - pspm = new Pspm(motif["pwm"]); - logo = new Logo(meme_alphabet, ""); - logo.add_pspm(pspm, 0); - canvas = $("outpop_logo"); - canvas.width = canvas.width; // clear canvas - draw_logo_on_canvas(logo, canvas, false); - if (meme_alphabet.has_complement()) { - pspm.reverse_complement(meme_alphabet); - logo = new Logo(meme_alphabet, ""); - canvas = $("outpop_logo_rc"); - canvas.width = canvas.width; // clear canvas - draw_logo_on_canvas(logo, canvas, false); - } - num = $("outpop_num"); - num.innerHTML = ""; - num.appendChild(document.createTextNode("" + (index + 1))); - update_outpop_format(index); -} - -// -// action_show_more -// -// Show more information on the motif. -/// -function action_show_more(e) { - var node, tr, tbody, table, container, motif, ordinal; - var expanded_motif; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - // find the row that contains the cell - node = this; - do { - if (node.tagName === "TR") break; - } while (node = node.parentNode); - if (!node) throw new Error("Expected to find row!?"); - tr = node; - // get info - motif = tr.data_motif; - ordinal = tr.data_ordinal; - // find tbody - do { - if (node.tagName === "TBODY") break; - } while (node = node.parentNode); - if (!node) throw new Error("Expected to find tbody!?"); - tbody = node; - // find table - do { - if (node.tagName === "TABLE") break; - } while (node = node.parentNode); - if (!node) throw new Error("Expected to find table!?"); - table = node; - // find container - container = node.parentNode; - // make a expanded motif - motif["expanded"] = true; - expanded_motif = make_expanded_motif(meme_alphabet, ordinal, motif, - container.data_more_x, container.data_submit_x); - // now determine how to place it - if (tbody.rows.length === 1) { - // only us in the table so the table can be replaced - container.replaceChild(expanded_motif, table); - } else if (tbody.rows[0] === tr) { - // first row, so remove and insert an expanded motif before - table.deleteRow(tr.rowIndex); - container.insertBefore(expanded_motif, table); - } else if (tbody.rows[tbody.rows.length -1] === tr) { - // last row, so remove and insert an expanded motif after - table.deleteRow(tr.rowIndex); - container.insertBefore(expanded_motif, table.nextSibling); - } else { - var table2, tbody2; - table2 = table.cloneNode(false); - table2.appendChild(table.tHead.cloneNode(true)); - tbody2 = table.tBodies[0].cloneNode(false); - table2.appendChild(tbody2); - container.insertBefore(table2, table.nextSibling); - for (i = tbody.rows.length - 1; i >= 0; i--) { - row = tbody.rows[i]; - row.parentNode.removeChild(row); - if (row === tr) { - break; - } - tbody2.insertBefore(row, tbody2.rows[0]); - } - container.insertBefore(expanded_motif, table2); - } - find_child(expanded_motif, "tvar_less").focus(); -} - -// -// action_show_less -// -// Show less information on the motif. -/// -function action_show_less(e) { - var btn; - var expanded_motif, container, motif, ordinal, colw, focus_target; - var table, tbody, tbody2, row, table_before, table_after; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - btn = this; - // find expanded motif - expanded_motif = find_parent(btn, "expanded_motif"); - if (!expanded_motif) throw new Error("Expected expanded motif."); - // find the container - container = expanded_motif.parentNode; - // get data - motif = expanded_motif.data_motif; - ordinal = expanded_motif.data_ordinal; - colw = container.data_colw; - // get the table before - table_before = expanded_motif.previousSibling; - if (table_before && table_before.tagName !== "TABLE") { - table_before = null; - } - // get the table after - table_after = expanded_motif.nextSibling; - if (table_after && table_after.tagName !== "TABLE") { - table_after = null; - } - // see if there is a table below or above that we can put this in. - // if there is a table both below and above then add this motif and - // all ones below to the above table - motif["expanded"] = false; - if (table_before && table_after) { - tbody = table_before.tBodies[0]; - row = tbody.insertRow(tbody.rows.length); - make_motif_table_entry(row, meme_alphabet, ordinal, motif, colw); - focus_target = find_child(row.cells[5], "sym_btn"); - container.removeChild(expanded_motif); - tbody2 = table_after.tBodies[0]; - while (tbody2.rows.length > 0) { - row = tbody2.rows[0]; - row.parentNode.removeChild(row); - tbody.appendChild(row); - } - container.removeChild(table_after); - } else if (table_before) { - tbody = table_before.tBodies[0]; - row = tbody.insertRow(tbody.rows.length); - make_motif_table_entry(row, meme_alphabet, ordinal, motif, colw); - focus_target = find_child(row.cells[5], "sym_btn"); - container.removeChild(expanded_motif); - } else if (table_after) { - tbody = table_after.tBodies[0]; - row = tbody.insertRow(0); - make_motif_table_entry(row, meme_alphabet, ordinal, motif, colw); - focus_target = find_child(row.cells[5], "sym_btn"); - container.removeChild(expanded_motif); - } else { - //no table above or below! - // make a new table - table = make_motifs_table(meme_alphabet, ordinal, [motif], colw, data["stop_reason"]); - focus_target = find_child(table.tBodies[0].rows[0].cells[5], "sym_btn"); - container.replaceChild(table, expanded_motif); - } - focus_target.focus(); -} - -function action_show_outpop(e) { - "use strict"; - function init() { - "use strict"; - var close_btn, next_btn, prev_btn, cancel_btn, do_btn; - var tab1, tab2, tab3; - var pnl1, pnl2, pnl3; - var format_list; - var tbl_submit, inputs, i, default_prog; - close_btn = $("outpop_close"); - close_btn.addEventListener("click", action_hide_outpop, false); - close_btn.addEventListener("keydown", action_hide_outpop, false); - next_btn = $("outpop_next"); - next_btn.addEventListener("click", action_outpop_next, false); - next_btn.addEventListener("keydown", action_outpop_next, false); - prev_btn = $("outpop_prev"); - prev_btn.addEventListener("click", action_outpop_prev, false); - prev_btn.addEventListener("keydown", action_outpop_prev, false); - cancel_btn = $("outpop_cancel"); - cancel_btn.addEventListener("click", action_hide_outpop, false); - do_btn = $("outpop_do"); - do_btn.addEventListener("click", action_outpop_submit, false); - tab1 = $("outpop_tab_1"); - tab1.tabIndex = 0; - tab1.addEventListener("click", action_outpop_tab, false); - tab1.addEventListener("keydown", action_outpop_tab, false); - tab2 = $("outpop_tab_2"); - tab2.tabIndex = 0; - tab2.addEventListener("click", action_outpop_tab, false); - tab2.addEventListener("keydown", action_outpop_tab, false); - tab3 = $("outpop_tab_3"); - tab3.tabIndex = 0; - tab3.addEventListener("click", action_outpop_tab, false); - tab3.addEventListener("keydown", action_outpop_tab, false); - pnl1 = $("outpop_pnl_1"); - pnl2 = $("outpop_pnl_2"); - pnl3 = $("outpop_pnl_3"); - toggle_class(tab1, "activeTab", true); - toggle_class(tab2, "activeTab", false); - toggle_class(tab3, "activeTab", false); - pnl1.style.display = "block"; - pnl2.style.display = "none"; - pnl3.style.display = "none"; - format_list = $("text_format"); - format_list.addEventListener("change", action_outpop_format, false); - // setup program selection - tbl_submit = $("programs"); - // when not dna, hide the inputs for programs that require dna motifs - toggle_class(tbl_submit, "alphabet_dna", meme_alphabet.has_complement());//TODO FIXME alphabet_dna is a bad name for a field when allowing custom alphabets - // add a click listener for the radio buttons - inputs = tbl_submit.querySelectorAll("input[type='radio']"); - for (i = 0; i < inputs.length; i++) { - inputs[i].addEventListener("click", action_outpop_program, false); - } - // ensure that a default program option is selected for DNA and Protein - default_prog = document.getElementById(meme_alphabet.has_complement() ? "submit_tomtom" : "submit_fimo"); //TODO FIXME Tomtom might require a more strict definition of DNA - default_prog.checked = true; - action_outpop_program.call(default_prog); - // disable reverse-complement when not DNA - $("logo_rc_option").disabled = !meme_alphabet.has_complement(); - // set errorbars on when ssc is on - $("logo_ssc").addEventListener("change", action_outpop_ssc, false); - } - var node; - // store the focused element - action_hide_outpop.last_active = document.activeElement; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - // hide the help popup - help_popup(); - // on first load initilize the popup - if (!action_show_outpop.ready) { - init(); - action_show_outpop.ready = true; - } - // load the motif logo - node = this; - do { - if (/\bexpanded_motif\b/.test(node.className) || node.tagName === "TR") break; - } while (node = node.parentNode); - if (node === null) throw new Error("Expected node!"); - update_outpop_motif(node.data_ordinal - 1); - // display the download popup - $("grey_out_page").style.display = "block"; - $("download").style.display = "block"; - $("outpop_close").focus(); -} - -function action_hide_outpop(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - $("download").style.display = "none"; - $("grey_out_page").style.display = "none"; - if (typeof action_hide_outpop.last_active !== "undefined") { - action_hide_outpop.last_active.focus(); - } -} - -function action_outpop_next(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - update_outpop_motif(current_motif + 1); -} - -function action_outpop_prev(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - update_outpop_motif(current_motif - 1); -} - -function action_outpop_program() { - "use strict"; - var table, tr, rows, i; - tr = find_parent_tag(this, "TR"); - table = find_parent_tag(tr, "TABLE"); - rows = table.querySelectorAll("tr"); - for (i = 0; i < rows.length; i++) { - toggle_class(rows[i], "selected", rows[i] === tr); - } -} - -function action_outpop_ssc() { - "use strict"; - $("logo_err").value = $("logo_ssc").value; -} - -function action_outpop_submit(e) { - "use strict"; - var form, input, program, motifs; - // find out which program is selected - var radios, i; - radios = document.getElementsByName("program"); - program = "fimo"; // default to fimo, since it works with all alphabet types - for (i = 0; i < radios.length; i++) { - if (radios[i].checked) program = radios[i].value; - } - - motifs = motif_minimal_meme(current_motif); - form = document.createElement("form"); - form.setAttribute("method", "post"); - form.setAttribute("action", site_url + "/tools/" + program); - - input = document.createElement("input"); - input.setAttribute("type", "hidden"); - input.setAttribute("name", "motifs_embed"); - input.setAttribute("value", motifs); - form.appendChild(input); - - document.body.appendChild(form); - form.submit(); - document.body.removeChild(form); -} - -function action_outpop_download_motif(e) { - $("text_form").submit(); -} - -function action_outpop_download_logo(e) { - "use strict"; - $("logo_motifs").value = motif_minimal_meme(current_motif); - $("logo_form").submit(); -} - -function action_btn_rc(e) { - "use strict"; - var node, tr, motif, box, logo_box, tab_st, tab_rc, rc; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - node = this; - do { - if (node.tagName === "TR") break; - } while (node = node.parentNode); - if (!node) throw new Error("Expected to find row!?"); - tr = node; - // get info - motif = tr.data_motif; - box = find_parent(this, "preview_box"); - logo_box = find_child(box, "preview_logo_box"); - tab_st = find_child(box, "plus"); - tab_rc = find_child(box, "minus"); - rc = (this === tab_rc); - motif["rc"] = rc; - toggle_class(logo_box, "show_rc_logo", rc); - toggle_class(tab_st, "active", !rc); - toggle_class(tab_rc, "active", rc); -} - -function action_rc_tab(e) { - "use strict"; - var box, logo_box, tab_st, tab_rc, rc; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - box = find_parent(this, "expanded_motif"); - logo_box = find_child(box, "tvar_logo"); - tab_st = find_child(box, "tvar_tab"); - tab_rc = find_child(box, "tvar_tab_rc"); - rc = (this === tab_rc); - box.data_motif["rc"] = rc; - toggle_class(logo_box, "show_rc_logo", rc); - toggle_class(tab_st, "activeTab", !rc); - toggle_class(tab_rc, "activeTab", rc); -} - -function action_outpop_tab(e) { - "use strict"; - var tab1, tab2, tab3, pnl1, pnl2, pnl3, do_btn; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - tab1 = $("outpop_tab_1"); - tab2 = $("outpop_tab_2"); - tab3 = $("outpop_tab_3"); - pnl1 = $("outpop_pnl_1"); - pnl2 = $("outpop_pnl_2"); - pnl3 = $("outpop_pnl_3"); - do_btn = $("outpop_do"); - - toggle_class(tab1, "activeTab", (this === tab1)); - toggle_class(tab2, "activeTab", (this === tab2)); - toggle_class(tab3, "activeTab", (this === tab3)); - pnl1.style.display = ((this === tab1) ? "block" : "none"); - pnl2.style.display = ((this === tab2) ? "block" : "none"); - pnl3.style.display = ((this === tab3) ? "block" : "none"); - do_btn.value = ((this === tab1) ? "Submit" : "Download"); - do_btn.removeEventListener("click", action_outpop_submit, false); - do_btn.removeEventListener("click", action_outpop_download_logo, false); - do_btn.removeEventListener("click", action_outpop_download_motif, false); - if (this === tab1) { - do_btn.addEventListener("click", action_outpop_submit, false); - } else if (this === tab2) { - do_btn.addEventListener("click", action_outpop_download_motif, false); - } else { - do_btn.addEventListener("click", action_outpop_download_logo, false); - } -} - -function action_seqs_filter() { - "use strict"; - var block_container; - block_container = $("blocks"); - if ($("rdo_all_seqs").checked) { - toggle_class(block_container, "hide_empty_seqs", false); - toggle_class(block_container, "hide_only_scan", false); - } else if ($("rdo_sites_and_scan").checked) { - toggle_class(block_container, "hide_empty_seqs", true); - toggle_class(block_container, "hide_only_scan", false); - } else if ($("rdo_sites_only").checked) { - toggle_class(block_container, "hide_empty_seqs", true); - toggle_class(block_container, "hide_only_scan", true); - } -} - -function action_outpop_format() { - update_outpop_format(current_motif); -} - -// -// page_loaded -// -// Called when the page has loaded for the first time. -/// -function page_loaded() { - post_load_setup(); -} - -// -// page_loaded -// -// Called when a cached page is reshown. -/// -function page_shown(e) { - if (e.persisted) post_load_setup(); -} - -// -// page_loaded -// -// Called when the page is resized -/// -function page_resized() { - var page, blocks_scroll; - update_scroll_pad(); - page = (document.compatMode === "CSS1Compat") ? document.documentElement : document.body; - blocks_scroll = $("blocks_scroll"); - if (blocks_scroll) { - blocks_scroll.style.maxHeight = Math.max(page.clientHeight - 300, 300) + "px"; - } -} - -// -// pre_load_setup -// -// Run before the page is displayed -/// -function pre_load_setup() { - var start, hue, sat, light, divisions; - var i, j, motifs, motif, sites, site, sequences, sequence; - var max_seq_len; - motifs = data["motifs"]; - sequences = data["sequence_db"]["sequences"]; - max_seq_len = 1; - for (i = 0; i < sequences.length; i++) { - sequence = sequences[i]; - sequence["sites"] = []; - if (sequence["length"] > max_seq_len) { - max_seq_len = sequence["length"]; - } - } - data["sequence_db"]["max_length"] = max_seq_len; - // use hsl colours - start = 0; //red - sat = 100; - light = 50; - for (i = 0; i < motifs.length; i++) { - motif = motifs[i]; - // give the motif a colour - divisions = 1 << Math.ceil(Math.log(i + 1) / Math.LN2); - hue = start + (360 / divisions) * ((i - (divisions >> 1)) * 2 + 1); - motif["colour"] = "hsl(" + hue + ", " + sat + "%, " + light + "%)"; - // associate sites with sequences as well - // to make generating the block diagram easier - sites = motif["sites"]; - for (j = 0; j < sites.length; j++) { - site = sites[j]; - sequence = sequences[site["seq"]]; - // record the motif index - site["motif"] = i; - // add the site to the sequence - sequence["sites"].push(site); - } - } -} - -// -// post_load_setup -// -// Run when the page has loaded, or been reloaded. -// -function post_load_setup() { - update_scroll_pad(); - if (data["motifs"].length > 0) { - make_motifs(); - make_blocks(); - } else { - $("motifs").innerHTML = "<p>No significant motifs found!</p>"; // clear content - $("motifs").innerHTML += "<p><b>" + data["stop_reason"] + "</b></p>"; - $("blocks").innerHTML = "<p>No significant motifs found!</p>"; - } -} - -pre_load_setup(); -</script> - <style> -/* The following is the content of meme.css */ -body { background-color:white; font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif;} - -div.help { - display: inline-block; - margin: 0px; - padding: 0px; - width: 12px; - height: 13px; - cursor: pointer; - background-image: url(data:image/gif;base64,R0lGODlhDAANAIABANR0AP///yH5BAEAAAEALAAAAAAMAA0AAAIdhI8Xy22MIFgv1DttrrJ7mlGNNo4c+aFg6SQuUAAAOw==); -} - -div.help:hover { - background-image: url(data:image/gif;base64,R0lGODlhDAANAKEAANR0AP///9R0ANR0ACH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEAAAIALAAAAAAMAA0AAAIdDGynCe3PgoxONntvwqz2/z2K2ImjR0KhmSIZUgAAOw==); -} - -p.spaced { line-height: 1.8em;} - -span.citation { font-family: "Book Antiqua", "Palatino Linotype", serif; color: #004a4d;} - -p.pad { padding-left: 30px; padding-top: 5px; padding-bottom: 10px;} - -td.jump { font-size: 13px; color: #ffffff; background-color: #00666a; - font-family: Georgia, "Times New Roman", Times, serif;} - -a.jump { margin: 15px 0 0; font-style: normal; font-variant: small-caps; - font-weight: bolder; font-family: Georgia, "Times New Roman", Times, serif;} - -h2.mainh {font-size: 1.5em; font-style: normal; margin: 15px 0 0; - font-variant: small-caps; font-family: Georgia, "Times New Roman", Times, serif;} - -h2.line {border-bottom: 1px solid #CCCCCC; font-size: 1.5em; font-style: normal; - margin: 15px 0 0; padding-bottom: 3px; font-variant: small-caps; - font-family: Georgia, "Times New Roman", Times, serif;} - -h4 {border-bottom: 1px solid #CCCCCC; font-size: 1.2em; font-style: normal; - margin: 10px 0 0; padding-bottom: 3px; font-family: Georgia, "Times New Roman", Times, serif;} - -h5 {margin: 0px} - -a.help { font-size: 9px; font-style: normal; text-transform: uppercase; - font-family: Georgia, "Times New Roman", Times, serif;} - -div.pad { padding-left: 30px; padding-top: 5px; padding-bottom: 10px;} - -div.pad1 { margin: 10px 5px;} - -div.pad2 { margin: 25px 5px 5px;} -h2.pad2 { padding: 25px 5px 5px;} - -div.pad3 { padding: 5px 0px 10px 30px;} - -div.box { border: 2px solid #CCCCCC; padding:10px; overflow: hidden;} - -div.bar { border-left: 7px solid #00666a; padding:5px; margin-top:25px; } - -div.subsection {margin:25px 0px;} - -img {border:0px none;} - -th.majorth {text-align:left;} -th.minorth {font-weight:normal; text-align:left; width:8em; padding: 3px 0px;} -th.actionth {font-weight:normal; text-align:left;} - -.explain h5 {font-size:1em; margin-left: 1em;} - -div.doc {margin-left: 2em; margin-bottom: 3em;} - -th.trainingset { - border-bottom: thin dashed black; - font-weight:normal; - padding:0px 10px; -} -div.pop_content { - position:absolute; - z-index:50; - width:300px; - padding: 5px; - background: #E4ECEC; - font-size: 12px; - font-family: Arial; - border-style: double; - border-width: 3px; - border-color: #AA2244; - display:none; -} - -div.pop_content > *:first-child { - margin-top: 0px; -} - -div.pop_content h1, div.pop_content h2, div.pop_content h3, div.pop_content h4, -div.pop_content h5, div.pop_content h6, div.pop_content p { - margin: 0px; -} - -div.pop_content p + h1, div.pop_content p + h2, div.pop_content p + h3, -div.pop_content p + h4, div.pop_content p + h5, div.pop_content p + h6 { - margin-top: 5px; -} - -div.pop_content p + p { - margin-top: 5px; -} - -div.pop_content > *:last-child { - margin-bottom: 0px; -} - -div.pop_content div.pop_close { - /* old definition */ - float:right; - bottom: 0; -} - -div.pop_content span.pop_close, div.pop_content span.pop_back { - display: inline-block; - border: 2px outset #661429; - background-color: #CCC; - padding-left: 1px; - padding-right: 1px; - padding-top: 0px; - padding-bottom: 0px; - cursor: pointer; - color: #AA2244; /*#661429;*/ - font-weight: bold; -} - -div.pop_content span.pop_close:active, div.pop_content span.pop_back:active { - border-style: inset; -} - -div.pop_content span.pop_close { - float:right; - /*border: 2px outset #AA002B;*/ - /*color: #AA2244;*/ -} - -div.pop_content:not(.nested) .nested_only { - display: none; -} - -div.pop_back_sec { - margin-bottom: 5px; -} - -div.pop_close_sec { - margin-top: 5px; -} - -table.hide_advanced tr.advanced { - display: none; -} -span.show_more { - display: none; -} -table.hide_advanced span.show_more { - display: inline; -} -table.hide_advanced span.show_less { - display: none; -} - - -/***************************************************************************** - * Program logo styling - ****************************************************************************/ -div.prog_logo { - border-bottom: 0.25em solid #0f5f60; - height: 4.5em; - width: 24em; - display:inline-block; -} -div.prog_logo img { - float:left; - width: 4em; - border-style: none; - margin-right: 0.2em; -} -div.prog_logo h1, div.prog_logo h1:hover, div.prog_logo h1:active, div.prog_logo h1:visited { - margin:0; - padding:0; - font-family: Arial, Helvetica, sans-serif; - font-size: 3.2em; - line-height: 1em; - vertical-align: top; - display: block; - color: #026666; - letter-spacing: -0.06em; - text-shadow: 0.04em 0.06em 0.05em #666; -} -div.prog_logo h2, div.prog_logo h2:hover, div.prog_logo h2:active, div.prog_logo h2:visited { - display: block; - margin:0; - padding:0; - font-family: Helvetica, sans-serif; - font-size: 0.9em; - line-height: 1em; - letter-spacing: -0.06em; - color: black; -} - -div.big.prog_logo { - font-size: 18px; -} - -</style> - <style> -.block_td { - height:25px; -} -.block_container { - position:relative; - box-sizing: border-box; - height: 25px; - padding: 0px; - margin: 0px; - margin-left: 1em; -} -.block_label { - position: absolute; - display: inline-block; - padding: 3px; - z-index: 4; - top: 6px; - height: 12px; - line-height: 12px; - font-size: 12px; - background-color: white; - border: 1px solid black; - -moz-border-radius: 12px; - -webkit-border-radius: 12px; - border-radius: 12px; - transform: translateX(-50%); -} -.block_motif { - position: absolute; - z-index: 3; - top: 0px; - box-sizing: border-box; - border: 1px solid black; - height: 12px; - background-color: cyan; -} -.block_motif.top { - border-bottom-width: 0; -} -.block_motif.bottom { - border-top-width: 0; -} -.block_motif.scanned_site { - opacity: 0.3; -} -.block_motif.scanned_site.active { - opacity: 0.9; -} -.block_region { - position:absolute; - z-index:6; - height:25px; - top:0px; -} -.block_region.main { - z-index:8; -} -.block_region.scanned_site { - z-index:5; -} -.block_region.scanned_site.main { - z-index:7; -} -.block_region.top { - height:13px; -} -.block_region.bottom { - height:13px; - top:12px; -} -.block_rule { - position:absolute; - z-index:2; - width:100%; - height:1px; - top:12px; - left:0px; - background-color:gray; -} -.block_plus_sym { - position:absolute; - z-index:4; - line-height:12px; - top:0px; - left:-1em; -} -.block_minus_sym { - position:absolute; - z-index:4; - line-height:12px; - top:13px; - left:-1em; -} - -.tic_major { - position:absolute; - top:0em; - height:0.5em; - width: 2px; - margin-left: -1px; - background-color: blue; -} -.tic_minor { - position:absolute; - top:0em; - height:0.2em; - width: 1px; - margin-left: -0.5px; - background-color: blue; -} -.tic_label { - position:absolute; - display: inline-block; - top:0.5em; - height: 1em; - color: blue; - transform: translateX(-50%); -} - -.block_needle { - position:absolute; - z-index:4; - height:30px; - width:1px; - top:-2px; - background-color:gray; -} -.block_needle.right { - height: 60px; -} -.block_handle { - position: absolute; - display: inline-block; - z-index: 5; - top: 27px; - min-width: 3ex; - text-align: center; - font-size: 12px; - line-height: 12px; - transform: translateX(-50%); - background-color: LightGrey; - border:3px outset grey; - cursor: pointer; - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ - /* Rules below not implemented in browsers yet */ - -o-user-select: none; - user-select: none; -} -.block_handle.right { - top: 47px; -} - -.legend_container { - text-align: right; -} -.legend_entry { - display: inline-block; - padding: 5px; -} -div.legend_swatch { - box-sizing: border-box; - width: 15px; - height: 15px; - border: 1px solid black; - background-color: cyan; - float: left; -} -div.legend_swatch input { - display: none; -} -.legend_text { - line-height: 15px; - margin-left: 20px; -} -</style> - <style> -/* meme output specific css */ - -div.pop_block { - position:absolute; - z-index:5; - padding: 5px; - border: 1px solid black; - display: inline-block; - background-color: white; -} - -#measure_match { - position: absolute; - visibility: hidden; - height: auto; - width: auto; - white-space: nowrap; -} - -div.template { - position: absolute; - z-index: 1; - left: 0; - top: 0; - visibility: hidden; -} - -table.block_information { - margin-left: auto; - margin-right: auto; -} - -table.block_information * th { - text-align: right; -} - -*.hide_empty_seqs * tr.empty_seq { - display: none; -} - -*.hide_only_scan * tr.only_scan { - display: none; -} - -*.hide_only_scan * div.scanned_site { - display: none; -} - -td.symaction { - text-align: center; - text-decoration: underline; - font-size: 20px; - cursor: pointer; -} -div.sym_btn { - display:inline-block; - text-decoration: underline; - cursor: pointer; - font-size: 20px; - line-height:20px; - text-align: center; - width: 20px; - height: 20px; - color: blue; -} -div.sym_btn:hover { - color: white; - background-color: blue; -} - -div.sym_btn.positioned { - position: absolute; - top: 0px; -} - -div.actionbutton { - display:inline-block; - cursor: pointer; - font-size: 18px; - line-height:20px; - padding: 5px; - margin: 10px 0; - border: 1px solid black; -} - -div.actionbutton:hover { - color:#FFF; - background-color:#000; -} - -div.param_box { - display: inline-block; - margin-right: 20px; -} - -span.param { - font-weight: bold; -} - -div.box + div.box { - margin-top: 5px; -} - -div.sites_outer { - position: relative; - padding-top: 20px; /* height of header */ - display: inline-block; -} - -div.sites_inner { - overflow-x: hidden; - overflow-y: auto; - max-height: 200px; -} -table.sites_tbl { - border-collapse: collapse; -} - -div.sites_th_inner { - position: absolute; - top: 0; - line-height: 20px; /* height of header */ - text-align: left; - padding-left: 5px; -} -th.nopad div.sites_th_inner { - padding-left: 0; -} -div.sites_th_hidden { - visibility: hidden; - height: 0; - padding: 0 10px; -} -th.nopad div.sites_th_hidden { - padding: 0; -} -div.sites_inner * th { - height: 0; -} - -table.sites_tbl { - overflow-x: hidden; - overflow-y: auto; -} - -.site_num { - text-align: right; -} -.site_name { - padding:0px 5px; - text-align:left; -} -.site_strand { - padding:0px 5px; - text-align:center; -} -.norc .site_strand, .norc .site_strand_title { - display: none; -} -.site_start { - padding:0px 15px; - text-align: right; -} -.site_pvalue { - text-align:center; - padding:0px 15px; - text-align:right; - white-space: nowrap; -} -.lflank, .rflank, .match, .alpha_symbol { - font-weight:bold; - font-size:15px; - font-family: 'Courier New', Courier, monospace; - color:gray; -} - -.site.lflank { - text-align:right; - padding-right:5px; - color:gray; -} -.site.match { - text-align:center; -} -.site.rflank { - text-align:left; - padding-left:5px; - padding-right: 20px; -} - -th.stop_reason { - text-align: left; - padding-right: 10px; -} - -th.motif_ordinal { - -} -td.motif_ordinal { - text-align: right; - padding-right: 10px; -} -th.motif_logo { - padding-right: 10px; -} -td.motif_logo { - padding-right: 10px; -} -th.motif_evalue { - text-align:right; - padding-right: 10px; -} -td.motif_evalue { - text-align: right; - white-space: nowrap; - padding-right: 20px; -} -th.motif_nsites { - text-align: right; - padding-right: 10px; -} -td.motif_nsites { - text-align: right; - padding-right: 20px; -} -th.motif_width { - text-align: right; - padding-right: 5px; -} -td.motif_width { - text-align: right; - padding-right: 15px; -} -th.motif_more { - padding: 0 5px; -} -td.motif_more { - text-align: center; - padding: 0 5px; -} -th.motif_submit { - padding: 0 5px; -} -td.motif_submit { - text-align: center; - padding: 0 5px; -} -th.motif_download { - padding-left: 5px; -} -td.motif_download { - text-align: center; - padding-left: 5px; -} - - -div.tabArea { - font-size: 80%; - font-weight: bold; -} - -.norc div.tabArea { - display: none; -} - -span.tab, span.tab:visited { - cursor: pointer; - color: #888; - background-color: #ddd; - border: 2px solid #ccc; - padding: 2px 1em; - text-decoration: none; -} -span.tab.middle { - border-left-width: 0px; -} -div.tabArea.base span.tab { - border-top-width: 0px; -} -div.tabArea.top span.tab { - border-bottom-width: 0px; -} - -span.tab:hover { - background-color: #bbb; - border-color: #bbb; - color: #666; -} -span.tab.activeTab, span.tab.activeTab:hover, span.tab.activeTab:visited { - background-color: white; - color: black; - cursor: default; -} -div.tabMain { - border: 2px solid #ccc; - background-color: white; - padding: 10px; -} -div.tabMain.base { - margin-top: 5px; - display: inline-block; - max-width: 98%; -} - -div.tabMain.top { - margin-bottom: 5px; -} - -div.tabCenter { - max-width: 100%; - overflow-x: auto; - height: 200px; - overflow-y: hidden; -} - -canvas.logo_rc { - display:none; -} -.show_rc_logo > canvas { - display: none; -} -.show_rc_logo > canvas.logo_rc { - display: block; -} - -canvas.scan_logo { - margin-left: 10px; -} - -div.blocks_outer { - position: relative; - padding-top: 20px; /* height of header */ -} - -div.blocks_inner { - overflow-x: hidden; - overflow-y: auto; - max-height: 200px; -} -table.blocks_tbl { - border-collapse: collapse; - width: 100%; -} - -div.blocks_th_inner { - position: absolute; - top: 0; - line-height: 20px; /* height of header */ - text-align: left; - padding-left: 5px; -} -th.nopad div.blocks_th_inner { - padding-left: 0; -} -div.blocks_th_hidden { - visibility: hidden; - height: 0; - padding: 0 10px; -} -th.nopad div.blocks_th_hidden { - padding: 0; -} -div.blocks_inner * th { - height: 0; -} - -table.blocks_tbl { - overflow-x: hidden; - overflow-y: auto; -} -td.block_td { - width: 99%; -} - -*.blockdiag_num { - text-align: right; -} - -td.blockdiag_name { - text-align: left; - padding:0px 10px; -} - -td.blockdiag_pvalue { - padding:0px 10px; - text-align:right; - white-space: nowrap; -} - -div.preview_btn { - border: 2px solid white; - height: 16px; - width: 16px; - font-size: 12px; - line-height: 16px; - text-align: center; - cursor: pointer; -} -div.preview_btn + div.preview_btn { - margin-top: 3px; -} - -div.preview_btn.active { - border: 2px solid black; - cursor: default; -} - -div.preview_btn:hover { - background-color: black; - color: white; - border-color: black; -} - -div.preview_btn.active:hover { - background-color: white; - color: black; - border-color: black; -} - - -div.preview_btn_box { - position: absolute; - left: 0px; - top: 0px; - padding: 3px; -} - -div.preview_logo_box { - height: 50px; - overflow-y: hidden; -} - -div.preview_btn_box + div.preview_logo_box { - margin-left: 25px; -} - -div.preview_box { - position: relative; -} - -div.grey_background { - position:fixed; - z-index: 8; - background-color: #000; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; - opacity: 0.5; - left: 0; - top: 0; - width: 100%; - height: 100%; -} - -div.popup_wrapper { - position:fixed; - z-index:9; - width:100%; - height:0; - top:50%; - left:0; -} - -div.popup { - width: 600px; - z-index:9; - margin-left: auto; - margin-right: auto; - padding: 5px; - background-color: #FFF; - border-style: double; - border-width: 5px; - border-color: #00666a; - position:relative; -} -div.close { - cursor: pointer; - border: 1px solid black; - width:15px; - height:15px; - line-height:15px; /* this causes vertical centering */ - text-align:center; - background-color:#FFF; - color:#000; - font-size:15px; - font-family:monospace; -} - -div.close:hover { - color:#FFF; - background-color:#000; -} - -div.navnum { - width:100%; - height:20px; - line-height:20px; - text-align:center; - font-size:medium; -} - -div.navarrow { - font-size: 30px; - text-decoration:none; - cursor: pointer; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; -} - -div.navarrow > span.inactive { - display: inline; -} -div.navarrow > span.active { - display: none; -} - -div.navarrow:hover > span.active { - display: inline; -} -div.navarrow:hover > span.inactive { - display: none; -} - -table.programs { - width: 100%; -} - -table.programs tr { - background-color: #EFE; -} - -table.programs tr.selected { - background-color: #262; - color: #FFF; -} - -table.programs tr.dna_only { - display: none; -} - -table.programs.alphabet_dna tr.dna_only { - display: table-row; -} - -div.programs_scroll { - width: 100%; - height: 90px; - overflow-y: auto; - overflow-x: hidden; - margin: 0 auto; -} -table.inputs, table.alpha_bg_table { - margin-top: 20px; - border-collapse:collapse; -} -table.inputs * td, table.inputs * th, table.alpha_bg_table * td, table.alpha_bg_table * th { - padding-left: 15px; - padding-right: 15px; - padding-top: 1px; - padding-bottom: 1px; -} - -table.hide_psp td.col_psp, table.hide_psp th.col_psp { - display: none; -} - -/* program settings */ -span.mod_oops, span.mod_zoops, span.mod_anr { - display: none; -} -td.oops span.mod_oops,td.zoops span.mod_zoops, td.anr span.mod_anr { - display: inline; -} -span.strand_none, span.strand_given, span.strand_both { - display: none; -} -td.none span.strand_none, td.given span.strand_given, td.both span.strand_both { - display: inline; -} -span.spmap_uni, span.spmap_pam { - display: none; -} -td.uni span.spmap_uni, td.pam span.spmap_pam { - display: inline; -} -span.prior_dirichlet, span.prior_dmix, span.prior_mega, span.prior_megap, span.prior_addone { - display: none; -} -td.dirichlet span.prior_dirichlet, td.dmix span.prior_dmix, td.mega span.prior_mega, -td.megap span.prior_megap, td.addone span.prior_addone { - display: inline; -} -span.noendgaps_on, span.noendgaps_off { - display: none; -} -td.on span.noendgaps_on, td.off span.noendgaps_off { - display: inline; -} -span.substring_on, span.substring_off { - display: none; -} -td.on span.substring_on, td.off span.substring_off { - display: inline; -} -</style> - </head> - <body onload="page_loaded()" onpageshow="page_shown(event)" onresize="page_resized()"> - <!-- --> - <div id="grey_out_page" class="grey_background" style="display:none;"> - </div> - <!-- Help popups --> - <div class="pop_content" id="pop_"> - <p>Help poup.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_ev"> - <p>The statistical significance of the motif. MEME usually finds the most - statistically significant (low E-value) motifs first. It is unusual to - consider a motif with an E-value larger than 0.05 significant so, as an - additional indicator, MEME displays these partially transparent.</p> - <p>The E-value of a motif is based on its log likelihood ratio, width, - sites, the background letter frequencies (given in the command line - summary), and the size of the training set.</p> - <p>The E-value is an estimate of the expected number of motifs with the - given log likelihood ratio (or higher), and with the same width and site - count, that one would find in a similarly sized set of random - sequences (sequences where each position is independent and letters are - chosen according to the background letter frequencies).</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_sites"> - <p>The number of sites contributing to the construction of the motif.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_width"> - <p>The width of the motif. Each motif describes a pattern of a fixed - width, as no gaps are allowed in MEME motifs.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_more"> - <p>Click on the blue symbol below to reveal more information about this motif.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_submit_dl"> - <p>Click on the blue symbol below to reveal options allowing you - to submit this motif to another MEME Suite motif analysis program, to download this - motif in various text formats, or to download a sequence "logo" of - this motif PNG or EPS format.</p> - <h5>Supported Programs</h5> - <dl> - <dt>Tomtom</dt> - <dd>Tomtom is a tool for searching for similar known motifs. - [<a href="http://meme-suite.org/doc/tomtom.html?man_type=web">manual</a>]</dd> - <dt>MAST</dt> - <dd>MAST is a tool for searching biological sequence databases for - sequences that contain one or more of a group of known motifs. - [<a href="http://meme-suite.org/doc/mast.html?man_type=web">manual</a>]</dd> - <dt>FIMO</dt> - <dd>FIMO is a tool for searching biological sequence databases for - sequences that contain one or more known motifs. - [<a href="http://meme-suite.org/doc/fimo.html?man_type=web">manual</a>]</dd> - <dt>GOMO</dt> - <dd>GOMO is a tool for identifying possible roles (Gene Ontology - terms) for DNA binding motifs. - [<a href="http://meme-suite.org/doc/gomo.html?man_type=web">manual</a>]</dd> - <dt>SpaMo</dt> - <dd>SpaMo is a tool for inferring possible transcription factor - complexes by finding motifs with enriched spacings. - [<a href="http://meme-suite.org/doc/spamo.html?man_type=web">manual</a>]</dd> - </dl> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_llr"> - <p>The log likelihood ratio of the motif.The log likelihood ratio is the - logarithm of the ratio of the probability of the occurrences of the motif - given the motif model (likelihood given the motif) versus their - probability given the background model (likelihood given the null model). - (Normally the background model is a 0-order Markov model using the - background letter frequencies, but higher order Markov models may be - specified via the -bfile option to MEME.).</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_ic"> - <p>The information content of the motif in bits. It is equal to the sum - of the uncorrected information content, R(), in the columns of the pwm. - This is equal relative entropy of the motif relative to a uniform - background frequency model.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_re"> - <p>The relative entropy of the motif.</p> - - <p style="font-family: monospace;">re = llr / (sites * ln(2))</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_bt"> - <p>The Bayes Threshold.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_site_strand"> - <p>The strand used for the motif site.</p> - <dl> - <dt>+</dt> - <dd>The motif site was found in the sequence as it was supplied.</dd> - <dt>-</dt> - <dd>The motif site was found in the reverse complement of the supplied sequence.</dd> - </dl> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_site_start"> - <p>The position in the sequence where the motif site starts. If a motif - started right at the begining of a sequence it would be described as - starting at position 1.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_site_pvalue"> - <p>The probability that an equal or better site would be found in a - random sequence of the same length conforming to the background letter - frequencies.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_site_match"> - <p>A motif site with the 10 flanking letters on either side.</p> - <p>When the site is not on the given strand then the site - and both flanks are reverse complemented so they align.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_seq_name"> - <p>The name of the sequences as given in the FASTA file.</p> - <p>The number to the left of the sequence name is the ordinal - of the sequence.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_motif_sites"> - <p>These are the motif sites predicted by MEME and used to build the motif.</p> - <p>These sites are shown in solid color and hovering the cursor - over a site will reveal details about the site. Only sequences - that contain a motif site are shown.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_scanned_sites"> - <p>These are the motif sites predicted by MEME plus - any additional sites detected using a motif scanning - algorithm.</p> - <p>These MEME sites are shown in solid color and - additional scanned sites are shown in transparent color. - Hovering the cursor over a site will reveal details about the site. - Only sequences containing a predicted or scanned motif site are shown.</p> - <p>The scanned sites are predicted using a - log-odds scoring matrix constructed from the MEME sites. - Only scanned sites with position <i>p</i>-values less - than 0.0001 are shown.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_all_sequences"> - <p>These are the same sites as shown by selecting the - "Motif Sites + Scanned Sites" button except that all - sequences, including those with no sites, are included - in the diagram.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_seq_pvalue"> - <p>This is the combined match <i>p</i>-value.</p> - <p>The combined match <i>p</i>-value is defined as the probability that a - random sequence (with the same length and conforming to the background) - would have position <i>p</i>-values such that the product is smaller - or equal to the value calulated for the sequence under test.</p> - <p>The position <i>p</i>-value is defined as the probability that a - random sequence (with the same length and conforming to the background) - would have a match to the motif under test with a score greater or equal - to the largest found in the sequence under test.</p> - <p>Hovering your mouse over a motif site in the motif location - block diagram will show its position <i>p</i>-value and other information - about the site.</p> - - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motif_location"> - <p>This diagram shows the location of motif sites.</p> - <p>Each block shows the position and strength of a motif - site. The height of a block gives an indication of the - significance of the site as taller blocks are more significant. - The height is calculated to be proportional to the negative - logarithm of the <i>p</i>-value of the site, truncated at - the height for a <i>p</i>-value of 1e-10.</p> - <p>For complementable alphabets (like DNA), sites on the - positive strand are shown above the line, - sites on the negative strand are shown below.</p> - <p>Placing the cursor - over a motif site will reveal more information about the site - including its position <i>p</i>-value. (See the help - for the <i>p</i>-value column for an explanation of position - <i>p</i>-values.)</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_seq_source"> - <p>The name of the file of sequences input to MEME.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_psp_source"> - <p>The position specific priors file used by MEME to find the motifs.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_seq_alph"> - <p>The alphabet used by the sequences.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_seq_count"> - <p>The number of sequences provided as input to MEME.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_alph_name"> - <p>The name of the alphabet symbol.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_alph_freq"> - <p>The frequency of the alphabet symbol in the dataset with a pseudocount - so it is never zero.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_alph_bg"> - <p>The frequency of the alphabet symbol as defined by the background model.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <!-- templates --> - <div id="measure_match" class="match"></div> - <div class="template pop_block" id="tmpl_block_info"> - <div> - <span class="tvar_logo_pad lflank" style="visibility:hidden;"></span> - <span class="tvar_logo"></span> - </div> - <div class="block_sequence_fragment"> - <span class="tvar_lflank lflank"></span> - <span class="tvar_match match"></span> - <span class="tvar_rflank rflank"></span> - </div> - <table class="block_information"> - <tr><th>Motif</th><td class="tvar_motif">1</td></tr> - <tr><th><i>p</i>-value</th><td class="tvar_pvalue">8.23e-7</td></tr> - <tr><th>Start</th><td class="tvar_start">23</td></tr> - <tr><th>End</th><td class="tvar_end">33</td></tr> - </table> - </div> - - <div class="template pop_block" id="tmpl_scan_info"> - <h5>Scanned Site</h5> - <div class="tvar_logo"></div> - <table class="block_information"> - <tr><th>Motif</th><td class="tvar_motif">1</td></tr> - <tr><th><i>p</i>-value</th><td class="tvar_pvalue">8.23e-7</td></tr> - <tr><th>Start</th><td class="tvar_start">23</td></tr> - <tr><th>End</th><td class="tvar_end">33</td></tr> - </table> - </div> - - <div class="template box expanded_motif" id="tmpl_motif_expanded"> - <div style="position: relative; min-height: 20px"> - <div class="param_box"> - <span class="param"><span class="tvar_ordinal"></span>.</span> - </div> - <div class="sym_btn positioned tvar_less" tabindex="0" - title="Show less information.">↥</div> - <div class="sym_btn positioned tvar_submit" tabindex="0" - title="Submit the motif to another MEME Suite program or download it.">⇢</div> - </div> - <div> - <div class="param_box"> - <span class="param"><i>E</i>-value:</span> - <span class="tvar_evalue"></span> - <div class="help" data-topic="pop_ev"></div> - </div> - <div class="param_box"> - <span class="param">Site Count:</span> - <span class="tvar_site_count"></span> - <div class="help" data-topic="pop_sites"></div> - </div> - <div class="param_box"> - <span class="param">Width:</span> - <span class="tvar_width"></span> - <div class="help" data-topic="pop_width"></div> - </div> - </div> - <div class="tabMain base"> - <div class="tabCenter tvar_logo"></div> - </div> - <div class="tabArea base"> - <span class="tvar_tab tab" tabindex="0">Standard</span><span - class="tvar_tab_rc tab middle" tabindex="0">Reverse - Complement</span> - </div> - <div style="padding: 10px 0"> - <div class="param_box"> - <span class="param">Log Likelihood Ratio:</span> - <span class="tvar_llr"></span> - <div class="help" data-topic="pop_llr"></div> - </div> - <div class="param_box"> - <span class="param">Information Content:</span> - <span class="tvar_ic"></span> - <div class="help" data-topic="pop_ic"></div> - </div> - <div class="param_box"> - <span class="param">Relative Entropy:</span> - <span class="tvar_re"></span> - <div class="help" data-topic="pop_re"></div> - </div> - <div class="param_box"> - <span class="param">Bayes Threshold:</span> - <span class="tvar_bt"></span> - <div class="help" data-topic="pop_bt"></div> - </div> - </div> - <div class="tvar_sites"></div> - </div> - - - <div class="popup_wrapper"> - <div class="popup" style="display:none; top: -150px;" id="download"> - <div> - <div style="float:right; "> - <div id="outpop_close" class="close" tabindex="0">x</div> - </div> - <h2 class="mainh" style="margin:0; padding:0;">Submit or Download</h2> - <div style="clear:both"></div> - </div> - <div style="height:100px"> - <div style="float:right; width: 30px;"> - <div id="outpop_prev" class="navarrow" tabindex="0"> - <span class="inactive">⇧</span><span class="active">⬆</span> - </div> - <div id="outpop_num" class="navnum"></div> - <div id="outpop_next" class="navarrow" tabindex="0"> - <span class="inactive">⇩</span><span class="active">⬇</span> - </div> - </div> - <div id="logo_box" style="height: 100px; margin-right: 40px;"> - <canvas id="outpop_logo" height="100" width="580"></canvas> - <canvas id="outpop_logo_rc" class="logo_rc" height="100" width="580"></canvas> - </div> - </div> - <div> - <!-- tabs start --> - <div class="tabArea top"> - <span id="outpop_tab_1" class="tab">Submit Motif</span><span - id="outpop_tab_2" class="tab middle">Download Motif</span><span - id="outpop_tab_3" class="tab middle">Download Logo</span> - </div> - <div class="tabMain top"> - <!-- Submit to another program --> - <div id="outpop_pnl_1"> - <h4 class="compact">Submit to program</h4> - <table id="programs" class="programs"> - <tr class="dna_only"> - <td><input type="radio" name="program" value="tomtom" id="submit_tomtom"></td> - <td><label for="submit_tomtom">Tomtom</label></td> - <td><label for="submit_tomtom">Find similar motifs in - published libraries or a library you supply.</label></td> - </tr> - <tr> - <td><input type="radio" name="program" value="fimo" id="submit_fimo"></td> - <td><label for="submit_fimo">FIMO</label></td> - <td><label for="submit_fimo">Find motif occurrences in - sequence data.</label></td> - </tr> - <tr> - <td><input type="radio" name="program" value="mast" id="submit_mast"></td> - <td><label for="submit_mast">MAST</label></td> - <td><label for="submit_mast">Rank sequences by affinity to - groups of motifs.</label></td> - </tr> - <tr class="dna_only"> - <td><input type="radio" name="program" value="gomo" id="submit_gomo"></td> - <td><label for="submit_gomo">GOMo</label></td> - <td><label for="submit_gomo">Identify possible roles (Gene - Ontology terms) for motifs.</label></td> - </tr> - <tr class="dna_only"> - <td><input type="radio" name="program" value="spamo" id="submit_spamo"></td> - <td><label for="submit_spamo">SpaMo</label></td> - <td><label for="submit_spamo">Find other motifs that are - enriched at specific close spacings which might imply the existance of a complex.</label></td> - </tr> - </table> - </div> - <!-- download text format --> - <div id="outpop_pnl_2"> - <div> - <label for="text_format">Format:</label> - <select id="text_format"> - <option value="0">Count Matrix</option> - <option value="1">Probability Matrix</option> - <option value="2">Minimal MEME</option> - <option value="3">FASTA</option> - <option value="4">Raw</option> - </select> - </div> - <form id="text_form" method="post" action=""> - <script>$("text_form").action = site_url + "/utilities/save_generated_file";</script> - <input type="hidden" id="text_name" name="name" value="motif.txt"> - <input type="hidden" name="mime_type" value="text/plain"> - <textarea id="outpop_text" name="content" - style="width:99%; white-space: pre; word-wrap: normal; overflow-x: scroll;" - rows="8" readonly="readonly" wrap="off"></textarea> - </form> - </div> - <!-- download logo format --> - <div id="outpop_pnl_3"> - <form id="logo_form" method="post" action=""> - <script>$("logo_form").action = site_url + "/utilities/generate_logo";</script> - <input type="hidden" name="program" value="MEME"/> - <input type="hidden" id="logo_motifs" name="motifs" value=""/> - <table> - <tr> - <td><label for="logo_format">Format:</label></td> - <td> - <select id="logo_format" name="png"> - <option value="1">PNG (for web)</option> - <option value="0">EPS (for publication)</option> - </select> - </td> - </tr> - <tr> - <td><label for="logo_rc">Orientation:</label></td> - <td> - <select id="logo_rc" name="rc1"> - <option value="0">Normal</option> - <option value="1" id="logo_rc_option">Reverse Complement</option> - </select> - </td> - </tr> - <tr> - <td><label for="logo_ssc">Small Sample Correction:</label></td> - <td> - <input type="hidden" id="logo_err" name="errbars" value="0"/> - <select id="logo_ssc" name="ssc"> - <option value="0">Off</option> - <option value="1">On</option> - </select> - </td> - </tr> - <tr> - <td><label for="logo_width">Width:</label></td> - <td> - <input type="text" id="logo_width" size="4" placeholder="default" name="width"/> cm - </td> - </tr> - <tr> - <td><label for="logo_height">Height:</label></td> - <td> - <input type="text" id="logo_height" size="4" placeholder="default" name="height"/> cm - </td> - </tr> - </table> - </form> - </div> - <!-- Buttons --> - <div> - <div style="float:left;"> - <input type="button" id="outpop_do" value="Submit" /> - </div> - <div style="float:right;"> - <input id="outpop_cancel" type="button" value="Cancel" /> - </div> - <div style="clear:both;"></div> - </div> - </div> - </div> - </div> - </div> - - - - <!-- Page starts here --> - <div id="top" class="pad1"> - <div class="prog_logo big"> - <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABGCAYAAACUsCfoAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9wLHAInL7an9JAAAA8eSURBVHja7ZpZbxv3ucZ/s3AZ7qQkypZELZS3WHKiRJbTFnHqOjZcGzCQBf0A7cUB8glOb89dz30vChRp7xK0aZo4TYq6dtKqSew6iuJWpmPJlrVFFCmKI+7LLJw5F81MFZyec5rTILJaP8AAnAty+Pzf933ebeAhHuIhHuIhHmJPo6TpaeGLfimTydhLS0sUCgWazSbVahXDMOh0Ong8HiKRCAMDAxw+fJhHH31UeFDJ/91/bHp62r558ya6rmOaJuvr6+TzeYrFIoZhAOD1epFlmWAwSDqdZnR0lCNHjjA+Ps7+/fuFPUU8k8nYV69epVKpEA6HuXPnDrOzs7RaLbxeL93d3fj9foLBIB6Ph0ajQaVSAUBRFNLpNI888ggHDhzg3Llzwp4g/vbbb9szMzPE43FyuRwffPAB2WyWnp4ehoaGiMVi2LZNvV6n3W7j8/mIRqN4vV4ajQa1Wo2trS0OHTqEaZo89dRTfO973xMeaOKvvfaaffv2bcLhMCsrK/z+979HVVWOHz/O0NAQxWIRVVVRVRW/348oihiGgSiKxGIxurq6CAQCBINB3n//fcbGxiiXyxw7dowXX3yx1Nvbm3igiBcKhY9u3rw5OTMzQzgc5vbt23zwwQfIsszExAS2bZPP55EkiVAoRCQSIRwOI8sy5XKZ7e1tWq0WnU6HTqfD4OAggUAAVVXpdDo0m01GRkb44Q9/KDxQxH/729/as7Oz+Hw+Pv30U37zm9/g9Xrp6emht7eXYDCI3+/H6/UiCALtdhvLsuh0OkiSRCAQQJZl6vU65XKZ1dVV+vv7SSQS5PN5vF4vhUKBgwcP8qMf/WjXyIs7b+7cuWMvLi4iCAL1ep133nkHXdcZHh4mlUoRDofp7+8nHo9jGAaCIBCPx+nr6yOdTtPX14fH40HTNGRZpqenh76+PrLZLMVikYGBARRFwTRN5ubm+PGPf2zvFnF5583c3BzlchlZlrl16xa1Wo2xsTGi0SiDg4OutUzTJBKJIIoiXq+XQCBAIpEgFAphmiaqqlIoFKjVaoyOjhKJRFhfXycajRKNRunp6WFhYYG33nqLQqHwUTKZPP5VE5ecD5cvX7bv37+Poijkcjl++ctfMjo6ytDQEMlkEo/HQ7lcpt1u4/F4kGUZQRDw+Xz09fVx4MABRkZGSKVSdHV10el0KJVK1Ot14vE4kiRRKpVQFIV4PI5t23z66ad0Op2+K1eu/MeuWVxVVUzTRNd17t27RzKZJJFIEI1GEUWRdruNaZqIoogkSYiiiCiK+P1+AoEA0WiUQ4cOCQCbm5vb5XI5Xi6XWVtbw7ZtZFnG7/e7D1YUhWAwSLVaJZvN2v39/cJXHuOLi4t2sVhEEAS2t7eZn59n//79JBIJwuEwlmXRbDbRdR1BEBAEAcuysCwL2/5LmIriX+Wit7c3EY/HSSQSeDweDMPA4/EQCoWwbRvbtgmFQoTDYUqlErlcbnfE7f79+64gbWxs0G63icViRCIRBEHANE0Mw0CSJLxer0vSUfVKpUKxWGRtbc12UmKr1cI0TQD3t4PBoHtwgUAAv99Ps9kkn8/vjrjlcjlkWabdbrO8vEx3dzfhcJhoNEq9XkfTNERRxOfz4fV6sW0bSZJcBS+VSqytrdFqtbh+/bq9sLBALpdje3sbXddd4jutLwh/8WzLslBVdXeI12o1RFFkc3PTLTFjsRixWAxVVbEsC1mWkSTJdVXnMgyDarWKrusUi0X8fj+WZVGtVimXyxiGgW3bblh4PB78fj/tdhvbthFF0a3tv3Liuq4jiiKFQgFZlolEInR3d6MoConEXytLp1Bx0Ol0sG0bXdfRdZ1arYYgCNi2jaZptFot1zOcQ3LSnxMGzsHvCnHH/RqNBtFoFEmSCIfDAAwNDWFZFu12m0ajgaZpWJbl/oDH4/ncoTii5xBz1N+2bTqdDrIs4/P53MxgWRaapu2exQOBgHsAnU6HdrvN5uYmgUCASCRCJBIhkUhgmibNZpNarUaj0XAt71jfET1RFN1YliTJfUa73SaZTLK1tUWtVkPTNKampnaHuFNGyrKM1+t141bTNGq1GrVazS1EIpEI8XjcLWJqtdrnYthNF58pv23beL1eJEly1VzXder1Oq1Wi2AwiK7ru0PcSSs73bBYLBIMBpEkCdM0qVQq6LpOq9UiHA673Vmn08E0TfdyRM85CNM08Xq9bkoMhULugRqGgd/v3z1Xl2X5c24aDodRVZV4PO7W406/raoqtVqNYDCIz+dDURQ3vp3LuXeEz4nlTqdDOBxG13U3TBRF2b0mJRAI0Gg0EAQBTdPw+/2Uy2VXoJzRkkPEifNWq0UgEHCLEsedLcty1X1nzIdCIRRFoVQqUSqVsCyLYDBIPB7fncotlUq5JaWu6xiGgWmabG1tuanINE0EQXAPwSlk6vU6zWaTdruNpmnud3eWsk6fnkwmMU2Tzc1NVFVFURSi0SjpdHp3iB89ehRRFOnt7XWHCNFolFwu58ar08AYhuEWNH6/H4/H8zlL71R4J5XJskwgECAWi5HP51lZWaHVajE8PEw8Hufw4cO7Q3zfvn0C4E5MNU2jq6uLarVKPp//nPA5hYgzcYlEIoRCIfcQHLd3SDvEPR4PHo+HfD5PPp9HEARGRkYIhUIMDQ0Ju0Ic4NixY3g8Hnp7e8lms8RiMcLhMNlsFk3TXHW3bZtgMOjmfScEvF6vW8s7qczxgGazSSAQ4M9//jOqqlKpVHj88cfx+XyMjY3t7ujp1KlTQrlcdicupVKJkZER1tbWuHfvHqqqEolEiMVitNtt6vW6q+iNRoNms4kkSfh8PtfC0WgURVHo7+9nc3OTjY0N3n33XQYGBkilUiSTSU6ePCnsKnGA559/nkqlwtGjR8nn8/j9fh5//HEsy+LWrVvMz8+j6zqhUAifz4dhGG7z0mq1UFUVXdeJRCIEg0F32loqlbh37x53796lq6sLRVGIRCJMTEzs2pT1c8Qfe+wxYWpqyv1j2WyWVCpFIpGgUqkwNzfHnTt33JTnDCUlSaK7u5v+/n66u7vxeDxun16r1SgUCly/fp3bt29z+vRpBgcHqdVqRKPRB2uh8LOf/cyemZlhYWGBYDBIJBIBoFgs0mw2CYfDxONxfD4fg4ODros7vXWhUKDT6bg5/v3332dlZYWhoSHS6TSnTp1i3759VKtVzpw5w1c9dvpfNymvvPKKff36dbLZLIqiuBVWs9mk0WhgWZbbn4fDYURRRNM0AoEAvb29+Hw+Go0Gly9fZmNjg4mJCcbGxti/f787mJyfn6darTI5OcmJEyeEB4J4sVj8wfT09L/Pzs6SzWbdpWEikXBJGoZBs9kkGo0iyzKmabrLhtXVVTKZDJubm5w9e5YjR44wMDDAd7/7XWF2dtZeXFzkyJEj7pZm//79pFIpenp6vhIP+D8f8NZbb9nr6+ssLy+ztbXl1t5er9fdhxeLRSRJoquri0qlQiaTYXt7m0gkwpkzZ5BlmbGxMV544QX3eR9//LE9Pz/PsWPHuHHjBouLi0iSxMDAAMePH2dqakrYVeIAKysr9u3bt1leXnZn65qmoeu6W9AYhkGj0aBYLGKaJocOHeLRRx8lkUgwOTnpjp4d5HI5++OPP6ZcLjM+Ps61a9dYWFig2Wzi9Xp5/vnnOX36tLCrxHfi1q1b9tLSkuv+9XrdbTEVRSEWi5FMJhkdHWV4eJiDBw/+j8/Y2tr6+WuvvfYdwzBIpVJIkoSqqszPz1Ov17lw4QJf+9rXziYSiau7TvxvoVQqpUul0n2n2/oibz+899579k9/+lPC4TCnTp3i61//Orlcjp/85CdomsbTTz/NiRMn/pvH/CMotrQfyF/GD8Xj8aX/7yEePnx4dnx8fPJ3v/sdiqIwODjI5OSkcOPGDfvNN9/kypUr5PN5MpmMPT4+/qWQ71Z835fZZSSTyeMrKyt2vV7n7t27vPrqq1y7ds1+8sknhT/+8Y/2pUuXuHnzJs1mk6WlJTudTn8p5EUeAAwPDwvPPfccBw4cYHV1lc+KJ3t0dPTVixcvcvDgQebn53n55ZeZmZn5h1fLalv/twfqTaRMJmP/4he/YH19nSNHjnDhwgVisRj37t3jnXfeYWFhgQMHDnD+/HmeeuopYc9b3MH4+LjwrW99C0EQuHXrFtPT09RqNfr7+zlx4gTpdJqNjQ3efPNN3njjDbtYLP5gV1X9y8bly5ft119/nUqlwsmTJzl9+jQej4ePPvqITz75hLW1NYLBIJOTk5w7d46+vr4vzEN+EImfO3dOuHr1qv3666/z3nvvoWkaZ8+e5YknnnBXU5qmcfPmTQzDYG1tzR4cHBT2vMUdTE9P25cuXaJQKDA5OcmFCxfQdZ3Z2VkWFhbY2NhAURRSqRTPPvssY2Njwp62uINvfvObwp/+9Cf7V7/6FTdu3KDT6XD+/HmmpqbcoaaqqszOzmIYxhfK9Q80cYCJiQlhbm7OFgSBubk5vF4vzzzzDBMTE+7CMRgMsrCwwEsvvcS1a9fsb3zjG8KedvWd+OSTT+y3336bubk5JicnOXnyJJZl8eGHH7K2tkahUKDRaLBv3z4uXrzI2bNnhT1tcQdHjx4VMpmM3el0WFxcJBQKMTU1xbFjx6hWqwC0221WVlb49a9/zY0bN+wnn3xS2BN5/O/J88899xzDw8NkMhnm5uaIx+M8/fTT9PT0YFkWg4ODrK6u8sorrzA/P2/veVffidXVVfvdd99lenqa8+fPMzo6iqZp/OEPf2BhYYFWq4Usy4yMjHDx4kX+luXlvUh8aGhImJmZsS3L4vr165imSSqVYt++fbTbbWq1GtVqlWq1yt27d7l//749Ojoq7HniAFNTU8LS0pJdLpe5e/cu6+vrRCIRhoeHqVarrK6uous66+vrZLNZSqVS+rP2eW8TB0in00I2m3XVHqCvr49YLEYikXBfRiqXy+Ryufs7Q1tkj6O/v1/49re/zTPPPIMgCMzPz7sraJ/Ph9/vd/d3pVIp/U9hcQdOnX7p0iU7k8kgiqK76lIUxX19dKerC/wTYXt7+8zm5uaV5eVlNjY2iMfj+P1+hoeH6enpmd35evg/FXEHm1uF7ZXltXgg6EcSPSR7u/+zO9H1ff6VsFWq/pyHeIiHeIh/FfwXjVDdIW9O2PAAAAAASUVORK5CYII=" alt="MEME Logo"> - <h1>MEME</h1> - <h2>Multiple Em for Motif Elicitation</h2> - </div> - <p> - For further information on how to interpret these results or to get a - copy of the MEME software please access - <a href="http://meme-suite.org/">http://meme-suite.org</a>. - </p> - <p>If you use MEME in your research, please cite the following paper:<br /> - <span class="citation"> - Timothy L. Bailey and Charles Elkan, - "Fitting a mixture model by expectation maximization to discover motifs in biopolymers", - <em>Proceedings of the Second International Conference on Intelligent Systems - for Molecular Biology</em>, pp. 28-36, AAAI Press, Menlo Park, California, 1994. - <a href="http://meme-suite.org/doc/ismb94.pdf">[pdf]</a> - </span> - </p> - </div> - <!-- navigation --> - <div class="pad2"> - <a class="jump" href="#motifs_sec">Discovered Motifs</a> - | - <a class="jump" href="#sites_sec">Motif Locations</a> - | - <a class="jump" href="#inputs_sec">Inputs & Settings</a> - | - <a class="jump" href="#info_sec">Program information</a> - </div> - <!-- alert the user when their browser is not up to the task --> - <noscript><h1 style="color:red">Javascript is required to view these results!</h1></noscript> - <h1 id="html5_warning" style="color:red; display:none;">Your browser does not support canvas!</h1> - <script> - if (!window.HTMLCanvasElement) $("html5_warning").style.display = "block"; - </script> - <h2 class="mainh pad2" id="motifs_sec">Discovered Motifs</h2> - <div id="motifs" class="box"> - <p>Please wait... Loading...</p> - <p>If the page has fully loaded and this message does not disappear then an error may have occurred.</p> - </div> - <h2 class="mainh pad2" id="sites_sec">Motif Locations</h2> - <div id="blocks" class="box"> - <p>Please wait... Loading...</p> - <p>If the page has fully loaded and this message does not disappear then an error may have occurred.</p> - </div> - <h2 class="mainh pad2" id="inputs_sec">Inputs & Settings</h2> - <div class="box"> - <h4>Sequences</h4> - <table id="seq_info" class="inputs"> - <tr><th>Source <div class="help" data-topic="pop_seq_source"></div></th> - <th class="col_psp">PSP Source <div class="help" data-topic="pop_psp_source"></div></th> - <th>Alphabet <div class="help" data-topic="pop_seq_alph"></div></th> - <th>Sequence Count <div class="help" data-topic="pop_seq_count"></div></th> - </tr> - <tr> - <td id="ins_seq_source"></td> - <td id="ins_seq_psp" class="col_psp"></td> - <td id="ins_seq_alphabet"></td> - <td id="ins_seq_count"></td> - </tr> - </table> - <script> - { - var db = data.sequence_db; - $("ins_seq_source").innerHTML = db.source; - $("ins_seq_alphabet").innerHTML = meme_alphabet.get_alphabet_name(); - $("ins_seq_count").innerHTML = db.sequences.length; - if (db.psp) { - $("ins_seq_psp").innerHTML = db.psp; - } - toggle_class($("seq_info"), "hide_psp", !(db.psp)); - } - </script> - <h4>Background</h4> - <span id="alpha_bg"></span> - <script> - { - $("alpha_bg").appendChild(make_alpha_bg_table(meme_alphabet, data.sequence_db.freqs)); - } - </script> - <h4>Other Settings</h4> - <table id="tbl_settings" class="inputs hide_advanced"> - <tr> - <th>Motif Site Distribution</th> - <td id="opt_mod"> - <span class="mod_zoops">ZOOPS: Zero or one site per sequence</span> - <span class="mod_oops">OOPS: Exactly one site per sequence</span> - <span class="mod_anr">ANR: Any number of sites per sequence</span> - </td> - </tr> - <tr> - <th>Site Strand Handling</th> - <td id="opt_strand"> - <span class="strand_none">This alphabet only has one strand</span> - <span class="strand_given">Sites must be on the given strand</span> - <span class="strand_both">Sites may be on either strand</span> - </td> - </tr> - <tr> - <th>Maximum Number of Motifs</th> - <td id="opt_nmotifs"></td> - </tr> - <tr> - <th>Motif E-value Threshold</th> - <td id="opt_evt"></td> - </tr> - <tr> - <th>Minimum Motif Width</th> - <td id="opt_minw"></td> - </tr> - <tr> - <th>Maximum Motif Width</th> - <td id="opt_maxw"></td> - </tr> - <tr> - <th>Minimum Sites per Motif</th> - <td id="opt_minsites"></td> - </tr> - <tr> - <th>Maximum Sites per Motif</th> - <td id="opt_maxsites"></td> - </tr> - <tr class="advanced"> - <th>Bias on Number of Sites</th> - <td id="opt_wnsites"></td> - </tr> - <tr class="advanced"> - <th>Sequence Prior</th> - <td id="opt_prior"> - <span class="prior_dirichlet">Simple Dirichlet</span> - <span class="prior_dmix">Dirichlets Mix</span> - <span class="prior_mega">Mega-weight Dirichlets Mix</span> - <span class="prior_megap">Mega-weight Dirichlets Mix Plus</span> - <span class="prior_addone">Add One</span> - </td> - </tr> - <tr class="advanced"> - <th>Sequence Prior Strength</th> - <td id="opt_b"></td> - </tr> - <tr class="advanced"> - <th>EM Starting Point Source</th> - <td id="opt_substring"> - <span class="substring_on">From substrings in input sequences</span> - <span class="substring_off">From strings on command line (-cons)</span> - </td> - </tr> - <tr class="advanced"> - <th>EM Starting Point Map Type</th> - <td id="opt_spmap"> - <span class="spmap_uni">Uniform</span> - <span class="spmap_pam">Point Accepted Mutation</span> - </td> - </tr> - <tr class="advanced"> - <th>EM Starting Point Fuzz</th> - <td id="opt_spfuzz"></td> - </tr> - <tr class="advanced"> - <th>EM Maximum Iterations</th> - <td id="opt_maxiter"></td> - </tr> - <tr class="advanced"> - <th>EM Improvement Threshold</th> - <td id="opt_distance"></td> - </tr> - <tr class="advanced"> - <th>Trim Gap Open Cost</th> - <td id="opt_wg"></td> - </tr> - <tr class="advanced"> - <th>Trim Gap Extend Cost</th> - <td id="opt_ws"></td> - </tr> - <tr class="advanced"> - <th>End Gap Treatment</th> - <td id="opt_noendgaps"> - <span class="noendgaps_on">No cost</span> - <span class="noendgaps_off">Same cost as other gaps</span> - </td> - </tr> - <tr> - <td colspan="2" style="text-align: center"> - <a href="javascript:toggle_class(document.getElementById('tbl_settings'), 'hide_advanced')"> - <span class="show_more">Show Advanced Settings</span> - <span class="show_less">Hide Advanced Settings</span> - </a> - </td> - </tr> - </table> - <script> - { - $("opt_mod").className = data.options.mod; - $("opt_strand").className = (meme_alphabet.has_complement() ? (data.options.revcomp ? "both" : "given") : "none"); - $("opt_nmotifs").textContent = data.options.nmotifs; - $("opt_evt").textContent = (typeof data.options.evt === "number" ? data.options.evt : "no limit"); - $("opt_minw").textContent = data.options.minw; - $("opt_maxw").textContent = data.options.maxw; - $("opt_minsites").textContent = data.options.minsites; - $("opt_maxsites").textContent = data.options.maxsites; - $("opt_wnsites").textContent = data.options.wnsites; - $("opt_spmap").className = data.options.spmap; - $("opt_spfuzz").textContent = data.options.spfuzz; - $("opt_prior").className = data.options.prior; - $("opt_b").textContent = data.options.b; - $("opt_maxiter").textContent = data.options.maxiter; - $("opt_distance").textContent = data.options.distance; - $("opt_wg").textContent = data.options.wg; - $("opt_ws").textContent = data.options.ws; - $("opt_noendgaps").className = (data.options.noendgaps ? "on" : "off"); - $("opt_substring").className = (data.options.substring ? "on" : "off"); - } - </script> - </div> - <!-- list information on this program --> - <div id="info_sec" class="bar"> - <div class="subsection"> - <h5 id="version">MEME version</h5> - <span id="ins_version"></span> - (Release date: <span id="ins_release"></span>)<br> - </div> - <script> - $("ins_version").innerHTML = data["version"]; - $("ins_release").innerHTML = data["release"]; - </script> - <div class="subsection"> - <h5 id="reference">Reference</h5> - <span class="citation"> - Timothy L. Bailey and Charles Elkan, - "Fitting a mixture model by expectation maximization to discover motifs in biopolymers", - <em>Proceedings of the Second International Conference on Intelligent Systems - for Molecular Biology</em>, pp. 28-36, AAAI Press, Menlo Park, California, 1994. - </span> - </div> - <div class="subsection"> - <h5 id="command">Command line</h5> - <textarea id="cmd" rows="5" style="width:100%;" readonly="readonly"> - </textarea> - <script>$("cmd").value = data["cmd"].join(" ");</script> - </div> - </div> - - </body> -</html>
--- a/test-data/meme_output_test1.txt Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/meme_output_test1.txt Wed Dec 11 18:05:35 2019 -0500 @@ -1,325 +1,61 @@ ******************************************************************************** MEME - Motif discovery tool -******************************************************************************** -MEME version 4.12.0 (Release date: Tue Jun 27 16:22:50 2017 -0700) - -For further information on how to interpret these results or to get -a copy of the MEME software please access http://meme-suite.org . - -This file may be used as input to the MAST algorithm for searching -sequence databases for matches to groups of motifs. MAST is available -for interactive use and downloading at http://meme-suite.org . -******************************************************************************** - - -******************************************************************************** +MEME version 5.0.5 (Release date: Mon Mar 18 20:12:19 2019 -0700) REFERENCE -******************************************************************************** -If you use this program in your research, please cite: - -Timothy L. Bailey and Charles Elkan, -"Fitting a mixture model by expectation maximization to discover -motifs in biopolymers", Proceedings of the Second International -Conference on Intelligent Systems for Molecular Biology, pp. 28-36, -AAAI Press, Menlo Park, California, 1994. -******************************************************************************** - - -******************************************************************************** TRAINING SET -******************************************************************************** -DATAFILE= meme_input_1.fasta +CONTROL SEQUENCES= --none-- ALPHABET= ACDEFGHIKLMNPQRSTVWY Sequence name Weight Length Sequence name Weight Length ------------- ------ ------ ------------- ------ ------ chr21_19617074_19617124_ 1.0000 50 chr21_26934381_26934431_ 1.0000 50 -chr21_28217753_28217803_ 1.0000 50 chr21_31710037_31710087_ 1.0000 50 -chr21_31744582_31744632_ 1.0000 50 chr21_31768316_31768366_ 1.0000 50 -chr21_31914206_31914256_ 1.0000 50 chr21_31933633_31933683_ 1.0000 50 -chr21_31962741_31962791_ 1.0000 50 chr21_31964683_31964733_ 1.0000 50 -chr21_31973364_31973414_ 1.0000 50 chr21_31992870_31992920_ 1.0000 50 -chr21_32185595_32185645_ 1.0000 50 chr21_32202076_32202126_ 1.0000 50 -chr21_32253899_32253949_ 1.0000 50 chr21_32410820_32410870_ 1.0000 50 -chr21_36411748_36411798_ 1.0000 50 chr21_37838750_37838800_ 1.0000 50 -chr21_45705687_45705737_ 1.0000 50 chr21_45971413_45971463_ 1.0000 50 -chr21_45978668_45978718_ 1.0000 50 chr21_45993530_45993580_ 1.0000 50 -chr21_46020421_46020471_ 1.0000 50 chr21_46031920_46031970_ 1.0000 50 -chr21_46046964_46047014_ 1.0000 50 chr21_46057197_46057247_ 1.0000 50 -chr21_46086869_46086919_ 1.0000 50 chr21_46102103_46102153_ 1.0000 50 -chr21_47517957_47518007_ 1.0000 50 chr21_47575506_47575556_ 1.0000 50 -******************************************************************************** - -******************************************************************************** COMMAND LINE SUMMARY -******************************************************************************** -This information can also be useful in the event you wish to report a -problem with the MEME software. - -command: meme meme_input_1.fasta -o meme_test1_out -nostatus -maxsize 1000000 - model: mod= zoops nmotifs= 1 evt= inf -object function= E-value of product of p-values +objective function: em= E-value of product of p-values + starts= E-value of product of p-values width: minw= 8 maxw= 50 -width: wg= 11 ws= 1 endgaps= yes nsites: minsites= 2 maxsites= 30 wnsites= 0.8 theta: spmap= pam spfuzz= 120 -global: substring= yes branching= no wbranch= no em: prior= megap b= 7500 maxiter= 50 distance= 1e-05 -data: n= 1500 N= 30 shuffle= -1 - -sample: seed= 0 ctfrac= -1 maxwords= -1 +trim: wg= 11 ws= 1 endgaps= yes +data: n= 1500 N= 30 +sample: seed= 0 hsfrac= 0 + searchsize= 1500 norand= no csites= 1000 Dirichlet mixture priors file: prior30.plib Letter frequencies in dataset: -A 0.294 C 0.231 D 0.000 E 0.000 F 0.000 G 0.257 H 0.000 I 0.000 K 0.000 -L 0.000 M 0.000 N 0.000 P 0.000 Q 0.000 R 0.000 S 0.000 T 0.217 V 0.000 -W 0.000 Y 0.000 -Background letter frequencies (from dataset with add-one prior applied): -A 0.291 C 0.229 D 0.001 E 0.001 F 0.001 G 0.255 H 0.001 I 0.001 K 0.001 -L 0.001 M 0.001 N 0.001 P 0.001 Q 0.001 R 0.001 S 0.001 T 0.215 V 0.001 -W 0.001 Y 0.001 -******************************************************************************** - - -******************************************************************************** +A 0.294 C 0.231 D 0 E 0 F 0 G 0.257 H 0 I 0 K 0 +L 0 M 0 N 0 P 0 Q 0 R 0 S 0 T 0.217 V 0 +W 0 Y 0 +Background letter frequencies (from file dataset with add-one prior applied): +A 0.291 C 0.229 D 0.000658 E 0.000658 F 0.000658 G 0.255 H 0.000658 I 0.000658 K 0.000658 +L 0.000658 M 0.000658 N 0.000658 P 0.000658 Q 0.000658 R 0.000658 S 0.000658 T 0.215 V 0.000658 +W 0.000658 Y 0.000658 +Background model order: 0 MOTIF GGGGTATAAAA MEME-1 width = 11 sites = 25 llr = 239 E-value = 2.4e-011 -******************************************************************************** -------------------------------------------------------------------------------- Motif GGGGTATAAAA MEME-1 Description --------------------------------------------------------------------------------- -Simplified A 2323:a:a8a8 -pos.-specific C ::3:::::::: -probability D ::::::::::: -matrix E ::::::::::: - F ::::::::::: - G 7746::::::1 - H ::::::::::: - I ::::::::::: - K ::::::::::: - L ::::::::::: - M ::::::::::: - N ::::::::::: - P ::::::::::: - Q ::::::::::: - R ::::::::::: - S ::::::::::: - T 1:2:a:a:2:: - V ::::::::::: - W ::::::::::: - Y ::::::::::: - - bits 10.6 - 9.5 - 8.5 - 7.4 -Relative 6.3 -Entropy 5.3 -(13.8 bits) 4.2 - 3.2 - 2.1 * ** - 1.1 ** ******** - 0.0 ----------- - -Multilevel GGGGTATAAAA -consensus AACA T -sequence - - --------------------------------------------------------------------------------- - --------------------------------------------------------------------------------- Motif GGGGTATAAAA MEME-1 sites sorted by position p-value --------------------------------------------------------------------------------- Sequence name Start P-value Site ------------- ----- --------- ----------- chr21_46046964_46047014_ 13 1.06e-06 AAGGCCAGGA GGGGTATAAAA GCCTGAGAGC -chr21_46057197_46057247_ 37 3.41e-06 ACAGGCCCTG GGCATATAAAA GCC -chr21_45971413_45971463_ 10 3.41e-06 CAGGCCCTG GGCATATAAAA GCCCCAGCAG -chr21_31964683_31964733_ 14 3.41e-06 GATTCACTGA GGCATATAAAA GGCCCTCTGC -chr21_45993530_45993580_ 8 4.00e-06 CCAAGGA GGAGTATAAAA GCCCCACAAA -chr21_32202076_32202126_ 14 5.01e-06 CCACCAGCTT GAGGTATAAAA AGCCCTGTAC -chr21_46031920_46031970_ 16 6.06e-06 ATACCCAGGG AGGGTATAAAA CCTCAGCAGC -chr21_32410820_32410870_ 22 8.67e-06 AATCACTGAG GATGTATAAAA GTCCCAGGGA -chr21_32185595_32185645_ 19 8.67e-06 CACCAGAGCT GGGATATATAA AGAAGGTTCT -chr21_31992870_31992920_ 17 8.67e-06 CACTATTGAA GATGTATAAAA TTTCATTTGC -chr21_46020421_46020471_ 3 1.21e-05 GA GACATATAAAA GCCAACATCC -chr21_47517957_47518007_ 33 1.59e-05 CCGGCGGGGC GGGGTATAAAG GGGGCGG -chr21_45978668_45978718_ 5 1.59e-05 CAGA GGGGTATAAAG GTTCCGACCA -chr21_31914206_31914256_ 16 1.68e-05 CCCACTACTT AGAGTATAAAA TCATTCTGAG -chr21_32253899_32253949_ 20 2.03e-05 CACCAGCAAG GATATATAAAA GCTCAGGAGT -chr21_31744582_31744632_ 13 3.06e-05 CAGGTCTAAG AGCATATATAA CTTGGAGTCC -chr21_19617074_19617124_ 40 3.06e-05 CCTCGGGACG TGGGTATATAA -chr21_45705687_45705737_ 38 3.82e-05 CGTGGTCGCG GGGGTATAACA GC -chr21_31768316_31768366_ 1 3.82e-05 . AACGTATATAA ATGGTCCTGT -chr21_47575506_47575556_ 31 4.02e-05 GCTGCCGGTG AGCGTATAAAG GCCCTGGCG -chr21_26934381_26934431_ 28 5.52e-05 AGTCACAAGT GAGTTATAAAA GGGTCGCACG -chr21_31710037_31710087_ 15 5.94e-05 CCCAGGTTTC TGAGTATATAA TCGCCGCACC -chr21_36411748_36411798_ 23 6.78e-05 AGTTTCAGTT GGCATCtaaaa attatataac -chr21_31933633_31933683_ 3 2.08e-04 TC AGAGTATATAT AAATGTTCCT -chr21_31962741_31962791_ 14 4.05e-04 TATAACTCAG GTTGGATAAAA TAATTTGTAC --------------------------------------------------------------------------------- - --------------------------------------------------------------------------------- Motif GGGGTATAAAA MEME-1 block diagrams --------------------------------------------------------------------------------- SEQUENCE NAME POSITION P-VALUE MOTIF DIAGRAM ------------- ---------------- ------------- chr21_46046964_46047014_ 1.1e-06 12_[1]_27 -chr21_46057197_46057247_ 3.4e-06 36_[1]_3 -chr21_45971413_45971463_ 3.4e-06 9_[1]_30 -chr21_31964683_31964733_ 3.4e-06 13_[1]_26 -chr21_45993530_45993580_ 4e-06 7_[1]_32 -chr21_32202076_32202126_ 5e-06 13_[1]_26 -chr21_46031920_46031970_ 6.1e-06 15_[1]_24 -chr21_32410820_32410870_ 8.7e-06 21_[1]_18 -chr21_32185595_32185645_ 8.7e-06 18_[1]_21 -chr21_31992870_31992920_ 8.7e-06 16_[1]_23 -chr21_46020421_46020471_ 1.2e-05 2_[1]_37 -chr21_47517957_47518007_ 1.6e-05 32_[1]_7 -chr21_45978668_45978718_ 1.6e-05 4_[1]_35 -chr21_31914206_31914256_ 1.7e-05 15_[1]_24 -chr21_32253899_32253949_ 2e-05 19_[1]_20 -chr21_31744582_31744632_ 3.1e-05 12_[1]_27 -chr21_19617074_19617124_ 3.1e-05 39_[1] -chr21_45705687_45705737_ 3.8e-05 37_[1]_2 -chr21_31768316_31768366_ 3.8e-05 [1]_39 -chr21_47575506_47575556_ 4e-05 30_[1]_9 -chr21_26934381_26934431_ 5.5e-05 27_[1]_12 -chr21_31710037_31710087_ 5.9e-05 14_[1]_25 -chr21_36411748_36411798_ 6.8e-05 22_[1]_17 -chr21_31933633_31933683_ 0.00021 2_[1]_37 -chr21_31962741_31962791_ 0.0004 13_[1]_26 --------------------------------------------------------------------------------- - --------------------------------------------------------------------------------- Motif GGGGTATAAAA MEME-1 in BLOCKS format --------------------------------------------------------------------------------- BL MOTIF GGGGTATAAAA width=11 seqs=25 chr21_46046964_46047014_ ( 13) GGGGTATAAAA 1 -chr21_46057197_46057247_ ( 37) GGCATATAAAA 1 -chr21_45971413_45971463_ ( 10) GGCATATAAAA 1 -chr21_31964683_31964733_ ( 14) GGCATATAAAA 1 -chr21_45993530_45993580_ ( 8) GGAGTATAAAA 1 -chr21_32202076_32202126_ ( 14) GAGGTATAAAA 1 -chr21_46031920_46031970_ ( 16) AGGGTATAAAA 1 -chr21_32410820_32410870_ ( 22) GATGTATAAAA 1 -chr21_32185595_32185645_ ( 19) GGGATATATAA 1 -chr21_31992870_31992920_ ( 17) GATGTATAAAA 1 -chr21_46020421_46020471_ ( 3) GACATATAAAA 1 -chr21_47517957_47518007_ ( 33) GGGGTATAAAG 1 -chr21_45978668_45978718_ ( 5) GGGGTATAAAG 1 -chr21_31914206_31914256_ ( 16) AGAGTATAAAA 1 -chr21_32253899_32253949_ ( 20) GATATATAAAA 1 -chr21_31744582_31744632_ ( 13) AGCATATATAA 1 -chr21_19617074_19617124_ ( 40) TGGGTATATAA 1 -chr21_45705687_45705737_ ( 38) GGGGTATAACA 1 -chr21_31768316_31768366_ ( 1) AACGTATATAA 1 -chr21_47575506_47575556_ ( 31) AGCGTATAAAG 1 -chr21_26934381_26934431_ ( 28) GAGTTATAAAA 1 -chr21_31710037_31710087_ ( 15) TGAGTATATAA 1 -chr21_36411748_36411798_ ( 23) GGCATCTAAAA 1 -chr21_31933633_31933683_ ( 3) AGAGTATATAT 1 -chr21_31962741_31962791_ ( 14) GTTGGATAAAA 1 -// - --------------------------------------------------------------------------------- - --------------------------------------------------------------------------------- Motif GGGGTATAAAA MEME-1 position-specific scoring matrix --------------------------------------------------------------------------------- log-odds matrix: alength= 20 w= 11 n= 1200 bayes= 5.33554 E= 2.4e-011 -32 -680 91 77 7 138 -20 55 64 107 11 150 142 72 87 396 -148 221 -140 -36 - -11 -680 89 76 7 137 -21 55 63 107 10 149 141 71 87 396 -239 220 -140 -36 - -79 41 4 21 -7 44 -62 42 -5 99 0 99 138 52 42 399 -46 223 -173 -68 - 11 -677 48 47 -2 127 -43 46 27 101 3 124 138 60 62 397 -235 220 -160 -55 - -596 -820 12 -21 -53 -267 -74 37 16 44 -37 98 31 9 19 319 212 127 -193 -95 - 165 -261 70 110 77 -521 -4 147 95 201 90 121 124 91 107 425 -527 314 -95 8 - -838 -990 -89 -149 -151 -841 -161 -117 -113 -66 -209 -68 -69 -129 -91 111 221 -55 -255 -173 - 176 -858 -79 -103 -115 -717 -148 -95 -108 -17 -162 -61 -12 -95 -69 193 -737 52 -240 -153 - 134 -686 0 16 -12 -553 -68 44 -8 96 -9 88 124 41 36 384 11 216 -177 -71 - 165 -261 70 110 77 -521 -4 147 95 201 90 121 124 91 107 425 -527 314 -95 8 - 147 -614 89 129 93 -121 12 160 113 217 108 144 144 111 125 447 -241 332 -81 22 --------------------------------------------------------------------------------- - --------------------------------------------------------------------------------- Motif GGGGTATAAAA MEME-1 position-specific probability matrix --------------------------------------------------------------------------------- letter-probability matrix: alength= 20 w= 11 nsites= 25 E= 2.4e-011 0.240000 0.000000 0.000000 0.000000 0.000000 0.680000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.080000 0.000000 0.000000 0.000000 - 0.280000 0.000000 0.000000 0.000000 0.000000 0.680000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.040000 0.000000 0.000000 0.000000 - 0.160000 0.320000 0.000000 0.000000 0.000000 0.360000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.160000 0.000000 0.000000 0.000000 - 0.320000 0.000000 0.000000 0.000000 0.000000 0.640000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.040000 0.000000 0.000000 0.000000 - 0.000000 0.000000 0.000000 0.000000 0.000000 0.040000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.960000 0.000000 0.000000 0.000000 - 0.960000 0.040000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 - 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 - 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 - 0.760000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.240000 0.000000 0.000000 0.000000 - 0.960000 0.040000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 - 0.840000 0.000000 0.000000 0.000000 0.000000 0.120000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.040000 0.000000 0.000000 0.000000 --------------------------------------------------------------------------------- - --------------------------------------------------------------------------------- Motif GGGGTATAAAA MEME-1 regular expression --------------------------------------------------------------------------------- [GA][GA][GC][GA]TATA[AT]AA --------------------------------------------------------------------------------- - - - - -Time 0.77 secs. - -******************************************************************************** - - -******************************************************************************** SUMMARY OF MOTIFS -******************************************************************************** - --------------------------------------------------------------------------------- Combined block diagrams: non-overlapping sites with p-value < 0.0001 --------------------------------------------------------------------------------- SEQUENCE NAME COMBINED P-VALUE MOTIF DIAGRAM ------------- ---------------- ------------- chr21_19617074_19617124_ 1.22e-03 39_[1(3.06e-05)] -chr21_26934381_26934431_ 2.21e-03 27_[1(5.52e-05)]_12 -chr21_28217753_28217803_ 7.29e-01 50 -chr21_31710037_31710087_ 2.37e-03 14_[1(5.94e-05)]_25 -chr21_31744582_31744632_ 1.22e-03 12_[1(3.06e-05)]_27 -chr21_31768316_31768366_ 1.53e-03 [1(3.82e-05)]_39 -chr21_31914206_31914256_ 6.70e-04 15_[1(1.68e-05)]_24 -chr21_31933633_31933683_ 1.81e-03 4_[1(4.54e-05)]_35 -chr21_31962741_31962791_ 1.61e-02 50 -chr21_31964683_31964733_ 1.36e-04 13_[1(3.41e-06)]_26 -chr21_31973364_31973414_ 1.99e-01 50 -chr21_31992870_31992920_ 3.47e-04 16_[1(8.67e-06)]_23 -chr21_32185595_32185645_ 3.47e-04 18_[1(8.67e-06)]_21 -chr21_32202076_32202126_ 2.01e-04 13_[1(5.01e-06)]_26 -chr21_32253899_32253949_ 8.11e-04 19_[1(2.03e-05)]_20 -chr21_32410820_32410870_ 3.47e-04 21_[1(8.67e-06)]_18 -chr21_36411748_36411798_ 2.71e-03 22_[1(6.78e-05)]_17 -chr21_37838750_37838800_ 8.23e-02 50 -chr21_45705687_45705737_ 1.53e-03 37_[1(3.82e-05)]_2 -chr21_45971413_45971463_ 1.36e-04 9_[1(3.41e-06)]_30 -chr21_45978668_45978718_ 6.37e-04 4_[1(1.59e-05)]_35 -chr21_45993530_45993580_ 1.60e-04 7_[1(4.00e-06)]_32 -chr21_46020421_46020471_ 4.83e-04 2_[1(1.21e-05)]_37 -chr21_46031920_46031970_ 2.43e-04 15_[1(6.06e-06)]_24 -chr21_46046964_46047014_ 4.26e-05 12_[1(1.06e-06)]_27 -chr21_46057197_46057247_ 1.36e-04 36_[1(3.41e-06)]_3 -chr21_46086869_46086919_ 4.30e-02 50 -chr21_46102103_46102153_ 4.30e-02 50 -chr21_47517957_47518007_ 6.37e-04 32_[1(1.59e-05)]_7 -chr21_47575506_47575556_ 1.61e-03 30_[1(4.02e-05)]_9 --------------------------------------------------------------------------------- - -******************************************************************************** - - -******************************************************************************** Stopped because requested number of motifs (1) found. -******************************************************************************** - -CPU: ThinkPad-T450s - -********************************************************************************
--- a/test-data/meme_output_test1.xml Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/meme_output_test1.xml Wed Dec 11 18:05:35 2019 -0500 @@ -10,136 +10,29 @@ <!ATTLIST MEME version CDATA #REQUIRED release CDATA #REQUIRED -> <!-- Training-set elements --> <!ELEMENT training_set (alphabet, ambigs, sequence*, letter_frequencies)> -<!ATTLIST training_set datafile CDATA #REQUIRED length CDATA #REQUIRED> -<!ELEMENT alphabet (letter*)> -<!ATTLIST alphabet name CDATA #REQUIRED> -<!ELEMENT ambigs (letter*)> -<!ELEMENT letter EMPTY> -<!ATTLIST letter id ID #REQUIRED> -<!ATTLIST letter symbol CDATA #REQUIRED> -<!ATTLIST letter equals CDATA #IMPLIED> -<!ATTLIST letter aliases CDATA #IMPLIED> -<!ATTLIST letter complement CDATA #IMPLIED> -<!ATTLIST letter name CDATA #IMPLIED> -<!ATTLIST letter colour CDATA #IMPLIED> -<!ELEMENT sequence EMPTY> -<!ATTLIST sequence id ID #REQUIRED name CDATA #REQUIRED length CDATA #REQUIRED weight CDATA #REQUIRED -> <!ELEMENT letter_frequencies (alphabet_array)> - <!-- Model elements --> <!ELEMENT model ( command_line, host, type, nmotifs, - evalue_threshold, - object_function, - spfun, - min_width, - max_width, - wg, - ws, - endgaps, - minsites, - maxsites, - wnsites, - spmap, - spfuzz, - prior, - beta, - maxiter, - distance, - num_sequences, - num_positions, - seed, - hsfrac, - maxwords, - maxsize, - csites, - strands, - priors_file, - reason_for_stopping, - back_order, - background_frequencies )> <!ELEMENT command_line (#PCDATA)*> <!ELEMENT host (#PCDATA)*> <!ELEMENT type (#PCDATA)*> <!ELEMENT nmotifs (#PCDATA)*> -<!ELEMENT evalue_threshold (#PCDATA)*> -<!ELEMENT object_function (#PCDATA)*> -<!ELEMENT spfun (#PCDATA)*> -<!ELEMENT min_width (#PCDATA)*> -<!ELEMENT max_width (#PCDATA)*> -<!ELEMENT wg (#PCDATA)*> -<!ELEMENT ws (#PCDATA)*> -<!ELEMENT endgaps (#PCDATA)*> -<!ELEMENT minsites (#PCDATA)*> -<!ELEMENT maxsites (#PCDATA)*> -<!ELEMENT wnsites (#PCDATA)*> -<!ELEMENT spmap (#PCDATA)*> -<!ELEMENT spfuzz (#PCDATA)*> -<!ELEMENT prior (#PCDATA)*> -<!ELEMENT beta (#PCDATA)*> -<!ELEMENT maxiter (#PCDATA)*> -<!ELEMENT distance (#PCDATA)*> -<!ELEMENT num_sequences (#PCDATA)*> -<!ELEMENT num_positions (#PCDATA)*> -<!ELEMENT seed (#PCDATA)*> -<!ELEMENT hsfrac (#PCDATA)*> -<!ELEMENT maxwords (#PCDATA)*> -<!ELEMENT maxsites (#PCDATA)*> -<!ELEMENT csites (#PCDATA)*> -<!ELEMENT strands (#PCDATA)*> -<!ELEMENT priors_file (#PCDATA)*> -<!ELEMENT reason_for_stopping (#PCDATA)*> -<!ELEMENT back_order (#PCDATA)*> -<!ELEMENT background_frequencies (alphabet_array)> -<!ATTLIST background_frequencies source CDATA #REQUIRED> - -<!-- Motif elements --> -<!ELEMENT motifs (motif*)> -<!ELEMENT motif (scores, probabilities, regular_expression?, contributing_sites)> -<!ATTLIST motif id ID #REQUIRED - name CDATA #REQUIRED - alt CDATA "" - width CDATA #REQUIRED - sites CDATA #REQUIRED - llr CDATA #REQUIRED - ic CDATA #REQUIRED - re CDATA #REQUIRED - bayes_threshold CDATA #REQUIRED - e_value CDATA #REQUIRED - elapsed_time CDATA #REQUIRED - url CDATA "" -> -<!ELEMENT scores (alphabet_matrix)> -<!ELEMENT probabilities (alphabet_matrix)> -<!ELEMENT regular_expression (#PCDATA)*> - -<!-- Contributing site elements --> -<!-- Contributing sites are motif occurences found during the motif discovery phase --> -<!ELEMENT contributing_sites (contributing_site*)> -<!ELEMENT contributing_site (left_flank, site, right_flank)> -<!ATTLIST contributing_site sequence_id IDREF #REQUIRED - position CDATA #REQUIRED - strand (plus|minus|none) 'none' - pvalue CDATA #REQUIRED -> <!-- The left_flank contains the sequence for 10 bases to the left of the motif start --> <!ELEMENT left_flank (#PCDATA)> <!-- The site contains the sequence for the motif instance --> <!ELEMENT site (letter_ref*)> <!-- The right_flank contains the sequence for 10 bases to the right of the motif end --> <!ELEMENT right_flank (#PCDATA)> - <!-- Scanned site elements --> <!-- Scanned sites are motif occurences found during the sequence scan phase --> <!ELEMENT scanned_sites_summary (scanned_sites*)> @@ -153,7 +46,6 @@ strand (plus|minus|none) 'none' position CDATA #REQUIRED pvalue CDATA #REQUIRED> - <!-- Utility elements --> <!-- A reference to a letter in the alphabet --> <!ELEMENT letter_ref EMPTY> @@ -162,643 +54,44 @@ <!ELEMENT alphabet_array (value*)> <!ELEMENT value (#PCDATA)> <!ATTLIST value letter_id IDREF #REQUIRED> - <!-- A alphabet_matrix contains one alphabet_array for each position in a motif --> <!ELEMENT alphabet_matrix (alphabet_array*)> - ]> <!-- Begin document body --> -<MEME version="4.12.0" release="Tue Jun 27 16:22:50 2017 -0700"> -<training_set datafile="meme_input_1.fasta" length="30"> +<MEME version="5.0.5" release="Mon Mar 18 20:12:19 2019 -0700"> <alphabet name="Protein" like="protein"> <letter id="A" symbol="A" name="Alanine" colour="0000CC"/> -<letter id="C" symbol="C" name="Cysteine" colour="0000CC"/> -<letter id="D" symbol="D" name="Aspartic acid" colour="FF00FF"/> -<letter id="E" symbol="E" name="Glutamic acid" colour="FF00FF"/> -<letter id="F" symbol="F" name="Phenylalanine" colour="0000CC"/> -<letter id="G" symbol="G" name="Glycine" colour="FFB300"/> -<letter id="H" symbol="H" name="Histidine" colour="FFCCCC"/> -<letter id="I" symbol="I" name="Isoleucine" colour="0000CC"/> -<letter id="K" symbol="K" name="Lysine" colour="CC0000"/> -<letter id="L" symbol="L" name="Leucine" colour="0000CC"/> -<letter id="M" symbol="M" name="Methionine" colour="0000CC"/> -<letter id="N" symbol="N" name="Asparagine" colour="008000"/> -<letter id="P" symbol="P" name="Proline" colour="FFFF00"/> -<letter id="Q" symbol="Q" name="Glutamine" colour="008000"/> -<letter id="R" symbol="R" name="Arginine" colour="CC0000"/> -<letter id="S" symbol="S" name="Serine" colour="008000"/> -<letter id="T" symbol="T" name="Threonine" colour="008000"/> -<letter id="V" symbol="V" name="Valine" colour="0000CC"/> -<letter id="W" symbol="W" name="Tryptophan" colour="0000CC"/> -<letter id="Y" symbol="Y" name="Tyrosine" colour="33E6CC"/> -<letter id="X" symbol="X" aliases="*." equals="ACDEFGHIKLMNPQRSTVWY" name="Any amino acid"/> -<letter id="B" symbol="B" equals="DN" name="Asparagine or Aspartic acid"/> -<letter id="Z" symbol="Z" equals="EQ" name="Glutamine or Glutamic acid"/> -<letter id="J" symbol="J" equals="IL" name="Leucine or Isoleucine"/> </alphabet> <sequence id="sequence_0" name="chr21_19617074_19617124_+" length="50" weight="1.000000" /> -<sequence id="sequence_1" name="chr21_26934381_26934431_+" length="50" weight="1.000000" /> -<sequence id="sequence_2" name="chr21_28217753_28217803_-" length="50" weight="1.000000" /> -<sequence id="sequence_3" name="chr21_31710037_31710087_-" length="50" weight="1.000000" /> -<sequence id="sequence_4" name="chr21_31744582_31744632_-" length="50" weight="1.000000" /> -<sequence id="sequence_5" name="chr21_31768316_31768366_+" length="50" weight="1.000000" /> -<sequence id="sequence_6" name="chr21_31914206_31914256_-" length="50" weight="1.000000" /> -<sequence id="sequence_7" name="chr21_31933633_31933683_-" length="50" weight="1.000000" /> -<sequence id="sequence_8" name="chr21_31962741_31962791_-" length="50" weight="1.000000" /> -<sequence id="sequence_9" name="chr21_31964683_31964733_+" length="50" weight="1.000000" /> -<sequence id="sequence_10" name="chr21_31973364_31973414_+" length="50" weight="1.000000" /> -<sequence id="sequence_11" name="chr21_31992870_31992920_+" length="50" weight="1.000000" /> -<sequence id="sequence_12" name="chr21_32185595_32185645_-" length="50" weight="1.000000" /> -<sequence id="sequence_13" name="chr21_32202076_32202126_-" length="50" weight="1.000000" /> -<sequence id="sequence_14" name="chr21_32253899_32253949_-" length="50" weight="1.000000" /> -<sequence id="sequence_15" name="chr21_32410820_32410870_-" length="50" weight="1.000000" /> -<sequence id="sequence_16" name="chr21_36411748_36411798_-" length="50" weight="1.000000" /> -<sequence id="sequence_17" name="chr21_37838750_37838800_-" length="50" weight="1.000000" /> -<sequence id="sequence_18" name="chr21_45705687_45705737_+" length="50" weight="1.000000" /> -<sequence id="sequence_19" name="chr21_45971413_45971463_-" length="50" weight="1.000000" /> -<sequence id="sequence_20" name="chr21_45978668_45978718_-" length="50" weight="1.000000" /> -<sequence id="sequence_21" name="chr21_45993530_45993580_+" length="50" weight="1.000000" /> -<sequence id="sequence_22" name="chr21_46020421_46020471_+" length="50" weight="1.000000" /> -<sequence id="sequence_23" name="chr21_46031920_46031970_+" length="50" weight="1.000000" /> -<sequence id="sequence_24" name="chr21_46046964_46047014_+" length="50" weight="1.000000" /> -<sequence id="sequence_25" name="chr21_46057197_46057247_+" length="50" weight="1.000000" /> -<sequence id="sequence_26" name="chr21_46086869_46086919_-" length="50" weight="1.000000" /> -<sequence id="sequence_27" name="chr21_46102103_46102153_-" length="50" weight="1.000000" /> -<sequence id="sequence_28" name="chr21_47517957_47518007_+" length="50" weight="1.000000" /> -<sequence id="sequence_29" name="chr21_47575506_47575556_-" length="50" weight="1.000000" /> <letter_frequencies> <alphabet_array> <value letter_id="A">0.294</value> -<value letter_id="C">0.231</value> -<value letter_id="D">0.000</value> -<value letter_id="E">0.000</value> -<value letter_id="F">0.000</value> -<value letter_id="G">0.257</value> -<value letter_id="H">0.000</value> -<value letter_id="I">0.000</value> -<value letter_id="K">0.000</value> -<value letter_id="L">0.000</value> -<value letter_id="M">0.000</value> -<value letter_id="N">0.000</value> -<value letter_id="P">0.000</value> -<value letter_id="Q">0.000</value> -<value letter_id="R">0.000</value> -<value letter_id="S">0.000</value> -<value letter_id="T">0.217</value> -<value letter_id="V">0.000</value> -<value letter_id="W">0.000</value> -<value letter_id="Y">0.000</value> -</alphabet_array> </letter_frequencies> </training_set> <model> -<command_line>meme meme_input_1.fasta -o meme_test1_out -nostatus -maxsize 1000000 </command_line> -<host>ThinkPad-T450s</host> -<type>zoops</type> -<nmotifs>1</nmotifs> -<evalue_threshold>inf</evalue_threshold> -<object_function>E-value of product of p-values</object_function> -<use_llr>0</use_llr> -<min_width>8</min_width> -<max_width>50</max_width> -<wg>11</wg> -<ws>1</ws> -<endgaps>yes</endgaps> -<substring>yes</substring> -<minsites>2</minsites> -<maxsites>30</maxsites> -<wnsites>0.8</wnsites> -<spmap>pam</spmap> -<spfuzz>120</spfuzz> -<prior>megap</prior> -<beta>7500</beta> -<maxiter>50</maxiter> -<distance>1e-05</distance> -<num_sequences>30</num_sequences> -<num_positions>1500</num_positions> -<seed>0</seed> -<ctfrac>-1</ctfrac> -<maxwords>-1</maxwords> -<strands>none</strands> -<priors_file>prior30.plib</priors_file> -<reason_for_stopping>Stopped because requested number of motifs (1) found.</reason_for_stopping> -<background_frequencies source="dataset with add-one prior applied"> -<alphabet_array> -<value letter_id="A">0.291</value> -<value letter_id="C">0.229</value> -<value letter_id="D">0.001</value> -<value letter_id="E">0.001</value> -<value letter_id="F">0.001</value> -<value letter_id="G">0.255</value> -<value letter_id="H">0.001</value> -<value letter_id="I">0.001</value> -<value letter_id="K">0.001</value> -<value letter_id="L">0.001</value> -<value letter_id="M">0.001</value> -<value letter_id="N">0.001</value> -<value letter_id="P">0.001</value> -<value letter_id="Q">0.001</value> -<value letter_id="R">0.001</value> -<value letter_id="S">0.001</value> -<value letter_id="T">0.215</value> -<value letter_id="V">0.001</value> -<value letter_id="W">0.001</value> -<value letter_id="Y">0.001</value> -</alphabet_array> -</background_frequencies> -</model> -<motifs> -<motif id="motif_1" name="GGGGTATAAAA" alt="MEME-1" width="11" sites="25" ic="40.0" re="13.8" llr="239" e_value="2.4e-011" bayes_threshold="5.33554" elapsed_time="0.772000"> <scores> <alphabet_matrix> -<alphabet_array> <value letter_id="A">-32</value> -<value letter_id="C">-680</value> -<value letter_id="D">91</value> -<value letter_id="E">77</value> -<value letter_id="F">7</value> -<value letter_id="G">138</value> -<value letter_id="H">-20</value> -<value letter_id="I">55</value> -<value letter_id="K">64</value> -<value letter_id="L">107</value> -<value letter_id="M">11</value> -<value letter_id="N">150</value> -<value letter_id="P">142</value> -<value letter_id="Q">72</value> -<value letter_id="R">87</value> -<value letter_id="S">396</value> -<value letter_id="T">-148</value> -<value letter_id="V">221</value> -<value letter_id="W">-140</value> -<value letter_id="Y">-36</value> -</alphabet_array> -<alphabet_array> -<value letter_id="A">-11</value> -<value letter_id="C">-680</value> -<value letter_id="D">89</value> -<value letter_id="E">76</value> -<value letter_id="F">7</value> -<value letter_id="G">137</value> -<value letter_id="H">-21</value> -<value letter_id="I">55</value> -<value letter_id="K">63</value> -<value letter_id="L">107</value> -<value letter_id="M">10</value> -<value letter_id="N">149</value> -<value letter_id="P">141</value> -<value letter_id="Q">71</value> -<value letter_id="R">87</value> -<value letter_id="S">396</value> -<value letter_id="T">-239</value> -<value letter_id="V">220</value> -<value letter_id="W">-140</value> -<value letter_id="Y">-36</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">-79</value> -<value letter_id="C">41</value> -<value letter_id="D">4</value> -<value letter_id="E">21</value> -<value letter_id="F">-7</value> -<value letter_id="G">44</value> -<value letter_id="H">-62</value> -<value letter_id="I">42</value> -<value letter_id="K">-5</value> -<value letter_id="L">99</value> -<value letter_id="M">0</value> -<value letter_id="N">99</value> -<value letter_id="P">138</value> -<value letter_id="Q">52</value> -<value letter_id="R">42</value> -<value letter_id="S">399</value> -<value letter_id="T">-46</value> -<value letter_id="V">223</value> -<value letter_id="W">-173</value> -<value letter_id="Y">-68</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">11</value> -<value letter_id="C">-677</value> -<value letter_id="D">48</value> -<value letter_id="E">47</value> -<value letter_id="F">-2</value> -<value letter_id="G">127</value> -<value letter_id="H">-43</value> -<value letter_id="I">46</value> -<value letter_id="K">27</value> -<value letter_id="L">101</value> -<value letter_id="M">3</value> -<value letter_id="N">124</value> -<value letter_id="P">138</value> -<value letter_id="Q">60</value> -<value letter_id="R">62</value> -<value letter_id="S">397</value> -<value letter_id="T">-235</value> -<value letter_id="V">220</value> -<value letter_id="W">-160</value> -<value letter_id="Y">-55</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">-596</value> -<value letter_id="C">-820</value> -<value letter_id="D">12</value> -<value letter_id="E">-21</value> -<value letter_id="F">-53</value> -<value letter_id="G">-267</value> -<value letter_id="H">-74</value> -<value letter_id="I">37</value> -<value letter_id="K">16</value> -<value letter_id="L">44</value> -<value letter_id="M">-37</value> -<value letter_id="N">98</value> -<value letter_id="P">31</value> -<value letter_id="Q">9</value> -<value letter_id="R">19</value> -<value letter_id="S">319</value> -<value letter_id="T">212</value> -<value letter_id="V">127</value> -<value letter_id="W">-193</value> -<value letter_id="Y">-95</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">165</value> -<value letter_id="C">-261</value> -<value letter_id="D">70</value> -<value letter_id="E">110</value> -<value letter_id="F">77</value> -<value letter_id="G">-521</value> -<value letter_id="H">-4</value> -<value letter_id="I">147</value> -<value letter_id="K">95</value> -<value letter_id="L">201</value> -<value letter_id="M">90</value> -<value letter_id="N">121</value> -<value letter_id="P">124</value> -<value letter_id="Q">91</value> -<value letter_id="R">107</value> -<value letter_id="S">425</value> -<value letter_id="T">-527</value> -<value letter_id="V">314</value> -<value letter_id="W">-95</value> -<value letter_id="Y">8</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">-838</value> -<value letter_id="C">-990</value> -<value letter_id="D">-89</value> -<value letter_id="E">-149</value> -<value letter_id="F">-151</value> -<value letter_id="G">-841</value> -<value letter_id="H">-161</value> -<value letter_id="I">-117</value> -<value letter_id="K">-113</value> -<value letter_id="L">-66</value> -<value letter_id="M">-209</value> -<value letter_id="N">-68</value> -<value letter_id="P">-69</value> -<value letter_id="Q">-129</value> -<value letter_id="R">-91</value> -<value letter_id="S">111</value> -<value letter_id="T">221</value> -<value letter_id="V">-55</value> -<value letter_id="W">-255</value> -<value letter_id="Y">-173</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">176</value> -<value letter_id="C">-858</value> -<value letter_id="D">-79</value> -<value letter_id="E">-103</value> -<value letter_id="F">-115</value> -<value letter_id="G">-717</value> -<value letter_id="H">-148</value> -<value letter_id="I">-95</value> -<value letter_id="K">-108</value> -<value letter_id="L">-17</value> -<value letter_id="M">-162</value> -<value letter_id="N">-61</value> -<value letter_id="P">-12</value> -<value letter_id="Q">-95</value> -<value letter_id="R">-69</value> -<value letter_id="S">193</value> -<value letter_id="T">-737</value> -<value letter_id="V">52</value> -<value letter_id="W">-240</value> -<value letter_id="Y">-153</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">134</value> -<value letter_id="C">-686</value> -<value letter_id="D">0</value> -<value letter_id="E">16</value> -<value letter_id="F">-12</value> -<value letter_id="G">-553</value> -<value letter_id="H">-68</value> -<value letter_id="I">44</value> -<value letter_id="K">-8</value> -<value letter_id="L">96</value> -<value letter_id="M">-9</value> -<value letter_id="N">88</value> -<value letter_id="P">124</value> -<value letter_id="Q">41</value> -<value letter_id="R">36</value> -<value letter_id="S">384</value> -<value letter_id="T">11</value> -<value letter_id="V">216</value> -<value letter_id="W">-177</value> -<value letter_id="Y">-71</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">165</value> -<value letter_id="C">-261</value> -<value letter_id="D">70</value> -<value letter_id="E">110</value> -<value letter_id="F">77</value> -<value letter_id="G">-521</value> -<value letter_id="H">-4</value> -<value letter_id="I">147</value> -<value letter_id="K">95</value> -<value letter_id="L">201</value> -<value letter_id="M">90</value> -<value letter_id="N">121</value> -<value letter_id="P">124</value> -<value letter_id="Q">91</value> -<value letter_id="R">107</value> -<value letter_id="S">425</value> -<value letter_id="T">-527</value> -<value letter_id="V">314</value> -<value letter_id="W">-95</value> -<value letter_id="Y">8</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">147</value> -<value letter_id="C">-614</value> -<value letter_id="D">89</value> -<value letter_id="E">129</value> -<value letter_id="F">93</value> -<value letter_id="G">-121</value> -<value letter_id="H">12</value> -<value letter_id="I">160</value> -<value letter_id="K">113</value> -<value letter_id="L">217</value> -<value letter_id="M">108</value> -<value letter_id="N">144</value> -<value letter_id="P">144</value> -<value letter_id="Q">111</value> -<value letter_id="R">125</value> -<value letter_id="S">447</value> -<value letter_id="T">-241</value> -<value letter_id="V">332</value> -<value letter_id="W">-81</value> -<value letter_id="Y">22</value> -</alphabet_array> -</alphabet_matrix> -</scores> -<probabilities> -<alphabet_matrix> -<alphabet_array> <value letter_id="A">0.240000</value> -<value letter_id="C">0.000000</value> -<value letter_id="D">0.000000</value> -<value letter_id="E">0.000000</value> -<value letter_id="F">0.000000</value> -<value letter_id="G">0.680000</value> -<value letter_id="H">0.000000</value> -<value letter_id="I">0.000000</value> -<value letter_id="K">0.000000</value> -<value letter_id="L">0.000000</value> -<value letter_id="M">0.000000</value> -<value letter_id="N">0.000000</value> -<value letter_id="P">0.000000</value> -<value letter_id="Q">0.000000</value> -<value letter_id="R">0.000000</value> -<value letter_id="S">0.000000</value> -<value letter_id="T">0.080000</value> -<value letter_id="V">0.000000</value> -<value letter_id="W">0.000000</value> -<value letter_id="Y">0.000000</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">0.280000</value> -<value letter_id="C">0.000000</value> -<value letter_id="D">0.000000</value> -<value letter_id="E">0.000000</value> -<value letter_id="F">0.000000</value> -<value letter_id="G">0.680000</value> -<value letter_id="H">0.000000</value> -<value letter_id="I">0.000000</value> -<value letter_id="K">0.000000</value> -<value letter_id="L">0.000000</value> -<value letter_id="M">0.000000</value> -<value letter_id="N">0.000000</value> -<value letter_id="P">0.000000</value> -<value letter_id="Q">0.000000</value> -<value letter_id="R">0.000000</value> -<value letter_id="S">0.000000</value> -<value letter_id="T">0.040000</value> -<value letter_id="V">0.000000</value> -<value letter_id="W">0.000000</value> -<value letter_id="Y">0.000000</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">0.160000</value> -<value letter_id="C">0.320000</value> -<value letter_id="D">0.000000</value> -<value letter_id="E">0.000000</value> -<value letter_id="F">0.000000</value> -<value letter_id="G">0.360000</value> -<value letter_id="H">0.000000</value> -<value letter_id="I">0.000000</value> -<value letter_id="K">0.000000</value> -<value letter_id="L">0.000000</value> -<value letter_id="M">0.000000</value> -<value letter_id="N">0.000000</value> -<value letter_id="P">0.000000</value> -<value letter_id="Q">0.000000</value> -<value letter_id="R">0.000000</value> -<value letter_id="S">0.000000</value> -<value letter_id="T">0.160000</value> -<value letter_id="V">0.000000</value> -<value letter_id="W">0.000000</value> -<value letter_id="Y">0.000000</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">0.320000</value> -<value letter_id="C">0.000000</value> -<value letter_id="D">0.000000</value> -<value letter_id="E">0.000000</value> -<value letter_id="F">0.000000</value> -<value letter_id="G">0.640000</value> -<value letter_id="H">0.000000</value> -<value letter_id="I">0.000000</value> -<value letter_id="K">0.000000</value> -<value letter_id="L">0.000000</value> -<value letter_id="M">0.000000</value> -<value letter_id="N">0.000000</value> -<value letter_id="P">0.000000</value> -<value letter_id="Q">0.000000</value> -<value letter_id="R">0.000000</value> -<value letter_id="S">0.000000</value> -<value letter_id="T">0.040000</value> -<value letter_id="V">0.000000</value> -<value letter_id="W">0.000000</value> -<value letter_id="Y">0.000000</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">0.000000</value> -<value letter_id="C">0.000000</value> -<value letter_id="D">0.000000</value> -<value letter_id="E">0.000000</value> -<value letter_id="F">0.000000</value> -<value letter_id="G">0.040000</value> -<value letter_id="H">0.000000</value> -<value letter_id="I">0.000000</value> -<value letter_id="K">0.000000</value> -<value letter_id="L">0.000000</value> -<value letter_id="M">0.000000</value> -<value letter_id="N">0.000000</value> -<value letter_id="P">0.000000</value> -<value letter_id="Q">0.000000</value> -<value letter_id="R">0.000000</value> -<value letter_id="S">0.000000</value> -<value letter_id="T">0.960000</value> -<value letter_id="V">0.000000</value> -<value letter_id="W">0.000000</value> -<value letter_id="Y">0.000000</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">0.960000</value> -<value letter_id="C">0.040000</value> -<value letter_id="D">0.000000</value> -<value letter_id="E">0.000000</value> -<value letter_id="F">0.000000</value> -<value letter_id="G">0.000000</value> -<value letter_id="H">0.000000</value> -<value letter_id="I">0.000000</value> -<value letter_id="K">0.000000</value> -<value letter_id="L">0.000000</value> -<value letter_id="M">0.000000</value> -<value letter_id="N">0.000000</value> -<value letter_id="P">0.000000</value> -<value letter_id="Q">0.000000</value> -<value letter_id="R">0.000000</value> -<value letter_id="S">0.000000</value> -<value letter_id="T">0.000000</value> -<value letter_id="V">0.000000</value> -<value letter_id="W">0.000000</value> -<value letter_id="Y">0.000000</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">0.000000</value> -<value letter_id="C">0.000000</value> -<value letter_id="D">0.000000</value> -<value letter_id="E">0.000000</value> -<value letter_id="F">0.000000</value> -<value letter_id="G">0.000000</value> -<value letter_id="H">0.000000</value> -<value letter_id="I">0.000000</value> -<value letter_id="K">0.000000</value> -<value letter_id="L">0.000000</value> -<value letter_id="M">0.000000</value> -<value letter_id="N">0.000000</value> -<value letter_id="P">0.000000</value> -<value letter_id="Q">0.000000</value> -<value letter_id="R">0.000000</value> -<value letter_id="S">0.000000</value> -<value letter_id="T">1.000000</value> -<value letter_id="V">0.000000</value> -<value letter_id="W">0.000000</value> -<value letter_id="Y">0.000000</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">1.000000</value> -<value letter_id="C">0.000000</value> -<value letter_id="D">0.000000</value> -<value letter_id="E">0.000000</value> -<value letter_id="F">0.000000</value> -<value letter_id="G">0.000000</value> -<value letter_id="H">0.000000</value> -<value letter_id="I">0.000000</value> -<value letter_id="K">0.000000</value> -<value letter_id="L">0.000000</value> -<value letter_id="M">0.000000</value> -<value letter_id="N">0.000000</value> -<value letter_id="P">0.000000</value> -<value letter_id="Q">0.000000</value> -<value letter_id="R">0.000000</value> -<value letter_id="S">0.000000</value> -<value letter_id="T">0.000000</value> -<value letter_id="V">0.000000</value> -<value letter_id="W">0.000000</value> -<value letter_id="Y">0.000000</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">0.760000</value> -<value letter_id="C">0.000000</value> -<value letter_id="D">0.000000</value> -<value letter_id="E">0.000000</value> -<value letter_id="F">0.000000</value> -<value letter_id="G">0.000000</value> -<value letter_id="H">0.000000</value> -<value letter_id="I">0.000000</value> -<value letter_id="K">0.000000</value> -<value letter_id="L">0.000000</value> -<value letter_id="M">0.000000</value> -<value letter_id="N">0.000000</value> -<value letter_id="P">0.000000</value> -<value letter_id="Q">0.000000</value> -<value letter_id="R">0.000000</value> -<value letter_id="S">0.000000</value> -<value letter_id="T">0.240000</value> -<value letter_id="V">0.000000</value> -<value letter_id="W">0.000000</value> -<value letter_id="Y">0.000000</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">0.960000</value> -<value letter_id="C">0.040000</value> -<value letter_id="D">0.000000</value> -<value letter_id="E">0.000000</value> -<value letter_id="F">0.000000</value> -<value letter_id="G">0.000000</value> -<value letter_id="H">0.000000</value> -<value letter_id="I">0.000000</value> -<value letter_id="K">0.000000</value> -<value letter_id="L">0.000000</value> -<value letter_id="M">0.000000</value> -<value letter_id="N">0.000000</value> -<value letter_id="P">0.000000</value> -<value letter_id="Q">0.000000</value> -<value letter_id="R">0.000000</value> -<value letter_id="S">0.000000</value> -<value letter_id="T">0.000000</value> -<value letter_id="V">0.000000</value> -<value letter_id="W">0.000000</value> -<value letter_id="Y">0.000000</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">0.840000</value> -<value letter_id="C">0.000000</value> -<value letter_id="D">0.000000</value> -<value letter_id="E">0.000000</value> -<value letter_id="F">0.000000</value> -<value letter_id="G">0.120000</value> -<value letter_id="H">0.000000</value> -<value letter_id="I">0.000000</value> -<value letter_id="K">0.000000</value> -<value letter_id="L">0.000000</value> -<value letter_id="M">0.000000</value> -<value letter_id="N">0.000000</value> -<value letter_id="P">0.000000</value> -<value letter_id="Q">0.000000</value> -<value letter_id="R">0.000000</value> -<value letter_id="S">0.000000</value> -<value letter_id="T">0.040000</value> -<value letter_id="V">0.000000</value> -<value letter_id="W">0.000000</value> -<value letter_id="Y">0.000000</value> -</alphabet_array> </alphabet_matrix> </probabilities> <regular_expression> @@ -809,484 +102,17 @@ <left_flank>AAGGCCAGGA</left_flank> <site> <letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> </site> <right_flank>GCCTGAGAGC</right_flank> </contributing_site> <contributing_site sequence_id="sequence_25" position="36" strand="none" pvalue="3.41e-06" > <left_flank>ACAGGCCCTG</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> <right_flank>GCC</right_flank> </contributing_site> <contributing_site sequence_id="sequence_19" position="9" strand="none" pvalue="3.41e-06" > <left_flank>CAGGCCCTG</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> <right_flank>GCCCCAGCAG</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_9" position="13" strand="none" pvalue="3.41e-06" > -<left_flank>GATTCACTGA</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>GGCCCTCTGC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_21" position="7" strand="none" pvalue="4.00e-06" > -<left_flank>CCAAGGA</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>GCCCCACAAA</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_13" position="13" strand="none" pvalue="5.01e-06" > -<left_flank>CCACCAGCTT</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>AGCCCTGTAC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_23" position="15" strand="none" pvalue="6.06e-06" > -<left_flank>ATACCCAGGG</left_flank> -<site> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>CCTCAGCAGC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_15" position="21" strand="none" pvalue="8.67e-06" > -<left_flank>AATCACTGAG</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>GTCCCAGGGA</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_12" position="18" strand="none" pvalue="8.67e-06" > -<left_flank>CACCAGAGCT</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>AGAAGGTTCT</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_11" position="16" strand="none" pvalue="8.67e-06" > -<left_flank>CACTATTGAA</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>TTTCATTTGC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_22" position="2" strand="none" pvalue="1.21e-05" > -<left_flank>GA</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>GCCAACATCC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_28" position="32" strand="none" pvalue="1.59e-05" > -<left_flank>CCGGCGGGGC</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -</site> -<right_flank>GGGGCGG</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_20" position="4" strand="none" pvalue="1.59e-05" > -<left_flank>CAGA</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -</site> -<right_flank>GTTCCGACCA</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_6" position="15" strand="none" pvalue="1.68e-05" > -<left_flank>CCCACTACTT</left_flank> -<site> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>TCATTCTGAG</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_14" position="19" strand="none" pvalue="2.03e-05" > -<left_flank>CACCAGCAAG</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>GCTCAGGAGT</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_4" position="12" strand="none" pvalue="3.06e-05" > -<left_flank>CAGGTCTAAG</left_flank> -<site> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>CTTGGAGTCC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_0" position="39" strand="none" pvalue="3.06e-05" > -<left_flank>CCTCGGGACG</left_flank> -<site> -<letter_ref letter_id="T"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank></right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_18" position="37" strand="none" pvalue="3.82e-05" > -<left_flank>CGTGGTCGCG</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>GC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_5" position="0" strand="none" pvalue="3.82e-05" > -<left_flank></left_flank> -<site> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>ATGGTCCTGT</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_29" position="30" strand="none" pvalue="4.02e-05" > -<left_flank>GCTGCCGGTG</left_flank> -<site> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -</site> -<right_flank>GCCCTGGCG</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_1" position="27" strand="none" pvalue="5.52e-05" > -<left_flank>AGTCACAAGT</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>GGGTCGCACG</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_3" position="14" strand="none" pvalue="5.94e-05" > -<left_flank>CCCAGGTTTC</left_flank> -<site> -<letter_ref letter_id="T"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>TCGCCGCACC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_16" position="22" strand="none" pvalue="6.78e-05" > -<left_flank>AGTTTCAGTT</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>attatataac</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_7" position="2" strand="none" pvalue="2.08e-04" > -<left_flank>TC</left_flank> -<site> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -</site> -<right_flank>AAATGTTCCT</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_8" position="13" strand="none" pvalue="4.05e-04" > -<left_flank>TATAACTCAG</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>TAATTTGTAC</right_flank> -</contributing_site> -</contributing_sites> -</motif> -</motifs> -<scanned_sites_summary p_thresh="0.0001"> -<scanned_sites sequence_id="sequence_0" pvalue="1.22e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="39" pvalue="3.06e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_1" pvalue="2.21e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="27" pvalue="5.52e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_2" pvalue="7.29e-01" num_sites="0"></scanned_sites> -<scanned_sites sequence_id="sequence_3" pvalue="2.37e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="14" pvalue="5.94e-05"/> -</scanned_sites> <scanned_sites sequence_id="sequence_4" pvalue="1.22e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="12" pvalue="3.06e-05"/> -</scanned_sites> <scanned_sites sequence_id="sequence_5" pvalue="1.53e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="0" pvalue="3.82e-05"/> -</scanned_sites> <scanned_sites sequence_id="sequence_6" pvalue="6.70e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="15" pvalue="1.68e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_7" pvalue="1.81e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="4" pvalue="4.54e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_8" pvalue="1.61e-02" num_sites="0"></scanned_sites> -<scanned_sites sequence_id="sequence_9" pvalue="1.36e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="13" pvalue="3.41e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_10" pvalue="1.99e-01" num_sites="0"></scanned_sites> -<scanned_sites sequence_id="sequence_11" pvalue="3.47e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="16" pvalue="8.67e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_12" pvalue="3.47e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="18" pvalue="8.67e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_13" pvalue="2.01e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="13" pvalue="5.01e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_14" pvalue="8.11e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="19" pvalue="2.03e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_15" pvalue="3.47e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="21" pvalue="8.67e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_16" pvalue="2.71e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="22" pvalue="6.78e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_17" pvalue="8.23e-02" num_sites="0"></scanned_sites> -<scanned_sites sequence_id="sequence_18" pvalue="1.53e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="37" pvalue="3.82e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_19" pvalue="1.36e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="9" pvalue="3.41e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_20" pvalue="6.37e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="4" pvalue="1.59e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_21" pvalue="1.60e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="7" pvalue="4.00e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_22" pvalue="4.83e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="2" pvalue="1.21e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_23" pvalue="2.43e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="15" pvalue="6.06e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_24" pvalue="4.26e-05" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="12" pvalue="1.06e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_25" pvalue="1.36e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="36" pvalue="3.41e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_26" pvalue="4.30e-02" num_sites="0"></scanned_sites> -<scanned_sites sequence_id="sequence_27" pvalue="4.30e-02" num_sites="0"></scanned_sites> -<scanned_sites sequence_id="sequence_28" pvalue="6.37e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="32" pvalue="1.59e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_29" pvalue="1.61e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="30" pvalue="4.02e-05"/> -</scanned_sites> -</scanned_sites_summary> </MEME>
--- a/test-data/meme_output_test2.html Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/meme_output_test2.html Wed Dec 11 18:05:35 2019 -0500 @@ -7,7931 +7,21 @@ // @JSON_VAR data var data = { "program": "MEME", - "version": "4.12.0", - "release": "Tue Jun 27 16:22:50 2017 -0700", + "version": "5.0.5", + "release": "Mon Mar 18 20:12:19 2019 -0700", "stop_reason": "Stopped because requested number of motifs (1) found.", "cmd": [ - "meme", "meme_input_1.fasta", "-o", "meme_test2_out", "-nostatus", - "-maxsize", "1000000", "-sf", "Galaxy_FASTA_Input", "-dna", "-mod", - "zoops", "-nmotifs", "1", "-wnsites", "0.8", "-minw", "8", "-maxw", - "50", "-wg", "11", "-ws", "1", "-maxiter", "50", "-distance", - "0.001", "-prior", "dirichlet", "-b", "0.01", "-plib", - "prior30.plib", "-spmap", "uni", "-spfuzz", "0.5" + "meme", + "-o", + "-nostatus", "-maxsize", "1000000", "-sf", "Galaxy_FASTA_Input", + "-dna", "-mod", "zoops", "-nmotifs", "1", "-wnsites", "0.8", + "-minw", "8", "-maxw", "50", "-wg", "11", "-ws", "1", "-maxiter", + "50", "-distance", "0.001", "-prior", "dirichlet", "-b", "0.01", + "-plib", + "-spmap", "uni", "-spfuzz", "0.5" ], - "options": { - "mod": "zoops", - "revcomp": false, - "nmotifs": 1, - "minw": 8, - "maxw": 50, - "minsites": 2, - "maxsites": 30, - "wnsites": 0.8, - "spmap": "uni", - "spfuzz": 0.5, - "maxwords": -1, - "prior": "dirichlet", - "b": 0.01, - "maxiter": 50, - "distance": 0.001, - "wg": 11, - "ws": 1, - "noendgaps": false, - "substring": true - }, - "alphabet": { - "name": "DNA", - "like": "dna", - "ncore": 4, - "symbols": [ - { - "symbol": "A", - "name": "Adenine", - "colour": "CC0000", - "complement": "T" - }, { - "symbol": "C", - "name": "Cytosine", - "colour": "0000CC", - "complement": "G" - }, { - "symbol": "G", - "name": "Guanine", - "colour": "FFB300", - "complement": "C" - }, { - "symbol": "T", - "aliases": "U", - "name": "Thymine", - "colour": "008000", - "complement": "A" - }, { - "symbol": "N", - "aliases": "X.", - "name": "Any base", - "equals": "ACGT" - }, { - "symbol": "V", - "name": "Not T", - "equals": "ACG" - }, { - "symbol": "H", - "name": "Not G", - "equals": "ACT" - }, { - "symbol": "D", - "name": "Not C", - "equals": "AGT" - }, { - "symbol": "B", - "name": "Not A", - "equals": "CGT" - }, { - "symbol": "M", - "name": "Amino", - "equals": "AC" - }, { - "symbol": "R", - "name": "Purine", - "equals": "AG" - }, { - "symbol": "W", - "name": "Weak", - "equals": "AT" - }, { - "symbol": "S", - "name": "Strong", - "equals": "CG" - }, { - "symbol": "Y", - "name": "Pyrimidine", - "equals": "CT" - }, { - "symbol": "K", - "name": "Keto", - "equals": "GT" - } - ] - }, - "background": { - "freqs": [0.294, 0.231, 0.257, 0.217] - }, - "sequence_db": { - "source": "Galaxy_FASTA_Input", - "psp_source": "prior30.plib", - "freqs": [0.294, 0.231, 0.257, 0.217], - "sequences": [ - { - "name": "chr21_19617074_19617124_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_26934381_26934431_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_28217753_28217803_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31710037_31710087_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31744582_31744632_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31768316_31768366_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31914206_31914256_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31933633_31933683_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31962741_31962791_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31964683_31964733_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31973364_31973414_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_31992870_31992920_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_32185595_32185645_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_32202076_32202126_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_32253899_32253949_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_32410820_32410870_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_36411748_36411798_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_37838750_37838800_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_45705687_45705737_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_45971413_45971463_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_45978668_45978718_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_45993530_45993580_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_46020421_46020471_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_46031920_46031970_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_46046964_46047014_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_46057197_46057247_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_46086869_46086919_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_46102103_46102153_-", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_47517957_47518007_+", - "length": 50, - "weight": 1.000000 - }, { - "name": "chr21_47575506_47575556_-", - "length": 50, - "weight": 1.000000 - } - ] - }, "motifs": [ - { - "db": 0, - "id": "GGSRTATAAAA", - "alt": "MEME-1", - "len": 11, - "nsites": 30, - "evalue": "5.1e-040", - "ic": 13.0, - "re": 12.2, - "llr": 254, - "bt": 5.2854, - "time": 0.376000, - "psm": [ - [-14, -179, 114, -112], [3, -1155, 137, -270], - [-114, 20, 86, -71], [3, -279, 122, -170], - [-1155, -1155, -295, 215], [156, -179, -1155, -170], - [-1155, -1155, -1155, 220], [172, -279, -1155, -1155], - [125, -1155, -1155, 46], [167, -179, -1155, -1155], - [144, -1155, -63, -270] - ], - "pwm": [ - [0.266667, 0.066667, 0.566667, 0.100000], - [0.300000, 0.000000, 0.666667, 0.033333], - [0.133333, 0.266667, 0.466667, 0.133333], - [0.300000, 0.033333, 0.600000, 0.066667], - [0.000000, 0.000000, 0.033333, 0.966667], - [0.866667, 0.066667, 0.000000, 0.066667], - [0.000000, 0.000000, 0.000000, 1.000000], - [0.966667, 0.033333, 0.000000, 0.000000], - [0.700000, 0.000000, 0.000000, 0.300000], - [0.933333, 0.066667, 0.000000, 0.000000], - [0.800000, 0.000000, 0.166667, 0.033333] - ], - "sites": [ - { - "seq": 24, - "pos": 12, - "rc": false, - "pvalue": 4.51e-07, - "lflank": "AAGGCCAGGA", - "match": "GGGGTATAAAA", - "rflank": "GCCTGAGAGC" - }, { - "seq": 23, - "pos": 15, - "rc": false, - "pvalue": 2.22e-06, - "lflank": "ATACCCAGGG", - "match": "AGGGTATAAAA", - "rflank": "CCTCAGCAGC" - }, { - "seq": 13, - "pos": 13, - "rc": false, - "pvalue": 2.74e-06, - "lflank": "CCACCAGCTT", - "match": "GAGGTATAAAA", - "rflank": "AGCCCTGTAC" - }, { - "seq": 25, - "pos": 36, - "rc": false, - "pvalue": 4.86e-06, - "lflank": "ACAGGCCCTG", - "match": "GGCATATAAAA", - "rflank": "GCC" - }, { - "seq": 21, - "pos": 7, - "rc": false, - "pvalue": 4.86e-06, - "lflank": "CCAAGGA", - "match": "GGAGTATAAAA", - "rflank": "GCCCCACAAA" - }, { - "seq": 19, - "pos": 9, - "rc": false, - "pvalue": 4.86e-06, - "lflank": "CAGGCCCTG", - "match": "GGCATATAAAA", - "rflank": "GCCCCAGCAG" - }, { - "seq": 9, - "pos": 13, - "rc": false, - "pvalue": 4.86e-06, - "lflank": "GATTCACTGA", - "match": "GGCATATAAAA", - "rflank": "GGCCCTCTGC" - }, { - "seq": 28, - "pos": 32, - "rc": false, - "pvalue": 6.48e-06, - "lflank": "CCGGCGGGGC", - "match": "GGGGTATAAAG", - "rflank": "GGGGCGG" - }, { - "seq": 20, - "pos": 4, - "rc": false, - "pvalue": 6.48e-06, - "lflank": "CAGA", - "match": "GGGGTATAAAG", - "rflank": "GTTCCGACCA" - }, { - "seq": 12, - "pos": 18, - "rc": false, - "pvalue": 6.48e-06, - "lflank": "CACCAGAGCT", - "match": "GGGATATATAA", - "rflank": "AGAAGGTTCT" - }, { - "seq": 15, - "pos": 21, - "rc": false, - "pvalue": 1.38e-05, - "lflank": "AATCACTGAG", - "match": "GATGTATAAAA", - "rflank": "GTCCCAGGGA" - }, { - "seq": 11, - "pos": 16, - "rc": false, - "pvalue": 1.38e-05, - "lflank": "CACTATTGAA", - "match": "GATGTATAAAA", - "rflank": "TTTCATTTGC" - }, { - "seq": 0, - "pos": 39, - "rc": false, - "pvalue": 1.41e-05, - "lflank": "CCTCGGGACG", - "match": "TGGGTATATAA", - "rflank": "" - }, { - "seq": 6, - "pos": 15, - "rc": false, - "pvalue": 1.61e-05, - "lflank": "CCCACTACTT", - "match": "AGAGTATAAAA", - "rflank": "TCATTCTGAG" - }, { - "seq": 22, - "pos": 2, - "rc": false, - "pvalue": 1.95e-05, - "lflank": "GA", - "match": "GACATATAAAA", - "rflank": "GCCAACATCC" - }, { - "seq": 14, - "pos": 17, - "rc": false, - "pvalue": 1.95e-05, - "lflank": "CCCACCAGCA", - "match": "AGGATATATAA", - "rflank": "AAGCTCAGGA" - }, { - "seq": 18, - "pos": 37, - "rc": false, - "pvalue": 2.16e-05, - "lflank": "CGTGGTCGCG", - "match": "GGGGTATAACA", - "rflank": "GC" - }, { - "seq": 29, - "pos": 30, - "rc": false, - "pvalue": 3.04e-05, - "lflank": "GCTGCCGGTG", - "match": "AGCGTATAAAG", - "rflank": "GCCCTGGCG" - }, { - "seq": 4, - "pos": 12, - "rc": false, - "pvalue": 3.04e-05, - "lflank": "CAGGTCTAAG", - "match": "AGCATATATAA", - "rflank": "CTTGGAGTCC" - }, { - "seq": 5, - "pos": 0, - "rc": false, - "pvalue": 3.67e-05, - "lflank": "", - "match": "AACGTATATAA", - "rflank": "ATGGTCCTGT" - }, { - "seq": 1, - "pos": 27, - "rc": false, - "pvalue": 3.93e-05, - "lflank": "AGTCACAAGT", - "match": "GAGTTATAAAA", - "rflank": "GGGTCGCACG" - }, { - "seq": 7, - "pos": 4, - "rc": false, - "pvalue": 5.65e-05, - "lflank": "TCAG", - "match": "AGTATATATAA", - "rflank": "ATGTTCCTGT" - }, { - "seq": 3, - "pos": 14, - "rc": false, - "pvalue": 6.24e-05, - "lflank": "CCCAGGTTTC", - "match": "TGAGTATATAA", - "rflank": "TCGCCGCACC" - }, { - "seq": 16, - "pos": 22, - "rc": false, - "pvalue": 7.15e-05, - "lflank": "AGTTTCAGTT", - "match": "GGCATCTAAAA", - "rflank": "attatataac" - }, { - "seq": 27, - "pos": 36, - "rc": false, - "pvalue": 1.39e-04, - "lflank": "TGCCTGGGTC", - "match": "CAGGTATAAAG", - "rflank": "GCT" - }, { - "seq": 26, - "pos": 37, - "rc": false, - "pvalue": 1.39e-04, - "lflank": "TGCCTGGGCC", - "match": "CAGGTATAAAG", - "rflank": "GC" - }, { - "seq": 17, - "pos": 2, - "rc": false, - "pvalue": 4.81e-04, - "lflank": "ga", - "match": "TGGTTTTATAA", - "rflank": "ggggcctcac" - }, { - "seq": 8, - "pos": 13, - "rc": false, - "pvalue": 8.57e-04, - "lflank": "TATAACTCAG", - "match": "GTTGGATAAAA", - "rflank": "TAATTTGTAC" - }, { - "seq": 10, - "pos": 7, - "rc": false, - "pvalue": 1.47e-03, - "lflank": "aaactta", - "match": "AAACTCTATAA", - "rflank": "acttaaaact" - }, { - "seq": 2, - "pos": 26, - "rc": false, - "pvalue": 2.64e-03, - "lflank": "GGTGGGGGTG", - "match": "GGGGTTTCACT", - "rflank": "GGTCCACTAT" - } - ] - } - ], - "scan": [ - { - "pvalue": 5.63e-04, - "sites": [ - { - "motif": 0, - "pos": 39, - "rc": false, - "pvalue": 1.41e-05 - } - ] - }, { - "pvalue": 1.57e-03, - "sites": [ - { - "motif": 0, - "pos": 27, - "rc": false, - "pvalue": 3.93e-05 - } - ] - }, { - "pvalue": 1.00e-01, - "sites": [] - }, { - "pvalue": 2.49e-03, - "sites": [ - { - "motif": 0, - "pos": 14, - "rc": false, - "pvalue": 6.24e-05 - } - ] - }, { - "pvalue": 1.22e-03, - "sites": [ - { - "motif": 0, - "pos": 12, - "rc": false, - "pvalue": 3.04e-05 - } - ] - }, { - "pvalue": 1.47e-03, - "sites": [ - { - "motif": 0, - "pos": 0, - "rc": false, - "pvalue": 3.67e-05 - } - ] - }, { - "pvalue": 6.45e-04, - "sites": [ - { - "motif": 0, - "pos": 15, - "rc": false, - "pvalue": 1.61e-05 - } - ] - }, { - "pvalue": 2.26e-03, - "sites": [ - { - "motif": 0, - "pos": 4, - "rc": false, - "pvalue": 5.65e-05 - } - ] - }, { - "pvalue": 3.37e-02, - "sites": [] - }, { - "pvalue": 1.95e-04, - "sites": [ - { - "motif": 0, - "pos": 13, - "rc": false, - "pvalue": 4.86e-06 - } - ] - }, { - "pvalue": 5.73e-02, - "sites": [] - }, { - "pvalue": 5.52e-04, - "sites": [ - { - "motif": 0, - "pos": 16, - "rc": false, - "pvalue": 1.38e-05 - } - ] - }, { - "pvalue": 2.59e-04, - "sites": [ - { - "motif": 0, - "pos": 18, - "rc": false, - "pvalue": 6.48e-06 - } - ] - }, { - "pvalue": 1.10e-04, - "sites": [ - { - "motif": 0, - "pos": 13, - "rc": false, - "pvalue": 2.74e-06 - } - ] - }, { - "pvalue": 7.78e-04, - "sites": [ - { - "motif": 0, - "pos": 17, - "rc": false, - "pvalue": 1.95e-05 - } - ] - }, { - "pvalue": 5.52e-04, - "sites": [ - { - "motif": 0, - "pos": 21, - "rc": false, - "pvalue": 1.38e-05 - } - ] - }, { - "pvalue": 2.85e-03, - "sites": [ - { - "motif": 0, - "pos": 22, - "rc": false, - "pvalue": 7.15e-05 - } - ] - }, { - "pvalue": 1.90e-02, - "sites": [] - }, { - "pvalue": 8.63e-04, - "sites": [ - { - "motif": 0, - "pos": 37, - "rc": false, - "pvalue": 2.16e-05 - } - ] - }, { - "pvalue": 1.95e-04, - "sites": [ - { - "motif": 0, - "pos": 9, - "rc": false, - "pvalue": 4.86e-06 - } - ] - }, { - "pvalue": 2.59e-04, - "sites": [ - { - "motif": 0, - "pos": 4, - "rc": false, - "pvalue": 6.48e-06 - } - ] - }, { - "pvalue": 1.95e-04, - "sites": [ - { - "motif": 0, - "pos": 7, - "rc": false, - "pvalue": 4.86e-06 - } - ] - }, { - "pvalue": 7.78e-04, - "sites": [ - { - "motif": 0, - "pos": 2, - "rc": false, - "pvalue": 1.95e-05 - } - ] - }, { - "pvalue": 8.89e-05, - "sites": [ - { - "motif": 0, - "pos": 15, - "rc": false, - "pvalue": 2.22e-06 - } - ] - }, { - "pvalue": 1.80e-05, - "sites": [ - { - "motif": 0, - "pos": 12, - "rc": false, - "pvalue": 4.51e-07 - } - ] - }, { - "pvalue": 1.95e-04, - "sites": [ - { - "motif": 0, - "pos": 36, - "rc": false, - "pvalue": 4.86e-06 - } - ] - }, { - "pvalue": 5.54e-03, - "sites": [] - }, { - "pvalue": 5.54e-03, - "sites": [] - }, { - "pvalue": 2.59e-04, - "sites": [ - { - "motif": 0, - "pos": 32, - "rc": false, - "pvalue": 6.48e-06 - } - ] - }, { - "pvalue": 1.22e-03, - "sites": [ - { - "motif": 0, - "pos": 30, - "rc": false, - "pvalue": 3.04e-05 - } - ] - } ] }; </script> - <script> var site_url = "http://meme-suite.org"; -</script> - <script> - -/* - * $ - * - * Shorthand function for getElementById - */ -function $(el) { - return document.getElementById(el); -} - - -/* - * See http://stackoverflow.com/a/5450113/66387 - * Does string multiplication like the perl x operator. - */ -function string_mult(pattern, count) { - if (count < 1) return ''; - var result = ''; - while (count > 1) { - if (count & 1) result += pattern; - count >>= 1, pattern += pattern; - } - return result + pattern; -} - -/* - * See http://stackoverflow.com/questions/814613/how-to-read-get-data-from-a-url-using-javascript - * Slightly modified with information from - * https://developer.mozilla.org/en/DOM/window.location - */ -function parse_params() { - "use strict"; - var search, queryStart, queryEnd, query, params, nvPairs, i, nv, n, v; - search = window.location.search; - queryStart = search.indexOf("?") + 1; - queryEnd = search.indexOf("#") + 1 || search.length + 1; - query = search.slice(queryStart, queryEnd - 1); - - if (query === search || query === "") return {}; - - params = {}; - nvPairs = query.replace(/\+/g, " ").split("&"); - - for (i = 0; i < nvPairs.length; i++) { - nv = nvPairs[i].split("="); - n = decodeURIComponent(nv[0]); - v = decodeURIComponent(nv[1]); - // allow a name to be used multiple times - // storing each value in the array - if (!(n in params)) { - params[n] = []; - } - params[n].push(nv.length === 2 ? v : null); - } - return params; -} - -/* - * coords - * - * Calculates the x and y offset of an element. - * From http://www.quirksmode.org/js/findpos.html - * with alterations to take into account scrolling regions - */ -function coords(elem) { - var myX = myY = 0; - if (elem.getBoundingClientRect) { - var rect; - rect = elem.getBoundingClientRect(); - myX = rect.left + ((typeof window.pageXOffset !== "undefined") ? - window.pageXOffset : document.body.scrollLeft); - myY = rect.top + ((typeof window.pageYOffset !== "undefined") ? - window.pageYOffset : document.body.scrollTop); - } else { - // this fall back doesn't properly handle absolutely positioned elements - // inside a scrollable box - var node; - if (elem.offsetParent) { - // subtract all scrolling - node = elem; - do { - myX -= node.scrollLeft ? node.scrollLeft : 0; - myY -= node.scrollTop ? node.scrollTop : 0; - } while (node = node.parentNode); - // this will include the page scrolling (which is unwanted) so add it back on - myX += (typeof window.pageXOffset !== "undefined") ? window.pageXOffset : document.body.scrollLeft; - myY += (typeof window.pageYOffset !== "undefined") ? window.pageYOffset : document.body.scrollTop; - // sum up offsets - node = elem; - do { - myX += node.offsetLeft; - myY += node.offsetTop; - } while (node = node.offsetParent); - } - } - return [myX, myY]; -} - -/* - * position_popup - * - * Positions a popup relative to an anchor element. - * - * The avaliable positions are: - * 0 - Centered below the anchor. - */ -function position_popup(anchor, popup, position) { - "use strict"; - var a_x, a_y, a_w, a_h, p_x, p_y, p_w, p_h; - var a_xy, spacer, margin, scrollbar, page_w; - // define constants - spacer = 5; - margin = 15; - scrollbar = 15; - // define the positions and widths - a_xy = coords(anchor); - a_x = a_xy[0]; - a_y = a_xy[1]; - a_w = anchor.offsetWidth; - a_h = anchor.offsetHeight; - p_w = popup.offsetWidth; - p_h = popup.offsetHeight; - page_w = null; - if (window.innerWidth) { - page_w = window.innerWidth; - } else if (document.body) { - page_w = document.body.clientWidth; - } - // check the position type is defined - if (typeof position !== "number") { - position = 0; - } - // calculate the popup position - switch (position) { - case 1: - p_x = a_x + a_w + spacer; - p_y = a_y + (a_h / 2) - (p_h / 2); - break; - case 0: - default: - p_x = a_x + (a_w / 2) - (p_w / 2); - p_y = a_y + a_h + spacer; - break; - } - // constrain the popup position - if (p_x < margin) { - p_x = margin; - } else if (page_w != null && (p_x + p_w) > (page_w - margin - scrollbar)) { - p_x = page_w - margin - scrollbar - p_w; - } - if (p_y < margin) { - p_y = margin; - } - // position the popup - popup.style.left = p_x + "px"; - popup.style.top = p_y + "px"; -} - -function lookup_help_popup(popup_id) { - var _body, pop, info; - pop = document.getElementById(popup_id); - if (pop == null) { - _body = document.getElementsByTagName("body")[0]; - pop = document.createElement("div"); - pop.className = "pop_content"; - pop.id = popup_id; - pop.style.backgroundColor = "#FFC"; - pop.style.borderColor = "black"; - info = document.createElement("p"); - info.style.fontWeight = "bold"; - info.appendChild(document.createTextNode("Error: No popup for topic \"" + popup_id + "\".")); - pop.appendChild(info); - // this might cause problems with the menu, but as this only happens - // when something is already wrong I don't think that's too much of a problem - _body.insertBefore(pop, _body.firstChild); - } - if (document.getElementsByTagName('body')[0].hasAttribute("data-autobtns")) { - if (!/\bauto_buttons\b/.test(pop.className)) { - pop.className += " auto_buttons"; - var back_btn_sec = document.createElement("div"); - back_btn_sec.className = "nested_only pop_back_sec"; - var back_btn = document.createElement("span"); - back_btn.className = "pop_back"; - back_btn.appendChild(document.createTextNode("<< back")); - back_btn.addEventListener("click", function(e) { - help_return(); - }, false); - back_btn_sec.appendChild(back_btn); - pop.insertBefore(back_btn_sec, pop.firstChild); - var close_btn_sec = document.createElement("div"); - close_btn_sec.className = "pop_close_sec"; - var close_btn = document.createElement("span"); - close_btn.className = "pop_close"; - close_btn.appendChild(document.createTextNode("close")); - close_btn.addEventListener("click", function(e) { - help_popup(); - }, false); - close_btn_sec.appendChild(close_btn); - pop.appendChild(close_btn_sec); - } - } - return pop; -} - -/* - * help_popup - * - * Moves around help pop-ups so they appear - * below an activator. - */ -function help_popup(activator, popup_id) { - "use strict"; - var pop; - // set default values - if (typeof help_popup.popup === "undefined") { - help_popup.popup = []; - } - if (typeof help_popup.activator === "undefined") { - help_popup.activator = null; - } - var last_pop = (help_popup.popup.length > 0 ? help_popup.popup[help_popup.popup.length - 1] : null); - if (typeof(activator) == "undefined") { // no activator so hide - if (last_pop != null) { - last_pop.style.display = 'none'; - help_popup.popup = []; - } - return; - } - pop = lookup_help_popup(popup_id); - if (pop == last_pop) { - if (activator == help_popup.activator) { - //hide popup (as we've already shown it for the current help button) - last_pop.style.display = 'none'; - help_popup.popup = []; - return; // toggling complete! - } - } else if (last_pop != null) { - //activating different popup so hide current one - last_pop.style.display = 'none'; - } - help_popup.popup = [pop]; - help_popup.activator = activator; - toggle_class(pop, "nested", false); - //must make the popup visible to measure it or it has zero width - pop.style.display = 'block'; - position_popup(activator, pop); -} - -/* - * help_refine - * - * Intended for links within a help popup. Stores a stack of state so - * you can go back. - */ -function help_refine(popup_id) { - if (help_popup.popup == null || help_popup.popup.length == 0 || help_popup.activator == null) { - throw new Error("Can not refine a help popup when one is not shown!"); - } - var pop = lookup_help_popup(popup_id); - var last_pop = help_popup.popup[help_popup.popup.length - 1]; - if (pop == last_pop) return; // slightly odd, but no real cause for alarm - help_popup.popup.push(pop); - toggle_class(pop, "nested", true); - last_pop.style.display = "none"; - //must make the popup visible to measure it or it has zero width - pop.style.display = "block"; - position_popup(help_popup.activator, pop); -} - -/* - * help_return - * - * Intended for links within a help popup. Stores a stack of state so - * you can go back. - */ -function help_return() { - if (help_popup.popup == null || help_popup.popup.length == 0 || help_popup.activator == null) { - throw new Error("Can not return to a earlier help popup when one is not shown!"); - } - var last_pop = help_popup.popup.pop(); - last_pop.style.display = "none"; - var pop = (help_popup.popup.length > 0 ? help_popup.popup[help_popup.popup.length - 1] : null); - if (pop != null) { - toggle_class(pop, "nested", help_popup.popup.length > 1); - pop.style.display = "block"; - position_popup(help_popup.activator, pop); - } else { - help_popup.activator = null; - } -} - -/* - * update_scroll_pad - * - * Creates padding at the bottom of the page to allow - * scrolling of anything into view. - */ -function update_scroll_pad() { - var page, pad; - page = (document.compatMode === "CSS1Compat") ? document.documentElement : document.body; - pad = $("scrollpad"); - if (pad === null) { - pad = document.createElement("div"); - pad.id = 'scrollpad'; - document.getElementsByTagName('body')[0].appendChild(pad); - } - pad.style.height = Math.abs(page.clientHeight - 100) + "px"; -} - -function substitute_classes(node, remove, add) { - "use strict"; - var list, all, i, cls, classes; - list = node.className.split(/\s+/); - all = {}; - for (i = 0; i < list.length; i++) { - if (list[i].length > 0) all[list[i]] = true; - } - for (i = 0; i < remove.length; i++) { - if (all.hasOwnProperty(remove[i])) { - delete all[remove[i]]; - } - } - for (i = 0; i < add.length; i++) { - all[add[i]] = true; - } - classes = ""; - for (cls in all) { - classes += cls + " "; - } - node.className = classes; -} - -/* - * toggle_class - * - * Adds or removes a class from the node. If the parameter 'enabled' is not - * passed then the existence of the class will be toggled, otherwise it will be - * included if enabled is true. - */ -function toggle_class(node, cls, enabled) { - var classes = node.className; - var list = classes.replace(/^\s+/, '').replace(/\s+$/, '').split(/\s+/); - var found = false; - for (var i = 0; i < list.length; i++) { - if (list[i] == cls) { - list.splice(i, 1); - i--; - found = true; - } - } - if (typeof enabled == "undefined") { - if (!found) list.push(cls); - } else { - if (enabled) list.push(cls); - } - node.className = list.join(" "); -} - -/* - * find_child - * - * Searches child nodes in depth first order and returns the first it finds - * with the className specified. - * TODO replace with querySelector - */ -function find_child(node, className) { - var pattern; - if (node == null || typeof node !== "object") { - return null; - } - if (typeof className === "string") { - pattern = new RegExp("\\b" + className + "\\b"); - } else { - pattern = className; - } - if (node.nodeType == Node.ELEMENT_NODE && - pattern.test(node.className)) { - return node; - } else { - var result = null; - for (var i = 0; i < node.childNodes.length; i++) { - result = find_child(node.childNodes[i], pattern); - if (result != null) break; - } - return result; - } -} - -/* - * find_parent - * - * Searches parent nodes outwards from the node and returns the first it finds - * with the className specified. - */ -function find_parent(node, className) { - var pattern; - pattern = new RegExp("\\b" + className + "\\b"); - do { - if (node.nodeType == Node.ELEMENT_NODE && - pattern.test(node.className)) { - return node; - } - } while (node = node.parentNode); - return null; -} - -/* - * find_parent_tag - * - * Searches parent nodes outwards from the node and returns the first it finds - * with the tag name specified. HTML tags should be specified in upper case. - */ -function find_parent_tag(node, tag_name) { - do { - if (node.nodeType == Node.ELEMENT_NODE && node.tagName == tag_name) { - return node; - } - } while (node = node.parentNode); - return null; -} - -/* - * __toggle_help - * - * Uses the 'topic' property of the this object to - * toggle display of a help topic. - * - * This function is not intended to be called directly. - */ -function __toggle_help(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - - help_popup(this, this.getAttribute("data-topic")); -} - -function setup_help_button(button) { - "use strict"; - var topic; - if (button.hasAttribute("data-topic")) { - topic = button.getAttribute("data-topic"); - if (document.getElementById(topic) != null) { - button.tabIndex = "0"; // make keyboard selectable - button.addEventListener("click", function() { - help_popup(button, topic); - }, false); - button.addEventListener("keydown", function(e) { - // toggle only on Enter or Spacebar, let other keys do their thing - if (e.keyCode !== 13 && e.keyCode !== 32) return; - // stop a submit or something like that - e.preventDefault(); - help_popup(button, topic); - }, false); - } else { - button.style.visibility = "hidden"; - } - } - button.className += " active"; -} - -/* - * help_button - * - * Makes a help button for the passed topic. - */ -function help_button(topic) { - var btn = document.createElement("div"); - btn.className = "help"; - btn.setAttribute("data-topic", topic); - setup_help_button(btn); - return btn; -} - -/* - * prepare_download - * - * Sets the attributes of a link to setup a file download using the given content. - * If no link is provided then create one and click it. - */ -function prepare_download(content, mimetype, filename, link) { - "use strict"; - // if no link is provided then create one and click it - var click_link = false; - if (!link) { - link = document.createElement("a"); - click_link = true; - } - try { - // Use a BLOB to convert the text into a data URL. - // We could do this manually with a base 64 conversion. - // This will only be supported on modern browsers, - // hence the try block. - var blob = new Blob([content], {type: mimetype}); - var reader = new FileReader(); - reader.onloadend = function() { - // If we're lucky the browser will also support the download - // attribute which will let us suggest a file name to save the link. - // Otherwise it is likely that the filename will be unintelligible. - link.setAttribute("download", filename); - link.href = reader.result; - if (click_link) { - // must add the link to click it - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } - } - reader.readAsDataURL(blob); - } catch (error) { - if (console && console.log) console.log(error); - // probably an old browser - link.href = ""; - link.visible = false; - } -} - -/* - * add_cell - * - * Add a cell to the table row. - */ -function add_cell(row, node, cls, click_action) { - var cell = row.insertCell(row.cells.length); - if (node) cell.appendChild(node); - if (cls && cls !== "") cell.className = cls; - if (click_action) cell.addEventListener("click", click_action, false); -} - -/* - * add_header_cell - * - * Add a header cell to the table row. - */ -function add_header_cell(row, node, help_topic, cls, colspan) { - var th = document.createElement("th"); - if (node) th.appendChild(node); - if (help_topic && help_topic !== "") th.appendChild(help_button(help_topic)); - if (cls && cls !== "") th.className = cls; - if (typeof colspan == "number" && colspan > 1) th.colSpan = colspan; - row.appendChild(th); -} - -/* - * add_text_cell - * - * Add a text cell to the table row. - */ -function add_text_cell(row, text, cls, action) { - var node = null; - if (typeof(text) != 'undefined') node = document.createTextNode(text); - add_cell(row, node, cls, action); -} - -/* - * add_text_header_cell - * - * Add a text header cell to the table row. - */ -function add_text_header_cell(row, text, help_topic, cls, action, colspan) { - var node = null; - if (typeof(text) != 'undefined') { - var nbsp = (help_topic ? "\u00A0" : ""); - var str = "" + text; - var parts = str.split(/\n/); - if (parts.length === 1) { - if (action) { - node = document.createElement("span"); - node.appendChild(document.createTextNode(str + nbsp)); - } else { - node = document.createTextNode(str + nbsp); - } - } else { - node = document.createElement("span"); - for (var i = 0; i < parts.length; i++) { - if (i !== 0) { - node.appendChild(document.createElement("br")); - } - node.appendChild(document.createTextNode(parts[i])); - } - } - if (action) { - node.addEventListener("click", action, false); - node.style.cursor = "pointer"; - } - } - add_header_cell(row, node, help_topic, cls, colspan); -} - -function setup_help() { - "use strict"; - var help_buttons, i; - help_buttons = document.querySelectorAll(".help:not(.active)"); - for (i = 0; i < help_buttons.length; i++) { - setup_help_button(help_buttons[i]); - } -} - -function setup_scrollpad() { - "use strict"; - if (document.getElementsByTagName('body')[0].hasAttribute("data-scrollpad") && document.getElementById("scrollpad") == null) { - window.addEventListener("resize", update_scroll_pad, false); - update_scroll_pad(); - } -} - -// anon function to avoid polluting global scope -(function() { - "use strict"; - window.addEventListener("load", function load(evt) { - window.removeEventListener("load", load, false); - setup_help(); - setup_scrollpad(); - }, false); -})(); - -/* - * make_link - * - * Creates a text node and if a URL is specified it surrounds it with a link. - * If the URL doesn't begin with "http://" it automatically adds it, as - * relative links don't make much sense in this context. - */ -function make_link(text, url) { - var textNode = null; - var link = null; - if (typeof text !== "undefined" && text !== null) textNode = document.createTextNode(text); - if (typeof url === "string") { - if (url.indexOf("//") == -1) { - url = "http://" + url; - } - link = document.createElement('a'); - link.href = url; - if (textNode) link.appendChild(textNode); - return link; - } - return textNode; -} -</script> - <script> - // - // return true if any part of the passed element is visible in the viewport - // - function element_in_viewport(elem) { - var rect; - try { - rect = elem.getBoundingClientRect(); - } catch (e) { - return false; - } - return ( - rect.top < (window.innerHeight || document.body.clientHeight) && - rect.bottom > 0 && - rect.left < (window.innerWidth || document.body.clientWidth) && - rect.right > 0 - ); - } - - // - // Functions to delay a drawing task until it is required or it would not lag the display to do so - // - - // a list of items still to be drawn - var drawable_list = []; - // the delay between drawing objects that are not currently visible - var draw_delay = 1; - // the delay after a user interaction - var user_delay = 300; - // the delay after a user has stopped scrolling and is viewing the stuff drawn on the current page - var stop_delay = 300; - // the timer handle; allows resetting of the timer after user interactions - var draw_timer = null; - - // - // Drawable - // - // elem - a page element which defines the position on the page that drawing is to be done - // task - an object with the method run which takes care of painting the object - // - var Drawable = function(elem, task) { - this.elem = elem; - this.task = task; - } - - // - // Drawable.is_visible - // - // Determines if the element is visible in the viewport - // - Drawable.prototype.is_visible = function() { - return element_in_viewport(this.elem); - } - - // - // Drawable.run - // - // Run the task held by the drawable - Drawable.prototype.run = function() { - if (this.task) this.task.run(); - this.task = null; - } - - // - // Drawable.run - // - // Run the task iff visible - // returns true if the task ran or has already run - Drawable.prototype.run_visible = function() { - if (this.task) { - if (element_in_viewport(this.elem)) { - this.task.run(); - this.task = null; - return true; - } - return false; - } else { - return true; - } - } - - // - // draw_on_screen - // - // Checks each drawable object and draws those on screen. - // - function draw_on_screen() { - var found = false; - for (var i = 0; i < drawable_list.length; i++) { - if (drawable_list[i].run_visible()) { - drawable_list.splice(i--, 1); - found = true; - } - } - return found; - } - - // - // process_draw_tasks - // - // Called on a delay to process the next avaliable - // draw task. - // - function process_draw_tasks() { - var delay = draw_delay; - draw_timer = null; - if (drawable_list.length == 0) return; //no more tasks - if (draw_on_screen()) { - delay = stop_delay; //give the user a chance to scroll - } else { - //get next task - var drawable = drawable_list.shift(); - drawable.task.run(); - } - //allow UI updates between tasks - draw_timer = window.setTimeout("process_draw_tasks()", delay); - } - - // - // delayed_process_draw_tasks - // - // Call process_draw_tasks after a short delay. - // The delay serves to group multiple redundant events. - // Should be set as event handler for onscroll and onresize. - // - function delayed_process_draw_tasks() { - //reset the timer - if (drawable_list.length > 0) { - if (draw_timer != null) clearTimeout(draw_timer); - draw_timer = window.setTimeout("process_draw_tasks()", user_delay); - } - } - - // - // add_draw_task - // - // Add a drawing task to be called immediately if it is - // visible, or to be called on a delay to reduce stuttering - // effect on the web browser. - function add_draw_task(elem, task) { - drawable = new Drawable(elem, task); - if (drawable.is_visible()) { - task.run(); - } else { - drawable_list.push(drawable); - //reset timer - if (draw_timer != null) clearTimeout(draw_timer); - draw_timer = window.setTimeout("process_draw_tasks()", user_delay); - } - } - -</script> - <script> -//====================================================================== -// start Alphabet object -//====================================================================== -var Alphabet = function(alphabet, background) { - "use strict"; - var i, j, sym, aliases, complement, comp_e_sym, ambigs, generate_background; - generate_background = (background == null); - if (generate_background) { - background = []; - for (i = 0; i < alphabet.ncore; i++) background[i] = 1.0 / alphabet.ncore; - } else if (alphabet.ncore != background.length) { - throw new Error("The background length does not match the alphabet length."); - } - this.name = alphabet.name; - this.like = (alphabet.like != null ? alphabet.like.toUpperCase() : null); - this.ncore = alphabet.ncore; - this.symbols = alphabet.symbols; - this.background = background; - this.genbg = generate_background; - this.encode = {}; - this.encode2core = {}; - this.complement = {}; - // check if all symbols are same case - var seen_uc = false; - var seen_lc = false; - var check_case = function (syms) { - var s, sym; - if (typeof syms === "string") { - for (s = 0; s < syms.length; s++) { - sym = syms.charAt(s); - if (sym >= 'a' && sym <= 'z') seen_lc = true; - else if (sym >= 'A' && sym <= 'Z') seen_uc = true; - } - } - }; - for (i = 0; i < this.symbols.length; i++) { - check_case(this.symbols[i].symbol); - check_case(this.symbols[i].aliases); - } - // now map symbols to indexes - var update_array = function(array, syms, index) { - var s, sym; - if (typeof syms === "string") { - for (s = 0; s < syms.length; s++) { - sym = syms.charAt(s); - array[sym] = index; - // when only a single case is used, then encode as case insensitive - if (seen_uc != seen_lc) { - if (sym >= 'a' && sym <= 'z') { - array[sym.toUpperCase()] = index; - } else if (sym >= 'A' && sym <= 'Z') { - array[sym.toLowerCase()] = index; - } - } - } - } - } - // map core symbols to index - for (i = 0; i < this.ncore; i++) { - update_array(this.encode2core, this.symbols[i].symbol, i); - update_array(this.encode, this.symbols[i].symbol, i); - update_array(this.encode2core, this.symbols[i].aliases, i); - update_array(this.encode, this.symbols[i].aliases, i); - } - // map ambigous symbols to index - ambigs = {}; - for (i = this.ncore; i < this.symbols.length; i++) { - update_array(this.encode, this.symbols[i].symbol, i); - update_array(this.encode, this.symbols[i].aliases, i); - ambigs[this.symbols[i].equals] = i; - } - // determine complements - for (i = 0; i < this.ncore; i++) { - complement = this.symbols[i].complement; - if (typeof complement === "string") { - this.complement[i] = this.encode2core[complement]; - } - } - next_symbol: - for (i = this.ncore; i < this.symbols.length; i++) { - complement = ""; - for (j = 0; j < this.symbols[i].equals.length; j++) { - comp_e_sym = this.complement[this.encode2core[this.symbols[i].equals.charAt(j)]]; - if (typeof comp_e_sym !== "number") continue next_symbol; - complement += this.symbols[comp_e_sym].symbol; - } - complement = complement.split("").sort().join(""); - if (typeof ambigs[complement] === "number") { - this.complement[i] = ambigs[complement]; - } - } - // determine case insensitivity - this.case_insensitive = true; - if (seen_uc == seen_lc) { - // when there is a mixture of cases it probably won't - // be case insensitive but we still need to check - loop: - for (i = 0; i < this.symbols.length; i++) { - sym = this.symbols[i].symbol; - if (sym >= 'A' && sym <= 'Z') { - if (this.encode[sym.toLowerCase()] != i) { - this.case_insensitive = false; - break loop; - } - } else if (sym >= 'a' && sym <= 'z') { - if (this.encode[sym.toUpperCase()] != i) { - this.case_insensitive = false; - break loop; - } - } - aliases = this.symbols[i].aliases; - if (aliases != null) { - for (j = 0; j < aliases.length; j++) { - sym = aliases.charAt(j); - if (sym >= 'A' && sym <= 'Z') { - if (this.encode[sym.toLowerCase()] != i) { - this.case_insensitive = false; - break loop; - } - } else if (sym >= 'a' && sym <= 'z') { - if (this.encode[sym.toUpperCase()] != i) { - this.case_insensitive = false; - break loop; - } - } - } - } - } - } - // normalise aliases to remove the prime symbol and eliminate - // the alternate cases when the alphabet is case insensitive - var seen, out; - for (i = 0; i < this.symbols.length; i++) { - sym = this.symbols[i].symbol; - aliases = this.symbols[i].aliases; - if (typeof aliases != "string") aliases = ""; - seen = {}; - out = []; - if (this.case_insensitive) { - sym = sym.toUpperCase(); - aliases = aliases.toUpperCase(); - } - seen[sym] = true; - for (j = 0; j < aliases.length; j++) { - if (!seen[aliases.charAt(j)]) { - seen[aliases.charAt(j)] = true; - out.push(aliases.charAt(j)); - } - } - this.symbols[i].aliases = out.sort().join(""); - } -}; -// return the name of the alphabet -Alphabet.prototype.get_alphabet_name = function() { - return this.name; -}; -// return if the alphabet can be complemented -Alphabet.prototype.has_complement = function() { - return (typeof this.symbols[0].complement === "string"); -}; -// return true if an uppercase letter has the same meaning as the lowercase form -Alphabet.prototype.is_case_insensitive = function() { - return this.case_insensitive; -}; -// return the information content of an alphabet letter -Alphabet.prototype.get_ic = function() { - return Math.log(this.ncore) / Math.LN2; -}; -// return the count of the core alphabet symbols -Alphabet.prototype.get_size_core = function() { - return this.ncore; -}; -// return the count of all alphabet symbols -Alphabet.prototype.get_size_full = function() { - return this.symbols.length; -}; -// return the symbol for the given alphabet index -Alphabet.prototype.get_symbol = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("Alphabet index out of bounds"); - } - return this.symbols[alph_index].symbol; -}; -// return the aliases for the given alphabet index -Alphabet.prototype.get_aliases = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("Alphabet index out of bounds"); - } - var sym_obj = this.symbols[alph_index]; - return (sym_obj.aliases != null ? sym_obj.aliases : ""); -}; -// return the name for the given alphabet index -Alphabet.prototype.get_name = function(alph_index) { - "use strict"; - var sym; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("Alphabet index out of bounds"); - } - sym = this.symbols[alph_index]; - return (typeof sym.name === "string" ? sym.name : sym.symbol); -}; -// return the alphabet it is like or null -Alphabet.prototype.get_like = function() { - "use strict"; - return this.like; -}; -// return the index of the complement for the given alphabet index -Alphabet.prototype.get_complement = function(alph_index) { - var comp_e_sym = this.complement[alph_index]; - if (typeof comp_e_sym === "number") { - return comp_e_sym; - } else { - return -1; - } -}; -// return a string containing the core symbols -Alphabet.prototype.get_symbols = function() { - "use strict"; - var i, core_symbols; - core_symbols = ""; - for (i = 0; i < this.ncore; i++) { - core_symbols += this.symbols[i].symbol; - } - return core_symbols; -}; -// return if the background was not a uniform generated background -Alphabet.prototype.has_bg = function() { - "use strict"; - return !this.genbg; -}; -// get the background frequency for the index -Alphabet.prototype.get_bg_freq = function(alph_index) { - "use strict"; - var freq, i, symbols; - if (alph_index >= 0) { - if (alph_index < this.ncore) { - return this.background[alph_index]; - } else if (alph_index < this.symbols.length) { - freq = 0; - symbols = this.symbols[alph_index].equals; - for (i = 0; i < symbols.length; i++) { - freq += this.background[this.encode2core[symbols.charAt(i)]]; - } - return freq; - } - } - throw new Error("The alphabet index is out of range."); -}; -// get the colour of the index -Alphabet.prototype.get_colour = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("BAD_ALPHABET_INDEX"); - } - if (typeof this.symbols[alph_index].colour != "string") { - return "black"; - } - return "#" + this.symbols[alph_index].colour; -}; -// get the rgb componets of the colour at the index -Alphabet.prototype.get_rgb = function(alph_index) { - "use strict"; - if (alph_index < 0 || alph_index >= this.symbols.length) { - throw new Error("BAD_ALPHABET_INDEX"); - } - if (typeof this.symbols[alph_index].colour != "string") { - return {"red": 0, "green": 0, "blue": 0}; - } - var colour = this.symbols[alph_index].colour; - var red = parseInt(colour.substr(0, 2), 16) / 255; - var green = parseInt(colour.substr(2, 2), 16) / 255; - var blue = parseInt(colour.substr(4, 2), 16) / 255; - return {"red": red, "green": green, "blue": blue}; -}; -// convert a symbol into the index -Alphabet.prototype.get_index = function(letter) { - "use strict"; - var alph_index; - alph_index = this.encode[letter]; - if (typeof alph_index === "undefined") { - return -1; - } - return alph_index; -}; -// convert a symbol into the list of core indexes that it equals -Alphabet.prototype.get_indexes = function(letter) { - "use strict"; - var alph_index, comprise_str, i, comprise_list; - alph_index = this.encode[letter]; - if (typeof alph_index === "undefined") { - throw new Error("Unknown letter"); - } - comprise_str = this.symbols[alph_index].equals; - comprise_list = []; - if (typeof comprise_str == "string") { - for (i = 0; i < comprise_str.length; i++) { - comprise_list.push(this.encode2core[comprise_str.charAt(i)]); - } - } else { - comprise_list.push(alph_index); - } - return comprise_list; -}; -// check if a symbol is the primary way of representing the symbol in the alphabet -Alphabet.prototype.is_prime_symbol = function(letter) { - var alph_index; - alph_index = this.encode[letter]; - if (alph_index == null) return false; - if (this.is_case_insensitive()) { - return (this.symbols[alph_index].symbol.toUpperCase() == letter.toUpperCase()); - } else { - return (this.symbols[alph_index].symbol == letter); - } -}; -// compare 2 alphabets -Alphabet.prototype.equals = function(other) { - "use strict"; - var i, sym1, sym2; - // first check that it's actually an alphabet object - if (!(typeof other === "object" && other != null && other instanceof Alphabet)) { - return false; - } - // second shortcircuit if it's the same object - if (this === other) return true; - // compare - if (this.name !== other.name) return false; - if (this.ncore !== other.ncore) return false; - if (this.symbols.length !== other.symbols.length) return false; - for (i = 0; i < this.symbols.length; i++) { - sym1 = this.symbols[i]; - sym2 = other.symbols[i]; - if (sym1.symbol !== sym2.symbol) return false; - if (sym1.aliases !== sym2.aliases) return false; - if (sym1.name !== sym2.name) return false; - if (typeof sym1.colour !== typeof sym2.colour || - (typeof sym1.colour === "string" && typeof sym2.colour === "string" && - parseInt(sym1.colour, 16) != parseInt(sym2.colour, 16))) { - return false; - } - if (sym1.complement !== sym2.complement) return false; - if (sym1.equals !== sym2.equals) return false; - } - return true; -}; -Alphabet.prototype.check_core_subset = function(super_alph) { - var complement_same = true; - var seen_set = {}; - var sub_i, sub_symbol, super_i, super_symbol; - for (sub_i = 0; sub_i < this.ncore; sub_i++) { - sub_symbol = this.symbols[sub_i]; - super_i = super_alph.encode[sub_symbol.symbol]; - if (super_i == null) return 0; - super_symbol = super_alph.symbols[super_i]; - if (seen_set[super_i]) return 0; - seen_set[super_i] = true; - // check complement - if (sub_symbol.complement != null && super_symbol.complement != null) { - if (super_alph.encode[sub_symbol.complement] != super_alph.encode[super_symbol.complement]) { - complement_same = false; - } - } else if (sub_symbol.complement != null || super_symbol.complement != null) { - complement_same = false; - } - } - return (complement_same ? 1 : -1); -}; -// convert a sequence to its reverse complement -Alphabet.prototype.invcomp_seq = function(seq) { - "use strict"; - var syms, i, e_sym, comp_e_sym; - if (!this.has_complement()) throw new Error("Alphabet must be complementable"); - syms = seq.split(""); - for (i = 0; i < syms.length; i++) { - e_sym = this.encode[syms[i]]; - if (typeof e_sym === "undefined") { - e_sym = this.ncore; // wildcard - } - comp_e_sym = this.complement[e_sym]; - if (typeof comp_e_sym === "undefined") { - comp_e_sym = e_sym; // not complementable - } - syms[i] = this.symbols[comp_e_sym].symbol; - } - return syms.reverse().join(""); -}; -// convert the alphabet to the text version -Alphabet.prototype.as_text = function() { - "use strict"; - function name_as_text(name) { - var i, c, out; - out = "\""; - for (i = 0; i < name.length; i++) { - c = name.charAt(i); - if (c == "\"") { - out += "\\\""; - } else if (c == "/") { - out += "\\/"; - } else if (c == "\\") { - out += "\\\\"; - } else { - out += c; - } - } - out += "\""; - return out; - } - function symbol_as_text(sym) { - var out; - out = sym.symbol; - if (typeof sym.name === "string" && sym.name != sym.symbol) { - out += " " + name_as_text(sym.name); - } - if (typeof sym.colour === "string") { - out += " " + sym.colour; - } - return out; - } - var out, i, j, c, sym; - out = ""; - // output core symbols with 2 way complements - for (i = 0; i < this.ncore; i++) { - c = this.complement[i]; - if (typeof c === "number" && i < c && this.complement[c] === i) { - out += symbol_as_text(this.symbols[i]) + " ~ " + symbol_as_text(this.symbols[c]) + "\n"; - } - } - // output core symbols with no complement - for (i = 0; i < this.ncore; i++) { - if (typeof this.complement[i] === "undefined") { - out += symbol_as_text(this.symbols[i]) + "\n"; - } - } - // output ambiguous symbols that have comprising characters - for (i = this.ncore; i < this.symbols.length; i++) { - if (this.symbols[i].equals.length == 0) break; - out += symbol_as_text(this.symbols[i]) + " = " + this.symbols[i].equals + "\n"; - if (typeof this.symbols[i].aliases === "string") { - for (j = 0; j < this.symbols[i].aliases.length; j++) { - if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue; - out += this.symbols[i].aliases.charAt(j) + " = " + this.symbols[i].equals + "\n"; - } - } - } - // output aliases of core symbols - for (i = 0; i < this.ncore; i++) { - if (typeof this.symbols[i].aliases === "string") { - for (j = 0; j < this.symbols[i].aliases.length; j++) { - if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue; - out += this.symbols[i].aliases.charAt(j) + " = " + this.symbols[i].symbol + "\n"; - } - } - } - // output gap symbols - i = this.symbols.length - 1; - if (this.symbols[i].equals.length == 0) { - out += symbol_as_text(this.symbols[i]) + " =\n"; - if (typeof this.symbols[i].aliases === "string") { - for (j = 0; j < this.symbols[i].aliases.length; j++) { - if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue; - out += this.symbols[i].aliases.charAt(j) + " =\n"; - } - } - } - return out; -}; -// output the alphabet as it appears in minimal MEME format -Alphabet.prototype.as_meme = function() { - "use strict"; - function name_as_text(name) { - var i, c, out; - out = "\""; - for (i = 0; i < name.length; i++) { - c = name.charAt(i); - if (c == "\"") { - out += "\\\""; - } else if (c == "/") { - out += "\\/"; - } else if (c == "\\") { - out += "\\\\"; - } else { - out += c; - } - } - out += "\""; - return out; - } - if (this.equals(AlphStd.DNA)) { - return "ALPHABET= ACGT\n"; - } else if (this.equals(AlphStd.PROTEIN)) { - return "ALPHABET= ACDEFGHIKLMNPQRSTVWY\n"; - } else { - return "ALPHABET" + - (this.name != null ? " " + name_as_text(this.name) : "") + - (this.like != null ? " " + this.like + "-LIKE" : "") + "\n" + - this.as_text() + "END ALPHABET\n"; - } -}; - -// Returns a table showing all the letters in the alphabet -Alphabet.prototype.as_table = function() { - "use strict"; - var i, j, row, th, td, aliases, equals, sym; - var table = document.createElement("table"); - // create the core symbol header - row = table.insertRow(table.rows.length); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Symbol(s)")); - row.appendChild(th); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Name")); - row.appendChild(th); - th = document.createElement("th"); - if (this.has_complement()) { - th.appendChild(document.createTextNode("Complement")); - } - row.appendChild(th); - // list the core symbols - for (i = 0; i < this.ncore; i++) { - row = table.insertRow(table.rows.length); - td = document.createElement("td"); - if (this.symbols[i].colour != null) { - td.style.color = '#' + this.symbols[i].colour; - } - td.appendChild(document.createTextNode(this.symbols[i].symbol)); - aliases = this.get_aliases(i); - if (aliases.length > 0) { - td.appendChild(document.createTextNode(' ' + aliases.split('').join(' '))); - } - row.appendChild(td); - td = document.createElement("td"); - if (this.symbols[i].name != null) { - td.appendChild(document.createTextNode(this.symbols[i].name)); - } - row.appendChild(td); - td = document.createElement("td"); - if (this.symbols[i].complement != null) { - td.style.color = this.get_colour(this.get_index(this.symbols[i].complement)); - td.appendChild(document.createTextNode(this.symbols[i].complement)); - } - row.appendChild(td); - } - // create the ambiguous symbol header - row = table.insertRow(table.rows.length); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Symbol(s)")); - row.appendChild(th); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Name")); - row.appendChild(th); - th = document.createElement("th"); - th.appendChild(document.createTextNode("Matches")); - row.appendChild(th); - // list the ambiguous symbols - for (i = this.ncore; i < this.symbols.length; i++) { - row = table.insertRow(table.rows.length); - td = document.createElement("td"); - if (this.symbols[i].colour != null) { - td.style.color = '#' + this.symbols[i].colour; - } - td.appendChild(document.createTextNode(this.symbols[i].symbol)); - aliases = this.get_aliases(i); - if (aliases.length > 0) { - td.appendChild(document.createTextNode(' ' + aliases.split('').join(' '))); - } - row.appendChild(td); - td = document.createElement("td"); - if (this.symbols[i].name != null) { - td.appendChild(document.createTextNode(this.symbols[i].name)); - } - row.appendChild(td); - td = document.createElement("td"); - equals = this.symbols[i].equals.split(''); - for (j = 0; j < equals.length; j++) { - if (j != 0) td.appendChild(document.createTextNode(' ')); - sym = document.createElement("span"); - sym.style.color = this.get_colour(this.get_index(equals[j])); - sym.appendChild(document.createTextNode(equals[j])); - td.appendChild(sym); - } - row.appendChild(td); - } - return table; -}; - -// returns a dictionary of the colours for EPS -Alphabet.prototype._as_eps_dict = function() { - "use strict"; - var i, sym, rgb; - var out = "/fullColourDict <<\n"; - for (i = 0; i < this.ncore; i++) { - sym = this.get_symbol(i); - sym = sym.replace(/\\/g, "\\\\"); - sym = sym.replace(/\(/g, "\\("); - sym = sym.replace(/\)/g, "\\)"); - rgb = this.get_rgb(i); - out += " (" + sym + ") [" + rgb.red.toFixed(4) + " " + rgb.green.toFixed(4) + " " + rgb.blue.toFixed(4) + "]\n"; - } - out += ">> def\n"; - out += "/mutedColourDict <<\n"; - for (i = 0; i < this.ncore; i++) { - sym = this.get_symbol(i); - sym = sym.replace(/\\/g, "\\\\"); - sym = sym.replace(/\(/g, "\\("); - sym = sym.replace(/\)/g, "\\)"); - rgb = Alphabet.lighten_colour(this.get_rgb(i)); - out += " (" + sym + ") [" + rgb.red.toFixed(4) + " " + rgb.green.toFixed(4) + " " + rgb.blue.toFixed(4) + "]\n"; - } - out += ">> def\n"; - return out; -}; - -// return the alphabet name or a list of primary symbols -Alphabet.prototype.toString = function() { - "use strict"; - if (this.name != null) { - return this.name; - } else { - return this.get_symbols(); - } -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Helper functions -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -// Convert a colour specified in RGB colourspace values into LAB colourspace -Alphabet.rgb2lab = function(rgb) { - "use strict"; - var xyzHelper, labHelper; - // XYZ helper - xyzHelper = function(value) { - if (value > 0.0445) { - value = (value + 0.055) / 1.055; - value = Math.pow(value, 2.4); - } else { - value /= 12.92; - } - value *= 100; - return value; - }; - // lab helper - labHelper = function(value) { - if (value > 0.008856) { - value = Math.pow(value, 1.0 / 3.0); - } else { - value = (7.787 * value) + (16.0 / 116.0); - } - return value; - }; - // convert into XYZ colourspace - var c1, c2, c3; - if (typeof rgb == "number") { - c1 = xyzHelper(((rgb >> 16) & 0xFF) / 255.0); - c2 = xyzHelper(((rgb >> 8) & 0xFF) / 255.0); - c3 = xyzHelper((rgb & 0xFF) / 255.0); - } else { - c1 = xyzHelper(rgb.red); - c2 = xyzHelper(rgb.green); - c3 = xyzHelper(rgb.blue); - } - var x = (c1 * 0.4124) + (c2 * 0.3576) + (c3 * 0.1805); - var y = (c1 * 0.2126) + (c2 * 0.7152) + (c3 * 0.0722); - var z = (c1 * 0.0193) + (c2 * 0.1192) + (c3 * 0.9505); - // convert into Lab colourspace - c1 = labHelper(x / 95.047); - c2 = labHelper(y / 100.0); - c3 = labHelper(z / 108.883); - var l = (116.0 * c2) - 16; - var a = 500.0 * (c1 - c2); - var b = 200.0 * (c2 - c3); - return {"l": l, "a": a, "b": b}; -}; - -// Convert a colour specified in HSV colourspace into RGB colourspace -Alphabet.hsv2rgb = function(hue, sat, value, output_object) { - // achromatic (grey) - var r = value; - var g = value; - var b = value; - if (sat != 0) { - var h = hue / 60.0; - var i = Math.floor(h); - var f = h - i; - var p = value * (1.0 - sat); - var q = value * (1.0 - (sat * f)); - var t = value * (1.0 - (sat * (1.0 - f))); - if (i == 0) { - r = value; - g = t; - b = p; - } else if (i == 1) { - r = q; - g = value; - b = p; - } else if (i == 2) { - r = p; - g = value; - b = t; - } else if (i == 3) { - r = p; - g = q; - b = value; - } else if (i == 4) { - r = t; - g = p; - b = value; - } else { - r = value; - g = p; - b = q; - } - } - if (output_object) { - return {"red": r, "green": g, "blue": b}; - } else { - return (Math.floor(r * 255) << 15) | (Math.floor(g * 255) << 8) | (Math.floor(b * 255)); - } -}; - -// Calculate a distance score between two colours in LAB colourspace -Alphabet.lab_dist = function(lab1, lab2) { - var c1 = Math.sqrt((lab1.l * lab1.l) + (lab1.a * lab1.a)); - var c2 = Math.sqrt((lab2.l * lab2.l) + (lab2.a * lab2.a)); - var dc = c1 - c2; - var dl = lab1.l - lab2.l; - var da = lab1.a - lab2.a; - var db = lab1.b - lab2.b; - // we don't want NaN due to rounding errors so fudge things a bit... - var dh = 0; - var dh_squared = (da * da) + (db * db) - (dc * dc); - if (dh_squared > 0) { - dh = Math.sqrt(dh_squared); - } - var first = dl; - var second = dc / (1.0 + (0.045 * c1)); - var third = dh / (1.0 + (0.015 * c1)); - return Math.sqrt((first * first) + (second * second) + (third * third)); -}; - -// convert an RGB value into a HSL value -Alphabet.rgb2hsl = function(rgb) { - "use strict"; - var min, max, delta, h, s, l, r, g, b; - if (typeof rgb == "number") { - r = ((rgb >> 16) & 0xFF) / 255.0; - g = ((rgb >> 8) & 0xFF) / 255.0; - b = (rgb & 0xFF) / 255.0; - } else { - r = rgb.red; - g = rgb.green; - b = rgb.blue; - } - min = Math.min(r, g, b); - max = Math.max(r, g, b); - delta = max - min; - l = min + (delta / 2); - if (max == min) { - h = 0; // achromatic (grayscale) - s = 0; - } else { - if (l > 0.5) { - s = delta / (2 - max - min); - } else { - s = delta / (max + min); - } - if (max == r) { - h = (g - b) / delta; - if (g < b) h += 6; - } else if (max == g) { - h = ((b - r) / delta) + 2; - } else { - h = ((r - g) / delta) + 4; - } - h /= 6; - } - return {"h": h, "s": s, "l": l}; -}; - -// convert a HSL value into an RGB value -Alphabet.hsl2rgb = function(hsl, output_object) { - "use strict"; - function _hue(p, q, t) { - "use strict"; - if (t < 0) t += 1; - else if (t > 1) t -= 1; - if (t < (1.0 / 6.0)) { - return p + ((q - p) * 6.0 * t); - } else if (t < 0.5) { - return q; - } else if (t < (2.0 / 3.0)) { - return p + ((q - p) * ((2.0 / 3.0) - t) * 6.0); - } else { - return p; - } - } - var r, g, b, p, q; - if (hsl.s == 0) { - // achromatic (grayscale) - r = hsl.l; - g = hsl.l; - b = hsl.l; - } else { - if (hsl.l < 0.5) { - q = hsl.l * (1 + hsl.s); - } else { - q = hsl.l + hsl.s - (hsl.l * hsl.s); - } - p = (2 * hsl.l) - q; - r = _hue(p, q, hsl.h + (1.0 / 3.0)); - g = _hue(p, q, hsl.h); - b = _hue(p, q, hsl.h - (1.0 / 3.0)); - } - if (output_object) { - return {"red": r, "green": g, "blue": b}; - } else { - return (Math.floor(r * 255) << 15) | (Math.floor(g * 255) << 8) | (Math.floor(b * 255)); - } -}; - -Alphabet.lighten_colour = function(rgb) { - "use strict"; - var hsl = Alphabet.rgb2hsl(rgb); - hsl.l += (1.0 - hsl.l) * 2 / 3; - return Alphabet.hsl2rgb(hsl, typeof rgb != "number"); -}; - -//====================================================================== -// end Alphabet object -//====================================================================== - -//====================================================================== -// start StandardAlphabet object -//====================================================================== - -// an extension of the alphabet object to support some additional fields -// only present in standard alphabets. -var StandardAlphabet = function(enum_code, enum_name, alphabet_data) { - Alphabet.apply(this, [alphabet_data]); - this.enum_code = enum_code; - this.enum_name = enum_name; -}; -StandardAlphabet.prototype = Alphabet.prototype; -StandardAlphabet.prototype.constructor = StandardAlphabet; - -// A unique code for this standard alphabet. -// This code will be a power of 2 to enable creation of bitsets for -// a selection of standard alphabets. -StandardAlphabet.prototype.get_code = function() { - return this.enum_code; -}; - -// A unique name for this standard alphabet. -// this name will be all upper case and the same as the property that -// refers to this alphabet in the AlphStd collection. -StandardAlphabet.prototype.get_enum = function() { - return this.enum_name; -}; - -//====================================================================== -// end StandardAlphabet object -//====================================================================== - -// A collection of standard alphabets. -var AlphStd = { - RNA: new StandardAlphabet(1, "RNA", { - "name": "RNA", - "like": "RNA", - "ncore": 4, - "symbols": [ - {"symbol": "A", "name": "Adenine", "colour": "CC0000"}, - {"symbol": "C", "name": "Cytosine", "colour": "0000CC"}, - {"symbol": "G", "name": "Guanine", "colour": "FFB300"}, - {"symbol": "U", "name": "Uracil", "colour": "008000", - "aliases": "T"}, - {"symbol": "N", "name": "Any base", "equals": "ACGU", "aliases": "X."}, - {"symbol": "V", "name": "Not U", "equals": "ACG"}, - {"symbol": "H", "name": "Not G", "equals": "ACU"}, - {"symbol": "D", "name": "Not C", "equals": "AGU"}, - {"symbol": "B", "name": "Not A", "equals": "CGU"}, - {"symbol": "M", "name": "Amino", "equals": "AC"}, - {"symbol": "R", "name": "Purine", "equals": "AG"}, - {"symbol": "W", "name": "Weak", "equals": "AU"}, - {"symbol": "S", "name": "Strong", "equals": "CG"}, - {"symbol": "Y", "name": "Pyrimidine", "equals": "CU"}, - {"symbol": "K", "name": "Keto", "equals": "GU"} - ] - }), - DNA: new StandardAlphabet(2, "DNA", { - "name": "DNA", - "like": "DNA", - "ncore": 4, - "symbols": [ - {"symbol": "A", "name": "Adenine", "colour": "CC0000", "complement": "T"}, - {"symbol": "C", "name": "Cytosine", "colour": "0000CC", "complement": "G"}, - {"symbol": "G", "name": "Guanine", "colour": "FFB300", "complement": "C"}, - {"symbol": "T", "name": "Thymine", "colour": "008000", "complement": "A", - "aliases": "U"}, - {"symbol": "N", "name": "Any base", "equals": "ACGT", "aliases": "X."}, - {"symbol": "V", "name": "Not T", "equals": "ACG"}, - {"symbol": "H", "name": "Not G", "equals": "ACT"}, - {"symbol": "D", "name": "Not C", "equals": "AGT"}, - {"symbol": "B", "name": "Not A", "equals": "CGT"}, - {"symbol": "M", "name": "Amino", "equals": "AC"}, - {"symbol": "R", "name": "Purine", "equals": "AG"}, - {"symbol": "W", "name": "Weak", "equals": "AT"}, - {"symbol": "S", "name": "Strong", "equals": "CG"}, - {"symbol": "Y", "name": "Pyrimidine", "equals": "CT"}, - {"symbol": "K", "name": "Keto", "equals": "GT"} - ] - }), - PROTEIN: new StandardAlphabet(4, "PROTEIN", { - "name": "Protein", - "like": "PROTEIN", - "ncore": 20, - "symbols": [ - {"symbol": "A", "name": "Alanine", "colour": "0000CC"}, - {"symbol": "C", "name": "Cysteine", "colour": "0000CC"}, - {"symbol": "D", "name": "Aspartic acid", "colour": "FF00FF"}, - {"symbol": "E", "name": "Glutamic acid", "colour": "FF00FF"}, - {"symbol": "F", "name": "Phenylalanine", "colour": "0000CC"}, - {"symbol": "G", "name": "Glycine", "colour": "FFB300"}, - {"symbol": "H", "name": "Histidine", "colour": "FFCCCC"}, - {"symbol": "I", "name": "Isoleucine", "colour": "0000CC"}, - {"symbol": "K", "name": "Lysine", "colour": "CC0000"}, - {"symbol": "L", "name": "Leucine", "colour": "0000CC"}, - {"symbol": "M", "name": "Methionine", "colour": "0000CC"}, - {"symbol": "N", "name": "Asparagine", "colour": "008000"}, - {"symbol": "P", "name": "Proline", "colour": "FFFF00"}, - {"symbol": "Q", "name": "Glutamine", "colour": "008000"}, - {"symbol": "R", "name": "Arginine", "colour": "CC0000"}, - {"symbol": "S", "name": "Serine", "colour": "008000"}, - {"symbol": "T", "name": "Threonine", "colour": "008000"}, - {"symbol": "V", "name": "Valine", "colour": "0000CC"}, - {"symbol": "W", "name": "Tryptophan", "colour": "0000CC"}, - {"symbol": "Y", "name": "Tyrosine", "colour": "33E6CC"}, - {"symbol": "X", "name": "Any amino acid", "equals": "ACDEFGHIKLMNPQRSTVWY", "aliases": "*."}, - {"symbol": "B", "name": "Asparagine or Aspartic acid", "equals": "DN"}, - {"symbol": "Z", "name": "Glutamine or Glutamic acid", "equals": "EQ"}, - {"symbol": "J", "name": "Leucine or Isoleucine", "equals": "IL"} - ] - }) -}; - -//====================================================================== -// start Symbol object -//====================================================================== -var Symbol = function(alph_index, scale, alphabet) { - "use strict"; - //variable prototype - this.symbol = alphabet.get_symbol(alph_index); - this.scale = scale; - this.colour = alphabet.get_colour(alph_index); -}; - -Symbol.prototype.get_symbol = function() { - "use strict"; - return this.symbol; -}; - -Symbol.prototype.get_scale = function() { - "use strict"; - return this.scale; -}; - -Symbol.prototype.get_colour = function() { - "use strict"; - return this.colour; -}; - -Symbol.prototype.toString = function() { - "use strict"; - return this.symbol + " " + (Math.round(this.scale*1000)/10) + "%"; -}; - -function compare_symbol(sym1, sym2) { - "use strict"; - if (sym1.get_scale() < sym2.get_scale()) { - return -1; - } else if (sym1.get_scale() > sym2.get_scale()) { - return 1; - } else { - return 0; - } -} -//====================================================================== -// end Symbol object -//====================================================================== - -//====================================================================== -// start Pspm object -//====================================================================== -var Pspm = function(matrix, name, ltrim, rtrim, nsites, evalue, pssm, alt) { - "use strict"; - var row, col, data, row_sum, delta, evalue_re; - if (typeof name !== "string") { - name = ""; - } - this.name = name; - //construct - if (matrix instanceof Pspm) { - // copy constructor - this.alph_length = matrix.alph_length; - this.motif_length = matrix.motif_length; - this.name = matrix.name; - this.alt = matrix.alt; - this.nsites = matrix.nsites; - this.evalue = matrix.evalue; - this.ltrim = matrix.ltrim; - this.rtrim = matrix.rtrim; - this.pspm = []; - for (row = 0; row < matrix.motif_length; row++) { - this.pspm[row] = []; - for (col = 0; col < matrix.alph_length; col++) { - this.pspm[row][col] = matrix.pspm[row][col]; - } - } - if (matrix.pssm != null) { - this.pssm = []; - for (row = 0; row < matrix.motif_length; row++) { - this.pspm[row] = []; - for (col = 0; col < matrix.alph_length; col++) { - this.pssm[row][col] = matrix.pssm[row][col]; - } - } - } - } else { - // check parameters - if (ltrim == null) { - ltrim = 0; - } else if (typeof ltrim !== "number" || ltrim % 1 !== 0 || ltrim < 0) { - throw new Error("ltrim must be a non-negative integer, got: " + ltrim); - } - if (rtrim == null) { - rtrim = 0; - } else if (typeof rtrim !== "number" || rtrim % 1 !== 0 || rtrim < 0) { - throw new Error("rtrim must be a non-negative integer, got: " + rtrim); - } - if (nsites != null) { - if (typeof nsites !== "number" || nsites < 0) { - throw new Error("nsites must be a positive number, got: " + nsites); - } else if (nsites == 0) { - nsites = null; - } - } - if (evalue != null) { - if (typeof evalue === "number") { - if (evalue < 0) { - throw new Error("evalue must be a non-negative number, got: " + evalue); - } - } else if (typeof evalue === "string") { - evalue_re = /^((?:[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)|inf)$/; - if (!evalue_re.test(evalue)) { - throw new Error("evalue must be a non-negative number, got: " + evalue); - } - } else { - throw new Error("evalue must be a non-negative number, got: " + evalue); - } - } - // set properties - this.name = name; - this.alt = alt; - this.nsites = nsites; - this.evalue = evalue; - this.ltrim = ltrim; - this.rtrim = rtrim; - if (typeof matrix === "string") { - // string constructor - data = parse_pspm_string(matrix); - this.alph_length = data["alph_length"]; - this.motif_length = data["motif_length"]; - this.pspm = data["pspm"]; - if (this.evalue == null) { - if (data["evalue"] != null) { - this.evalue = data["evalue"]; - } else { - this.evalue = 0; - } - } - if (this.nsites == null) { - if (typeof data["nsites"] === "number") { - this.nsites = data["nsites"]; - } else { - this.nsites = 20; - } - } - } else { - // assume pspm is a nested array - this.motif_length = matrix.length; - this.alph_length = (matrix.length > 0 ? matrix[0].length : 0); - if (this.nsites == null) { - this.nsites = 20; - } - if (this.evalue == null) { - this.evalue = 0; - } - this.pspm = []; - // copy pspm and check - for (row = 0; row < this.motif_length; row++) { - if (this.alph_length != matrix[row].length) { - throw new Error("COLUMN_MISMATCH"); - } - this.pspm[row] = []; - row_sum = 0; - for (col = 0; col < this.alph_length; col++) { - this.pspm[row][col] = matrix[row][col]; - row_sum += this.pspm[row][col]; - } - delta = 0.1; - if (isNaN(row_sum) || (row_sum > 1 && (row_sum - 1) > delta) || - (row_sum < 1 && (1 - row_sum) > delta)) { - throw new Error("INVALID_SUM"); - } - } - // copy pssm - if (pssm != null) { - this.pssm = []; - for (row = 0; row < this.motif_length; row++) { - this.pssm[row] = []; - for (col = 0; col < this.alph_length; col++) { - this.pssm[row][col] = pssm[row][col]; - } - } - } - } - } -}; - -Pspm.prototype.copy = function() { - "use strict"; - return new Pspm(this); -}; - -Pspm.prototype.reverse = function() { - "use strict"; - var x, y, temp, temp_trim; - //reverse - x = 0; - y = this.motif_length-1; - while (x < y) { - temp = this.pspm[x]; - this.pspm[x] = this.pspm[y]; - this.pspm[y] = temp; - x++; - y--; - } - // reverse pssm (if defined) - if (typeof this.pssm !== "undefined") { - //reverse - x = 0; - y = this.motif_length-1; - while (x < y) { - temp = this.pssm[x]; - this.pspm[x] = this.pssm[y]; - this.pssm[y] = temp; - x++; - y--; - } - } - //swap triming - temp_trim = this.ltrim; - this.ltrim = this.rtrim; - this.rtrim = temp_trim; - return this; //allow function chaining... -}; - -Pspm.prototype.reverse_complement = function(alphabet) { - "use strict"; - var x, y, temp, i, row, c, temp_trim; - if (this.alph_length != alphabet.get_size_core()) { - throw new Error("The alphabet size does not match the size of the pspm."); - } - if (!alphabet.has_complement()) { - throw new Error("The specified alphabet can not be complemented."); - } - // reverse motif - this.reverse(); - //complement - for (x = 0; x < this.motif_length; x++) { - row = this.pspm[x]; - for (i = 0; i < row.length; i++) { - c = alphabet.get_complement(i); - if (c < i) continue; - temp = row[i]; - row[i] = row[c]; - row[c] = temp; - } - } - // complement pssm (if defined) - if (typeof this.pssm !== "undefined") { - //complement - for (x = 0; x < this.motif_length; x++) { - row = this.pssm[x]; - for (i = 0; i < row.length; i++) { - c = alphabet.get_complement(i); - if (c < i) continue; - temp = row[i]; - row[i] = row[c]; - row[c] = temp; - } - } - } - return this; //allow function chaining... -}; - -Pspm.prototype.get_stack = function(position, alphabet, ssc) { - "use strict"; - var row, stack_ic, alphabet_ic, stack, i, sym; - if (this.alph_length != alphabet.get_size_core()) { - throw new Error("The alphabet size does not match the size of the pspm."); - } - row = this.pspm[position]; - stack_ic = this.get_stack_ic(position, alphabet); - if (ssc) stack_ic -= this.get_error(alphabet); - alphabet_ic = alphabet.get_ic(); - stack = []; - for (i = 0; i < this.alph_length; i++) { - sym = new Symbol(i, row[i]*stack_ic/alphabet_ic, alphabet); - if (sym.get_scale() <= 0) { - continue; - } - stack.push(sym); - } - stack.sort(compare_symbol); - return stack; -}; - -Pspm.prototype.get_stack_ic = function(position, alphabet) { - "use strict"; - var row, H, i; - if (this.alph_length != alphabet.get_size_core()) { - throw new Error("The alphabet size does not match the size fo the pspm."); - } - row = this.pspm[position]; - H = 0; - for (i = 0; i < this.alph_length; i++) { - if (row[i] === 0) { - continue; - } - H -= (row[i] * (Math.log(row[i]) / Math.LN2)); - } - return alphabet.get_ic() - H; -}; - -Pspm.prototype.get_error = function(alphabet) { - "use strict"; - if (this.nsites === 0) { - return 0; - } - return (alphabet.get_size_core()-1) / (2 * Math.LN2 * this.nsites); -}; - -Pspm.prototype.get_motif_length = function() { - "use strict"; - return this.motif_length; -}; - -Pspm.prototype.get_alph_length = function() { - "use strict"; - return this.alph_length; -}; - -Pspm.prototype.get_left_trim = function() { - "use strict"; - return this.ltrim; -}; - -Pspm.prototype.get_right_trim = function() { - "use strict"; - return this.rtrim; -}; - -Pspm.prototype.as_best_match = function(alphabet) { - "use strict"; - var match, odds, best_odds, best_index; - var i, j; - match = ""; - for (i = 0; i < this.motif_length; i++) { - best_index = 0; - best_odds = this.pspm[i][0] / alphabet.get_bg_freq(0); - for (j = 1; j < this.alph_length; j++) { - odds = this.pspm[i][j] / alphabet.get_bg_freq(j); - if (odds > best_odds) { - best_odds = odds; - best_index = j; - } - } - match += alphabet.get_symbol(best_index); - } - return match; -}; - -Pspm.prototype.as_count_matrix = function() { - "use strict"; - var count, count_text, text; - var i, j; - text = ""; - for (i = 0; i < this.motif_length; i++) { - if (i !== 0) { - text += "\n"; - } - for (j = 0; j < this.alph_length; j++) { - if (j !== 0) { - text += " "; - } - count = Math.round(this.nsites * this.pspm[i][j]); - count_text = "" + count; - // pad up to length of 4 - if (count_text.length < 4) { - text += (new Array(5 - count_text.length)).join(" ") + count_text; - } else { - text += count_text; - } - } - } - return text; -}; - -Pspm.prototype.as_probability_matrix = function() { - "use strict"; - var text; - var i, j; - text = ""; - for (i = 0; i < this.motif_length; i++) { - if (i !== 0) { - text += "\n"; - } - for (j = 0; j < this.alph_length; j++) { - if (j !== 0) { - text += " "; - } - text += this.pspm[i][j].toFixed(6); - } - } - return text; -}; - -Pspm.prototype.as_score_matrix = function(alphabet, pseudo) { - "use strict"; - var me, score, out, row, col, score_text; - me = this; - if (typeof this.pssm === "undefined") { - if (!(typeof alphabet === "object" && alphabet != null && alphabet instanceof Alphabet)) { - throw new Error("The alphabet is required to generate the pssm."); - } - if (typeof pseudo === "undefined") { - pseudo = 0.01; - } else if (typeof pseudo !== "number" || pseudo < 0) { - throw new Error("Expected positive number for pseudocount"); - } - score = function(row, col) { - "use strict"; - var p, bg, p2; - p = me.pspm[row][col]; - bg = alphabet.get_bg_freq(col); - p2 = (p * me.nsites + bg * pseudo) / (me.nsites + pseudo); - return (p2 > 0 ? Math.round((Math.log(p2 / bg) / Math.LN2) * 100) : -10000); - }; - } else { - score = function(row, col) { - "use strict"; - return me.pssm[row][col]; - }; - } - out = ""; - for (row = 0; row < this.motif_length; row++) { - for (col = 0; col < this.alph_length; col++) { - if (col !== 0) { - out += " "; - } - score_text = "" + score(row, col); - // pad out to 6 characters - if (score_text.length < 6) { - out += (new Array(7 - score_text.length)).join(" ") + score_text; - } else { - out += score_text; - } - } - out += "\n"; - } - return out; -} - -Pspm.prototype.as_pspm = function() { - "use strict"; - return "letter-probability matrix: alength= " + this.alph_length + - " w= " + this.motif_length + " nsites= " + this.nsites + - " E= " + (typeof this.evalue === "number" ? - this.evalue.toExponential() : this.evalue) + "\n" + - this.as_probability_matrix(); -}; - -Pspm.prototype.as_pssm = function(alphabet, pseudo) { - "use strict"; - return "log-odds matrix: alength= " + this.alph_length + - " w= " + this.motif_length + - " E= " + (typeof this.evalue == "number" ? - this.evalue.toExponential() : this.evalue) + "\n" + - this.as_score_matrix(alphabet, pseudo); -}; - -Pspm.prototype.as_meme = function(options) { - var with_header, with_pspm, with_pssm, version, alphabet, bg_source, pseudocount, strands; - var out, alen, i; - // get the options - if (typeof options !== "object" || options === null) { - options = {}; - } - with_header = (typeof options["with_header"] === "boolean" ? options["with_header"] : false); - with_pspm = (typeof options["with_pspm"] === "boolean" ? options["with_pspm"] : false); - with_pssm = (typeof options["with_pssm"] === "boolean" ? options["with_pssm"] : false); - if (!with_pspm && !with_pssm) with_pspm = true; - if (with_header) { - if (typeof options["version"] === "string" && /^\d+(?:\.\d+){0,2}$/.test(options["version"])) { - version = options["version"]; - } else if (typeof options["version"] === "number") { - version = options["version"].toFixed(0); - } else { - version = "4"; - } - if (typeof options["strands"] === "number" && options["strands"] === 1) { - strands = 1; - } else { - strands = 2; - } - if (typeof options["bg_source"] === "string") { - bg_source = options["bg_source"]; - } else { - bg_source = "unknown source"; - } - if (typeof options["alphabet"] === "object" && options["alphabet"] != null - && options["alphabet"] instanceof Alphabet) { - alphabet = options["alphabet"]; - } else { - throw new Error("The alphabet is required to generate the header."); - } - } - // now create the output - out = ""; - if (with_header) { - out = "MEME version " + version + "\n\n"; - out += alphabet.as_meme() + "\n"; - if (alphabet.has_complement()) { // assume DNA has both strands unless otherwise specified - out += "strands: " + (strands === 1 ? "+" : "+ -") + "\n\n"; - } - out += "Background letter frequencies (from " + bg_source + "):\n"; - alen = alphabet.get_size_core(); - for (i = 0; i < alen; i++) { - if (i !== 0) { - if (i % 9 === 0) { // maximum of nine entries per line - out += "\n"; - } else { - out += " "; - } - } - out += alphabet.get_symbol(i) + " " + alphabet.get_bg_freq(i).toFixed(3); - } - } - out += "\n\n"; - out += "MOTIF " + this.name + (this.alt == null ? "" : " " + this.alt); - if (with_pssm) { - out += "\n\n"; - out += this.as_pssm(options["alphabet"], options["pseudocount"]); - } - if (with_pspm) { - out += "\n\n"; - out += this.as_pspm(); - } - return out; -} - -Pspm.prototype.toString = function() { - "use strict"; - var str, i, row; - str = ""; - for (i = 0; i < this.pspm.length; i++) { - row = this.pspm[i]; - str += row.join("\t") + "\n"; - } - return str; -}; - -function parse_pspm_properties(str) { - "use strict"; - var parts, i, eqpos, before, after, properties, prop, num, num_re; - num_re = /^((?:[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)|inf)$/; - parts = trim(str).split(/\s+/); - // split up words containing = - for (i = 0; i < parts.length;) { - eqpos = parts[i].indexOf("="); - if (eqpos != -1) { - before = parts[i].substr(0, eqpos); - after = parts[i].substr(eqpos+1); - if (before.length > 0 && after.length > 0) { - parts.splice(i, 1, before, "=", after); - i += 3; - } else if (before.length > 0) { - parts.splice(i, 1, before, "="); - i += 2; - } else if (after.length > 0) { - parts.splice(i, 1, "=", after); - i += 2; - } else { - parts.splice(i, 1, "="); - i++; - } - } else { - i++; - } - } - properties = {}; - for (i = 0; i < parts.length; i += 3) { - if (parts.length - i < 3) { - throw new Error("Expected PSPM property was incomplete. "+ - "Remaing parts are: " + parts.slice(i).join(" ")); - } - if (parts[i+1] !== "=") { - throw new Error("Expected '=' in PSPM property between key and " + - "value but got " + parts[i+1]); - } - prop = parts[i].toLowerCase(); - num = parts[i+2]; - if (!num_re.test(num)) { - throw new Error("Expected numeric value for PSPM property '" + - prop + "' but got '" + num + "'"); - } - properties[prop] = num; - } - return properties; -} - -function parse_pspm_string(pspm_string) { - "use strict"; - var header_re, lines, first_line, line_num, col_num, alph_length, - motif_length, nsites, evalue, pspm, i, line, match, props, parts, - j, prob; - header_re = /^letter-probability\s+matrix:(.*)$/i; - lines = pspm_string.split(/\n/); - first_line = true; - line_num = 0; - col_num = 0; - alph_length; - motif_length; - nsites; - evalue; - pspm = []; - for (i = 0; i < lines.length; i++) { - line = trim(lines[i]); - if (line.length === 0) { - continue; - } - // check the first line for a header though allow matrices without it - if (first_line) { - first_line = false; - match = header_re.exec(line); - if (match !== null) { - props = parse_pspm_properties(match[1]); - if (props.hasOwnProperty("alength")) { - alph_length = parseFloat(props["alength"]); - if (alph_length != 4 && alph_length != 20) { - throw new Error("PSPM property alength should be 4 or 20" + - " but got " + alph_length); - } - } - if (props.hasOwnProperty("w")) { - motif_length = parseFloat(props["w"]); - if (motif_length % 1 !== 0 || motif_length < 1) { - throw new Error("PSPM property w should be an integer larger " + - "than zero but got " + motif_length); - } - } - if (props.hasOwnProperty("nsites")) { - nsites = parseFloat(props["nsites"]); - if (nsites <= 0) { - throw new Error("PSPM property nsites should be larger than " + - "zero but got " + nsites); - } - } - if (props.hasOwnProperty("e")) { - evalue = props["e"]; - if (evalue < 0) { - throw new Error("PSPM property evalue should be " + - "non-negative but got " + evalue); - } - } - continue; - } - } - pspm[line_num] = []; - col_num = 0; - parts = line.split(/\s+/); - for (j = 0; j < parts.length; j++) { - prob = parseFloat(parts[j]); - if (prob != parts[j] || prob < 0 || prob > 1) { - throw new Error("Expected probability but got '" + parts[j] + "'"); - } - pspm[line_num][col_num] = prob; - col_num++; - } - line_num++; - } - if (typeof motif_length === "number") { - if (pspm.length != motif_length) { - throw new Error("Expected PSPM to have a motif length of " + - motif_length + " but it was actually " + pspm.length); - } - } else { - motif_length = pspm.length; - } - if (typeof alph_length !== "number") { - alph_length = pspm[0].length; - if (alph_length != 4 && alph_length != 20) { - throw new Error("Expected length of first row in the PSPM to be " + - "either 4 or 20 but got " + alph_length); - } - } - for (i = 0; i < pspm.length; i++) { - if (pspm[i].length != alph_length) { - throw new Error("Expected PSPM row " + i + " to have a length of " + - alph_length + " but the length was " + pspm[i].length); - } - } - return {"pspm": pspm, "motif_length": motif_length, - "alph_length": alph_length, "nsites": nsites, "evalue": evalue}; -} -//====================================================================== -// end Pspm object -//====================================================================== - -//====================================================================== -// start Logo object -//====================================================================== - -var Logo = function(alphabet, options) { - "use strict"; - this.alphabet = alphabet; - this.fine_text = ""; - this.x_axis = 1; - this.y_axis = true; - this.xlate_nsyms = 1; - this.xlate_start = null; - this.xlate_end = null; - this.pspm_list = []; - this.pspm_column = []; - this.rows = 0; - this.columns = 0; - if (typeof options === "string") { - // the old method signature had fine_text here so we support that - this.fine_text = options; - } else if (typeof options === "object" && options != null) { - this.fine_text = (typeof options.fine_text === "string" ? options.fine_text : ""); - this.x_axis = (typeof options.x_axis === "boolean" ? (options.x_axis ? 1 : 0) : 1); - if (options.x_axis_hidden != null && options.x_axis_hidden) this.x_axis = -1; - this.y_axis = (typeof options.y_axis === "boolean" ? options.y_axis : true); - this.xlate_nsyms = (typeof options.xlate_nsyms === "number" ? options.xlate_nsyms : this.xlate_nsyms); - this.xlate_start = (typeof options.xlate_start === "number" ? options.xlate_start : this.xlate_start); - this.xlate_end = (typeof options.xlate_end === "number" ? options.xlate_end : this.xlate_end); - } -}; - -Logo.prototype.add_pspm = function(pspm, column) { - "use strict"; - var col; - if (typeof column === "undefined") { - column = 0; - } else if (column < 0) { - throw new Error("Column index out of bounds."); - } - this.pspm_list[this.rows] = pspm; - this.pspm_column[this.rows] = column; - this.rows++; - col = column + pspm.get_motif_length(); - if (col > this.columns) { - this.columns = col; - } -}; - -Logo.prototype.get_columns = function() { - "use strict"; - return this.columns; -}; - -Logo.prototype.get_xlate_nsyms = function() { - "use strict"; - return this.xlate_nsyms; -}; - -Logo.prototype.get_xlate_start = function() { - "use strict"; - return (this.xlate_start != null ? this.xlate_start : 0); -}; - -Logo.prototype.get_xlate_end = function() { - "use strict"; - return (this.xlate_end != null ? this.xlate_end : this.columns * this.xlate_nsyms); -}; - -Logo.prototype.get_xlate_columns = function() { - "use strict"; - return this.get_xlate_end() - this.get_xlate_start(); -}; - -Logo.prototype.get_rows = function() { - "use strict"; - return this.rows; -}; - -Logo.prototype.get_pspm = function(row_index) { - "use strict"; - if (row_index < 0 || row_index >= this.rows) { - throw new Error("INDEX_OUT_OF_BOUNDS"); - } - return this.pspm_list[row_index]; -}; - -Logo.prototype.get_offset = function(row_index) { - "use strict"; - if (row_index < 0 || row_index >= this.rows) { - throw new Error("INDEX_OUT_OF_BOUNDS"); - } - return this.pspm_column[row_index]; -}; - -Logo.prototype._as_eps_data = function(ssc, errbars) { - var i, j, pos, stack_pos, pspm, stack, sym, out; - out = ""; - for (i = 0; i < this.rows; i++) { - out += "\nStartLine\n"; - // Indent - for (j = 0; j < this.pspm_column[i]; j++) { - out += "() startstack\nendstack\n\n"; - } - pspm = this.pspm_list[i]; - if (pspm.get_left_trim() > 0) { - out += "MuteColour\nDrawTrimEdge\n" + pspm.get_left_trim() + " DrawTrimBg\n"; - } - for (pos = 0; pos < pspm.get_motif_length(); pos++) { - if (pos != 0 && pos == pspm.get_left_trim()) { // enable full colour - out += "DrawTrimEdge\nRestoreColour\n"; - } else if (pos == (pspm.get_motif_length() - pspm.get_right_trim())) { - out += "MuteColour\n" + pspm.get_right_trim() + " DrawTrimBg\n"; - } - out += "(" + (pos + 1) + ") startstack\n"; - stack = pspm.get_stack(pos, this.alphabet, ssc); - for (stack_pos = 0; stack_pos < stack.length; stack_pos++) { - sym = stack[stack_pos]; - out += " " + (sym.get_scale() * this.alphabet.get_ic()) + " (" + sym.get_symbol() + ") numchar\n"; - } - if (errbars) { - out += " " + pspm.get_error(this.alphabet) + " Ibeam\n"; - } - out += "endstack\n\n"; - } - if (pspm.get_right_trim() > 0 || pspm.get_left_trim() == pspm.get_motif_length()) { - out += "RestoreColour\n"; - } - out += "EndLine\n"; - } - return out; -}; - -Logo.prototype.as_eps = function(options) { - "use strict"; - if (this.xlate_nsyms != 1) throw new Error("Unsupported setting xlate_nsyms for EPS"); - if (this.xlate_start != null) throw new Error("Unsupported setting xlate_start for EPS"); - if (this.xlate_end != null) throw new Error("Unsupported setting xlate_end for EPS"); - - var LOGOHEIGHT = 7.5; // default height of line in cm - var cm2pts, height, width, now, ssc, errbars; - if (typeof options === "undefined") { - options = {}; - } - cm2pts = 72 / 2.54; - if (typeof options.logo_height == "number") { - height = options.logo_height; - } else { - height = LOGOHEIGHT * this.rows; - } - if (typeof options.logo_width == "number") { - width = options.logo_width; - } else { - width = this.columns + 2; - } - now = new Date(); - ssc = (typeof options.ssc == "boolean" ? options.ssc : false); - errbars = (typeof options.show_error_bar == "boolean" ? options.show_error_bar : ssc); - var values = { - "LOGOHEIGHT": height, - "LOGOWIDTH": width, - "BOUNDINGHEIGHT": Math.round(height * cm2pts), - "BOUNDINGWIDTH": Math.round(width * cm2pts), - "LOGOLINEHEIGHT": (height / this.rows), - "CHARSPERLINE": this.columns, - "BARBITS": this.alphabet.get_ic(), - "LOGOTYPE": (this.alphabet.has_complement() ? "NA" : "AA"), - "CREATIONDATE": now.getDate() + "." + (now.getMonth() + 1) + "." + now.getFullYear() + " " + now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds(), - "ERRORBARFRACTION": (typeof options.error_bar_fraction == "number" ? options.error_bar_fraction : 1.0), - "TICBITS": (typeof options.ticbits == "number" ? options.ticbits : 1.0), - "TITLE": (typeof options.title == "string" ? options.title : ""), - "FINEPRINT": (typeof options.fineprint == "string" ? options.fineprint : this.fine_text), - "XAXISLABEL": (typeof options.xaxislabel == "string" ? options.xaxislabel : ""), - "YAXISLABEL": (typeof options.yaxislabel == "string" ? options.yaxislabel : "bits"), - "SSC": ssc, - "YAXIS": (typeof options.show_y_axis == "boolean" ? options.show_y_axis : this.y_axis), - "SHOWENDS": (typeof options.show_ends == "boolean" ? options.show_ends : false), - "ERRBAR": errbars, - "OUTLINE": (typeof options.show_outline == "boolean" ? options.show_outline : false), - "NUMBERING": (typeof options.show_numbering == "boolean" ? options.show_numbering : this.x_axis != 0), - "SHOWINGBOX": (typeof options.show_box == "boolean" ? options.show_box : false), - "CREATOR": (typeof options.creator == "string" ? options.creator : "motif_logo.js"), - "FONTSIZE": (typeof options.label_font_size == "number" ? options.label_font_size : 12), - "TITLEFONTSIZE": (typeof options.title_font_size == "number" ? options.title_font_size : 12), - "SMALLFONTSIZE": (typeof options.small_font_size == "number" ? options.small_font_size : 6), - "TOPMARGIN" : (typeof options.top_margin == "number" ? options.top_margin : 0.9), - "BOTTOMMARGIN": (typeof options.bottom_margin == "number" ? options.bottom_margin : 0.9), - "COLORDICT": this.alphabet._as_eps_dict(), - "DATA": this._as_eps_data(ssc, errbars) - }; - // now this requires that the script containing the template has been imported! - return motif_logo_template(values); -}; - -//====================================================================== -// end Logo object -//====================================================================== - -// calculate the exact size (in pixels) of an object drawn on the -// canvas assuming that the background of the canvas is transparent. -function canvas_bounds(ctx, cwidth, cheight) { - "use strict"; - var data, r, c, top_line, bottom_line, left_line, right_line, - txt_width, txt_height; - - // extract the image data - data = ctx.getImageData(0, 0, cwidth, cheight).data; - - // set initial values - top_line = -1; bottom_line = -1; left_line = -1; right_line = -1; - txt_width = 0; txt_height = 0; - - // Find the top-most line with a non-transparent pixel - for (r = 0; r < cheight; r++) { - for (c = 0; c < cwidth; c++) { - if (data[r * cwidth * 4 + c * 4 + 3]) { - top_line = r; - break; - } - } - if (top_line != -1) { - break; - } - } - - // Only bother looking if we found at least one set pixel... - if (top_line != -1) { - - //find the last line with a non-transparent pixel - for (r = cheight-1; r >= top_line; r--) { - for(c = 0; c < cwidth; c++) { - if(data[r * cwidth * 4 + c * 4 + 3]) { - bottom_line = r; - break; - } - } - if (bottom_line != -1) { - break; - } - } - // calculate height - txt_height = bottom_line - top_line + 1; - - // Find the left-most line with a non-transparent pixel - for (c = 0; c < cwidth; c++) { - for (r = top_line; r <= bottom_line; r++) { - if (data[r * cwidth * 4 + c * 4 + 3]) { - left_line = c; - break; - } - } - if (left_line != -1) { - break; - } - } - - //find the right most line with a non-transparent pixel - for (c = cwidth-1; c >= left_line; c--) { - for(r = top_line; r <= bottom_line; r++) { - if(data[r * cwidth * 4 + c * 4 + 3]) { - right_line = c; - break; - } - } - if (right_line != -1) { - break; - } - } - txt_width = right_line - left_line + 1; - } - - //return the bounds - return {bound_top: top_line, bound_bottom: bottom_line, - bound_left: left_line, bound_right: right_line, width: txt_width, - height: txt_height}; -} - -//====================================================================== -// start RasterizedAlphabet -//====================================================================== - -// Rasterize Alphabet -// 1) Measure width of text at default font for all symbols in alphabet -// 2) sort in width ascending -// 3) Drop the top and bottom 10% (designed to ignore outliers like 'W' and 'I') -// 4) Calculate the average as the maximum scaling factor (designed to stop I becoming a rectangular blob). -// 5) Assume scale of zero would result in width of zero, interpolate scale required to make perfect width font -// 6) Draw text onto temp canvas at calculated scale -// 7) Find bounds of drawn text -// 8) Paint on to another canvas at the desired height (but only scaling width to fit if larger). -var RasterizedAlphabet = function(alphabet, logo_scale, font, width) { - "use strict"; - var default_size, safety_pad, canvas, ctx, middle, baseline, widths, sizes, - i, sym, size, tenpercent, avg_width, scale, - target_width, target_height; - //variable prototypes - this.alphabet = alphabet; - this.scale = logo_scale; - this.sym_cache = {}; - this.stack_num_cache = []; - this.scale_num_cache = []; - // size of canvas - default_size = 60; // size of measuring canvas - safety_pad = 20; // pixels to pad around so we don't miss the edges - // create a canvas to do our measuring - canvas = document.createElement("canvas"); - if (!canvas.getContext) throw new Error("No canvas support"); - canvas.width = default_size + 2 * safety_pad; - canvas.height = default_size + 2 * safety_pad; - middle = Math.round(canvas.width / 2); - baseline = Math.round(canvas.height - safety_pad); - ctx = canvas.getContext('2d'); - if (!supports_text(ctx)) throw new Error("Canvas does not support text"); - ctx.font = font; - ctx.textAlign = "center"; - ctx.translate(middle, baseline); - // list of widths - widths = []; - sizes = []; - //now measure each letter in the alphabet - for (i = 0; i < alphabet.get_size_core(); ++i) { - // reset the canvas - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.fillStyle = alphabet.get_colour(i); - // draw the test text - ctx.fillText(alphabet.get_symbol(i), 0, 0); - //measure - size = canvas_bounds(ctx, canvas.width, canvas.height); - if (size.width === 0) throw new Error("Invisible symbol!"); - widths.push(size.width); - sizes[i] = size; - } - //sort the widths - widths.sort(function(a,b) {return a - b;}); - //drop 10% of the items off each end - tenpercent = Math.floor(widths.length / 10); - for (i = 0; i < tenpercent; ++i) { - widths.pop(); - widths.shift(); - } - //calculate average width - avg_width = 0; - for (i = 0; i < widths.length; ++i) { - avg_width += widths[i]; - } - avg_width /= widths.length; - // calculate the target width - target_width = width * this.scale * 2; - // calculate scales - for (i = 0; i < alphabet.get_size_core(); ++i) { - sym = alphabet.get_symbol(i); - size = sizes[i]; - // calculate scale - scale = target_width / Math.max(avg_width, size.width); - // estimate scaled height - target_height = size.height * scale; - // create an appropriately sized canvas - canvas = document.createElement("canvas"); - canvas.width = target_width; - canvas.height = target_height + safety_pad * 2; - // calculate the middle - middle = Math.round(canvas.width / 2); - // calculate the baseline - baseline = Math.round(canvas.height - safety_pad); - // get the context and prepare to draw the rasterized text - ctx = canvas.getContext('2d'); - ctx.font = font; - ctx.fillStyle = alphabet.get_colour(i); - ctx.textAlign = "center"; - ctx.translate(middle, baseline); - ctx.save(); - ctx.scale(scale, scale); - // draw the text - ctx.fillText(sym, 0, 0); - ctx.restore(); - this.sym_cache[sym] = {"image": canvas, "size": canvas_bounds(ctx, canvas.width, canvas.height)}; - } -}; - -RasterizedAlphabet.prototype.get_alphabet = function() { - return this.alphabet; -}; - -RasterizedAlphabet.prototype.get_scale = function() { - return this.scale; -}; - -RasterizedAlphabet.prototype.draw_stack_sym = function(ctx, letter, dx, dy, dWidth, dHeight) { - "use strict"; - var entry, image, size; - entry = this.sym_cache[letter]; - image = entry.image; - size = entry.size; - ctx.drawImage(image, 0, size.bound_top -1, image.width, size.height+1, dx, dy, dWidth, dHeight); -}; - -RasterizedAlphabet.prototype.draw_stack_num = function(ctx, font, stack_width, index) { - var image, image_ctx, text_length; - if (index >= this.stack_num_cache.length) { - image = document.createElement("canvas"); - // measure the text - image_ctx = image.getContext('2d'); - image_ctx.save(); - image_ctx.font = font; - text_length = image_ctx.measureText("" + (index + 1)).width; - image_ctx.restore(); - // resize the canvas to fit - image.width = Math.ceil(stack_width); - image.height = Math.ceil(text_length); - // draw the text - image_ctx = image.getContext('2d'); - image_ctx.translate(Math.round(stack_width / 2), 0); - image_ctx.font = font; - image_ctx.textBaseline = "middle"; - image_ctx.textAlign = "right"; - image_ctx.rotate(-(Math.PI / 2)); - image_ctx.fillText("" + (index + 1), 0, 0); - this.stack_num_cache[index] = image; - } else { - image = this.stack_num_cache[index]; - } - ctx.drawImage(image, 0, 0); -} - -RasterizedAlphabet.prototype.draw_scale_num = function(ctx, font, num) { - var image, image_ctx, text_size, m_length; - if (num >= this.scale_num_cache.length) { - image = document.createElement("canvas"); - // measure the text - image_ctx = image.getContext('2d'); - image_ctx.font = font; - text_size = image_ctx.measureText("" + num); - if (text_size.actualBoundingBoxAscent && text_size.actualBoundingBoxDesent) { - // resize the canvas to fit - image.width = Math.ceil(text_size.width); - image.height = Math.ceil(text_size.actualBoundingBoxAscent + text_size.actualBoundingBoxDesent); - // draw the text - image_ctx = image.getContext('2d'); - image_ctx.font = font; - image_ctx.textAlign = "right"; - image_ctx.fillText("" + num, image.width, text_size.actualBoundingBoxAscent); - } else { - // measure width of 'm' to approximate height, we double it later anyway - m_length = image_ctx.measureText("m").width; - // resize the canvas to fit - image.width = Math.ceil(text_size.width); - image.height = Math.ceil(2 * m_length); - // draw the text - image_ctx = image.getContext('2d'); - image_ctx.font = font; - image_ctx.textAlign = "right"; - image_ctx.textBaseline = "middle"; - image_ctx.fillText("" + num, image.width, m_length); - } - this.scale_num_cache[num] = image; - } else { - image = this.scale_num_cache[num]; - } - ctx.drawImage(image, -image.width, -Math.round(image.height / 2)) -} - -//====================================================================== -// end RasterizedAlphabet -//====================================================================== - -//====================================================================== -// start LogoMetrics object -//====================================================================== - -var LogoMetrics = function(ctx, logo_columns, logo_rows, has_names, has_finetext, x_axis, y_axis) { - "use strict"; - var i, row_height; - //variable prototypes - this.pad_top = (has_names ? 5 : 0); - this.pad_left = (y_axis ? 10 : 0); - this.pad_right = (has_finetext ? 15 : 0); - this.pad_bottom = 0; - this.pad_middle = 20; - this.name_height = 14; - this.name_font = "bold " + this.name_height + "px Times, sans-serif"; - this.name_spacer = 0; - this.y_axis = y_axis; - this.y_label = "bits"; - this.y_label_height = 12; - this.y_label_font = "bold " + this.y_label_height + "px Helvetica, sans-serif"; - this.y_label_spacer = 3; - this.y_num_height = 12; - this.y_num_width = 0; - this.y_num_font = "bold " + this.y_num_height + "px Helvetica, sans-serif"; - this.y_tic_width = 5; - this.stack_pad_left = 0; - this.stack_font = "bold 25px Helvetica, sans-serif"; - this.stack_height = 90; - this.stack_width = 26; - this.stacks_pad_right = 5; - this.x_axis = x_axis; - this.x_num_above = 2; - this.x_num_height = 12; - this.x_num_width = 0; - this.x_num_font = "bold " + this.x_num_height + "px Helvetica, sans-serif"; - this.fine_txt_height = 6; - this.fine_txt_above = 2; - this.fine_txt_font = "normal " + this.fine_txt_height + "px Helvetica, sans-serif"; - this.letter_metrics = new Array(); - this.summed_width = 0; - this.summed_height = 0; - //calculate the width of the y axis numbers - ctx.font = this.y_num_font; - for (i = 0; i <= 2; i++) { - this.y_num_width = Math.max(this.y_num_width, ctx.measureText("" + i).width); - } - //calculate the width of the x axis numbers (but they are rotated so it becomes height) - if (x_axis == 1) { - ctx.font = this.x_num_font; - for (i = 1; i <= logo_columns; i++) { - this.x_num_width = Math.max(this.x_num_width, ctx.measureText("" + i).width); - } - } else if (x_axis == 0) { - this.x_num_height = 4; - this.x_num_width = 4; - } else { - this.x_num_height = 0; - this.x_num_width = 0; - } - - //calculate how much vertical space we want to draw this - //first we add the padding at the top and bottom since that's always there - this.summed_height += this.pad_top + this.pad_bottom; - //all except the last row have the same amount of space allocated to them - if (logo_rows > 1) { - row_height = this.stack_height + this.pad_middle; - if (has_names) { - row_height += this.name_height; - //the label is allowed to overlap into the spacer - row_height += Math.max(this.y_num_height/2, this.name_spacer); - //the label is allowed to overlap the space used by the other label - row_height += Math.max(this.y_num_height/2, this.x_num_height + this.x_num_above); - } else { - row_height += this.y_num_height/2; - //the label is allowed to overlap the space used by the other label - row_height += Math.max(this.y_num_height/2, this.x_num_height + this.x_num_above); - } - this.summed_height += row_height * (logo_rows - 1); - } - //the last row has the name and fine text below it but no padding - this.summed_height += this.stack_height + (this.y_axis ? this.y_num_height/2 : 0); - - var fine_txt_total = (has_finetext ? this.fine_txt_height + this.fine_txt_above : 0); - if (has_names) { - this.summed_height += fine_txt_total + this.name_height; - this.summed_height += Math.max((this.y_axis ? this.y_num_height/2 : 0), - this.x_num_height + this.x_num_above + this.name_spacer); - } else { - this.summed_height += Math.max((this.y_axis ? this.y_num_height/2 : 0), - this.x_num_height + this.x_num_above + fine_txt_total); - } - - //calculate how much horizontal space we want to draw this - //first add the padding at the left and right since that's always there - this.summed_width += this.pad_left + this.pad_right; - if (this.y_axis) { - //add on the space for the y-axis label - this.summed_width += this.y_label_height + this.y_label_spacer; - //add on the space for the y-axis - this.summed_width += this.y_num_width + this.y_tic_width; - } - //add on the space for the stacks - this.summed_width += (this.stack_pad_left + this.stack_width) * logo_columns; - //add on the padding after the stacks (an offset from the fine text) - this.summed_width += this.stacks_pad_right; - -}; - -//====================================================================== -// end LogoMetrics object -//====================================================================== - -//found this trick at http://talideon.com/weblog/2005/02/detecting-broken-images-js.cfm -function image_ok(img) { - "use strict"; - // During the onload event, IE correctly identifies any images that - // weren't downloaded as not complete. Others should too. Gecko-based - // browsers act like NS4 in that they report this incorrectly. - if (!img.complete) { - return false; - } - // However, they do have two very useful properties: naturalWidth and - // naturalHeight. These give the true size of the image. If it failed - // to load, either of these should be zero. - if (typeof img.naturalWidth !== "undefined" && img.naturalWidth === 0) { - return false; - } - // No other way of checking: assume it's ok. - return true; -} - -function supports_text(ctx) { - "use strict"; - if (!ctx.fillText) { - return false; - } - if (!ctx.measureText) { - return false; - } - return true; -} - -//draws the scale, returns the width -function draw_scale(ctx, metrics, alphabet_ic, raster) { - "use strict"; - var tic_height, i; - tic_height = metrics.stack_height / alphabet_ic; - ctx.save(); - ctx.translate(metrics.y_label_height, metrics.y_num_height/2); - //draw the axis label - ctx.save(); - ctx.font = metrics.y_label_font; - ctx.translate(0, metrics.stack_height/2); - ctx.rotate(-(Math.PI / 2)); - ctx.textAlign = "center"; - ctx.fillText("bits", 0, 0); - ctx.restore(); - - ctx.translate(metrics.y_label_spacer + metrics.y_num_width, 0); - - //draw the axis tics - ctx.save(); - ctx.translate(0, metrics.stack_height); - for (i = 0; i <= alphabet_ic; i++) { - //draw the number - ctx.save(); - ctx.translate(-1, 0); - raster.draw_scale_num(ctx, metrics.y_num_font, i); - ctx.restore(); - //draw the tic - ctx.fillRect(0, -1, metrics.y_tic_width, 2); - //prepare for next tic - ctx.translate(0, -tic_height); - } - ctx.restore(); - - ctx.fillRect(metrics.y_tic_width - 2, 0, 2, metrics.stack_height) - - ctx.restore(); -} - -function draw_stack_num(ctx, metrics, row_index, raster) { - "use strict"; - ctx.save(); - ctx.translate(0, Math.round(metrics.stack_height + metrics.x_num_above)); - if (metrics.x_axis == 1) { - raster.draw_stack_num(ctx, metrics.x_num_font, metrics.stack_width, row_index); - } else if (metrics.x_axis == 0) { - // draw dots instead of the numbers (good for small logos) - ctx.beginPath(); - var radius = Math.round(metrics.x_num_height / 2); - ctx.arc(Math.round(metrics.stack_width / 2), radius, radius, 0, 2 * Math.PI, false); - ctx.fill(); - } - ctx.restore(); -} - -function draw_stack(ctx, metrics, symbols, raster) { - "use strict"; - var preferred_pad, sym_min, i, sym, sym_height, pad; - preferred_pad = 0; - sym_min = 5; - - ctx.save();//1 - ctx.translate(0, metrics.stack_height); - for (i = 0; i < symbols.length; i++) { - sym = symbols[i]; - sym_height = metrics.stack_height * sym.get_scale(); - - pad = preferred_pad; - if (sym_height - pad < sym_min) { - pad = Math.min(pad, Math.max(0, sym_height - sym_min)); - } - sym_height -= pad; - - //translate to the correct position - ctx.translate(0, -(pad/2 + sym_height)); - - //draw - raster.draw_stack_sym(ctx, sym.get_symbol(), 0, 0, metrics.stack_width, sym_height); - //translate past the padding - ctx.translate(0, -(pad/2)); - } - ctx.restore();//1 -} - -function draw_dashed_line(ctx, pattern, start, x1, y1, x2, y2) { - "use strict"; - var x, y, len, i, dx, dy, tlen, theta, mulx, muly, lx, ly; - dx = x2 - x1; - dy = y2 - y1; - tlen = Math.pow(dx*dx + dy*dy, 0.5); - theta = Math.atan2(dy,dx); - mulx = Math.cos(theta); - muly = Math.sin(theta); - lx = []; - ly = []; - for (i = 0; i < pattern; ++i) { - lx.push(pattern[i] * mulx); - ly.push(pattern[i] * muly); - } - i = start; - x = x1; - y = y1; - len = 0; - ctx.beginPath(); - while (len + pattern[i] < tlen) { - ctx.moveTo(x, y); - x += lx[i]; - y += ly[i]; - ctx.lineTo(x, y); - len += pattern[i]; - i = (i + 1) % pattern.length; - x += lx[i]; - y += ly[i]; - len += pattern[i]; - i = (i + 1) % pattern.length; - } - if (len < tlen) { - ctx.moveTo(x, y); - x += mulx * (tlen - len); - y += muly * (tlen - len); - ctx.lineTo(x, y); - } - ctx.stroke(); -} - -function draw_trim_background(ctx, metrics, left_start, left_end, left_divider, right_start, right_end, right_divider) { - "use strict"; - var left_size = left_end - left_start; - var right_size = right_end - right_start; - var line_x; - - ctx.save();//s8 - ctx.fillStyle = "rgb(240, 240, 240)"; - if (left_size > 0) { - ctx.fillRect(left_start * metrics.stack_width, 0, left_size * metrics.stack_width, metrics.stack_height); - } - if (right_size > 0) { - ctx.fillRect(right_start * metrics.stack_width, 0, right_size * metrics.stack_width, metrics.stack_height); - } - ctx.fillStyle = "rgb(51, 51, 51)"; - if (left_size > 0 && left_divider) { - line_x = (left_end * metrics.stack_width) - 0.5; - draw_dashed_line(ctx, [3], 0, line_x, 0, line_x, metrics.stack_height); - } - if (right_size > 0 && right_divider) { - line_x = (right_start * metrics.stack_width) + 0.5; - draw_dashed_line(ctx, [3], 0, line_x, 0, line_x, metrics.stack_height); - } - ctx.restore();//s8 -} - -function size_logo_on_canvas(logo, canvas, show_names, scale) { - "use strict"; - var draw_name, draw_finetext, metrics; - draw_name = (typeof show_names === "boolean" ? show_names : (logo.get_rows() > 1)); - draw_finetext = (logo.fine_text.length > 0); - if (canvas.width !== 0 && canvas.height !== 0) { - return; - } - metrics = new LogoMetrics(canvas.getContext('2d'), - logo.get_xlate_columns(), logo.get_rows(), draw_name, draw_finetext, logo.x_axis, logo.y_axis); - if (typeof scale == "number") { - //resize the canvas to fit the scaled logo - canvas.width = metrics.summed_width * scale; - canvas.height = metrics.summed_height * scale; - } else { - if (canvas.width === 0 && canvas.height === 0) { - canvas.width = metrics.summed_width; - canvas.height = metrics.summed_height; - } else if (canvas.width === 0) { - canvas.width = metrics.summed_width * (canvas.height / metrics.summed_height); - } else if (canvas.height === 0) { - canvas.height = metrics.summed_height * (canvas.width / metrics.summed_width); - } - } -} - -function draw_logo_on_canvas(logo, canvas, show_names, scale) { - "use strict"; - var i, draw_name, draw_finetext, ctx, metrics, raster, pspm_i, pspm, - offset, col_index, motif_position, ssc; - ssc = false; - draw_name = (typeof show_names === "boolean" ? show_names : (logo.get_rows() > 1)); - draw_finetext = (logo.fine_text.length > 0); - ctx = canvas.getContext('2d'); - //assume that the user wants the canvas scaled equally so calculate what the best width for this image should be - metrics = new LogoMetrics(ctx, logo.get_xlate_columns(), logo.get_rows(), draw_name, draw_finetext, logo.x_axis, logo.y_axis); - if (typeof scale == "number") { - //resize the canvas to fit the scaled logo - canvas.width = metrics.summed_width * scale; - canvas.height = metrics.summed_height * scale; - } else { - if (canvas.width === 0 && canvas.height === 0) { - scale = 1; - canvas.width = metrics.summed_width; - canvas.height = metrics.summed_height; - } else if (canvas.width === 0) { - scale = canvas.height / metrics.summed_height; - canvas.width = metrics.summed_width * scale; - } else if (canvas.height === 0) { - scale = canvas.width / metrics.summed_width; - canvas.height = metrics.summed_height * scale; - } else { - scale = Math.min(canvas.width / metrics.summed_width, canvas.height / metrics.summed_height); - } - } - // cache the raster based on the assumption that we will be drawing a lot - // of logos the same size and alphabet - if (typeof draw_logo_on_canvas.raster_cache === "undefined") { - draw_logo_on_canvas.raster_cache = []; - } - for (i = 0; i < draw_logo_on_canvas.raster_cache.length; i++) { - raster = draw_logo_on_canvas.raster_cache[i]; - if (raster.get_alphabet().equals(logo.alphabet) && - Math.abs(raster.get_scale() - scale) < 0.1) break; - raster = null; - } - if (raster == null) { - raster = new RasterizedAlphabet(logo.alphabet, scale, metrics.stack_font, metrics.stack_width); - draw_logo_on_canvas.raster_cache.push(raster); - } - ctx = canvas.getContext('2d'); - ctx.save();//s1 - ctx.scale(scale, scale); - ctx.save();//s2 - ctx.save();//s7 - //create margin - ctx.translate(Math.round(metrics.pad_left), Math.round(metrics.pad_top)); - for (pspm_i = 0; pspm_i < logo.get_rows(); ++pspm_i) { - pspm = logo.get_pspm(pspm_i); - offset = logo.get_offset(pspm_i); - //optionally draw name if this isn't the last row or is the only row - if (draw_name && (logo.get_rows() == 1 || pspm_i != (logo.get_rows()-1))) { - ctx.save();//s4 - ctx.translate(Math.round(metrics.summed_width/2), Math.round(metrics.name_height)); - ctx.font = metrics.name_font; - ctx.textAlign = "center"; - ctx.fillText(pspm.name, 0, 0); - ctx.restore();//s4 - ctx.translate(0, Math.round(metrics.name_height + - Math.min(0, metrics.name_spacer - metrics.y_num_height/2))); - } - //draw scale - if (logo.y_axis) draw_scale(ctx, metrics, logo.alphabet.get_ic(), raster); - ctx.save();//s5 - //translate across past the scale - if (logo.y_axis) { - ctx.translate(Math.round(metrics.y_label_height + metrics.y_label_spacer + - metrics.y_num_width + metrics.y_tic_width), Math.round(metrics.y_num_height / 2)); - } - //draw the trimming background - if (pspm.get_left_trim() > 0 || pspm.get_right_trim() > 0) { - var left_start = offset * logo.get_xlate_nsyms(); - var left_end = (offset + pspm.get_left_trim()) * logo.get_xlate_nsyms(); - var left_divider = true; - if (left_end < logo.get_xlate_start() || left_start > logo.get_xlate_end()) { - // no overlap - left_start = 0; - left_end = 0; - left_divider = false; - } else { - if (left_start < logo.get_xlate_start()) { - left_start = logo.get_xlate_start(); - } - if (left_end > logo.get_xlate_end()) { - left_end = logo.get_xlate_end(); - left_divider = false; - } - left_start -= logo.get_xlate_start(); - left_end -= logo.get_xlate_start(); - if (left_end < left_start) { - left_start = 0; - left_end = 0; - left_divider = false; - } - } - var right_end = (offset + pspm.get_motif_length()) * logo.get_xlate_nsyms(); - //var right_start = right_end - (pspm.get_left_trim() * logo.get_xlate_nsyms()); - var right_start = right_end - (pspm.get_right_trim() * logo.get_xlate_nsyms()); - var right_divider = true; - if (right_end < logo.get_xlate_start() || right_start > logo.get_xlate_end()) { - // no overlap - right_start = 0; - right_end = 0; - right_divider = false; - } else { - if (right_start < logo.get_xlate_start()) { - right_start = logo.get_xlate_start(); - right_divider = false; - } - if (right_end > logo.get_xlate_end()) { - right_end = logo.get_xlate_end(); - } - right_start -= logo.get_xlate_start(); - right_end -= logo.get_xlate_start(); - if (right_end < right_start) { - right_start = 0; - right_end = 0; - right_divider = false; - } - } - draw_trim_background(ctx, metrics, left_start, left_end, left_divider, right_start, right_end, right_divider); - } - //draw letters - var xlate_col; - for (xlate_col = logo.get_xlate_start(); xlate_col < logo.get_xlate_end(); xlate_col++) { - ctx.translate(metrics.stack_pad_left,0); - col_index = Math.floor(xlate_col / logo.get_xlate_nsyms()); - if (xlate_col % logo.get_xlate_nsyms() == 0) { - if (col_index >= offset && col_index < (offset + pspm.get_motif_length())) { - motif_position = col_index - offset; - draw_stack_num(ctx, metrics, motif_position, raster); - draw_stack(ctx, metrics, pspm.get_stack(motif_position, logo.alphabet, ssc), raster); - } - } else { - if (col_index >= offset && col_index < (offset + pspm.get_motif_length())) { - ctx.save();// s5.1 - ctx.translate(0, Math.round(metrics.stack_height)); - // TODO draw a dot or dash or something to indicate continuity of the motif - ctx.restore(); //s5.1 - } - } - ctx.translate(Math.round(metrics.stack_width), 0); - } - ctx.restore();//s5 - ////optionally draw name if this is the last row but isn't the only row - if (draw_name && (logo.get_rows() != 1 && pspm_i == (logo.get_rows()-1))) { - //translate vertically past the stack and axis's - ctx.translate(0, metrics.y_num_height/2 + metrics.stack_height + - Math.max(metrics.y_num_height/2, metrics.x_num_above + metrics.x_num_width + metrics.name_spacer)); - - ctx.save();//s6 - ctx.translate(metrics.summed_width/2, metrics.name_height); - ctx.font = metrics.name_font; - ctx.textAlign = "center"; - ctx.fillText(pspm.name, 0, 0); - ctx.restore();//s6 - ctx.translate(0, metrics.name_height); - } else { - //translate vertically past the stack and axis's - ctx.translate(0, metrics.y_num_height/2 + metrics.stack_height + - Math.max(metrics.y_num_height/2, metrics.x_num_above + metrics.x_num_width)); - } - //if not the last row then add middle padding - if (pspm_i != (logo.get_rows() -1)) { - ctx.translate(0, metrics.pad_middle); - } - } - ctx.restore();//s7 - if (logo.fine_text.length > 0) { - ctx.translate(metrics.summed_width - metrics.pad_right, metrics.summed_height - metrics.pad_bottom); - ctx.font = metrics.fine_txt_font; - ctx.textAlign = "right"; - ctx.fillText(logo.fine_text, 0,0); - } - ctx.restore();//s2 - ctx.restore();//s1 -} - -function create_canvas(c_width, c_height, c_id, c_title, c_display) { - "use strict"; - var canvas = document.createElement("canvas"); - //check for canvas support before attempting anything - if (!canvas.getContext) { - return null; - } - var ctx = canvas.getContext('2d'); - //check for html5 text drawing support - if (!supports_text(ctx)) { - return null; - } - //size the canvas - canvas.width = c_width; - canvas.height = c_height; - canvas.id = c_id; - canvas.title = c_title; - canvas.style.display = c_display; - return canvas; -} - -function logo_1(alphabet, fine_text, pspm) { - "use strict"; - var logo = new Logo(alphabet, fine_text); - logo.add_pspm(pspm); - return logo; -} - -function logo_2(alphabet, fine_text, target, query, query_offset) { - "use strict"; - var logo = new Logo(alphabet, fine_text); - if (query_offset < 0) { - logo.add_pspm(target, -query_offset); - logo.add_pspm(query); - } else { - logo.add_pspm(target); - logo.add_pspm(query, query_offset); - } - return logo; -} - -/* - * Specifies an alternate source for an image. - * If the image with the image_id specified has - * not loaded then a generated logo will be used - * to replace it. - * - * Note that the image must either have dimensions - * or a scale must be set. - */ -function alternate_logo(logo, image_id, scale) { - "use strict"; - var image = document.getElementById(image_id); - if (!image) { - alert("Can't find specified image id (" + image_id + ")"); - return; - } - //if the image has loaded then there is no reason to use the canvas - if (image_ok(image)) { - return; - } - //the image has failed to load so replace it with a canvas if we can. - var canvas = create_canvas(image.width, image.height, image_id, image.title, image.style.display); - if (canvas === null) { - return; - } - //draw the logo on the canvas - draw_logo_on_canvas(logo, canvas, null, scale); - //replace the image with the canvas - image.parentNode.replaceChild(canvas, image); -} - -/* - * Specifes that the element with the specified id - * should be replaced with a generated logo. - */ -function replace_logo(logo, replace_id, scale, title_txt, display_style) { - "use strict"; - var element = document.getElementById(replace_id); - if (!replace_id) { - alert("Can't find specified id (" + replace_id + ")"); - return; - } - //found the element! - var canvas = create_canvas(50, 120, replace_id, title_txt, display_style); - if (canvas === null) { - return; - } - //draw the logo on the canvas - draw_logo_on_canvas(logo, canvas, null, scale); - //replace the element with the canvas - element.parentNode.replaceChild(canvas, element); -} - -/* - * Fast string trimming implementation found at - * http://blog.stevenlevithan.com/archives/faster-trim-javascript - * - * Note that regex is good at removing leading space but - * bad at removing trailing space as it has to first go through - * the whole string. - */ -function trim (str) { - "use strict"; - var ws, i; - str = str.replace(/^\s\s*/, ''); - ws = /\s/; i = str.length; - while (ws.test(str.charAt(--i))); - return str.slice(0, i + 1); -} -</script> - <script> - -// PRIVATE GLOBAL (uhoh) -var _block_colour_lookup = {}; - -function block_colour(index) { - function hsl2rgb(hue, saturation, lightness) { - "use strict"; - function _hue(p, q, t) { - "use strict"; - if (t < 0) t += 1; - else if (t > 1) t -= 1; - if (t < (1.0 / 6.0)) { - return p + ((q - p) * 6.0 * t); - } else if (t < 0.5) { - return q; - } else if (t < (2.0 / 3.0)) { - return p + ((q - p) * ((2.0 / 3.0) - t) * 6.0); - } else { - return p; - } - } - function _pad_hex(value) { - var hex = Math.round(value * 255).toString(16); - if (hex.length < 2) hex = "0" + hex; - return hex; - } - var r, g, b, p, q; - if (saturation == 0) { - // achromatic (grayscale) - r = lightness; - g = lightness; - b = lightness; - } else { - if (lightness < 0.5) { - q = lightness * (1 + saturation); - } else { - q = lightness + saturation - (lightness * saturation); - } - p = (2 * lightness) - q; - r = _hue(p, q, hue + (1.0 / 3.0)); - g = _hue(p, q, hue); - b = _hue(p, q, hue - (1.0 / 3.0)); - } - return "#" + _pad_hex(r) + _pad_hex(g) + _pad_hex(b); - } - if (typeof index !== "number" || index % 1 !== 0 || index < 0) return "#000000"; - // check for override - if (_block_colour_lookup[index] == null) { - var start = 0; //red - var sat = 100; - var light = 50; - var divisions = 1 << Math.ceil(Math.log(index + 1) / Math.LN2); - hue = start + (360 / divisions) * ((index - (divisions >> 1)) * 2 + 1); - // colour input fields only support values in the form #RRGGBB - _block_colour_lookup[index] = hsl2rgb(hue / 360, sat / 100, light / 100); - } - return _block_colour_lookup[index]; -} - -function set_block_colour(index, new_colour) { - _block_colour_lookup[index] = new_colour; - var blocks = document.querySelectorAll("div.block_motif[data-colour-index=\"" + index + "\"]"); - var i; - for (i = 0; i < blocks.length; i++) { - blocks[i].style.backgroundColor = new_colour; - } - var swatches = document.querySelectorAll("div.legend_swatch[data-colour-index=\"" + index + "\"]"); - var picker; - for (i = 0; i < swatches.length; i++) { - swatches[i].style.backgroundColor = new_colour; - picker = swatches[i].querySelector("input[type=\"color\"]"); - if (picker != null) picker.value = new_colour; - } -} - -function make_block_legend_entry(motif_name, motif_colour_index) { - if (typeof make_block_legend_entry.has_colour_picker !== "boolean") { - // test if colour picker is supported, based off Modernizer - // see http://stackoverflow.com/a/7787648/66387 - make_block_legend_entry.has_colour_picker = (function() { - var doc_ele = document.documentElement; - // We first check to see if the type we give it sticks.. - var input_ele = document.createElement('input'); - input_ele.setAttribute('type', 'color'); - var value_ok = input_ele.type !== 'text'; - if (value_ok) { - // If the type does, we feed it a textual value, which shouldn't be valid. - // If the value doesn't stick, we know there's input sanitization which infers a custom UI - var smile = ':)'; - input_ele.value = smile; - input_ele.style.cssText = 'position:absolute;visibility:hidden;'; - // chuck into DOM and force reflow for Opera bug in 11.00 - // github.com/Modernizr/Modernizr/issues#issue/159 - doc_ele.appendChild(input_ele); - doc_ele.offsetWidth; - value_ok = input_ele.value != smile; - doc_ele.removeChild(input_ele); - } - return value_ok; - })(); - } - var entry = document.createElement("div"); - entry.className = "legend_entry"; - var swatch; - swatch = document.createElement("div"); - swatch.className = "legend_swatch"; - swatch.setAttribute("data-colour-index", motif_colour_index); - swatch.style.backgroundColor = block_colour(motif_colour_index); - if (make_block_legend_entry.has_colour_picker) { - var picker = document.createElement("input"); - picker.type = "color"; - picker.value = block_colour(motif_colour_index); - picker.addEventListener("change", function(e) { - set_block_colour(motif_colour_index, picker.value); - }, false); - swatch.addEventListener("click", function(e) { - picker.click(); - }, false); - swatch.appendChild(picker); - } - entry.appendChild(swatch); - var name = document.createElement("div"); - name.className = "legend_text"; - name.appendChild(document.createTextNode(motif_name)); - entry.appendChild(name); - return entry; -} - -function make_block_ruler(max_len) { - var container = document.createElement("div"); - container.className = "block_container"; - var step; - if (max_len < 50) { - step = 1; - } else if (max_len < 100) { - step = 2; - } else if (max_len < 200) { - step = 4; - } else if (max_len < 500) { - step = 10; - } else if (max_len < 1000) { - step = 20; - } else if (max_len < 2000) { - step = 40; - } else if (max_len < 5000) { - step = 100; - } else if (max_len < 10000) { - step = 200; - } else if (max_len < 20000) { - step = 400; - } else { - step = Math.floor(max_len / 20000) * 400; - } - var peroid; - if (max_len < 10) { - peroid = 1; - } else if (max_len < 20) { - peroid = 2; - } else { - peroid = 5; - } - var i, cycle, offset, tic, label; - for (i = 0, cycle = 0; i < max_len; i += step, cycle = (cycle + 1) % peroid) { - offset = "" + ((i / max_len) * 100) + "%"; - tic = document.createElement("div"); - tic.style.left = offset; - tic.className = (cycle == 0 ? "tic_major" : "tic_minor"); - container.appendChild(tic); - if (cycle == 0) { - label = document.createElement("div"); - label.className = "tic_label"; - label.style.left = offset; - label.appendChild(document.createTextNode(i)); - container.appendChild(label); - } - } - return container; -} - -function _calculate_block_needle_drag_pos(e, data) { - var mouse; - e = e || window.event; - if (e.pageX || ev.pageY) { - mouse = {"x": e.pageX, "y": e.pageY}; - } else { - mouse = { - x:e.clientX + document.body.scrollLeft - document.body.clientLeft, - y:e.clientY + document.body.scrollTop - document.body.clientTop - }; - } - var cont = data.container; - var dragable_length = cont.clientWidth - - (cont.style.paddingLeft ? cont.style.paddingLeft : 0) - - (cont.style.paddingRight ? cont.style.paddingRight : 0); - //I believe that the offset parent is the body - //otherwise I would need to make this recursive - //maybe clientLeft would work, but the explanation of - //it is hard to understand and it apparently doesn't work - //in firefox 2. - var diff = mouse.x - cont.offsetLeft; - if (diff < 0) diff = 0; - if (diff > dragable_length) diff = dragable_length; - var pos = Math.round(diff / dragable_length * data.max); - if (pos > data.len) pos = data.len; - return pos; -} - -function _update_block_needle_drag(e, data, done) { - "use strict"; - var pos = _calculate_block_needle_drag_pos(e, data); - // read the needle positions - var left = parseInt(data.llabel.textContent, 10) - data.off - 1; - var right = parseInt(data.rlabel.textContent, 10) - data.off; - // validate needle positions - if (left >= data.len) left = data.len - 1; - if (left < 0) left = 0; - if (right > data.len) right = data.len; - if (right <= left) right = left + 1; - // calculate the new needle positions - if (data.moveboth) { - var size = right - left; - if (data.isleft) { - if ((pos + size) > data.len) pos = data.len - size; - left = pos; - right = pos + size; - } else { - if ((pos - size) < 0) pos = size; - left = pos - size; - right = pos; - } - } else { - if (data.isleft) { - if (pos >= right) pos = right - 1; - left = pos; - } else { - if (pos <= left) pos = left + 1; - right = pos; - } - } - // update the needle positions - data.lneedle.style.left = "" + (left / data.max * 100) + "%"; - data.llabel.textContent = "" + (left + data.off + 1); - data.rneedle.style.left = "" + (right / data.max * 100) + "%"; - data.rlabel.textContent = "" + (right + data.off); - data.handler(left, right, done); -} - -function _make_block_needle_drag_start_handler(isleft, data) { - return function (e) { - data.isleft = isleft; - data.moveboth = !(e.shiftKey); - document.addEventListener("mousemove", data.drag_during, false); - document.addEventListener("mouseup", data.drag_end, false); - }; -} - -function _make_block_needle_drag_end_handler(data) { - return function (e) { - document.removeEventListener("mousemove", data.drag_during, false); - document.removeEventListener("mouseup", data.drag_end, false); - _update_block_needle_drag(e, data, true); - }; -} - -function _make_block_needle_drag_during_handler(data) { - return function (e) { - _update_block_needle_drag(e, data, false); - }; -} - -// private function used by make_block_container -function _make_block_needle(isleft, value, data) { - var vbar = document.createElement('div'); - vbar.className = "block_needle " + (isleft ? "left" : "right"); - vbar.style.left = "" + (value / data.max * 100)+ "%"; - var label = document.createElement('div'); - label.className = "block_handle " + (isleft ? "left" : "right"); - // The needles sit between the sequence positions, so the left one sits at the - // start and the right at the end. This is why 1 is added to the displayed - // value for a left handle as the user doesn't need to know about this detail - label.textContent = "" + (isleft ? value + data.off + 1 : value + data.off); - label.unselectable = "on"; // so IE and Opera don't select the text, others are done in css - label.title = "Drag to move the displayed range. Hold shift and drag to change " + (isleft ? "lower" : "upper") + " bound of the range."; - vbar.appendChild(label); - if (isleft) { - data.lneedle = vbar; - data.llabel = label; - } else { - data.rneedle = vbar; - data.rlabel = label; - } - label.addEventListener("mousedown", _make_block_needle_drag_start_handler(isleft, data), false); - return vbar; -} - -function make_block_container(is_stranded, has_both_strands, max_len, show_len, offset, range_handler) { - offset = (offset != null ? offset : 0); - // make the container for the block diagram - var container = document.createElement("div"); - container.className = "block_container"; - container.setAttribute("data-max", max_len); - container.setAttribute("data-off", offset); - if (is_stranded) { - var plus = document.createElement("div"); - plus.appendChild(document.createTextNode("+")); - plus.className = "block_plus_sym"; - container.appendChild(plus); - if (has_both_strands) { - var minus = document.createElement("div"); - minus.appendChild(document.createTextNode("-")); - minus.className = "block_minus_sym"; - container.appendChild(minus); - } - } - var rule = document.createElement("div"); - rule.className = "block_rule"; - rule.style.width = ((show_len / max_len) * 100) + "%"; - container.appendChild(rule); - if (range_handler != null) { - var range_data = { - "max": max_len, - "len": show_len, - "off": offset, - "handler": range_handler, - "container": container, - "lneedle": null, "llabel": null, - "rneedle": null, "rlabel": null, - "isleft": false, "moveboth" : false - }; - range_data.drag_during = _make_block_needle_drag_during_handler(range_data); - range_data.drag_end = _make_block_needle_drag_end_handler(range_data); - container.appendChild(_make_block_needle(false, 1, range_data)); // add right first so z-index works - container.appendChild(_make_block_needle(true, 0, range_data)); - } - return container; -} - -function make_block_label(container, max_len, pos, length, message) { - "use strict"; - var label = document.createElement("div"); - label.className = "block_label"; - label.style.left = (((pos + (length / 2)) / max_len) * 100) + "%"; - label.appendChild(document.createTextNode(message)); - container.appendChild(label); -} - -function make_block(container, max_len, - site_pos, site_len, site_pvalue, site_rc, site_colour_index, site_secondary) { - "use strict"; - var block_height, block, block_region1, block_region2; - var max_block_height = 12; - var max_pvalue = 1e-10; - // calculate the height of the block - block_height = (site_pvalue < max_pvalue ? max_block_height : - (Math.log(site_pvalue) / Math.log(max_pvalue)) * max_block_height); - if (block_height < 1) block_height = 1; - // create a block to represent the motif - block = document.createElement("div"); - block.className = "block_motif" + (site_secondary ? " scanned_site" : "") + (site_rc ? " bottom" : " top"); - block.style.left = ((site_pos / max_len) * 100) + "%"; - block.style.top = (!site_rc ? max_block_height - block_height : - max_block_height + 1) + "px"; - block.style.width = ((site_len / max_len) * 100) + "%"; - block.style.height = block_height + "px"; - block.style.backgroundColor = block_colour(site_colour_index); - block.setAttribute("data-colour-index", site_colour_index); - // add to container - container.appendChild(block); - var activator = function (e) { - toggle_class(block, "active", true); - var new_e = new e.constructor(e.type, e); - block.dispatchEvent(new_e); - }; - var deactivator = function (e) { - toggle_class(block, "active", false); - var new_e = new e.constructor(e.type, e); - block.dispatchEvent(new_e); - } - // create a larger region to detect mouseover for the block - block_region1 = document.createElement("div"); - block_region1.className = "block_region top" + - (site_secondary ? " scanned_site" : "") + (site_rc ? "" : " main"); - block_region1.style.left = block.style.left; - block_region1.style.width = block.style.width; - block_region1.addEventListener('mouseover', activator, false); - block_region1.addEventListener('mouseout', deactivator, false); - container.appendChild(block_region1); - block_region2 = document.createElement("div"); - block_region2.className = "block_region bottom" + - (site_secondary ? " scanned_site" : "") + (site_rc ? " main" : ""); - block_region2.style.left = block.style.left; - block_region2.style.width = block.style.width; - block_region2.addEventListener('mouseover', activator, false); - block_region2.addEventListener('mouseout', deactivator, false); - container.appendChild(block_region2); - return block; -} - -function set_block_needle_positions(containingNode, start, end) { - var container, lneedle, llabel, rneedle, rlabel, max, off, left, right; - container = (/\bblock_container\b/.test(containingNode.className) ? containingNode : containingNode.querySelector(".block_container")); - max = parseInt(container.getAttribute("data-max"), 10); - off = parseInt(container.getAttribute("data-off"), 10); - left = start - off; - right = end - off; - lneedle = containingNode.querySelector(".block_needle.left"); - llabel = lneedle.querySelector(".block_handle.left"); - rneedle = containingNode.querySelector(".block_needle.right"); - rlabel = rneedle.querySelector(".block_handle.right"); - // update the needle positions - lneedle.style.left = "" + (left / max * 100) + "%"; - llabel.textContent = "" + (left + off + 1); - rneedle.style.left = "" + (right / max * 100) + "%"; - rlabel.textContent = "" + (right + off); -} - -function get_block_needle_positions(containingNode) { - var container, llabel, rlabel, max, off, left, right; - container = (/\bblock_container\b/.test(containingNode.className) ? containingNode : containingNode.querySelector(".block_container")); - max = parseInt(container.getAttribute("data-max"), 10); - off = parseInt(container.getAttribute("data-off"), 10); - llabel = containingNode.querySelector(".block_needle.left > .block_handle.left"); - rlabel = containingNode.querySelector(".block_needle.right > .block_handle.right"); - left = parseInt(llabel.textContent, 10) - off - 1; - right = parseInt(rlabel.textContent, 10) - off; - return {"start": left + off, "end": right + off}; -} -</script> - <script> -function make_alpha_bg_table(alph, freqs) { - function colour_symbol(index) { - var span = document.createElement("span"); - span.appendChild(document.createTextNode(alph.get_symbol(index))); - span.style.color = alph.get_colour(index); - span.className = "alpha_symbol"; - return span; - } - var table, thead, tbody, row, th, span, i; - // create table - table = document.createElement("table"); - table.className = "alpha_bg_table"; - // create header - thead = document.createElement("thead"); - table.appendChild(thead); - row = thead.insertRow(thead.rows.length); - if (alph.has_complement()) { - add_text_header_cell(row, "Name", "pop_alph_name"); - if (freqs != null) add_text_header_cell(row, "Freq.", "pop_alph_freq"); - if (alph.has_bg()) add_text_header_cell(row, "Bg.", "pop_alph_bg"); - add_text_header_cell(row, ""); - add_text_header_cell(row, ""); - add_text_header_cell(row, ""); - if (alph.has_bg()) add_text_header_cell(row, "Bg.", "pop_alph_bg"); - if (freqs != null) add_text_header_cell(row, "Freq.", "pop_alph_freq"); - add_text_header_cell(row, "Name", "pop_alph_name"); - } else { - add_text_header_cell(row, ""); - add_text_header_cell(row, "Name", "pop_alph_name"); - if (freqs != null) add_text_header_cell(row, "Freq.", "pop_alph_freq"); - if (alph.has_bg()) add_text_header_cell(row, "Bg.", "pop_alph_bg"); - } - // add alphabet entries - tbody = document.createElement("tbody"); - table.appendChild(tbody); - if (alph.has_complement()) { - for (i = 0; i < alph.get_size_core(); i++) { - var c = alph.get_complement(i); - if (i > c) continue; - row = tbody.insertRow(tbody.rows.length); - add_text_cell(row, alph.get_name(i)); - if (freqs != null) add_text_cell(row, "" + freqs[i].toFixed(3)); - if (alph.has_bg()) add_text_cell(row, "" + alph.get_bg_freq(i).toFixed(3)); - add_cell(row, colour_symbol(i)); - add_text_cell(row, "~"); - add_cell(row, colour_symbol(c)); - if (alph.has_bg()) add_text_cell(row, "" + alph.get_bg_freq(c).toFixed(3)); - if (freqs != null) add_text_cell(row, "" + freqs[c].toFixed(3)); - add_text_cell(row, alph.get_name(c)); - } - } else { - for (i = 0; i < alph.get_size_core(); i++) { - row = tbody.insertRow(tbody.rows.length); - add_cell(row, colour_symbol(i)); - add_text_cell(row, alph.get_name(i)); - if (freqs != null) add_text_cell(row, "" + freqs[i].toFixed(3)); - if (alph.has_bg()) add_text_cell(row, "" + alph.get_bg_freq(i).toFixed(3)); - } - } - return table; -} - -</script> - <script> -var current_motif = 0; -var meme_alphabet = new Alphabet(data.alphabet, data.background.freqs); - -var DelayLogoTask = function(logo, canvas) { - this.logo = logo; - this.canvas = canvas; -}; - -DelayLogoTask.prototype.run = function () { - draw_logo_on_canvas(this.logo, this.canvas, false); -}; - -function motif_pspm(index) { - var motif, pwm, psm, name, ltrim, rtrim, nsites, evalue; - // get motif - motif = data["motifs"][index]; - // get motif paramters - pwm = motif["pwm"]; - psm = motif["psm"]; - name = "" + (index + 1); ltrim = 0; rtrim = 0; - nsites = motif["nsites"]; evalue = motif["evalue"]; - // make pspm - return new Pspm(pwm, name, ltrim, rtrim, nsites, evalue, psm); -} - -function motif_count_matrix(index) { - return motif_pspm(index).as_count_matrix(); -} - -function motif_prob_matrix(index) { - return motif_pspm(index).as_probability_matrix(); -} - -function motif_minimal_meme(index) { - return motif_pspm(index).as_meme({ - "with_header": true, - "with_pspm": true, - "with_pssm": true, - "version": data["version"], - "alphabet": meme_alphabet, - "strands": (meme_alphabet.has_complement() && data.options.revcomp ? 2 : 1) - }); -} - -function motif_fasta(index) { - "use strict"; - var motif, sites, site, seq, sequences, sequence, i, num, counter, out; - counter = {}; - sequences = data["sequence_db"]["sequences"]; - motif = data["motifs"][index]; - sites = motif["sites"]; - out = ""; - for (i = 0; i < sites.length; i++) { - site = sites[i]; - seq = site["seq"]; - sequence = sequences[seq]; - counter[seq] = (num = counter[seq]) ? (++num) : (num = 1); // inc counter - if (i !== 0) {out += "\n";} - out += ">" + sequence["name"] + "_site_" + num + " offset= " + site["pos"] + - (site["rc"] ? " RC\n" : "\n"); - out += site["match"]; - } - return out; -} - -function motif_raw(index) { - "use strict"; - var sites, i, out; - sites = data["motifs"][index]["sites"]; - out = ""; - for (i = 0; i < sites.length; i++) { - if (i !== 0) {out += "\n";} - out += sites[i]["match"]; - } - return out; -} - -function clone_template(template) { - "use strict"; - var node, help_btns, i, button; - node = $(template).cloneNode(true); - toggle_class(node, "template", false); - node.id = ""; - help_btns = node.querySelectorAll(".help"); - for (i = 0; i < help_btns.length; i++) { - button = help_btns[i]; - if (button.hasAttribute("data-topic")) { - button.tabIndex = "0"; - button.addEventListener("click", __toggle_help, false); - button.addEventListener("keydown", __toggle_help, false); - } - } - return node; -} - -function set_tvar(template, tvar, value) { - var node; - node = find_child(template, tvar); - if (node === null) { - throw new Error("Template does not contain variable " + tvar); - } - node.innerHTML = ""; - if (typeof value !== "object") { - node.appendChild(document.createTextNode(value)); - } else { - node.appendChild(value); - } -} - -function make_logo(alphabet, pspm, rc, offset, className) { - if (rc) pspm = pspm.copy().reverse_complement(alphabet); - var logo = new Logo(alphabet, ""); - logo.add_pspm(pspm, offset); - var canvas = document.createElement('canvas'); - canvas.height = 50; - canvas.width = 0; - canvas.className = className; - size_logo_on_canvas(logo, canvas, false); - add_draw_task(canvas, new DelayLogoTask(logo, canvas)); - return canvas; -} - -function make_small_logo(alphabet, pspm, options) { - if (typeof options === "undefined") options = {}; - if (options.rc) pspm = pspm.copy().reverse_complement(alphabet); - var logo = new Logo(alphabet, {x_axis: false, y_axis: false}); - logo.add_pspm(pspm, (typeof options.offset === "number" ? options.offset : 0)); - var canvas = document.createElement('canvas'); - if (typeof options.className === "string") canvas.className = options.className; - if (typeof options.width === "number" && options.width > 0) { - canvas.height = 0; - canvas.width = options.width; - draw_logo_on_canvas(logo, canvas, false); - } else { - draw_logo_on_canvas(logo, canvas, false, 1/3); - } - return canvas; -} - -function make_large_logo(alphabet, pspm, rc, offset, className) { - if (rc) pspm = pspm.copy().reverse_complement(alphabet); - var logo = new Logo(alphabet, ""); - logo.add_pspm(pspm, offset); - var canvas = document.createElement('canvas'); - canvas.height = 200; - canvas.width = 0; - canvas.className = className; - size_logo_on_canvas(logo, canvas, false); - add_draw_task(canvas, new DelayLogoTask(logo, canvas)); - return canvas; -} - -function make_sym_btn(symbol, title, action) { - var box; - box = document.createElement("div"); - box.tabIndex = 0; - box.className = "sym_btn"; - box.appendChild(document.createTextNode(symbol)); - box.title = title; - box.addEventListener('click', action, false); - box.addEventListener('keydown', action, false); - return box; -} - -function make_seq(alphabet, seq) { - var i, j, letter, lbox, sbox; - sbox = document.createElement("span"); - for (i = 0; i < seq.length; i = j) { - letter = seq.charAt(i); - for (j = i+1; j < seq.length; j++) { - if (seq.charAt(j) !== letter) { - break; - } - } - lbox = document.createElement("span"); - lbox.style.color = alphabet.get_colour(alphabet.get_index(letter)); - lbox.appendChild(document.createTextNode(seq.substring(i, j))); - sbox.appendChild(lbox); - } - return sbox; -} - -// -// make_pv_text -// -// Returns the string p-value, with the p italicised. -/// -function make_pv_text() { - var pv_text = document.createElement("span"); - var pv_italic_text = document.createElement("span"); - pv_italic_text.appendChild(document.createTextNode("p")); - pv_italic_text.style.fontStyle = "italic"; - pv_text.appendChild(pv_italic_text); - pv_text.appendChild(document.createTextNode("-value")); - return pv_text; -} - -function append_site_entries(tbody, motif, site_index, count) { - "use strict"; - var i, end; - var sites, site, sequences, sequence; - var rbody; - if (typeof count !== "number") { - count = 20; - } - sequences = data["sequence_db"]["sequences"]; - sites = motif["sites"]; - end = Math.min(site_index + count, sites.length); - for (i = site_index; i < end; i++) { - site = sites[i]; - sequence = sequences[site["seq"]]; - - rbody = tbody.insertRow(tbody.rows.length); - add_text_cell(rbody, "" + (site["seq"] + 1) + ".", "site_num"); - add_text_cell(rbody, sequence["name"], "site_name"); - add_text_cell(rbody, site["rc"] ? "-" : "+", "site_strand"); - add_text_cell(rbody, site["pos"] + 1, "site_start"); - add_text_cell(rbody, site["pvalue"].toExponential(2), "site_pvalue"); - add_text_cell(rbody, site["lflank"], "site lflank"); - add_cell(rbody, make_seq(meme_alphabet, site["match"]), "site match"); - add_text_cell(rbody, site["rflank"], "site rflank"); - } - return i; -} - -function make_site_entries() { - "use strict"; - var region; - region = this; - if (region.data_site_index >= region.data_motif["sites"].length) { - // all sites created - region.removeEventListener('scroll', make_site_entries, false); - return; - } - // if there's still 100 pixels to scroll than don't do anything yet - if (region.scrollHeight - (region.scrollTop + region.offsetHeight) > 100) { - return; - } - - region.data_site_index = append_site_entries( - find_child(region, "sites_tbl").tBodies[0], - region.data_motif, region.data_site_index, 20 - ); -} - -function make_sites(motif) { - "use strict"; - function add_site_header(row, title, nopad, help_topic, tag_class) { - var div, divcp, th; - th = document.createElement("th"); - div = document.createElement("div"); - div.className = "sites_th_inner"; - if (typeof title !== "object") { - title = document.createTextNode("" + title); - } - div.appendChild(title); - if (help_topic) { - div.appendChild(document.createTextNode("\xA0")); - div.appendChild(help_button(help_topic)); - } - divcp = div.cloneNode(true); - divcp.className = "sites_th_hidden"; - th.appendChild(div); - th.appendChild(divcp); - if (nopad) { - th.className = "nopad"; - } - if (tag_class) { - th.className += " " + tag_class; - } - row.appendChild(th); - } - var outer_tbl, inner_tbl, tbl, thead, tbody, rhead; - - outer_tbl = document.createElement("div"); - outer_tbl.className = "sites_outer"; - - inner_tbl = document.createElement("div"); - inner_tbl.className = "sites_inner"; - outer_tbl.appendChild(inner_tbl); - - tbl = document.createElement("table"); - tbl.className = "sites_tbl"; - inner_tbl.appendChild(tbl); - - thead = document.createElement("thead"); - tbl.appendChild(thead); - tbody = document.createElement("tbody"); - tbl.appendChild(tbody); - - rhead = thead.insertRow(thead.rows.length); - add_site_header(rhead, "", true); - add_site_header(rhead, "Name", false, "pop_seq_name"); - add_site_header(rhead, "Strand", false, "pop_site_strand", "site_strand_title"); - add_site_header(rhead, "Start", false, "pop_site_start"); - add_site_header(rhead, make_pv_text(), false, "pop_site_pvalue"); - add_site_header(rhead, "", false); - add_site_header(rhead, "Sites", true, "pop_site_match"); - add_site_header(rhead, "", false); - - inner_tbl.data_motif = motif; - inner_tbl.data_site_index = append_site_entries(tbody, motif, 0, 20); - if (inner_tbl.data_site_index < motif["sites"].length) { - inner_tbl.addEventListener('scroll', make_site_entries, false); - } - return outer_tbl; -} - -function make_motif_table_entry(row, alphabet, ordinal, motif, colw) { - "use strict"; - function ev_sig(evalue_str) { - "use strict"; - var ev_re, match, sig, exp, num; - ev_re = /^(.*)e(.*)$/; - if (match = ev_re.exec(evalue_str)) { - sig = parseFloat(match[1]); - exp = parseInt(match[2]); - if (exp >= 0) { - return false; - } else if (exp <= -3) { - return true; - } else { - return sig * Math.pow(10, exp) <= 0.05; - } - } - return true; - } - function make_preview(alphabet, motif) { - "use strict"; - var pspm, preview, preview_rc; - var box, btn_box, logo_box, btn_plus, btn_minus; - if (motif["preview_logo"]) { - preview = motif["preview_logo"]; - preview_rc = motif["preview_logo_rc"]; - } else { - pspm = new Pspm(motif["pwm"]); - preview = make_logo(alphabet, pspm); - motif["preview_logo"] = preview; - if (alphabet.has_complement()) { - preview_rc = make_logo(alphabet, pspm, true, 0, "logo_rc"); - motif["preview_logo_rc"] = preview_rc; - } - } - if (preview_rc) { - btn_plus = document.createElement("div"); - btn_plus.appendChild(document.createTextNode("+")); - btn_plus.className = "preview_btn plus"; - btn_plus.tabIndex = "0"; - btn_plus.addEventListener("click", action_btn_rc, false); - btn_plus.addEventListener("keydown", action_btn_rc, false); - btn_minus = document.createElement("div"); - btn_minus.appendChild(document.createTextNode("-")); - btn_minus.className = "preview_btn minus"; - btn_minus.tabIndex = "0"; - btn_minus.addEventListener("click", action_btn_rc, false); - btn_minus.addEventListener("keydown", action_btn_rc, false); - btn_box = document.createElement("div"); - btn_box.className = "preview_btn_box"; - btn_box.appendChild(btn_plus); - btn_box.appendChild(btn_minus); - } - logo_box = document.createElement("div"); - logo_box.className = "preview_logo_box"; - logo_box.appendChild(preview); - if (preview_rc) logo_box.appendChild(preview_rc); - box = document.createElement("div"); - box.className = "preview_box"; - if (preview_rc) box.appendChild(btn_box); - box.appendChild(logo_box); - if (preview_rc) { - if (motif["rc"]) { - btn_minus.className += " active"; - logo_box.className += " show_rc_logo"; - } else { - btn_plus.className += " active"; - } - } - return box; - } - var pspm, preview, preview_rc, c; - row.data_motif = motif; - row.data_ordinal = ordinal; - if (!ev_sig(motif["evalue"])) { - row.style.opacity = 0.4; - } - add_text_cell(row, "" + ordinal + ".", "motif_ordinal"); - add_cell(row, make_preview(alphabet, motif), "motif_logo"); - add_text_cell(row, motif["evalue"], "motif_evalue"); - add_text_cell(row, motif["nsites"], "motif_nsites"); - add_text_cell(row, motif["len"], "motif_width"); - add_cell(row, make_sym_btn("\u21A7", "Show more information.", - action_show_more), "motif_more"); - add_cell(row, - make_sym_btn("\u21E2", - "Submit the motif to another MEME Suite program or download it.", - action_show_outpop), - "motif_submit"); - if (colw) { - for (c = 0; c < row.cells.length; c++) { - row.cells[c].style.minWidth = colw[c] + "px"; - } - } -} - -function make_motifs_table(alphabet, start_ordinal, motifs, colw, stop_reason) { - var i, j; - var tbl, thead, tbody, tfoot, row, preview; - var motif, pspm; - - tbl = document.createElement("table"); - - thead = document.createElement("thead"); - tbl.appendChild(thead); - tbody = document.createElement("tbody"); - tbl.appendChild(tbody); - tfoot = document.createElement("tfoot"); - tbl.appendChild(tfoot); - - row = thead.insertRow(thead.rows.length); - add_text_header_cell(row, "", "", "motif_ordinal"); - add_text_header_cell(row, "Logo", "", "motif_logo"); - add_text_header_cell(row, "E-value", "pop_ev", "motif_evalue"); - add_text_header_cell(row, "Sites", "pop_sites", "motif_nsites"); - add_text_header_cell(row, "Width", "pop_width", "motif_width"); - add_text_header_cell(row, "More", "pop_more", "motif_more"); - add_text_header_cell(row, "Submit/Download", "pop_submit_dl", "motif_submit"); - - for (i = 0; i < motifs.length; i++) { - row = tbody.insertRow(tbody.rows.length); - make_motif_table_entry(row, alphabet, start_ordinal + i, motifs[i], colw); - } - - row = tfoot.insertRow(tfoot.rows.length); - add_text_header_cell(row, stop_reason, "", "stop_reason", "", 6); - - return tbl; -} - -function make_expanded_motif(alphabet, ordinal, motif, less_x, submit_x) { - "use strict"; - var box, pspm, logo_box, large_logo, large_logo_rc, tab_logo, tab_logo_rc; - var btn, offset, norc; - - box = clone_template("tmpl_motif_expanded"); - box.data_motif = motif; - box.data_ordinal = ordinal; - - pspm = new Pspm(motif["pwm"]); - if (typeof motif["rc"] !== "boolean") { - motif["rc"] = false; - } - if (motif["large_logo"]) { - large_logo = motif["large_logo"]; - large_logo_rc = motif["large_logo_rc"]; - } else { - large_logo = make_large_logo(alphabet, pspm, false, 0); - motif["large_logo"] = large_logo; - if (alphabet.has_complement()) { - large_logo_rc = make_large_logo(alphabet, pspm, true, 0, "logo_rc"); - motif["large_logo_rc"] = large_logo_rc; - } - } - norc = (large_logo_rc == null); - toggle_class(box, "norc", norc); - - logo_box = find_child(box, "tvar_logo"); - logo_box.appendChild(large_logo); - if (large_logo_rc) logo_box.appendChild(large_logo_rc); - toggle_class(logo_box, "show_rc_logo", motif["rc"]); - - tab_logo = find_child(box, "tvar_tab"); - tab_logo_rc = find_child(box, "tvar_tab_rc"); - - toggle_class(tab_logo, "activeTab", !motif["rc"]); - toggle_class(tab_logo_rc, "activeTab", motif["rc"]); - - tab_logo.addEventListener('click', action_rc_tab, false); - tab_logo.addEventListener('keydown', action_rc_tab, false); - tab_logo_rc.addEventListener('click', action_rc_tab, false); - tab_logo_rc.addEventListener('keydown', action_rc_tab, false); - - set_tvar(box, "tvar_ordinal", ordinal); - set_tvar(box, "tvar_evalue", motif["evalue"]); - set_tvar(box, "tvar_width", motif["len"]); - set_tvar(box, "tvar_site_count", motif["nsites"]); - set_tvar(box, "tvar_llr", motif["llr"]); - set_tvar(box, "tvar_ic", motif["ic"]); - set_tvar(box, "tvar_re", motif["re"]); - set_tvar(box, "tvar_bt", motif["bt"]); - set_tvar(box, "tvar_sites", make_sites(motif)); - - offset = 32; // 1* 5px padding + 2 * 10px padding + 2 * 2px border + 3px ?? - - btn = find_child(box, "tvar_less"); - btn.style.left = (less_x - offset) + "px"; - btn.addEventListener('click', action_show_less, false); - btn.addEventListener('keydown', action_show_less, false); - btn = find_child(box, "tvar_submit"); - btn.style.left = (submit_x - offset) + "px"; - btn.addEventListener('click', action_show_outpop, false); - btn.addEventListener('keydown', action_show_outpop, false); - return box; -} - - -// -// -/// -function make_motifs() { - "use strict"; - function pixel_value(str_in) { - "use strict"; - var px_re, match; - px_re = /^(\d+)px$/; - if (match = px_re.exec(str_in)) { - return parseInt(match[1], 10); - } - return 0; - } - var container, tbl; - var colw, r, row, c, cell, cell_style, pad_left, pad_right; - - // make the motifs table - container = $("motifs"); - container.innerHTML = ""; // clear content - - tbl = make_motifs_table(meme_alphabet, 1, data["motifs"], colw, data["stop_reason"]); - container.appendChild(tbl); - - // measure table column widths - colw = []; - row = tbl.tBodies[0].rows[0]; - for (c = 0; c < row.cells.length; c++) { - var padLeft, padRight; - cell = row.cells[c]; - cell_style = window.getComputedStyle(cell, null); - pad_left = pixel_value(cell_style.getPropertyValue("padding-left")); - pad_right = pixel_value(cell_style.getPropertyValue("padding-right")); - colw[c] = cell.clientWidth - pad_left - pad_right; - if (typeof colw[c] !== "number" || colw[c] < 0) { - colw[c] = 1; - } - } - - // set minimum table column widths on each row so later when we remove rows it still aligns - for (r = 0; r < tbl.tBodies[0].rows.length; r++) { - row = tbl.tBodies[0].rows[r]; - for (c = 0; c < row.cells.length; c++) { - row.cells[c].style.minWidth = colw[c] + "px"; - } - } - - // store the table column widths so we can create rows latter with the same minimums - container.data_colw = colw; - - // calculate the x offset for the buttons - row = tbl.tBodies[0].rows[0]; - container.data_more_x = coords(find_child(find_child(row, "motif_more"), "sym_btn"))[0]; - container.data_submit_x = coords(find_child(find_child(row, "motif_submit"), "sym_btn"))[0]; - - draw_on_screen(); -} - -function make_meme_block(container, max_seq_len, is_scan, site) { - "use strict"; - var motif = data.motifs[site.motif]; - var block = make_block(container, max_seq_len, site.pos, motif.len, - site.pvalue, site.rc, site.motif, is_scan); - var handler = (is_scan ? - make_scan_popup(site, motif, block) : - make_block_popup(site, motif, block)); - block.addEventListener("mouseover", handler, false); - block.addEventListener("mouseout", handler, false); -} - -function append_blocks_entries(tbody, seq_index, count) { - "use strict"; - var i, end, j; - var max_pvalue, max_block_height, max_seq_len, sequences; - var sequence, sites, scans, scan; - var container, plus, minus, rule, row; - // define some constants - max_seq_len = data.sequence_db.max_length; - // determine how many to load - end = Math.min(seq_index + count, data.sequence_db.sequences.length); - for (i = seq_index; i < end; i++) { - // get the sequence - sequence = data.sequence_db.sequences[i]; - // make the containers for the block diagram - container = make_block_container(meme_alphabet.has_complement(), - data.options.revcomp, max_seq_len, sequence.length); - // create blocks for the motif sites - sites = sequence["sites"]; - for (j = 0; j < sites.length; j++) - make_meme_block(container, max_seq_len, false, sites[j]); - // create blocks for the scanned sites - scan = data.scan[i]; - for (j = 0; j < scan.sites.length; j++) - make_meme_block(container, max_seq_len, true, scan.sites[j]); - // create a row for the sequence - row = tbody.insertRow(tbody.rows.length); - toggle_class(row, "empty_seq", sites.length == 0 && scan.sites.length == 0); - toggle_class(row, "only_scan", sites.length == 0 && scan.sites.length > 0); - add_text_cell(row, (i + 1) + ".", "blockdiag_num"); - add_text_cell(row, sequence["name"], "blockdiag_name"); - add_text_cell(row, scan["pvalue"].toExponential(2), "blockdiag_pvalue"); - add_cell(row, container, "block_td"); - } - return end; -} - -function make_blocks_entries() { - "use strict"; - var region; - region = this; - if (region.data_blocks_index >= data["sequence_db"]["sequences"].length) { - // all sites created - region.removeEventListener('scroll', make_blocks_entries, false); - return; - } - // if there's still 100 pixels to scroll than don't do anything yet - if (region.scrollHeight - (region.scrollTop + region.offsetHeight) > 100) { - return; - } - - region.data_blocks_index = append_blocks_entries( - find_child(region, "blocks_tbl").tBodies[0], - region.data_blocks_index, 20 - ); -} - -function make_blocks() { - "use strict"; - function add_seqs_filter(container, id, checked, label_text, help_topic) { - "use strict"; - var label, radio; - radio = document.createElement("input"); - radio.type = "radio"; - radio.name = "seqs_display"; - radio.id = id; - radio.checked = checked; - radio.addEventListener('click', action_seqs_filter, false); - label = document.createElement("label"); - label.appendChild(document.createTextNode(label_text)); - label.htmlFor = id; - container.appendChild(radio); - container.appendChild(label); - if (help_topic) { - container.appendChild(document.createTextNode("\xA0")); - container.appendChild(help_button(help_topic)); - } - } - function add_blocks_header(row, title, nopad, help_topic) { - "use strict"; - var div, divcp, th; - th = document.createElement("th"); - div = document.createElement("div"); - div.className = "blocks_th_inner"; - if (typeof title !== "object") { - title = document.createTextNode("" + title); - } - div.appendChild(title); - if (help_topic) { - div.appendChild(document.createTextNode("\xA0")); - div.appendChild(help_button(help_topic)); - } - divcp = div.cloneNode(true); - divcp.className = "blocks_th_hidden"; - th.appendChild(div); - th.appendChild(divcp); - if (nopad) { - th.className = "nopad"; - } - row.appendChild(th); - } - var container; - var page, view_height, outer_tbl, inner_tbl, tbl, thead, tbody, rhead; - var in_view, i, seq_count; - - page = (document.compatMode === "CSS1Compat") ? document.documentElement : document.body; - view_height = Math.max(page.clientHeight - 300, 300); - - container = $("blocks"); - toggle_class(container, "hide_empty_seqs", true); - toggle_class(container, "hide_only_scan", true); - container.innerHTML = ""; - add_seqs_filter(container, "rdo_sites_only", true, "Only Motif Sites", "pop_motif_sites"); - add_seqs_filter(container, "rdo_sites_and_scan", false, "Motif Sites+Scanned Sites", "pop_scanned_sites"); - add_seqs_filter(container, "rdo_all_seqs", false, "All Sequences", "pop_all_sequences"); - - outer_tbl = document.createElement("div"); - outer_tbl.className = "blocks_outer"; - - inner_tbl = document.createElement("div"); - inner_tbl.id = "blocks_scroll"; - inner_tbl.className = "blocks_inner"; - inner_tbl.style.maxHeight = view_height + "px"; - outer_tbl.appendChild(inner_tbl); - - tbl = document.createElement("table"); - tbl.className = "blocks_tbl"; - inner_tbl.appendChild(tbl); - - thead = document.createElement("thead"); - tbl.appendChild(thead); - tbody = document.createElement("tbody"); - tbl.appendChild(tbody); - - rhead = thead.insertRow(thead.rows.length); - add_blocks_header(rhead, "", true); - add_blocks_header(rhead, "Name", false, "pop_seq_name"); - add_blocks_header(rhead, make_pv_text(), false, "pop_seq_pvalue"); - add_blocks_header(rhead, "Motif Location", false, "pop_motif_location"); - - container.appendChild(outer_tbl); - - - seq_count = data["sequence_db"]["sequences"].length; - in_view = Math.max(Math.ceil(view_height / 25), 1); - i = append_blocks_entries(tbody, 0, in_view); - - while (i < seq_count && inner_tbl.scrollHeight - (inner_tbl.scrollTop + inner_tbl.offsetHeight) < 400) { - i = append_blocks_entries(tbody, i, 20); - } - inner_tbl.data_blocks_index = i; - if (i < seq_count) { - inner_tbl.addEventListener('scroll', make_blocks_entries, false); - } -} - -function make_scan_popup(site, motif) { - return function (e) { - "use strict"; - var pop, xy, padding, edge_padding, pop_left, pop_top, page_width; - var lflank, match, rflank, pspm; - if (!e) var e = window.event; - pop = make_scan_popup.pop; - if (e.type === "mouseover") { - if (pop) return; - pop = clone_template("tmpl_scan_info"); - pspm = new Pspm(motif.pwm); - if (site.rc) pspm.reverse_complement(meme_alphabet); - set_tvar(pop, "tvar_logo", make_small_logo(meme_alphabet, pspm, {"className": "scan_logo"})); - set_tvar(pop, "tvar_motif", motif.id); - set_tvar(pop, "tvar_pvalue", site.pvalue.toExponential(2)); - set_tvar(pop, "tvar_start", site.pos + 1); - set_tvar(pop, "tvar_end", site.pos + motif.len); - - document.body.appendChild(pop); - position_popup(this, pop); - make_scan_popup.pop = pop; - } else if (e.type === "mouseout") { - if (pop) { - pop.parentNode.removeChild(pop); - make_scan_popup.pop = null; - } - } - }; -} - -function make_block_popup(site, motif, block) { - return function (e) { - "use strict"; - var pop; - var lflank, match, rflank, pspm, ruler, match_seq, match_width; - if (!e) var e = window.event; - pop = make_block_popup.pop; - if (e.type === "mouseover") { - if (pop) return; - pop = clone_template("tmpl_block_info"); - pspm = new Pspm(motif.pwm); - if (site.rc) { // must be dna - pspm.reverse_complement(meme_alphabet); - lflank = meme_alphabet.invcomp_seq(site.rflank); - match = meme_alphabet.invcomp_seq(site.match); - rflank = meme_alphabet.invcomp_seq(site.lflank); - } else { - lflank = site.lflank; - match = site.match; - rflank = site.rflank; - } - ruler = document.getElementById("measure_match"); - match_seq = make_seq(meme_alphabet, match); - ruler.innerHTML = ""; - ruler.appendChild(match_seq); - match_width = ruler.clientWidth; - ruler.removeChild(match_seq); - set_tvar(pop, "tvar_lflank", lflank); - set_tvar(pop, "tvar_match", match_seq); - set_tvar(pop, "tvar_rflank", rflank); - set_tvar(pop, "tvar_logo_pad", lflank); - set_tvar(pop, "tvar_logo", make_small_logo(meme_alphabet, pspm, {"width": match_width})); - set_tvar(pop, "tvar_motif", motif.id); - set_tvar(pop, "tvar_pvalue", site.pvalue.toExponential(2)); - set_tvar(pop, "tvar_start", site.pos + 1); - set_tvar(pop, "tvar_end", site.pos + motif.len); - - document.body.appendChild(pop); - position_popup(block, pop); - make_block_popup.pop = pop; - } else if (e.type === "mouseout") { - if (pop) { - pop.parentNode.removeChild(pop); - make_block_popup.pop = null; - } - } - }; -} - -function update_outpop_format(index) { - switch(parseInt($("text_format").value)) { - case 0: // count matrix - $("outpop_text").value = motif_count_matrix(index); - $("text_name").value = "motif_" + (index + 1) + "_counts.txt"; - break; - case 1: // prob matrix - $("outpop_text").value = motif_prob_matrix(index); - $("text_name").value = "motif_" + (index + 1) + "_freqs.txt"; - break; - case 2: // minimal meme - $("outpop_text").value = motif_minimal_meme(index); - $("text_name").value = "motif_" + (index + 1) + ".txt"; - break; - case 3: // fasta - $("outpop_text").value = motif_fasta(index); - $("text_name").value = "motif_" + (index + 1) + "_fasta.txt"; - break; - case 4: // raw - $("outpop_text").value = motif_raw(index); - $("text_name").value = "motif_" + (index + 1) + "_raw.txt"; - break; - default: - throw new Error("Unknown motif format"); - } -} - -function update_outpop_motif(index) { - "use strict"; - var motifs, motif, pspm, logo, canvas, num; - motifs = data["motifs"]; - if (index < 0 || index >= motifs.length) {return;} - current_motif = index; - motif = motifs[index]; - pspm = new Pspm(motif["pwm"]); - logo = new Logo(meme_alphabet, ""); - logo.add_pspm(pspm, 0); - canvas = $("outpop_logo"); - canvas.width = canvas.width; // clear canvas - draw_logo_on_canvas(logo, canvas, false); - if (meme_alphabet.has_complement()) { - pspm.reverse_complement(meme_alphabet); - logo = new Logo(meme_alphabet, ""); - canvas = $("outpop_logo_rc"); - canvas.width = canvas.width; // clear canvas - draw_logo_on_canvas(logo, canvas, false); - } - num = $("outpop_num"); - num.innerHTML = ""; - num.appendChild(document.createTextNode("" + (index + 1))); - update_outpop_format(index); -} - -// -// action_show_more -// -// Show more information on the motif. -/// -function action_show_more(e) { - var node, tr, tbody, table, container, motif, ordinal; - var expanded_motif; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - // find the row that contains the cell - node = this; - do { - if (node.tagName === "TR") break; - } while (node = node.parentNode); - if (!node) throw new Error("Expected to find row!?"); - tr = node; - // get info - motif = tr.data_motif; - ordinal = tr.data_ordinal; - // find tbody - do { - if (node.tagName === "TBODY") break; - } while (node = node.parentNode); - if (!node) throw new Error("Expected to find tbody!?"); - tbody = node; - // find table - do { - if (node.tagName === "TABLE") break; - } while (node = node.parentNode); - if (!node) throw new Error("Expected to find table!?"); - table = node; - // find container - container = node.parentNode; - // make a expanded motif - motif["expanded"] = true; - expanded_motif = make_expanded_motif(meme_alphabet, ordinal, motif, - container.data_more_x, container.data_submit_x); - // now determine how to place it - if (tbody.rows.length === 1) { - // only us in the table so the table can be replaced - container.replaceChild(expanded_motif, table); - } else if (tbody.rows[0] === tr) { - // first row, so remove and insert an expanded motif before - table.deleteRow(tr.rowIndex); - container.insertBefore(expanded_motif, table); - } else if (tbody.rows[tbody.rows.length -1] === tr) { - // last row, so remove and insert an expanded motif after - table.deleteRow(tr.rowIndex); - container.insertBefore(expanded_motif, table.nextSibling); - } else { - var table2, tbody2; - table2 = table.cloneNode(false); - table2.appendChild(table.tHead.cloneNode(true)); - tbody2 = table.tBodies[0].cloneNode(false); - table2.appendChild(tbody2); - container.insertBefore(table2, table.nextSibling); - for (i = tbody.rows.length - 1; i >= 0; i--) { - row = tbody.rows[i]; - row.parentNode.removeChild(row); - if (row === tr) { - break; - } - tbody2.insertBefore(row, tbody2.rows[0]); - } - container.insertBefore(expanded_motif, table2); - } - find_child(expanded_motif, "tvar_less").focus(); -} - -// -// action_show_less -// -// Show less information on the motif. -/// -function action_show_less(e) { - var btn; - var expanded_motif, container, motif, ordinal, colw, focus_target; - var table, tbody, tbody2, row, table_before, table_after; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - btn = this; - // find expanded motif - expanded_motif = find_parent(btn, "expanded_motif"); - if (!expanded_motif) throw new Error("Expected expanded motif."); - // find the container - container = expanded_motif.parentNode; - // get data - motif = expanded_motif.data_motif; - ordinal = expanded_motif.data_ordinal; - colw = container.data_colw; - // get the table before - table_before = expanded_motif.previousSibling; - if (table_before && table_before.tagName !== "TABLE") { - table_before = null; - } - // get the table after - table_after = expanded_motif.nextSibling; - if (table_after && table_after.tagName !== "TABLE") { - table_after = null; - } - // see if there is a table below or above that we can put this in. - // if there is a table both below and above then add this motif and - // all ones below to the above table - motif["expanded"] = false; - if (table_before && table_after) { - tbody = table_before.tBodies[0]; - row = tbody.insertRow(tbody.rows.length); - make_motif_table_entry(row, meme_alphabet, ordinal, motif, colw); - focus_target = find_child(row.cells[5], "sym_btn"); - container.removeChild(expanded_motif); - tbody2 = table_after.tBodies[0]; - while (tbody2.rows.length > 0) { - row = tbody2.rows[0]; - row.parentNode.removeChild(row); - tbody.appendChild(row); - } - container.removeChild(table_after); - } else if (table_before) { - tbody = table_before.tBodies[0]; - row = tbody.insertRow(tbody.rows.length); - make_motif_table_entry(row, meme_alphabet, ordinal, motif, colw); - focus_target = find_child(row.cells[5], "sym_btn"); - container.removeChild(expanded_motif); - } else if (table_after) { - tbody = table_after.tBodies[0]; - row = tbody.insertRow(0); - make_motif_table_entry(row, meme_alphabet, ordinal, motif, colw); - focus_target = find_child(row.cells[5], "sym_btn"); - container.removeChild(expanded_motif); - } else { - //no table above or below! - // make a new table - table = make_motifs_table(meme_alphabet, ordinal, [motif], colw, data["stop_reason"]); - focus_target = find_child(table.tBodies[0].rows[0].cells[5], "sym_btn"); - container.replaceChild(table, expanded_motif); - } - focus_target.focus(); -} - -function action_show_outpop(e) { - "use strict"; - function init() { - "use strict"; - var close_btn, next_btn, prev_btn, cancel_btn, do_btn; - var tab1, tab2, tab3; - var pnl1, pnl2, pnl3; - var format_list; - var tbl_submit, inputs, i, default_prog; - close_btn = $("outpop_close"); - close_btn.addEventListener("click", action_hide_outpop, false); - close_btn.addEventListener("keydown", action_hide_outpop, false); - next_btn = $("outpop_next"); - next_btn.addEventListener("click", action_outpop_next, false); - next_btn.addEventListener("keydown", action_outpop_next, false); - prev_btn = $("outpop_prev"); - prev_btn.addEventListener("click", action_outpop_prev, false); - prev_btn.addEventListener("keydown", action_outpop_prev, false); - cancel_btn = $("outpop_cancel"); - cancel_btn.addEventListener("click", action_hide_outpop, false); - do_btn = $("outpop_do"); - do_btn.addEventListener("click", action_outpop_submit, false); - tab1 = $("outpop_tab_1"); - tab1.tabIndex = 0; - tab1.addEventListener("click", action_outpop_tab, false); - tab1.addEventListener("keydown", action_outpop_tab, false); - tab2 = $("outpop_tab_2"); - tab2.tabIndex = 0; - tab2.addEventListener("click", action_outpop_tab, false); - tab2.addEventListener("keydown", action_outpop_tab, false); - tab3 = $("outpop_tab_3"); - tab3.tabIndex = 0; - tab3.addEventListener("click", action_outpop_tab, false); - tab3.addEventListener("keydown", action_outpop_tab, false); - pnl1 = $("outpop_pnl_1"); - pnl2 = $("outpop_pnl_2"); - pnl3 = $("outpop_pnl_3"); - toggle_class(tab1, "activeTab", true); - toggle_class(tab2, "activeTab", false); - toggle_class(tab3, "activeTab", false); - pnl1.style.display = "block"; - pnl2.style.display = "none"; - pnl3.style.display = "none"; - format_list = $("text_format"); - format_list.addEventListener("change", action_outpop_format, false); - // setup program selection - tbl_submit = $("programs"); - // when not dna, hide the inputs for programs that require dna motifs - toggle_class(tbl_submit, "alphabet_dna", meme_alphabet.has_complement());//TODO FIXME alphabet_dna is a bad name for a field when allowing custom alphabets - // add a click listener for the radio buttons - inputs = tbl_submit.querySelectorAll("input[type='radio']"); - for (i = 0; i < inputs.length; i++) { - inputs[i].addEventListener("click", action_outpop_program, false); - } - // ensure that a default program option is selected for DNA and Protein - default_prog = document.getElementById(meme_alphabet.has_complement() ? "submit_tomtom" : "submit_fimo"); //TODO FIXME Tomtom might require a more strict definition of DNA - default_prog.checked = true; - action_outpop_program.call(default_prog); - // disable reverse-complement when not DNA - $("logo_rc_option").disabled = !meme_alphabet.has_complement(); - // set errorbars on when ssc is on - $("logo_ssc").addEventListener("change", action_outpop_ssc, false); - } - var node; - // store the focused element - action_hide_outpop.last_active = document.activeElement; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - // hide the help popup - help_popup(); - // on first load initilize the popup - if (!action_show_outpop.ready) { - init(); - action_show_outpop.ready = true; - } - // load the motif logo - node = this; - do { - if (/\bexpanded_motif\b/.test(node.className) || node.tagName === "TR") break; - } while (node = node.parentNode); - if (node === null) throw new Error("Expected node!"); - update_outpop_motif(node.data_ordinal - 1); - // display the download popup - $("grey_out_page").style.display = "block"; - $("download").style.display = "block"; - $("outpop_close").focus(); -} - -function action_hide_outpop(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - $("download").style.display = "none"; - $("grey_out_page").style.display = "none"; - if (typeof action_hide_outpop.last_active !== "undefined") { - action_hide_outpop.last_active.focus(); - } -} - -function action_outpop_next(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - update_outpop_motif(current_motif + 1); -} - -function action_outpop_prev(e) { - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - update_outpop_motif(current_motif - 1); -} - -function action_outpop_program() { - "use strict"; - var table, tr, rows, i; - tr = find_parent_tag(this, "TR"); - table = find_parent_tag(tr, "TABLE"); - rows = table.querySelectorAll("tr"); - for (i = 0; i < rows.length; i++) { - toggle_class(rows[i], "selected", rows[i] === tr); - } -} - -function action_outpop_ssc() { - "use strict"; - $("logo_err").value = $("logo_ssc").value; -} - -function action_outpop_submit(e) { - "use strict"; - var form, input, program, motifs; - // find out which program is selected - var radios, i; - radios = document.getElementsByName("program"); - program = "fimo"; // default to fimo, since it works with all alphabet types - for (i = 0; i < radios.length; i++) { - if (radios[i].checked) program = radios[i].value; - } - - motifs = motif_minimal_meme(current_motif); - form = document.createElement("form"); - form.setAttribute("method", "post"); - form.setAttribute("action", site_url + "/tools/" + program); - - input = document.createElement("input"); - input.setAttribute("type", "hidden"); - input.setAttribute("name", "motifs_embed"); - input.setAttribute("value", motifs); - form.appendChild(input); - - document.body.appendChild(form); - form.submit(); - document.body.removeChild(form); -} - -function action_outpop_download_motif(e) { - $("text_form").submit(); -} - -function action_outpop_download_logo(e) { - "use strict"; - $("logo_motifs").value = motif_minimal_meme(current_motif); - $("logo_form").submit(); -} - -function action_btn_rc(e) { - "use strict"; - var node, tr, motif, box, logo_box, tab_st, tab_rc, rc; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - node = this; - do { - if (node.tagName === "TR") break; - } while (node = node.parentNode); - if (!node) throw new Error("Expected to find row!?"); - tr = node; - // get info - motif = tr.data_motif; - box = find_parent(this, "preview_box"); - logo_box = find_child(box, "preview_logo_box"); - tab_st = find_child(box, "plus"); - tab_rc = find_child(box, "minus"); - rc = (this === tab_rc); - motif["rc"] = rc; - toggle_class(logo_box, "show_rc_logo", rc); - toggle_class(tab_st, "active", !rc); - toggle_class(tab_rc, "active", rc); -} - -function action_rc_tab(e) { - "use strict"; - var box, logo_box, tab_st, tab_rc, rc; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - box = find_parent(this, "expanded_motif"); - logo_box = find_child(box, "tvar_logo"); - tab_st = find_child(box, "tvar_tab"); - tab_rc = find_child(box, "tvar_tab_rc"); - rc = (this === tab_rc); - box.data_motif["rc"] = rc; - toggle_class(logo_box, "show_rc_logo", rc); - toggle_class(tab_st, "activeTab", !rc); - toggle_class(tab_rc, "activeTab", rc); -} - -function action_outpop_tab(e) { - "use strict"; - var tab1, tab2, tab3, pnl1, pnl2, pnl3, do_btn; - if (!e) e = window.event; - if (e.type === "keydown") { - if (e.keyCode !== 13 && e.keyCode !== 32) { - return; - } - // stop a submit or something like that - e.preventDefault(); - } - tab1 = $("outpop_tab_1"); - tab2 = $("outpop_tab_2"); - tab3 = $("outpop_tab_3"); - pnl1 = $("outpop_pnl_1"); - pnl2 = $("outpop_pnl_2"); - pnl3 = $("outpop_pnl_3"); - do_btn = $("outpop_do"); - - toggle_class(tab1, "activeTab", (this === tab1)); - toggle_class(tab2, "activeTab", (this === tab2)); - toggle_class(tab3, "activeTab", (this === tab3)); - pnl1.style.display = ((this === tab1) ? "block" : "none"); - pnl2.style.display = ((this === tab2) ? "block" : "none"); - pnl3.style.display = ((this === tab3) ? "block" : "none"); - do_btn.value = ((this === tab1) ? "Submit" : "Download"); - do_btn.removeEventListener("click", action_outpop_submit, false); - do_btn.removeEventListener("click", action_outpop_download_logo, false); - do_btn.removeEventListener("click", action_outpop_download_motif, false); - if (this === tab1) { - do_btn.addEventListener("click", action_outpop_submit, false); - } else if (this === tab2) { - do_btn.addEventListener("click", action_outpop_download_motif, false); - } else { - do_btn.addEventListener("click", action_outpop_download_logo, false); - } -} - -function action_seqs_filter() { - "use strict"; - var block_container; - block_container = $("blocks"); - if ($("rdo_all_seqs").checked) { - toggle_class(block_container, "hide_empty_seqs", false); - toggle_class(block_container, "hide_only_scan", false); - } else if ($("rdo_sites_and_scan").checked) { - toggle_class(block_container, "hide_empty_seqs", true); - toggle_class(block_container, "hide_only_scan", false); - } else if ($("rdo_sites_only").checked) { - toggle_class(block_container, "hide_empty_seqs", true); - toggle_class(block_container, "hide_only_scan", true); - } -} - -function action_outpop_format() { - update_outpop_format(current_motif); -} - -// -// page_loaded -// -// Called when the page has loaded for the first time. -/// -function page_loaded() { - post_load_setup(); -} - -// -// page_loaded -// -// Called when a cached page is reshown. -/// -function page_shown(e) { - if (e.persisted) post_load_setup(); -} - -// -// page_loaded -// -// Called when the page is resized -/// -function page_resized() { - var page, blocks_scroll; - update_scroll_pad(); - page = (document.compatMode === "CSS1Compat") ? document.documentElement : document.body; - blocks_scroll = $("blocks_scroll"); - if (blocks_scroll) { - blocks_scroll.style.maxHeight = Math.max(page.clientHeight - 300, 300) + "px"; - } -} - -// -// pre_load_setup -// -// Run before the page is displayed -/// -function pre_load_setup() { - var start, hue, sat, light, divisions; - var i, j, motifs, motif, sites, site, sequences, sequence; - var max_seq_len; - motifs = data["motifs"]; - sequences = data["sequence_db"]["sequences"]; - max_seq_len = 1; - for (i = 0; i < sequences.length; i++) { - sequence = sequences[i]; - sequence["sites"] = []; - if (sequence["length"] > max_seq_len) { - max_seq_len = sequence["length"]; - } - } - data["sequence_db"]["max_length"] = max_seq_len; - // use hsl colours - start = 0; //red - sat = 100; - light = 50; - for (i = 0; i < motifs.length; i++) { - motif = motifs[i]; - // give the motif a colour - divisions = 1 << Math.ceil(Math.log(i + 1) / Math.LN2); - hue = start + (360 / divisions) * ((i - (divisions >> 1)) * 2 + 1); - motif["colour"] = "hsl(" + hue + ", " + sat + "%, " + light + "%)"; - // associate sites with sequences as well - // to make generating the block diagram easier - sites = motif["sites"]; - for (j = 0; j < sites.length; j++) { - site = sites[j]; - sequence = sequences[site["seq"]]; - // record the motif index - site["motif"] = i; - // add the site to the sequence - sequence["sites"].push(site); - } - } -} - -// -// post_load_setup -// -// Run when the page has loaded, or been reloaded. -// -function post_load_setup() { - update_scroll_pad(); - if (data["motifs"].length > 0) { - make_motifs(); - make_blocks(); - } else { - $("motifs").innerHTML = "<p>No significant motifs found!</p>"; // clear content - $("motifs").innerHTML += "<p><b>" + data["stop_reason"] + "</b></p>"; - $("blocks").innerHTML = "<p>No significant motifs found!</p>"; - } -} - -pre_load_setup(); -</script> - <style> -/* The following is the content of meme.css */ -body { background-color:white; font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif;} - -div.help { - display: inline-block; - margin: 0px; - padding: 0px; - width: 12px; - height: 13px; - cursor: pointer; - background-image: url(data:image/gif;base64,R0lGODlhDAANAIABANR0AP///yH5BAEAAAEALAAAAAAMAA0AAAIdhI8Xy22MIFgv1DttrrJ7mlGNNo4c+aFg6SQuUAAAOw==); -} - -div.help:hover { - background-image: url(data:image/gif;base64,R0lGODlhDAANAKEAANR0AP///9R0ANR0ACH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEAAAIALAAAAAAMAA0AAAIdDGynCe3PgoxONntvwqz2/z2K2ImjR0KhmSIZUgAAOw==); -} - -p.spaced { line-height: 1.8em;} - -span.citation { font-family: "Book Antiqua", "Palatino Linotype", serif; color: #004a4d;} - -p.pad { padding-left: 30px; padding-top: 5px; padding-bottom: 10px;} - -td.jump { font-size: 13px; color: #ffffff; background-color: #00666a; - font-family: Georgia, "Times New Roman", Times, serif;} - -a.jump { margin: 15px 0 0; font-style: normal; font-variant: small-caps; - font-weight: bolder; font-family: Georgia, "Times New Roman", Times, serif;} - -h2.mainh {font-size: 1.5em; font-style: normal; margin: 15px 0 0; - font-variant: small-caps; font-family: Georgia, "Times New Roman", Times, serif;} - -h2.line {border-bottom: 1px solid #CCCCCC; font-size: 1.5em; font-style: normal; - margin: 15px 0 0; padding-bottom: 3px; font-variant: small-caps; - font-family: Georgia, "Times New Roman", Times, serif;} - -h4 {border-bottom: 1px solid #CCCCCC; font-size: 1.2em; font-style: normal; - margin: 10px 0 0; padding-bottom: 3px; font-family: Georgia, "Times New Roman", Times, serif;} - -h5 {margin: 0px} - -a.help { font-size: 9px; font-style: normal; text-transform: uppercase; - font-family: Georgia, "Times New Roman", Times, serif;} - -div.pad { padding-left: 30px; padding-top: 5px; padding-bottom: 10px;} - -div.pad1 { margin: 10px 5px;} - -div.pad2 { margin: 25px 5px 5px;} -h2.pad2 { padding: 25px 5px 5px;} - -div.pad3 { padding: 5px 0px 10px 30px;} - -div.box { border: 2px solid #CCCCCC; padding:10px; overflow: hidden;} - -div.bar { border-left: 7px solid #00666a; padding:5px; margin-top:25px; } - -div.subsection {margin:25px 0px;} - -img {border:0px none;} - -th.majorth {text-align:left;} -th.minorth {font-weight:normal; text-align:left; width:8em; padding: 3px 0px;} -th.actionth {font-weight:normal; text-align:left;} - -.explain h5 {font-size:1em; margin-left: 1em;} - -div.doc {margin-left: 2em; margin-bottom: 3em;} - -th.trainingset { - border-bottom: thin dashed black; - font-weight:normal; - padding:0px 10px; -} -div.pop_content { - position:absolute; - z-index:50; - width:300px; - padding: 5px; - background: #E4ECEC; - font-size: 12px; - font-family: Arial; - border-style: double; - border-width: 3px; - border-color: #AA2244; - display:none; -} - -div.pop_content > *:first-child { - margin-top: 0px; -} - -div.pop_content h1, div.pop_content h2, div.pop_content h3, div.pop_content h4, -div.pop_content h5, div.pop_content h6, div.pop_content p { - margin: 0px; -} - -div.pop_content p + h1, div.pop_content p + h2, div.pop_content p + h3, -div.pop_content p + h4, div.pop_content p + h5, div.pop_content p + h6 { - margin-top: 5px; -} - -div.pop_content p + p { - margin-top: 5px; -} - -div.pop_content > *:last-child { - margin-bottom: 0px; -} - -div.pop_content div.pop_close { - /* old definition */ - float:right; - bottom: 0; -} - -div.pop_content span.pop_close, div.pop_content span.pop_back { - display: inline-block; - border: 2px outset #661429; - background-color: #CCC; - padding-left: 1px; - padding-right: 1px; - padding-top: 0px; - padding-bottom: 0px; - cursor: pointer; - color: #AA2244; /*#661429;*/ - font-weight: bold; -} - -div.pop_content span.pop_close:active, div.pop_content span.pop_back:active { - border-style: inset; -} - -div.pop_content span.pop_close { - float:right; - /*border: 2px outset #AA002B;*/ - /*color: #AA2244;*/ -} - -div.pop_content:not(.nested) .nested_only { - display: none; -} - -div.pop_back_sec { - margin-bottom: 5px; -} - -div.pop_close_sec { - margin-top: 5px; -} - -table.hide_advanced tr.advanced { - display: none; -} -span.show_more { - display: none; -} -table.hide_advanced span.show_more { - display: inline; -} -table.hide_advanced span.show_less { - display: none; -} - - -/***************************************************************************** - * Program logo styling - ****************************************************************************/ -div.prog_logo { - border-bottom: 0.25em solid #0f5f60; - height: 4.5em; - width: 24em; - display:inline-block; -} -div.prog_logo img { - float:left; - width: 4em; - border-style: none; - margin-right: 0.2em; -} -div.prog_logo h1, div.prog_logo h1:hover, div.prog_logo h1:active, div.prog_logo h1:visited { - margin:0; - padding:0; - font-family: Arial, Helvetica, sans-serif; - font-size: 3.2em; - line-height: 1em; - vertical-align: top; - display: block; - color: #026666; - letter-spacing: -0.06em; - text-shadow: 0.04em 0.06em 0.05em #666; -} -div.prog_logo h2, div.prog_logo h2:hover, div.prog_logo h2:active, div.prog_logo h2:visited { - display: block; - margin:0; - padding:0; - font-family: Helvetica, sans-serif; - font-size: 0.9em; - line-height: 1em; - letter-spacing: -0.06em; - color: black; -} - -div.big.prog_logo { - font-size: 18px; -} - -</style> - <style> -.block_td { - height:25px; -} -.block_container { - position:relative; - box-sizing: border-box; - height: 25px; - padding: 0px; - margin: 0px; - margin-left: 1em; -} -.block_label { - position: absolute; - display: inline-block; - padding: 3px; - z-index: 4; - top: 6px; - height: 12px; - line-height: 12px; - font-size: 12px; - background-color: white; - border: 1px solid black; - -moz-border-radius: 12px; - -webkit-border-radius: 12px; - border-radius: 12px; - transform: translateX(-50%); -} -.block_motif { - position: absolute; - z-index: 3; - top: 0px; - box-sizing: border-box; - border: 1px solid black; - height: 12px; - background-color: cyan; -} -.block_motif.top { - border-bottom-width: 0; -} -.block_motif.bottom { - border-top-width: 0; -} -.block_motif.scanned_site { - opacity: 0.3; -} -.block_motif.scanned_site.active { - opacity: 0.9; -} -.block_region { - position:absolute; - z-index:6; - height:25px; - top:0px; -} -.block_region.main { - z-index:8; -} -.block_region.scanned_site { - z-index:5; -} -.block_region.scanned_site.main { - z-index:7; -} -.block_region.top { - height:13px; -} -.block_region.bottom { - height:13px; - top:12px; -} -.block_rule { - position:absolute; - z-index:2; - width:100%; - height:1px; - top:12px; - left:0px; - background-color:gray; -} -.block_plus_sym { - position:absolute; - z-index:4; - line-height:12px; - top:0px; - left:-1em; -} -.block_minus_sym { - position:absolute; - z-index:4; - line-height:12px; - top:13px; - left:-1em; -} - -.tic_major { - position:absolute; - top:0em; - height:0.5em; - width: 2px; - margin-left: -1px; - background-color: blue; -} -.tic_minor { - position:absolute; - top:0em; - height:0.2em; - width: 1px; - margin-left: -0.5px; - background-color: blue; -} -.tic_label { - position:absolute; - display: inline-block; - top:0.5em; - height: 1em; - color: blue; - transform: translateX(-50%); -} - -.block_needle { - position:absolute; - z-index:4; - height:30px; - width:1px; - top:-2px; - background-color:gray; -} -.block_needle.right { - height: 60px; -} -.block_handle { - position: absolute; - display: inline-block; - z-index: 5; - top: 27px; - min-width: 3ex; - text-align: center; - font-size: 12px; - line-height: 12px; - transform: translateX(-50%); - background-color: LightGrey; - border:3px outset grey; - cursor: pointer; - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ - /* Rules below not implemented in browsers yet */ - -o-user-select: none; - user-select: none; -} -.block_handle.right { - top: 47px; -} - -.legend_container { - text-align: right; -} -.legend_entry { - display: inline-block; - padding: 5px; -} -div.legend_swatch { - box-sizing: border-box; - width: 15px; - height: 15px; - border: 1px solid black; - background-color: cyan; - float: left; -} -div.legend_swatch input { - display: none; -} -.legend_text { - line-height: 15px; - margin-left: 20px; -} -</style> - <style> -/* meme output specific css */ - -div.pop_block { - position:absolute; - z-index:5; - padding: 5px; - border: 1px solid black; - display: inline-block; - background-color: white; -} - -#measure_match { - position: absolute; - visibility: hidden; - height: auto; - width: auto; - white-space: nowrap; -} - -div.template { - position: absolute; - z-index: 1; - left: 0; - top: 0; - visibility: hidden; -} - -table.block_information { - margin-left: auto; - margin-right: auto; -} - -table.block_information * th { - text-align: right; -} - -*.hide_empty_seqs * tr.empty_seq { - display: none; -} - -*.hide_only_scan * tr.only_scan { - display: none; -} - -*.hide_only_scan * div.scanned_site { - display: none; -} - -td.symaction { - text-align: center; - text-decoration: underline; - font-size: 20px; - cursor: pointer; -} -div.sym_btn { - display:inline-block; - text-decoration: underline; - cursor: pointer; - font-size: 20px; - line-height:20px; - text-align: center; - width: 20px; - height: 20px; - color: blue; -} -div.sym_btn:hover { - color: white; - background-color: blue; -} - -div.sym_btn.positioned { - position: absolute; - top: 0px; -} - -div.actionbutton { - display:inline-block; - cursor: pointer; - font-size: 18px; - line-height:20px; - padding: 5px; - margin: 10px 0; - border: 1px solid black; -} - -div.actionbutton:hover { - color:#FFF; - background-color:#000; -} - -div.param_box { - display: inline-block; - margin-right: 20px; -} - -span.param { - font-weight: bold; -} - -div.box + div.box { - margin-top: 5px; -} - -div.sites_outer { - position: relative; - padding-top: 20px; /* height of header */ - display: inline-block; -} - -div.sites_inner { - overflow-x: hidden; - overflow-y: auto; - max-height: 200px; -} -table.sites_tbl { - border-collapse: collapse; -} - -div.sites_th_inner { - position: absolute; - top: 0; - line-height: 20px; /* height of header */ - text-align: left; - padding-left: 5px; -} -th.nopad div.sites_th_inner { - padding-left: 0; -} -div.sites_th_hidden { - visibility: hidden; - height: 0; - padding: 0 10px; -} -th.nopad div.sites_th_hidden { - padding: 0; -} -div.sites_inner * th { - height: 0; -} - -table.sites_tbl { - overflow-x: hidden; - overflow-y: auto; -} - -.site_num { - text-align: right; -} -.site_name { - padding:0px 5px; - text-align:left; -} -.site_strand { - padding:0px 5px; - text-align:center; -} -.norc .site_strand, .norc .site_strand_title { - display: none; -} -.site_start { - padding:0px 15px; - text-align: right; -} -.site_pvalue { - text-align:center; - padding:0px 15px; - text-align:right; - white-space: nowrap; -} -.lflank, .rflank, .match, .alpha_symbol { - font-weight:bold; - font-size:15px; - font-family: 'Courier New', Courier, monospace; - color:gray; -} - -.site.lflank { - text-align:right; - padding-right:5px; - color:gray; -} -.site.match { - text-align:center; -} -.site.rflank { - text-align:left; - padding-left:5px; - padding-right: 20px; -} - -th.stop_reason { - text-align: left; - padding-right: 10px; -} - -th.motif_ordinal { - -} -td.motif_ordinal { - text-align: right; - padding-right: 10px; -} -th.motif_logo { - padding-right: 10px; -} -td.motif_logo { - padding-right: 10px; -} -th.motif_evalue { - text-align:right; - padding-right: 10px; -} -td.motif_evalue { - text-align: right; - white-space: nowrap; - padding-right: 20px; -} -th.motif_nsites { - text-align: right; - padding-right: 10px; -} -td.motif_nsites { - text-align: right; - padding-right: 20px; -} -th.motif_width { - text-align: right; - padding-right: 5px; -} -td.motif_width { - text-align: right; - padding-right: 15px; -} -th.motif_more { - padding: 0 5px; -} -td.motif_more { - text-align: center; - padding: 0 5px; -} -th.motif_submit { - padding: 0 5px; -} -td.motif_submit { - text-align: center; - padding: 0 5px; -} -th.motif_download { - padding-left: 5px; -} -td.motif_download { - text-align: center; - padding-left: 5px; -} - - -div.tabArea { - font-size: 80%; - font-weight: bold; -} - -.norc div.tabArea { - display: none; -} - -span.tab, span.tab:visited { - cursor: pointer; - color: #888; - background-color: #ddd; - border: 2px solid #ccc; - padding: 2px 1em; - text-decoration: none; -} -span.tab.middle { - border-left-width: 0px; -} -div.tabArea.base span.tab { - border-top-width: 0px; -} -div.tabArea.top span.tab { - border-bottom-width: 0px; -} - -span.tab:hover { - background-color: #bbb; - border-color: #bbb; - color: #666; -} -span.tab.activeTab, span.tab.activeTab:hover, span.tab.activeTab:visited { - background-color: white; - color: black; - cursor: default; -} -div.tabMain { - border: 2px solid #ccc; - background-color: white; - padding: 10px; -} -div.tabMain.base { - margin-top: 5px; - display: inline-block; - max-width: 98%; -} - -div.tabMain.top { - margin-bottom: 5px; -} - -div.tabCenter { - max-width: 100%; - overflow-x: auto; - height: 200px; - overflow-y: hidden; -} - -canvas.logo_rc { - display:none; -} -.show_rc_logo > canvas { - display: none; -} -.show_rc_logo > canvas.logo_rc { - display: block; -} - -canvas.scan_logo { - margin-left: 10px; -} - -div.blocks_outer { - position: relative; - padding-top: 20px; /* height of header */ -} - -div.blocks_inner { - overflow-x: hidden; - overflow-y: auto; - max-height: 200px; -} -table.blocks_tbl { - border-collapse: collapse; - width: 100%; -} - -div.blocks_th_inner { - position: absolute; - top: 0; - line-height: 20px; /* height of header */ - text-align: left; - padding-left: 5px; -} -th.nopad div.blocks_th_inner { - padding-left: 0; -} -div.blocks_th_hidden { - visibility: hidden; - height: 0; - padding: 0 10px; -} -th.nopad div.blocks_th_hidden { - padding: 0; -} -div.blocks_inner * th { - height: 0; -} - -table.blocks_tbl { - overflow-x: hidden; - overflow-y: auto; -} -td.block_td { - width: 99%; -} - -*.blockdiag_num { - text-align: right; -} - -td.blockdiag_name { - text-align: left; - padding:0px 10px; -} - -td.blockdiag_pvalue { - padding:0px 10px; - text-align:right; - white-space: nowrap; -} - -div.preview_btn { - border: 2px solid white; - height: 16px; - width: 16px; - font-size: 12px; - line-height: 16px; - text-align: center; - cursor: pointer; -} -div.preview_btn + div.preview_btn { - margin-top: 3px; -} - -div.preview_btn.active { - border: 2px solid black; - cursor: default; -} - -div.preview_btn:hover { - background-color: black; - color: white; - border-color: black; -} - -div.preview_btn.active:hover { - background-color: white; - color: black; - border-color: black; -} - - -div.preview_btn_box { - position: absolute; - left: 0px; - top: 0px; - padding: 3px; -} - -div.preview_logo_box { - height: 50px; - overflow-y: hidden; -} - -div.preview_btn_box + div.preview_logo_box { - margin-left: 25px; -} - -div.preview_box { - position: relative; -} - -div.grey_background { - position:fixed; - z-index: 8; - background-color: #000; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; - opacity: 0.5; - left: 0; - top: 0; - width: 100%; - height: 100%; -} - -div.popup_wrapper { - position:fixed; - z-index:9; - width:100%; - height:0; - top:50%; - left:0; -} - -div.popup { - width: 600px; - z-index:9; - margin-left: auto; - margin-right: auto; - padding: 5px; - background-color: #FFF; - border-style: double; - border-width: 5px; - border-color: #00666a; - position:relative; -} -div.close { - cursor: pointer; - border: 1px solid black; - width:15px; - height:15px; - line-height:15px; /* this causes vertical centering */ - text-align:center; - background-color:#FFF; - color:#000; - font-size:15px; - font-family:monospace; -} - -div.close:hover { - color:#FFF; - background-color:#000; -} - -div.navnum { - width:100%; - height:20px; - line-height:20px; - text-align:center; - font-size:medium; -} - -div.navarrow { - font-size: 30px; - text-decoration:none; - cursor: pointer; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; -} - -div.navarrow > span.inactive { - display: inline; -} -div.navarrow > span.active { - display: none; -} - -div.navarrow:hover > span.active { - display: inline; -} -div.navarrow:hover > span.inactive { - display: none; -} - -table.programs { - width: 100%; -} - -table.programs tr { - background-color: #EFE; -} - -table.programs tr.selected { - background-color: #262; - color: #FFF; -} - -table.programs tr.dna_only { - display: none; -} - -table.programs.alphabet_dna tr.dna_only { - display: table-row; -} - -div.programs_scroll { - width: 100%; - height: 90px; - overflow-y: auto; - overflow-x: hidden; - margin: 0 auto; -} -table.inputs, table.alpha_bg_table { - margin-top: 20px; - border-collapse:collapse; -} -table.inputs * td, table.inputs * th, table.alpha_bg_table * td, table.alpha_bg_table * th { - padding-left: 15px; - padding-right: 15px; - padding-top: 1px; - padding-bottom: 1px; -} - -table.hide_psp td.col_psp, table.hide_psp th.col_psp { - display: none; -} - -/* program settings */ -span.mod_oops, span.mod_zoops, span.mod_anr { - display: none; -} -td.oops span.mod_oops,td.zoops span.mod_zoops, td.anr span.mod_anr { - display: inline; -} -span.strand_none, span.strand_given, span.strand_both { - display: none; -} -td.none span.strand_none, td.given span.strand_given, td.both span.strand_both { - display: inline; -} -span.spmap_uni, span.spmap_pam { - display: none; -} -td.uni span.spmap_uni, td.pam span.spmap_pam { - display: inline; -} -span.prior_dirichlet, span.prior_dmix, span.prior_mega, span.prior_megap, span.prior_addone { - display: none; -} -td.dirichlet span.prior_dirichlet, td.dmix span.prior_dmix, td.mega span.prior_mega, -td.megap span.prior_megap, td.addone span.prior_addone { - display: inline; -} -span.noendgaps_on, span.noendgaps_off { - display: none; -} -td.on span.noendgaps_on, td.off span.noendgaps_off { - display: inline; -} -span.substring_on, span.substring_off { - display: none; -} -td.on span.substring_on, td.off span.substring_off { - display: inline; -} -</style> - </head> - <body onload="page_loaded()" onpageshow="page_shown(event)" onresize="page_resized()"> - <!-- --> - <div id="grey_out_page" class="grey_background" style="display:none;"> - </div> - <!-- Help popups --> - <div class="pop_content" id="pop_"> - <p>Help poup.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_ev"> - <p>The statistical significance of the motif. MEME usually finds the most - statistically significant (low E-value) motifs first. It is unusual to - consider a motif with an E-value larger than 0.05 significant so, as an - additional indicator, MEME displays these partially transparent.</p> - <p>The E-value of a motif is based on its log likelihood ratio, width, - sites, the background letter frequencies (given in the command line - summary), and the size of the training set.</p> - <p>The E-value is an estimate of the expected number of motifs with the - given log likelihood ratio (or higher), and with the same width and site - count, that one would find in a similarly sized set of random - sequences (sequences where each position is independent and letters are - chosen according to the background letter frequencies).</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_sites"> - <p>The number of sites contributing to the construction of the motif.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_width"> - <p>The width of the motif. Each motif describes a pattern of a fixed - width, as no gaps are allowed in MEME motifs.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_more"> - <p>Click on the blue symbol below to reveal more information about this motif.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_submit_dl"> - <p>Click on the blue symbol below to reveal options allowing you - to submit this motif to another MEME Suite motif analysis program, to download this - motif in various text formats, or to download a sequence "logo" of - this motif PNG or EPS format.</p> - <h5>Supported Programs</h5> - <dl> - <dt>Tomtom</dt> - <dd>Tomtom is a tool for searching for similar known motifs. - [<a href="http://meme-suite.org/doc/tomtom.html?man_type=web">manual</a>]</dd> - <dt>MAST</dt> - <dd>MAST is a tool for searching biological sequence databases for - sequences that contain one or more of a group of known motifs. - [<a href="http://meme-suite.org/doc/mast.html?man_type=web">manual</a>]</dd> - <dt>FIMO</dt> - <dd>FIMO is a tool for searching biological sequence databases for - sequences that contain one or more known motifs. - [<a href="http://meme-suite.org/doc/fimo.html?man_type=web">manual</a>]</dd> - <dt>GOMO</dt> - <dd>GOMO is a tool for identifying possible roles (Gene Ontology - terms) for DNA binding motifs. - [<a href="http://meme-suite.org/doc/gomo.html?man_type=web">manual</a>]</dd> - <dt>SpaMo</dt> - <dd>SpaMo is a tool for inferring possible transcription factor - complexes by finding motifs with enriched spacings. - [<a href="http://meme-suite.org/doc/spamo.html?man_type=web">manual</a>]</dd> - </dl> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_llr"> - <p>The log likelihood ratio of the motif.The log likelihood ratio is the - logarithm of the ratio of the probability of the occurrences of the motif - given the motif model (likelihood given the motif) versus their - probability given the background model (likelihood given the null model). - (Normally the background model is a 0-order Markov model using the - background letter frequencies, but higher order Markov models may be - specified via the -bfile option to MEME.).</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_ic"> - <p>The information content of the motif in bits. It is equal to the sum - of the uncorrected information content, R(), in the columns of the pwm. - This is equal relative entropy of the motif relative to a uniform - background frequency model.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_re"> - <p>The relative entropy of the motif.</p> - - <p style="font-family: monospace;">re = llr / (sites * ln(2))</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_bt"> - <p>The Bayes Threshold.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_site_strand"> - <p>The strand used for the motif site.</p> - <dl> - <dt>+</dt> - <dd>The motif site was found in the sequence as it was supplied.</dd> - <dt>-</dt> - <dd>The motif site was found in the reverse complement of the supplied sequence.</dd> - </dl> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_site_start"> - <p>The position in the sequence where the motif site starts. If a motif - started right at the begining of a sequence it would be described as - starting at position 1.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_site_pvalue"> - <p>The probability that an equal or better site would be found in a - random sequence of the same length conforming to the background letter - frequencies.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_site_match"> - <p>A motif site with the 10 flanking letters on either side.</p> - <p>When the site is not on the given strand then the site - and both flanks are reverse complemented so they align.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_seq_name"> - <p>The name of the sequences as given in the FASTA file.</p> - <p>The number to the left of the sequence name is the ordinal - of the sequence.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_motif_sites"> - <p>These are the motif sites predicted by MEME and used to build the motif.</p> - <p>These sites are shown in solid color and hovering the cursor - over a site will reveal details about the site. Only sequences - that contain a motif site are shown.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_scanned_sites"> - <p>These are the motif sites predicted by MEME plus - any additional sites detected using a motif scanning - algorithm.</p> - <p>These MEME sites are shown in solid color and - additional scanned sites are shown in transparent color. - Hovering the cursor over a site will reveal details about the site. - Only sequences containing a predicted or scanned motif site are shown.</p> - <p>The scanned sites are predicted using a - log-odds scoring matrix constructed from the MEME sites. - Only scanned sites with position <i>p</i>-values less - than 0.0001 are shown.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_all_sequences"> - <p>These are the same sites as shown by selecting the - "Motif Sites + Scanned Sites" button except that all - sequences, including those with no sites, are included - in the diagram.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_seq_pvalue"> - <p>This is the combined match <i>p</i>-value.</p> - <p>The combined match <i>p</i>-value is defined as the probability that a - random sequence (with the same length and conforming to the background) - would have position <i>p</i>-values such that the product is smaller - or equal to the value calulated for the sequence under test.</p> - <p>The position <i>p</i>-value is defined as the probability that a - random sequence (with the same length and conforming to the background) - would have a match to the motif under test with a score greater or equal - to the largest found in the sequence under test.</p> - <p>Hovering your mouse over a motif site in the motif location - block diagram will show its position <i>p</i>-value and other information - about the site.</p> - - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_motif_location"> - <p>This diagram shows the location of motif sites.</p> - <p>Each block shows the position and strength of a motif - site. The height of a block gives an indication of the - significance of the site as taller blocks are more significant. - The height is calculated to be proportional to the negative - logarithm of the <i>p</i>-value of the site, truncated at - the height for a <i>p</i>-value of 1e-10.</p> - <p>For complementable alphabets (like DNA), sites on the - positive strand are shown above the line, - sites on the negative strand are shown below.</p> - <p>Placing the cursor - over a motif site will reveal more information about the site - including its position <i>p</i>-value. (See the help - for the <i>p</i>-value column for an explanation of position - <i>p</i>-values.)</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_seq_source"> - <p>The name of the file of sequences input to MEME.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_psp_source"> - <p>The position specific priors file used by MEME to find the motifs.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_seq_alph"> - <p>The alphabet used by the sequences.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_seq_count"> - <p>The number of sequences provided as input to MEME.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <div class="pop_content" id="pop_alph_name"> - <p>The name of the alphabet symbol.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_alph_freq"> - <p>The frequency of the alphabet symbol in the dataset with a pseudocount - so it is never zero.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - <div class="pop_content" id="pop_alph_bg"> - <p>The frequency of the alphabet symbol as defined by the background model.</p> - <div style="float:right; bottom:0px;">[ - <a href="javascript:help_popup()">close</a> ]</div> - </div> - - <!-- templates --> - <div id="measure_match" class="match"></div> - <div class="template pop_block" id="tmpl_block_info"> - <div> - <span class="tvar_logo_pad lflank" style="visibility:hidden;"></span> - <span class="tvar_logo"></span> - </div> - <div class="block_sequence_fragment"> - <span class="tvar_lflank lflank"></span> - <span class="tvar_match match"></span> - <span class="tvar_rflank rflank"></span> - </div> - <table class="block_information"> - <tr><th>Motif</th><td class="tvar_motif">1</td></tr> - <tr><th><i>p</i>-value</th><td class="tvar_pvalue">8.23e-7</td></tr> - <tr><th>Start</th><td class="tvar_start">23</td></tr> - <tr><th>End</th><td class="tvar_end">33</td></tr> - </table> - </div> - - <div class="template pop_block" id="tmpl_scan_info"> - <h5>Scanned Site</h5> - <div class="tvar_logo"></div> - <table class="block_information"> - <tr><th>Motif</th><td class="tvar_motif">1</td></tr> - <tr><th><i>p</i>-value</th><td class="tvar_pvalue">8.23e-7</td></tr> - <tr><th>Start</th><td class="tvar_start">23</td></tr> - <tr><th>End</th><td class="tvar_end">33</td></tr> - </table> - </div> - - <div class="template box expanded_motif" id="tmpl_motif_expanded"> - <div style="position: relative; min-height: 20px"> - <div class="param_box"> - <span class="param"><span class="tvar_ordinal"></span>.</span> - </div> - <div class="sym_btn positioned tvar_less" tabindex="0" - title="Show less information.">↥</div> - <div class="sym_btn positioned tvar_submit" tabindex="0" - title="Submit the motif to another MEME Suite program or download it.">⇢</div> - </div> - <div> - <div class="param_box"> - <span class="param"><i>E</i>-value:</span> - <span class="tvar_evalue"></span> - <div class="help" data-topic="pop_ev"></div> - </div> - <div class="param_box"> - <span class="param">Site Count:</span> - <span class="tvar_site_count"></span> - <div class="help" data-topic="pop_sites"></div> - </div> - <div class="param_box"> - <span class="param">Width:</span> - <span class="tvar_width"></span> - <div class="help" data-topic="pop_width"></div> - </div> - </div> - <div class="tabMain base"> - <div class="tabCenter tvar_logo"></div> - </div> - <div class="tabArea base"> - <span class="tvar_tab tab" tabindex="0">Standard</span><span - class="tvar_tab_rc tab middle" tabindex="0">Reverse - Complement</span> - </div> - <div style="padding: 10px 0"> - <div class="param_box"> - <span class="param">Log Likelihood Ratio:</span> - <span class="tvar_llr"></span> - <div class="help" data-topic="pop_llr"></div> - </div> - <div class="param_box"> - <span class="param">Information Content:</span> - <span class="tvar_ic"></span> - <div class="help" data-topic="pop_ic"></div> - </div> - <div class="param_box"> - <span class="param">Relative Entropy:</span> - <span class="tvar_re"></span> - <div class="help" data-topic="pop_re"></div> - </div> - <div class="param_box"> - <span class="param">Bayes Threshold:</span> - <span class="tvar_bt"></span> - <div class="help" data-topic="pop_bt"></div> - </div> - </div> - <div class="tvar_sites"></div> - </div> - - - <div class="popup_wrapper"> - <div class="popup" style="display:none; top: -150px;" id="download"> - <div> - <div style="float:right; "> - <div id="outpop_close" class="close" tabindex="0">x</div> - </div> - <h2 class="mainh" style="margin:0; padding:0;">Submit or Download</h2> - <div style="clear:both"></div> - </div> - <div style="height:100px"> - <div style="float:right; width: 30px;"> - <div id="outpop_prev" class="navarrow" tabindex="0"> - <span class="inactive">⇧</span><span class="active">⬆</span> - </div> - <div id="outpop_num" class="navnum"></div> - <div id="outpop_next" class="navarrow" tabindex="0"> - <span class="inactive">⇩</span><span class="active">⬇</span> - </div> - </div> - <div id="logo_box" style="height: 100px; margin-right: 40px;"> - <canvas id="outpop_logo" height="100" width="580"></canvas> - <canvas id="outpop_logo_rc" class="logo_rc" height="100" width="580"></canvas> - </div> - </div> - <div> - <!-- tabs start --> - <div class="tabArea top"> - <span id="outpop_tab_1" class="tab">Submit Motif</span><span - id="outpop_tab_2" class="tab middle">Download Motif</span><span - id="outpop_tab_3" class="tab middle">Download Logo</span> - </div> - <div class="tabMain top"> - <!-- Submit to another program --> - <div id="outpop_pnl_1"> - <h4 class="compact">Submit to program</h4> - <table id="programs" class="programs"> - <tr class="dna_only"> - <td><input type="radio" name="program" value="tomtom" id="submit_tomtom"></td> - <td><label for="submit_tomtom">Tomtom</label></td> - <td><label for="submit_tomtom">Find similar motifs in - published libraries or a library you supply.</label></td> - </tr> - <tr> - <td><input type="radio" name="program" value="fimo" id="submit_fimo"></td> - <td><label for="submit_fimo">FIMO</label></td> - <td><label for="submit_fimo">Find motif occurrences in - sequence data.</label></td> - </tr> - <tr> - <td><input type="radio" name="program" value="mast" id="submit_mast"></td> - <td><label for="submit_mast">MAST</label></td> - <td><label for="submit_mast">Rank sequences by affinity to - groups of motifs.</label></td> - </tr> - <tr class="dna_only"> - <td><input type="radio" name="program" value="gomo" id="submit_gomo"></td> - <td><label for="submit_gomo">GOMo</label></td> - <td><label for="submit_gomo">Identify possible roles (Gene - Ontology terms) for motifs.</label></td> - </tr> - <tr class="dna_only"> - <td><input type="radio" name="program" value="spamo" id="submit_spamo"></td> - <td><label for="submit_spamo">SpaMo</label></td> - <td><label for="submit_spamo">Find other motifs that are - enriched at specific close spacings which might imply the existance of a complex.</label></td> - </tr> - </table> - </div> - <!-- download text format --> - <div id="outpop_pnl_2"> - <div> - <label for="text_format">Format:</label> - <select id="text_format"> - <option value="0">Count Matrix</option> - <option value="1">Probability Matrix</option> - <option value="2">Minimal MEME</option> - <option value="3">FASTA</option> - <option value="4">Raw</option> - </select> - </div> - <form id="text_form" method="post" action=""> - <script>$("text_form").action = site_url + "/utilities/save_generated_file";</script> - <input type="hidden" id="text_name" name="name" value="motif.txt"> - <input type="hidden" name="mime_type" value="text/plain"> - <textarea id="outpop_text" name="content" - style="width:99%; white-space: pre; word-wrap: normal; overflow-x: scroll;" - rows="8" readonly="readonly" wrap="off"></textarea> - </form> - </div> - <!-- download logo format --> - <div id="outpop_pnl_3"> - <form id="logo_form" method="post" action=""> - <script>$("logo_form").action = site_url + "/utilities/generate_logo";</script> - <input type="hidden" name="program" value="MEME"/> - <input type="hidden" id="logo_motifs" name="motifs" value=""/> - <table> - <tr> - <td><label for="logo_format">Format:</label></td> - <td> - <select id="logo_format" name="png"> - <option value="1">PNG (for web)</option> - <option value="0">EPS (for publication)</option> - </select> - </td> - </tr> - <tr> - <td><label for="logo_rc">Orientation:</label></td> - <td> - <select id="logo_rc" name="rc1"> - <option value="0">Normal</option> - <option value="1" id="logo_rc_option">Reverse Complement</option> - </select> - </td> - </tr> - <tr> - <td><label for="logo_ssc">Small Sample Correction:</label></td> - <td> - <input type="hidden" id="logo_err" name="errbars" value="0"/> - <select id="logo_ssc" name="ssc"> - <option value="0">Off</option> - <option value="1">On</option> - </select> - </td> - </tr> - <tr> - <td><label for="logo_width">Width:</label></td> - <td> - <input type="text" id="logo_width" size="4" placeholder="default" name="width"/> cm - </td> - </tr> - <tr> - <td><label for="logo_height">Height:</label></td> - <td> - <input type="text" id="logo_height" size="4" placeholder="default" name="height"/> cm - </td> - </tr> - </table> - </form> - </div> - <!-- Buttons --> - <div> - <div style="float:left;"> - <input type="button" id="outpop_do" value="Submit" /> - </div> - <div style="float:right;"> - <input id="outpop_cancel" type="button" value="Cancel" /> - </div> - <div style="clear:both;"></div> - </div> - </div> - </div> - </div> - </div> - - - - <!-- Page starts here --> - <div id="top" class="pad1"> - <div class="prog_logo big"> - <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABGCAYAAACUsCfoAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9wLHAInL7an9JAAAA8eSURBVHja7ZpZbxv3ucZ/s3AZ7qQkypZELZS3WHKiRJbTFnHqOjZcGzCQBf0A7cUB8glOb89dz30vChRp7xK0aZo4TYq6dtKqSew6iuJWpmPJlrVFFCmKI+7LLJw5F81MFZyec5rTILJaP8AAnAty+Pzf933ebeAhHuIhHuIhHmJPo6TpaeGLfimTydhLS0sUCgWazSbVahXDMOh0Ong8HiKRCAMDAxw+fJhHH31UeFDJ/91/bHp62r558ya6rmOaJuvr6+TzeYrFIoZhAOD1epFlmWAwSDqdZnR0lCNHjjA+Ps7+/fuFPUU8k8nYV69epVKpEA6HuXPnDrOzs7RaLbxeL93d3fj9foLBIB6Ph0ajQaVSAUBRFNLpNI888ggHDhzg3Llzwp4g/vbbb9szMzPE43FyuRwffPAB2WyWnp4ehoaGiMVi2LZNvV6n3W7j8/mIRqN4vV4ajQa1Wo2trS0OHTqEaZo89dRTfO973xMeaOKvvfaaffv2bcLhMCsrK/z+979HVVWOHz/O0NAQxWIRVVVRVRW/348oihiGgSiKxGIxurq6CAQCBINB3n//fcbGxiiXyxw7dowXX3yx1Nvbm3igiBcKhY9u3rw5OTMzQzgc5vbt23zwwQfIsszExAS2bZPP55EkiVAoRCQSIRwOI8sy5XKZ7e1tWq0WnU6HTqfD4OAggUAAVVXpdDo0m01GRkb44Q9/KDxQxH/729/as7Oz+Hw+Pv30U37zm9/g9Xrp6emht7eXYDCI3+/H6/UiCALtdhvLsuh0OkiSRCAQQJZl6vU65XKZ1dVV+vv7SSQS5PN5vF4vhUKBgwcP8qMf/WjXyIs7b+7cuWMvLi4iCAL1ep133nkHXdcZHh4mlUoRDofp7+8nHo9jGAaCIBCPx+nr6yOdTtPX14fH40HTNGRZpqenh76+PrLZLMVikYGBARRFwTRN5ubm+PGPf2zvFnF5583c3BzlchlZlrl16xa1Wo2xsTGi0SiDg4OutUzTJBKJIIoiXq+XQCBAIpEgFAphmiaqqlIoFKjVaoyOjhKJRFhfXycajRKNRunp6WFhYYG33nqLQqHwUTKZPP5VE5ecD5cvX7bv37+Poijkcjl++ctfMjo6ytDQEMlkEo/HQ7lcpt1u4/F4kGUZQRDw+Xz09fVx4MABRkZGSKVSdHV10el0KJVK1Ot14vE4kiRRKpVQFIV4PI5t23z66ad0Op2+K1eu/MeuWVxVVUzTRNd17t27RzKZJJFIEI1GEUWRdruNaZqIoogkSYiiiCiK+P1+AoEA0WiUQ4cOCQCbm5vb5XI5Xi6XWVtbw7ZtZFnG7/e7D1YUhWAwSLVaJZvN2v39/cJXHuOLi4t2sVhEEAS2t7eZn59n//79JBIJwuEwlmXRbDbRdR1BEBAEAcuysCwL2/5LmIriX+Wit7c3EY/HSSQSeDweDMPA4/EQCoWwbRvbtgmFQoTDYUqlErlcbnfE7f79+64gbWxs0G63icViRCIRBEHANE0Mw0CSJLxer0vSUfVKpUKxWGRtbc12UmKr1cI0TQD3t4PBoHtwgUAAv99Ps9kkn8/vjrjlcjlkWabdbrO8vEx3dzfhcJhoNEq9XkfTNERRxOfz4fV6sW0bSZJcBS+VSqytrdFqtbh+/bq9sLBALpdje3sbXddd4jutLwh/8WzLslBVdXeI12o1RFFkc3PTLTFjsRixWAxVVbEsC1mWkSTJdVXnMgyDarWKrusUi0X8fj+WZVGtVimXyxiGgW3bblh4PB78fj/tdhvbthFF0a3tv3Liuq4jiiKFQgFZlolEInR3d6MoConEXytLp1Bx0Ol0sG0bXdfRdZ1arYYgCNi2jaZptFot1zOcQ3LSnxMGzsHvCnHH/RqNBtFoFEmSCIfDAAwNDWFZFu12m0ajgaZpWJbl/oDH4/ncoTii5xBz1N+2bTqdDrIs4/P53MxgWRaapu2exQOBgHsAnU6HdrvN5uYmgUCASCRCJBIhkUhgmibNZpNarUaj0XAt71jfET1RFN1YliTJfUa73SaZTLK1tUWtVkPTNKampnaHuFNGyrKM1+t141bTNGq1GrVazS1EIpEI8XjcLWJqtdrnYthNF58pv23beL1eJEly1VzXder1Oq1Wi2AwiK7ru0PcSSs73bBYLBIMBpEkCdM0qVQq6LpOq9UiHA673Vmn08E0TfdyRM85CNM08Xq9bkoMhULugRqGgd/v3z1Xl2X5c24aDodRVZV4PO7W406/raoqtVqNYDCIz+dDURQ3vp3LuXeEz4nlTqdDOBxG13U3TBRF2b0mJRAI0Gg0EAQBTdPw+/2Uy2VXoJzRkkPEifNWq0UgEHCLEsedLcty1X1nzIdCIRRFoVQqUSqVsCyLYDBIPB7fncotlUq5JaWu6xiGgWmabG1tuanINE0EQXAPwSlk6vU6zWaTdruNpmnud3eWsk6fnkwmMU2Tzc1NVFVFURSi0SjpdHp3iB89ehRRFOnt7XWHCNFolFwu58ar08AYhuEWNH6/H4/H8zlL71R4J5XJskwgECAWi5HP51lZWaHVajE8PEw8Hufw4cO7Q3zfvn0C4E5MNU2jq6uLarVKPp//nPA5hYgzcYlEIoRCIfcQHLd3SDvEPR4PHo+HfD5PPp9HEARGRkYIhUIMDQ0Ju0Ic4NixY3g8Hnp7e8lms8RiMcLhMNlsFk3TXHW3bZtgMOjmfScEvF6vW8s7qczxgGazSSAQ4M9//jOqqlKpVHj88cfx+XyMjY3t7ujp1KlTQrlcdicupVKJkZER1tbWuHfvHqqqEolEiMVitNtt6vW6q+iNRoNms4kkSfh8PtfC0WgURVHo7+9nc3OTjY0N3n33XQYGBkilUiSTSU6ePCnsKnGA559/nkqlwtGjR8nn8/j9fh5//HEsy+LWrVvMz8+j6zqhUAifz4dhGG7z0mq1UFUVXdeJRCIEg0F32loqlbh37x53796lq6sLRVGIRCJMTEzs2pT1c8Qfe+wxYWpqyv1j2WyWVCpFIpGgUqkwNzfHnTt33JTnDCUlSaK7u5v+/n66u7vxeDxun16r1SgUCly/fp3bt29z+vRpBgcHqdVqRKPRB2uh8LOf/cyemZlhYWGBYDBIJBIBoFgs0mw2CYfDxONxfD4fg4ODros7vXWhUKDT6bg5/v3332dlZYWhoSHS6TSnTp1i3759VKtVzpw5w1c9dvpfNymvvPKKff36dbLZLIqiuBVWs9mk0WhgWZbbn4fDYURRRNM0AoEAvb29+Hw+Go0Gly9fZmNjg4mJCcbGxti/f787mJyfn6darTI5OcmJEyeEB4J4sVj8wfT09L/Pzs6SzWbdpWEikXBJGoZBs9kkGo0iyzKmabrLhtXVVTKZDJubm5w9e5YjR44wMDDAd7/7XWF2dtZeXFzkyJEj7pZm//79pFIpenp6vhIP+D8f8NZbb9nr6+ssLy+ztbXl1t5er9fdhxeLRSRJoquri0qlQiaTYXt7m0gkwpkzZ5BlmbGxMV544QX3eR9//LE9Pz/PsWPHuHHjBouLi0iSxMDAAMePH2dqakrYVeIAKysr9u3bt1leXnZn65qmoeu6W9AYhkGj0aBYLGKaJocOHeLRRx8lkUgwOTnpjp4d5HI5++OPP6ZcLjM+Ps61a9dYWFig2Wzi9Xp5/vnnOX36tLCrxHfi1q1b9tLSkuv+9XrdbTEVRSEWi5FMJhkdHWV4eJiDBw/+j8/Y2tr6+WuvvfYdwzBIpVJIkoSqqszPz1Ov17lw4QJf+9rXziYSiau7TvxvoVQqpUul0n2n2/oibz+899579k9/+lPC4TCnTp3i61//Orlcjp/85CdomsbTTz/NiRMn/pvH/CMotrQfyF/GD8Xj8aX/7yEePnx4dnx8fPJ3v/sdiqIwODjI5OSkcOPGDfvNN9/kypUr5PN5MpmMPT4+/qWQ71Z835fZZSSTyeMrKyt2vV7n7t27vPrqq1y7ds1+8sknhT/+8Y/2pUuXuHnzJs1mk6WlJTudTn8p5EUeAAwPDwvPPfccBw4cYHV1lc+KJ3t0dPTVixcvcvDgQebn53n55ZeZmZn5h1fLalv/twfqTaRMJmP/4he/YH19nSNHjnDhwgVisRj37t3jnXfeYWFhgQMHDnD+/HmeeuopYc9b3MH4+LjwrW99C0EQuHXrFtPT09RqNfr7+zlx4gTpdJqNjQ3efPNN3njjDbtYLP5gV1X9y8bly5ft119/nUqlwsmTJzl9+jQej4ePPvqITz75hLW1NYLBIJOTk5w7d46+vr4vzEN+EImfO3dOuHr1qv3666/z3nvvoWkaZ8+e5YknnnBXU5qmcfPmTQzDYG1tzR4cHBT2vMUdTE9P25cuXaJQKDA5OcmFCxfQdZ3Z2VkWFhbY2NhAURRSqRTPPvssY2Njwp62uINvfvObwp/+9Cf7V7/6FTdu3KDT6XD+/HmmpqbcoaaqqszOzmIYxhfK9Q80cYCJiQlhbm7OFgSBubk5vF4vzzzzDBMTE+7CMRgMsrCwwEsvvcS1a9fsb3zjG8KedvWd+OSTT+y3336bubk5JicnOXnyJJZl8eGHH7K2tkahUKDRaLBv3z4uXrzI2bNnhT1tcQdHjx4VMpmM3el0WFxcJBQKMTU1xbFjx6hWqwC0221WVlb49a9/zY0bN+wnn3xS2BN5/O/J88899xzDw8NkMhnm5uaIx+M8/fTT9PT0YFkWg4ODrK6u8sorrzA/P2/veVffidXVVfvdd99lenqa8+fPMzo6iqZp/OEPf2BhYYFWq4Usy4yMjHDx4kX+luXlvUh8aGhImJmZsS3L4vr165imSSqVYt++fbTbbWq1GtVqlWq1yt27d7l//749Ojoq7HniAFNTU8LS0pJdLpe5e/cu6+vrRCIRhoeHqVarrK6uous66+vrZLNZSqVS+rP2eW8TB0in00I2m3XVHqCvr49YLEYikXBfRiqXy+Ryufs7Q1tkj6O/v1/49re/zTPPPIMgCMzPz7sraJ/Ph9/vd/d3pVIp/U9hcQdOnX7p0iU7k8kgiqK76lIUxX19dKerC/wTYXt7+8zm5uaV5eVlNjY2iMfj+P1+hoeH6enpmd35evg/FXEHm1uF7ZXltXgg6EcSPSR7u/+zO9H1ff6VsFWq/pyHeIiHeIh/FfwXjVDdIW9O2PAAAAAASUVORK5CYII=" alt="MEME Logo"> - <h1>MEME</h1> - <h2>Multiple Em for Motif Elicitation</h2> - </div> - <p> - For further information on how to interpret these results or to get a - copy of the MEME software please access - <a href="http://meme-suite.org/">http://meme-suite.org</a>. - </p> - <p>If you use MEME in your research, please cite the following paper:<br /> - <span class="citation"> - Timothy L. Bailey and Charles Elkan, - "Fitting a mixture model by expectation maximization to discover motifs in biopolymers", - <em>Proceedings of the Second International Conference on Intelligent Systems - for Molecular Biology</em>, pp. 28-36, AAAI Press, Menlo Park, California, 1994. - <a href="http://meme-suite.org/doc/ismb94.pdf">[pdf]</a> - </span> - </p> - </div> - <!-- navigation --> - <div class="pad2"> - <a class="jump" href="#motifs_sec">Discovered Motifs</a> - | - <a class="jump" href="#sites_sec">Motif Locations</a> - | - <a class="jump" href="#inputs_sec">Inputs & Settings</a> - | - <a class="jump" href="#info_sec">Program information</a> - </div> - <!-- alert the user when their browser is not up to the task --> - <noscript><h1 style="color:red">Javascript is required to view these results!</h1></noscript> - <h1 id="html5_warning" style="color:red; display:none;">Your browser does not support canvas!</h1> - <script> - if (!window.HTMLCanvasElement) $("html5_warning").style.display = "block"; - </script> - <h2 class="mainh pad2" id="motifs_sec">Discovered Motifs</h2> - <div id="motifs" class="box"> - <p>Please wait... Loading...</p> - <p>If the page has fully loaded and this message does not disappear then an error may have occurred.</p> - </div> - <h2 class="mainh pad2" id="sites_sec">Motif Locations</h2> - <div id="blocks" class="box"> - <p>Please wait... Loading...</p> - <p>If the page has fully loaded and this message does not disappear then an error may have occurred.</p> - </div> - <h2 class="mainh pad2" id="inputs_sec">Inputs & Settings</h2> - <div class="box"> - <h4>Sequences</h4> - <table id="seq_info" class="inputs"> - <tr><th>Source <div class="help" data-topic="pop_seq_source"></div></th> - <th class="col_psp">PSP Source <div class="help" data-topic="pop_psp_source"></div></th> - <th>Alphabet <div class="help" data-topic="pop_seq_alph"></div></th> - <th>Sequence Count <div class="help" data-topic="pop_seq_count"></div></th> - </tr> - <tr> - <td id="ins_seq_source"></td> - <td id="ins_seq_psp" class="col_psp"></td> - <td id="ins_seq_alphabet"></td> - <td id="ins_seq_count"></td> - </tr> - </table> - <script> - { - var db = data.sequence_db; - $("ins_seq_source").innerHTML = db.source; - $("ins_seq_alphabet").innerHTML = meme_alphabet.get_alphabet_name(); - $("ins_seq_count").innerHTML = db.sequences.length; - if (db.psp) { - $("ins_seq_psp").innerHTML = db.psp; - } - toggle_class($("seq_info"), "hide_psp", !(db.psp)); - } - </script> - <h4>Background</h4> - <span id="alpha_bg"></span> - <script> - { - $("alpha_bg").appendChild(make_alpha_bg_table(meme_alphabet, data.sequence_db.freqs)); - } - </script> - <h4>Other Settings</h4> - <table id="tbl_settings" class="inputs hide_advanced"> - <tr> - <th>Motif Site Distribution</th> - <td id="opt_mod"> - <span class="mod_zoops">ZOOPS: Zero or one site per sequence</span> - <span class="mod_oops">OOPS: Exactly one site per sequence</span> - <span class="mod_anr">ANR: Any number of sites per sequence</span> - </td> - </tr> - <tr> - <th>Site Strand Handling</th> - <td id="opt_strand"> - <span class="strand_none">This alphabet only has one strand</span> - <span class="strand_given">Sites must be on the given strand</span> - <span class="strand_both">Sites may be on either strand</span> - </td> - </tr> - <tr> - <th>Maximum Number of Motifs</th> - <td id="opt_nmotifs"></td> - </tr> - <tr> - <th>Motif E-value Threshold</th> - <td id="opt_evt"></td> - </tr> - <tr> - <th>Minimum Motif Width</th> - <td id="opt_minw"></td> - </tr> - <tr> - <th>Maximum Motif Width</th> - <td id="opt_maxw"></td> - </tr> - <tr> - <th>Minimum Sites per Motif</th> - <td id="opt_minsites"></td> - </tr> - <tr> - <th>Maximum Sites per Motif</th> - <td id="opt_maxsites"></td> - </tr> - <tr class="advanced"> - <th>Bias on Number of Sites</th> - <td id="opt_wnsites"></td> - </tr> - <tr class="advanced"> - <th>Sequence Prior</th> - <td id="opt_prior"> - <span class="prior_dirichlet">Simple Dirichlet</span> - <span class="prior_dmix">Dirichlets Mix</span> - <span class="prior_mega">Mega-weight Dirichlets Mix</span> - <span class="prior_megap">Mega-weight Dirichlets Mix Plus</span> - <span class="prior_addone">Add One</span> - </td> - </tr> - <tr class="advanced"> - <th>Sequence Prior Strength</th> - <td id="opt_b"></td> - </tr> - <tr class="advanced"> - <th>EM Starting Point Source</th> - <td id="opt_substring"> - <span class="substring_on">From substrings in input sequences</span> - <span class="substring_off">From strings on command line (-cons)</span> - </td> - </tr> - <tr class="advanced"> - <th>EM Starting Point Map Type</th> - <td id="opt_spmap"> - <span class="spmap_uni">Uniform</span> - <span class="spmap_pam">Point Accepted Mutation</span> - </td> - </tr> - <tr class="advanced"> - <th>EM Starting Point Fuzz</th> - <td id="opt_spfuzz"></td> - </tr> - <tr class="advanced"> - <th>EM Maximum Iterations</th> - <td id="opt_maxiter"></td> - </tr> - <tr class="advanced"> - <th>EM Improvement Threshold</th> - <td id="opt_distance"></td> - </tr> - <tr class="advanced"> - <th>Trim Gap Open Cost</th> - <td id="opt_wg"></td> - </tr> - <tr class="advanced"> - <th>Trim Gap Extend Cost</th> - <td id="opt_ws"></td> - </tr> - <tr class="advanced"> - <th>End Gap Treatment</th> - <td id="opt_noendgaps"> - <span class="noendgaps_on">No cost</span> - <span class="noendgaps_off">Same cost as other gaps</span> - </td> - </tr> - <tr> - <td colspan="2" style="text-align: center"> - <a href="javascript:toggle_class(document.getElementById('tbl_settings'), 'hide_advanced')"> - <span class="show_more">Show Advanced Settings</span> - <span class="show_less">Hide Advanced Settings</span> - </a> - </td> - </tr> - </table> - <script> - { - $("opt_mod").className = data.options.mod; - $("opt_strand").className = (meme_alphabet.has_complement() ? (data.options.revcomp ? "both" : "given") : "none"); - $("opt_nmotifs").textContent = data.options.nmotifs; - $("opt_evt").textContent = (typeof data.options.evt === "number" ? data.options.evt : "no limit"); - $("opt_minw").textContent = data.options.minw; - $("opt_maxw").textContent = data.options.maxw; - $("opt_minsites").textContent = data.options.minsites; - $("opt_maxsites").textContent = data.options.maxsites; - $("opt_wnsites").textContent = data.options.wnsites; - $("opt_spmap").className = data.options.spmap; - $("opt_spfuzz").textContent = data.options.spfuzz; - $("opt_prior").className = data.options.prior; - $("opt_b").textContent = data.options.b; - $("opt_maxiter").textContent = data.options.maxiter; - $("opt_distance").textContent = data.options.distance; - $("opt_wg").textContent = data.options.wg; - $("opt_ws").textContent = data.options.ws; - $("opt_noendgaps").className = (data.options.noendgaps ? "on" : "off"); - $("opt_substring").className = (data.options.substring ? "on" : "off"); - } - </script> - </div> - <!-- list information on this program --> - <div id="info_sec" class="bar"> - <div class="subsection"> - <h5 id="version">MEME version</h5> - <span id="ins_version"></span> - (Release date: <span id="ins_release"></span>)<br> - </div> - <script> - $("ins_version").innerHTML = data["version"]; - $("ins_release").innerHTML = data["release"]; - </script> - <div class="subsection"> - <h5 id="reference">Reference</h5> - <span class="citation"> - Timothy L. Bailey and Charles Elkan, - "Fitting a mixture model by expectation maximization to discover motifs in biopolymers", - <em>Proceedings of the Second International Conference on Intelligent Systems - for Molecular Biology</em>, pp. 28-36, AAAI Press, Menlo Park, California, 1994. - </span> - </div> - <div class="subsection"> - <h5 id="command">Command line</h5> - <textarea id="cmd" rows="5" style="width:100%;" readonly="readonly"> - </textarea> - <script>$("cmd").value = data["cmd"].join(" ");</script> - </div> - </div> - - </body> -</html>
--- a/test-data/meme_output_test2.txt Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/meme_output_test2.txt Wed Dec 11 18:05:35 2019 -0500 @@ -1,88 +1,36 @@ ******************************************************************************** MEME - Motif discovery tool -******************************************************************************** -MEME version 4.12.0 (Release date: Tue Jun 27 16:22:50 2017 -0700) - -For further information on how to interpret these results or to get -a copy of the MEME software please access http://meme-suite.org . - -This file may be used as input to the MAST algorithm for searching -sequence databases for matches to groups of motifs. MAST is available -for interactive use and downloading at http://meme-suite.org . -******************************************************************************** - - -******************************************************************************** +MEME version 5.0.5 (Release date: Mon Mar 18 20:12:19 2019 -0700) REFERENCE -******************************************************************************** -If you use this program in your research, please cite: - -Timothy L. Bailey and Charles Elkan, -"Fitting a mixture model by expectation maximization to discover -motifs in biopolymers", Proceedings of the Second International -Conference on Intelligent Systems for Molecular Biology, pp. 28-36, -AAAI Press, Menlo Park, California, 1994. -******************************************************************************** - - -******************************************************************************** TRAINING SET -******************************************************************************** -DATAFILE= Galaxy_FASTA_Input +PRIMARY SEQUENCES= Galaxy_FASTA_Input +CONTROL SEQUENCES= --none-- ALPHABET= ACGT Sequence name Weight Length Sequence name Weight Length ------------- ------ ------ ------------- ------ ------ chr21_19617074_19617124_ 1.0000 50 chr21_26934381_26934431_ 1.0000 50 -chr21_28217753_28217803_ 1.0000 50 chr21_31710037_31710087_ 1.0000 50 -chr21_31744582_31744632_ 1.0000 50 chr21_31768316_31768366_ 1.0000 50 -chr21_31914206_31914256_ 1.0000 50 chr21_31933633_31933683_ 1.0000 50 -chr21_31962741_31962791_ 1.0000 50 chr21_31964683_31964733_ 1.0000 50 -chr21_31973364_31973414_ 1.0000 50 chr21_31992870_31992920_ 1.0000 50 -chr21_32185595_32185645_ 1.0000 50 chr21_32202076_32202126_ 1.0000 50 -chr21_32253899_32253949_ 1.0000 50 chr21_32410820_32410870_ 1.0000 50 -chr21_36411748_36411798_ 1.0000 50 chr21_37838750_37838800_ 1.0000 50 -chr21_45705687_45705737_ 1.0000 50 chr21_45971413_45971463_ 1.0000 50 -chr21_45978668_45978718_ 1.0000 50 chr21_45993530_45993580_ 1.0000 50 -chr21_46020421_46020471_ 1.0000 50 chr21_46031920_46031970_ 1.0000 50 -chr21_46046964_46047014_ 1.0000 50 chr21_46057197_46057247_ 1.0000 50 -chr21_46086869_46086919_ 1.0000 50 chr21_46102103_46102153_ 1.0000 50 -chr21_47517957_47518007_ 1.0000 50 chr21_47575506_47575556_ 1.0000 50 -******************************************************************************** - -******************************************************************************** COMMAND LINE SUMMARY -******************************************************************************** -This information can also be useful in the event you wish to report a -problem with the MEME software. - -command: meme meme_input_1.fasta -o meme_test2_out -nostatus -maxsize 1000000 -sf Galaxy_FASTA_Input -dna -mod zoops -nmotifs 1 -wnsites 0.8 -minw 8 -maxw 50 -wg 11 -ws 1 -maxiter 50 -distance 0.001 -prior dirichlet -b 0.01 -plib prior30.plib -spmap uni -spfuzz 0.5 - model: mod= zoops nmotifs= 1 evt= inf -object function= E-value of product of p-values +objective function: em= E-value of product of p-values + starts= E-value of product of p-values +strands: + width: minw= 8 maxw= 50 -width: wg= 11 ws= 1 endgaps= yes nsites: minsites= 2 maxsites= 30 wnsites= 0.8 theta: spmap= uni spfuzz= 0.5 -global: substring= yes branching= no wbranch= no em: prior= dirichlet b= 0.01 maxiter= 50 distance= 0.001 -data: n= 1500 N= 30 shuffle= -1 -strands: + -sample: seed= 0 ctfrac= -1 maxwords= -1 -Dirichlet mixture priors file: prior30.plib +trim: wg= 11 ws= 1 endgaps= yes +data: n= 1500 N= 30 +sample: seed= 0 hsfrac= 0 + searchsize= 1500 norand= no csites= 1000 +Dirichlet mixture priors file: Letter frequencies in dataset: A 0.294 C 0.231 G 0.257 T 0.217 -Background letter frequencies (from dataset with add-one prior applied): +Background letter frequencies (from file dataset with add-one prior applied): A 0.294 C 0.231 G 0.257 T 0.217 -******************************************************************************** - - -******************************************************************************** +Background model order: 0 MOTIF GGSRTATAAAA MEME-1 width = 11 sites = 30 llr = 254 E-value = 5.1e-040 -******************************************************************************** --------------------------------------------------------------------------------- Motif GGSRTATAAAA MEME-1 Description --------------------------------------------------------------------------------- Simplified A 3313:9:a798 pos.-specific C 1:3::1:::1: probability G 6756::::::2 @@ -103,124 +51,17 @@ Multilevel GGGGTATAAAA consensus AACA T sequence - --------------------------------------------------------------------------------- - --------------------------------------------------------------------------------- Motif GGSRTATAAAA MEME-1 sites sorted by position p-value --------------------------------------------------------------------------------- Sequence name Start P-value Site -------------- ----- --------- ----------- chr21_46046964_46047014_ 13 4.51e-07 AAGGCCAGGA GGGGTATAAAA GCCTGAGAGC -chr21_46031920_46031970_ 16 2.22e-06 ATACCCAGGG AGGGTATAAAA CCTCAGCAGC -chr21_32202076_32202126_ 14 2.74e-06 CCACCAGCTT GAGGTATAAAA AGCCCTGTAC -chr21_46057197_46057247_ 37 4.86e-06 ACAGGCCCTG GGCATATAAAA GCC -chr21_45993530_45993580_ 8 4.86e-06 CCAAGGA GGAGTATAAAA GCCCCACAAA -chr21_45971413_45971463_ 10 4.86e-06 CAGGCCCTG GGCATATAAAA GCCCCAGCAG -chr21_31964683_31964733_ 14 4.86e-06 GATTCACTGA GGCATATAAAA GGCCCTCTGC -chr21_47517957_47518007_ 33 6.48e-06 CCGGCGGGGC GGGGTATAAAG GGGGCGG -chr21_45978668_45978718_ 5 6.48e-06 CAGA GGGGTATAAAG GTTCCGACCA -chr21_32185595_32185645_ 19 6.48e-06 CACCAGAGCT GGGATATATAA AGAAGGTTCT -chr21_32410820_32410870_ 22 1.38e-05 AATCACTGAG GATGTATAAAA GTCCCAGGGA -chr21_31992870_31992920_ 17 1.38e-05 CACTATTGAA GATGTATAAAA TTTCATTTGC -chr21_19617074_19617124_ 40 1.41e-05 CCTCGGGACG TGGGTATATAA -chr21_31914206_31914256_ 16 1.61e-05 CCCACTACTT AGAGTATAAAA TCATTCTGAG -chr21_46020421_46020471_ 3 1.95e-05 GA GACATATAAAA GCCAACATCC -chr21_32253899_32253949_ 18 1.95e-05 CCCACCAGCA AGGATATATAA AAGCTCAGGA -chr21_45705687_45705737_ 38 2.16e-05 CGTGGTCGCG GGGGTATAACA GC -chr21_47575506_47575556_ 31 3.04e-05 GCTGCCGGTG AGCGTATAAAG GCCCTGGCG -chr21_31744582_31744632_ 13 3.04e-05 CAGGTCTAAG AGCATATATAA CTTGGAGTCC -chr21_31768316_31768366_ 1 3.67e-05 . AACGTATATAA ATGGTCCTGT -chr21_26934381_26934431_ 28 3.93e-05 AGTCACAAGT GAGTTATAAAA GGGTCGCACG -chr21_31933633_31933683_ 5 5.65e-05 TCAG AGTATATATAA ATGTTCCTGT -chr21_31710037_31710087_ 15 6.24e-05 CCCAGGTTTC TGAGTATATAA TCGCCGCACC -chr21_36411748_36411798_ 23 7.15e-05 AGTTTCAGTT GGCATCtaaaa attatataac -chr21_46102103_46102153_ 37 1.39e-04 TGCCTGGGTC CAGGTATAAAG GCT -chr21_46086869_46086919_ 38 1.39e-04 TGCCTGGGCC CAGGTATAAAG GC -chr21_37838750_37838800_ 3 4.81e-04 ga tggttttataa ggggcctcac -chr21_31962741_31962791_ 14 8.57e-04 TATAACTCAG GTTGGATAAAA TAATTTGTAC -chr21_31973364_31973414_ 8 1.47e-03 aaactta aaactctataa acttaaaact -chr21_28217753_28217803_ 27 2.64e-03 GGTGGGGGTG GGGGTTTCACT GGTCCACTAT --------------------------------------------------------------------------------- - --------------------------------------------------------------------------------- Motif GGSRTATAAAA MEME-1 block diagrams --------------------------------------------------------------------------------- SEQUENCE NAME POSITION P-VALUE MOTIF DIAGRAM ------------- ---------------- ------------- chr21_46046964_46047014_ 4.5e-07 12_[+1]_27 -chr21_46031920_46031970_ 2.2e-06 15_[+1]_24 -chr21_32202076_32202126_ 2.7e-06 13_[+1]_26 -chr21_46057197_46057247_ 4.9e-06 36_[+1]_3 -chr21_45993530_45993580_ 4.9e-06 7_[+1]_32 -chr21_45971413_45971463_ 4.9e-06 9_[+1]_30 -chr21_31964683_31964733_ 4.9e-06 13_[+1]_26 -chr21_47517957_47518007_ 6.5e-06 32_[+1]_7 -chr21_45978668_45978718_ 6.5e-06 4_[+1]_35 -chr21_32185595_32185645_ 6.5e-06 18_[+1]_21 -chr21_32410820_32410870_ 1.4e-05 21_[+1]_18 -chr21_31992870_31992920_ 1.4e-05 16_[+1]_23 -chr21_19617074_19617124_ 1.4e-05 39_[+1] -chr21_31914206_31914256_ 1.6e-05 15_[+1]_24 -chr21_46020421_46020471_ 1.9e-05 2_[+1]_37 -chr21_32253899_32253949_ 1.9e-05 17_[+1]_22 -chr21_45705687_45705737_ 2.2e-05 37_[+1]_2 -chr21_47575506_47575556_ 3e-05 30_[+1]_9 -chr21_31744582_31744632_ 3e-05 12_[+1]_27 -chr21_31768316_31768366_ 3.7e-05 [+1]_39 -chr21_26934381_26934431_ 3.9e-05 27_[+1]_12 -chr21_31933633_31933683_ 5.6e-05 4_[+1]_35 -chr21_31710037_31710087_ 6.2e-05 14_[+1]_25 -chr21_36411748_36411798_ 7.1e-05 22_[+1]_17 -chr21_46102103_46102153_ 0.00014 36_[+1]_3 -chr21_46086869_46086919_ 0.00014 37_[+1]_2 -chr21_37838750_37838800_ 0.00048 2_[+1]_37 -chr21_31962741_31962791_ 0.00086 13_[+1]_26 -chr21_31973364_31973414_ 0.0015 7_[+1]_32 -chr21_28217753_28217803_ 0.0026 26_[+1]_13 --------------------------------------------------------------------------------- - --------------------------------------------------------------------------------- Motif GGSRTATAAAA MEME-1 in BLOCKS format --------------------------------------------------------------------------------- BL MOTIF GGSRTATAAAA width=11 seqs=30 chr21_46046964_46047014_ ( 13) GGGGTATAAAA 1 -chr21_46031920_46031970_ ( 16) AGGGTATAAAA 1 -chr21_32202076_32202126_ ( 14) GAGGTATAAAA 1 -chr21_46057197_46057247_ ( 37) GGCATATAAAA 1 -chr21_45993530_45993580_ ( 8) GGAGTATAAAA 1 -chr21_45971413_45971463_ ( 10) GGCATATAAAA 1 -chr21_31964683_31964733_ ( 14) GGCATATAAAA 1 -chr21_47517957_47518007_ ( 33) GGGGTATAAAG 1 -chr21_45978668_45978718_ ( 5) GGGGTATAAAG 1 -chr21_32185595_32185645_ ( 19) GGGATATATAA 1 -chr21_32410820_32410870_ ( 22) GATGTATAAAA 1 -chr21_31992870_31992920_ ( 17) GATGTATAAAA 1 -chr21_19617074_19617124_ ( 40) TGGGTATATAA 1 -chr21_31914206_31914256_ ( 16) AGAGTATAAAA 1 -chr21_46020421_46020471_ ( 3) GACATATAAAA 1 -chr21_32253899_32253949_ ( 18) AGGATATATAA 1 -chr21_45705687_45705737_ ( 38) GGGGTATAACA 1 -chr21_47575506_47575556_ ( 31) AGCGTATAAAG 1 -chr21_31744582_31744632_ ( 13) AGCATATATAA 1 -chr21_31768316_31768366_ ( 1) AACGTATATAA 1 -chr21_26934381_26934431_ ( 28) GAGTTATAAAA 1 -chr21_31933633_31933683_ ( 5) AGTATATATAA 1 -chr21_31710037_31710087_ ( 15) TGAGTATATAA 1 -chr21_36411748_36411798_ ( 23) GGCATCTAAAA 1 -chr21_46102103_46102153_ ( 37) CAGGTATAAAG 1 -chr21_46086869_46086919_ ( 38) CAGGTATAAAG 1 -chr21_37838750_37838800_ ( 3) TGGTTTTATAA 1 -chr21_31962741_31962791_ ( 14) GTTGGATAAAA 1 -chr21_31973364_31973414_ ( 8) AAACTCTATAA 1 -chr21_28217753_28217803_ ( 27) GGGGTTTCACT 1 -// - --------------------------------------------------------------------------------- - --------------------------------------------------------------------------------- Motif GGSRTATAAAA MEME-1 position-specific scoring matrix --------------------------------------------------------------------------------- log-odds matrix: alength= 4 w= 11 n= 1200 bayes= 5.2854 E= 5.1e-040 -14 -179 114 -112 3 -1155 137 -270 @@ -233,87 +74,13 @@ 125 -1155 -1155 46 167 -179 -1155 -1155 144 -1155 -63 -270 --------------------------------------------------------------------------------- - --------------------------------------------------------------------------------- Motif GGSRTATAAAA MEME-1 position-specific probability matrix --------------------------------------------------------------------------------- letter-probability matrix: alength= 4 w= 11 nsites= 30 E= 5.1e-040 0.266667 0.066667 0.566667 0.100000 - 0.300000 0.000000 0.666667 0.033333 - 0.133333 0.266667 0.466667 0.133333 - 0.300000 0.033333 0.600000 0.066667 - 0.000000 0.000000 0.033333 0.966667 - 0.866667 0.066667 0.000000 0.066667 - 0.000000 0.000000 0.000000 1.000000 - 0.966667 0.033333 0.000000 0.000000 - 0.700000 0.000000 0.000000 0.300000 - 0.933333 0.066667 0.000000 0.000000 - 0.800000 0.000000 0.166667 0.033333 --------------------------------------------------------------------------------- - --------------------------------------------------------------------------------- Motif GGSRTATAAAA MEME-1 regular expression --------------------------------------------------------------------------------- [GA][GA][GC][GA]TATA[AT]AA --------------------------------------------------------------------------------- - - - - -Time 0.38 secs. - -******************************************************************************** - - -******************************************************************************** SUMMARY OF MOTIFS -******************************************************************************** - --------------------------------------------------------------------------------- Combined block diagrams: non-overlapping sites with p-value < 0.0001 --------------------------------------------------------------------------------- SEQUENCE NAME COMBINED P-VALUE MOTIF DIAGRAM -------------- ---------------- ------------- chr21_19617074_19617124_ 5.63e-04 39_[+1(1.41e-05)] -chr21_26934381_26934431_ 1.57e-03 27_[+1(3.93e-05)]_12 -chr21_28217753_28217803_ 1.00e-01 50 -chr21_31710037_31710087_ 2.49e-03 14_[+1(6.24e-05)]_25 -chr21_31744582_31744632_ 1.22e-03 12_[+1(3.04e-05)]_27 -chr21_31768316_31768366_ 1.47e-03 [+1(3.67e-05)]_39 -chr21_31914206_31914256_ 6.45e-04 15_[+1(1.61e-05)]_24 -chr21_31933633_31933683_ 2.26e-03 4_[+1(5.65e-05)]_35 -chr21_31962741_31962791_ 3.37e-02 50 -chr21_31964683_31964733_ 1.95e-04 13_[+1(4.86e-06)]_26 -chr21_31973364_31973414_ 5.73e-02 50 -chr21_31992870_31992920_ 5.52e-04 16_[+1(1.38e-05)]_23 -chr21_32185595_32185645_ 2.59e-04 18_[+1(6.48e-06)]_21 -chr21_32202076_32202126_ 1.10e-04 13_[+1(2.74e-06)]_26 -chr21_32253899_32253949_ 7.78e-04 17_[+1(1.95e-05)]_22 -chr21_32410820_32410870_ 5.52e-04 21_[+1(1.38e-05)]_18 -chr21_36411748_36411798_ 2.85e-03 22_[+1(7.15e-05)]_17 -chr21_37838750_37838800_ 1.90e-02 50 -chr21_45705687_45705737_ 8.63e-04 37_[+1(2.16e-05)]_2 -chr21_45971413_45971463_ 1.95e-04 9_[+1(4.86e-06)]_30 -chr21_45978668_45978718_ 2.59e-04 4_[+1(6.48e-06)]_35 -chr21_45993530_45993580_ 1.95e-04 7_[+1(4.86e-06)]_32 -chr21_46020421_46020471_ 7.78e-04 2_[+1(1.95e-05)]_37 -chr21_46031920_46031970_ 8.89e-05 15_[+1(2.22e-06)]_24 -chr21_46046964_46047014_ 1.80e-05 12_[+1(4.51e-07)]_27 -chr21_46057197_46057247_ 1.95e-04 36_[+1(4.86e-06)]_3 -chr21_46086869_46086919_ 5.54e-03 50 -chr21_46102103_46102153_ 5.54e-03 50 -chr21_47517957_47518007_ 2.59e-04 32_[+1(6.48e-06)]_7 -chr21_47575506_47575556_ 1.22e-03 30_[+1(3.04e-05)]_9 --------------------------------------------------------------------------------- - -******************************************************************************** - - -******************************************************************************** Stopped because requested number of motifs (1) found. -******************************************************************************** - -CPU: ThinkPad-T450s - -********************************************************************************
--- a/test-data/meme_output_test2.xml Wed Dec 12 02:50:48 2018 -0500 +++ b/test-data/meme_output_test2.xml Wed Dec 11 18:05:35 2019 -0500 @@ -10,975 +10,73 @@ <!ATTLIST MEME version CDATA #REQUIRED release CDATA #REQUIRED -> <!-- Training-set elements --> <!ELEMENT training_set (alphabet, ambigs, sequence*, letter_frequencies)> -<!ATTLIST training_set datafile CDATA #REQUIRED length CDATA #REQUIRED> +<!ATTLIST training_set primary_sequences CDATA #REQUIRED primary_count CDATA #REQUIRED primary_positions CDATA #REQUIRED + control_sequences CDATA "" control_count CDATA "" control_positions CDATA ""> <!ELEMENT alphabet (letter*)> <!ATTLIST alphabet name CDATA #REQUIRED> -<!ELEMENT ambigs (letter*)> -<!ELEMENT letter EMPTY> -<!ATTLIST letter id ID #REQUIRED> -<!ATTLIST letter symbol CDATA #REQUIRED> -<!ATTLIST letter equals CDATA #IMPLIED> -<!ATTLIST letter aliases CDATA #IMPLIED> -<!ATTLIST letter complement CDATA #IMPLIED> -<!ATTLIST letter name CDATA #IMPLIED> -<!ATTLIST letter colour CDATA #IMPLIED> -<!ELEMENT sequence EMPTY> -<!ATTLIST sequence id ID #REQUIRED - name CDATA #REQUIRED - length CDATA #REQUIRED - weight CDATA #REQUIRED -> <!ELEMENT letter_frequencies (alphabet_array)> - <!-- Model elements --> <!ELEMENT model ( command_line, host, type, nmotifs, - evalue_threshold, - object_function, - spfun, - min_width, - max_width, - wg, - ws, - endgaps, - minsites, - maxsites, - wnsites, - spmap, - spfuzz, - prior, - beta, - maxiter, - distance, - num_sequences, - num_positions, - seed, - hsfrac, - maxwords, - maxsize, - csites, - strands, - priors_file, - reason_for_stopping, - back_order, - background_frequencies )> <!ELEMENT command_line (#PCDATA)*> -<!ELEMENT host (#PCDATA)*> -<!ELEMENT type (#PCDATA)*> -<!ELEMENT nmotifs (#PCDATA)*> -<!ELEMENT evalue_threshold (#PCDATA)*> -<!ELEMENT object_function (#PCDATA)*> -<!ELEMENT spfun (#PCDATA)*> -<!ELEMENT min_width (#PCDATA)*> -<!ELEMENT max_width (#PCDATA)*> -<!ELEMENT wg (#PCDATA)*> -<!ELEMENT ws (#PCDATA)*> -<!ELEMENT endgaps (#PCDATA)*> -<!ELEMENT minsites (#PCDATA)*> -<!ELEMENT maxsites (#PCDATA)*> -<!ELEMENT wnsites (#PCDATA)*> -<!ELEMENT spmap (#PCDATA)*> -<!ELEMENT spfuzz (#PCDATA)*> -<!ELEMENT prior (#PCDATA)*> -<!ELEMENT beta (#PCDATA)*> -<!ELEMENT maxiter (#PCDATA)*> -<!ELEMENT distance (#PCDATA)*> -<!ELEMENT num_sequences (#PCDATA)*> -<!ELEMENT num_positions (#PCDATA)*> -<!ELEMENT seed (#PCDATA)*> -<!ELEMENT hsfrac (#PCDATA)*> -<!ELEMENT maxwords (#PCDATA)*> -<!ELEMENT maxsites (#PCDATA)*> -<!ELEMENT csites (#PCDATA)*> -<!ELEMENT strands (#PCDATA)*> -<!ELEMENT priors_file (#PCDATA)*> -<!ELEMENT reason_for_stopping (#PCDATA)*> -<!ELEMENT back_order (#PCDATA)*> -<!ELEMENT background_frequencies (alphabet_array)> -<!ATTLIST background_frequencies source CDATA #REQUIRED> - -<!-- Motif elements --> <!ELEMENT motifs (motif*)> <!ELEMENT motif (scores, probabilities, regular_expression?, contributing_sites)> -<!ATTLIST motif id ID #REQUIRED - name CDATA #REQUIRED - alt CDATA "" - width CDATA #REQUIRED - sites CDATA #REQUIRED - llr CDATA #REQUIRED - ic CDATA #REQUIRED - re CDATA #REQUIRED - bayes_threshold CDATA #REQUIRED - e_value CDATA #REQUIRED - elapsed_time CDATA #REQUIRED - url CDATA "" -> -<!ELEMENT scores (alphabet_matrix)> -<!ELEMENT probabilities (alphabet_matrix)> -<!ELEMENT regular_expression (#PCDATA)*> - -<!-- Contributing site elements --> -<!-- Contributing sites are motif occurences found during the motif discovery phase --> -<!ELEMENT contributing_sites (contributing_site*)> -<!ELEMENT contributing_site (left_flank, site, right_flank)> -<!ATTLIST contributing_site sequence_id IDREF #REQUIRED - position CDATA #REQUIRED - strand (plus|minus|none) 'none' - pvalue CDATA #REQUIRED -> <!-- The left_flank contains the sequence for 10 bases to the left of the motif start --> <!ELEMENT left_flank (#PCDATA)> <!-- The site contains the sequence for the motif instance --> <!ELEMENT site (letter_ref*)> <!-- The right_flank contains the sequence for 10 bases to the right of the motif end --> <!ELEMENT right_flank (#PCDATA)> - <!-- Scanned site elements --> <!-- Scanned sites are motif occurences found during the sequence scan phase --> <!ELEMENT scanned_sites_summary (scanned_sites*)> -<!ATTLIST scanned_sites_summary p_thresh CDATA #REQUIRED> -<!ELEMENT scanned_sites (scanned_site*)> -<!ATTLIST scanned_sites sequence_id IDREF #REQUIRED - pvalue CDATA #REQUIRED - num_sites CDATA #REQUIRED> -<!ELEMENT scanned_site EMPTY> -<!ATTLIST scanned_site motif_id IDREF #REQUIRED - strand (plus|minus|none) 'none' - position CDATA #REQUIRED - pvalue CDATA #REQUIRED> - -<!-- Utility elements --> -<!-- A reference to a letter in the alphabet --> -<!ELEMENT letter_ref EMPTY> -<!ATTLIST letter_ref letter_id IDREF #REQUIRED> -<!-- A alphabet-array contains one floating point value for each letter in an alphabet --> -<!ELEMENT alphabet_array (value*)> -<!ELEMENT value (#PCDATA)> -<!ATTLIST value letter_id IDREF #REQUIRED> - -<!-- A alphabet_matrix contains one alphabet_array for each position in a motif --> -<!ELEMENT alphabet_matrix (alphabet_array*)> - -]> -<!-- Begin document body --> -<MEME version="4.12.0" release="Tue Jun 27 16:22:50 2017 -0700"> -<training_set datafile="Galaxy_FASTA_Input" length="30"> +<training_set primary_sequences="Galaxy_FASTA_Input" primary_count="30" primary_positions="1500" control_sequences="--none--" control_count="0" control_positions="0"> <alphabet name="DNA" like="dna"> <letter id="A" symbol="A" complement="T" name="Adenine" colour="CC0000"/> -<letter id="C" symbol="C" complement="G" name="Cytosine" colour="0000CC"/> -<letter id="G" symbol="G" complement="C" name="Guanine" colour="FFB300"/> -<letter id="T" symbol="T" aliases="U" complement="A" name="Thymine" colour="008000"/> -<letter id="N" symbol="N" aliases="X." equals="ACGT" name="Any base"/> -<letter id="V" symbol="V" equals="ACG" name="Not T"/> -<letter id="H" symbol="H" equals="ACT" name="Not G"/> -<letter id="D" symbol="D" equals="AGT" name="Not C"/> -<letter id="B" symbol="B" equals="CGT" name="Not A"/> -<letter id="M" symbol="M" equals="AC" name="Amino"/> -<letter id="R" symbol="R" equals="AG" name="Purine"/> -<letter id="W" symbol="W" equals="AT" name="Weak"/> -<letter id="S" symbol="S" equals="CG" name="Strong"/> -<letter id="Y" symbol="Y" equals="CT" name="Pyrimidine"/> -<letter id="K" symbol="K" equals="GT" name="Keto"/> -</alphabet> <sequence id="sequence_0" name="chr21_19617074_19617124_+" length="50" weight="1.000000" /> -<sequence id="sequence_1" name="chr21_26934381_26934431_+" length="50" weight="1.000000" /> -<sequence id="sequence_2" name="chr21_28217753_28217803_-" length="50" weight="1.000000" /> -<sequence id="sequence_3" name="chr21_31710037_31710087_-" length="50" weight="1.000000" /> -<sequence id="sequence_4" name="chr21_31744582_31744632_-" length="50" weight="1.000000" /> -<sequence id="sequence_5" name="chr21_31768316_31768366_+" length="50" weight="1.000000" /> -<sequence id="sequence_6" name="chr21_31914206_31914256_-" length="50" weight="1.000000" /> -<sequence id="sequence_7" name="chr21_31933633_31933683_-" length="50" weight="1.000000" /> -<sequence id="sequence_8" name="chr21_31962741_31962791_-" length="50" weight="1.000000" /> -<sequence id="sequence_9" name="chr21_31964683_31964733_+" length="50" weight="1.000000" /> -<sequence id="sequence_10" name="chr21_31973364_31973414_+" length="50" weight="1.000000" /> -<sequence id="sequence_11" name="chr21_31992870_31992920_+" length="50" weight="1.000000" /> -<sequence id="sequence_12" name="chr21_32185595_32185645_-" length="50" weight="1.000000" /> -<sequence id="sequence_13" name="chr21_32202076_32202126_-" length="50" weight="1.000000" /> -<sequence id="sequence_14" name="chr21_32253899_32253949_-" length="50" weight="1.000000" /> -<sequence id="sequence_15" name="chr21_32410820_32410870_-" length="50" weight="1.000000" /> -<sequence id="sequence_16" name="chr21_36411748_36411798_-" length="50" weight="1.000000" /> -<sequence id="sequence_17" name="chr21_37838750_37838800_-" length="50" weight="1.000000" /> -<sequence id="sequence_18" name="chr21_45705687_45705737_+" length="50" weight="1.000000" /> -<sequence id="sequence_19" name="chr21_45971413_45971463_-" length="50" weight="1.000000" /> -<sequence id="sequence_20" name="chr21_45978668_45978718_-" length="50" weight="1.000000" /> -<sequence id="sequence_21" name="chr21_45993530_45993580_+" length="50" weight="1.000000" /> -<sequence id="sequence_22" name="chr21_46020421_46020471_+" length="50" weight="1.000000" /> -<sequence id="sequence_23" name="chr21_46031920_46031970_+" length="50" weight="1.000000" /> -<sequence id="sequence_24" name="chr21_46046964_46047014_+" length="50" weight="1.000000" /> -<sequence id="sequence_25" name="chr21_46057197_46057247_+" length="50" weight="1.000000" /> -<sequence id="sequence_26" name="chr21_46086869_46086919_-" length="50" weight="1.000000" /> -<sequence id="sequence_27" name="chr21_46102103_46102153_-" length="50" weight="1.000000" /> -<sequence id="sequence_28" name="chr21_47517957_47518007_+" length="50" weight="1.000000" /> -<sequence id="sequence_29" name="chr21_47575506_47575556_-" length="50" weight="1.000000" /> -<letter_frequencies> -<alphabet_array> -<value letter_id="A">0.294</value> -<value letter_id="C">0.231</value> <value letter_id="G">0.257</value> <value letter_id="T">0.217</value> </alphabet_array> -</letter_frequencies> -</training_set> <model> -<command_line>meme meme_input_1.fasta -o meme_test2_out -nostatus -maxsize 1000000 -sf Galaxy_FASTA_Input -dna -mod zoops -nmotifs 1 -wnsites 0.8 -minw 8 -maxw 50 -wg 11 -ws 1 -maxiter 50 -distance 0.001 -prior dirichlet -b 0.01 -plib prior30.plib -spmap uni -spfuzz 0.5 </command_line> -<host>ThinkPad-T450s</host> <type>zoops</type> -<nmotifs>1</nmotifs> -<evalue_threshold>inf</evalue_threshold> -<object_function>E-value of product of p-values</object_function> -<use_llr>0</use_llr> -<min_width>8</min_width> -<max_width>50</max_width> -<wg>11</wg> -<ws>1</ws> -<endgaps>yes</endgaps> -<substring>yes</substring> -<minsites>2</minsites> -<maxsites>30</maxsites> -<wnsites>0.8</wnsites> -<spmap>uni</spmap> -<spfuzz>0.5</spfuzz> -<prior>dirichlet</prior> -<beta>0.01</beta> -<maxiter>50</maxiter> -<distance>0.001</distance> -<num_sequences>30</num_sequences> -<num_positions>1500</num_positions> -<seed>0</seed> -<ctfrac>-1</ctfrac> -<maxwords>-1</maxwords> -<strands>forward</strands> -<priors_file>prior30.plib</priors_file> -<reason_for_stopping>Stopped because requested number of motifs (1) found.</reason_for_stopping> -<background_frequencies source="dataset with add-one prior applied"> -<alphabet_array> -<value letter_id="A">0.294</value> -<value letter_id="C">0.231</value> -<value letter_id="G">0.257</value> -<value letter_id="T">0.217</value> -</alphabet_array> -</background_frequencies> -</model> -<motifs> -<motif id="motif_1" name="GGSRTATAAAA" alt="MEME-1" width="11" sites="30" ic="13.0" re="12.2" llr="254" e_value="5.1e-040" bayes_threshold="5.2854" elapsed_time="0.376000"> <scores> <alphabet_matrix> <alphabet_array> <value letter_id="A">-14</value> -<value letter_id="C">-179</value> -<value letter_id="G">114</value> -<value letter_id="T">-112</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">3</value> -<value letter_id="C">-1155</value> -<value letter_id="G">137</value> -<value letter_id="T">-270</value> -</alphabet_array> -<alphabet_array> -<value letter_id="A">-114</value> -<value letter_id="C">20</value> -<value letter_id="G">86</value> -<value letter_id="T">-71</value> -</alphabet_array> -<alphabet_array> -<value letter_id="A">3</value> -<value letter_id="C">-279</value> -<value letter_id="G">122</value> -<value letter_id="T">-170</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">-1155</value> -<value letter_id="C">-1155</value> -<value letter_id="G">-295</value> -<value letter_id="T">215</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">156</value> -<value letter_id="C">-179</value> -<value letter_id="G">-1155</value> -<value letter_id="T">-170</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">-1155</value> -<value letter_id="C">-1155</value> -<value letter_id="G">-1155</value> -<value letter_id="T">220</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">172</value> -<value letter_id="C">-279</value> -<value letter_id="G">-1155</value> -<value letter_id="T">-1155</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">125</value> -<value letter_id="C">-1155</value> -<value letter_id="G">-1155</value> -<value letter_id="T">46</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">167</value> -<value letter_id="C">-179</value> -<value letter_id="G">-1155</value> -<value letter_id="T">-1155</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">144</value> -<value letter_id="C">-1155</value> -<value letter_id="G">-63</value> -<value letter_id="T">-270</value> -</alphabet_array> -</alphabet_matrix> -</scores> -<probabilities> -<alphabet_matrix> -<alphabet_array> <value letter_id="A">0.266667</value> -<value letter_id="C">0.066667</value> -<value letter_id="G">0.566667</value> -<value letter_id="T">0.100000</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">0.300000</value> -<value letter_id="C">0.000000</value> -<value letter_id="G">0.666667</value> -<value letter_id="T">0.033333</value> -</alphabet_array> -<alphabet_array> -<value letter_id="A">0.133333</value> -<value letter_id="C">0.266667</value> -<value letter_id="G">0.466667</value> -<value letter_id="T">0.133333</value> -</alphabet_array> -<alphabet_array> -<value letter_id="A">0.300000</value> -<value letter_id="C">0.033333</value> -<value letter_id="G">0.600000</value> -<value letter_id="T">0.066667</value> -</alphabet_array> -<alphabet_array> -<value letter_id="A">0.000000</value> -<value letter_id="C">0.000000</value> -<value letter_id="G">0.033333</value> -<value letter_id="T">0.966667</value> -</alphabet_array> -<alphabet_array> -<value letter_id="A">0.866667</value> -<value letter_id="C">0.066667</value> -<value letter_id="G">0.000000</value> -<value letter_id="T">0.066667</value> -</alphabet_array> -<alphabet_array> -<value letter_id="A">0.000000</value> -<value letter_id="C">0.000000</value> -<value letter_id="G">0.000000</value> -<value letter_id="T">1.000000</value> -</alphabet_array> -<alphabet_array> -<value letter_id="A">0.966667</value> -<value letter_id="C">0.033333</value> -<value letter_id="G">0.000000</value> -<value letter_id="T">0.000000</value> -</alphabet_array> -<alphabet_array> -<value letter_id="A">0.700000</value> -<value letter_id="C">0.000000</value> -<value letter_id="G">0.000000</value> -<value letter_id="T">0.300000</value> -</alphabet_array> -<alphabet_array> -<value letter_id="A">0.933333</value> -<value letter_id="C">0.066667</value> -<value letter_id="G">0.000000</value> -<value letter_id="T">0.000000</value> -</alphabet_array> -<alphabet_array> <value letter_id="A">0.800000</value> -<value letter_id="C">0.000000</value> -<value letter_id="G">0.166667</value> -<value letter_id="T">0.033333</value> -</alphabet_array> -</alphabet_matrix> -</probabilities> -<regular_expression> -[GA][GA][GC][GA]TATA[AT]AA -</regular_expression> -<contributing_sites> <contributing_site sequence_id="sequence_24" position="12" strand="plus" pvalue="4.51e-07" > <left_flank>AAGGCCAGGA</left_flank> -<site> <letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> <right_flank>GCCTGAGAGC</right_flank> -</contributing_site> <contributing_site sequence_id="sequence_23" position="15" strand="plus" pvalue="2.22e-06" > -<left_flank>ATACCCAGGG</left_flank> -<site> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>CCTCAGCAGC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_13" position="13" strand="plus" pvalue="2.74e-06" > -<left_flank>CCACCAGCTT</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>AGCCCTGTAC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_25" position="36" strand="plus" pvalue="4.86e-06" > -<left_flank>ACAGGCCCTG</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>GCC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_21" position="7" strand="plus" pvalue="4.86e-06" > -<left_flank>CCAAGGA</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>GCCCCACAAA</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_19" position="9" strand="plus" pvalue="4.86e-06" > -<left_flank>CAGGCCCTG</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>GCCCCAGCAG</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_9" position="13" strand="plus" pvalue="4.86e-06" > -<left_flank>GATTCACTGA</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>GGCCCTCTGC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_28" position="32" strand="plus" pvalue="6.48e-06" > -<left_flank>CCGGCGGGGC</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -</site> -<right_flank>GGGGCGG</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_20" position="4" strand="plus" pvalue="6.48e-06" > -<left_flank>CAGA</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> <letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -</site> -<right_flank>GTTCCGACCA</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_12" position="18" strand="plus" pvalue="6.48e-06" > -<left_flank>CACCAGAGCT</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>AGAAGGTTCT</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_15" position="21" strand="plus" pvalue="1.38e-05" > -<left_flank>AATCACTGAG</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>GTCCCAGGGA</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_11" position="16" strand="plus" pvalue="1.38e-05" > -<left_flank>CACTATTGAA</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>TTTCATTTGC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_0" position="39" strand="plus" pvalue="1.41e-05" > -<left_flank>CCTCGGGACG</left_flank> -<site> -<letter_ref letter_id="T"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank></right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_6" position="15" strand="plus" pvalue="1.61e-05" > -<left_flank>CCCACTACTT</left_flank> -<site> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>TCATTCTGAG</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_22" position="2" strand="plus" pvalue="1.95e-05" > -<left_flank>GA</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>GCCAACATCC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_14" position="17" strand="plus" pvalue="1.95e-05" > -<left_flank>CCCACCAGCA</left_flank> -<site> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>AAGCTCAGGA</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_18" position="37" strand="plus" pvalue="2.16e-05" > +<contributing_site sequence_id="sequence_13" position="13" strand="plus" pvalue="2.74e-06" > +<right_flank>AGCCCTGTAC</right_flank> +<contributing_site sequence_id="sequence_25" position="36" strand="plus" pvalue="4.86e-06" > <left_flank>CGTGGTCGCG</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -</site> <right_flank>GC</right_flank> -</contributing_site> <contributing_site sequence_id="sequence_29" position="30" strand="plus" pvalue="3.04e-05" > <left_flank>GCTGCCGGTG</left_flank> -<site> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -</site> <right_flank>GCCCTGGCG</right_flank> -</contributing_site> <contributing_site sequence_id="sequence_4" position="12" strand="plus" pvalue="3.04e-05" > -<left_flank>CAGGTCTAAG</left_flank> -<site> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>CTTGGAGTCC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_5" position="0" strand="plus" pvalue="3.67e-05" > -<left_flank></left_flank> -<site> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>ATGGTCCTGT</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_1" position="27" strand="plus" pvalue="3.93e-05" > -<left_flank>AGTCACAAGT</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>GGGTCGCACG</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_7" position="4" strand="plus" pvalue="5.65e-05" > -<left_flank>TCAG</left_flank> -<site> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>ATGTTCCTGT</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_3" position="14" strand="plus" pvalue="6.24e-05" > -<left_flank>CCCAGGTTTC</left_flank> -<site> -<letter_ref letter_id="T"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>TCGCCGCACC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_16" position="22" strand="plus" pvalue="7.15e-05" > -<left_flank>AGTTTCAGTT</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>attatataac</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_27" position="36" strand="plus" pvalue="1.39e-04" > -<left_flank>TGCCTGGGTC</left_flank> -<site> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -</site> -<right_flank>GCT</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_26" position="37" strand="plus" pvalue="1.39e-04" > -<left_flank>TGCCTGGGCC</left_flank> -<site> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="G"/> -</site> -<right_flank>GC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_17" position="2" strand="plus" pvalue="4.81e-04" > -<left_flank>ga</left_flank> -<site> -<letter_ref letter_id="T"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>ggggcctcac</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_8" position="13" strand="plus" pvalue="8.57e-04" > -<left_flank>TATAACTCAG</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>TAATTTGTAC</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_10" position="7" strand="plus" pvalue="1.47e-03" > -<left_flank>aaactta</left_flank> -<site> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="A"/> -</site> -<right_flank>acttaaaact</right_flank> -</contributing_site> -<contributing_site sequence_id="sequence_2" position="26" strand="plus" pvalue="2.64e-03" > -<left_flank>GGTGGGGGTG</left_flank> -<site> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="G"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="T"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="A"/> -<letter_ref letter_id="C"/> -<letter_ref letter_id="T"/> -</site> -<right_flank>GGTCCACTAT</right_flank> -</contributing_site> -</contributing_sites> -</motif> -</motifs> <scanned_sites_summary p_thresh="0.0001"> <scanned_sites sequence_id="sequence_0" pvalue="5.63e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="39" pvalue="1.41e-05"/> -</scanned_sites> <scanned_sites sequence_id="sequence_1" pvalue="1.57e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="27" pvalue="3.93e-05"/> -</scanned_sites> <scanned_sites sequence_id="sequence_2" pvalue="1.00e-01" num_sites="0"></scanned_sites> -<scanned_sites sequence_id="sequence_3" pvalue="2.49e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="14" pvalue="6.24e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_4" pvalue="1.22e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="12" pvalue="3.04e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_5" pvalue="1.47e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="0" pvalue="3.67e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_6" pvalue="6.45e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="15" pvalue="1.61e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_7" pvalue="2.26e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="4" pvalue="5.65e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_8" pvalue="3.37e-02" num_sites="0"></scanned_sites> -<scanned_sites sequence_id="sequence_9" pvalue="1.95e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="13" pvalue="4.86e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_10" pvalue="5.73e-02" num_sites="0"></scanned_sites> -<scanned_sites sequence_id="sequence_11" pvalue="5.52e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="16" pvalue="1.38e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_12" pvalue="2.59e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="18" pvalue="6.48e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_13" pvalue="1.10e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="13" pvalue="2.74e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_14" pvalue="7.78e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="17" pvalue="1.95e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_15" pvalue="5.52e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="21" pvalue="1.38e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_16" pvalue="2.85e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="22" pvalue="7.15e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_17" pvalue="1.90e-02" num_sites="0"></scanned_sites> -<scanned_sites sequence_id="sequence_18" pvalue="8.63e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="37" pvalue="2.16e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_19" pvalue="1.95e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="9" pvalue="4.86e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_20" pvalue="2.59e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="4" pvalue="6.48e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_21" pvalue="1.95e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="7" pvalue="4.86e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_22" pvalue="7.78e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="2" pvalue="1.95e-05"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_23" pvalue="8.89e-05" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="15" pvalue="2.22e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_24" pvalue="1.80e-05" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="12" pvalue="4.51e-07"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_25" pvalue="1.95e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="36" pvalue="4.86e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_26" pvalue="5.54e-03" num_sites="0"></scanned_sites> -<scanned_sites sequence_id="sequence_27" pvalue="5.54e-03" num_sites="0"></scanned_sites> -<scanned_sites sequence_id="sequence_28" pvalue="2.59e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="32" pvalue="6.48e-06"/> -</scanned_sites> -<scanned_sites sequence_id="sequence_29" pvalue="1.22e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="30" pvalue="3.04e-05"/> -</scanned_sites> -</scanned_sites_summary> </MEME>