From 97ab415b69c2a5ab7410e88a2f29403a7332b22a Mon Sep 17 00:00:00 2001 From: kriemo Date: Wed, 11 Oct 2023 18:10:14 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20rnabioco?= =?UTF-8?q?/valr@a4093efbd9622402e1f017ab1b1f61ec756f80eb=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev/articles/interval-stats.html | 40 +- .../datatables-binding-0.30/datatables.js | 1517 +++++++++++++++++ .../figure-html/ecfs-1.png | Bin 75884 -> 75873 bytes .../figure-html/pvalue_viz-1.png | Bin 37227 -> 36922 bytes dev/articles/valr.html | 44 +- dev/news/index.html | 5 +- dev/pkgdown.yml | 2 +- dev/reference/bed_cluster.html | 1 + dev/reference/bed_complement.html | 1 + dev/reference/bed_flank.html | 1 + dev/reference/bed_genomecov.html | 181 ++ dev/reference/bed_merge.html | 1 + dev/reference/bed_partition.html | 1 + dev/reference/bed_shift.html | 1 + dev/reference/bed_slop.html | 1 + dev/reference/index.html | 5 + dev/search.json | 2 +- dev/sitemap.xml | 3 + 18 files changed, 1758 insertions(+), 48 deletions(-) create mode 100644 dev/articles/interval-stats_files/datatables-binding-0.30/datatables.js create mode 100644 dev/reference/bed_genomecov.html diff --git a/dev/articles/interval-stats.html b/dev/articles/interval-stats.html index 3a3ea21b..4884d3e4 100644 --- a/dev/articles/interval-stats.html +++ b/dev/articles/interval-stats.html @@ -82,14 +82,14 @@ - +
+#> # A tibble: 16,801 × 5 +#> # Groups: name, stat [1,925] +#> name stat .id obs shuf +#> <chr> <chr> <int> <dbl> <dbl> +#> 1 (A)n reldist 1 0.363 0.255 +#> 2 (A)n reldist 2 0.429 0.0207 +#> 3 (A)n reldist 3 0.246 0.280 +#> 4 (A)n reldist 4 0.478 0.110 +#> 5 (A)n reldist 5 0.260 0.111 +#> 6 (A)n reldist 6 0.286 0.0557 +#> 7 (A)n reldist 7 0.498 0.0302 +#> 8 (A)n reldist 8 0.237 0.217 +#> 9 (A)n reldist 9 0.314 0.00127 +#> 10 (A)n reldist 10 0.149 0.466 +#> # ℹ 16,791 more rows

Now that the data are formatted, we can use the non-parametric ks.test() to determine whether there are significant differences between the observed and shuffled data for each group. @@ -290,7 +290,7 @@

Distance metrics left_join(res_gather, by = c("name", "stat")) #> Warning in left_join(signif, res_gather, by = c("name", "stat")): Detected an unexpected many-to-many relationship between `x` and `y`. #> Row 1 of `x` matches multiple rows in `y`. -#> Row 9223 of `y` matches multiple rows in `x`. +#> Row 29107 of `y` matches multiple rows in `x`. #> If a many-to-many relationship is expected, set `relationship = #> "many-to-many"` to silence this warning. @@ -419,8 +419,8 @@

Projection test arrange(type) DT::datatable(signif_tests) -
- +
+ diff --git a/dev/articles/interval-stats_files/datatables-binding-0.30/datatables.js b/dev/articles/interval-stats_files/datatables-binding-0.30/datatables.js new file mode 100644 index 00000000..d968d8be --- /dev/null +++ b/dev/articles/interval-stats_files/datatables-binding-0.30/datatables.js @@ -0,0 +1,1517 @@ +(function() { + +// some helper functions: using a global object DTWidget so that it can be used +// in JS() code, e.g. datatable(options = list(foo = JS('code'))); unlike R's +// dynamic scoping, when 'code' is eval'ed, JavaScript does not know objects +// from the "parent frame", e.g. JS('DTWidget') will not work unless it was made +// a global object +var DTWidget = {}; + +// 123456666.7890 -> 123,456,666.7890 +var markInterval = function(d, digits, interval, mark, decMark, precision) { + x = precision ? d.toPrecision(digits) : d.toFixed(digits); + if (!/^-?[\d.]+$/.test(x)) return x; + var xv = x.split('.'); + if (xv.length > 2) return x; // should have at most one decimal point + xv[0] = xv[0].replace(new RegExp('\\B(?=(\\d{' + interval + '})+(?!\\d))', 'g'), mark); + return xv.join(decMark); +}; + +DTWidget.formatCurrency = function(data, currency, digits, interval, mark, decMark, before, zeroPrint) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + if (zeroPrint !== null && d === 0.0) return zeroPrint; + var res = markInterval(d, digits, interval, mark, decMark); + res = before ? (/^-/.test(res) ? '-' + currency + res.replace(/^-/, '') : currency + res) : + res + currency; + return res; +}; + +DTWidget.formatString = function(data, prefix, suffix) { + var d = data; + if (d === null) return ''; + return prefix + d + suffix; +}; + +DTWidget.formatPercentage = function(data, digits, interval, mark, decMark, zeroPrint) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + if (zeroPrint !== null && d === 0.0) return zeroPrint; + return markInterval(d * 100, digits, interval, mark, decMark) + '%'; +}; + +DTWidget.formatRound = function(data, digits, interval, mark, decMark, zeroPrint) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + if (zeroPrint !== null && d === 0.0) return zeroPrint; + return markInterval(d, digits, interval, mark, decMark); +}; + +DTWidget.formatSignif = function(data, digits, interval, mark, decMark, zeroPrint) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + if (zeroPrint !== null && d === 0.0) return zeroPrint; + return markInterval(d, digits, interval, mark, decMark, true); +}; + +DTWidget.formatDate = function(data, method, params) { + var d = data; + if (d === null) return ''; + // (new Date('2015-10-28')).toDateString() may return 2015-10-27 because the + // actual time created could be like 'Tue Oct 27 2015 19:00:00 GMT-0500 (CDT)', + // i.e. the date-only string is treated as UTC time instead of local time + if ((method === 'toDateString' || method === 'toLocaleDateString') && /^\d{4,}\D\d{2}\D\d{2}$/.test(d)) { + d = d.split(/\D/); + d = new Date(d[0], d[1] - 1, d[2]); + } else { + d = new Date(d); + } + return d[method].apply(d, params); +}; + +window.DTWidget = DTWidget; + +// A helper function to update the properties of existing filters +var setFilterProps = function(td, props) { + // Update enabled/disabled state + var $input = $(td).find('input').first(); + var searchable = $input.data('searchable'); + $input.prop('disabled', !searchable || props.disabled); + + // Based on the filter type, set its new values + var type = td.getAttribute('data-type'); + if (['factor', 'logical'].includes(type)) { + // Reformat the new dropdown options for use with selectize + var new_vals = props.params.options.map(function(item) { + return { text: item, value: item }; + }); + + // Find the selectize object + var dropdown = $(td).find('.selectized').eq(0)[0].selectize; + + // Note the current values + var old_vals = dropdown.getValue(); + + // Remove the existing values + dropdown.clearOptions(); + + // Add the new options + dropdown.addOption(new_vals); + + // Preserve the existing values + dropdown.setValue(old_vals); + + } else if (['number', 'integer', 'date', 'time'].includes(type)) { + // Apply internal scaling to new limits. Updating scale not yet implemented. + var slider = $(td).find('.noUi-target').eq(0); + var scale = Math.pow(10, Math.max(0, +slider.data('scale') || 0)); + var new_vals = [props.params.min * scale, props.params.max * scale]; + + // Note what the new limits will be just for this filter + var new_lims = new_vals.slice(); + + // Determine the current values and limits + var old_vals = slider.val().map(Number); + var old_lims = slider.noUiSlider('options').range; + old_lims = [old_lims.min, old_lims.max]; + + // Preserve the current values if filters have been applied; otherwise, apply no filtering + if (old_vals[0] != old_lims[0]) { + new_vals[0] = Math.max(old_vals[0], new_vals[0]); + } + + if (old_vals[1] != old_lims[1]) { + new_vals[1] = Math.min(old_vals[1], new_vals[1]); + } + + // Update the endpoints of the slider + slider.noUiSlider({ + start: new_vals, + range: {'min': new_lims[0], 'max': new_lims[1]} + }, true); + } +}; + +var transposeArray2D = function(a) { + return a.length === 0 ? a : HTMLWidgets.transposeArray2D(a); +}; + +var crosstalkPluginsInstalled = false; + +function maybeInstallCrosstalkPlugins() { + if (crosstalkPluginsInstalled) + return; + crosstalkPluginsInstalled = true; + + $.fn.dataTable.ext.afnFiltering.push( + function(oSettings, aData, iDataIndex) { + var ctfilter = oSettings.nTable.ctfilter; + if (ctfilter && !ctfilter[iDataIndex]) + return false; + + var ctselect = oSettings.nTable.ctselect; + if (ctselect && !ctselect[iDataIndex]) + return false; + + return true; + } + ); +} + +HTMLWidgets.widget({ + name: "datatables", + type: "output", + renderOnNullValue: true, + initialize: function(el, width, height) { + // in order that the type=number inputs return a number + $.valHooks.number = { + get: function(el) { + var value = parseFloat(el.value); + return isNaN(value) ? "" : value; + } + }; + $(el).html(' '); + return { + data: null, + ctfilterHandle: new crosstalk.FilterHandle(), + ctfilterSubscription: null, + ctselectHandle: new crosstalk.SelectionHandle(), + ctselectSubscription: null + }; + }, + renderValue: function(el, data, instance) { + if (el.offsetWidth === 0 || el.offsetHeight === 0) { + instance.data = data; + return; + } + instance.data = null; + var $el = $(el); + $el.empty(); + + if (data === null) { + $el.append(' '); + // clear previous Shiny inputs (if any) + for (var i in instance.clearInputs) instance.clearInputs[i](); + instance.clearInputs = {}; + return; + } + + var crosstalkOptions = data.crosstalkOptions; + if (!crosstalkOptions) crosstalkOptions = { + 'key': null, 'group': null + }; + if (crosstalkOptions.group) { + maybeInstallCrosstalkPlugins(); + instance.ctfilterHandle.setGroup(crosstalkOptions.group); + instance.ctselectHandle.setGroup(crosstalkOptions.group); + } + + // if we are in the viewer then we always want to fillContainer and + // and autoHideNavigation (unless the user has explicitly set these) + if (window.HTMLWidgets.viewerMode) { + if (!data.hasOwnProperty("fillContainer")) + data.fillContainer = true; + if (!data.hasOwnProperty("autoHideNavigation")) + data.autoHideNavigation = true; + } + + // propagate fillContainer to instance (so we have it in resize) + instance.fillContainer = data.fillContainer; + + var cells = data.data; + + if (cells instanceof Array) cells = transposeArray2D(cells); + + $el.append(data.container); + var $table = $el.find('table'); + if (data.class) $table.addClass(data.class); + if (data.caption) $table.prepend(data.caption); + + if (!data.selection) data.selection = { + mode: 'none', selected: null, target: 'row', selectable: null + }; + if (HTMLWidgets.shinyMode && data.selection.mode !== 'none' && + data.selection.target === 'row+column') { + if ($table.children('tfoot').length === 0) { + $table.append($('')); + $table.find('thead tr').clone().appendTo($table.find('tfoot')); + } + } + + // column filters + var filterRow; + switch (data.filter) { + case 'top': + $table.children('thead').append(data.filterHTML); + filterRow = $table.find('thead tr:last td'); + break; + case 'bottom': + if ($table.children('tfoot').length === 0) { + $table.append($('')); + } + $table.children('tfoot').prepend(data.filterHTML); + filterRow = $table.find('tfoot tr:first td'); + break; + } + + var options = { searchDelay: 1000 }; + if (cells !== null) $.extend(options, { + data: cells + }); + + // options for fillContainer + var bootstrapActive = typeof($.fn.popover) != 'undefined'; + if (instance.fillContainer) { + + // force scrollX/scrollY and turn off autoWidth + options.scrollX = true; + options.scrollY = "100px"; // can be any value, we'll adjust below + + // if we aren't paginating then move around the info/filter controls + // to save space at the bottom and rephrase the info callback + if (data.options.paging === false) { + + // we know how to do this cleanly for bootstrap, not so much + // for other themes/layouts + if (bootstrapActive) { + options.dom = "<'row'<'col-sm-4'i><'col-sm-8'f>>" + + "<'row'<'col-sm-12'tr>>"; + } + + options.fnInfoCallback = function(oSettings, iStart, iEnd, + iMax, iTotal, sPre) { + return Number(iTotal).toLocaleString() + " records"; + }; + } + } + + // auto hide navigation if requested + // Note, this only works on client-side processing mode as on server-side, + // cells (data.data) is null; In addition, we require the pageLength option + // being provided explicitly to enable this. Despite we may be able to deduce + // the default value of pageLength, it may complicate things so we'd rather + // put this responsiblity to users and warn them on the R side. + if (data.autoHideNavigation === true && data.options.paging !== false) { + // strip all nav if length >= cells + if ((cells instanceof Array) && data.options.pageLength >= cells.length) + options.dom = bootstrapActive ? "<'row'<'col-sm-12'tr>>" : "t"; + // alternatively lean things out for flexdashboard mobile portrait + else if (bootstrapActive && window.FlexDashboard && window.FlexDashboard.isMobilePhone()) + options.dom = "<'row'<'col-sm-12'f>>" + + "<'row'<'col-sm-12'tr>>" + + "<'row'<'col-sm-12'p>>"; + } + + $.extend(true, options, data.options || {}); + + var searchCols = options.searchCols; + if (searchCols) { + searchCols = searchCols.map(function(x) { + return x === null ? '' : x.search; + }); + // FIXME: this means I don't respect the escapeRegex setting + delete options.searchCols; + } + + // server-side processing? + var server = options.serverSide === true; + + // use the dataSrc function to pre-process JSON data returned from R + var DT_rows_all = [], DT_rows_current = []; + if (server && HTMLWidgets.shinyMode && typeof options.ajax === 'object' && + /^session\/[\da-z]+\/dataobj/.test(options.ajax.url) && !options.ajax.dataSrc) { + options.ajax.dataSrc = function(json) { + DT_rows_all = $.makeArray(json.DT_rows_all); + DT_rows_current = $.makeArray(json.DT_rows_current); + var data = json.data; + if (!colReorderEnabled()) return data; + var table = $table.DataTable(), order = table.colReorder.order(), flag = true, i, j, row; + for (i = 0; i < order.length; ++i) if (order[i] !== i) flag = false; + if (flag) return data; + for (i = 0; i < data.length; ++i) { + row = data[i].slice(); + for (j = 0; j < order.length; ++j) data[i][j] = row[order[j]]; + } + return data; + }; + } + + var thiz = this; + if (instance.fillContainer) $table.on('init.dt', function(e) { + thiz.fillAvailableHeight(el, $(el).innerHeight()); + }); + // If the page contains serveral datatables and one of which enables colReorder, + // the table.colReorder.order() function will exist but throws error when called. + // So it seems like the only way to know if colReorder is enabled or not is to + // check the options. + var colReorderEnabled = function() { return "colReorder" in options; }; + var table = $table.DataTable(options); + $el.data('datatable', table); + + // Unregister previous Crosstalk event subscriptions, if they exist + if (instance.ctfilterSubscription) { + instance.ctfilterHandle.off("change", instance.ctfilterSubscription); + instance.ctfilterSubscription = null; + } + if (instance.ctselectSubscription) { + instance.ctselectHandle.off("change", instance.ctselectSubscription); + instance.ctselectSubscription = null; + } + + if (!crosstalkOptions.group) { + $table[0].ctfilter = null; + $table[0].ctselect = null; + } else { + var key = crosstalkOptions.key; + function keysToMatches(keys) { + if (!keys) { + return null; + } else { + var selectedKeys = {}; + for (var i = 0; i < keys.length; i++) { + selectedKeys[keys[i]] = true; + } + var matches = {}; + for (var j = 0; j < key.length; j++) { + if (selectedKeys[key[j]]) + matches[j] = true; + } + return matches; + } + } + + function applyCrosstalkFilter(e) { + $table[0].ctfilter = keysToMatches(e.value); + table.draw(); + } + instance.ctfilterSubscription = instance.ctfilterHandle.on("change", applyCrosstalkFilter); + applyCrosstalkFilter({value: instance.ctfilterHandle.filteredKeys}); + + function applyCrosstalkSelection(e) { + if (e.sender !== instance.ctselectHandle) { + table + .rows('.' + selClass, {search: 'applied'}) + .nodes() + .to$() + .removeClass(selClass); + if (selectedRows) + changeInput('rows_selected', selectedRows(), void 0, true); + } + + if (e.sender !== instance.ctselectHandle && e.value && e.value.length) { + var matches = keysToMatches(e.value); + + // persistent selection with plotly (& leaflet) + var ctOpts = crosstalk.var("plotlyCrosstalkOpts").get() || {}; + if (ctOpts.persistent === true) { + var matches = $.extend(matches, $table[0].ctselect); + } + + $table[0].ctselect = matches; + table.draw(); + } else { + if ($table[0].ctselect) { + $table[0].ctselect = null; + table.draw(); + } + } + } + instance.ctselectSubscription = instance.ctselectHandle.on("change", applyCrosstalkSelection); + // TODO: This next line doesn't seem to work when renderDataTable is used + applyCrosstalkSelection({value: instance.ctselectHandle.value}); + } + + var inArray = function(val, array) { + return $.inArray(val, $.makeArray(array)) > -1; + }; + + // search the i-th column + var searchColumn = function(i, value) { + var regex = false, ci = true; + if (options.search) { + regex = options.search.regex, + ci = options.search.caseInsensitive !== false; + } + return table.column(i).search(value, regex, !regex, ci); + }; + + if (data.filter !== 'none') { + + filterRow.each(function(i, td) { + + var $td = $(td), type = $td.data('type'), filter; + var $input = $td.children('div').first().children('input'); + var disabled = $input.prop('disabled'); + var searchable = table.settings()[0].aoColumns[i].bSearchable; + $input.prop('disabled', !searchable || disabled); + $input.data('searchable', searchable); // for updating later + $input.on('input blur', function() { + $input.next('span').toggle(Boolean($input.val())); + }); + // Bootstrap sets pointer-events to none and we won't be able to click + // the clear button + $input.next('span').css('pointer-events', 'auto').hide().click(function() { + $(this).hide().prev('input').val('').trigger('input').focus(); + }); + var searchCol; // search string for this column + if (searchCols && searchCols[i]) { + searchCol = searchCols[i]; + $input.val(searchCol).trigger('input'); + } + var $x = $td.children('div').last(); + + // remove the overflow: hidden attribute of the scrollHead + // (otherwise the scrolling table body obscures the filters) + // The workaround and the discussion from + // https://github.com/rstudio/DT/issues/554#issuecomment-518007347 + // Otherwise the filter selection will not be anchored to the values + // when the columns number is many and scrollX is enabled. + var scrollHead = $(el).find('.dataTables_scrollHead,.dataTables_scrollFoot'); + var cssOverflowHead = scrollHead.css('overflow'); + var scrollBody = $(el).find('.dataTables_scrollBody'); + var cssOverflowBody = scrollBody.css('overflow'); + var scrollTable = $(el).find('.dataTables_scroll'); + var cssOverflowTable = scrollTable.css('overflow'); + if (cssOverflowHead === 'hidden') { + $x.on('show hide', function(e) { + if (e.type === 'show') { + scrollHead.css('overflow', 'visible'); + scrollBody.css('overflow', 'visible'); + scrollTable.css('overflow-x', 'scroll'); + } else { + scrollHead.css('overflow', cssOverflowHead); + scrollBody.css('overflow', cssOverflowBody); + scrollTable.css('overflow-x', cssOverflowTable); + } + }); + $x.css('z-index', 25); + } + + if (inArray(type, ['factor', 'logical'])) { + $input.on({ + click: function() { + $input.parent().hide(); $x.show().trigger('show'); filter[0].selectize.focus(); + }, + input: function() { + var v1 = JSON.stringify(filter[0].selectize.getValue()), v2 = $input.val(); + if (v1 === '[]') v1 = ''; + if (v1 !== v2) filter[0].selectize.setValue(v2 === '' ? [] : JSON.parse(v2)); + } + }); + var $input2 = $x.children('select'); + filter = $input2.selectize({ + options: $input2.data('options').map(function(v, i) { + return ({text: v, value: v}); + }), + plugins: ['remove_button'], + hideSelected: true, + onChange: function(value) { + if (value === null) value = []; // compatibility with jQuery 3.0 + $input.val(value.length ? JSON.stringify(value) : ''); + if (value.length) $input.trigger('input'); + $input.attr('title', $input.val()); + if (server) { + table.column(i).search(value.length ? JSON.stringify(value) : '').draw(); + return; + } + // turn off filter if nothing selected + $td.data('filter', value.length > 0); + table.draw(); // redraw table, and filters will be applied + } + }); + if (searchCol) filter[0].selectize.setValue(JSON.parse(searchCol)); + filter[0].selectize.on('blur', function() { + $x.hide().trigger('hide'); $input.parent().show(); $input.trigger('blur'); + }); + filter.next('div').css('margin-bottom', 'auto'); + } else if (type === 'character') { + var fun = function() { + searchColumn(i, $input.val()).draw(); + }; + if (server) { + fun = $.fn.dataTable.util.throttle(fun, options.searchDelay); + } + $input.on('input', fun); + } else if (inArray(type, ['number', 'integer', 'date', 'time'])) { + var $x0 = $x; + $x = $x0.children('div').first(); + $x0.css({ + 'background-color': '#fff', + 'border': '1px #ddd solid', + 'border-radius': '4px', + 'padding': data.vertical ? '35px 20px': '20px 20px 10px 20px' + }); + var $spans = $x0.children('span').css({ + 'margin-top': data.vertical ? '0' : '10px', + 'white-space': 'nowrap' + }); + var $span1 = $spans.first(), $span2 = $spans.last(); + var r1 = +$x.data('min'), r2 = +$x.data('max'); + // when the numbers are too small or have many decimal places, the + // slider may have numeric precision problems (#150) + var scale = Math.pow(10, Math.max(0, +$x.data('scale') || 0)); + r1 = Math.round(r1 * scale); r2 = Math.round(r2 * scale); + var scaleBack = function(x, scale) { + if (scale === 1) return x; + var d = Math.round(Math.log(scale) / Math.log(10)); + // to avoid problems like 3.423/100 -> 0.034230000000000003 + return (x / scale).toFixed(d); + }; + var slider_min = function() { + return filter.noUiSlider('options').range.min; + }; + var slider_max = function() { + return filter.noUiSlider('options').range.max; + }; + $input.on({ + focus: function() { + $x0.show().trigger('show'); + // first, make sure the slider div leaves at least 20px between + // the two (slider value) span's + $x0.width(Math.max(160, $span1.outerWidth() + $span2.outerWidth() + 20)); + // then, if the input is really wide or slider is vertical, + // make the slider the same width as the input + if ($x0.outerWidth() < $input.outerWidth() || data.vertical) { + $x0.outerWidth($input.outerWidth()); + } + // make sure the slider div does not reach beyond the right margin + if ($(window).width() < $x0.offset().left + $x0.width()) { + $x0.offset({ + 'left': $input.offset().left + $input.outerWidth() - $x0.outerWidth() + }); + } + }, + blur: function() { + $x0.hide().trigger('hide'); + }, + input: function() { + if ($input.val() === '') filter.val([slider_min(), slider_max()]); + }, + change: function() { + var v = $input.val().replace(/\s/g, ''); + if (v === '') return; + v = v.split('...'); + if (v.length !== 2) { + $input.parent().addClass('has-error'); + return; + } + if (v[0] === '') v[0] = slider_min(); + if (v[1] === '') v[1] = slider_max(); + $input.parent().removeClass('has-error'); + // treat date as UTC time at midnight + var strTime = function(x) { + var s = type === 'date' ? 'T00:00:00Z' : ''; + var t = new Date(x + s).getTime(); + // add 10 minutes to date since it does not hurt the date, and + // it helps avoid the tricky floating point arithmetic problems, + // e.g. sometimes the date may be a few milliseconds earlier + // than the midnight due to precision problems in noUiSlider + return type === 'date' ? t + 3600000 : t; + }; + if (inArray(type, ['date', 'time'])) { + v[0] = strTime(v[0]); + v[1] = strTime(v[1]); + } + if (v[0] != slider_min()) v[0] *= scale; + if (v[1] != slider_max()) v[1] *= scale; + filter.val(v); + } + }); + var formatDate = function(d, isoFmt) { + d = scaleBack(d, scale); + if (type === 'number') return d; + if (type === 'integer') return parseInt(d); + var x = new Date(+d); + var fmt = ('filterDateFmt' in data) ? data.filterDateFmt[i] : undefined; + if (fmt !== undefined && isoFmt === false) return x[fmt.method].apply(x, fmt.params); + if (type === 'date') { + var pad0 = function(x) { + return ('0' + x).substr(-2, 2); + }; + return x.getUTCFullYear() + '-' + pad0(1 + x.getUTCMonth()) + + '-' + pad0(x.getUTCDate()); + } else { + return x.toISOString(); + } + }; + var opts = type === 'date' ? { step: 60 * 60 * 1000 } : + type === 'integer' ? { step: 1 } : {}; + + opts.orientation = data.vertical ? 'vertical': 'horizontal'; + opts.direction = data.vertical ? 'rtl': 'ltr'; + + filter = $x.noUiSlider($.extend({ + start: [r1, r2], + range: {min: r1, max: r2}, + connect: true + }, opts)); + if (scale > 1) (function() { + var t1 = r1, t2 = r2; + var val = filter.val(); + while (val[0] > r1 || val[1] < r2) { + if (val[0] > r1) { + t1 -= val[0] - r1; + } + if (val[1] < r2) { + t2 += r2 - val[1]; + } + filter = $x.noUiSlider($.extend({ + start: [t1, t2], + range: {min: t1, max: t2}, + connect: true + }, opts), true); + val = filter.val(); + } + r1 = t1; r2 = t2; + })(); + var updateSliderText = function(v1, v2) { + $span1.text(formatDate(v1, false)); $span2.text(formatDate(v2, false)); + }; + updateSliderText(r1, r2); + var updateSlider = function(e) { + var val = filter.val(); + // turn off filter if in full range + $td.data('filter', val[0] > slider_min() || val[1] < slider_max()); + var v1 = formatDate(val[0]), v2 = formatDate(val[1]), ival; + if ($td.data('filter')) { + ival = v1 + ' ... ' + v2; + $input.attr('title', ival).val(ival).trigger('input'); + } else { + $input.attr('title', '').val(''); + } + updateSliderText(val[0], val[1]); + if (e.type === 'slide') return; // no searching when sliding only + if (server) { + table.column(i).search($td.data('filter') ? ival : '').draw(); + return; + } + table.draw(); + }; + filter.on({ + set: updateSlider, + slide: updateSlider + }); + } + + // server-side processing will be handled by R (or whatever server + // language you use); the following code is only needed for client-side + // processing + if (server) { + // if a search string has been pre-set, search now + if (searchCol) searchColumn(i, searchCol).draw(); + return; + } + + var customFilter = function(settings, data, dataIndex) { + // there is no way to attach a search function to a specific table, + // and we need to make sure a global search function is not applied to + // all tables (i.e. a range filter in a previous table should not be + // applied to the current table); we use the settings object to + // determine if we want to perform searching on the current table, + // since settings.sTableId will be different to different tables + if (table.settings()[0] !== settings) return true; + // no filter on this column or no need to filter this column + if (typeof filter === 'undefined' || !$td.data('filter')) return true; + + var r = filter.val(), v, r0, r1; + var i_data = function(i) { + if (!colReorderEnabled()) return i; + var order = table.colReorder.order(), k; + for (k = 0; k < order.length; ++k) if (order[k] === i) return k; + return i; // in theory it will never be here... + } + v = data[i_data(i)]; + if (type === 'number' || type === 'integer') { + v = parseFloat(v); + // how to handle NaN? currently exclude these rows + if (isNaN(v)) return(false); + r0 = parseFloat(scaleBack(r[0], scale)) + r1 = parseFloat(scaleBack(r[1], scale)); + if (v >= r0 && v <= r1) return true; + } else if (type === 'date' || type === 'time') { + v = new Date(v); + r0 = new Date(r[0] / scale); r1 = new Date(r[1] / scale); + if (v >= r0 && v <= r1) return true; + } else if (type === 'factor') { + if (r.length === 0 || inArray(v, r)) return true; + } else if (type === 'logical') { + if (r.length === 0) return true; + if (inArray(v === '' ? 'na' : v, r)) return true; + } + return false; + }; + + $.fn.dataTable.ext.search.push(customFilter); + + // search for the preset search strings if it is non-empty + if (searchCol) { + if (inArray(type, ['factor', 'logical'])) { + filter[0].selectize.setValue(JSON.parse(searchCol)); + } else if (type === 'character') { + $input.trigger('input'); + } else if (inArray(type, ['number', 'integer', 'date', 'time'])) { + $input.trigger('change'); + } + } + + }); + + } + + // highlight search keywords + var highlight = function() { + var body = $(table.table().body()); + // removing the old highlighting first + body.unhighlight(); + + // don't highlight the "not found" row, so we get the rows using the api + if (table.rows({ filter: 'applied' }).data().length === 0) return; + // highlight global search keywords + body.highlight($.trim(table.search()).split(/\s+/)); + // then highlight keywords from individual column filters + if (filterRow) filterRow.each(function(i, td) { + var $td = $(td), type = $td.data('type'); + if (type !== 'character') return; + var $input = $td.children('div').first().children('input'); + var column = table.column(i).nodes().to$(), + val = $.trim($input.val()); + if (type !== 'character' || val === '') return; + column.highlight(val.split(/\s+/)); + }); + }; + + if (options.searchHighlight) { + table + .on('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth', highlight) + .on('destroy', function() { + // remove event handler + table.off('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth'); + }); + + // Set the option for escaping regex characters in our search string. This will be used + // for all future matching. + jQuery.fn.highlight.options.escapeRegex = (!options.search || !options.search.regex); + + // initial highlight for state saved conditions and initial states + highlight(); + } + + // run the callback function on the table instance + if (typeof data.callback === 'function') data.callback(table); + + // double click to edit the cell, row, column, or all cells + if (data.editable) table.on('dblclick.dt', 'tbody td', function(e) { + // only bring up the editor when the cell itself is dbclicked, and ignore + // other dbclick events bubbled up (e.g. from the ) + if (e.target !== this) return; + var target = [], immediate = false; + switch (data.editable.target) { + case 'cell': + target = [this]; + immediate = true; // edit will take effect immediately + break; + case 'row': + target = table.cells(table.cell(this).index().row, '*').nodes(); + break; + case 'column': + target = table.cells('*', table.cell(this).index().column).nodes(); + break; + case 'all': + target = table.cells().nodes(); + break; + default: + throw 'The editable parameter must be "cell", "row", "column", or "all"'; + } + var disableCols = data.editable.disable ? data.editable.disable.columns : null; + var numericCols = data.editable.numeric; + var areaCols = data.editable.area; + var dateCols = data.editable.date; + for (var i = 0; i < target.length; i++) { + (function(cell, current) { + var $cell = $(cell), html = $cell.html(); + var _cell = table.cell(cell), value = _cell.data(), index = _cell.index().column; + var $input; + if (inArray(index, numericCols)) { + $input = $(''); + } else if (inArray(index, areaCols)) { + $input = $(''); + } else if (inArray(index, dateCols)) { + $input = $(''); + } else { + $input = $(''); + } + if (!immediate) { + $cell.data('input', $input).data('html', html); + $input.attr('title', 'Hit Ctrl+Enter to finish editing, or Esc to cancel'); + } + $input.val(value); + if (inArray(index, disableCols)) { + $input.attr('readonly', '').css('filter', 'invert(25%)'); + } + $cell.empty().append($input); + if (cell === current) $input.focus(); + $input.css('width', '100%'); + + if (immediate) $input.on('blur', function(e) { + var valueNew = $input.val(); + if (valueNew !== value) { + _cell.data(valueNew); + if (HTMLWidgets.shinyMode) { + changeInput('cell_edit', [cellInfo(cell)], 'DT.cellInfo', null, {priority: 'event'}); + } + // for server-side processing, users have to call replaceData() to update the table + if (!server) table.draw(false); + } else { + $cell.html(html); + } + }).on('keyup', function(e) { + // hit Escape to cancel editing + if (e.keyCode === 27) $input.trigger('blur'); + }); + + // bulk edit (row, column, or all) + if (!immediate) $input.on('keyup', function(e) { + var removeInput = function($cell, restore) { + $cell.data('input').remove(); + if (restore) $cell.html($cell.data('html')); + } + if (e.keyCode === 27) { + for (var i = 0; i < target.length; i++) { + removeInput($(target[i]), true); + } + } else if (e.keyCode === 13 && e.ctrlKey) { + // Ctrl + Enter + var cell, $cell, _cell, cellData = []; + for (var i = 0; i < target.length; i++) { + cell = target[i]; $cell = $(cell); _cell = table.cell(cell); + _cell.data($cell.data('input').val()); + HTMLWidgets.shinyMode && cellData.push(cellInfo(cell)); + removeInput($cell, false); + } + if (HTMLWidgets.shinyMode) { + changeInput('cell_edit', cellData, 'DT.cellInfo', null, {priority: "event"}); + } + if (!server) table.draw(false); + } + }); + })(target[i], this); + } + }); + + // interaction with shiny + if (!HTMLWidgets.shinyMode && !crosstalkOptions.group) return; + + var methods = {}; + var shinyData = {}; + + methods.updateCaption = function(caption) { + if (!caption) return; + $table.children('caption').replaceWith(caption); + } + + // register clear functions to remove input values when the table is removed + instance.clearInputs = {}; + + var changeInput = function(id, value, type, noCrosstalk, opts) { + var event = id; + id = el.id + '_' + id; + if (type) id = id + ':' + type; + // do not update if the new value is the same as old value + if (event !== 'cell_edit' && !/_clicked$/.test(event) && shinyData.hasOwnProperty(id) && shinyData[id] === JSON.stringify(value)) + return; + shinyData[id] = JSON.stringify(value); + if (HTMLWidgets.shinyMode && Shiny.setInputValue) { + Shiny.setInputValue(id, value, opts); + if (!instance.clearInputs[id]) instance.clearInputs[id] = function() { + Shiny.setInputValue(id, null); + } + } + + // HACK + if (event === "rows_selected" && !noCrosstalk) { + if (crosstalkOptions.group) { + var keys = crosstalkOptions.key; + var selectedKeys = null; + if (value) { + selectedKeys = []; + for (var i = 0; i < value.length; i++) { + // The value array's contents use 1-based row numbers, so we must + // convert to 0-based before indexing into the keys array. + selectedKeys.push(keys[value[i] - 1]); + } + } + instance.ctselectHandle.set(selectedKeys); + } + } + }; + + var addOne = function(x) { + return x.map(function(i) { return 1 + i; }); + }; + + var unique = function(x) { + var ux = []; + $.each(x, function(i, el){ + if ($.inArray(el, ux) === -1) ux.push(el); + }); + return ux; + } + + // change the row index of a cell + var tweakCellIndex = function(cell) { + var info = cell.index(); + // some cell may not be valid. e.g, #759 + // when using the RowGroup extension, datatables will + // generate the row label and the cells are not part of + // the data thus contain no row/col info + if (info === undefined) + return {row: null, col: null}; + if (server) { + info.row = DT_rows_current[info.row]; + } else { + info.row += 1; + } + return {row: info.row, col: info.column}; + } + + var cleanSelectedValues = function() { + changeInput('rows_selected', []); + changeInput('columns_selected', []); + changeInput('cells_selected', transposeArray2D([]), 'shiny.matrix'); + } + // #828 we should clean the selection on the server-side when the table reloads + cleanSelectedValues(); + + // a flag to indicates if select extension is initialized or not + var flagSelectExt = table.settings()[0]._select !== undefined; + // the Select extension should only be used in the client mode and + // when the selection.mode is set to none + if (data.selection.mode === 'none' && !server && flagSelectExt) { + var updateRowsSelected = function() { + var rows = table.rows({selected: true}); + var selected = []; + $.each(rows.indexes().toArray(), function(i, v) { + selected.push(v + 1); + }); + changeInput('rows_selected', selected); + } + var updateColsSelected = function() { + var columns = table.columns({selected: true}); + changeInput('columns_selected', columns.indexes().toArray()); + } + var updateCellsSelected = function() { + var cells = table.cells({selected: true}); + var selected = []; + cells.every(function() { + var row = this.index().row; + var col = this.index().column; + selected = selected.concat([[row + 1, col]]); + }); + changeInput('cells_selected', transposeArray2D(selected), 'shiny.matrix'); + } + table.on('select deselect', function(e, dt, type, indexes) { + updateRowsSelected(); + updateColsSelected(); + updateCellsSelected(); + }) + } + + var selMode = data.selection.mode, selTarget = data.selection.target; + var selDisable = data.selection.selectable === false; + if (inArray(selMode, ['single', 'multiple'])) { + var selClass = inArray(data.style, ['bootstrap', 'bootstrap4']) ? 'active' : 'selected'; + // selected1: row indices; selected2: column indices + var initSel = function(x) { + if (x === null || typeof x === 'boolean' || selTarget === 'cell') { + return {rows: [], cols: []}; + } else if (selTarget === 'row') { + return {rows: $.makeArray(x), cols: []}; + } else if (selTarget === 'column') { + return {rows: [], cols: $.makeArray(x)}; + } else if (selTarget === 'row+column') { + return {rows: $.makeArray(x.rows), cols: $.makeArray(x.cols)}; + } + } + var selected = data.selection.selected; + var selected1 = initSel(selected).rows, selected2 = initSel(selected).cols; + // selectable should contain either all positive or all non-positive values, not both + // positive values indicate "selectable" while non-positive values means "nonselectable" + // the assertion is performed on R side. (only column indicides could be zero which indicates + // the row name) + var selectable = data.selection.selectable; + var selectable1 = initSel(selectable).rows, selectable2 = initSel(selectable).cols; + + // After users reorder the rows or filter the table, we cannot use the table index + // directly. Instead, we need this function to find out the rows between the two clicks. + // If user filter the table again between the start click and the end click, the behavior + // would be undefined, but it should not be a problem. + var shiftSelRowsIndex = function(start, end) { + var indexes = server ? DT_rows_all : table.rows({ search: 'applied' }).indexes().toArray(); + start = indexes.indexOf(start); end = indexes.indexOf(end); + // if start is larger than end, we need to swap + if (start > end) { + var tmp = end; end = start; start = tmp; + } + return indexes.slice(start, end + 1); + } + + var serverRowIndex = function(clientRowIndex) { + return server ? DT_rows_current[clientRowIndex] : clientRowIndex + 1; + } + + // row, column, or cell selection + var lastClickedRow; + if (inArray(selTarget, ['row', 'row+column'])) { + // Get the current selected rows. It will also + // update the selected1's value based on the current row selection state + // Note we can't put this function inside selectRows() directly, + // the reason is method.selectRows() will override selected1's value but this + // function will add rows to selected1 (keep the existing selection), which is + // inconsistent with column and cell selection. + var selectedRows = function() { + var rows = table.rows('.' + selClass); + var idx = rows.indexes().toArray(); + if (!server) { + selected1 = addOne(idx); + return selected1; + } + idx = idx.map(function(i) { + return DT_rows_current[i]; + }); + selected1 = selMode === 'multiple' ? unique(selected1.concat(idx)) : idx; + return selected1; + } + // Change selected1's value based on selectable1, then refresh the row state + var onlyKeepSelectableRows = function() { + if (selDisable) { // users can't select; useful when only want backend select + selected1 = []; + return; + } + if (selectable1.length === 0) return; + var nonselectable = selectable1[0] <= 0; + if (nonselectable) { + // should make selectable1 positive + selected1 = $(selected1).not(selectable1.map(function(i) { return -i; })).get(); + } else { + selected1 = $(selected1).filter(selectable1).get(); + } + } + // Change selected1's value based on selectable1, then + // refresh the row selection state according to values in selected1 + var selectRows = function(ignoreSelectable) { + if (!ignoreSelectable) onlyKeepSelectableRows(); + table.$('tr.' + selClass).removeClass(selClass); + if (selected1.length === 0) return; + if (server) { + table.rows({page: 'current'}).every(function() { + if (inArray(DT_rows_current[this.index()], selected1)) { + $(this.node()).addClass(selClass); + } + }); + } else { + var selected0 = selected1.map(function(i) { return i - 1; }); + $(table.rows(selected0).nodes()).addClass(selClass); + } + } + table.on('mousedown.dt', 'tbody tr', function(e) { + var $this = $(this), thisRow = table.row(this); + if (selMode === 'multiple') { + if (e.shiftKey && lastClickedRow !== undefined) { + // select or de-select depends on the last clicked row's status + var flagSel = !$this.hasClass(selClass); + var crtClickedRow = serverRowIndex(thisRow.index()); + if (server) { + var rowsIndex = shiftSelRowsIndex(lastClickedRow, crtClickedRow); + // update current page's selClass + rowsIndex.map(function(i) { + var rowIndex = DT_rows_current.indexOf(i); + if (rowIndex >= 0) { + var row = table.row(rowIndex).nodes().to$(); + var flagRowSel = !row.hasClass(selClass); + if (flagSel === flagRowSel) row.toggleClass(selClass); + } + }); + // update selected1 + if (flagSel) { + selected1 = unique(selected1.concat(rowsIndex)); + } else { + selected1 = selected1.filter(function(index) { + return !inArray(index, rowsIndex); + }); + } + } else { + // js starts from 0 + shiftSelRowsIndex(lastClickedRow - 1, crtClickedRow - 1).map(function(value) { + var row = table.row(value).nodes().to$(); + var flagRowSel = !row.hasClass(selClass); + if (flagSel === flagRowSel) row.toggleClass(selClass); + }); + } + e.preventDefault(); + } else { + $this.toggleClass(selClass); + } + } else { + if ($this.hasClass(selClass)) { + $this.removeClass(selClass); + } else { + table.$('tr.' + selClass).removeClass(selClass); + $this.addClass(selClass); + } + } + if (server && !$this.hasClass(selClass)) { + var id = DT_rows_current[thisRow.index()]; + // remove id from selected1 since its class .selected has been removed + if (inArray(id, selected1)) selected1.splice($.inArray(id, selected1), 1); + } + selectedRows(); // update selected1's value based on selClass + selectRows(false); // only keep the selectable rows + changeInput('rows_selected', selected1); + changeInput('row_last_clicked', serverRowIndex(thisRow.index()), null, null, {priority: 'event'}); + lastClickedRow = serverRowIndex(thisRow.index()); + }); + selectRows(false); // in case users have specified pre-selected rows + // restore selected rows after the table is redrawn (e.g. sort/search/page); + // client-side tables will preserve the selections automatically; for + // server-side tables, we have to *real* row indices are in `selected1` + changeInput('rows_selected', selected1); + if (server) table.on('draw.dt', function(e) { selectRows(false); }); + methods.selectRows = function(selected, ignoreSelectable) { + selected1 = $.makeArray(selected); + selectRows(ignoreSelectable); + changeInput('rows_selected', selected1); + } + } + + if (inArray(selTarget, ['column', 'row+column'])) { + if (selTarget === 'row+column') { + $(table.columns().footer()).css('cursor', 'pointer'); + } + // update selected2's value based on selectable2 + var onlyKeepSelectableCols = function() { + if (selDisable) { // users can't select; useful when only want backend select + selected2 = []; + return; + } + if (selectable2.length === 0) return; + var nonselectable = selectable2[0] <= 0; + if (nonselectable) { + // need to make selectable2 positive + selected2 = $(selected2).not(selectable2.map(function(i) { return -i; })).get(); + } else { + selected2 = $(selected2).filter(selectable2).get(); + } + } + // update selected2 and then + // refresh the col selection state according to values in selected2 + var selectCols = function(ignoreSelectable) { + if (!ignoreSelectable) onlyKeepSelectableCols(); + // if selected2 is not a valide index (e.g., larger than the column number) + // table.columns(selected2) will fail and result in a blank table + // this is different from the table.rows(), where the out-of-range indexes + // doesn't affect at all + selected2 = $(selected2).filter(table.columns().indexes()).get(); + table.columns().nodes().flatten().to$().removeClass(selClass); + if (selected2.length > 0) + table.columns(selected2).nodes().flatten().to$().addClass(selClass); + } + var callback = function() { + var colIdx = selTarget === 'column' ? table.cell(this).index().column : + $.inArray(this, table.columns().footer()), + thisCol = $(table.column(colIdx).nodes()); + if (colIdx === -1) return; + if (thisCol.hasClass(selClass)) { + thisCol.removeClass(selClass); + selected2.splice($.inArray(colIdx, selected2), 1); + } else { + if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass); + thisCol.addClass(selClass); + selected2 = selMode === 'single' ? [colIdx] : unique(selected2.concat([colIdx])); + } + selectCols(false); // update selected2 based on selectable + changeInput('columns_selected', selected2); + } + if (selTarget === 'column') { + $(table.table().body()).on('click.dt', 'td', callback); + } else { + $(table.table().footer()).on('click.dt', 'tr th', callback); + } + selectCols(false); // in case users have specified pre-selected columns + changeInput('columns_selected', selected2); + if (server) table.on('draw.dt', function(e) { selectCols(false); }); + methods.selectColumns = function(selected, ignoreSelectable) { + selected2 = $.makeArray(selected); + selectCols(ignoreSelectable); + changeInput('columns_selected', selected2); + } + } + + if (selTarget === 'cell') { + var selected3 = [], selectable3 = []; + if (selected !== null) selected3 = selected; + if (selectable !== null && typeof selectable !== 'boolean') selectable3 = selectable; + var findIndex = function(ij, sel) { + for (var i = 0; i < sel.length; i++) { + if (ij[0] === sel[i][0] && ij[1] === sel[i][1]) return i; + } + return -1; + } + // Change selected3's value based on selectable3, then refresh the cell state + var onlyKeepSelectableCells = function() { + if (selDisable) { // users can't select; useful when only want backend select + selected3 = []; + return; + } + if (selectable3.length === 0) return; + var nonselectable = selectable3[0][0] <= 0; + var out = []; + if (nonselectable) { + selected3.map(function(ij) { + // should make selectable3 positive + if (findIndex([-ij[0], -ij[1]], selectable3) === -1) { out.push(ij); } + }); + } else { + selected3.map(function(ij) { + if (findIndex(ij, selectable3) > -1) { out.push(ij); } + }); + } + selected3 = out; + } + // Change selected3's value based on selectable3, then + // refresh the cell selection state according to values in selected3 + var selectCells = function(ignoreSelectable) { + if (!ignoreSelectable) onlyKeepSelectableCells(); + table.$('td.' + selClass).removeClass(selClass); + if (selected3.length === 0) return; + if (server) { + table.cells({page: 'current'}).every(function() { + var info = tweakCellIndex(this); + if (findIndex([info.row, info.col], selected3) > -1) + $(this.node()).addClass(selClass); + }); + } else { + selected3.map(function(ij) { + $(table.cell(ij[0] - 1, ij[1]).node()).addClass(selClass); + }); + } + }; + table.on('click.dt', 'tbody td', function() { + var $this = $(this), info = tweakCellIndex(table.cell(this)); + if ($this.hasClass(selClass)) { + $this.removeClass(selClass); + selected3.splice(findIndex([info.row, info.col], selected3), 1); + } else { + if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass); + $this.addClass(selClass); + selected3 = selMode === 'single' ? [[info.row, info.col]] : + unique(selected3.concat([[info.row, info.col]])); + } + selectCells(false); // must call this to update selected3 based on selectable3 + changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); + }); + selectCells(false); // in case users have specified pre-selected columns + changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); + + if (server) table.on('draw.dt', function(e) { selectCells(false); }); + methods.selectCells = function(selected, ignoreSelectable) { + selected3 = selected ? selected : []; + selectCells(ignoreSelectable); + changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); + } + } + } + + // expose some table info to Shiny + var updateTableInfo = function(e, settings) { + // TODO: is anyone interested in the page info? + // changeInput('page_info', table.page.info()); + var updateRowInfo = function(id, modifier) { + var idx; + if (server) { + idx = modifier.page === 'current' ? DT_rows_current : DT_rows_all; + } else { + var rows = table.rows($.extend({ + search: 'applied', + page: 'all' + }, modifier)); + idx = addOne(rows.indexes().toArray()); + } + changeInput('rows' + '_' + id, idx); + }; + updateRowInfo('current', {page: 'current'}); + updateRowInfo('all', {}); + } + table.on('draw.dt', updateTableInfo); + updateTableInfo(); + + // state info + table.on('draw.dt column-visibility.dt', function() { + changeInput('state', table.state()); + }); + changeInput('state', table.state()); + + // search info + var updateSearchInfo = function() { + changeInput('search', table.search()); + if (filterRow) changeInput('search_columns', filterRow.toArray().map(function(td) { + return $(td).find('input').first().val(); + })); + } + table.on('draw.dt', updateSearchInfo); + updateSearchInfo(); + + var cellInfo = function(thiz) { + var info = tweakCellIndex(table.cell(thiz)); + info.value = table.cell(thiz).data(); + return info; + } + // the current cell clicked on + table.on('click.dt', 'tbody td', function() { + changeInput('cell_clicked', cellInfo(this), null, null, {priority: 'event'}); + }) + changeInput('cell_clicked', {}); + + // do not trigger table selection when clicking on links unless they have classes + table.on('click.dt', 'tbody td a', function(e) { + if (this.className === '') e.stopPropagation(); + }); + + methods.addRow = function(data, rowname, resetPaging) { + var n = table.columns().indexes().length, d = n - data.length; + if (d === 1) { + data = rowname.concat(data) + } else if (d !== 0) { + console.log(data); + console.log(table.columns().indexes()); + throw 'New data must be of the same length as current data (' + n + ')'; + }; + table.row.add(data).draw(resetPaging); + } + + methods.updateSearch = function(keywords) { + if (keywords.global !== null) + $(table.table().container()).find('input[type=search]').first() + .val(keywords.global).trigger('input'); + var columns = keywords.columns; + if (!filterRow || columns === null) return; + filterRow.toArray().map(function(td, i) { + var v = typeof columns === 'string' ? columns : columns[i]; + if (typeof v === 'undefined') { + console.log('The search keyword for column ' + i + ' is undefined') + return; + } + $(td).find('input').first().val(v).trigger('input'); + searchColumn(i, v); + }); + table.draw(); + } + + methods.hideCols = function(hide, reset) { + if (reset) table.columns().visible(true, false); + table.columns(hide).visible(false); + } + + methods.showCols = function(show, reset) { + if (reset) table.columns().visible(false, false); + table.columns(show).visible(true); + } + + methods.colReorder = function(order, origOrder) { + table.colReorder.order(order, origOrder); + } + + methods.selectPage = function(page) { + if (table.page.info().pages < page || page < 1) { + throw 'Selected page is out of range'; + }; + table.page(page - 1).draw(false); + } + + methods.reloadData = function(resetPaging, clearSelection) { + // empty selections first if necessary + if (methods.selectRows && inArray('row', clearSelection)) methods.selectRows([]); + if (methods.selectColumns && inArray('column', clearSelection)) methods.selectColumns([]); + if (methods.selectCells && inArray('cell', clearSelection)) methods.selectCells([]); + table.ajax.reload(null, resetPaging); + } + + // update table filters (set new limits of sliders) + methods.updateFilters = function(newProps) { + // loop through each filter in the filter row + filterRow.each(function(i, td) { + var k = i; + if (filterRow.length > newProps.length) { + if (i === 0) return; // first column is row names + k = i - 1; + } + // Update the filters to reflect the updated data. + // Allow "falsy" (e.g. NULL) to signify a no-op. + if (newProps[k]) { + setFilterProps(td, newProps[k]); + } + }); + }; + + table.shinyMethods = methods; + }, + resize: function(el, width, height, instance) { + if (instance.data) this.renderValue(el, instance.data, instance); + + // dynamically adjust height if fillContainer = TRUE + if (instance.fillContainer) + this.fillAvailableHeight(el, height); + + this.adjustWidth(el); + }, + + // dynamically set the scroll body to fill available height + // (used with fillContainer = TRUE) + fillAvailableHeight: function(el, availableHeight) { + + // see how much of the table is occupied by header/footer elements + // and use that to compute a target scroll body height + var dtWrapper = $(el).find('div.dataTables_wrapper'); + var dtScrollBody = $(el).find($('div.dataTables_scrollBody')); + var framingHeight = dtWrapper.innerHeight() - dtScrollBody.innerHeight(); + var scrollBodyHeight = availableHeight - framingHeight; + + // we need to set `max-height` to none as datatables library now sets this + // to a fixed height, disabling the ability to resize to fill the window, + // as it will be set to a fixed 100px under such circumstances, e.g., RStudio IDE, + // or FlexDashboard + // see https://github.com/rstudio/DT/issues/951#issuecomment-1026464509 + dtScrollBody.css('max-height', 'none'); + // set the height + dtScrollBody.height(scrollBodyHeight + 'px'); + }, + + // adjust the width of columns; remove the hard-coded widths on table and the + // scroll header when scrollX/Y are enabled + adjustWidth: function(el) { + var $el = $(el), table = $el.data('datatable'); + if (table) table.columns.adjust(); + $el.find('.dataTables_scrollHeadInner').css('width', '') + .children('table').css('margin-left', ''); + } +}); + + if (!HTMLWidgets.shinyMode) return; + + Shiny.addCustomMessageHandler('datatable-calls', function(data) { + var id = data.id; + var el = document.getElementById(id); + var table = el ? $(el).data('datatable') : null; + if (!table) { + console.log("Couldn't find table with id " + id); + return; + } + + var methods = table.shinyMethods, call = data.call; + if (methods[call.method]) { + methods[call.method].apply(table, call.args); + } else { + console.log("Unknown method " + call.method); + } + }); + +})(); diff --git a/dev/articles/interval-stats_files/figure-html/ecfs-1.png b/dev/articles/interval-stats_files/figure-html/ecfs-1.png index cfe18f52feb91fb7fdd9b7c938f14d49f9906226..2675b801c93da540fd6966b4b49965484ff0c70e 100644 GIT binary patch literal 75873 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­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 literal 75884 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⫬wRN~3R8^YRMhDsq7q*Te_}rF!}&%6=TY_|^A) zJ@nUYOf@4C6El(h6ANx96eVC&1RRd}O}dBK|ZL0E$#7L>BDfN({?Vg%V+nVgqqZmG^n&@)IX|QVO?mE z2PG5NTeEMON_wU`t0mP!gQl)Y2$63=cI8`fFKZwDi+}x#p1oc9$rBCDHPTKUUq6)b zQhovN(`K((4$fXVxbPh-y|9@{*>$tSDHp&8qp`0onqHp<2avQ~R7^X_8s`g;ymL=U z!>*ZJwj#2cT$Ne;+aN1zAwk8qr0){O`IxjzMk%2|peSZIX`Wh&wYq9_BSQ^7p1@^a zXD`Q}7X^o>+!Y}FCYOIB7Efa5HvLy8isw$6NY*%XjcTw+)1PGdn6!ToZt)*p=% zJ&`3U2SIt(55^_j`93wk6KL)h@iYBtR#C6MyAEW9Q#l~DK5y@h_|MGN)caJtmWl1p z;0ZEHELDr{VFrAF3#|~s)X_|kdl{`ZLQ{Kr{POBe6k;?xPXX^Rkn;=rpR2z#_w32b z|4IgFx_M_Wi@a^T2+jU@B~pg`+1*M@M|xc@=j!YgD(4&{z`d;U-@J{<#Hi-hdBD>91-`Z%V(W}nJOTX zl#l06)`q<{F>##5aolv^paU-~d*?0~!{JRPsRku>h5a1firn)BH;-FuDPXRr^^r30 zgu(*)eyp~o&nf}e8*z@QF(q|o4nM>!mEqG5ALB@FipUr%M~bPjbrqGzU40${`&wYe-fx7QZ?5r8UJon50$5rzWa8cqEt7f`cHYe&7Dqs7 zn_jcsBQ%IUG{u;`pcWUeCdEFi4R&!ZlShdEz(YM`4;!b5O#a8QEUDMj-&o}8l;aza zV}eHhi7RJSb8ZOBzc88M(MjVS?2wq<}JQ?coV1i{E{I{L$C?y zM~c%&#dP0byp31@=E58lcf(WNWj(dgsb8w^zJgVYo*9k6PJz%D9c5M0`l~gS?R_Fh z55e=e30`(9)c?^P5y5iVNcYUcO9zyalC4m8V=RV0IJ{mLbW(s^fZ5#r4z*fO-s}3XlU6lqTlEUx8QaFC`8vnf?+$-QhtGugag& zc&0E?X}#Oxtg)n&(c~(=m*~3d0?Sq@Lt<03f+w#BmmU{ka+Te0^@4Eokkzhr>7Da5 zgdni{cuJdRc0^=ER4&(OVqUXy32P|XxatJcDDeCFU;b4b`0)rZm^~O69Y&Ju=&mi5 z+}7&QG5<-4(R%+4s$)fFc|%4Rtk3x$y4iO26U>UHybZKmuES1_SF}*c%UT! z+S{*+M48IMS#@|_pZeFp0278$Qq`9@^yaIhwkg9|Mmr@O?j3?`Kt|0QH;7&@JC`#h z>0Q_$xoEP8bZm&6y2b6#JGp(g_((+Ln5M14Zw^`2yns;}?0+X0jG*U_0>Q%h#U*qb z*ZSE%R#TXyJK0+Vi!t)mCNQZBv+)QhmW^3_Y|hg=+lY`G$i%Q8w0VAh+@&QH;G~Gf zMGxz{hoW-Yjj6lGt03^y&mADs=BfC>rHM^{n! zt|syjMV_GUX#Tr}XwG(%BQr%f+~UJ=qQ+3^?R>!XJlf?S#=B)@ZvEc-)Ya$Ou;W0_ z*AcPqkXAclND2^9n*j1^Ut7V9mcNwzi@>B9FL^$on|mIBCK`$ograiNjeXT&@zD)& z-+#PBUZ^`8Ok1JftcxTG1XSyBM<2(eVkM9E?@K7G<{!wJ#Oa6qVs6YVi1T9KhdKR~M1@D~s2giJD zu^n#E_$>U!1=*FKKbl&6xFmdEw`E@IV@82~)iMs7>Hf1uz$OWTnzcGs|2$q{S41@< z>RGd=kI1449xR)h-5PwZ`KD;65CG#3Xs^$M{OyiEOoOjafZ&aJf*fsA$u*}LJX8{T zqBKgMNFr_wn>zlI5R$>^LKKc*FZhkJ6Y*yeeFeGKsUNWNMA0Wo2yLQ^9Aac$7cent*hvSgNUTY~wR^zq^Yy&ePM5*7 zUNQpFL#6J|^&uvUE~)w1C(3-^7@mumlWy6AFP5wggR%f1_;n#eREX%Hrb@sQ^Z|@^AD-#4_MtGw$OxKn_ZI$yrRNaK|ILx{tw_(=eW|y4Eyvk`+0sIA`-a<1*Az+#dhyV|@>FCp!L|^uS&D9!W8Zvs_~lk2Qn6f> z7pE_U|2O8oix3wyP8BY(6v)H)lPY=z0%^dHZA;S@yo9$gS>OGi-jDgLh5? zbIX8=PYhjzCtK#fWj!rNCU97IIdQ%Ar8kd^y4{ADC3N?P?*8h_Um z4qA>r5~Mh8UnInS=*=Gs25|5(v8b zoZK_|6>A566?&*+LB6-zXPO%PNv@1z866NHKJ@x80@z$$ZzJYIWPWup{B2y>y$o%C z0*7OSBkNjy7U)VES2&&tu>mg$@HKP_QO1W*cex^unvcN?LoO3rTJ7(n?xzW08vd02`TH z9{fHTn5s?3*bI}CY5(1Mj@r&=j#8-Qc-nNY9IMhR57MUaF;X5_&Q4% zu^vU*@nUJDen*m`;0+$9ym}+4iI~l0P{@AZ@!h9)hXjc-*ff!F$z7JGyTHi#;}=o6 z9XYozl>jJgazE*HM}O((kuqmaLvfqgbn6C0TzSL%!aUMq{)1XkNMhmsK}iQnoH0>-wHD7?WV7E zt#Thi{{#n5c*PVFI8tvuuGqF@z5W0cbnwtSsg=s>EzYfb6#Gyey?VkDgi56?)O!?J z+1>JbUI%i-g73M29>|F8C*m&6BZvM_493HS0@!6b0|G9lWnfQbedTN3^-={H$4`)1 zN~9bxB$Ycpt2N5EfZb&$eCW&6k>NAu3KGm8etd3i?^Zp6JV@Q31T13+(s7>J3WrNa z2!^Ngd*#0B<8II%Kj(A-7el+d*q`(*5or-kC%cLd4bX_>pjUOI{FJ@-8VBsV~qol3%f5`+8Gk6$zZ& zR-}X=STw|zoC0r3P`4|5Jrh~ux>Zi2B;IT7aKNt;AeW$1-2$1iGe#g5=8v#~!GR%qg1Ft9*W^Q9Z+zFGDIV7pWEi)O%btbWG>(EJ_lfN-zE?Jj5UX9cCr+*vC9O@@0= zb*{YB_INX~`SI`4f1^(I3Rit%;hF~v5?2RNlADZ7|2`O20;)Q}|1J+n1(`pTI>ZTA zf1&xf==$x`{fd};lFM&k8V(o#2BW_&N8k?Z&HpirfUbVuS@?utxnwGSnKUBcRajCi z%JwH{!#<^v1`2h*OC5Ok%6`xkuE{-o1wtV(Zp^Zht$B&Mw72LO);C^>rLIC{<3xPe)*5A>Rapz2++iVD#KYu6nctlH<9?s4a2={!o{ zC9W{pf~22Z=GxAgbec)6M<(%FpHppvWBVY$Ypt-*Au}^QJr2l1v%M$?X~@U5b$IY( zdJ9YTl;H`iBWiga@2mwKQ>JR4(%$y0y$3qQ|0)5U)YzYE{H|2V?4P$*G=IfX+K_OI z>;A$vzDz9Dbp0+!Lna>An&w?McJts-Uy7N9>08K&HrjEI2F!J78vSqf}eg^1AyuH7vVXw2g*eUZ&K1JBKHvbGn`c8poc!;8p0y_eE%X z@pj%LpKvhceMAHz@&Pi&cI~KnJSwyVMQ~8F$a6Cuw9atI?3En!N!(%PMMlfrkBL?0 zhtJWk7Xh;$zcUXow6Ep>R6Avathx)w&}6cZ{;$!{>NOHxAj6}YK4U`nPnnA90H&FQ zLsCYrjwEr)Z@1oiuxts1#?t7S`eUg_`=8F{*t0#&4?$$=ePLTvAbL~F>z;|^^3b&| zUAKn$+_|!0N8XUf_L42mX`x5BclUbl-jsb=1CXbk)NY6M zq>&&&W*-Ak&YKC;Not&0r}1wjC!l5MCFJ`;iJ|yX&u3MqoFDb^-QDV!SoPk%C-WRn zgF58MGQur@1RHuh&Mr@5xVGF3D!o{tU$-pC&`Ps{eqMd?R%9)o86_-k5n?@Cs?ZnEsw?r_9W(-P;OpLSDfvRp0&@(x+%3>GeT;>z?!8T&%+3Lum z-mxYGf<+v;N_tVLE5%3Y&Yy%@)?o6-*)ydSA($kmpnwwLKO0!mTH3Um(}1_wO%}hN zPk4Vx2(|bW8C6vkkJ0U(y*02-_bha8%)On*3A)uS zz17EBH!!=t@!0kf4pK$QLo35+4S*a&9-)%Xw^P=*Kxj}8WFTBMhMrtOn2<#jZj2oZ z55(;k0;nGRD}#F8)x>kevktU_CJ*_*Js37rJ(lP!Nb=DL@$~mXCB>*9$CCGcPC6dQ zC3BZ&l3OnB?|8su+_3y4G+M2H zIHdge=E5O<(AEh1Nh(Mdb}J)98|{oF$jsMiH@g)8m^j(s)tRV_^M-f0TIKnRO2V{t z%sbwb^*vAFL}k2zucB({ehC#CX^OU&bl>>y+ov=$gKdl&Rn`~fmqL89D&3&HF{(5d zj@=JDHNt@J84)mz%qu8p8%W^;wsD@XZf~wjz7W4TMhJ=f-~I}jG%|fpgIOl}ev%UF z)#IWj)B3uTm1m{Bv-quSkVSbP|GpJSBl=Pi|IlOdyPYxO5qO5MnMiu}hE>H6DBiCi#VjO%0(ek5n;R{@g8@*!;6fLCCfy(=28w*_?px~lFrCk zl;k4&%5Bqr#?rn_=qm8`=)@o~2m-cX}&~35&?uL^GB;EvyR=2 zNd|9_UOtDZsLb|~#ud@m3nB|Q>uVmR#^&!!F$q*wGOkhlx(XbhuLyiW5exR>awZFU zjtKPLuQuH001C*1L5P!v(BwY?NA%gt;klTz7r1CM0W?qjJ|3JShAB_P@3-ow=G5Iy z;@8H%#HgHyI062!up-^$?^l$+FYvq;imDZvYb`~wpz1#{_ZR$=fy%tb#Efab_7d^4 z8-+6N32hx${3#&I7_%>Ovr6@lnzIIngRR9uuAw}3QO~^&_esN~Jbd7{sHvs(xvC00 zt>dBuhi)09AoZvoN-wtry!L(oZ;}ulBX7pS6spR}(w{2BB4hE-9E!Y1gEp-jEt>@v zg2(h))6ee(@j#kKPc8!KngvT?%~fp*5M~sw4xd3{`_j#UT$HpKK|%YKThs%w06`2(Q0qRA#nYSO)oot966R!5$7;O zf)o*%eick=IN}a!s6X>(55ggEJiFlBU!5a_NLFkC`H`lK4jyV5v+N)ych#p!A`B#w zpFw;)R(+%!zk6vra0z=sGI_hD5l1F_s6+@QmUz$T=}GcR?U93bh2(+Q6&J1E^=LGL zTy0d($pp5Fj2=S;=_kCV|QR-1sRAmD*OYX*H3LSrW{2@K?&VQ9D8NZe%X%H0Thbq zWTD!vE)x(=ucqcj53U|7v;5<1aL^U|8=t-uN7pY0`UZGb{?CgFCs zHXagt^;nH52E6C!*|NDo{XWiSyf)JS*L)3sCC(Ukvf?i;2qe0aFRWZRkcAK75*K+R z+_Qb(JlIf(Dwf9GgEMY-OhZ*U%5!Hb?no5+JnH>(|DS8E!DtbO$vjlbS6@|Ff@HP* z{Tmi*7Y%lO%pJ{~H&k;-|rhW zTC#J(LXj7zUo&eFt}$`yl6( z8>jk?j08tJO%fX_U4A|5c(|k(u$dnq$$rWR>*K|c*ol#CDwZ~Gu^EZfgY29hR;&F! z0%uY<2rK`XW;8>mv=mK^AMEIBx}EGV#+){vHl1zhtlW|VE78oh(Qk_7zyo$?HfiSN zT!SZ8=LAM!tdO)(1OA+t&cu!VH#amPu%hFjc+q07ryFlv$3hjiiPP<14he2IpxmEYLkQ;m&FAVdD}0XlO_Bw z=(<008b$(_YHF9OqRJtKd}M8!^IlJnV5E+GJAb^_pR>q?<^^qijwp2%#R_UlKJ)>~ z*d_PPy8EqH4nwTAqQjo}kY7K%V^9!u3j-%JMt`e~*4TVxkBtH7($N$sM~Ow4|2gDS z{W=P!INY}Wf=J9|k4?25(|#a`5$Mm?&PGxW8p%%6^;kNz9eojpum2|AuBz>0AJoIs zMSvma0Wcbbwuc>m>rP1`FLoxr5PUZo5V?u@)uE*3UK7|4evr)V;LEq>5-vzsmR zx**zFm=+hriEPvu)06|!%vF8g1#=%i){ZnVzwjZD!o(r$Lb`6#9*%#W{%+Mb0}mYT z5|2R4#s0qO;d_!Cyv;1=tTFr&dUXu`_ScW2qx*#Bib7h;{lZ>-5%KZ?PUbd2jh4Le($qBnW720}&h>&4)k!>P7Si}WL&#hQ^5k9?W$RaumP6xs{6r$$o8p~`++YE*3Ex-AI>OB^GZvN(LPX< z{ojqc zT&4%8#zx`TvwxC|_e7pHPltHz+iAb_SDwWuaCEsa{=a>WfgMbpJ=4J6-w0>MAwH5=($BYePD1cGqx%ag8xii+M; zD|az?Q?u9`(5F>C{XJFgA?`9;lP+!8V57dYaw^Ryq&q$}l0dw2vGf9>{t5ZBdr1#1Rp-9L@oC8bkZwW%%&bUL=lrKMuB`<3 z3L{+~hHkJ=*D*uYYrHdrsmYC1l!M%*jb3Ut%@vjuf$w0EoL~N1927s) zR`ZUe*JsSje9nPUB}o<=2vje~;U9V?v@@sKTYs7$X~+po!u8A%;W%_c=ZC zC+&B3W3t$Y>Tv{uS4LJY;uysPD8IO@R!XD{16!~=O^2;+GT`uOX12temqpka_s*7G zuRo)fMy&gvgG_&fCJ80R4>7xX96?ksT((^>wf*{rwrrbF-7_0e>UrrzQ~D6qDO;=7 zxa2d}0?I*rO(v}@%2@5S8b12;lHoh^5Krk;+ql3M6DsbS$ z$a?YH_YU-v9w5%+c zF|{H@rEVW}xaZeZ)mVCrdOm;t{FIrvmJbE@HAOe%>W9grzA{>hMtsPb+AQb^DIj8K zuOyc>ig&9Sb7{Zh7&%^7$CNU|DmMHA84kOZc?*0@=GR{hsP3BC($fq~<&eVRoX@W+ zjnkGxmFAH{4mO1k$*(bjNqXdd&^>ruHfa#${kuD)j*~bkH8nNL==Oa59AYl?QFo=G zm3bFOKlZ`GBJ5_W>o=nGK}Fp=R~;-T$;}%ga5D0>pR{L-55tNO(X~ngy`qR%3?h%4 zau@&Uz2XO3*`Tj(m~Bb{EOAtM*L!J$pDdi!H*HP+_N!^i(gsP03QO`2w)?29o`x8o zckWgEn8nS)Y-IzX3TFP&DAT4*G^w$kj!gSH5A)OQm5%&h1PNsDkTrqc&n&WrYrQ{J zQDla!UI*?}sCBf-31icizd(~N8n!*qMjj!c)wiU&P%tii-nkjYHw1xD0-u)H=^6kZ z+kp)z3Z%5!dh552XU z;5NwyeVJxsw^QA;r|se+7&uJvo6g;*+kR|4w>DU6vF89z6iiooPJ-c&;rQkzcnpV? zI%j!W8^VV_F!#OP9SJ6jBgK3;aKkREpO)e+*8{D@0Agq3rpO_oDgZ4tt%YJ<@a?w8 zi&8&ePcLh0%iatOebFGm(;HaF>ns5zF7egdcc~Rc?6Biu9k4HTK3J0W$_NKOjl{p5 ze%cqlA;PSmTUpAs!=UqQ#5JfSYb`|{>+k}HNVuk7-S$6n5S>T@=}79Wc)CNPqves& zILA0rVYFpPQlcd5X%o6_zY;TQPOO$k6zg-zSb*4c9V}$ z{f$kx(SJlPm25Y$Hy@!vehd>t9BgvK*nH?~90Qqy`jrl_U<;$*jDu`JbF)M_e>-S2 z!|7zg+%8kWze~V|xm`=gFm$|7#|(Jd<`pcX#fXpHTZ(}=pvC^k)nH9RDnVpbgFAM3 z)xEiUY;_*{*v0XX$KjoX67^hFFN&=1(t=hb!4M>a@o(ZSe3u?7{KC(o2|Yard>FJ?T&^hQFXDu>apFB(&>?oGWQzwi%AlANLOqMpF; zGK6I}(rqbgpx4P+KdI-fd#7IR`*(2l!_RVE+|Oz(#gnpMdb!AUYzfrYks|vzSy`id zTl)VUYtRz%I?h}tkArI};Q>$kUYp%b-?6XcYrc6c#&BOnF-rUw(MC1+1$kN1uSW`*B}5Tl{WznW zc~&DO3}Ye}fbs0Z72ws4(dBkKNoR)Z(0slI7Y8SYl;HGiPr#<{ueg$dk6GOUOKDeC z-n@X3f{ei_f6%=os8=tVv5Sb8hugraIehFpEd|9TBmv#4 zY0umyTngl|H-VUbouD`}G2Id$fah?@V9q@EU4hfORnJ2L$@ z)iL`y+4I7Mb-2o?wZ&2+HtZ_!WKT?`q+o#JZ2$YXtv0Q%6SgDiu1QoeS1(%J1 zbM>_}bn0YEV_+zg)r8J^lEM?hE90lVn_bZT|;GVl{x)znyc$&y(3I5vy-51G5j=t=_^ zvkREB9ns5&tIqhyu!uC>v1w5Pq~zg5Y~pjluZya3N8m%w;RRk5Uz-rPz}~(K_~tqT zAN010ilomR{cW-&hHrsw?XpJZg(e0c19l6o>H*%VFc;>M2xKy6ITvyz1P&+r#ro{t zgP1}5P=YRLQjAg0ID_B>y@XH{sTDe^4+!tiiVR~UH5A_MqMXW*D^x;OWIs>}qf z#$i4ZU&2X2>iXiiJ(f;}+qC1}*w}%zYqlx+c}v=^#99aB>QSo&L=f@>zjaY0r4~cw z$0ZZN^2xlxXX4~XQy}xWIiX@s35fXg8?rhn}An~{O10j81c1{k`H@PiO{Y$+F zarU!(w|8Ng?W}uyXxxv|NjztLMFl*C0M&iwK3zedZR1uUM7ZjJ{^!>!#iOXuWm^Zk z=^ttO^f2srPq~;9Ebg)QimYOFOs0K$mUj8q)pp>FQb8~&vzINQ_9511^dwUCO`0CS z{mW`qwE9v8aeeDD#w;rgs`iB#B$5X{YK=fylZ9&ypf0G&SBN0Q?fdIlRzi~x4ozSM zBFB#(lT8}o&sJ^jf7=oIGaEyFf7Zynxn|XOy-B+d;7aI{0EMjiMk9aGZ4PEw$4|xgpa)FMctPqTakaK+wzk%kaZh;OahfN4 zhHgRkSQTYw!(Z2uJ=*x@x>DlaD^*zb&(VPv`W1wst-_u=9;APHeSc8$9ZQRV?Znc& zXL>jTlII(n@DNi4h3_=$`}8I!ukVSSQVMUU?|wWlmx*H{>rMnbaT2VqkkdSVqYXRw!ZdgLPySZom z-rv1{y6WzUIdh(Q=9xL-f5_tx)^G?vcd>4SSxbl$@m(h=u(>fMfY?{kvOxGxLNBLz z#$l163h0X!Dc4vLUsXq>Iyx<8^#|f5{gFdd|HZ-M=z|FlUH1`qTHa%6eK_0QL;TyT zMeqbRHZ%jW3<<*S96R-gN(OF|=5xuwCAjIxNmBzGyv*djc|*7>yKWp1^tbFob^@CNgYsm;|Al;YW60LHXb7fk0{Kj5di1^WO_YH0ONgTWWN@P-E;jwN{Y9ewxk}Z-a9os7B7gY!ORmG1?;gL z)ha{33*sY0=xqBB{WzsxFVBkD zwrve@>gHEP^R&k9m-ENfgGf;D*bSTSICM;nzl|8T1DX!xm|vRE$3a63P$}^m{?1{~G<*rn^QEdB7B`=_>E& zRFaq_=_9^qdxXvX(3Kbg#i^ypHC56_@El4z3a8~#3lX2;taPe1#R$$d^tSPtiJ*El zd3$N;!AC}c+G!4?4S0`d)1PmTE4&Kpq>rf^L8k0|7x8pz-*k0#o%1-|nSGdk#iEN; zgt(H5fVad&ph2gwYDz@G$hf9sSj;6f6VjW$;sV*3cke%d23mxU6MLF|9&Gdn4>I|3 zN}IpVlUH#uP_d z-tl%^)JZTxp;v~@=-#V93NexEKYM}b-~30*?5GCBF4-Ux@PxbWsglP_8RWFdgJmb?QPs*l;tA-bFh7>+GIsU7@TUf5gBl)FxdrD z;#*?a|Hc_#MoXxwk+c7_0A5j%AUb7jQ`9#xEZ?YOZ6savMOkc;DruV%LT*>h%Q}}I zLVwo=GkE8mFArb{a1C`QJW_Shs72sG18C&9$STZ&Z>f6aIcyX{MKTwedsL27?0@N3kY*fZiSxf9HZ8^-v11TFG{dM>WoFp*=|DS>Dw&DB2 zs=YLHFO2UMc&Xp>B&=zVrj5S2zBFC!|E|;ICz_?0^f4n^jM8SjNQQ3Viq-pgRNGzW z6yyrMmtKB(qRD2ATlfsRR9}*VdUsk3YF}xmPR!sSPoYK(6SjaGC<=1CpNu!*7k)tI zjKAr`cg9c zFFUGy?c$TLI$n!j#6+p7aDje_NuWRq*K0}hn4cy2ioUL+&&N2%M=|Gi-sExLG(?|A zQ!Ry~_y5#Ty)c4zTeR*iC|cO+kIkdsO0oGe?g4*UEA%eq4h+g!6nV!n#cnQMJo}!y ze2(3mlP(>;pJEd|c~Yq+U?bb={B!5|$Q(c)dw-+|7692BWG=*z)98D-s6T%}YTtBy zqBL&cKI^Je@4-#VX%rENj_vj=1kR&rXI}SxDWWu$6q9PIkOX>u^uCU=-#9D_W`$9L zk8pzgVSB^@Qer1-9KbrOw8pJR8Q-i|j??qo8|ZJOEG>mcg?ztB9Z+Li;_Q;v&?GM5 zNB5oe@E-n=T~e`({`&pw^E(%6xk-eCGVpQA0(M<>4}v+5nV|2W!ME}}^$RWO?K=+y z?^VtF3ENJ~@_duFv$N|zZ}2+KLxGDy5=^7Rp+`-@zu$}zFVeS93~Xm?;}u3i_*kDh z#H+%i6@0Hvt#9+8EBu;U3XKi#^9KR8;;x>h#ID|T<1b0DdXmZ8 z^BGT-KhE4U+ar`oCzfL`d$p6t zbhz{++m;`^Gk+7T5IhuWxw1hno*l*Dwo6N^rb)Eljgu?XA2;|-6HUSB>>PT~u=e2$5`ScEG_i0hZfimK>#O9s7*y55JaZBswfI_?Wh>~SFUsJajG6WE# zzOhkPZ@MZkt6Pr2eghjx;*3qWulgLH`q>A=I=9#3MTUYdoyr38VO)XE35VH^_`x(# z2@%575nqt>@K6bQg}!GDjb)$skRTMfIC73&L&?u(Bq4q17eeUqIZN`zvgK=o|7K!Y zbbEy{5nZ|ac1&BpZFrM!8E4Q;?gXd@BJAt2p>ku@9Sg3v7LO{v4nICrH{NDI61(}w zd);zE{fZ5z#t=>5`5iO8pN;WJXh;1ADbQKzfG?cI{t}UaRgu=mD*1bBiZ-tLuZu&b zhgzBdM|5g=`fn62k<;+@Ol`$W;dB)b_8XhHZjzskhBL9;@0u`S)w+_pPt|^u^7h8g z>08Co0yIR|Ew8!X&037)^gqW-@mR$9RbieYmtR=eHffm}8O~ArpJ_)_@PESMTA?=( z4UDU1c2g8Ng6PL|WDIbC&Ty_oskQKsuOZ&)20y0_R(#~4V@k}xUwudXg0% zn-H{#CHkteTmWy?0KDz0ybV@Ix}M^eA?k1t6C>3QMWM_=y~_8xXH(Kh5N(cP3_0(e zCp!lrEq9(OwfP=V&l9u2_}W5g#U6}9w2#fxfI)UE#t~o>!9l#(4NmZFJvcj8Q0M}) z{9QlKEWKX}olvcAV~Y?Wz$O0KWOSlo=JGKyQ@wbN9$B^PeM~(McZ}F!0L=C(ihb|y zHeT9~34zn9Q(}Tf%BB-Am?5{sD1MHEML?76Dkjq+A?RAz>eG8om@J&v_|?*g)5U1U zZdXi@Z_wD%^Y%XY({?4xWcurm+(z2Jy$*3#c;yv-zUKqSXmI1B+q)XP`kmBwsf4ug z=0@a=Wa%6hp0t8Edrd!&;Ka?heG?R8{c1cQVB%}TSx+;&)lc@{^}N*WB14}56S^I4R_xVC?%0@?0U%RfJWf{n zPFxUfzr=wY(9RwQ+(LWDBb!ZFT*Tk2*j)Kq zy%!^=pN=4Wyp^(2#1y{_vVaeK0`G6`OBz#J9h#7&(y^7VgJ=Pu(I9U4cyxiRSC z!EaG$Kcn^O72wp!Tb7ZRqgt|U5N$aCSdBV(++UmB^I48vyzlAEFxo=MV`+_wk!s{< z5b^9y7H_20vbroF{Ri_S_UCbRpDlcpp}@|1Y9UUcq9sj1%3%N(^-dm=*_~_HN4_Um z?ByNUQklU_rm43~@q9w#v-kXHXWQVk-22p?&7is@UC5p9e9pB*K?t-;MJ zg%joWGn-DfokU_p6WYY*Fl_om=&faAQ14<9GY-;O_DaS@8JJwHW;zG5Z}S+ zA^hh9T&;I;t50A)0%UrZ4TrOpX;FLnedqb-0}4|g<1yVRjDYC~53kBlX8+E^8xF`{ zDbf^*dVA_e70{NuKMIMVWt&S^X?2m_?SWpsiX4z$5M@!~ZRf;@QPrbLUg?^D+13>D z#YUge`Icn85=$7;SmgPcsG+pOeN8ZUj%g!tdJ86kHjB|&3O%ftQrqI_YV@@X+a7hP zyC(3VOP81D|2@ZK-Vl5Km5`9oe1CzkVIHA%dx+^&LD+cTLsFW#xG`~O%w;1t`@+bw z-*>xW9M+dRU0#BdILKJJxb>l;sn=hcAahecX`%S;xO2Op_Vkz{bhUg-9x$1^|9Q;= zesJiBufmUb+iZgFL5x^}jIj2wYA30+Kxin2g)~-Mnnr5$e3{I)EP;IH;j{!?oa51G z1_aq&;-pIX?^%(_B1$lFX!TdV=i+gG=iKR%HRPVv?v8%u#ON%Bvzpn{GLl+O)xWME zd?-qbwJKRdize8ub85bPV@ZYz&$!=+4edW4oSrx#8=^LS3h(&T+vMo2d2g`yA|KYvs@X%8VGXkxJ<& zIgb^TmJXgibGBzA?cwJ2`e-+Ig$FgQZHROiRB_*UkLiAMBVSq&T50&}+;q3y;|1fc z1I8Z=B$gmMtuKzG-=SKsbzFWdrtHuF(X1A*|*odaqbIbC(N?$CflnD88viFXfz&W^~ zL|l{H7{Sxqh0*5!%*;%#yBTAQz2H>Y+!<1%qrB(z)s90ow>^q_GjcY3?8-5`1#;|W&c;Y2auxO?piJDp z=RA7<{S0UiHV^$FLcD~EJ`6`9u2r@lK%6bP*_vgIQ@Qd_{=l-|m2FZ1SG^kRH2x4G zfU3JZwx=O{jFj)-on9L3UhTbeiU5UA=bX}?o?YJdph36)WuyI~o&D?mXd_B&1OMc7 zLsKL0^k|dp4s?VeKw5EgU-}IQV9j&!pSDE)+yYhfLh}(ag{uma;8Kx~;r4!Wqx(Hy zrmx20>gsgBzv(Cf{!GBvt5$PEc-O2>DnEnIX2|ZUPn3zLmlU_d{CjNI?(Vmmoiv_E zuJ-AJUOV)?XUW-ztBAMU+-Qh{kxOUjs(e7a%9h3Obt7KCIPrKeR0-*zWn;FAH#3{e z;bvRz@(Z@fjq5uq-NX%lanz$Xz|3xH7Zbc4@L`V~S9R1=#2D;Hx;rKc`J?rB&BQuR zJ)LmGt?fa(deEN@yM|`MTX0KbuZ-Z5ZQ2U@Z^7dPpewh1;6{>oUcumGeXEXef#G; z-?z4zsF>FyL}A)pH1z?81Pf0E<1@eAs#3;ZbpLgLvJh{1RqV0Ru6T|$3vQ)v z{NC{gxT_gAaV!jUGr)I)nRv7!Dbzy9G z=2v|ke%At1o5|xl&xzyXt3i2QCfwTpbR;@c`O|sEqAz)Nzaf{j`S71V0rR&vr`1P8 z3Z)>~=X2g;+-_Gj`;k6MFn##E&TYG8rp6idH&35FMY=a#Qg3W-vL^FscHSatI`2Rn zn0xsToK2x3-o-Z0la#wi0iikZI|0+Uy@fp_OAiAC7G``$X(gzKf;YqRT>{A*l|HAy zvJG2Bmc?akThINMqgB5xauCYsq>6e+-LcL;Qd!0R1?VXF`pY?$gPX7j`sajXh3 zeqyFQ28V*$2E^Y~XKdIcwT_zfcaIy-?AD=VA!o;V-_zG^VI+d9$U-yyBPlb5TG91@#bs~MO`noOI|r)j1(!)cI33-kR|>-7n|_11j;+G>kQ5T_x8 zx-MxQm8!w~*#xtlqk|3!&J6{t{)m3QVA&_NprZ?^eA)0@&64I9f{5UoY%O|^Qpqg` zp{A&2;rq;;oRXhu6TVN{$&R`_D(Pq}S()k5*`!BqF_-tNF{$PTEET?lcgGN`c8@pR z94i?cH~M(Wa#!)5&brg?)a^DVJ8Ko_sJhsX{51+V#Av~Q?m8+B`Vk^p9q~WvIo|YN z`wEKM8)`qiRj(FBD+oRe99seyu-V z4E*p`{c;URvrkg+kprG9ewc`r2fL?Oj`|y{@%(~@xV0MEWIznd(p`C9QPwgcJA85} zMu7%yw?`+0@#0ZD?R`R-7)r7w@NRPW+>7PIbqUX>pfU}c8F}AcnAtL+sj@#+obfhN zTbiNza;NT4Io-OF1ThHFpmB)}%xpqe_s;!Sw%-pMgFd@8ULFR)Tke{60nRwn1IXly zK69$%ehjL^URGgJkIEjmnxs6 zAE2Vs#L3M_m;S=jVY##QkDhIk9A7x~xl%J>tnJoBso{5+tN--EueS*h(n%1!KlpJN z|20KG2lA-Jw<$nWAMMrqVL5mF0B5v20nU17&jq*NIEx17J5IIH;ANAvK7e?U23c9T zzH!hQeX^A4>|!eqYH+pxW&K3=ZA@U-`?E;GJ+i(Hibh8Ph31A~>oIO%6M5!mR*kND zT85i5<>Qk8au37F3CX942mONA?wl@C!SxSJ^rWSKstC5tn9CG7U_N_#R<=MKLd(is ztgUW5YXo-TvN<;|6~p8y^12PVSR@aJrz<8aV^N2>hfTI>9iF_7`0pV*UAm(J5~Cc+ z<+IdY*yix$dM11K4fi@JBONHF#Vb9su8MlppV8cyY^|JZ-yUZtde6~XT6!e7HV+~E zA7U1=I8VMchKgQAM#D;q?g$a8lH5Z$C7r;3hiz`>oQcn=I645Z(7AE5D_&H3DBB8|GP^p)rg+s@>C{!3@v` z&m#v~0P{>wszr45oK~2P`O>reEG!cSTta?^7A9O?@&$68K=j=_0 z0tY&-2%cAYXMHu;Tr#}Br|ErL`!wM<@YA+GgiA>Laqab)7ajvv<5%veUMIG-?=arJ z{NCg}*QalXGOxb)=+wHr&AzNDCQ>!Wt0xTziS)n>z=Nu9Rcp~D?4pjvL)4L&0lX@D z8D?~Ol2jiF93<7`YWLGVeyo%{EwSBRV35Z3*oKv(0AGU#C&Y!ec*aRa6emy#0)lSPN{*cDskc`uaW9ic$>YgOp=UHu5GX z^XH5n*=?zB1%qTyOE9M?;*j5m)rHYht${uQKd(`9Aks22R1Hrs#G=I}1X zx+*AK=z^}Jv&sy3^&J#TYP2}(>Wf}2xQToR6 z_iB<+0$jraL`MT6h78sX3hkDc&FCjIyOnUS{!oRtJM}Tp3)Byg= zLf|{tD&&sqdoy~Zc@+Hyv!-jO+__7_F7(7g1r%1BqTNtBs!0pwvY^t?h5A)*I-;nB zR-fF*`St7UMmq_92aLYaDneZAw^w<{ZV$tXr1WT)cSQ9QLe{nP4ynSf#{VHm@tjN) zPzm6zFa5c@l9<$k%6cch%h2@qX9mYxCTiofz7$?eQ@?6h_hT-?u1yrpQs(P$cPuM6 zNRIX<@_`zQKj%`Pgx$6feB%c10X6=5VCr>5o8_N0+vY%(i(RB zcc~NidDS#&56bPw7fN}1&m?R)@#;0W^TIq2SI{6zDk?CX0(@tbXnL~T()9e`@0<;- z&mP)J|Mzh3orR_%X+Mx9th=|)e}H~RX^rHYogV{p4VZ=; zX{a1+F@guUAMxGQw+-@WqK|mn?z@IiJ)(UC3eb*lcqitbuAv#{YZP;*8|E)MPrQ$3 z0U0+wk5j|dg_Iu7rUw-j71S$0ogr#v?(#f#2KRA8cR*9dOkEObMuN<3 z5}MC2JRUlG8X=b@Jcy2nRx>W*gfUe#Q4wk~?!KwGZt$ug`K5;Rohb7k=u^h2Tf4#>*e)ve z!r%%gJ0(daAyhqrXH73iET6V*eZIFT4pV@4hM4!nc`jvTW#R7@8#mDaw%w8hq|}d% z1n}wyL_37FL$7jN0tIl8ub`fY@eB0oN<$8DY%Xls=L{7VPat;ZC~0Ct?*rxawO^Yw z+_Y5fJyrcPG3*}R0WQCn441vP*? z?rl;wHNV=r+iW58b$Vkozu}#flvK#+yw9N`g!sy=&NC$dasq#-ignAgA}G{4N71Yl zeXnc6ox8Hd12)m>F|s)pR;YFGrV@Yfvmnp}8J{*nNDhcPsl-ekcBT!9OYMj?0NLRY zyM=05+KSc95lBaMYR%H;TIj<(D<*vJ+YJqe{S1yw`ZT>pd}}+Q zyhgcm)MGb~PaDQ|aOQz<(z4!2JN{kpfCY=m^__U-rgz5eEz zxE9sayePcG(=skE9|mVitXJ@}Q@Gu+3?#|l_Arad3HnGtyAw(9pwp+bqtZ^~a;qE) z;5KbHo6RUKEfwh^)Reu0FwK#;uE=Mdv4c|NeL;=2a?rl4bAq_r>nFe`hqZ`x)NyM6 zG<6oe6{aYp;VS!@3|x3oMN$8F;QJLyib+kzS~!GU{-WGoxBHCXFG|X|)E;>_=Y6?d zH8`{ND~?9g%cUJ?$2p-p6g-)*Z}(&SN?*)l{=z_HquEMP;Flh(iV|uDqjW2ruWL>X zKEZ;G`emhwU-Pt5p$(8WgxjSeF~hP!4jRrhM46N{eJ}uHYu1(388IZ5{wcUwaMTo3 zHS0!&Pb2al1XLx>^`3_i1jZm0P4jJ5`ef_n?WR{RcZbG9_4KlHICm8KL=cZF)7l1b z9MU9%e`dCPe=zhjTHG)faRq4xGJwB8=DdDa9!IS0!wCATdW~ZJpc{Hdz@7 zRGi*zvlP4*CIBQ;kFo2NAgGiRxYBsK)U+wUn??|6i_q*8Ec@OC3n)kRA(cq;eWrxA zXA12?f*43U;6cu;Qe5RwXU1@IX`p5z!C`Kix5eZ7w0%<{a(uQ}E#+xH0_Al{^foto z=RP?QSJyWQ=e$*_Cwm1L)rB!FeSOy4`|n}i;j@-Av8>jZ!VOKcp+9@%2S8=rv&2e! z>NjNX_!T0;C(jlrTw_%;WEW7{*l52adXej+;SxJ4-^-IWRFxel>C7DF1AdnpC{~_9 z62(Rh&%R52-eZRjpLsUmgDg++K(>+aopb#@9cTw@FW9Y^_WMOGDZ&7nA1E_|s%dl1 z&(mxu4$HTP{ro2Jr^*lt(wfgTpLj&y!Wfqm5{L1s{L>4fHSZAye};U+4D|&}HYKLd zsH;ir9I#>l6q9}&Q!1wQ>QH&BQ-q?D^@j@_m){X7G2?f+4aV7JcE6(H`)K13NWkO9 z|2SNSxI_lcBHb@@eMqUZy>8n!-fT*b6{ri9vLb6wByIt@NQ>j;1RY+p%&OywGW zkQzWrLWjOvr|$&YW~p=ed_Rl5_GSxUXrHN5=oL*pc2wHOO(rEO>T2KI(N<9LXHo`e zGxpP$na@)ma|2gI+Wq418lfF(aWo%_RYqqC7u?k7(>dJN{ycJ+nV6Ue{-!auKF&$*$n-?c#T>r^`@~M?U`Z(CV1P{zeaP39 z46Qori%=iLpWR4vQnO1bXh)4tUd#a1V}c8T3OUo^{5T*jx1pzR>st!jD(!C=P#of1 zL!SbndqmUPf!bfjR%N(aJ>Gijs)6Lpqrj6RSes4T&XESU@HB>guRlMpWJ5* zP}Fb)^GBKjwK~;<+@uSRkH9dVsYfm8cLN| zjgKLD!x_-D@~wP`oPcwGVAIVbC>~DduvGF|st=o9`qc7Lqgb@qNS4bTe6HG3y}ZRAoLg>U2d%1j!>nMA=mEtDp=M#$)6)~f*A-h6$%P*dE>0Ad&ViOX@Z}i@&2TT%j$T~wXL`Bxv@|rj8u1{V3hP(_8eWT6lTMi&$B$4sRClNY zmhd0a7AUAxu#w3l$~{2)7FPID|a03y7(a}2+#M{GNQef9Q+QG5_m1~ z*?Q(RRhBxUPuoxDyd97=s#QZ+tGnyP=+#sbcM#0b4QBujv;u*f-(QQ1QT#T2EM7Dm zwim-k7uHB#zgQq~`8RQ+7GNKq+PFxsQ>i99Y9J{2;L-7xSZ!o`>rIyquiyFDH!6ib za7)Vnnw_6y@0rtDqp8q}IDMfK?{U~C(6A3=xXX3b3Ywfa*#x^Tf^EhSNzLBO6|@a6 zC?8Vd(57oc-qymIE^MEAnpSB2O<14wu$}Me^|-kb>Ix`F1@y;ybMT++GTT4)#&VHz z&&|LVFeHJzsCm1TfCEQ0;_}T^GJCVR^m3|anjQdUWEPT-T<-;3GC%hhw4>@?mogQh zADGdDj9E-MFiiu&fl$`KrfjxK4Oil&tF(Mbw;|E*BIh>5awTuuA?{VjJjc#Q50*D{ z(y5*T@6%eI0UXzS+V-3LcS>9&o?}>M%@NG;jkRsYmG~__boP)B1lshvD>wn3TpWlk zd>v4LwMJAkNX@brl*&-qT{=hEM%MEgc-qdN{><9M-h_W0-A#0v@}fc8ysykh!?M5n z$J0HM{RbG+cM7l&{;kYeMg*%t6*TRa4QR>uCKSnj_0ZnKZvU=C*jX@P6GnDw&84sd zJE*lMh0gT8IWv=U>H>K#l24p$FxZb2KE>|nU_r!Q>G)il*nEz2u~f%NIW3&g|8gO1 z#bMperY~QYk%&-}ndHvR=oTwGLHHh`TzAD6LTW=d4U(RJ+faTq_H~i~=P{q^?@jk7B_7R`;Egb;DqH3= zr(c?D9qwPx(D-c(RBI?@sn zOSIhKhb+-^Mr7(~VS+@6H)gx%bu=h(7s8dw$K^eo&JLwFI=6JqYZ6vrEfoWIBb@H_ zc8;pA!mJeAw~Z*xh0S$bx^xzo2w`~W*@k=3%Y5VWA<&%c8_WZyWb;uSn!z^_O8!z? z2!ZN11wk3)>lenqw3rp3J1|G;01_w$I)R<>2Hc_}tsr66WOXAEP>1r_f?=ztK?_gf z5#zggY)5iPr$q04KVTbrH}v$qW9vin+&7*F$S{C{6ykT46aI$+>YQ9b1m#NfbQ^lO z$k7pPZoLHqkCkzK%-;FCNbKBV+m*|S-J22Z$$bpqg_7Wd`EscoCVvNaepJd3U?hO} zXf1RDqPOL6BHMjp7TJ|}U!9IFtRAek!vUWvkC&#_#WEE@&S)sdu~CmVW?OO7IuMk5 zdlElqQJ>B3#42pUr453-dkt29k&$FpcQK*i<*SBFIaw3v3joSd2fH(d4y_6xJqOd*mhds19Juu(^jzWb1%!l}|CXdo+N@aMBdJ=z z9)}Lm8hzjs;5N|mUeua?PQO@K4%3<-P;J`=s3c`kV^s_E9nK=Av2ZU-e?XL^P@ z$DL}O<~uqM{ZGp+4(>*$n6#I!Xc?20gWtfz#0XN(HZH|`7U;cEMRr$UY2v2g@O@VV zoXP1o)o+*RR7@)IF?S!7>80<4q1J^%@s_TD?(&N5Wf)&ugmLoeOXE%8Punihv5uZD znXy%teL9W{j<{J<@Do{8K@p`gy1kVGm*29}zeId$>bMU;%m3EKu|T-eu71lhQX(r0 zy`kaGTNI~icT8^bA(W6xfOPD=_K^?$h2lfhq8R`pAKO=vSg4%}*3%Pr510%q>f$vE zMFt2L1zI(p4=)akKxfHSMuTcuBVZF*Rlls+eBhI@YU&_ zqj@6|U%rwLfJD_t`O+in+!3^Q>z4B-#r}d86Ko&QQulQgr&Zx0`{nkXjx~*?9d2)w$C$P4yIZFz}Lo90X zQJJO4(SY$yk*;RN)h4WLjw_;`ucdA^MD^>V4J3S`vC`(*X>6%%`;Zs z@t{L|1+$|1cSF1#P2i@G2?^Y7O3l{EPj9EUyO;k%e*qLUgow6K;oj(V%HwIt4$P6Q z`o;*8kFqHj_{D9M?2<%ABD8OueDqN^t6GI}k}^XJv^(FmI|FfHiq`or1HndrpI2)QU=bgVVa)XaNvsU%vjEaN#r%cYHelo`HITQj5Ai}!!N z<;ClR3jd#jqeF}n7CxH>h2!ek=vp|qh%rBxUVfiSgKlBM*9t-Y&(C!<)!DU+9>F4#NcX1;+`M$t&^cr}*TpB2%Cu#@f zO0_T%>qZ!!TzkL4vP{20U7Ye_OHpi{;bNpf@Hu*tE9^fQ`kUZn;8FXg-*27nEr>mcc5`g9q!f>g{;fM;LMk)J;z$27jO z(J$r11gg;gcLvJ^l)PE}5pqTP<8d~P68&x+d1tFme}Pl+o0_M_$;|x}OXT3S6#`w< zyfamB@(u_E=P_hLsy@xSdE3z_D)msW1P9oNdk4x!l%lDzqqt1bVrsNI?H$O!RP~@j zL5vB+f2Q^AyS2kb-ph_TKEoclcFOt%d!z(l37&tfqbKP)e@qFziWE2cgAG*l#G?OD z^;5m6HO!#+!(x?PZo$XL@12&xUlAG+7~&lWG=<~yjhxz_4pkX7nLYu~fo@|)!u?0$ zZkfr$Z@-jT9RMvhGFu9Q*3YK;R(r5E4_bw&f zHt%;y{p|+#=atz4GGkRZ|yb64`mNxSm6tT^j+t~(8$O z&8JMg?D(>q;Azf@@BXA<`|hG_Ml?v-TdM8AK%G7I2-D`%*a3>a!4aKlR^2V0Ua@S> zq@uaR3Q(AxP&;|X2vnC`Gt?}fPI-FXX&2?#RRvTzvFckQtv+H29w?QipziK!1`cX z-lw1*g#pM%TwGzGHL10g{m%DaSJzfaSKA>WQvvQ>iSWLpSyYt#ni>fm@NZ9sZNn`tZPX>F4-$fx?(o17Xn}epZlvO?(q^Na|rXI=B8} zo?S`|ST77^0+}z$`6(CRwuh8nub=VIP_^fWFAWn-t^iNZOG1%&4!ap1s3nidh;TFu zUHIrsbn&3)W@mI=MN2;dUy{<%b%$Z%#zh^0eh z*QFTJE~?))xRC_UzsL-Y={$?M_8WUu`)<&aK~oVZHNfGugDYzh8(U3O3J(!Im5CS40d+|g8%t>6WK zS&y0mVFNTc#oPY}$qdl9L8xchzsuUhQcrBLAQ&B9~)?rHniAeTkSYeXsT?u!%x z9+9a8cpugBN$QcxN_+d;tk_rmN^)hMlkNl83g$y#pRyIDLX04j0xEqb;2Ne(w+j}v)}3B^Ud!NnScnp+OV2EN-J%8{W3!$F&&KrzG5U>hYB z?RhfB^mI3!7oIp^>!85?*AUokB2CYn&!K6h@4H4JX=x2=)c@~%Wi{qub`4P?J>6dU|`?w~;K zM;JH6m~H%d9CtS3SS6yNAD}F9)b~*5Y5xq-8C$SJdbrPMWniZN?|)So-vM42$uUVM`|oDU zvhVj<3sE-;a|h$2CWND(m?&n^-YQ`4GagY$c@3v1ju<#_B@zL-e07g(H}=oejblIx z62Ii$jN$^h^Ezs!RN0Ozo-mWevI97X`;R8NZyRao@Zl2UPcP2m^s6l;o>NG zrB};8f5f~mgWh-6*|gh```|5D-tY()IhNX?aoo>Kk$cL`D^lPrwxR&X`?b}EM|Pcqnx zHM<95KA9A|o5PltH<~;mqGQ)++2G6w!M?qb=5(u;OD9??GEhz0mlUzbP9X<7g^QY= zA6-1v5HJ@n`zy$mkL|#`5M? zEnm+5pzc^r1@Ln8A3%lejuhpH4BzzWv_w%X;7goM0I>)S3;8x?P@mrz{9VxaN8b`u z04Eck&M*2K&DiEmsVqH9^-py05dmr_m~$C+T?s`Sd-ivgc<5-O$%zO*OElmOYwRz!O#kc11@Uhxw8AixC;+8Sc%g@V!xj>87^~+p4lU>i>M6 z(xcT{(;k1c1s!)2{ZN5_zT9gF(`eKp)kbV7QbQZ-JIZMP_xn;a%_WLSQ_t#cLf!N0 zpi>Pd0I*buOp1jo3y-khPQJQ1X_e}$X7t+PkOO)h!ljDVm)5q*H|s1GW*yeIqGtfb zGui$FDufRQZ}|8eoU{w=Zp8ow>b7y9&nsR{vhA>@;?qnH0zU)cFj|$`;%BSGKBJU#mgV1h=3TWIIn-!Q-I|g z_*A$#-z^~bWsE|0E#Hz8d_;>{QET6mCj{UI4*0w?p%$JEPS3#vk6Gtui~1^MI!nSd zp-HDS3IV<2_*i;CvoaA$9QG3$SbtFd%1sSU2qDU)jKuJTcFCSu$GzotXpCh4+Xtq2 zrSaz0svVR&#n;USAwy(;C2oU;+XvJ9Rw@Hm< zK_#Pg`h9>ymB1Wskl359KMW*Xmsm1?iMnEK^LM^pl@GPI(e8ZSmt;Hdksty=?;q6O zwkSGA5VBj{o+O;1yUJEKU0(t_z-jv?ySFJBr+0Z;3Z#mk30@AC%2xBvUnQCu%3da! z?;kp!$blW)Xht2I*{AM5KH-z8AK40}R}r4%NuvaD>2&$d4dVOl!NYwXUD2x#SRBAz zH)w)JMzv7pb2zG2&Nn$9G=Mt8C}IOw;PX+g0iMlNlilc(>}pfYxnfYwAe~n6GnaXZ z5Sb`_f;XmgwUV9!(eN8hsTTn!kuDp^TQ6~xdxiIF5PqY9QWi30qAbKw{egpYah3n{ zM^P?n9OY-=;ga$BJ6I0WamS?#DGiSIp{1CIHTkx>U@sHGM3Nn%a_$_rBLe@ysMjs1 z870DYYnG%H`@-4upv|lKQQ5G0u<4tSRdOo)+JpMqy|B^ZO_~2L5eU z{TGatFK>mr6H#XW&jVP)9{i0$g?3{%z9cowqLW_5sOA0o5;G&RL~bk;`XMMPI&!O> zg^E#EQQ~>-rHrvco0HPsI+2N?A!cDD_q21R0#iadJZ|w>XEIa|56888|vPb(+F>3VGipdlN z#KcZ0bm75lK{d#`J)iR7C2wza<8D9!873j&XQ{yEor%gLlBP|q8|0Sgxg|Kf5Zt=h zC4l{WrAqg%>-h=@EsjyPDyi`BeWaED<>_d<_%~1?;vyceeUDJHkX=zRJ7FIEi;{UO@#1 zXF58T=CF55){pi$bcsIKD@(wUmUHA2Dn&EEvXcKT<^AUk!dj)yC*z7!W4CeQfW34i zLb9$)_zeYv20k)lKenf_6HBcQ=4Mzmprd#6R2O|^kAdB%X%3I#fCm~Be~yV7WK}-q zoeKxuHH=11KsOWtt)~Kj08t+lE^82Azj>wTT=tjNvmQJV=$Jl5dyn%UCsK6&WhvZZ zYJJ|ObVlzayNp2&eCcnH%O;k`{SArsM79kTu3Qc~W}P1vR=xokHh5$uD+|=g+YV;I|!v9ZrrtuRsMU^QLm$h6}EiOKoSIy}*mmfnF#K3at#GLt+5&3`9w8TBQf%ET;W zQH8QL?V|4{LS;R4WYoY)b1QJQQ{xTApS#Es15&p*epcj=>VE?wUQeycJF|OaL&R`NkoGtaJz{SVpUAcW0k4b~1@XZrbtJC4E$i6IH{n+5@Smq>Ep9*#Ar|`X zwce{jZ9H9J>(P*;_x~JA6w0wMVA>zSKAUgPldZ+dp7qEtqs(#6JQmlJ`|>FXc@;X2 znYwN{Fj}r2`z}wyz2&nO`v0H8&G9NlOxIuuX6w*kfSOJ}s0W(CF!2cRkAleWm^=xf zQuCjicBI^@2&kuWk}vI>o%?;oY9;eSGL8M&s)tw(7UD%p3OTdU?iK z%e-AHQxy#==|3Gw)R-x$d?%AOGa1@+5rWRFarP$70Frn&{gHsv>xKD`ADsRK7|V zd3F(lcSrEcV&71whQajE(6$0DBXwfGGM4h!Jbs8tom-sA4UrhU@UuTW{>h3%XaNh9 zVWwgC*sqQ@XL9&1sm9VHD|-w z<>Xv0Wxb32iVc>I3|mM=THUwd)_k`o_yAw{GHy`G%f_q4h4d11oQtxtvYyh~s>SS5 z;Q7p&hzF6^TJ2dx#Jbdxi9dOpm1*r-WSy&d5;{a1=hC9oXpxke^w>9jv*JnK;eKbr zv)igknIUh6!o!^!ow?ln2FD-Is0Q0^9yIbcVW?PlMd?(KiN)0oZFT-$R6Wqj_*Rgi zQGq5Qg!{fgE}(;~+a{lqe=NF?-p|fV22BFfx}cbLZhA&HROXU-b2s_q6$S$u!~)%& zi{Sk_nTLGmYTvO3&vbJw!Z%=D50B~J-#HI;+i7amfBc*aUFd6n;X^ZPbt z;@vr4+SFh6@3h*KI1!RC=HOo6&TprB`{qy0FLw|;iSlGVNQZtz)M(`&wgh3{{Lbf@ zUV7nWJ;@;F051Z|F4AwiJGau_vL`6cKTLMfLyWAq~ah4l`l z@@E&753WD!v-+jx)uK3?!47<@I%uB#;ytK)fNtbL8%=;N@eX7JBgjbSf>^#CX{SWO z3m!r_D*ZErM%4{gW$T^26E}@pEuN=x>Lk#QnL*_CuXvuzoubdb%3j##^h=GYMMdW2 zJc#yKD#a`hc=T}Vzj{%3JFQcUDod}eBOhjKSb!7h$G|4+-7!f|Qs=s_KOR6iI%!{Z zV{P=**v5sllaySWx7(c1AStT5b4nqeOPk)G{i_7TN>go^f6r6xhTd;@!u9{~_LgB$ zebN8u0R&V83_?Kxl@Lh@=`c`-mTpi=Kyv7jQV~TFm_fRwQ)*~X5RmTf9EKPggkj+B z@q2&I{r~Qp`|h3>`Z&()v-jF7KI^mAKIabk`C7uw$?b{N0=TxX?hNh@>^Y>~H8(Xx zr5eiELG`W|TZEl`W=HCOej!b!Z=OXqGgd@Y^eg$kMT8p()J7Z{?>(Ph`{&@GaZ}w#Kh{-Kp2ZsVMGo; zbVs*~7cNwtJ#!Mqki`i{Og!TjM==rcXH#S&y0zVq>Ib9%^nNzZ)rc|Yx5LC6-qy;M? z9aik!Yz|{Un6I$vqfD0FM_<<(VdOppd=V&ylC7)LDL4t4W;$79!d^P!w2-=gTq08p z{6$LM3QT~7$$PbE3{BpIz6890vxukEA=lITvCnT%rO*2+3Ov(N?KUN0eqj;b>;$d7 z>EPd&kOkjF4EwJ6)ExMFg@w>a;i<`+6MQ8IZsUW!vx`L1WBMIecMj1W9CtuDc> zFYQ*$^fTH7LssJ2^@mhqMT#3gcUERnEppO#?CW;s{l!(^R{(8Z$rDAz`KbDOdxXHo z7IW3}`)vZ>TpteqHE=6HueUP57;{UUrA#!w0W&Q?iYW920YlxcXT$#W&0+i)j~YkP z@J`H`N*%A3hwjXKB36|+?ovT*k*GdO9Ro~M#pHFQUWMI|48I_`3yCWW-l=xn;%?lfzYmlPkW%zk~VFNM*7S$l*yM!Lp&mw#(eG4^wD z%PJ{C7!U6mvUjdl?ZaW^N_YQ8tA9mssPMY@n1tK?RJ~{OMAAvIa7IR?=+#Tat8RRy zsP=cg7Zi{}^g?X`iq0cpA4Y;aR|uw*OKOAc*1u=>3@pWB|)$)@><(rzCXroIIyM0k~U^4d-R z`HAFuR!~TJ7CbcO@_Tn*+t+GR8V^${Zr-t(Ling6!M(MLuC+AQ%j5FLnkqC*RTWYlMjdD`$! zp@FtJ;qTP%=YZlgO$_|2SVj=iy;y* z^zRJJeF%w2d{W1kNkPlW9Bu3~w8s$=&ZDHy3`Km892?8lzY@?T5SAl9o29%EdzRxdkg|!R=^W{<;hcijbm*rX$;~xu__8KWH8gcIVt??-qUACnQ7mv z=6Ki>3Qi2K8T}FDUcHyXb<0=AEb~kXB9zr|#y1Rw9DOvNokAxHViDD%EVhMOMWv9g zt*qw|L#M^qMh5M6#3M>)6f);)mjjn`NuUTRrkaE?j>G9>6M^g;d0f=D(bQQ5n3DT; zS<5r;$9;JPe-X&KtmU|BXSb8YY{Gl7oCC@{60!yh>kP6?IZ+W&zIK>|M1q}nnwA@h z{Gm&WMYFqIuW}}#ChVOzi5XX^wl1TrdDDVSQAYLmLJCM72g2~Ndd$0yshlo*=6w|1 zYHVC`7w3=ZvnR;&jwzeh+zQS+pj<5j;wRZ<_^~0zTMEdop)OGmwJ_K0wA&mi;7tIu z1*-z%SN zIi;$UKYP(a0ELP6b!+Vh*iVP;ma*`xm&T>>c`dcL6243%U17+cA4d94w-1w307OEF zOE_>-Y#eK*+)3jY+)G!kal`kgXJ3HYx>vF_TbiUAc#d%o4c(mlQb23cBO0No*85bB zpNnOoERj`C6(+1>M)fLB_Y%I^NUVLAO)VW@qu=MJUYBR>KxO+Z+x$_k$Rj`IKrPJ* zF~6g`)2Bm)N|M@rT<$X%lJsu_C%(%rH1W}JT!Y%(k~tGvBlm}evLa+Z)#*0Qs@=mr zni^=H)Xg6=xid}Y+eBq*=stTKl$uKe-Bo)k?fZkZn$#~UKBmI{@zCR2m-bS|A^-C~ z&rjiS;UYS~&)yKg+OJGxx~Hc}u@f}V5_(Nj~g5K~5!ieXAWGI7H-y zxt65i*~@5@W8_&SYDcLY+G=0(uPz)gDyd(BB1$BDXVP}gbFhTzN$b2=#rIcQO@|Z< zLRpWy-ohfW*gCB{0vRh3y{s+Z=|3VOo;%}ru{i~DQY(t|QwXuei2^wScf_vpaFXf4 zPB#U`7gYJd_x35-#h%}(pIUoXYPtQ=K^Upd$A-gA3+x=OnPi^ z4boyOaq_6#jl=GcUqRh}8gnqAo0@+fQs*8?CHa|r(6Ea&FR^aOBX~4gRQwE$G7;Pu zTh1i~egi3t)x?gxHts$Cc^FhIi&uZiLQM%R-^NTVC|d~7b@e~3*_=JA1medNO|+Z$r0&YN@3*|lA@y&w>ieR6 zF^>;)CoiE}HnxOjc7MHSaIaUEr#Iq%s)k656FK1jpwPf+R7wY%|)3&}*D?Dx>B zO))&zht#osYHAgvL76e5r=GJpSycbC#xk}6BLO4B@jlOQem*DHJch)xIq5yJ=F5=u zl#u0}Yw!Iw8@QWXI@jKrI5|G%Ao&^Ar=wlQy+O|9*S#aR&`AQZ(Guq)iaL0pi~a+< zak8h|!rp@4>id1n_n!e$^=Hzec9(YF_p1cDRM*MJg~7`3-}8a?Yqm$&;Qwyz4(3wH zIHQ$pFN%A>(-Z(qKTmA}y&L*qd~p4C;iXG=DmcVia^|#6N{w7}kaJM-1?@7lUvnrK zmB8JIYG6{I@Zrr%=-A5W2L+NPJXv=R5s$Of`RM4wU>dKTgCZ4b`RE#5tKDAmDTq z$|@HtE_8aI27(qIykq>CO#hkdV6P#)y3k1T=zyt=e28JWq*Z6HAkNCu2ezL zw?GO3|6gkf!1Vk&qAoTIQJ;l{J~aj-RW1#%F??8;S;%0eWs#AdV$xTD)PKdheqx-Q zPjldbCrotLX6b)=tQR~6hIt2udCT{Rb|$UxTh{e|;grfu-8MUaa-2$P#lV1Rhm*qg z8Fd0&K*5+1ipb44I(p%IeDo)roL1$t+8fI%*1`%~tEZ2NYXrZN=?P^X5+&Rgv$mQm z)GTpHoY)P@S_KNrLR2&kxPu>1Sn+#*pV?kjq*c(r0zBIaI_I9r2zt1rn_0Oz2#SgfAo8^v+bg%a$r2`!lf3WWlwJ2T}7>DDtwL`CjAnl9;Jm+HE%HA6`~I zieX$b?tvhAN1~%#eqS8pD{bEyTSILU_`;jK5QbMUVt^v@dm8c@efGWgM{7DMU@rV# zdYr|Ssks2x>17FcJwI5ozjf&k9$!JVHn98|=*(TB&fLI=aL7b<-HBlQg!gsUstWHlmz~f@5B!msw6;>NPQu$sU?Qfvv>8- z<*PF9*SOs-t=CJqkQxv=AvZo1MmiOz0vVYIzR((wiVF&au*!{v=8mKNG7XXN6U5e1 zoP(sqHIViAwF(vw%7n*dS?5$*bJ(kDwDl^1Z zKeRF%h2MG~WjclA>KwQ2kiFvd9H8+hU=Xv2sdr*$&AS(socdhlOk(wV=$wI!Bbk_) zI1f0cWBPcyN%h@Mbn59=B0hZ>}(7B4Zr zx^IEg<84B=!m^8CYP%7RsvD{yk21eKA0&sqWfj%cb%oBi{>_BLX%r{I_nHjLa!fx} z@k8>K---U~-i-*Rs=MRSh{I&~hUA}xnn!OR>THn8vvihGXU4pJs!_C4f4%*7Irbve zgj{M4HFP&z_<%$%vBr0gYSN`)dI(Qj25Vz2Gu3K)O;8hrv1>{C1g!gD#n$fa~x)LKuQ-|3#y|72Ax=W>qF(|8z)RpQ_`y+pBs%THruiuE0h~R^tvM z)Kh}C9Y#u7GvE?gq-1o*f`PXWCTcbZgAxc0?kjbt^A9lm@w0*P;ujz<=@Lw$XbK$b z!=iG85O9c#V-hccpL$`dt8ciRgYI;=ocPLsC(^nB5W`OhG&CDB3MPi3P~wP9F-l@r zm2+0zjV0TtMxS1XTto&%jileK?hjkw_6OooQ+jKOx37GDdg!bjM3Bxof|4~vhX+G; z%(?UvOLrM)gof$dK-!rSuyhuTmZp|LhH>bq#id;ligHu<)CLgYi~UXq%|4*Mn&_Z> z*4=r$fc~b2Ulcj?=qF4jv!Y6Cdf1{+!H5FvWmcCr@Xq}?T zv>N?D43rnBiOPSz(PSFOnwVkHVH^`TpQik7I8ThLfed8-2AlTC-{cT-fE=>? zO&hSGSpJZoVmql-aZd!UKNq|NsfV=|>^Hbo4j-JhrH1>)M^sAyW)*rw zLHzwY?C!4k+0#fduCoVVQ|8H$%1!YxBExyuT zgcZi^MTtx@O>^O*w~SEmGl$UHDb25_y5+#ntQBkTkMU1Pp=|?MxYf6KhP0Plgb|p2 zQ08d#z50&I^))0NC3IDYIKML!Ej4T#`xoGssc0j11GKJJOeN6JLXQ*x<6)wI<#t)E z-bwhUCTAEn^Cs`vSK^R7tBQkuQrX_atIOlQZ`9`!Wjc0m`Z?JASU_tGP(W8DiKAXH zvNa1(#kq@ypXD7eJ?5sGfOBL4n(oO(ihhFUfp)G5Uu32N%iC!kVic=)Hz+yYOe@a_CqJ+_5d5gl@bU(HFs20Rqr^uZH z>`_KW9@k9}oJxXV8_H_p^R*1n#dE~aA3-${5F?*YUTkI6jDFMPFOOk5MEVG2k7Vz|A1$NaNM$jF5{n= zFczM__C&1jr7!1v07KHKGlw)*`Y!S#EzX`DFO9E%jLPGb)Gq_CmI~}LxpJ57hc#Sa=zabPOYM0JJH_V!sa@e> z4rhvUJsoInjx?Ewl-1(P7zSG}&nhxBg%{uY zX%xd(^E1@&UF`V(GbWplh_EZIxT9!{wT0v(+#_VkWun)ZPv4q<8rR{-F0$vUW;oFq z@`D}9dZps#hQJrWbk+2$m%_EArJONWVVEO{P|mO3WseuZ9G3Ihe2JH|;S9PKA<I3)0hz7{$6b-*Vw=#X+K)G1j5}dE4TG5_No27cUG1yqkQoJ>-!5 zO@^va&)MH3JZB(^l%=XFav_yxO{!II+Nwm!)ohXuI|DW6oF}=l{&`eO=*PMokX9to z2JPlE%G0<=WpsJ{U~3Nm{(^3`fY?Ho3Q&Izqr;zC-)App6OnyE6cUwjN?_+BsDwSx zjQNFjHb*aujy*eklq)-pVZj_!_XA0w(PoDU*9Tn#I&$JdMdFA{+PA_tF1~=EBYGYn zx{qmZ)hd)L49izjY6rPdmlVq*(gdM9WX$f9@Q(ZTa<^n=UERZ7JD*MH<@fNn#`r3B z@fpNM*NX%*ktAP^*%g&@$SpXDVs)f7RO7K%AX4q*g7WdMCY;4duJyR7#L7HGl(G1M z7za0qfIs(N7}D;u{uaVG+>MlbXnydmM!_QBMv=(9)1+|vvk-k&C3;`*wCAHBcIx;8 zCTV&B6FqS_)qA-+GEW@%m1YKNNYP>O%e6t@>jqBmSi2=WW?PZ6Nr_Il**+~0xPQgx zc0R_1f5^zNZ`w8%l9&hu1yh-eDwdFXrSgNJC>zaTu@f#e9b?-CQoO;zDg^Dy0d-V# zSZfY}*E-<`%0dnfhdZ%;B@SmB5K2HJA_4*Vd`ak_L~G5W5a{{LTMy4!gI4`t7GQrh zHONrGIK6$=+E z`Oef$NIo{kXH4py#*5@tg!A~qz|TNj4$-#M_m)@@@3ii92Sz z%pML4CW9_`<;{?*ds_+jKeE;jEr--q z*aAp)AFS%KfNHd0j;IOzA$(>(%#y}Y48sK1@aQ&5`$YxG!hd;0cv0EM7P(kxh2$rgl84z9h5-9OlJjyu#)TM%{~TU5fj8zH;1yQux*@3#HafXQ>K4qa8*~-PiiZfS{wDwLEIp5g#|8Qegg37GC-V( zqaU)aL;1aCeI(g5PqOrsJ}I8@e^6M7#wp4rmc3L!s2%8K#TCCCcD5uoEqH|N?N#5^ zI=W~E$1Sd1fcK@=YKEig>J}O*b-xungdh-R?gV%uS|m;yN{-4pPj&AMx0Yqwy=$#_ zjo2L|`8hK@X!iH@-TPRa$&}=Mc&Lw+{@h6BKX0i1&vT%i5IT>BW9)b4B`^Y2f2IRE z^tZeEv?w8Y3PTa-;{er_47JD!j7AZx{;qG(pry+rV1;b09FtAHprj`wdxH3*FGh1P zf9cnc>0J+yQ@5h29et8q&@EnW6BT)UzdLqS(++^&xqr{Fy==WgO>3`hoau^ek&~poL}dZgrQ}slC|2dgd2k9i*5G> zZss25vPmx#ZFKw8(xsC?GawGIy)2>-@cdC=*=b5;*(L4crM>^9X*BSi)&7ZDguD|J;1aQpeCXB$XxxlC7E#U({-cI}GHBz)70N{+vB*SyIE zH+Bc4-oXqxvTil8u)wacXN4+fJNWND&<0#9AWY;3XkekrN^pS>MSr)DgG*g;YgHcs zf%Bj{MrHGevT#sL>@;5;cVen9;_~;Ilwros@u7X;DB1HN5E)u+rgwWrcPgW-li&v? z8cWO-9E@Ffl}~p;M#oGPYrod;<_&!-Z3l$PplGE8C*HGb;AJb{w7t2fT`5s#F}%@c z#%f~Gu7*VuFK#!`wj1fdhhq}o_#q3qFK*| z^7+`+m9G(_Vl~)PT%GM;uJ058?2YKad`b%(Jd?lLj6atZN>+L`lsMKh0qYN5l&nlz zRFqf@ct{OF~MLUJ4udu<|JOJ&`atSMqs4b#UXZ-6EN>!FYrPJcjFijK-qgsvXP z@BWJa)D-CQ2<~{$kcm^dK6ptRm^L!mYeAp{Q+h>RFbed!(7 z#fL)2?OrA&j*W~U;}|*Zzp@I{E=M~A=|YfX47S6*F=$$Sxk|WJLKvMCkwNUy0q(7l zW6;{F!!W_FtCi5#?RV$i#<$DgfTwtHy_h1|RD$a?EQte9{@?tx3*gwN)5=FS18$(~ zYo|B9`~A%hyvtZ*Jl^;Y);L=N?qJ?}p3MLJOO2lEwz+bQ(R?Z))|@z-ONa_8ihx zZw@#1)v33hU1gX5G&^FC1X8~M@^Hc*A0RYb<~gp*zt)_(_Jn-c5;)3K2^+aekr8RK z&>gC$hXJTMLw1j{G#jMF`qoxEzl8Urh(Ho~4%>o+BYw^3$%(R&x-z>slgKn0D!Kf% zrGkbusoeJ*q>wrt@bt@!Jk}jq`|}o8tM7hgGA{%~oR$((xs7q0xG}Rb$ z+4nj{RqC^&(gCyb;W3lXIh+7hr!>F`BWY@b1;&Ilv3tTia%ZQGHk;tgN?I%sBm+{N zWYaIBrQAy`n#1{Cx5T(yTR%x?>hh~yFA?f%08KE_<%%7Zg(4!Nd$wwm)%;1*44?yo zSTK1nrYce@LJ*<{?{cWt=_|?}SvZ+){AA9;=lltR=!lN0{_H!mXhsK@wkb)Hkp zB>2k`Ezk5f(mjz;2h)CUbffQq`d=+i=;~ab>4!3HT}SQ+5&W@&Ze#}N&QjJKs{1S3 zny}P8C?+Zs#gydQ7jh34QwISbVCtH&$R{=69;cpEdZ@K*lpFpuZNyp%zUUhbNk^?5w`*$5ngtjTp7} zUxxgDeFTPi#wmWXEgfx^*@=2hb5187GXd31oFn zA#^4Qj}E6600KCyyu6@p_y^kN#n52S?)vlVM_O0Vo;JK4Bb*y+IFt}2ik&D!if|Qe z%2VxKLxudQExh}2QaklBN%HG|6zW)&%#FAbW*0azf4n*S?hfHi%h5Sj10sLir*#(k z_A5;fo<)5UUoZdSw2+sHd-T*RDv4L$8G_az;3VBg7Ti`1rHigbXch;^;*-&>HL(A38Flzi6AwTks z^^-jizUCKwK8TL$rvnn+{|2Cr<*?_YN;7PgdZOEQ)7o|D*++t96#=IabwQ}J?i zuc~5KAeFynQ;>g}1B>#~EOhM_vYt&f>n^wid|>dQrtT9^j?zl~8OZvqu*dDFJHl<%qz%@ZH{w?H#AUKO3WCfo63t^6>=R>! zx?GqDH>OW>X-%+w^9+TI_cd-ThA*0OOK}jj|kJ-sV=#Ivn#wWSIr} zJ2|M=Xno$=s|{=I>qTFa@}FHVcask$_ZQllU_q>e3H)DkX%kl!ugCY}X6~ z3!@SdBF+Q3>A9DoyNwkgag6UxUaK=t(RhR2@u7y_zf+EO(CV5*R4W%qs0#XiMIToH zMsyd|V!r3I?GsW+X4zZo?_9^1Rdjmi+V2GX-O@Z6Z!&AK$3)ck^+loMX%@WA7H809 zvQ*M-=oy=KyY|asdKOTm1O+k*`A~p%PVZ1nW4b$G6K)>^t6E^9hq$7&agEp&DEUpu zXesuU98JXW%knhAKi+TjK>p5tFG=PmAXVb~t>GC4yi2~(=T#-K%_B@$Te+KO--bq{ zi9?XPh9DqCu1-XD$Ln)w>c9`C-S8*IDR|?Qr2=-UmqU7Qx1r>kz}WR5O#_2s8hi|V zDpiv`Av!o=cT*#_8v1d2DwajUqpOM=m7!+;`i<&}Ee==R9!jua963kJv2;@YTa*;~ z@rW2Sv&PEorZ0L=lTUiiID1Sx&75mlNUP<<-iNuUTBS^)+3)#jV{^{<7mMqpWP{wTapEQfarGlo0O@B%OgUtzly0egF2P`waImCQ5(fvim zV^vXpzauZDD^#(H+RTvFTafQ=@tv=m?-mugUqFNw4$Lo7@Zo+kXN!{xfQkGds&G~u zjh@qNg78$#d2@*eCRG_qgJ(eK%7O#@G>C-yI(4&tpigS z1_}&O5?OuN@smBap0}4l!A8Cw>;qe&fX{AU_JLZwZ_o0G^~j~6&Sj`X79Al!57G}@f;r#lDH&sECok0^|fKS}56;J4KqexsXm zEa*hq#XR#ry#S8D)!`M1gi3M}@QUE2)Ou@vVqdQsehaoPI60_~v}FOVdW3|CKj~M* zvj0|Y^}FsPx>N#_){amNRC#7s04|D$6?h@W8&8ai@9w`F_&eh`Q4*J{IEAxs$_=^# z-{1jA9@^z$s`+_Qa3_u`^S8NsNc?!Ay6Qzv^V{R-kdVL^Mo5+$_c&MO%f|SaeXqJD zK|=g5h<0Sr+W2wspUvk&9H36+|ov(S4($c2(aF(r12$31Anc9 z{2p(|R&&ZC_v_TO(_VMl&Y8(KZyh2$2P=%RNCQnOV(yV zJ7X!$;}8gX3{rD-&LP#rszP$KhbazbFr#YYSe;sy!zptRq7cQ(Z=>hku$Bra8_ZJW z4XB5*TNTlmk{K;KkZaL@sKg(CI{#6L)c<2L(;JOhKA+l+eX;sSzVHK?P`*Br5FUX|IH|SVO3-BzvuAeM z`97M6r!8bB6Y-2XuXZ+{cV<`c>D0P)7PzUEwd5u_1r*%z`39+91M`-?dF^wj2gC2q zQq!!>ya^e1F>2bF1b>+K7IB00GOs7^uPM9qWa zYccNkVzg#tsd`KGqoY7q|FLJWW=p}$yZi3 zuks7iVPxMu8aX~;U$~MLD}`-h96E5ttf?K(H6r_{r>2K}kAD|VoS^pWhCuz&ebdV$ zq4WtZ=XpwVolpVZ&DwTaLwHVui$e*-_Xq*h+dWi<3XiMIm$Kpa=TGOmC9rl#x>%O# z@9w{*eML`yAF;924F-DWM(wwJRHOh%9h8P6^fZ1QsvfeJFa@NM-m zTFNOd9O?BT=yUqir=(+}d@5TcKDQbTM{8R^J)u^a6yL|u4lD;_&7il*beNL$@U#2) z(TWQI2R&lBTq={G@n3cr!<^8S;4{^b`v^PW88GRoa)bpfjM`F$w;|}=HEI(!(*OK3 z6YO^SEgrW7A7u@5S~&-EANWo^-stf%%`?9a(Sygm#D2pLRbKD3P3{7tUMW4t!fY<;5Yl_JEy7Gjt{~ipNSzF-b6!Xvao%1Qk6#5Z`RXsO6a**}6pm^{?7Wz1;ud6`FwFqf6zcEsDH1eK#GxI=nbQ5NN5`^v8ti1L>hEW|8V&b}h?%lLY~L;024YeIL0%<+?LE3yg$a3@ zB{Sq@(G+|{U@iYiNbBkQG?8AdBoJ-LYFq}8G-!1_q(<#NfN?#Otl=@?#;U?}b1^cS zl>MtT0~;FQCegA!ueA~Q$BZj)Q2YD*`2~(Pu~SKfqQcJOAEV!z_`NCDs+&+*$3jTh~gjlvq@is2{9IO1ZU$z_^4_X!5=$)$3O0pr$;~ zl=?D=DoRP?>BW9yeBGnrjzf8ev6Nc8jYAyDC)*EH43po0BVRbsFWw{Pq22w<*zYou zAGPbYw=tFdyap#v;HS^dF2L!PxgEn?L@Q4%W3YKAZ}N%lvbWFfsaeVu>u4o@qft{l zpD@ZA>Et5lfAclbI>+DT94LZEQ|6#qVyg=WzYGNKba%v7V|9}xQVPA6ZI_YVAs0_9?=8U6Y^ zpx*!<&zG&!_jFJ$r1y@AN3w5JaIyFHz_ka`@tm;pd(1Gv%`&`lf27%8eB9bM1|xhZ3psa&JPC%sDw`Sfb(dJOFAb(%)0%BjbF2pMV)H+O4~+gW=xKd}+v%9z%` z#^T_4=Ux&QXiZ$^V5+%h&M}E=3eDbeK4=*{99d+CO^3NY8Q!B+Izpw@UuYPnUQra-Cqx2T%>1 zGO2pmi7QU0zn7tUBfzfku<1qSE4#tXw;pE#mgFL$tACi0f_Yye9(!chb_-$E#V}Ch zPwkZ<>+aaprhTqj^1X%C$(E;bn)xU7;$A&dzaI}fxnnJko(J&cyP*Ai;Qb#GvS()& z;u{x=_qRGtpIp3N%In;*o#4d>den8)5+xhCkDvFpJn!hzxLB$<`{8R&jzg}8HE49+ zKUKL()kru2jbmc_V8aDJvS0pnQ_@29j+m{r?-wP0$;S98K8Z4&!R4n<-SIS?9#6ww zpYA?lygpnbTzC$GybbP)yZ+{|e{NMcMi}tAs4p9kCW>6Cnv+0A(xeh)-Gqs-p*z*> zlO=2l<5fVfR6xpGdJq9%2QiiOE-$VcIIR-Pv+K&#fc$0T#2e`vf zM~pCj0Cd`r^LR?Frz<~l4LL9NIK8WR(Ne?P4O29>mGO$MP)fbNJ^6r0CJ4Po;4>eN z2Kv;vDQP2Ci>{b@W6Rz!T65uKpIEiT2G%-|zE(mHS^Ct@x&A^rcFWa=x`8tkXxp(; z?jrPp;n6ClOj1hU1n#l(qu1NFp|qxw`RNw|-Uq?rZGU$P;Fpt$-;-k3Z*{guIi~n@ zgJ8HaX|fNgYXosJsFd!ba~=*i>g`p+Ml;_znISS;2pETuv6CwHY_GM5YSxkYnQj@+ z-nSTv(mN1zm+pU^1byD;^={dXa>e7?uC2j%_x({Zf&|Ls?7|6nGuIMbv(($bz}V`b zH>>C>!3!Hmx{5m9kKM3!J*kt_V^EDqG_bXsrbBbFMy+;tGsTE?M?G23=uSGmp+r&i z(6Me~`3TipZqg$6jtxFT3+?7Uz7;*XjngxA{H*4Cc+lFTs+DKvrz?eUaJk4?xI3TC zY?x8&Oc357D=`^lj<(rf@v~_j%j|;>uIF?4Zlph+>h1^WGKP3iwonY$d45P#;y`kJ zge&_$H}qfYpt5z_#Bv^$6_tyIRD8+7kf<1;y0Gvbpf!`CMC2l-GP?5l-Qz0@3o2|G zf)1do0~%@%o(=WH9jhP3Z@=k!Ru#>#;qy^vV=R|dvu6^|vS-joE>)&$L9#?TZVt3C z=dAC2=#~3iK_h(?v&iA%Se9vfyo2k|YWIFzcjfBollrnlxuoy`%o6-kH=O}5324Ni z1VVS*Y_>y$*Yk0)@Y}4ic})f!8B@^0<)TXcddbVItOK`ZnzKVx_dll+4XS{B$LlxM4V5hRaTXYOfx)4Dj(jU@pi;9I!N6ruQXgX>zINI z2^&^KEb;r_5G2;Dw_pON5BM?I0Hc)V{eC5We$S?f`%MizQ5;Lt`ghVT+e&>NM%C!V z)XVK=6j-y1?o~a^%Nz#iO;g8-EWo7N)#1Orv%`ftr%Q z@dIY)sFzW-dN*9uoY^X3WzXB&k?;4y+T!!-0-Mk#jEBl1f_Cy+im=Br=u^;HW7&oj zH~LvmPx|dVVvv5Q4bq`d-^%U{)Rsk%${U|YNr?+gCH6`!L98eJ?f5)IMnTX3YYw^& zf3wcG;W){rKi(rU2nIv>PWSY=+L+psLs0qya70qjablcS&+wZ~FmBl|^m&a#wr`XS zyUIE@_qET}d*40AQ!?b=f5@$8x{y)-oA)@_&dzTupj~yOPeASp4I+(rlO#w!mV);dpz`L5#&(4Rf;&X2|(`!enw`wgtrWWqO2CNvVz3lv=0 zg@u~=CU0n_Nd#cX_#s0L(=5~B-O#fppnLhTKZRrFeMh6U-=s;?&(^O#{^w`Zca?>f zx{PCIM9cv9a5{k=OxOc8%{tkhKuF%tcBDeb^mKJGw&t)YfInTVBh7HtFm?)a*Njz@F~o!ZaWEZ4A&<2=XT>e%Tb< z-?@e%Gj8c}>gtRIZv+euC?Naz5RiKpE_Zv+bJzZ1jl8n4oMQ1GOdbq(-sbv5uRA+mEC)z2S*7ZueCQOV}v( zKyu$H>w!unTBYwB$D7G4U(WxA_J6<$+PN;=DtspSyw9|1P9Mo4fIPK^iP2TEXj(14 zE_&kaSMQ(&w*KGsldbW;^M*Y||Mz)AcIMyzYcVg#9X$@7G4WsB@536|^CMh? z(o7W%v^oFR7oEtAp}R;;E4k@Y#W8CL^cWE@DdLM7Gvh|PDXYFF%*Mxw!k0Se$&4vC zPsgiw%=B}PXlAAn(+xYH6d{Gjjh8K-f5{Me{QO+Or$CA?B%++ZWO~oESA?bUDk-Vl z;@3l7RWvW1B3awiJrE4hTGvZNMdiOnG+wbm`%Lug& zXI`cHsZj~u0M0*N=YyZhn7`VRD1%Uy0&i>Lx0j@eCb!-s>ZstrRtu}&G<$XISF&ZR zw^90DzN^!5D5D_@w(_?aE-z&}LO1G7*)Khv!AjUy+kCnEt=&vtEVX^42N7+wNa@O1 zJ%(TOS6(9?A%j%7zbb4NvvZXW0S{N*8CYCA6|?f?j|_~Z*NHdxl{Iq5aMe_8dyT?e zpKe&?$NHdtJ`=(niAN8qscg@KPqj}YSGJYpVB6KyEycmO_=U;*JpoRMl3#iZO}Gp) z$Y0-66Iq+TD8~HNQk!5cDN*sLu_!OcID7xpBbMfU`p$`~$#l#8>+Ly5Iyr<5IoHk# zW68n*0g>xe?U;V-byE);@knhqpB#dpN`F9JR%4$R^_#p=b*Q;~%9W@T5cH+xi~#ZP zpKpagqZYV+BrE?D6vTVyN)7P?h^p;>zG7e}3F(nia#kAK5rSY2wt`^rXUO&ZJs#AW z4e=kItJ9OP0$ZVrkzEg9?&zWVC=1j)Gc2?N-5W6n*s4rjZ0~iivn=~cRDr4w39=j0C zZmPT;z|N{xEaTE+*LVFwi5hZ)Q{u1eiG5XG`Mdoa)FKedzl$qXO`YGRfjW; zON*lQOU6!Z^UQgkn_~i)#(6~<{J)i6Ae(PTt|@LebMNkD4Y1y+y-lE`_J(V3ZDk{`D@VSYW=-j~WV)JLG&wM`)nQIU@!T9AH+Z6Je#7t+lT?9M$1gV9 z*M7FVJ<)p^WM+$#$b}NviR2*LVHUd-%Basm{q|U_g(0V(%zD(q@!UQ~b{!He(;CSR z?9Zc#;1{-HCl@#RZNU^NT|3y4pyBh)R*9!eirvcy$-4jgVB*iOQkR}?G&?IWD1p{* zO+Jnvhkx<9I6Xvq(3ktgFNA8;@{bjM8t0UdY-Qy-Jo-D^eM1!eDCEYp^indbD7s#M z-A_~}LWmlzJg20K-U_B5m2KV;C9N>ylb2Zs9YS zqRa4j%$%%5vs_(?8bZ^!Jdd3cg)u`QS3jdom0haOnHy1jv&AEy1goE#krAw|- zwnQ>X#VWLdEuGHWuV<>R)RshF7IoM7j0Dq=6J>yoqAlcqh_MY)t?mK!}P@R0QOvS!92* zqY(lj$S$n}BSKgu5CSTJh!9X9L=r;ghN-DHGc~WKrl#im=T?1n>-^3+_ji`>yIUcx ze5K&zvs395=lX{77FJIRh*aO8kSnTkmX|vYhj_dB&V@(U;p&Pdj z1b7=|k$T6OQ5g?q;ny3bCQ^I;9Zou>FNHgnAcgx*+45MZo|QAU{{XrK#8bArMDVT< zkJyQvV2Lx(w%D?6j(?+T?3Y_{a(LGL9!7w_4kY*GnArSq!H?9Sd8W#xOdji(ty!L0a$EHk!hqBWVEqT6~cTOs(t$-kQ_4bDB{+^n|c6y;MPmTX3t4e7n7T0Ff%nAR59nm( z2ofQ0l;j17s#I>2nD~Wi=A>n5-sd+|35Bz*K&K(S!i#sUgYX3T{$qpmk76i@uBGpqSN_}RNm)FB}4!<~iq<pPQh5m*zvnu<2DBI14Hju=z#xTCpNU;v3#-v)qrQA`>ogKt0%6v~3}{N2&J z$b>6LMbI|)aPbYORXC|Zuu~M*^Pz5#mqFq}QW$WosCiBrxR>=Q0~;r$9YIK=J~ej*E)v7paYnz};~ zE{<3Xuz{g9{#Dhx!WDhaZO<=$vY3@kopq^F^!0`FnI|$;4xSy-Qn_+8;Zs{zbIVHT zX;wy%H<`j-ynHw2;gbyhEVt=VOPmDwESX3tZhgvGQW}zpr5EoBb_>>`t~Ed zoaVwfsSc*(A{~_cICG?yEHm6+i&`@IiQnBc8a>rQ9+>WCf1V#y*o?V;WPolvtvw-A z{h(*)__rjWRgu-HmuAJuN$Ztc@b8I}^UGEnWt{Dq)`qZ4r(z|I4L7#7T2bs5N)P{y zp`B85**c&HA_!07q`9t1I#VKbfO4l!#_3ui(U&8o6)Ca^A(r-Cqg9y zeZooiu6u`@;1gHnkzwpqdjM9YAUgZnx?enovy_zfPJV4qCbK>J=E@9gRwA*(yrMp# z9;B7+X+vO^y(-N|3Y|K{)|OpgB-V>~^TCJXODUvJ!%+Lf zp&g|hyFOm__n{qzbS_{{i5IOA%}+HaZ{(*f(yjZEZY7F29ukCc=&3-lEuG#;g9r%PE4>!`HTilPl4r@!ujHE(wHh?DWE}4Yq)y2X- zX(Ie`Ty{{75+n)bLFv#ITh+GVfq@Kagx}oh28cb?!GkFD4>~pOcsiC@P`Om+i&A?`a`N~-KR;4hA-PMP60g|hQ zNx!io-43ah7ICI8cUYG-$s3Zar*`Y)&hVH$4>?Sav^;1Vx_$1sKpPiO)-CUV4H{Wh zM8DF65Esgyh3y*K6{*HWIAiTbwiN1in}^lnq7m`p=Yq}6Z8HVSY#et_qimB}r~jgn zxBO?fJ&i6;dl~ik6Sn1Al8GYqnVKFF!g8t^UsAQS&)R$YXI|ri?2_c?)l+9u)VEl3 zSpAboFSv{hq#SX<+M`5u+*AHRm;5hdL%j`^8{xz8c?r%ROx_-ZQ;Ss0N^x(keK8TO z(pvY9JW)-{3Q>#wHD870ocW!95GiQ$+*%hx?Myj?4-KglDvnO_f5|dm&mT zR`f%4atBZ@>u;dx6U^?Vn=!0kxaH5T9(usyl%p-^6~GP}c;d#(04q)?V1>ZGe|3bR z4mK;8mC!{4NPHc+Xs_a)@Q(b)4A?CFk6rZt{)8K0i8g>QX<_FMDE>w+wPgvEam9EU zL2Y@L3EL-AZoTXb*%SLB@t?0L{`+OeAP&DL+JM^gl)1ZYJFNzAlo7K;ju|4#5$g*a z1Uhx;X+XpY%{$k0bpp)m7L6cEtQE&5{Ox{L4u=EfYPUhb`#n((*qD0m_OgMToK%zQ z_e^MVMv&wPwacDCg$TkDQUIiY!fW*@!8}eVfGM(e`X5r2lp@vLE7mHLbc1~2wG$_a z#W|e3?+K;(Fq5WW@HuX96nQyeJxvv|87kLUzbUeOnKjO9(BIh$9F1&?XoXI*WVM>r z^~S=ldnZSHHd(r4?3aTXO(-DM>5_+MSIPM47Fc5RrS(y$z_|%k-|Rc-=3G1rr;hJs>gHr@}Xu(g-+z@X|ScgX)Bz~;cWC7sgsoVc1d1TTjmYj zo}YqGm!T+x`5)$un?4EJ_wg2kZY6jFMH$zTwNr$(O5us{sJ#o>*!yw}kGmZyJH48} zN~fc1j`b%Y=R{j!=kydhVMimMMfag5aedU9%*GQkGH-KT<$A#bEdP9U|s z9bo=W3huC;{AG`3&pk^@hk|6Exd<+BsUG>tp>vWi8hDG7?0gO5Cfa=TV1(Yt7p95< zbmHopc-@gNRgVXi;UYPi8&zlYLc(NZ9;P&2v4YaO?z3Q(h9lb>aS{h+@EdhZaySq@ zp16~Sp(sxr>J#q5TTLjz9Sp@~*t;1JIPX5V=W}B_#ugx)j+=bf zyeP!(--ErSs@(AMD;&DL@HfP>pQ0q!1}&2qx5d_geNEv7=X%62%5nX+N65QX=lG@c zFyt3)IyYH}k1of}THArZGB7im)Opa&_s+-4I9<>GkJK*J_5U;)|GKOG Xd)7?{!l3LmsUU=%%Y|n){+h8gc(N}K|pr|q@zf0 zQUfFq)By}t=_T~g34u^TAdvHH(D}XJIp_V>ch>sebIu>HYt2xS?ERGcx$o<~u50t` zmYychfs+R~I5>EaH-Eds!LiqugM;hdkNd!HEcbL+fiL^+Yis@nzJht zQ%?>K!BF@=&ZvncI}VQ19LV3U-t|qKAM|^jXqP0-a`SPRIgB{{?DyI;)=w)!w13(E z^iPpz6(5>%ez=7a^c_w+EcCd9d;EES*x3j5_fFlo{o7A+7yrfef&WKN)3-m^ zHvRg;55K<;{pr{CCT1G+R=L^`nq9cdnDVp?@-tRrEa#%G7tH3k4SQ+q-x=M1<^NXp z%2f|?bWJ4(EGS(dWeqKGg(Tygx^gfn@~&p%G2NAO1^6K=b90saf2nca@a}QU zY`S6BO=#~pD^b-tKX% zmB0A%WJ{APZZIZYJ9aYK*a{gG6m%ovWOR{D!z7pR`jxdlhm_|hF1V-+W3r=`B}HOd}OEk8e3=|-B{ z4Bn*1*4Nh)sIG2JhQ^j%Gvj&YI4O9*CKA_rY!czShVWKH^3M^5R z{D4b`{lX_+4U0q^t!A@)V5&))m}sD{CdU}YU~)Hm@=UQR3l(R5$nKg_Rnu=1{b#e4 z7AnT?7#MVXH5eM}VSwelEHCfvceN@r*&(+_;B>ucs@pk89Qv8SkQqE0#WRl* zZ^*gyzE2ETsEoUK@7I$jPZonSd%?W?0-u%dJt6<;H>~vr4JrKE$0rBF<=8VR+u}#W z^qS!%UqBJ1D=82;fL4u!-dqcvd}W|Vf`gNa8&)qXD>KD=yT)8Fg~Fw(&he_P+_DOw zmIYFsQB8TKCHZjVD-a?(skrURWqauv!Ivl>f@~99 z%Sj-WC-4T2aMiWBXva#mFsD*dK<0^Ajmw9KXYpwo({msTOU&wHHVk5FN8`S}xvZkSdcAl}q&k1I^~(1RCX;yhJcRYpSdayGCdSQU3)IfSCWTAsYVbj%E~FXuHz-Xd8W0AD5~@7l!|agkXTP*| zjaRMI)T_TEsV(zcz*_jnLH>Xs~h2D@fWK)!RIdkO|+_wmpD zNC;d)^t^F_iyY$vxA28Xg&(l#_HD_Qr&7H89r@M#AK|w;J3A>9tiIHO%I3#|(v+eG zA!oVFOsiq-0QJrJk`jP9a4Llb1yXz#53k0q{>P~~4H5j12Z$ATvp1VDI70fmVXjAK zclYt(K(EOj; zQ%Nz%mbkSx_h{j-pU+mYns3dtosVAN-QWsX+;ePsW3G^of%FF#ist013Vzn-M%?lM z;Sg(xX?}glvfBb2cq_1D2oiuFcLJ}yADz>el$5NiOdscQO9VNr9X%Km6LZ0`>M{&+ zK=xVgwTYSl_07pJZRNZX3}Z~&vd<5$214|0HO}eeo-wz;aRDVTixO{Ye;~67rRVDE z3bHm4AP;enY#r9X74BdBnk)%wTw!i@Hfd$1L)M`+5x$9Ycb<5S6uRP^F@PQ3WcLQJ zqqbo4O)DPWJAT3Bi__1IPapbrX5Hpje)J%>!KB1q_tH5bB@f%o^TrD22JcvZlK&yS zYIC)EMRouHX;Z=pONX^#3|s!*%D(7rLDQM-RN^8@DC>0(3RA5(1aMBHvIEFs68P;% zm4)7kL{OW`ss_JWRS5cxM=11@arf)O0%x>Qjm36NjRhsyQ3Ed*eANYBErVjtARMPv zj7P?)_@Dva5}t^6EU*XbMpkMx zKYfT2V~$2bIw|Va6`8b9^_4dlEGjN~PPMjx+#iqdn@NwQ)0?El95L*{u3TfjhV
^7ZMW*xZbZKH-{tr0sNvEzuVL7ToZIpd(@!SP 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 EKbV%F2mk;8 literal 37227 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
+ bed_genomecov() +
+
Calculate coverage across a genome
+
+ bed_merge()
Merge overlapping intervals.
diff --git a/dev/search.json b/dev/search.json index 7cd9cfd7..762fad4b 100644 --- a/dev/search.json +++ b/dev/search.json @@ -1 +1 @@ -[{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"our-pledge","dir":"","previous_headings":"","what":"Our Pledge","title":"Contributor Covenant Code of Conduct","text":"members, contributors, leaders pledge make participation community harassment-free experience everyone, regardless age, body size, visible invisible disability, ethnicity, sex characteristics, gender identity expression, level experience, education, socio-economic status, nationality, personal appearance, race, religion, sexual identity orientation. pledge act interact ways contribute open, welcoming, diverse, inclusive, healthy community.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"our-standards","dir":"","previous_headings":"","what":"Our Standards","title":"Contributor Covenant Code of Conduct","text":"Examples behavior contributes positive environment community include: Demonstrating empathy kindness toward people respectful differing opinions, viewpoints, experiences Giving gracefully accepting constructive feedback Accepting responsibility apologizing affected mistakes, learning experience Focusing best just us individuals, overall community Examples unacceptable behavior include: use sexualized language imagery, sexual attention advances kind Trolling, insulting derogatory comments, personal political attacks Public private harassment Publishing others’ private information, physical email address, without explicit permission conduct reasonably considered inappropriate professional setting","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"enforcement-responsibilities","dir":"","previous_headings":"","what":"Enforcement Responsibilities","title":"Contributor Covenant Code of Conduct","text":"Community leaders responsible clarifying enforcing standards acceptable behavior take appropriate fair corrective action response behavior deem inappropriate, threatening, offensive, harmful. Community leaders right responsibility remove, edit, reject comments, commits, code, wiki edits, issues, contributions aligned Code Conduct, communicate reasons moderation decisions appropriate.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"scope","dir":"","previous_headings":"","what":"Scope","title":"Contributor Covenant Code of Conduct","text":"Code Conduct applies within community spaces, also applies individual officially representing community public spaces. Examples representing community include using official e-mail address, posting via official social media account, acting appointed representative online offline event.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"enforcement","dir":"","previous_headings":"","what":"Enforcement","title":"Contributor Covenant Code of Conduct","text":"Instances abusive, harassing, otherwise unacceptable behavior may reported community leaders responsible enforcement [INSERT CONTACT METHOD]. complaints reviewed investigated promptly fairly. community leaders obligated respect privacy security reporter incident.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"enforcement-guidelines","dir":"","previous_headings":"","what":"Enforcement Guidelines","title":"Contributor Covenant Code of Conduct","text":"Community leaders follow Community Impact Guidelines determining consequences action deem violation Code Conduct:","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"id_1-correction","dir":"","previous_headings":"Enforcement Guidelines","what":"1. Correction","title":"Contributor Covenant Code of Conduct","text":"Community Impact: Use inappropriate language behavior deemed unprofessional unwelcome community. Consequence: private, written warning community leaders, providing clarity around nature violation explanation behavior inappropriate. public apology may requested.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"id_2-warning","dir":"","previous_headings":"Enforcement Guidelines","what":"2. Warning","title":"Contributor Covenant Code of Conduct","text":"Community Impact: violation single incident series actions. Consequence: warning consequences continued behavior. interaction people involved, including unsolicited interaction enforcing Code Conduct, specified period time. includes avoiding interactions community spaces well external channels like social media. Violating terms may lead temporary permanent ban.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"id_3-temporary-ban","dir":"","previous_headings":"Enforcement Guidelines","what":"3. Temporary Ban","title":"Contributor Covenant Code of Conduct","text":"Community Impact: serious violation community standards, including sustained inappropriate behavior. Consequence: temporary ban sort interaction public communication community specified period time. public private interaction people involved, including unsolicited interaction enforcing Code Conduct, allowed period. Violating terms may lead permanent ban.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"id_4-permanent-ban","dir":"","previous_headings":"Enforcement Guidelines","what":"4. Permanent Ban","title":"Contributor Covenant Code of Conduct","text":"Community Impact: Demonstrating pattern violation community standards, including sustained inappropriate behavior, harassment individual, aggression toward disparagement classes individuals. Consequence: permanent ban sort public interaction within community.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"attribution","dir":"","previous_headings":"","what":"Attribution","title":"Contributor Covenant Code of Conduct","text":"Code Conduct adapted Contributor Covenant, version 2.0, available https://www.contributor-covenant.org/version/2/0/ code_of_conduct.html. Community Impact Guidelines inspired Mozilla’s code conduct enforcement ladder. answers common questions code conduct, see FAQ https://www.contributor-covenant.org/faq. Translations available https:// www.contributor-covenant.org/translations.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CONTRIBUTING.html","id":null,"dir":"","previous_headings":"","what":"Contributing to valr","title":"Contributing to valr","text":"outlines propose change valr. detailed info contributing , tidyverse packages, please see development contributing guide.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CONTRIBUTING.html","id":"fixing-typos","dir":"","previous_headings":"","what":"Fixing typos","title":"Contributing to valr","text":"can fix typos, spelling mistakes, grammatical errors documentation directly using GitHub web interface, long changes made source file. generally means ’ll need edit roxygen2 comments .R, .Rd file. can find .R file generates .Rd reading comment first line.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CONTRIBUTING.html","id":"bigger-changes","dir":"","previous_headings":"","what":"Bigger changes","title":"Contributing to valr","text":"want make bigger change, ’s good idea first file issue make sure someone team agrees ’s needed. ’ve found bug, please file issue illustrates bug minimal reprex (also help write unit test, needed).","code":""},{"path":"https://rnabioco.github.io/valr/dev/CONTRIBUTING.html","id":"pull-request-process","dir":"","previous_headings":"Bigger changes","what":"Pull request process","title":"Contributing to valr","text":"Fork package clone onto computer. haven’t done , recommend using usethis::create_from_github(\"rnabioco/valr\", fork = TRUE). Install development dependences devtools::install_dev_deps(), make sure package passes R CMD check running devtools::check(). R CMD check doesn’t pass cleanly, ’s good idea ask help continuing. Create Git branch pull request (PR). recommend using usethis::pr_init(\"brief-description--change\"). Make changes, commit git, create PR running usethis::pr_push(), following prompts browser. title PR briefly describe change. body PR contain Fixes #issue-number. user-facing changes, add bullet top NEWS.md (.e. just first header). Follow style described https://style.tidyverse.org/news.html.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CONTRIBUTING.html","id":"code-style","dir":"","previous_headings":"Bigger changes","what":"Code style","title":"Contributing to valr","text":"New code follow tidyverse style guide. can use styler package apply styles, please don’t restyle code nothing PR. use roxygen2, Markdown syntax, documentation. use testthat unit tests. Contributions test cases included easier accept.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CONTRIBUTING.html","id":"code-of-conduct","dir":"","previous_headings":"","what":"Code of Conduct","title":"Contributing to valr","text":"Please note valr project released Contributor Code Conduct. contributing project agree abide terms.","code":""},{"path":"https://rnabioco.github.io/valr/dev/LICENSE.html","id":null,"dir":"","previous_headings":"","what":"MIT License","title":"MIT License","text":"Copyright (c) 2016-2018 Jay R Hesselberth Kent Riemondy Permission hereby granted, free charge, person obtaining copy software associated documentation files (“Software”), deal Software without restriction, including without limitation rights use, copy, modify, merge, publish, distribute, sublicense, /sell copies Software, permit persons Software furnished , subject following conditions: copyright notice permission notice shall included copies substantial portions Software. SOFTWARE PROVIDED “”, WITHOUT WARRANTY KIND, EXPRESS IMPLIED, INCLUDING LIMITED WARRANTIES MERCHANTABILITY, FITNESS PARTICULAR PURPOSE NONINFRINGEMENT. EVENT SHALL AUTHORS COPYRIGHT HOLDERS LIABLE CLAIM, DAMAGES LIABILITY, WHETHER ACTION CONTRACT, TORT OTHERWISE, ARISING , CONNECTION SOFTWARE USE DEALINGS SOFTWARE.","code":""},{"path":"https://rnabioco.github.io/valr/dev/articles/interval-stats.html","id":"overview","dir":"Articles","previous_headings":"","what":"Overview","title":"Interval statistics","text":"valr includes several functions exploring statistical relationships sets intervals. Calculate significance overlaps sets intervals bed_fisher() bed_projection(). Quantify relative absolute distances sets intervals bed_reldist() bed_absdist(). Quantify extent overlap sets intervals bed_jaccard(). vignette explore relationship transcription start sites repetitive elements human genome.","code":"library(valr) library(dplyr) library(ggplot2) library(cowplot) library(tidyr) # load repeats and genes. Data in the valr package is restricted to chr22; the entire # files can be downloaded from UCSC. rpts <- read_bed(valr_example(\"hg19.rmsk.chr22.bed.gz\")) genes <- read_bed12(valr_example(\"hg19.refGene.chr22.bed.gz\")) # load chrom sizes genome <- read_genome(valr_example(\"hg19.chrom.sizes.gz\")) # create 1 bp intervals representing transcription start sites tss <- create_tss(genes) tss #> # A tibble: 1,267 × 6 #> chrom start end name score strand #> #> 1 chr22 16193008 16193009 NR_122113 0 - #> 2 chr22 16157078 16157079 NR_133911 0 + #> 3 chr22 16162065 16162066 NR_073459 0 + #> 4 chr22 16162065 16162066 NR_073460 0 + #> 5 chr22 16231288 16231289 NR_132385 0 - #> 6 chr22 16287936 16287937 NM_001136213 0 - #> 7 chr22 16274608 16274609 NR_046571 0 + #> 8 chr22 16449803 16449804 NM_001005239 0 - #> 9 chr22 17073699 17073700 NM_014406 0 - #> 10 chr22 17082800 17082801 NR_001591 0 + #> # ℹ 1,257 more rows"},{"path":"https://rnabioco.github.io/valr/dev/articles/interval-stats.html","id":"distance-metrics","dir":"Articles","previous_headings":"","what":"Distance metrics","title":"Interval statistics","text":"First define function takes x y intervals computes distance statistics (using bed_reldist() bed_absdist()) specified groups. value statistic assigned .value column. use distance_stats() function apply bed_absdist() function group data. done set shuffled group data. bed_shuffle() used shuffle coordinates repeats within chromosome (.e., coordinates change, chromosome stays .) Now can bind observed shuffled data together, tidying put data format appropriate statistical test. involves: unnest()ing data frames creating groups repeat (name), stat (reldist absdist) type (obs shf) adding unique surrogate row numbers group using tidyr::pivot_wider() create two new obs shuf columns removing rows NA values. Now data formatted, can use non-parametric ks.test() determine whether significant differences observed shuffled data group. broom::tidy() used reformat results test tibble, results test pivoted type column test type. Histgrams different stats help visualize distribution p.values. can also assess false discovery rates (q.values) using p.adjust(). Finally can visualize results using stat_ecdf().","code":"distance_stats <- function(x, y, genome, group_var, type = NA) { group_by(x, !!rlang::sym(group_var)) |> do( reldist = bed_reldist(., y, detail = TRUE) |> select(.value = .reldist), absdist = bed_absdist(., y, genome) |> select(.value = .absdist) ) |> tidyr::pivot_longer( cols = -name, names_to = \"stat\", values_to = \"value\" ) |> mutate(type = type) } obs_stats <- distance_stats(rpts, tss, genome, \"name\", \"obs\") obs_stats #> # A tibble: 2,106 × 4 #> name stat value type #> #> 1 (A)n reldist obs #> 2 (A)n absdist obs #> 3 (AAAAACA)n reldist obs #> 4 (AAAAACA)n absdist obs #> 5 (AAAAC)n reldist obs #> 6 (AAAAC)n absdist obs #> 7 (AAAAG)n reldist obs #> 8 (AAAAG)n absdist obs #> 9 (AAAAT)n reldist obs #> 10 (AAAAT)n absdist obs #> # ℹ 2,096 more rows shfs <- bed_shuffle(rpts, genome, within = TRUE) shf_stats <- distance_stats(shfs, tss, genome, \"name\", \"shuf\") res <- bind_rows(obs_stats, shf_stats) |> tidyr::unnest(value) |> group_by(name, stat, type) |> mutate(.id = row_number()) |> tidyr::pivot_wider( names_from = \"type\", values_from = \".value\" ) |> na.omit() res #> # A tibble: 16,761 × 5 #> # Groups: name, stat [1,929] #> name stat .id obs shuf #> #> 1 (A)n reldist 1 0.363 0.458 #> 2 (A)n reldist 2 0.429 0.496 #> 3 (A)n reldist 3 0.246 0.179 #> 4 (A)n reldist 4 0.478 0.244 #> 5 (A)n reldist 5 0.260 0.353 #> 6 (A)n reldist 6 0.286 0.0688 #> 7 (A)n reldist 7 0.498 0.354 #> 8 (A)n reldist 8 0.237 0.345 #> 9 (A)n reldist 9 0.314 0.222 #> 10 (A)n reldist 10 0.149 0.186 #> # ℹ 16,751 more rows library(broom) pvals <- res |> do( twosided = tidy(ks.test(.$obs, .$shuf)), less = tidy(ks.test(.$obs, .$shuf, alternative = \"less\")), greater = tidy(ks.test(.$obs, .$shuf, alternative = \"greater\")) ) |> tidyr::pivot_longer(cols = -c(name, stat), names_to = \"alt\", values_to = \"type\") |> unnest(type) |> select(name:p.value) |> arrange(p.value) ggplot(pvals, aes(p.value)) + geom_histogram(binwidth = 0.05) + facet_grid(stat ~ alt) + theme_cowplot() pvals <- group_by(pvals, stat, alt) |> mutate(q.value = p.adjust(p.value)) |> ungroup() |> arrange(q.value) res_gather <- tidyr::pivot_longer(res, cols = -c(name, stat, .id), names_to = \"type\", values_to = \"value\" ) signif <- head(pvals, 5) res_signif <- signif |> left_join(res_gather, by = c(\"name\", \"stat\")) #> Warning in left_join(signif, res_gather, by = c(\"name\", \"stat\")): Detected an unexpected many-to-many relationship between `x` and `y`. #> ℹ Row 1 of `x` matches multiple rows in `y`. #> ℹ Row 9223 of `y` matches multiple rows in `x`. #> ℹ If a many-to-many relationship is expected, set `relationship = #> \"many-to-many\"` to silence this warning. ggplot(res_signif, aes(x = value, color = type)) + stat_ecdf() + facet_grid(stat ~ name) + theme_cowplot() + scale_x_log10() + scale_color_brewer(palette = \"Set1\")"},{"path":"https://rnabioco.github.io/valr/dev/articles/interval-stats.html","id":"projection-test","dir":"Articles","previous_headings":"","what":"Projection test","title":"Interval statistics","text":"bed_projection() statistical approach assess relationship two intervals based binomial distribution. , examine distribution repetitive elements within promoters coding non-coding genes. First ’ll extract 5 kb regions upstream transcription start sites represent promoter regions coding non-coding genes. Next ’ll apply bed_projection() test repeat class coding non-coding regions. projection test two-tailed statistical test. significant p-value indicates either enrichment depletion query intervals compared reference interval sets. value lower_tail = TRUE column indicates query intervals depleted, whereas lower_tail = FALSE indicates query intervals enriched.","code":"# create intervals 5kb upstream of tss representing promoters promoters <- bed_flank(genes, genome, left = 5000, strand = TRUE) |> mutate(name = ifelse(grepl(\"NR_\", name), \"non-coding\", \"coding\")) |> select(chrom:strand) # select coding and non-coding promoters promoters_coding <- filter(promoters, name == \"coding\") promoters_ncoding <- filter(promoters, name == \"non-coding\") promoters_coding #> # A tibble: 973 × 6 #> chrom start end name score strand #> #> 1 chr22 16287937 16292937 coding 0 - #> 2 chr22 16449804 16454804 coding 0 - #> 3 chr22 17073700 17078700 coding 0 - #> 4 chr22 17302589 17307589 coding 0 - #> 5 chr22 17302589 17307589 coding 0 - #> 6 chr22 17489112 17494112 coding 0 - #> 7 chr22 17560848 17565848 coding 0 + #> 8 chr22 17560848 17565848 coding 0 + #> 9 chr22 17602213 17607213 coding 0 - #> 10 chr22 17602257 17607257 coding 0 - #> # ℹ 963 more rows promoters_ncoding #> # A tibble: 294 × 6 #> chrom start end name score strand #> #> 1 chr22 16152078 16157078 non-coding 0 + #> 2 chr22 16157065 16162065 non-coding 0 + #> 3 chr22 16157065 16162065 non-coding 0 + #> 4 chr22 16193009 16198009 non-coding 0 - #> 5 chr22 16231289 16236289 non-coding 0 - #> 6 chr22 16269608 16274608 non-coding 0 + #> 7 chr22 17077800 17082800 non-coding 0 + #> 8 chr22 17156430 17161430 non-coding 0 - #> 9 chr22 17229328 17234328 non-coding 0 - #> 10 chr22 17303363 17308363 non-coding 0 + #> # ℹ 284 more rows # function to apply bed_projection to groups projection_stats <- function(x, y, genome, group_var, type = NA) { group_by(x, !!rlang::sym(group_var)) |> do( n_repeats = nrow(.), projection = bed_projection(., y, genome) ) |> mutate(type = type) } pvals_coding <- projection_stats(rpts, promoters_coding, genome, \"name\", \"coding\") pvals_ncoding <- projection_stats(rpts, promoters_ncoding, genome, \"name\", \"non_coding\") pvals <- bind_rows(pvals_ncoding, pvals_coding) |> ungroup() |> tidyr::unnest(cols = c(n_repeats, projection)) |> select(-chrom) # filter for repeat classes with at least 10 intervals pvals <- filter( pvals, n_repeats > 10, obs_exp_ratio != 0 ) # adjust pvalues pvals <- mutate(pvals, q.value = p.adjust(p.value)) pvals #> # A tibble: 179 × 7 #> name n_repeats p.value obs_exp_ratio lower_tail type q.value #> #> 1 (A)n 28 0.00353 4.72 FALSE non_coding 0.558 #> 2 (AT)n 48 0.298 0.917 FALSE non_coding 1 #> 3 (CA)n 31 0.156 1.42 FALSE non_coding 1 #> 4 (GT)n 42 0.247 1.05 FALSE non_coding 1 #> 5 (T)n 61 0.405 0.721 FALSE non_coding 1 #> 6 (TG)n 40 0.0622 2.20 FALSE non_coding 1 #> 7 A-rich 54 0.348 0.815 FALSE non_coding 1 #> 8 Alu 15 0.0446 2.93 FALSE non_coding 1 #> 9 AluJb 271 0.0225 1.79 FALSE non_coding 1 #> 10 AluJo 208 0.0216 1.90 FALSE non_coding 1 #> # ℹ 169 more rows library(DT) # find and show top 5 most significant repeats signif_tests <- pvals |> arrange(q.value) |> group_by(type) |> top_n(-5, q.value) |> arrange(type) DT::datatable(signif_tests)"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"familiar-tools-natively-in-r","dir":"Articles","previous_headings":"","what":"Familiar tools, natively in R","title":"valr overview","text":"functions valr similar names BEDtools counterparts, familiar users coming BEDtools suite. Similar pybedtools, valr terse syntax:","code":"library(valr) library(dplyr) snps <- read_bed(valr_example(\"hg19.snps147.chr22.bed.gz\")) genes <- read_bed(valr_example(\"genes.hg19.chr22.bed.gz\")) # find snps in intergenic regions intergenic <- bed_subtract(snps, genes) # distance from intergenic snps to nearest gene nearby <- bed_closest(intergenic, genes) nearby |> select(starts_with(\"name\"), .overlap, .dist) |> filter(abs(.dist) < 1000) #> # A tibble: 285 × 4 #> name.x name.y .overlap .dist #> #> 1 rs2261631 P704P 0 -268 #> 2 rs570770556 POTEH 0 -913 #> 3 rs538163832 POTEH 0 -953 #> 4 rs9606135 TPTEP1 0 -422 #> 5 rs11912392 ANKRD62P1-PARP4P3 0 105 #> 6 rs8136454 BC038197 0 356 #> 7 rs5992556 XKR3 0 -456 #> 8 rs114101676 GAB4 0 474 #> 9 rs62236167 CECR7 0 262 #> 10 rs5747023 CECR1 0 -387 #> # ℹ 275 more rows"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"input-data","dir":"Articles","previous_headings":"","what":"Input data","title":"valr overview","text":"valr assigns common column names facilitate comparisons tbls. tbls chrom, start, end columns, tbls multi-column formats additional pre-determined column names. See read_bed() documentation details. valr can also operate BED-like data.frames already constructed R, provided columns named chrom, start end present. New tbls can also constructed either tibbles base R data.frames.","code":"bed_file <- valr_example(\"3fields.bed.gz\") read_bed(bed_file) # accepts filepaths or URLs #> # A tibble: 10 × 3 #> chrom start end #> #> 1 chr1 11873 14409 #> 2 chr1 14361 19759 #> 3 chr1 14406 29370 #> 4 chr1 34610 36081 #> 5 chr1 69090 70008 #> 6 chr1 134772 140566 #> 7 chr1 321083 321115 #> 8 chr1 321145 321207 #> 9 chr1 322036 326938 #> 10 chr1 327545 328439 bed <- tribble( ~chrom, ~start, ~end, \"chr1\", 1657492, 2657492, \"chr2\", 2501324, 3094650 ) bed #> # A tibble: 2 × 3 #> chrom start end #> #> 1 chr1 1657492 2657492 #> 2 chr2 2501324 3094650"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"interval-coordinates","dir":"Articles","previous_headings":"","what":"Interval coordinates","title":"valr overview","text":"valr adheres BED format specifies start position interval zero based end position one-based. first position chromosome 0. end position chromosome one position passed last base, included interval. example:","code":"# a chromosome 100 basepairs in length chrom <- tribble( ~chrom, ~start, ~end, \"chr1\", 0, 100 ) chrom #> # A tibble: 1 × 3 #> chrom start end #> #> 1 chr1 0 100 # single base-pair intervals bases <- tribble( ~chrom, ~start, ~end, \"chr1\", 0, 1, # first base of chromosome \"chr1\", 1, 2, # second base of chromosome \"chr1\", 99, 100 # last base of chromosome ) bases #> # A tibble: 3 × 3 #> chrom start end #> #> 1 chr1 0 1 #> 2 chr1 1 2 #> 3 chr1 99 100"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"remote-databases","dir":"Articles","previous_headings":"","what":"Remote databases","title":"valr overview","text":"Remote databases can accessed db_ucsc() (access UCSC Browser) db_ensembl() (access Ensembl databases).","code":"# access the `refGene` tbl on the `hg38` assembly. if (require(RMariaDB)) { ucsc <- db_ucsc(\"hg38\") tbl(ucsc, \"refGene\") }"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"visual-documentation","dir":"Articles","previous_headings":"","what":"Visual documentation","title":"valr overview","text":"bed_glyph() tool illustrates results operations valr, similar found BEDtools documentation. glyph shows result intersecting x y intervals bed_intersect(): glyph illustrates bed_merge():","code":"x <- tribble( ~chrom, ~start, ~end, \"chr1\", 25, 50, \"chr1\", 100, 125 ) y <- tribble( ~chrom, ~start, ~end, \"chr1\", 30, 75 ) bed_glyph(bed_intersect(x, y)) x <- tribble( ~chrom, ~start, ~end, \"chr1\", 1, 50, \"chr1\", 10, 75, \"chr1\", 100, 120 ) bed_glyph(bed_merge(x))"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"grouping-data","dir":"Articles","previous_headings":"","what":"Grouping data","title":"valr overview","text":"group_by function dplyr can used perform functions subsets single multiple data_frames. Functions valr leverage grouping enable variety comparisons. example, intervals can grouped strand perform comparisons among intervals strand. Comparisons intervals opposite strands done using flip_strands() function: single set (e.g. bed_merge()) multi set operations respect groupings input intervals.","code":"x <- tribble( ~chrom, ~start, ~end, ~strand, \"chr1\", 1, 100, \"+\", \"chr1\", 50, 150, \"+\", \"chr2\", 100, 200, \"-\" ) y <- tribble( ~chrom, ~start, ~end, ~strand, \"chr1\", 50, 125, \"+\", \"chr1\", 50, 150, \"-\", \"chr2\", 50, 150, \"+\" ) # intersect tbls by strand x <- group_by(x, strand) y <- group_by(y, strand) bed_intersect(x, y) #> # A tibble: 2 × 8 #> chrom start.x end.x strand.x start.y end.y strand.y .overlap #> #> 1 chr1 1 100 + 50 125 + 50 #> 2 chr1 50 150 + 50 125 + 75 x <- group_by(x, strand) y <- flip_strands(y) y <- group_by(y, strand) bed_intersect(x, y) #> # A tibble: 3 × 8 #> chrom start.x end.x strand.x start.y end.y strand.y .overlap #> #> 1 chr1 1 100 + 50 150 + 50 #> 2 chr1 50 150 + 50 150 + 100 #> 3 chr2 100 200 - 50 150 - 50"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"column-specification","dir":"Articles","previous_headings":"","what":"Column specification","title":"valr overview","text":"Columns BEDtools referred position: valr, columns referred name can used multiple name/value expressions summaries.","code":"# calculate the mean of column 6 for intervals in `b` that overlap with `a` bedtools map -a a.bed -b b.bed -c 6 -o mean # calculate the mean and variance for a `value` column bed_map(a, b, .mean = mean(value), .var = var(value)) # report concatenated and max values for merged intervals bed_merge(a, .concat = concat(value), .max = max(value))"},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"meta-analysis","dir":"Articles","previous_headings":"Getting started","what":"Meta-analysis","title":"valr overview","text":"demonstration illustrates use valr tools perform “meta-analysis” signals relative genomic features. analyze distribution histone marks surrounding transcription start sites. First load libraries relevant data. generate 1 bp intervals represent transcription start sites (TSSs). focus + strand genes, - genes easily accommodated filtering using bed_makewindows() reversed window numbers. Now use .win_id group bed_map() calculate sum mapping y signals onto intervals x. data regrouped .win_id summary mean sd values calculated. Finally, summary statistics used construct plot illustrates histone density surrounding TSSs.","code":"# `valr_example()` identifies the path of example files bedfile <- valr_example(\"genes.hg19.chr22.bed.gz\") genomefile <- valr_example(\"hg19.chrom.sizes.gz\") bgfile <- valr_example(\"hela.h3k4.chip.bg.gz\") genes <- read_bed(bedfile) genome <- read_genome(genomefile) y <- read_bedgraph(bgfile) # generate 1 bp TSS intervals, `+` strand only tss <- genes |> filter(strand == \"+\") |> mutate(end = start + 1) # 1000 bp up and downstream region_size <- 1000 # 50 bp windows win_size <- 50 # add slop to the TSS, break into windows and add a group x <- tss |> bed_slop(genome, both = region_size) |> bed_makewindows(win_size) x #> # A tibble: 13,530 × 7 #> chrom start end name score strand .win_id #> #> 1 chr22 16161065 16161115 LINC00516 3 + 1 #> 2 chr22 16161115 16161165 LINC00516 3 + 2 #> 3 chr22 16161165 16161215 LINC00516 3 + 3 #> 4 chr22 16161215 16161265 LINC00516 3 + 4 #> 5 chr22 16161265 16161315 LINC00516 3 + 5 #> 6 chr22 16161315 16161365 LINC00516 3 + 6 #> 7 chr22 16161365 16161415 LINC00516 3 + 7 #> 8 chr22 16161415 16161465 LINC00516 3 + 8 #> 9 chr22 16161465 16161515 LINC00516 3 + 9 #> 10 chr22 16161515 16161565 LINC00516 3 + 10 #> # ℹ 13,520 more rows # map signals to TSS regions and calculate summary statistics. res <- bed_map(x, y, win_sum = sum(value, na.rm = TRUE)) |> group_by(.win_id) |> summarize( win_mean = mean(win_sum, na.rm = TRUE), win_sd = sd(win_sum, na.rm = TRUE) ) res #> # A tibble: 41 × 3 #> .win_id win_mean win_sd #> #> 1 1 101. 85.8 #> 2 2 111. 81.1 #> 3 3 123. 99.1 #> 4 4 116. 96.3 #> 5 5 116. 102. #> 6 6 125. 95.1 #> 7 7 123. 94.4 #> 8 8 128. 91.5 #> 9 9 130. 95.7 #> 10 10 130. 88.8 #> # ℹ 31 more rows x_labels <- seq( -region_size, region_size, by = win_size * 5 ) x_breaks <- seq(1, 41, by = 5) sd_limits <- aes( ymax = win_mean + win_sd, ymin = win_mean - win_sd ) ggplot( res, aes( x = .win_id, y = win_mean ) ) + geom_point() + geom_pointrange(sd_limits) + scale_x_continuous( labels = x_labels, breaks = x_breaks ) + labs( x = \"Position (bp from TSS)\", y = \"Signal\", title = \"Human H3K4me3 signal near transcription start sites\" ) + theme_classic()"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"related-work","dir":"Articles","previous_headings":"","what":"Related work","title":"valr overview","text":"Command-line tools BEDtools bedops. Python library pybedtools wraps BEDtools. R packages GenomicRanges, bedr, IRanges GenometriCorr provide similar capability different philosophy.","code":""},{"path":"https://rnabioco.github.io/valr/dev/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Jay Hesselberth. Author. Kent Riemondy. Author, maintainer. . Funder, copyright holder.","code":""},{"path":"https://rnabioco.github.io/valr/dev/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Riemondy KA, Sheridan RM, Gillen , Yu Y, Bennett CG, Hesselberth JR (2017). “valr: Reproducible Genome Interval Arithmetic R.” F1000Research. doi:10.12688/f1000research.11997.1.","code":"@Article{, title = {valr: Reproducible Genome Interval Arithmetic in R}, year = {2017}, author = {Kent A. Riemondy and Ryan M. Sheridan and Austin Gillen and Yinni Yu and Christopher G. Bennett and Jay R. Hesselberth}, journal = {F1000Research}, doi = {10.12688/f1000research.11997.1}, }"},{"path":"https://rnabioco.github.io/valr/dev/index.html","id":"valr-","dir":"","previous_headings":"","what":"Genome Interval Arithmetic","title":"Genome Interval Arithmetic","text":"valr provides tools read manipulate genome intervals signals, similar BEDtools suite.","code":""},{"path":"https://rnabioco.github.io/valr/dev/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"Genome Interval Arithmetic","text":"latest stable version can installed CRAN: latest development version can installed github:","code":"install.packages('valr') # install.packages(\"devtools\") devtools::install_github('rnabioco/valr')"},{"path":"https://rnabioco.github.io/valr/dev/index.html","id":"valr-example","dir":"","previous_headings":"","what":"valr Example","title":"Genome Interval Arithmetic","text":"Functions valr similar names BEDtools counterparts, familiar users coming BEDtools suite. Unlike tools wrap BEDtools write temporary files disk, valr tools run natively memory. Similar pybedtools, valr terse syntax:","code":"library(valr) library(dplyr) snps <- read_bed(valr_example(\"hg19.snps147.chr22.bed.gz\")) genes <- read_bed(valr_example(\"genes.hg19.chr22.bed.gz\")) # find snps in intergenic regions intergenic <- bed_subtract(snps, genes) # find distance from intergenic snps to nearest gene nearby <- bed_closest(intergenic, genes) nearby |> select(starts_with(\"name\"), .overlap, .dist) |> filter(abs(.dist) < 5000) #> # A tibble: 1,047 × 4 #> name.x name.y .overlap .dist #> #> 1 rs530458610 P704P 0 2579 #> 2 rs2261631 P704P 0 -268 #> 3 rs570770556 POTEH 0 -913 #> 4 rs538163832 POTEH 0 -953 #> 5 rs190224195 POTEH 0 -1399 #> 6 rs2379966 DQ571479 0 4750 #> 7 rs142687051 DQ571479 0 3558 #> 8 rs528403095 DQ571479 0 3309 #> 9 rs555126291 DQ571479 0 2745 #> 10 rs5747567 DQ571479 0 -1778 #> # ℹ 1,037 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed12_to_exons.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert BED12 to individual exons in BED6. — bed12_to_exons","title":"Convert BED12 to individual exons in BED6. — bed12_to_exons","text":"conversion BED6 format, score column contains exon number, respect strand (.e., first exon - strand genes larger start end coordinates).","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed12_to_exons.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert BED12 to individual exons in BED6. — bed12_to_exons","text":"","code":"bed12_to_exons(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed12_to_exons.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert BED12 to individual exons in BED6. — bed12_to_exons","text":"x ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed12_to_exons.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convert BED12 to individual exons in BED6. — bed12_to_exons","text":"","code":"x <- read_bed12(valr_example(\"mm9.refGene.bed.gz\")) bed12_to_exons(x) #> # A tibble: 1,683 × 6 #> chrom start end name score strand #> #> 1 chr1 3204562 3207049 NM_001011874 3 - #> 2 chr1 3411782 3411982 NM_001011874 2 - #> 3 chr1 3660632 3661579 NM_001011874 1 - #> 4 chr1 4280926 4283093 NM_001195662 4 - #> 5 chr1 4341990 4342162 NM_001195662 3 - #> 6 chr1 4342282 4342918 NM_001195662 2 - #> 7 chr1 4399250 4399322 NM_001195662 1 - #> 8 chr1 4847774 4848057 NM_001159750 1 + #> 9 chr1 4847774 4848057 NM_011541 1 + #> 10 chr1 4848408 4848584 NM_001159751 1 + #> # ℹ 1,673 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_absdist.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute absolute distances between intervals. — bed_absdist","title":"Compute absolute distances between intervals. — bed_absdist","text":"Computes absolute distance midpoint x interval midpoints closest y interval.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_absdist.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute absolute distances between intervals. — bed_absdist","text":"","code":"bed_absdist(x, y, genome)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_absdist.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute absolute distances between intervals. — bed_absdist","text":"x ivl_df y ivl_df genome genome_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_absdist.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute absolute distances between intervals. — bed_absdist","text":"ivl_df .absdist .absdist_scaled columns.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_absdist.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Compute absolute distances between intervals. — bed_absdist","text":"Absolute distances scaled inter-reference gap chromosome follows. Q query points R reference points chromosome, scale distance query point closest reference point inter-reference gap chromosome. x interval matching y chromosome, .absdist NA. $$d_i(x,y) = min_k(|q_i - r_k|)\\frac{R}{Length\\ \\ chromosome}$$ absolute scaled distances reported .absdist .absdist_scaled. Interval statistics can used combination dplyr::group_by() dplyr::() calculate statistics subsets data. See vignette('interval-stats') examples.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_absdist.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compute absolute distances between intervals. — bed_absdist","text":"","code":"genome <- read_genome(valr_example(\"hg19.chrom.sizes.gz\")) x <- bed_random(genome, seed = 1010486) y <- bed_random(genome, seed = 9203911) bed_absdist(x, y, genome) #> # A tibble: 1,000,000 × 5 #> chrom start end .absdist .absdist_scaled #> #> 1 chr1 5184 6184 1392 0.448 #> 2 chr1 7663 8663 1087 0.350 #> 3 chr1 9858 10858 1526 0.491 #> 4 chr1 13805 14805 2421 0.779 #> 5 chr1 14081 15081 2697 0.868 #> 6 chr1 16398 17398 1700 0.547 #> 7 chr1 17486 18486 612 0.197 #> 8 chr1 22063 23063 466 0.150 #> 9 chr1 22494 23494 897 0.289 #> 10 chr1 29351 30351 1143 0.368 #> # ℹ 999,990 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_closest.html","id":null,"dir":"Reference","previous_headings":"","what":"Identify closest intervals. — bed_closest","title":"Identify closest intervals. — bed_closest","text":"Identify closest intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_closest.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Identify closest intervals. — bed_closest","text":"","code":"bed_closest(x, y, overlap = TRUE, suffix = c(\".x\", \".y\"))"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_closest.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Identify closest intervals. — bed_closest","text":"x ivl_df y ivl_df overlap report overlapping intervals suffix colname suffixes output","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_closest.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Identify closest intervals. — bed_closest","text":"ivl_df additional columns: .overlap amount overlap overlapping interval. Non-overlapping adjacent intervals overlap 0. .overlap included output overlap = FALSE. .dist distance closest interval. Negative distances denote upstream intervals. Book-ended intervals distance 1.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_closest.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Identify closest intervals. — bed_closest","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_closest.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Identify closest intervals. — bed_closest","text":"interval x bed_closest() returns overlapping intervals y closest non-intersecting y interval. Setting overlap = FALSE report closest non-intersecting y intervals, ignoring overlapping y intervals.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_closest.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Identify closest intervals. — bed_closest","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 100, 125 ) y <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 25, 50, \"chr1\", 140, 175 ) bed_glyph(bed_closest(x, y)) x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 500, 600, \"chr2\", 5000, 6000 ) y <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 100, 200, \"chr1\", 150, 200, \"chr1\", 550, 580, \"chr2\", 7000, 8500 ) bed_closest(x, y) #> # A tibble: 4 × 7 #> chrom start.x end.x start.y end.y .overlap .dist #> #> 1 chr1 500 600 550 580 30 0 #> 2 chr1 500 600 100 200 0 -301 #> 3 chr1 500 600 150 200 0 -301 #> 4 chr2 5000 6000 7000 8500 0 1001 bed_closest(x, y, overlap = FALSE) #> # A tibble: 3 × 6 #> chrom start.x end.x start.y end.y .dist #> #> 1 chr1 500 600 100 200 -301 #> 2 chr1 500 600 150 200 -301 #> 3 chr2 5000 6000 7000 8500 1001 # Report distance based on strand x <- tibble::tribble( ~chrom, ~start, ~end, ~name, ~score, ~strand, \"chr1\", 10, 20, \"a\", 1, \"-\" ) y <- tibble::tribble( ~chrom, ~start, ~end, ~name, ~score, ~strand, \"chr1\", 8, 9, \"b\", 1, \"+\", \"chr1\", 21, 22, \"b\", 1, \"-\" ) res <- bed_closest(x, y) # convert distance based on strand res$.dist_strand <- ifelse(res$strand.x == \"+\", res$.dist, -(res$.dist)) res #> # A tibble: 2 × 14 #> chrom start.x end.x name.x score.x strand.x start.y end.y name.y score.y #> #> 1 chr1 10 20 a 1 - 21 22 b 1 #> 2 chr1 10 20 a 1 - 8 9 b 1 #> # ℹ 4 more variables: strand.y , .overlap , .dist , #> # .dist_strand # report absolute distances res$.abs_dist <- abs(res$.dist) res #> # A tibble: 2 × 15 #> chrom start.x end.x name.x score.x strand.x start.y end.y name.y score.y #> #> 1 chr1 10 20 a 1 - 21 22 b 1 #> 2 chr1 10 20 a 1 - 8 9 b 1 #> # ℹ 5 more variables: strand.y , .overlap , .dist , #> # .dist_strand , .abs_dist "},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_cluster.html","id":null,"dir":"Reference","previous_headings":"","what":"Cluster neighboring intervals. — bed_cluster","title":"Cluster neighboring intervals. — bed_cluster","text":"output .id column can used downstream grouping operations. Default max_dist = 0 means overlapping book-ended intervals clustered.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_cluster.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Cluster neighboring intervals. — bed_cluster","text":"","code":"bed_cluster(x, max_dist = 0)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_cluster.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Cluster neighboring intervals. — bed_cluster","text":"x ivl_df max_dist maximum distance clustered intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_cluster.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Cluster neighboring intervals. — bed_cluster","text":"ivl_df .id column specifying sets clustered intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_cluster.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Cluster neighboring intervals. — bed_cluster","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_cluster.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Cluster neighboring intervals. — bed_cluster","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 100, 200, \"chr1\", 180, 250, \"chr1\", 250, 500, \"chr1\", 501, 1000, \"chr2\", 1, 100, \"chr2\", 150, 200 ) bed_cluster(x) #> # A tibble: 6 × 4 #> chrom start end .id #> #> 1 chr1 100 200 1 #> 2 chr1 180 250 1 #> 3 chr1 250 500 1 #> 4 chr1 501 1000 2 #> 5 chr2 1 100 3 #> 6 chr2 150 200 4 # glyph illustrating clustering of overlapping and book-ended intervals x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 1, 10, \"chr1\", 5, 20, \"chr1\", 30, 40, \"chr1\", 40, 50, \"chr1\", 80, 90 ) bed_glyph(bed_cluster(x), label = \".id\")"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_complement.html","id":null,"dir":"Reference","previous_headings":"","what":"Identify intervals in a genome not covered by a query. — bed_complement","title":"Identify intervals in a genome not covered by a query. — bed_complement","text":"Identify intervals genome covered query.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_complement.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Identify intervals in a genome not covered by a query. — bed_complement","text":"","code":"bed_complement(x, genome)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_complement.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Identify intervals in a genome not covered by a query. — bed_complement","text":"x ivl_df genome ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_complement.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Identify intervals in a genome not covered by a query. — bed_complement","text":"ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_complement.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Identify intervals in a genome not covered by a query. — bed_complement","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 0, 10, \"chr1\", 75, 100 ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 200 ) bed_glyph(bed_complement(x, genome)) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 500, \"chr2\", 600, \"chr3\", 800 ) x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 100, 300, \"chr1\", 200, 400, \"chr2\", 0, 100, \"chr2\", 200, 400, \"chr3\", 500, 600 ) # intervals not covered by x bed_complement(x, genome) #> # A tibble: 6 × 3 #> chrom start end #> #> 1 chr1 0 100 #> 2 chr1 400 500 #> 3 chr2 100 200 #> 4 chr2 400 600 #> 5 chr3 0 500 #> 6 chr3 600 800"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_coverage.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute coverage of intervals. — bed_coverage","title":"Compute coverage of intervals. — bed_coverage","text":"Compute coverage intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_coverage.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute coverage of intervals. — bed_coverage","text":"","code":"bed_coverage(x, y, ...)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_coverage.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute coverage of intervals. — bed_coverage","text":"x ivl_df y ivl_df ... extra arguments (used)","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_coverage.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute coverage of intervals. — bed_coverage","text":"ivl_df following additional columns: .ints number x intersections .cov per-base coverage x intervals .len total length y intervals covered x intervals .frac .len scaled number y intervals","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_coverage.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Compute coverage of intervals. — bed_coverage","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_coverage.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Compute coverage of intervals. — bed_coverage","text":"Book-ended intervals included coverage calculations.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_coverage.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compute coverage of intervals. — bed_coverage","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, ~strand, \"chr1\", 100, 500, \"+\", \"chr2\", 200, 400, \"+\", \"chr2\", 300, 500, \"-\", \"chr2\", 800, 900, \"-\" ) y <- tibble::tribble( ~chrom, ~start, ~end, ~value, ~strand, \"chr1\", 150, 400, 100, \"+\", \"chr1\", 500, 550, 100, \"+\", \"chr2\", 230, 430, 200, \"-\", \"chr2\", 350, 430, 300, \"-\" ) bed_coverage(x, y) #> # A tibble: 4 × 8 #> chrom start end strand .ints .cov .len .frac #> #> 1 chr1 100 500 + 2 250 400 0.625 #> 2 chr2 200 400 + 2 170 200 0.85 #> 3 chr2 300 500 - 2 130 200 0.65 #> 4 chr2 800 900 - 0 0 100 0"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_fisher.html","id":null,"dir":"Reference","previous_headings":"","what":"Fisher's test to measure overlap between two sets of intervals. — bed_fisher","title":"Fisher's test to measure overlap between two sets of intervals. — bed_fisher","text":"Calculate Fisher's test number intervals shared unique two sets x y intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_fisher.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fisher's test to measure overlap between two sets of intervals. — bed_fisher","text":"","code":"bed_fisher(x, y, genome)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_fisher.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fisher's test to measure overlap between two sets of intervals. — bed_fisher","text":"x ivl_df y ivl_df genome genome_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_fisher.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fisher's test to measure overlap between two sets of intervals. — bed_fisher","text":"ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_fisher.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fisher's test to measure overlap between two sets of intervals. — bed_fisher","text":"Interval statistics can used combination dplyr::group_by() dplyr::() calculate statistics subsets data. See vignette('interval-stats') examples.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_fisher.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fisher's test to measure overlap between two sets of intervals. — bed_fisher","text":"","code":"genome <- read_genome(valr_example(\"hg19.chrom.sizes.gz\")) x <- bed_random(genome, n = 1e4, seed = 1010486) y <- bed_random(genome, n = 1e4, seed = 9203911) bed_fisher(x, y, genome) #> # A tibble: 1 × 6 #> estimate p.value conf.low conf.high method alternative #> #> 1 0.945 0.707 0.722 1.22 Fisher's Exact Test for… two.sided"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_flank.html","id":null,"dir":"Reference","previous_headings":"","what":"Create flanking intervals from input intervals. — bed_flank","title":"Create flanking intervals from input intervals. — bed_flank","text":"Create flanking intervals input intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_flank.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create flanking intervals from input intervals. — bed_flank","text":"","code":"bed_flank( x, genome, both = 0, left = 0, right = 0, fraction = FALSE, strand = FALSE, trim = FALSE, ... )"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_flank.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create flanking intervals from input intervals. — bed_flank","text":"x ivl_df genome genome_df number bases sizes left number bases left side right number bases right side fraction define flanks based fraction interval length strand define left right based strand trim adjust coordinates --bounds intervals ... extra arguments (used)","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_flank.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create flanking intervals from input intervals. — bed_flank","text":"ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_flank.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create flanking intervals from input intervals. — bed_flank","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 25, 50, \"chr1\", 100, 125 ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 130 ) bed_glyph(bed_flank(x, genome, both = 20)) x <- tibble::tribble( ~chrom, ~start, ~end, ~name, ~score, ~strand, \"chr1\", 500, 1000, \".\", \".\", \"+\", \"chr1\", 1000, 1500, \".\", \".\", \"-\" ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 5000 ) bed_flank(x, genome, left = 100) #> # A tibble: 2 × 6 #> chrom start end name score strand #> #> 1 chr1 400 500 . . + #> 2 chr1 900 1000 . . - bed_flank(x, genome, right = 100) #> # A tibble: 2 × 6 #> chrom start end name score strand #> #> 1 chr1 1000 1100 . . + #> 2 chr1 1500 1600 . . - bed_flank(x, genome, both = 100) #> # A tibble: 4 × 6 #> chrom start end name score strand #> #> 1 chr1 400 500 . . + #> 2 chr1 900 1000 . . - #> 3 chr1 1000 1100 . . + #> 4 chr1 1500 1600 . . - bed_flank(x, genome, both = 0.5, fraction = TRUE) #> # A tibble: 4 × 6 #> chrom start end name score strand #> #> 1 chr1 250 500 . . + #> 2 chr1 750 1000 . . - #> 3 chr1 1000 1250 . . + #> 4 chr1 1500 1750 . . -"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_glyph.html","id":null,"dir":"Reference","previous_headings":"","what":"Create example glyphs for valr functions. — bed_glyph","title":"Create example glyphs for valr functions. — bed_glyph","text":"Used illustrate output valr functions small examples.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_glyph.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create example glyphs for valr functions. — bed_glyph","text":"","code":"bed_glyph(expr, label = NULL)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_glyph.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create example glyphs for valr functions. — bed_glyph","text":"expr expression evaluate label column name use label values. present result call.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_glyph.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create example glyphs for valr functions. — bed_glyph","text":"ggplot2::ggplot()","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_glyph.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create example glyphs for valr functions. — bed_glyph","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 25, 50, \"chr1\", 100, 125 ) y <- tibble::tribble( ~chrom, ~start, ~end, ~value, \"chr1\", 30, 75, 50 ) bed_glyph(bed_intersect(x, y)) x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 30, 75, \"chr1\", 50, 90, \"chr1\", 91, 120 ) bed_glyph(bed_merge(x)) bed_glyph(bed_cluster(x), label = \".id\")"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_intersect.html","id":null,"dir":"Reference","previous_headings":"","what":"Identify intersecting intervals. — bed_intersect","title":"Identify intersecting intervals. — bed_intersect","text":"Report intersecting intervals x y tbls. Book-ended intervals .overlap values 0 output.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_intersect.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Identify intersecting intervals. — bed_intersect","text":"","code":"bed_intersect(x, ..., invert = FALSE, suffix = c(\".x\", \".y\"))"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_intersect.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Identify intersecting intervals. — bed_intersect","text":"x ivl_df ... one (e.g. list ) y ivl_df()s invert report x intervals y suffix colname suffixes output","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_intersect.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Identify intersecting intervals. — bed_intersect","text":"ivl_df original columns x y suffixed .x .y, new .overlap column extent overlap intersecting intervals. multiple y tbls supplied, .source contains variable names associated interval. original columns y suffixed .y output. ... contains named inputs (.e = y, b = z list(= y, b = z)), .source contain supplied names (see examples).","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_intersect.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Identify intersecting intervals. — bed_intersect","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_intersect.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Identify intersecting intervals. — bed_intersect","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 25, 50, \"chr1\", 100, 125 ) y <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 30, 75 ) bed_glyph(bed_intersect(x, y)) bed_glyph(bed_intersect(x, y, invert = TRUE)) x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 100, 500, \"chr2\", 200, 400, \"chr2\", 300, 500, \"chr2\", 800, 900 ) y <- tibble::tribble( ~chrom, ~start, ~end, ~value, \"chr1\", 150, 400, 100, \"chr1\", 500, 550, 100, \"chr2\", 230, 430, 200, \"chr2\", 350, 430, 300 ) bed_intersect(x, y) #> # A tibble: 6 × 7 #> chrom start.x end.x start.y end.y value.y .overlap #> #> 1 chr1 100 500 150 400 100 250 #> 2 chr1 100 500 500 550 100 0 #> 3 chr2 200 400 230 430 200 170 #> 4 chr2 200 400 350 430 300 50 #> 5 chr2 300 500 230 430 200 130 #> 6 chr2 300 500 350 430 300 80 bed_intersect(x, y, invert = TRUE) #> # A tibble: 1 × 3 #> chrom start end #> #> 1 chr2 800 900 # start and end of each overlapping interval res <- bed_intersect(x, y) dplyr::mutate(res, start = pmax(start.x, start.y), end = pmin(end.x, end.y) ) #> # A tibble: 6 × 9 #> chrom start.x end.x start.y end.y value.y .overlap start end #> #> 1 chr1 100 500 150 400 100 250 150 400 #> 2 chr1 100 500 500 550 100 0 500 500 #> 3 chr2 200 400 230 430 200 170 230 400 #> 4 chr2 200 400 350 430 300 50 350 400 #> 5 chr2 300 500 230 430 200 130 300 430 #> 6 chr2 300 500 350 430 300 80 350 430 z <- tibble::tribble( ~chrom, ~start, ~end, ~value, \"chr1\", 150, 400, 100, \"chr1\", 500, 550, 100, \"chr2\", 230, 430, 200, \"chr2\", 750, 900, 400 ) bed_intersect(x, y, z) #> # A tibble: 11 × 8 #> chrom start.x end.x start.y end.y value.y .source .overlap #> #> 1 chr1 100 500 150 400 100 y 250 #> 2 chr1 100 500 150 400 100 z 250 #> 3 chr1 100 500 500 550 100 y 0 #> 4 chr1 100 500 500 550 100 z 0 #> 5 chr2 200 400 230 430 200 y 170 #> 6 chr2 200 400 230 430 200 z 170 #> 7 chr2 200 400 350 430 300 y 50 #> 8 chr2 300 500 230 430 200 y 130 #> 9 chr2 300 500 230 430 200 z 130 #> 10 chr2 300 500 350 430 300 y 80 #> 11 chr2 800 900 750 900 400 z 100 bed_intersect(x, exons = y, introns = z) #> # A tibble: 11 × 8 #> chrom start.x end.x start.y end.y value.y .source .overlap #> #> 1 chr1 100 500 150 400 100 exons 250 #> 2 chr1 100 500 150 400 100 introns 250 #> 3 chr1 100 500 500 550 100 exons 0 #> 4 chr1 100 500 500 550 100 introns 0 #> 5 chr2 200 400 230 430 200 exons 170 #> 6 chr2 200 400 230 430 200 introns 170 #> 7 chr2 200 400 350 430 300 exons 50 #> 8 chr2 300 500 230 430 200 exons 130 #> 9 chr2 300 500 230 430 200 introns 130 #> 10 chr2 300 500 350 430 300 exons 80 #> 11 chr2 800 900 750 900 400 introns 100 # a list of tbl_intervals can also be passed bed_intersect(x, list(exons = y, introns = z)) #> # A tibble: 11 × 8 #> chrom start.x end.x start.y end.y value.y .source .overlap #> #> 1 chr1 100 500 150 400 100 exons 250 #> 2 chr1 100 500 150 400 100 introns 250 #> 3 chr1 100 500 500 550 100 exons 0 #> 4 chr1 100 500 500 550 100 introns 0 #> 5 chr2 200 400 230 430 200 exons 170 #> 6 chr2 200 400 230 430 200 introns 170 #> 7 chr2 200 400 350 430 300 exons 50 #> 8 chr2 300 500 230 430 200 exons 130 #> 9 chr2 300 500 230 430 200 introns 130 #> 10 chr2 300 500 350 430 300 exons 80 #> 11 chr2 800 900 750 900 400 introns 100"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_jaccard.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate the Jaccard statistic for two sets of intervals. — bed_jaccard","title":"Calculate the Jaccard statistic for two sets of intervals. — bed_jaccard","text":"Quantifies extent overlap sets intervals terms base-pairs. Groups shared input used calculate statistic subsets data.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_jaccard.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate the Jaccard statistic for two sets of intervals. — bed_jaccard","text":"","code":"bed_jaccard(x, y)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_jaccard.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate the Jaccard statistic for two sets of intervals. — bed_jaccard","text":"x ivl_df y ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_jaccard.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate the Jaccard statistic for two sets of intervals. — bed_jaccard","text":"tibble following columns: len_i length intersection base-pairs len_u length union base-pairs jaccard value jaccard statistic n_int number intersecting intervals x y inputs grouped, return value contain one set values per group.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_jaccard.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculate the Jaccard statistic for two sets of intervals. — bed_jaccard","text":"Jaccard statistic takes values [0,1] measured : $$ J(x,y) = \\frac{\\mid x \\bigcap y \\mid} {\\mid x \\bigcup y \\mid} = \\frac{\\mid x \\bigcap y \\mid} {\\mid x \\mid + \\mid y \\mid - \\mid x \\bigcap y \\mid} $$ Interval statistics can used combination dplyr::group_by() dplyr::() calculate statistics subsets data. See vignette('interval-stats') examples.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_jaccard.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate the Jaccard statistic for two sets of intervals. — bed_jaccard","text":"","code":"genome <- read_genome(valr_example(\"hg19.chrom.sizes.gz\")) x <- bed_random(genome, seed = 1010486) y <- bed_random(genome, seed = 9203911) bed_jaccard(x, y) #> # A tibble: 1 × 4 #> len_i len_u jaccard n #> #> 1 236184699 1708774142 0.160 399981 # calculate jaccard per chromosome bed_jaccard( dplyr::group_by(x, chrom), dplyr::group_by(y, chrom) ) #> # A tibble: 25 × 5 #> chrom len_i len_u jaccard n #> #> 1 chr1 18939046 137345996 0.160 32156 #> 2 chr10 10524360 75209830 0.163 17830 #> 3 chr11 10378246 74655177 0.161 17497 #> 4 chr12 10146255 73725046 0.160 17163 #> 5 chr13 8867024 63737541 0.162 14992 #> 6 chr14 8047103 59033144 0.158 13647 #> 7 chr15 7794057 56514322 0.160 13236 #> 8 chr16 6907575 49874077 0.161 11650 #> 9 chr17 6186446 44917522 0.160 10487 #> 10 chr18 6044900 43248877 0.162 10129 #> # ℹ 15 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_makewindows.html","id":null,"dir":"Reference","previous_headings":"","what":"Divide intervals into new sub-intervals (","title":"Divide intervals into new sub-intervals (","text":"Divide intervals new sub-intervals (\"windows\").","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_makewindows.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Divide intervals into new sub-intervals (","text":"","code":"bed_makewindows(x, win_size = 0, step_size = 0, num_win = 0, reverse = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_makewindows.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Divide intervals into new sub-intervals (","text":"x ivl_df win_size divide intervals fixed-size windows step_size size step next window num_win divide intervals fixed number windows reverse reverse window numbers","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_makewindows.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Divide intervals into new sub-intervals (","text":"ivl_df .win_id column contains numeric identifier window.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_makewindows.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Divide intervals into new sub-intervals (","text":"name .win_id columns can used create new interval names (see 'namenum' example ) subsequent group_by operations (see vignette).","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_makewindows.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Divide intervals into new sub-intervals (","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, ~name, ~score, ~strand, \"chr1\", 100, 200, \"A\", \".\", \"+\" ) bed_glyph(bed_makewindows(x, num_win = 10), label = \".win_id\") # Fixed number of windows bed_makewindows(x, num_win = 10) #> # A tibble: 10 × 7 #> chrom start end name score strand .win_id #> #> 1 chr1 100 110 A . + 1 #> 2 chr1 110 120 A . + 2 #> 3 chr1 120 130 A . + 3 #> 4 chr1 130 140 A . + 4 #> 5 chr1 140 150 A . + 5 #> 6 chr1 150 160 A . + 6 #> 7 chr1 160 170 A . + 7 #> 8 chr1 170 180 A . + 8 #> 9 chr1 180 190 A . + 9 #> 10 chr1 190 200 A . + 10 # Fixed window size bed_makewindows(x, win_size = 10) #> # A tibble: 10 × 7 #> chrom start end name score strand .win_id #> #> 1 chr1 100 110 A . + 1 #> 2 chr1 110 120 A . + 2 #> 3 chr1 120 130 A . + 3 #> 4 chr1 130 140 A . + 4 #> 5 chr1 140 150 A . + 5 #> 6 chr1 150 160 A . + 6 #> 7 chr1 160 170 A . + 7 #> 8 chr1 170 180 A . + 8 #> 9 chr1 180 190 A . + 9 #> 10 chr1 190 200 A . + 10 # Fixed window size with overlaps bed_makewindows(x, win_size = 10, step_size = 5) #> # A tibble: 20 × 7 #> chrom start end name score strand .win_id #> #> 1 chr1 100 110 A . + 1 #> 2 chr1 105 115 A . + 2 #> 3 chr1 110 120 A . + 3 #> 4 chr1 115 125 A . + 4 #> 5 chr1 120 130 A . + 5 #> 6 chr1 125 135 A . + 6 #> 7 chr1 130 140 A . + 7 #> 8 chr1 135 145 A . + 8 #> 9 chr1 140 150 A . + 9 #> 10 chr1 145 155 A . + 10 #> 11 chr1 150 160 A . + 11 #> 12 chr1 155 165 A . + 12 #> 13 chr1 160 170 A . + 13 #> 14 chr1 165 175 A . + 14 #> 15 chr1 170 180 A . + 15 #> 16 chr1 175 185 A . + 16 #> 17 chr1 180 190 A . + 17 #> 18 chr1 185 195 A . + 18 #> 19 chr1 190 200 A . + 19 #> 20 chr1 195 200 A . + 20 # reverse win_id bed_makewindows(x, win_size = 10, reverse = TRUE) #> # A tibble: 10 × 7 #> chrom start end name score strand .win_id #> #> 1 chr1 100 110 A . + 10 #> 2 chr1 110 120 A . + 9 #> 3 chr1 120 130 A . + 8 #> 4 chr1 130 140 A . + 7 #> 5 chr1 140 150 A . + 6 #> 6 chr1 150 160 A . + 5 #> 7 chr1 160 170 A . + 4 #> 8 chr1 170 180 A . + 3 #> 9 chr1 180 190 A . + 2 #> 10 chr1 190 200 A . + 1 # bedtools 'namenum' wins <- bed_makewindows(x, win_size = 10) dplyr::mutate(wins, namenum = stringr::str_c(name, \"_\", .win_id)) #> # A tibble: 10 × 8 #> chrom start end name score strand .win_id namenum #> #> 1 chr1 100 110 A . + 1 A_1 #> 2 chr1 110 120 A . + 2 A_2 #> 3 chr1 120 130 A . + 3 A_3 #> 4 chr1 130 140 A . + 4 A_4 #> 5 chr1 140 150 A . + 5 A_5 #> 6 chr1 150 160 A . + 6 A_6 #> 7 chr1 160 170 A . + 7 A_7 #> 8 chr1 170 180 A . + 8 A_8 #> 9 chr1 180 190 A . + 9 A_9 #> 10 chr1 190 200 A . + 10 A_10"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_map.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate summaries from overlapping intervals. — bed_map","title":"Calculate summaries from overlapping intervals. — bed_map","text":"Apply functions like min() count() intersecting intervals. bed_map() uses bed_intersect() identify intersecting intervals, output columns suffixed .x .y. Expressions refer input columns x y columns must take suffixes account.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_map.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate summaries from overlapping intervals. — bed_map","text":"","code":"bed_map(x, y, ..., min_overlap = 1) concat(.data, sep = \",\") values_unique(.data, sep = \",\") values(.data, sep = \",\")"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_map.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate summaries from overlapping intervals. — bed_map","text":"x ivl_df y ivl_df ... name-value pairs specifying column names expressions apply min_overlap minimum overlap intervals. .data data sep separator character","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_map.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate summaries from overlapping intervals. — bed_map","text":"ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_map.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculate summaries from overlapping intervals. — bed_map","text":"Book-ended intervals can included setting min_overlap = 0. Non-intersecting intervals x included result NA values. input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_map.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate summaries from overlapping intervals. — bed_map","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, 'chr1', 100, 250, 'chr2', 250, 500 ) y <- tibble::tribble( ~chrom, ~start, ~end, ~value, 'chr1', 100, 250, 10, 'chr1', 150, 250, 20, 'chr2', 250, 500, 500 ) bed_glyph(bed_map(x, y, value = sum(value)), label = 'value') # summary examples bed_map(x, y, .sum = sum(value)) #> # A tibble: 2 × 4 #> chrom start end .sum #> #> 1 chr1 100 250 30 #> 2 chr2 250 500 500 bed_map(x, y, .min = min(value), .max = max(value)) #> # A tibble: 2 × 5 #> chrom start end .min .max #> #> 1 chr1 100 250 10 20 #> 2 chr2 250 500 500 500 # identify non-intersecting intervals to include in the result res <- bed_map(x, y, .sum = sum(value)) x_not <- bed_intersect(x, y, invert = TRUE) dplyr::bind_rows(res, x_not) #> # A tibble: 2 × 4 #> chrom start end .sum #> #> 1 chr1 100 250 30 #> 2 chr2 250 500 500 # create a list-column bed_map(x, y, .values = list(value)) #> # A tibble: 2 × 4 #> chrom start end .values #> #> 1 chr1 100 250 #> 2 chr2 250 500 # use `nth` family from dplyr bed_map(x, y, .first = dplyr::first(value)) #> # A tibble: 2 × 4 #> chrom start end .first #> #> 1 chr1 100 250 10 #> 2 chr2 250 500 500 bed_map(x, y, .absmax = abs(max(value))) #> # A tibble: 2 × 4 #> chrom start end .absmax #> #> 1 chr1 100 250 20 #> 2 chr2 250 500 500 bed_map(x, y, .count = length(value)) #> # A tibble: 2 × 4 #> chrom start end .count #> #> 1 chr1 100 250 2 #> 2 chr2 250 500 1 bed_map(x, y, .vals = values(value)) #> # A tibble: 2 × 4 #> chrom start end .vals #> #> 1 chr1 100 250 10,20 #> 2 chr2 250 500 500 # count defaults are NA not 0; differs from bedtools2 ... bed_map(x, y, .counts = dplyr::n()) #> # A tibble: 2 × 4 #> chrom start end .counts #> #> 1 chr1 100 250 2 #> 2 chr2 250 500 1 # ... but NA counts can be coverted to 0's dplyr::mutate(bed_map(x, y, .counts = dplyr::n()), .counts = ifelse(is.na(.counts), 0, .counts)) #> # A tibble: 2 × 4 #> chrom start end .counts #> #> 1 chr1 100 250 2 #> 2 chr2 250 500 1"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_merge.html","id":null,"dir":"Reference","previous_headings":"","what":"Merge overlapping intervals. — bed_merge","title":"Merge overlapping intervals. — bed_merge","text":"Operations can performed merged intervals specifying name-value pairs. Default max_dist 0 means book-ended intervals merged.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_merge.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Merge overlapping intervals. — bed_merge","text":"","code":"bed_merge(x, max_dist = 0, ...)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_merge.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Merge overlapping intervals. — bed_merge","text":"x ivl_df max_dist maximum distance intervals merge ... name-value pairs specify operations merged intervals","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_merge.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Merge overlapping intervals. — bed_merge","text":"ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_merge.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Merge overlapping intervals. — bed_merge","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_merge.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Merge overlapping intervals. — bed_merge","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 1, 50, \"chr1\", 10, 75, \"chr1\", 100, 120 ) bed_glyph(bed_merge(x)) x <- tibble::tribble( ~chrom, ~start, ~end, ~value, ~strand, \"chr1\", 1, 50, 1, \"+\", \"chr1\", 100, 200, 2, \"+\", \"chr1\", 150, 250, 3, \"-\", \"chr2\", 1, 25, 4, \"+\", \"chr2\", 200, 400, 5, \"-\", \"chr2\", 400, 500, 6, \"+\", \"chr2\", 450, 550, 7, \"+\" ) bed_merge(x) #> # A tibble: 4 × 3 #> chrom start end #> #> 1 chr1 1 50 #> 2 chr1 100 250 #> 3 chr2 1 25 #> 4 chr2 200 550 bed_merge(x, max_dist = 100) #> # A tibble: 3 × 3 #> chrom start end #> #> 1 chr1 1 250 #> 2 chr2 1 25 #> 3 chr2 200 550 # merge intervals on same strand bed_merge(dplyr::group_by(x, strand)) #> # A tibble: 6 × 4 #> # Groups: strand [2] #> chrom start end strand #> #> 1 chr1 1 50 + #> 2 chr1 100 200 + #> 3 chr1 150 250 - #> 4 chr2 1 25 + #> 5 chr2 400 550 + #> 6 chr2 200 400 - bed_merge(x, .value = sum(value)) #> # A tibble: 4 × 4 #> chrom start end .value #> #> 1 chr1 1 50 1 #> 2 chr1 100 250 5 #> 3 chr2 1 25 4 #> 4 chr2 200 550 18"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_partition.html","id":null,"dir":"Reference","previous_headings":"","what":"Partition intervals into elemental intervals — bed_partition","title":"Partition intervals into elemental intervals — bed_partition","text":"Convert set intervals elemental intervals contain start end position set.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_partition.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Partition intervals into elemental intervals — bed_partition","text":"","code":"bed_partition(x, ...)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_partition.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Partition intervals into elemental intervals — bed_partition","text":"x ivl_df ... name-value pairs specifying column names expressions apply","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_partition.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Partition intervals into elemental intervals — bed_partition","text":"ivl_df()","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_partition.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Partition intervals into elemental intervals — bed_partition","text":"Summary operations, min() count() can performed elemental intervals specifying name-value pairs. function useful calculating summaries across overlapping intervals without merging intervals. input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_partition.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Partition intervals into elemental intervals — bed_partition","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, ~value, ~strand, \"chr1\", 100, 500, 10, \"+\", \"chr1\", 200, 400, 20, \"-\", \"chr1\", 300, 550, 30, \"+\", \"chr1\", 550, 575, 2, \"+\", \"chr1\", 800, 900, 5, \"+\" ) bed_glyph(bed_partition(x)) bed_glyph(bed_partition(x, value = sum(value)), label = \"value\") bed_partition(x) #> # A tibble: 7 × 3 #> chrom start end #> #> 1 chr1 100 200 #> 2 chr1 200 300 #> 3 chr1 300 400 #> 4 chr1 400 500 #> 5 chr1 500 550 #> 6 chr1 550 575 #> 7 chr1 800 900 # compute summary over each elemental interval bed_partition(x, value = sum(value)) #> # A tibble: 7 × 4 #> chrom start end value #> #> 1 chr1 100 200 10 #> 2 chr1 200 300 30 #> 3 chr1 300 400 60 #> 4 chr1 400 500 40 #> 5 chr1 500 550 30 #> 6 chr1 550 575 2 #> 7 chr1 800 900 5 # partition and compute summaries based on group x <- dplyr::group_by(x, strand) bed_partition(x, value = sum(value)) #> # A tibble: 6 × 5 #> chrom start end strand value #> #> 1 chr1 100 300 + 10 #> 2 chr1 200 400 - 20 #> 3 chr1 300 500 + 40 #> 4 chr1 500 550 + 30 #> 5 chr1 550 575 + 2 #> 6 chr1 800 900 + 5 # combine values across multiple tibbles y <- tibble::tribble( ~chrom, ~start, ~end, ~value, ~strand, \"chr1\", 10, 500, 100, \"+\", \"chr1\", 250, 420, 200, \"-\", \"chr1\", 350, 550, 300, \"+\", \"chr1\", 550, 555, 20, \"+\", \"chr1\", 800, 900, 50, \"+\" ) x <- dplyr::bind_rows(x, y) bed_partition(x, value = sum(value)) #> # A tibble: 11 × 5 #> chrom start end strand value #> #> 1 chr1 10 100 + 100 #> 2 chr1 100 300 + 110 #> 3 chr1 200 250 - 20 #> 4 chr1 250 400 - 220 #> 5 chr1 300 350 + 140 #> 6 chr1 350 500 + 440 #> 7 chr1 400 420 - 200 #> 8 chr1 500 550 + 330 #> 9 chr1 550 555 + 22 #> 10 chr1 555 575 + 2 #> 11 chr1 800 900 + 55"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_projection.html","id":null,"dir":"Reference","previous_headings":"","what":"Projection test for query interval overlap. — bed_projection","title":"Projection test for query interval overlap. — bed_projection","text":"Projection test query interval overlap.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_projection.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Projection test for query interval overlap. — bed_projection","text":"","code":"bed_projection(x, y, genome, by_chrom = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_projection.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Projection test for query interval overlap. — bed_projection","text":"x ivl_df y ivl_df genome genome_df by_chrom compute test per chromosome","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_projection.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Projection test for query interval overlap. — bed_projection","text":"ivl_df following columns: chrom name chromosome tested by_chrom = TRUE, otherwise value whole_genome p.value p-value binomial test. p-values > 0.5 converted 1 - p-value lower_tail FALSE obs_exp_ratio ratio observed expected overlap frequency lower_tail TRUE indicates observed overlaps lower tail distribution (e.g., less overlap expected). FALSE indicates observed overlaps upper tail distribution (e.g., overlap expected)","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_projection.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Projection test for query interval overlap. — bed_projection","text":"Interval statistics can used combination dplyr::group_by() dplyr::() calculate statistics subsets data. See vignette('interval-stats') examples.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_projection.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Projection test for query interval overlap. — bed_projection","text":"","code":"genome <- read_genome(valr_example(\"hg19.chrom.sizes.gz\")) x <- bed_random(genome, seed = 1010486) y <- bed_random(genome, seed = 9203911) bed_projection(x, y, genome) #> # A tibble: 1 × 4 #> chrom p.value obs_exp_ratio lower_tail #> #> 1 whole_genome 0.000850 1.01 FALSE bed_projection(x, y, genome, by_chrom = TRUE) #> # A tibble: 25 × 4 #> chrom p.value obs_exp_ratio lower_tail #> #> 1 chr1 0.176 1.01 FALSE #> 2 chr10 0.0209 1.02 FALSE #> 3 chr11 0.118 1.01 FALSE #> 4 chr12 0.479 1.00 FALSE #> 5 chr13 0.245 1.01 FALSE #> 6 chr14 0.120 0.990 TRUE #> 7 chr15 0.333 1.00 FALSE #> 8 chr16 0.213 1.01 FALSE #> 9 chr17 0.181 0.991 TRUE #> 10 chr18 0.0306 1.02 FALSE #> # ℹ 15 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_random.html","id":null,"dir":"Reference","previous_headings":"","what":"Generate randomly placed intervals on a genome. — bed_random","title":"Generate randomly placed intervals on a genome. — bed_random","text":"Generate randomly placed intervals genome.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_random.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generate randomly placed intervals on a genome. — bed_random","text":"","code":"bed_random(genome, length = 1000, n = 1e+06, seed = 0, sorted = TRUE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_random.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generate randomly placed intervals on a genome. — bed_random","text":"genome genome_df length length intervals n number intervals generate seed seed RNG reproducible intervals sorted return sorted output","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_random.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generate randomly placed intervals on a genome. — bed_random","text":"ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_random.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generate randomly placed intervals on a genome. — bed_random","text":"Sorting can suppressed sorted = FALSE.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_random.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generate randomly placed intervals on a genome. — bed_random","text":"","code":"genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 10000000, \"chr2\", 50000000, \"chr3\", 60000000, \"chrX\", 5000000 ) bed_random(genome, seed = 10104) #> # A tibble: 1,000,000 × 3 #> chrom start end #> #> 1 chr1 265 1265 #> 2 chr1 315 1315 #> 3 chr1 335 1335 #> 4 chr1 513 1513 #> 5 chr1 625 1625 #> 6 chr1 635 1635 #> 7 chr1 653 1653 #> 8 chr1 731 1731 #> 9 chr1 859 1859 #> 10 chr1 1024 2024 #> # ℹ 999,990 more rows # sorting can be suppressed bed_random(genome, sorted = FALSE, seed = 10104) #> # A tibble: 1,000,000 × 3 #> chrom start end #> #> 1 chr3 2681468 2682468 #> 2 chr3 25364020 25365020 #> 3 chr2 43134407 43135407 #> 4 chr2 36344257 36345257 #> 5 chr3 39019690 39020690 #> 6 chr3 59869387 59870387 #> 7 chr3 56220373 56221373 #> 8 chr3 57965913 57966913 #> 9 chr2 25303342 25304342 #> 10 chr3 16018594 16019594 #> # ℹ 999,990 more rows # 500 random intervals of length 500 bed_random(genome, length = 500, n = 500, seed = 10104) #> # A tibble: 500 × 3 #> chrom start end #> #> 1 chr1 379360 379860 #> 2 chr1 394770 395270 #> 3 chr1 1215880 1216380 #> 4 chr1 1339287 1339787 #> 5 chr1 2046513 2047013 #> 6 chr1 2156755 2157255 #> 7 chr1 2189109 2189609 #> 8 chr1 2221665 2222165 #> 9 chr1 2223456 2223956 #> 10 chr1 2253135 2253635 #> # ℹ 490 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_reldist.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute relative distances between intervals. — bed_reldist","title":"Compute relative distances between intervals. — bed_reldist","text":"Compute relative distances intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_reldist.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute relative distances between intervals. — bed_reldist","text":"","code":"bed_reldist(x, y, detail = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_reldist.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute relative distances between intervals. — bed_reldist","text":"x ivl_df y ivl_df detail report relative distances x interval.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_reldist.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute relative distances between intervals. — bed_reldist","text":"detail = FALSE, ivl_df summarizes calculated .reldist values following columns: .reldist relative distance metric .counts number metric observations .total total observations .freq frequency observation detail = TRUE, .reldist column reports relative distance input x interval.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_reldist.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Compute relative distances between intervals. — bed_reldist","text":"Interval statistics can used combination dplyr::group_by() dplyr::() calculate statistics subsets data. See vignette('interval-stats') examples.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_reldist.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compute relative distances between intervals. — bed_reldist","text":"","code":"genome <- read_genome(valr_example(\"hg19.chrom.sizes.gz\")) x <- bed_random(genome, seed = 1010486) y <- bed_random(genome, seed = 9203911) bed_reldist(x, y) #> # A tibble: 51 × 4 #> .reldist .counts .total .freq #> #> 1 0 20202 999938 0.0202 #> 2 0.01 20031 999938 0.0200 #> 3 0.02 19977 999938 0.0200 #> 4 0.03 19871 999938 0.0199 #> 5 0.04 20129 999938 0.0201 #> 6 0.05 20197 999938 0.0202 #> 7 0.06 20020 999938 0.0200 #> 8 0.07 20063 999938 0.0201 #> 9 0.08 20053 999938 0.0201 #> 10 0.09 20021 999938 0.0200 #> # ℹ 41 more rows bed_reldist(x, y, detail = TRUE) #> # A tibble: 999,938 × 4 #> chrom start end .reldist #> #> 1 chr1 5184 6184 0.270 #> 2 chr1 7663 8663 0.226 #> 3 chr1 9858 10858 0.317 #> 4 chr1 13805 14805 0.361 #> 5 chr1 14081 15081 0.402 #> 6 chr1 16398 17398 0.253 #> 7 chr1 17486 18486 0.0912 #> 8 chr1 22063 23063 0.107 #> 9 chr1 22494 23494 0.207 #> 10 chr1 29351 30351 0.400 #> # ℹ 999,928 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shift.html","id":null,"dir":"Reference","previous_headings":"","what":"Adjust intervals by a fixed size. — bed_shift","title":"Adjust intervals by a fixed size. — bed_shift","text":"--bounds intervals removed default.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shift.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Adjust intervals by a fixed size. — bed_shift","text":"","code":"bed_shift(x, genome, size = 0, fraction = 0, trim = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shift.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Adjust intervals by a fixed size. — bed_shift","text":"x ivl_df genome ivl_df size number bases shift. positive numbers shift right, negative shift left. fraction define size fraction interval trim adjust coordinates --bounds intervals","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shift.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Adjust intervals by a fixed size. — bed_shift","text":"ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shift.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Adjust intervals by a fixed size. — bed_shift","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 25, 50, \"chr1\", 100, 125 ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 125 ) bed_glyph(bed_shift(x, genome, size = -20)) x <- tibble::tribble( ~chrom, ~start, ~end, ~strand, \"chr1\", 100, 150, \"+\", \"chr1\", 200, 250, \"+\", \"chr2\", 300, 350, \"+\", \"chr2\", 400, 450, \"-\", \"chr3\", 500, 550, \"-\", \"chr3\", 600, 650, \"-\" ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 1000, \"chr2\", 2000, \"chr3\", 3000 ) bed_shift(x, genome, 100) #> # A tibble: 6 × 4 #> chrom start end strand #> #> 1 chr1 200 250 + #> 2 chr1 300 350 + #> 3 chr2 400 450 + #> 4 chr2 500 550 - #> 5 chr3 600 650 - #> 6 chr3 700 750 - bed_shift(x, genome, fraction = 0.5) #> # A tibble: 6 × 4 #> chrom start end strand #> #> 1 chr1 125 175 + #> 2 chr1 225 275 + #> 3 chr2 325 375 + #> 4 chr2 425 475 - #> 5 chr3 525 575 - #> 6 chr3 625 675 - # shift with respect to strand stranded <- dplyr::group_by(x, strand) bed_shift(stranded, genome, 100) #> # A tibble: 6 × 4 #> chrom start end strand #> #> 1 chr1 200 250 + #> 2 chr1 300 350 + #> 3 chr2 400 450 + #> 4 chr2 300 350 - #> 5 chr3 400 450 - #> 6 chr3 500 550 -"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shuffle.html","id":null,"dir":"Reference","previous_headings":"","what":"Shuffle input intervals. — bed_shuffle","title":"Shuffle input intervals. — bed_shuffle","text":"Shuffle input intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shuffle.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Shuffle input intervals. — bed_shuffle","text":"","code":"bed_shuffle( x, genome, incl = NULL, excl = NULL, max_tries = 1000, within = FALSE, seed = 0 )"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shuffle.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Shuffle input intervals. — bed_shuffle","text":"x ivl_df genome genome_df incl ivl_df included intervals excl ivl_df excluded intervals max_tries maximum tries identify bounded interval within shuffle within chromosomes seed seed reproducible intervals","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shuffle.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Shuffle input intervals. — bed_shuffle","text":"ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shuffle.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Shuffle input intervals. — bed_shuffle","text":"","code":"genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 1e6, \"chr2\", 2e6, \"chr3\", 4e6 ) x <- bed_random(genome, seed = 1010486) bed_shuffle(x, genome, seed = 9830491) #> # A tibble: 1,000,000 × 3 #> chrom start end #> #> 1 chr2 1463822 1464822 #> 2 chr2 619967 620967 #> 3 chr2 1769865 1770865 #> 4 chr2 203953 204953 #> 5 chr3 2119387 2120387 #> 6 chr2 1216667 1217667 #> 7 chr3 2109652 2110652 #> 8 chr2 213473 214473 #> 9 chr1 154156 155156 #> 10 chr3 2201278 2202278 #> # ℹ 999,990 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_slop.html","id":null,"dir":"Reference","previous_headings":"","what":"Increase the size of input intervals. — bed_slop","title":"Increase the size of input intervals. — bed_slop","text":"Increase size input intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_slop.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Increase the size of input intervals. — bed_slop","text":"","code":"bed_slop( x, genome, both = 0, left = 0, right = 0, fraction = FALSE, strand = FALSE, trim = FALSE, ... )"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_slop.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Increase the size of input intervals. — bed_slop","text":"x ivl_df genome genome_df number bases sizes left number bases left side right number bases right side fraction define flanks based fraction interval length strand define left right based strand trim adjust coordinates --bounds intervals ... extra arguments (used)","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_slop.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Increase the size of input intervals. — bed_slop","text":"ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_slop.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Increase the size of input intervals. — bed_slop","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 110, 120, \"chr1\", 225, 235 ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 400 ) bed_glyph(bed_slop(x, genome, both = 20, trim = TRUE)) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 5000 ) x <- tibble::tribble( ~chrom, ~start, ~end, ~name, ~score, ~strand, \"chr1\", 500, 1000, \".\", \".\", \"+\", \"chr1\", 1000, 1500, \".\", \".\", \"-\" ) bed_slop(x, genome, left = 100) #> # A tibble: 2 × 6 #> chrom start end name score strand #> #> 1 chr1 400 1000 . . + #> 2 chr1 900 1500 . . - bed_slop(x, genome, right = 100) #> # A tibble: 2 × 6 #> chrom start end name score strand #> #> 1 chr1 500 1100 . . + #> 2 chr1 1000 1600 . . - bed_slop(x, genome, both = 100) #> # A tibble: 2 × 6 #> chrom start end name score strand #> #> 1 chr1 400 1100 . . + #> 2 chr1 900 1600 . . - bed_slop(x, genome, both = 0.5, fraction = TRUE) #> # A tibble: 2 × 6 #> chrom start end name score strand #> #> 1 chr1 250 1250 . . + #> 2 chr1 750 1750 . . -"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_sort.html","id":null,"dir":"Reference","previous_headings":"","what":"Sort a set of intervals. — bed_sort","title":"Sort a set of intervals. — bed_sort","text":"Sort set intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_sort.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sort a set of intervals. — bed_sort","text":"","code":"bed_sort(x, by_size = FALSE, by_chrom = FALSE, reverse = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_sort.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Sort a set of intervals. — bed_sort","text":"x ivl_df by_size sort interval size by_chrom sort within chromosome reverse reverse sort order","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_sort.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sort a set of intervals. — bed_sort","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr8\", 500, 1000, \"chr8\", 1000, 5000, \"chr8\", 100, 200, \"chr1\", 100, 300, \"chr1\", 100, 200 ) # sort by chrom and start bed_sort(x) #> # A tibble: 5 × 3 #> chrom start end #> #> 1 chr1 100 200 #> 2 chr1 100 300 #> 3 chr8 100 200 #> 4 chr8 500 1000 #> 5 chr8 1000 5000 # reverse sort order bed_sort(x, reverse = TRUE) #> # A tibble: 5 × 3 #> chrom start end #> #> 1 chr1 100 300 #> 2 chr1 100 200 #> 3 chr8 1000 5000 #> 4 chr8 500 1000 #> 5 chr8 100 200 # sort by interval size bed_sort(x, by_size = TRUE) #> # A tibble: 5 × 3 #> chrom start end #> #> 1 chr8 100 200 #> 2 chr1 100 200 #> 3 chr1 100 300 #> 4 chr8 500 1000 #> 5 chr8 1000 5000 # sort by decreasing interval size bed_sort(x, by_size = TRUE, reverse = TRUE) #> # A tibble: 5 × 3 #> chrom start end #> #> 1 chr8 1000 5000 #> 2 chr8 500 1000 #> 3 chr1 100 300 #> 4 chr8 100 200 #> 5 chr1 100 200 # sort by interval size within chrom bed_sort(x, by_size = TRUE, by_chrom = TRUE) #> # A tibble: 5 × 3 #> chrom start end #> #> 1 chr1 100 200 #> 2 chr1 100 300 #> 3 chr8 100 200 #> 4 chr8 500 1000 #> 5 chr8 1000 5000"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_subtract.html","id":null,"dir":"Reference","previous_headings":"","what":"Subtract two sets of intervals. — bed_subtract","title":"Subtract two sets of intervals. — bed_subtract","text":"Subtract y intervals x intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_subtract.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Subtract two sets of intervals. — bed_subtract","text":"","code":"bed_subtract(x, y, any = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_subtract.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Subtract two sets of intervals. — bed_subtract","text":"x ivl_df y ivl_df remove x intervals overlap y","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_subtract.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Subtract two sets of intervals. — bed_subtract","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_subtract.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Subtract two sets of intervals. — bed_subtract","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 1, 100 ) y <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 50, 75 ) bed_glyph(bed_subtract(x, y)) x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 100, 200, \"chr1\", 250, 400, \"chr1\", 500, 600, \"chr1\", 1000, 1200, \"chr1\", 1300, 1500 ) y <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 150, 175, \"chr1\", 510, 525, \"chr1\", 550, 575, \"chr1\", 900, 1050, \"chr1\", 1150, 1250, \"chr1\", 1299, 1501 ) bed_subtract(x, y) #> # A tibble: 7 × 3 #> chrom start end #> #> 1 chr1 100 150 #> 2 chr1 175 200 #> 3 chr1 250 400 #> 4 chr1 500 510 #> 5 chr1 525 550 #> 6 chr1 575 600 #> 7 chr1 1050 1150 bed_subtract(x, y, any = TRUE) #> # A tibble: 1 × 3 #> chrom start end #> #> 1 chr1 250 400"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_window.html","id":null,"dir":"Reference","previous_headings":"","what":"Identify intervals within a specified distance. — bed_window","title":"Identify intervals within a specified distance. — bed_window","text":"Identify intervals within specified distance.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_window.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Identify intervals within a specified distance. — bed_window","text":"","code":"bed_window(x, y, genome, ...)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_window.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Identify intervals within a specified distance. — bed_window","text":"x ivl_df y ivl_df genome genome_df ... params bed_slop bed_intersect","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_window.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Identify intervals within a specified distance. — bed_window","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_window.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Identify intervals within a specified distance. — bed_window","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 25, 50, \"chr1\", 100, 125 ) y <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 60, 75 ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 125 ) bed_glyph(bed_window(x, y, genome, both = 15)) x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 10, 100, \"chr2\", 200, 400, \"chr2\", 300, 500, \"chr2\", 800, 900 ) y <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 150, 400, \"chr2\", 230, 430, \"chr2\", 350, 430 ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 500, \"chr2\", 1000 ) bed_window(x, y, genome, both = 100) #> # A tibble: 4 × 7 #> chrom start.x end.x start.y end.y .source .overlap #> #> 1 chr2 200 400 230 430 1 200 #> 2 chr2 200 400 350 430 1 80 #> 3 chr2 300 500 230 430 1 200 #> 4 chr2 300 500 350 430 1 80"},{"path":"https://rnabioco.github.io/valr/dev/reference/bound_intervals.html","id":null,"dir":"Reference","previous_headings":"","what":"Select intervals bounded by a genome. — bound_intervals","title":"Select intervals bounded by a genome. — bound_intervals","text":"Used remove --bounds intervals, trim interval coordinates using genome.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bound_intervals.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Select intervals bounded by a genome. — bound_intervals","text":"","code":"bound_intervals(x, genome, trim = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bound_intervals.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Select intervals bounded by a genome. — bound_intervals","text":"x ivl_df genome genome_df trim adjust coordinates --bounds intervals","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bound_intervals.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Select intervals bounded by a genome. — bound_intervals","text":"ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bound_intervals.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Select intervals bounded by a genome. — bound_intervals","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", -100, 500, \"chr1\", 100, 1e9, \"chr1\", 500, 1000 ) genome <- read_genome(valr_example(\"hg19.chrom.sizes.gz\")) # out-of-bounds are removed by default ... bound_intervals(x, genome) #> # A tibble: 1 × 3 #> chrom start end #> #> 1 chr1 500 1000 # ... or can be trimmed within the bounds of a genome bound_intervals(x, genome, trim = TRUE) #> # A tibble: 3 × 3 #> chrom start end #> #> 1 chr1 0 500 #> 2 chr1 100 249250621 #> 3 chr1 500 1000"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_introns.html","id":null,"dir":"Reference","previous_headings":"","what":"Create intron features. — create_introns","title":"Create intron features. — create_introns","text":"Numbers score column intron numbers 5' 3' independent strand. .e., first introns + - strand genes score values 1.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/create_introns.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create intron features. — create_introns","text":"","code":"create_introns(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_introns.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create intron features. — create_introns","text":"x ivl_df BED12 format","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/create_introns.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create intron features. — create_introns","text":"","code":"x <- read_bed12(valr_example(\"mm9.refGene.bed.gz\")) create_introns(x) #> # A tibble: 1,583 × 6 #> chrom start end name score strand #> #> 1 chr1 3207049 3411782 NM_001011874 2 - #> 2 chr1 3411982 3660632 NM_001011874 1 - #> 3 chr1 4283093 4341990 NM_001195662 3 - #> 4 chr1 4342162 4342282 NM_001195662 2 - #> 5 chr1 4342918 4399250 NM_001195662 1 - #> 6 chr1 4848057 4857550 NM_001159750 1 + #> 7 chr1 4848057 4857550 NM_011541 1 + #> 8 chr1 4848584 4857550 NM_001159751 1 + #> 9 chr1 4857613 4868107 NM_001159750 2 + #> 10 chr1 4857613 4868107 NM_011541 2 + #> # ℹ 1,573 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_tss.html","id":null,"dir":"Reference","previous_headings":"","what":"Create transcription start site features. — create_tss","title":"Create transcription start site features. — create_tss","text":"Create transcription start site features.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/create_tss.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create transcription start site features. — create_tss","text":"","code":"create_tss(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_tss.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create transcription start site features. — create_tss","text":"x ivl_df BED format","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/create_tss.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create transcription start site features. — create_tss","text":"","code":"x <- read_bed12(valr_example(\"mm9.refGene.bed.gz\")) create_tss(x) #> # A tibble: 100 × 6 #> chrom start end name score strand #> #> 1 chr1 3661578 3661579 NM_001011874 0 - #> 2 chr1 4399321 4399322 NM_001195662 0 - #> 3 chr1 4847774 4847775 NM_001159750 0 + #> 4 chr1 4847774 4847775 NM_011541 0 + #> 5 chr1 4848408 4848409 NM_001159751 0 + #> 6 chr1 5008814 5008815 NM_001290372 0 - #> 7 chr1 5009619 5009620 NM_021374 0 - #> 8 chr1 5060365 5060366 NM_001177795 0 - #> 9 chr1 5073166 5073167 NM_001310442 0 + #> 10 chr1 5073166 5073167 NM_133826 0 + #> # ℹ 90 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs3.html","id":null,"dir":"Reference","previous_headings":"","what":"Create 3' UTR features. — create_utrs3","title":"Create 3' UTR features. — create_utrs3","text":"Create 3' UTR features.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs3.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create 3' UTR features. — create_utrs3","text":"","code":"create_utrs3(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs3.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create 3' UTR features. — create_utrs3","text":"x ivl_df BED12 format","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs3.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create 3' UTR features. — create_utrs3","text":"","code":"x <- read_bed12(valr_example(\"mm9.refGene.bed.gz\")) create_utrs3(x) #> # A tibble: 99 × 6 #> chrom start end name score strand #> #> 1 chr1 3204562 3206102 NM_001011874 0 - #> 2 chr1 4280926 4283061 NM_001195662 0 - #> 3 chr1 4886445 4887990 NM_001159750 0 + #> 4 chr1 4886445 4887990 NM_011541 0 + #> 5 chr1 4886445 4887990 NM_001159751 0 + #> 6 chr1 4899656 4900554 NM_001290372 0 - #> 7 chr1 4899656 4900554 NM_021374 0 - #> 8 chr1 4899656 4900554 NM_001177795 0 - #> 9 chr1 5152246 5152630 NM_001310442 0 + #> 10 chr1 5152246 5152630 NM_133826 0 + #> # ℹ 89 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs5.html","id":null,"dir":"Reference","previous_headings":"","what":"Create 5' UTR features. — create_utrs5","title":"Create 5' UTR features. — create_utrs5","text":"Create 5' UTR features.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs5.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create 5' UTR features. — create_utrs5","text":"","code":"create_utrs5(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs5.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create 5' UTR features. — create_utrs5","text":"x ivl_df BED12 format","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs5.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create 5' UTR features. — create_utrs5","text":"","code":"x <- read_bed12(valr_example(\"mm9.refGene.bed.gz\")) create_utrs5(x) #> # A tibble: 97 × 6 #> chrom start end name score strand #> #> 1 chr1 3661429 3661579 NM_001011874 0 - #> 2 chr1 4399268 4399322 NM_001195662 0 - #> 3 chr1 4847774 4847994 NM_001159750 0 + #> 4 chr1 4847774 4847994 NM_011541 0 + #> 5 chr1 4848408 4848488 NM_001159751 0 + #> 6 chr1 4914046 5008815 NM_001290372 0 - #> 7 chr1 5009460 5009620 NM_021374 0 - #> 8 chr1 5060258 5060366 NM_001177795 0 - #> 9 chr1 5073166 5074531 NM_001310442 0 + #> 10 chr1 5073166 5074531 NM_133826 0 + #> # ℹ 87 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/db.html","id":null,"dir":"Reference","previous_headings":"","what":"Fetch data from remote databases. — db","title":"Fetch data from remote databases. — db","text":"Currently db_ucsc db_ensembl available connections.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/db.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fetch data from remote databases. — db","text":"","code":"db_ucsc( dbname, host = \"genome-mysql.cse.ucsc.edu\", user = \"genomep\", password = \"password\", port = 3306, ... ) db_ensembl( dbname, host = \"ensembldb.ensembl.org\", user = \"anonymous\", password = \"\", port = 3306, ... )"},{"path":"https://rnabioco.github.io/valr/dev/reference/db.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fetch data from remote databases. — db","text":"dbname name database host hostname user username password password port MySQL connection port ... params connection","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/db.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fetch data from remote databases. — db","text":"","code":"if (FALSE) { if (require(RMariaDB)) { library(dplyr) ucsc <- db_ucsc(\"hg38\") # fetch the `refGene` tbl tbl(ucsc, \"refGene\") # the `chromInfo` tbls have size information tbl(ucsc, \"chromInfo\") } } if (FALSE) { if (require(RMariaDB)) { library(dplyr) # squirrel genome ensembl <- db_ensembl(\"spermophilus_tridecemlineatus_core_67_2\") tbl(ensembl, \"gene\") } }"},{"path":"https://rnabioco.github.io/valr/dev/reference/flip_strands.html","id":null,"dir":"Reference","previous_headings":"","what":"Flip strands in intervals. — flip_strands","title":"Flip strands in intervals. — flip_strands","text":"Flips positive (+) stranded intervals negative (-) strands, vice-versa. Facilitates comparisons among intervals opposing strands.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/flip_strands.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Flip strands in intervals. — flip_strands","text":"","code":"flip_strands(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/flip_strands.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Flip strands in intervals. — flip_strands","text":"x ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/flip_strands.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Flip strands in intervals. — flip_strands","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, ~strand, \"chr1\", 1, 100, \"+\", \"chr2\", 1, 100, \"-\" ) flip_strands(x) #> # A tibble: 2 × 4 #> chrom start end strand #> #> 1 chr1 1 100 - #> 2 chr2 1 100 +"},{"path":"https://rnabioco.github.io/valr/dev/reference/gr_to_bed.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert Granges to bed tibble — gr_to_bed","title":"Convert Granges to bed tibble — gr_to_bed","text":"Convert Granges bed tibble","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/gr_to_bed.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert Granges to bed tibble — gr_to_bed","text":"","code":"gr_to_bed(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/gr_to_bed.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert Granges to bed tibble — gr_to_bed","text":"x GRanges object convert bed tibble.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/gr_to_bed.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert Granges to bed tibble — gr_to_bed","text":"tibble::tibble()","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/gr_to_bed.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convert Granges to bed tibble — gr_to_bed","text":"","code":"if (FALSE) { gr <- GenomicRanges::GRanges( seqnames = S4Vectors::Rle( c(\"chr1\", \"chr2\", \"chr1\", \"chr3\"), c(1, 1, 1, 1) ), ranges = IRanges::IRanges( start = c(1, 10, 50, 100), end = c(100, 500, 1000, 2000), names = head(letters, 4) ), strand = S4Vectors::Rle( c(\"-\", \"+\"), c(2, 2) ) ) gr_to_bed(gr) # There are two ways to convert a bed-like data.frame to GRanges: gr <- GenomicRanges::GRanges( seqnames = S4Vectors::Rle(x$chrom), ranges = IRanges::IRanges( start = x$start + 1, end = x$end, names = x$name ), strand = S4Vectors::Rle(x$strand) ) # or: gr <- GenomicRanges::makeGRangesFromDataFrame(dplyr::mutate(x, start = start + 1)) }"},{"path":"https://rnabioco.github.io/valr/dev/reference/id.html","id":null,"dir":"Reference","previous_headings":"","what":"Plyr function id packaged due to plyr being retired\nCompute a unique numeric id for each unique row in a data frame. — id","title":"Plyr function id packaged due to plyr being retired\nCompute a unique numeric id for each unique row in a data frame. — id","text":"Properties: order(id) equivalent .call(order, df) rows containing data value drop = FALSE room possibilites","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/id.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plyr function id packaged due to plyr being retired\nCompute a unique numeric id for each unique row in a data frame. — id","text":"","code":"id(.variables, drop = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/id.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plyr function id packaged due to plyr being retired\nCompute a unique numeric id for each unique row in a data frame. — id","text":".variables list variables drop drop unusued factor levels?","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/id.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Plyr function id packaged due to plyr being retired\nCompute a unique numeric id for each unique row in a data frame. — id","text":"numeric vector attribute n, giving total number possibilities","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/id_var.html","id":null,"dir":"Reference","previous_headings":"","what":"Plyr function id_var packaged due to plyr being retired\nNumeric id for a vector. — id_var","title":"Plyr function id_var packaged due to plyr being retired\nNumeric id for a vector. — id_var","text":"Plyr function id_var packaged due plyr retired Numeric id vector.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/id_var.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plyr function id_var packaged due to plyr being retired\nNumeric id for a vector. — id_var","text":"","code":"id_var(x, drop = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/interval_spacing.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate interval spacing. — interval_spacing","title":"Calculate interval spacing. — interval_spacing","text":"Spacing first interval chromosome undefined (NA). leading interval overlapping interval pair negative value.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/interval_spacing.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate interval spacing. — interval_spacing","text":"","code":"interval_spacing(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/interval_spacing.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate interval spacing. — interval_spacing","text":"x ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/interval_spacing.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate interval spacing. — interval_spacing","text":"ivl_df .spacing column.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/interval_spacing.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate interval spacing. — interval_spacing","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 1, 100, \"chr1\", 150, 200, \"chr2\", 200, 300 ) interval_spacing(x) #> # A tibble: 3 × 4 #> chrom start end .spacing #> #> 1 chr1 1 100 NA #> 2 chr1 150 200 50 #> 3 chr2 200 300 NA"},{"path":"https://rnabioco.github.io/valr/dev/reference/ivl_df.html","id":null,"dir":"Reference","previous_headings":"","what":"Bed-like data.frame requirements for valr functions — ivl_df","title":"Bed-like data.frame requirements for valr functions — ivl_df","text":"Required column names interval dataframes chrom, start end. Internally interval dataframes validated using check_interval() Required column names genome dataframes chrom size. Internally genome dataframes validated using check_genome().","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/ivl_df.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Bed-like data.frame requirements for valr functions — ivl_df","text":"","code":"check_interval(x) check_genome(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/ivl_df.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Bed-like data.frame requirements for valr functions — ivl_df","text":"x data.frame tibble::tibble","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/ivl_df.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Bed-like data.frame requirements for valr functions — ivl_df","text":"","code":"# using tibble x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 1, 50, \"chr1\", 10, 75, \"chr1\", 100, 120 ) check_interval(x) #> # A tibble: 3 × 3 #> chrom start end #> #> 1 chr1 1 50 #> 2 chr1 10 75 #> 3 chr1 100 120 # using base R data.frame x <- data.frame( chrom = \"chr1\", start = 0, end = 100, stringsAsFactors = FALSE ) check_interval(x) #> # A tibble: 1 × 3 #> chrom start end #> #> 1 chr1 0 100 # example genome input x <- tibble::tribble( ~chrom, ~size, \"chr1\", 1e6 ) check_genome(x) #> # A tibble: 1 × 2 #> chrom size #> #> 1 chr1 1000000"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bed.html","id":null,"dir":"Reference","previous_headings":"","what":"Read BED and related files. — read_bed","title":"Read BED and related files. — read_bed","text":"read functions BED related formats. Filenames can local file URLs. read functions load data tbls consistent chrom, start end colnames.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bed.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read BED and related files. — read_bed","text":"","code":"read_bed( filename, col_types = bed12_coltypes, sort = TRUE, ..., n_fields = NULL ) read_bed12(filename, ...) read_bedgraph(filename, ...) read_narrowpeak(filename, ...) read_broadpeak(filename, ...)"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bed.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read BED and related files. — read_bed","text":"filename file URL col_types column type spec readr::read_tsv() sort sort tbl chrom start ... options pass readr::read_tsv() n_fields","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bed.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Read BED and related files. — read_bed","text":"ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bed.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Read BED and related files. — read_bed","text":"https://genome.ucsc.edu/FAQ/FAQformat.html#format1 https://genome.ucsc.edu/FAQ/FAQformat.html#format1 https://genome.ucsc.edu/goldenPath/help/bedgraph.html https://genome.ucsc.edu/FAQ/FAQformat.html#format12 https://genome.ucsc.edu/FAQ/FAQformat.html#format13","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bed.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read BED and related files. — read_bed","text":"","code":"# read_bed assumes 3 field BED format. read_bed(valr_example(\"3fields.bed.gz\")) #> # A tibble: 10 × 3 #> chrom start end #> #> 1 chr1 11873 14409 #> 2 chr1 14361 19759 #> 3 chr1 14406 29370 #> 4 chr1 34610 36081 #> 5 chr1 69090 70008 #> 6 chr1 134772 140566 #> 7 chr1 321083 321115 #> 8 chr1 321145 321207 #> 9 chr1 322036 326938 #> 10 chr1 327545 328439 # result is sorted by chrom and start unless `sort = FALSE` read_bed(valr_example(\"3fields.bed.gz\"), sort = FALSE) #> # A tibble: 10 × 3 #> chrom start end #> #> 1 chr1 11873 14409 #> 2 chr1 14361 19759 #> 3 chr1 14406 29370 #> 4 chr1 34610 36081 #> 5 chr1 69090 70008 #> 6 chr1 134772 140566 #> 7 chr1 321083 321115 #> 8 chr1 321145 321207 #> 9 chr1 322036 326938 #> 10 chr1 327545 328439 read_bed12(valr_example(\"mm9.refGene.bed.gz\")) #> # A tibble: 100 × 12 #> chrom start end name score strand cds_start cds_end item_rgb #> #> 1 chr1 3204562 3661579 NM_00101… 0 - 3206102 3661429 0 #> 2 chr1 4280926 4399322 NM_00119… 0 - 4283061 4399268 0 #> 3 chr1 4847774 4887990 NM_00115… 0 + 4847994 4886445 0 #> 4 chr1 4847774 4887990 NM_011541 0 + 4847994 4886445 0 #> 5 chr1 4848408 4887990 NM_00115… 0 + 4848488 4886445 0 #> 6 chr1 4899656 5008815 NM_00129… 0 - 4900554 4914046 0 #> 7 chr1 4899656 5009620 NM_021374 0 - 4900554 5009460 0 #> 8 chr1 4899656 5060366 NM_00117… 0 - 4900554 5060258 0 #> 9 chr1 5073166 5152630 NM_00131… 0 + 5074531 5152246 0 #> 10 chr1 5073166 5152630 NM_133826 0 + 5074531 5152246 0 #> # ℹ 90 more rows #> # ℹ 3 more variables: exon_count , exon_sizes , #> # exon_starts read_bedgraph(valr_example(\"test.bg.gz\")) #> # A tibble: 4 × 4 #> chrom start end value #> #> 1 chr19 49302000 49302300 -1 #> 2 chr19 49302300 49302600 -0.75 #> 3 chr19 49302600 49302900 -0.5 #> 4 chr19 49302900 49303200 -0.25 read_narrowpeak(valr_example(\"sample.narrowPeak.gz\")) #> # A tibble: 570 × 10 #> chrom start end name score strand signal pvalue qvalue peak #> #> 1 chr22 17372940 17373090 . 0 . 4 4.63 -1 -1 #> 2 chr22 17392200 17392350 . 0 . 5 4.67 -1 -1 #> 3 chr22 17398400 17398550 . 0 . 10 11.6 -1 -1 #> 4 chr22 17539180 17539330 . 0 . 21 30.9 -1 -1 #> 5 chr22 17652440 17652590 . 0 . 6 5.35 -1 -1 #> 6 chr22 17652780 17652930 . 0 . 12 12.5 -1 -1 #> 7 chr22 17980800 17980950 . 0 . 12 12.6 -1 -1 #> 8 chr22 18038260 18038410 . 0 . 29 36.0 -1 -1 #> 9 chr22 18225280 18225430 . 0 . 21 25.0 -1 -1 #> 10 chr22 18268020 18268170 . 0 . 14 13.0 -1 -1 #> # ℹ 560 more rows read_broadpeak(valr_example(\"sample.broadPeak.gz\")) #> # A tibble: 1,181 × 9 #> chrom start end name score strand signal pvalue qvalue #> #> 1 chr22 16847903 16848440 . 503 . 10.5 2.5 -1 #> 2 chr22 16849452 16851326 . 483 . 9.81 15.7 -1 #> 3 chr22 16849955 16850086 . 1000 . 32.4 4.2 -1 #> 4 chr22 16850694 16850924 . 831 . 22.5 4.9 -1 #> 5 chr22 16852964 16853782 . 499 . 10.4 6.2 -1 #> 6 chr22 16855065 16855803 . 477 . 9.58 3.9 -1 #> 7 chr22 16855944 16856974 . 491 . 10.1 8.5 -1 #> 8 chr22 16857425 16857958 . 505 . 10.6 2.5 -1 #> 9 chr22 16858284 16858824 . 549 . 12.2 4.5 -1 #> 10 chr22 16859972 16862024 . 404 . 6.89 9.3 -1 #> # ℹ 1,171 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bigwig.html","id":null,"dir":"Reference","previous_headings":"","what":"Import and convert a bigwig file into a valr compatible tbl — read_bigwig","title":"Import and convert a bigwig file into a valr compatible tbl — read_bigwig","text":"function output 5 column tibble zero-based chrom, start, end, score, strand columns.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bigwig.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Import and convert a bigwig file into a valr compatible tbl — read_bigwig","text":"","code":"read_bigwig(path, set_strand = \"+\")"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bigwig.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Import and convert a bigwig file into a valr compatible tbl — read_bigwig","text":"path path bigWig file set_strand strand add output (defaults \"+\")","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bigwig.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Import and convert a bigwig file into a valr compatible tbl — read_bigwig","text":"functions uses rtracklayer import bigwigs unstable support windows platform therefore may error windows users (particularly 32 bit window users).","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bigwig.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Import and convert a bigwig file into a valr compatible tbl — read_bigwig","text":"","code":"if (FALSE) { if (.Platform$OS.type != \"windows\") { bw <- read_bigwig(valr_example(\"hg19.dnase1.bw\")) head(bw) } }"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_genome.html","id":null,"dir":"Reference","previous_headings":"","what":"Read genome files. — read_genome","title":"Read genome files. — read_genome","text":"Genome files (UCSC \"chromSize\" files) contain chromosome name size information. sizes used downstream functions identify computed intervals coordinates outside genome bounds.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_genome.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read genome files. — read_genome","text":"","code":"read_genome(path)"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_genome.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read genome files. — read_genome","text":"path containing chrom/contig names sizes, one-pair-per-line, tab-delimited","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_genome.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Read genome files. — read_genome","text":"genome_df, sorted size","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_genome.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Read genome files. — read_genome","text":"URLs genome files can also used.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/read_genome.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read genome files. — read_genome","text":"","code":"read_genome(valr_example(\"hg19.chrom.sizes.gz\")) #> # A tibble: 25 × 2 #> chrom size #> #> 1 chr1 249250621 #> 2 chr2 243199373 #> 3 chr3 198022430 #> 4 chr4 191154276 #> 5 chr5 180915260 #> 6 chr6 171115067 #> 7 chr7 159138663 #> 8 chrX 155270560 #> 9 chr8 146364022 #> 10 chr9 141213431 #> # ℹ 15 more rows if (FALSE) { # `read_genome` accepts a URL read_genome(\"https://genome.ucsc.edu/goldenpath/help/hg19.chrom.sizes\") }"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_gtf.html","id":null,"dir":"Reference","previous_headings":"","what":"Import and convert a GTF/GFF file into a valr compatible bed tbl format — read_gtf","title":"Import and convert a GTF/GFF file into a valr compatible bed tbl format — read_gtf","text":"function output tibble required chrom, start, end columns, well columns depending content GTF/GFF file.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_gtf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Import and convert a GTF/GFF file into a valr compatible bed tbl format — read_gtf","text":"","code":"read_gtf(path, zero_based = TRUE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_gtf.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Import and convert a GTF/GFF file into a valr compatible bed tbl format — read_gtf","text":"path path gtf gff file zero_based TRUE, convert zero based","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_gtf.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Import and convert a GTF/GFF file into a valr compatible bed tbl format — read_gtf","text":"","code":"gtf <- read_gtf(valr_example(\"hg19.gencode.gtf.gz\")) head(gtf) #> # A tibble: 6 × 26 #> chrom start end width strand source type score phase gene_id #> #> 1 chr2 43449540 43453748 4208 - HAVANA gene NA NA ENSG00… #> 2 chr2 43449540 43453748 4208 - HAVANA transcr… NA NA ENSG00… #> 3 chr2 43453403 43453748 345 - HAVANA exon NA NA ENSG00… #> 4 chr2 43453403 43453454 51 - HAVANA CDS NA 0 ENSG00… #> 5 chr2 43453451 43453454 3 - HAVANA start_c… NA 0 ENSG00… #> 6 chr2 43449540 43452891 3351 - HAVANA exon NA NA ENSG00… #> # ℹ 16 more variables: transcript_id , gene_type , #> # gene_status , gene_name , transcript_type , #> # transcript_status , transcript_name , level , #> # havana_gene , protein_id , tag , ccdsid , #> # havana_transcript , exon_number , exon_id , ont "},{"path":"https://rnabioco.github.io/valr/dev/reference/read_vcf.html","id":null,"dir":"Reference","previous_headings":"","what":"Read a VCF file. — read_vcf","title":"Read a VCF file. — read_vcf","text":"Read VCF file.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_vcf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read a VCF file. — read_vcf","text":"","code":"read_vcf(vcf)"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_vcf.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read a VCF file. — read_vcf","text":"vcf vcf filename","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_vcf.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Read a VCF file. — read_vcf","text":"data_frame","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_vcf.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Read a VCF file. — read_vcf","text":"return value chrom, start end columns. Interval lengths size 'REF' field.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/read_vcf.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read a VCF file. — read_vcf","text":"","code":"vcf_file <- valr_example(\"test.vcf.gz\") read_vcf(vcf_file) #> # A tibble: 11 × 18 #> CHROM POS ID REF ALT QUAL FILTER INFO FORMAT X1 X2 #> #> 1 1 10 1:10 A T 100 PASS NS=5;A… GT 0/0 ./. #> 2 1 20 1:20 G C 100 PASS NS=0;A… GT ./. ./. #> 3 1 30 1:30 C A 100 PASS NS=6;A… GT 0/0 0/0 #> 4 1 40 1:40 A C 100 PASS NS=6;A… GT 0/0 0/0 #> 5 1 10000 1:10000 G C 100 PASS NS=6;A… GT 0/0 0/0 #> 6 1 20000 1:20000 T A 100 PASS NS=6;A… GT 1/1 1/1 #> 7 4 5000 4:5000 A T 100 PASS NS=6;A… GT 1/1 1/1 #> 8 4 6000 4:6000 C T 100 PASS NS=6;A… GT 1/1 1/1 #> 9 X 800 X:800 A C 100 PASS NS=6;A… GT 1/1 1/1 #> 10 X 900 X:900 A T 100 PASS NS=6;A… GT 1/1 1/1 #> 11 X 1000 X:1000 T G 100 PASS NS=5;A… GT 1/1 1/1 #> # ℹ 7 more variables: X3 , X4 , X5 , X6 , #> # chrom , start , end "},{"path":"https://rnabioco.github.io/valr/dev/reference/valr.html","id":null,"dir":"Reference","previous_headings":"","what":"valr: genome interval arithmetic in R — valr","title":"valr: genome interval arithmetic in R — valr","text":"valr provides tools read manipulate intervals signals genome reference. valr developed facilitate interactive analysis genome-scale data sets, leveraging power dplyr piping.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/valr.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"valr: genome interval arithmetic in R — valr","text":"learn valr, start vignette: browseVignettes(package = \"valr\")","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/valr.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"valr: genome interval arithmetic in R — valr","text":"Jay Hesselberth jay.hesselberth@gmail.com Kent Riemondy kent.riemondy@gmail.com","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/valr_example.html","id":null,"dir":"Reference","previous_headings":"","what":"Provide working directory for valr example files. — valr_example","title":"Provide working directory for valr example files. — valr_example","text":"Provide working directory valr example files.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/valr_example.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Provide working directory for valr example files. — valr_example","text":"","code":"valr_example(path)"},{"path":"https://rnabioco.github.io/valr/dev/reference/valr_example.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Provide working directory for valr example files. — valr_example","text":"path path file","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/valr_example.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Provide working directory for valr example files. — valr_example","text":"","code":"valr_example(\"hg19.chrom.sizes.gz\") #> [1] \"/home/runner/work/_temp/Library/valr/extdata/hg19.chrom.sizes.gz\""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-070","dir":"Changelog","previous_headings":"","what":"valr 0.7.0","title":"valr 0.7.0","text":"read_bed related functions now automatically calculate fields. Use n_fields deprecated.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-068","dir":"Changelog","previous_headings":"","what":"valr 0.6.8","title":"valr 0.6.8","text":"CRAN release: 2023-05-16 bed_closest() now reports x intervals, even closest y intervals (e.g. matching chromosome y intervals). intervals returned populated NA .overlap, .dist y interval locations. Reimplemented bed_closest() use binary search rather interval tree search. closest y interval can missed previous search strategy high depth interval trees. Fix one error using max_dist argument bed_cluster() (#401).","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-067","dir":"Changelog","previous_headings":"","what":"valr 0.6.7","title":"valr 0.6.7","text":"CRAN release: 2023-02-18 Removed SystemRequirements DESCRIPTION eliminate NOTE CRAN. bed_coverage() now reports intervals x matching group y (#395).","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-066","dir":"Changelog","previous_headings":"","what":"valr 0.6.6","title":"valr 0.6.6","text":"CRAN release: 2022-10-11 Updated intervalTree header commit f0c4046 valr now uses cli consistent errors messages interactive use. deprecated genome argument bed_makewindows() removed.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-065","dir":"Changelog","previous_headings":"","what":"valr 0.6.5","title":"valr 0.6.5","text":"CRAN release: 2022-08-19 Handle max_dist first intervals bed_cluster() (#388)","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-064","dir":"Changelog","previous_headings":"","what":"valr 0.6.4","title":"valr 0.6.4","text":"CRAN release: 2021-12-08 Fixed intron score numbering error create_introns (#377 @sheridar) Fixed bug handling list inputs bed_intersect()(#380 @sheridar) Added read_bigwig read_gtf functions import data valr compatible tibbles (#379) Kent Riemondy now maintainer.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-063","dir":"Changelog","previous_headings":"","what":"valr 0.6.3","title":"valr 0.6.3","text":"CRAN release: 2021-05-15 Update prepare readr 2.0.0","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-062","dir":"Changelog","previous_headings":"","what":"valr 0.6.2","title":"valr 0.6.2","text":"CRAN release: 2020-10-07","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-6-2","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.6.2","text":"RMariaDB replaced deprecated RMySQL package database backend. valr now imports Rcpp, always case, masked Import readr, recently dropped use Rcpp.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-061","dir":"Changelog","previous_headings":"","what":"valr 0.6.1","title":"valr 0.6.1","text":"CRAN release: 2020-05-08","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-6-1","dir":"Changelog","previous_headings":"","what":"Bug Fixes","title":"valr 0.6.1","text":"Fixed rchk unprotect error (#365)","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-060","dir":"Changelog","previous_headings":"","what":"valr 0.6.0","title":"valr 0.6.0","text":"CRAN release: 2020-05-04","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"major-changes-0-6-0","dir":"Changelog","previous_headings":"","what":"Major changes","title":"valr 0.6.0","text":"trbl_interval() trbl_genome() custom tibble subclasses deemed unnecessary removed package. coercing GRanges valr compatible data.frame now uses gr_to_bed() function rather .trbl_interal() methods.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-6-0","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.6.0","text":"dplyr version < 0.8.0 longer supported due unnecessary code bloat challenges handling multiple grouping structures (#359). sort_by argument bed_random() changed sorted, now default use bed_sort() sort output, rather rely naming sorting columns. Sorting can suppressed using sorted = FALSE. bed_sort() now uses base R sorting radix method increased speed. (#353) tbls processed bed_merge()bed_sort() longer store either merged sorted attributes, due attributes rarely checked codebase potential sources unexpected behavior.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-6-0","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"valr 0.6.0","text":"Fixed bed_closest() prevent erroneous intervals reported adjacent closest intervals present y table. (#348) Factor columns used grouping returned factors rather inappropriately coerced integer vectors (#360)","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-050","dir":"Changelog","previous_headings":"","what":"valr 0.5.0","title":"valr 0.5.0","text":"CRAN release: 2019-01-03","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"major-changes-0-5-0","dir":"Changelog","previous_headings":"","what":"Major changes","title":"valr 0.5.0","text":"Internal Rcpp functions reorganized remove dependencies dplyr C++ functions.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-5-0","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.5.0","text":"Due internal refactoring Rcpp functions, data.frames containing Numeric, Logical, Integer, Character, List column types supported. Columns containing Raw, Complex, R classes supported issue error. Factors now disallowed grouping variables multiset operations avoid sort order discrepancies, compatibility factor handling dplyr v.0.8.0. Factors now internally type-converted character warning issued.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-042","dir":"Changelog","previous_headings":"","what":"valr 0.4.2","title":"valr 0.4.2","text":"CRAN release: 2018-11-17","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-4-2","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"valr 0.4.2","text":"Changed behavior .tbl_interval() call as_tibble() non-tibble input, prevents groups stripped tibble() input (#338).","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-041","dir":"Changelog","previous_headings":"","what":"valr 0.4.1","title":"valr 0.4.1","text":"CRAN release: 2018-06-08 Added new function, bed_partition(), similar bed_merge() collapses intervals elemental intervals rather maximal overlapping region. bed_partition() also can compute summaries data overlapping intervals. See examples bed_partition() timings vignette('benchmarks') @kriemo. Several explicit comparisons Bioconductor GenomicRanges library included users considering using valr. See examples .tbl_interval() timings vignette('benchmarks').","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-040","dir":"Changelog","previous_headings":"","what":"valr 0.4.0","title":"valr 0.4.0","text":"CRAN release: 2018-01-25","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-4-0","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.4.0","text":"relevant tests bedtool2 ported valr. Bugs identified corner cases new tests fixed (#328 @raysinesis) bed_jaccard() now works grouped inputs (#216) Update dplyr header files v0.7 bed_intersect() internal intersect_impl refactored enable return non-intersecting intervals. genome argument bed_makewindows() deprecated produce warning used. Also error handling added check warn intervals smaller requested window size makewindows_impl() (#312 @kriemo)","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-4-0","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"valr 0.4.0","text":"Fixed one error reported distances bed_closest(). Distances reported now bedtools closest behavior (#311). bed_glyph() accepts trbl_intervals named x y (#318). bed_makewindows() now returns number windows specified num_win input intervals evenly divisble num_win, consistent bedtools behavior. output findOverlaps() now sorted subtract_impl() prevent reporting intervals dropped calling bed_subtract() (#316 @kriemo)","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-031","dir":"Changelog","previous_headings":"","what":"valr 0.3.1","title":"valr 0.3.1","text":"CRAN release: 2017-07-22","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"enhancements-0-3-1","dir":"Changelog","previous_headings":"","what":"Enhancements","title":"valr 0.3.1","text":"manuscript describing valr published F1000Research. New S3 generic .tbl_interval() converts GenomicRanges::GRanges objects tbl_interval. New create_tss() creating transcription start sites. Improve documentation interval statistics complex examples.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-3-1","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.3.1","text":"bed_sort() de-deprecated reduce arrange calls library code.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-3-1","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"valr 0.3.1","text":"bed_merge() now reports start/end columns spec provided (#288)","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-030","dir":"Changelog","previous_headings":"","what":"valr 0.3.0","title":"valr 0.3.0","text":"CRAN release: 2017-06-15","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"enhancements-0-3-0","dir":"Changelog","previous_headings":"","what":"Enhancements","title":"valr 0.3.0","text":"New create_introns(), create_utrs5() create_utrs3() functions generating features BED12 files. Speed-ups bed_makewindows() (~50x), bed_merge() (~4x), bed_flank() (~4x) (thanks @kriemo @sheridar). Thanks sponsors Biofrontiers Hackathon caffeine underlying improvements.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-3-0","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"valr 0.3.0","text":"intervals bed_random() now sorted properly.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-020","dir":"Changelog","previous_headings":"","what":"valr 0.2.0","title":"valr 0.2.0","text":"CRAN release: 2017-05-05","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"major-changes-0-2-0","dir":"Changelog","previous_headings":"","what":"Major changes","title":"valr 0.2.0","text":"Package dplyr v0.5.0 headers valr remove dplyr LinkingTo dependency. bed_intersect() now accepts multiple tbls intersection (#220 @kriemo). new tbl_interval() tbl_genome() wrap tibbles enforce strict column naming. trbl_interval() trbl_genome() constructors take tibble::tribble() formatting .tbl_interval() .tbl_genome() used check valid classes.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-2-0","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.2.0","text":"intervals returned bed_random() sorted chrom start default.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-2-0","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"valr 0.2.0","text":"Merge intervals bed_jaccard() use numeric values calculation (fixes #204).","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-012","dir":"Changelog","previous_headings":"","what":"valr 0.1.2","title":"valr 0.1.2","text":"CRAN release: 2017-03-16","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"major-changes-0-1-2","dir":"Changelog","previous_headings":"","what":"Major changes","title":"valr 0.1.2","text":"Deprecate bed_sort() favor using dplyr::arrange() explicitly (fixes #134).","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-1-2","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.1.2","text":"add src/init.c calls R_registerRoutines R_useDynamicSymbols address NOTE r-devel Deprecate dist parameter bed_closest() favor using user supplied functions (#182 @kriemo) Make .id values sequential across chroms bed_cluster() output (#171) Transfer repository http://github.com/rnabioco/valr, update links docs. Move shiny app new repo (http://github.com/rnabioco/valrdata). Add Kent Riemondy LICENSE file.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-1-2","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"valr 0.1.2","text":"bed_merge() now merges contained intervals (#177)","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-011","dir":"Changelog","previous_headings":"","what":"valr 0.1.1","title":"valr 0.1.1","text":"CRAN release: 2016-12-01","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-1-1","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.1.1","text":"test / vignette guards Suggested RMySQL fixed memory leak absdist.cpp fixed vignette entry names","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-010","dir":"Changelog","previous_headings":"","what":"valr 0.1.0","title":"valr 0.1.0","text":"CRAN release: 2016-11-21","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"major-changes-0-1-0","dir":"Changelog","previous_headings":"","what":"Major changes","title":"valr 0.1.0","text":"initial release CRAN","code":""}] +[{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"our-pledge","dir":"","previous_headings":"","what":"Our Pledge","title":"Contributor Covenant Code of Conduct","text":"members, contributors, leaders pledge make participation community harassment-free experience everyone, regardless age, body size, visible invisible disability, ethnicity, sex characteristics, gender identity expression, level experience, education, socio-economic status, nationality, personal appearance, race, religion, sexual identity orientation. pledge act interact ways contribute open, welcoming, diverse, inclusive, healthy community.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"our-standards","dir":"","previous_headings":"","what":"Our Standards","title":"Contributor Covenant Code of Conduct","text":"Examples behavior contributes positive environment community include: Demonstrating empathy kindness toward people respectful differing opinions, viewpoints, experiences Giving gracefully accepting constructive feedback Accepting responsibility apologizing affected mistakes, learning experience Focusing best just us individuals, overall community Examples unacceptable behavior include: use sexualized language imagery, sexual attention advances kind Trolling, insulting derogatory comments, personal political attacks Public private harassment Publishing others’ private information, physical email address, without explicit permission conduct reasonably considered inappropriate professional setting","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"enforcement-responsibilities","dir":"","previous_headings":"","what":"Enforcement Responsibilities","title":"Contributor Covenant Code of Conduct","text":"Community leaders responsible clarifying enforcing standards acceptable behavior take appropriate fair corrective action response behavior deem inappropriate, threatening, offensive, harmful. Community leaders right responsibility remove, edit, reject comments, commits, code, wiki edits, issues, contributions aligned Code Conduct, communicate reasons moderation decisions appropriate.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"scope","dir":"","previous_headings":"","what":"Scope","title":"Contributor Covenant Code of Conduct","text":"Code Conduct applies within community spaces, also applies individual officially representing community public spaces. Examples representing community include using official e-mail address, posting via official social media account, acting appointed representative online offline event.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"enforcement","dir":"","previous_headings":"","what":"Enforcement","title":"Contributor Covenant Code of Conduct","text":"Instances abusive, harassing, otherwise unacceptable behavior may reported community leaders responsible enforcement [INSERT CONTACT METHOD]. complaints reviewed investigated promptly fairly. community leaders obligated respect privacy security reporter incident.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"enforcement-guidelines","dir":"","previous_headings":"","what":"Enforcement Guidelines","title":"Contributor Covenant Code of Conduct","text":"Community leaders follow Community Impact Guidelines determining consequences action deem violation Code Conduct:","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"id_1-correction","dir":"","previous_headings":"Enforcement Guidelines","what":"1. Correction","title":"Contributor Covenant Code of Conduct","text":"Community Impact: Use inappropriate language behavior deemed unprofessional unwelcome community. Consequence: private, written warning community leaders, providing clarity around nature violation explanation behavior inappropriate. public apology may requested.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"id_2-warning","dir":"","previous_headings":"Enforcement Guidelines","what":"2. Warning","title":"Contributor Covenant Code of Conduct","text":"Community Impact: violation single incident series actions. Consequence: warning consequences continued behavior. interaction people involved, including unsolicited interaction enforcing Code Conduct, specified period time. includes avoiding interactions community spaces well external channels like social media. Violating terms may lead temporary permanent ban.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"id_3-temporary-ban","dir":"","previous_headings":"Enforcement Guidelines","what":"3. Temporary Ban","title":"Contributor Covenant Code of Conduct","text":"Community Impact: serious violation community standards, including sustained inappropriate behavior. Consequence: temporary ban sort interaction public communication community specified period time. public private interaction people involved, including unsolicited interaction enforcing Code Conduct, allowed period. Violating terms may lead permanent ban.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"id_4-permanent-ban","dir":"","previous_headings":"Enforcement Guidelines","what":"4. Permanent Ban","title":"Contributor Covenant Code of Conduct","text":"Community Impact: Demonstrating pattern violation community standards, including sustained inappropriate behavior, harassment individual, aggression toward disparagement classes individuals. Consequence: permanent ban sort public interaction within community.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CODE_OF_CONDUCT.html","id":"attribution","dir":"","previous_headings":"","what":"Attribution","title":"Contributor Covenant Code of Conduct","text":"Code Conduct adapted Contributor Covenant, version 2.0, available https://www.contributor-covenant.org/version/2/0/ code_of_conduct.html. Community Impact Guidelines inspired Mozilla’s code conduct enforcement ladder. answers common questions code conduct, see FAQ https://www.contributor-covenant.org/faq. Translations available https:// www.contributor-covenant.org/translations.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CONTRIBUTING.html","id":null,"dir":"","previous_headings":"","what":"Contributing to valr","title":"Contributing to valr","text":"outlines propose change valr. detailed info contributing , tidyverse packages, please see development contributing guide.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CONTRIBUTING.html","id":"fixing-typos","dir":"","previous_headings":"","what":"Fixing typos","title":"Contributing to valr","text":"can fix typos, spelling mistakes, grammatical errors documentation directly using GitHub web interface, long changes made source file. generally means ’ll need edit roxygen2 comments .R, .Rd file. can find .R file generates .Rd reading comment first line.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CONTRIBUTING.html","id":"bigger-changes","dir":"","previous_headings":"","what":"Bigger changes","title":"Contributing to valr","text":"want make bigger change, ’s good idea first file issue make sure someone team agrees ’s needed. ’ve found bug, please file issue illustrates bug minimal reprex (also help write unit test, needed).","code":""},{"path":"https://rnabioco.github.io/valr/dev/CONTRIBUTING.html","id":"pull-request-process","dir":"","previous_headings":"Bigger changes","what":"Pull request process","title":"Contributing to valr","text":"Fork package clone onto computer. haven’t done , recommend using usethis::create_from_github(\"rnabioco/valr\", fork = TRUE). Install development dependences devtools::install_dev_deps(), make sure package passes R CMD check running devtools::check(). R CMD check doesn’t pass cleanly, ’s good idea ask help continuing. Create Git branch pull request (PR). recommend using usethis::pr_init(\"brief-description--change\"). Make changes, commit git, create PR running usethis::pr_push(), following prompts browser. title PR briefly describe change. body PR contain Fixes #issue-number. user-facing changes, add bullet top NEWS.md (.e. just first header). Follow style described https://style.tidyverse.org/news.html.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CONTRIBUTING.html","id":"code-style","dir":"","previous_headings":"Bigger changes","what":"Code style","title":"Contributing to valr","text":"New code follow tidyverse style guide. can use styler package apply styles, please don’t restyle code nothing PR. use roxygen2, Markdown syntax, documentation. use testthat unit tests. Contributions test cases included easier accept.","code":""},{"path":"https://rnabioco.github.io/valr/dev/CONTRIBUTING.html","id":"code-of-conduct","dir":"","previous_headings":"","what":"Code of Conduct","title":"Contributing to valr","text":"Please note valr project released Contributor Code Conduct. contributing project agree abide terms.","code":""},{"path":"https://rnabioco.github.io/valr/dev/LICENSE.html","id":null,"dir":"","previous_headings":"","what":"MIT License","title":"MIT License","text":"Copyright (c) 2016-2018 Jay R Hesselberth Kent Riemondy Permission hereby granted, free charge, person obtaining copy software associated documentation files (“Software”), deal Software without restriction, including without limitation rights use, copy, modify, merge, publish, distribute, sublicense, /sell copies Software, permit persons Software furnished , subject following conditions: copyright notice permission notice shall included copies substantial portions Software. SOFTWARE PROVIDED “”, WITHOUT WARRANTY KIND, EXPRESS IMPLIED, INCLUDING LIMITED WARRANTIES MERCHANTABILITY, FITNESS PARTICULAR PURPOSE NONINFRINGEMENT. EVENT SHALL AUTHORS COPYRIGHT HOLDERS LIABLE CLAIM, DAMAGES LIABILITY, WHETHER ACTION CONTRACT, TORT OTHERWISE, ARISING , CONNECTION SOFTWARE USE DEALINGS SOFTWARE.","code":""},{"path":"https://rnabioco.github.io/valr/dev/articles/interval-stats.html","id":"overview","dir":"Articles","previous_headings":"","what":"Overview","title":"Interval statistics","text":"valr includes several functions exploring statistical relationships sets intervals. Calculate significance overlaps sets intervals bed_fisher() bed_projection(). Quantify relative absolute distances sets intervals bed_reldist() bed_absdist(). Quantify extent overlap sets intervals bed_jaccard(). vignette explore relationship transcription start sites repetitive elements human genome.","code":"library(valr) library(dplyr) library(ggplot2) library(cowplot) library(tidyr) # load repeats and genes. Data in the valr package is restricted to chr22; the entire # files can be downloaded from UCSC. rpts <- read_bed(valr_example(\"hg19.rmsk.chr22.bed.gz\")) genes <- read_bed12(valr_example(\"hg19.refGene.chr22.bed.gz\")) # load chrom sizes genome <- read_genome(valr_example(\"hg19.chrom.sizes.gz\")) # create 1 bp intervals representing transcription start sites tss <- create_tss(genes) tss #> # A tibble: 1,267 × 6 #> chrom start end name score strand #> #> 1 chr22 16193008 16193009 NR_122113 0 - #> 2 chr22 16157078 16157079 NR_133911 0 + #> 3 chr22 16162065 16162066 NR_073459 0 + #> 4 chr22 16162065 16162066 NR_073460 0 + #> 5 chr22 16231288 16231289 NR_132385 0 - #> 6 chr22 16287936 16287937 NM_001136213 0 - #> 7 chr22 16274608 16274609 NR_046571 0 + #> 8 chr22 16449803 16449804 NM_001005239 0 - #> 9 chr22 17073699 17073700 NM_014406 0 - #> 10 chr22 17082800 17082801 NR_001591 0 + #> # ℹ 1,257 more rows"},{"path":"https://rnabioco.github.io/valr/dev/articles/interval-stats.html","id":"distance-metrics","dir":"Articles","previous_headings":"","what":"Distance metrics","title":"Interval statistics","text":"First define function takes x y intervals computes distance statistics (using bed_reldist() bed_absdist()) specified groups. value statistic assigned .value column. use distance_stats() function apply bed_absdist() function group data. done set shuffled group data. bed_shuffle() used shuffle coordinates repeats within chromosome (.e., coordinates change, chromosome stays .) Now can bind observed shuffled data together, tidying put data format appropriate statistical test. involves: unnest()ing data frames creating groups repeat (name), stat (reldist absdist) type (obs shf) adding unique surrogate row numbers group using tidyr::pivot_wider() create two new obs shuf columns removing rows NA values. Now data formatted, can use non-parametric ks.test() determine whether significant differences observed shuffled data group. broom::tidy() used reformat results test tibble, results test pivoted type column test type. Histgrams different stats help visualize distribution p.values. can also assess false discovery rates (q.values) using p.adjust(). Finally can visualize results using stat_ecdf().","code":"distance_stats <- function(x, y, genome, group_var, type = NA) { group_by(x, !!rlang::sym(group_var)) |> do( reldist = bed_reldist(., y, detail = TRUE) |> select(.value = .reldist), absdist = bed_absdist(., y, genome) |> select(.value = .absdist) ) |> tidyr::pivot_longer( cols = -name, names_to = \"stat\", values_to = \"value\" ) |> mutate(type = type) } obs_stats <- distance_stats(rpts, tss, genome, \"name\", \"obs\") obs_stats #> # A tibble: 2,106 × 4 #> name stat value type #> #> 1 (A)n reldist obs #> 2 (A)n absdist obs #> 3 (AAAAACA)n reldist obs #> 4 (AAAAACA)n absdist obs #> 5 (AAAAC)n reldist obs #> 6 (AAAAC)n absdist obs #> 7 (AAAAG)n reldist obs #> 8 (AAAAG)n absdist obs #> 9 (AAAAT)n reldist obs #> 10 (AAAAT)n absdist obs #> # ℹ 2,096 more rows shfs <- bed_shuffle(rpts, genome, within = TRUE) shf_stats <- distance_stats(shfs, tss, genome, \"name\", \"shuf\") res <- bind_rows(obs_stats, shf_stats) |> tidyr::unnest(value) |> group_by(name, stat, type) |> mutate(.id = row_number()) |> tidyr::pivot_wider( names_from = \"type\", values_from = \".value\" ) |> na.omit() res #> # A tibble: 16,801 × 5 #> # Groups: name, stat [1,925] #> name stat .id obs shuf #> #> 1 (A)n reldist 1 0.363 0.255 #> 2 (A)n reldist 2 0.429 0.0207 #> 3 (A)n reldist 3 0.246 0.280 #> 4 (A)n reldist 4 0.478 0.110 #> 5 (A)n reldist 5 0.260 0.111 #> 6 (A)n reldist 6 0.286 0.0557 #> 7 (A)n reldist 7 0.498 0.0302 #> 8 (A)n reldist 8 0.237 0.217 #> 9 (A)n reldist 9 0.314 0.00127 #> 10 (A)n reldist 10 0.149 0.466 #> # ℹ 16,791 more rows library(broom) pvals <- res |> do( twosided = tidy(ks.test(.$obs, .$shuf)), less = tidy(ks.test(.$obs, .$shuf, alternative = \"less\")), greater = tidy(ks.test(.$obs, .$shuf, alternative = \"greater\")) ) |> tidyr::pivot_longer(cols = -c(name, stat), names_to = \"alt\", values_to = \"type\") |> unnest(type) |> select(name:p.value) |> arrange(p.value) ggplot(pvals, aes(p.value)) + geom_histogram(binwidth = 0.05) + facet_grid(stat ~ alt) + theme_cowplot() pvals <- group_by(pvals, stat, alt) |> mutate(q.value = p.adjust(p.value)) |> ungroup() |> arrange(q.value) res_gather <- tidyr::pivot_longer(res, cols = -c(name, stat, .id), names_to = \"type\", values_to = \"value\" ) signif <- head(pvals, 5) res_signif <- signif |> left_join(res_gather, by = c(\"name\", \"stat\")) #> Warning in left_join(signif, res_gather, by = c(\"name\", \"stat\")): Detected an unexpected many-to-many relationship between `x` and `y`. #> ℹ Row 1 of `x` matches multiple rows in `y`. #> ℹ Row 29107 of `y` matches multiple rows in `x`. #> ℹ If a many-to-many relationship is expected, set `relationship = #> \"many-to-many\"` to silence this warning. ggplot(res_signif, aes(x = value, color = type)) + stat_ecdf() + facet_grid(stat ~ name) + theme_cowplot() + scale_x_log10() + scale_color_brewer(palette = \"Set1\")"},{"path":"https://rnabioco.github.io/valr/dev/articles/interval-stats.html","id":"projection-test","dir":"Articles","previous_headings":"","what":"Projection test","title":"Interval statistics","text":"bed_projection() statistical approach assess relationship two intervals based binomial distribution. , examine distribution repetitive elements within promoters coding non-coding genes. First ’ll extract 5 kb regions upstream transcription start sites represent promoter regions coding non-coding genes. Next ’ll apply bed_projection() test repeat class coding non-coding regions. projection test two-tailed statistical test. significant p-value indicates either enrichment depletion query intervals compared reference interval sets. value lower_tail = TRUE column indicates query intervals depleted, whereas lower_tail = FALSE indicates query intervals enriched.","code":"# create intervals 5kb upstream of tss representing promoters promoters <- bed_flank(genes, genome, left = 5000, strand = TRUE) |> mutate(name = ifelse(grepl(\"NR_\", name), \"non-coding\", \"coding\")) |> select(chrom:strand) # select coding and non-coding promoters promoters_coding <- filter(promoters, name == \"coding\") promoters_ncoding <- filter(promoters, name == \"non-coding\") promoters_coding #> # A tibble: 973 × 6 #> chrom start end name score strand #> #> 1 chr22 16287937 16292937 coding 0 - #> 2 chr22 16449804 16454804 coding 0 - #> 3 chr22 17073700 17078700 coding 0 - #> 4 chr22 17302589 17307589 coding 0 - #> 5 chr22 17302589 17307589 coding 0 - #> 6 chr22 17489112 17494112 coding 0 - #> 7 chr22 17560848 17565848 coding 0 + #> 8 chr22 17560848 17565848 coding 0 + #> 9 chr22 17602213 17607213 coding 0 - #> 10 chr22 17602257 17607257 coding 0 - #> # ℹ 963 more rows promoters_ncoding #> # A tibble: 294 × 6 #> chrom start end name score strand #> #> 1 chr22 16152078 16157078 non-coding 0 + #> 2 chr22 16157065 16162065 non-coding 0 + #> 3 chr22 16157065 16162065 non-coding 0 + #> 4 chr22 16193009 16198009 non-coding 0 - #> 5 chr22 16231289 16236289 non-coding 0 - #> 6 chr22 16269608 16274608 non-coding 0 + #> 7 chr22 17077800 17082800 non-coding 0 + #> 8 chr22 17156430 17161430 non-coding 0 - #> 9 chr22 17229328 17234328 non-coding 0 - #> 10 chr22 17303363 17308363 non-coding 0 + #> # ℹ 284 more rows # function to apply bed_projection to groups projection_stats <- function(x, y, genome, group_var, type = NA) { group_by(x, !!rlang::sym(group_var)) |> do( n_repeats = nrow(.), projection = bed_projection(., y, genome) ) |> mutate(type = type) } pvals_coding <- projection_stats(rpts, promoters_coding, genome, \"name\", \"coding\") pvals_ncoding <- projection_stats(rpts, promoters_ncoding, genome, \"name\", \"non_coding\") pvals <- bind_rows(pvals_ncoding, pvals_coding) |> ungroup() |> tidyr::unnest(cols = c(n_repeats, projection)) |> select(-chrom) # filter for repeat classes with at least 10 intervals pvals <- filter( pvals, n_repeats > 10, obs_exp_ratio != 0 ) # adjust pvalues pvals <- mutate(pvals, q.value = p.adjust(p.value)) pvals #> # A tibble: 179 × 7 #> name n_repeats p.value obs_exp_ratio lower_tail type q.value #> #> 1 (A)n 28 0.00353 4.72 FALSE non_coding 0.558 #> 2 (AT)n 48 0.298 0.917 FALSE non_coding 1 #> 3 (CA)n 31 0.156 1.42 FALSE non_coding 1 #> 4 (GT)n 42 0.247 1.05 FALSE non_coding 1 #> 5 (T)n 61 0.405 0.721 FALSE non_coding 1 #> 6 (TG)n 40 0.0622 2.20 FALSE non_coding 1 #> 7 A-rich 54 0.348 0.815 FALSE non_coding 1 #> 8 Alu 15 0.0446 2.93 FALSE non_coding 1 #> 9 AluJb 271 0.0225 1.79 FALSE non_coding 1 #> 10 AluJo 208 0.0216 1.90 FALSE non_coding 1 #> # ℹ 169 more rows library(DT) # find and show top 5 most significant repeats signif_tests <- pvals |> arrange(q.value) |> group_by(type) |> top_n(-5, q.value) |> arrange(type) DT::datatable(signif_tests)"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"familiar-tools-natively-in-r","dir":"Articles","previous_headings":"","what":"Familiar tools, natively in R","title":"valr overview","text":"functions valr similar names BEDtools counterparts, familiar users coming BEDtools suite. Similar pybedtools, valr terse syntax:","code":"library(valr) library(dplyr) snps <- read_bed(valr_example(\"hg19.snps147.chr22.bed.gz\")) genes <- read_bed(valr_example(\"genes.hg19.chr22.bed.gz\")) # find snps in intergenic regions intergenic <- bed_subtract(snps, genes) # distance from intergenic snps to nearest gene nearby <- bed_closest(intergenic, genes) nearby |> select(starts_with(\"name\"), .overlap, .dist) |> filter(abs(.dist) < 1000) #> # A tibble: 285 × 4 #> name.x name.y .overlap .dist #> #> 1 rs2261631 P704P 0 -268 #> 2 rs570770556 POTEH 0 -913 #> 3 rs538163832 POTEH 0 -953 #> 4 rs9606135 TPTEP1 0 -422 #> 5 rs11912392 ANKRD62P1-PARP4P3 0 105 #> 6 rs8136454 BC038197 0 356 #> 7 rs5992556 XKR3 0 -456 #> 8 rs114101676 GAB4 0 474 #> 9 rs62236167 CECR7 0 262 #> 10 rs5747023 CECR1 0 -387 #> # ℹ 275 more rows"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"input-data","dir":"Articles","previous_headings":"","what":"Input data","title":"valr overview","text":"valr assigns common column names facilitate comparisons tbls. tbls chrom, start, end columns, tbls multi-column formats additional pre-determined column names. See read_bed() documentation details. valr can also operate BED-like data.frames already constructed R, provided columns named chrom, start end present. New tbls can also constructed either tibbles base R data.frames.","code":"bed_file <- valr_example(\"3fields.bed.gz\") read_bed(bed_file) # accepts filepaths or URLs #> # A tibble: 10 × 3 #> chrom start end #> #> 1 chr1 11873 14409 #> 2 chr1 14361 19759 #> 3 chr1 14406 29370 #> 4 chr1 34610 36081 #> 5 chr1 69090 70008 #> 6 chr1 134772 140566 #> 7 chr1 321083 321115 #> 8 chr1 321145 321207 #> 9 chr1 322036 326938 #> 10 chr1 327545 328439 bed <- tribble( ~chrom, ~start, ~end, \"chr1\", 1657492, 2657492, \"chr2\", 2501324, 3094650 ) bed #> # A tibble: 2 × 3 #> chrom start end #> #> 1 chr1 1657492 2657492 #> 2 chr2 2501324 3094650"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"interval-coordinates","dir":"Articles","previous_headings":"","what":"Interval coordinates","title":"valr overview","text":"valr adheres BED format specifies start position interval zero based end position one-based. first position chromosome 0. end position chromosome one position passed last base, included interval. example:","code":"# a chromosome 100 basepairs in length chrom <- tribble( ~chrom, ~start, ~end, \"chr1\", 0, 100 ) chrom #> # A tibble: 1 × 3 #> chrom start end #> #> 1 chr1 0 100 # single base-pair intervals bases <- tribble( ~chrom, ~start, ~end, \"chr1\", 0, 1, # first base of chromosome \"chr1\", 1, 2, # second base of chromosome \"chr1\", 99, 100 # last base of chromosome ) bases #> # A tibble: 3 × 3 #> chrom start end #> #> 1 chr1 0 1 #> 2 chr1 1 2 #> 3 chr1 99 100"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"remote-databases","dir":"Articles","previous_headings":"","what":"Remote databases","title":"valr overview","text":"Remote databases can accessed db_ucsc() (access UCSC Browser) db_ensembl() (access Ensembl databases).","code":"# access the `refGene` tbl on the `hg38` assembly. if (require(RMariaDB)) { ucsc <- db_ucsc(\"hg38\") tbl(ucsc, \"refGene\") }"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"visual-documentation","dir":"Articles","previous_headings":"","what":"Visual documentation","title":"valr overview","text":"bed_glyph() tool illustrates results operations valr, similar found BEDtools documentation. glyph shows result intersecting x y intervals bed_intersect(): glyph illustrates bed_merge():","code":"x <- tribble( ~chrom, ~start, ~end, \"chr1\", 25, 50, \"chr1\", 100, 125 ) y <- tribble( ~chrom, ~start, ~end, \"chr1\", 30, 75 ) bed_glyph(bed_intersect(x, y)) x <- tribble( ~chrom, ~start, ~end, \"chr1\", 1, 50, \"chr1\", 10, 75, \"chr1\", 100, 120 ) bed_glyph(bed_merge(x))"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"grouping-data","dir":"Articles","previous_headings":"","what":"Grouping data","title":"valr overview","text":"group_by function dplyr can used perform functions subsets single multiple data_frames. Functions valr leverage grouping enable variety comparisons. example, intervals can grouped strand perform comparisons among intervals strand. Comparisons intervals opposite strands done using flip_strands() function: single set (e.g. bed_merge()) multi set operations respect groupings input intervals.","code":"x <- tribble( ~chrom, ~start, ~end, ~strand, \"chr1\", 1, 100, \"+\", \"chr1\", 50, 150, \"+\", \"chr2\", 100, 200, \"-\" ) y <- tribble( ~chrom, ~start, ~end, ~strand, \"chr1\", 50, 125, \"+\", \"chr1\", 50, 150, \"-\", \"chr2\", 50, 150, \"+\" ) # intersect tbls by strand x <- group_by(x, strand) y <- group_by(y, strand) bed_intersect(x, y) #> # A tibble: 2 × 8 #> chrom start.x end.x strand.x start.y end.y strand.y .overlap #> #> 1 chr1 1 100 + 50 125 + 50 #> 2 chr1 50 150 + 50 125 + 75 x <- group_by(x, strand) y <- flip_strands(y) y <- group_by(y, strand) bed_intersect(x, y) #> # A tibble: 3 × 8 #> chrom start.x end.x strand.x start.y end.y strand.y .overlap #> #> 1 chr1 1 100 + 50 150 + 50 #> 2 chr1 50 150 + 50 150 + 100 #> 3 chr2 100 200 - 50 150 - 50"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"column-specification","dir":"Articles","previous_headings":"","what":"Column specification","title":"valr overview","text":"Columns BEDtools referred position: valr, columns referred name can used multiple name/value expressions summaries.","code":"# calculate the mean of column 6 for intervals in `b` that overlap with `a` bedtools map -a a.bed -b b.bed -c 6 -o mean # calculate the mean and variance for a `value` column bed_map(a, b, .mean = mean(value), .var = var(value)) # report concatenated and max values for merged intervals bed_merge(a, .concat = concat(value), .max = max(value))"},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"meta-analysis","dir":"Articles","previous_headings":"Getting started","what":"Meta-analysis","title":"valr overview","text":"demonstration illustrates use valr tools perform “meta-analysis” signals relative genomic features. analyze distribution histone marks surrounding transcription start sites. First load libraries relevant data. generate 1 bp intervals represent transcription start sites (TSSs). focus + strand genes, - genes easily accommodated filtering using bed_makewindows() reversed window numbers. Now use .win_id group bed_map() calculate sum mapping y signals onto intervals x. data regrouped .win_id summary mean sd values calculated. Finally, summary statistics used construct plot illustrates histone density surrounding TSSs.","code":"# `valr_example()` identifies the path of example files bedfile <- valr_example(\"genes.hg19.chr22.bed.gz\") genomefile <- valr_example(\"hg19.chrom.sizes.gz\") bgfile <- valr_example(\"hela.h3k4.chip.bg.gz\") genes <- read_bed(bedfile) genome <- read_genome(genomefile) y <- read_bedgraph(bgfile) # generate 1 bp TSS intervals, `+` strand only tss <- genes |> filter(strand == \"+\") |> mutate(end = start + 1) # 1000 bp up and downstream region_size <- 1000 # 50 bp windows win_size <- 50 # add slop to the TSS, break into windows and add a group x <- tss |> bed_slop(genome, both = region_size) |> bed_makewindows(win_size) x #> # A tibble: 13,530 × 7 #> chrom start end name score strand .win_id #> #> 1 chr22 16161065 16161115 LINC00516 3 + 1 #> 2 chr22 16161115 16161165 LINC00516 3 + 2 #> 3 chr22 16161165 16161215 LINC00516 3 + 3 #> 4 chr22 16161215 16161265 LINC00516 3 + 4 #> 5 chr22 16161265 16161315 LINC00516 3 + 5 #> 6 chr22 16161315 16161365 LINC00516 3 + 6 #> 7 chr22 16161365 16161415 LINC00516 3 + 7 #> 8 chr22 16161415 16161465 LINC00516 3 + 8 #> 9 chr22 16161465 16161515 LINC00516 3 + 9 #> 10 chr22 16161515 16161565 LINC00516 3 + 10 #> # ℹ 13,520 more rows # map signals to TSS regions and calculate summary statistics. res <- bed_map(x, y, win_sum = sum(value, na.rm = TRUE)) |> group_by(.win_id) |> summarize( win_mean = mean(win_sum, na.rm = TRUE), win_sd = sd(win_sum, na.rm = TRUE) ) res #> # A tibble: 41 × 3 #> .win_id win_mean win_sd #> #> 1 1 101. 85.8 #> 2 2 111. 81.1 #> 3 3 123. 99.1 #> 4 4 116. 96.3 #> 5 5 116. 102. #> 6 6 125. 95.1 #> 7 7 123. 94.4 #> 8 8 128. 91.5 #> 9 9 130. 95.7 #> 10 10 130. 88.8 #> # ℹ 31 more rows x_labels <- seq( -region_size, region_size, by = win_size * 5 ) x_breaks <- seq(1, 41, by = 5) sd_limits <- aes( ymax = win_mean + win_sd, ymin = win_mean - win_sd ) ggplot( res, aes( x = .win_id, y = win_mean ) ) + geom_point() + geom_pointrange(sd_limits) + scale_x_continuous( labels = x_labels, breaks = x_breaks ) + labs( x = \"Position (bp from TSS)\", y = \"Signal\", title = \"Human H3K4me3 signal near transcription start sites\" ) + theme_classic()"},{"path":"https://rnabioco.github.io/valr/dev/articles/valr.html","id":"related-work","dir":"Articles","previous_headings":"","what":"Related work","title":"valr overview","text":"Command-line tools BEDtools bedops. Python library pybedtools wraps BEDtools. R packages GenomicRanges, bedr, IRanges GenometriCorr provide similar capability different philosophy.","code":""},{"path":"https://rnabioco.github.io/valr/dev/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Jay Hesselberth. Author. Kent Riemondy. Author, maintainer. . Funder, copyright holder.","code":""},{"path":"https://rnabioco.github.io/valr/dev/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Riemondy KA, Sheridan RM, Gillen , Yu Y, Bennett CG, Hesselberth JR (2017). “valr: Reproducible Genome Interval Arithmetic R.” F1000Research. doi:10.12688/f1000research.11997.1.","code":"@Article{, title = {valr: Reproducible Genome Interval Arithmetic in R}, year = {2017}, author = {Kent A. Riemondy and Ryan M. Sheridan and Austin Gillen and Yinni Yu and Christopher G. Bennett and Jay R. Hesselberth}, journal = {F1000Research}, doi = {10.12688/f1000research.11997.1}, }"},{"path":"https://rnabioco.github.io/valr/dev/index.html","id":"valr-","dir":"","previous_headings":"","what":"Genome Interval Arithmetic","title":"Genome Interval Arithmetic","text":"valr provides tools read manipulate genome intervals signals, similar BEDtools suite.","code":""},{"path":"https://rnabioco.github.io/valr/dev/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"Genome Interval Arithmetic","text":"latest stable version can installed CRAN: latest development version can installed github:","code":"install.packages('valr') # install.packages(\"devtools\") devtools::install_github('rnabioco/valr')"},{"path":"https://rnabioco.github.io/valr/dev/index.html","id":"valr-example","dir":"","previous_headings":"","what":"valr Example","title":"Genome Interval Arithmetic","text":"Functions valr similar names BEDtools counterparts, familiar users coming BEDtools suite. Unlike tools wrap BEDtools write temporary files disk, valr tools run natively memory. Similar pybedtools, valr terse syntax:","code":"library(valr) library(dplyr) snps <- read_bed(valr_example(\"hg19.snps147.chr22.bed.gz\")) genes <- read_bed(valr_example(\"genes.hg19.chr22.bed.gz\")) # find snps in intergenic regions intergenic <- bed_subtract(snps, genes) # find distance from intergenic snps to nearest gene nearby <- bed_closest(intergenic, genes) nearby |> select(starts_with(\"name\"), .overlap, .dist) |> filter(abs(.dist) < 5000) #> # A tibble: 1,047 × 4 #> name.x name.y .overlap .dist #> #> 1 rs530458610 P704P 0 2579 #> 2 rs2261631 P704P 0 -268 #> 3 rs570770556 POTEH 0 -913 #> 4 rs538163832 POTEH 0 -953 #> 5 rs190224195 POTEH 0 -1399 #> 6 rs2379966 DQ571479 0 4750 #> 7 rs142687051 DQ571479 0 3558 #> 8 rs528403095 DQ571479 0 3309 #> 9 rs555126291 DQ571479 0 2745 #> 10 rs5747567 DQ571479 0 -1778 #> # ℹ 1,037 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed12_to_exons.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert BED12 to individual exons in BED6. — bed12_to_exons","title":"Convert BED12 to individual exons in BED6. — bed12_to_exons","text":"conversion BED6 format, score column contains exon number, respect strand (.e., first exon - strand genes larger start end coordinates).","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed12_to_exons.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert BED12 to individual exons in BED6. — bed12_to_exons","text":"","code":"bed12_to_exons(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed12_to_exons.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert BED12 to individual exons in BED6. — bed12_to_exons","text":"x ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed12_to_exons.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convert BED12 to individual exons in BED6. — bed12_to_exons","text":"","code":"x <- read_bed12(valr_example(\"mm9.refGene.bed.gz\")) bed12_to_exons(x) #> # A tibble: 1,683 × 6 #> chrom start end name score strand #> #> 1 chr1 3204562 3207049 NM_001011874 3 - #> 2 chr1 3411782 3411982 NM_001011874 2 - #> 3 chr1 3660632 3661579 NM_001011874 1 - #> 4 chr1 4280926 4283093 NM_001195662 4 - #> 5 chr1 4341990 4342162 NM_001195662 3 - #> 6 chr1 4342282 4342918 NM_001195662 2 - #> 7 chr1 4399250 4399322 NM_001195662 1 - #> 8 chr1 4847774 4848057 NM_001159750 1 + #> 9 chr1 4847774 4848057 NM_011541 1 + #> 10 chr1 4848408 4848584 NM_001159751 1 + #> # ℹ 1,673 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_absdist.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute absolute distances between intervals. — bed_absdist","title":"Compute absolute distances between intervals. — bed_absdist","text":"Computes absolute distance midpoint x interval midpoints closest y interval.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_absdist.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute absolute distances between intervals. — bed_absdist","text":"","code":"bed_absdist(x, y, genome)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_absdist.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute absolute distances between intervals. — bed_absdist","text":"x ivl_df y ivl_df genome genome_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_absdist.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute absolute distances between intervals. — bed_absdist","text":"ivl_df .absdist .absdist_scaled columns.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_absdist.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Compute absolute distances between intervals. — bed_absdist","text":"Absolute distances scaled inter-reference gap chromosome follows. Q query points R reference points chromosome, scale distance query point closest reference point inter-reference gap chromosome. x interval matching y chromosome, .absdist NA. $$d_i(x,y) = min_k(|q_i - r_k|)\\frac{R}{Length\\ \\ chromosome}$$ absolute scaled distances reported .absdist .absdist_scaled. Interval statistics can used combination dplyr::group_by() dplyr::() calculate statistics subsets data. See vignette('interval-stats') examples.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_absdist.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compute absolute distances between intervals. — bed_absdist","text":"","code":"genome <- read_genome(valr_example(\"hg19.chrom.sizes.gz\")) x <- bed_random(genome, seed = 1010486) y <- bed_random(genome, seed = 9203911) bed_absdist(x, y, genome) #> # A tibble: 1,000,000 × 5 #> chrom start end .absdist .absdist_scaled #> #> 1 chr1 5184 6184 1392 0.448 #> 2 chr1 7663 8663 1087 0.350 #> 3 chr1 9858 10858 1526 0.491 #> 4 chr1 13805 14805 2421 0.779 #> 5 chr1 14081 15081 2697 0.868 #> 6 chr1 16398 17398 1700 0.547 #> 7 chr1 17486 18486 612 0.197 #> 8 chr1 22063 23063 466 0.150 #> 9 chr1 22494 23494 897 0.289 #> 10 chr1 29351 30351 1143 0.368 #> # ℹ 999,990 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_closest.html","id":null,"dir":"Reference","previous_headings":"","what":"Identify closest intervals. — bed_closest","title":"Identify closest intervals. — bed_closest","text":"Identify closest intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_closest.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Identify closest intervals. — bed_closest","text":"","code":"bed_closest(x, y, overlap = TRUE, suffix = c(\".x\", \".y\"))"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_closest.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Identify closest intervals. — bed_closest","text":"x ivl_df y ivl_df overlap report overlapping intervals suffix colname suffixes output","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_closest.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Identify closest intervals. — bed_closest","text":"ivl_df additional columns: .overlap amount overlap overlapping interval. Non-overlapping adjacent intervals overlap 0. .overlap included output overlap = FALSE. .dist distance closest interval. Negative distances denote upstream intervals. Book-ended intervals distance 1.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_closest.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Identify closest intervals. — bed_closest","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_closest.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Identify closest intervals. — bed_closest","text":"interval x bed_closest() returns overlapping intervals y closest non-intersecting y interval. Setting overlap = FALSE report closest non-intersecting y intervals, ignoring overlapping y intervals.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_closest.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Identify closest intervals. — bed_closest","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 100, 125 ) y <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 25, 50, \"chr1\", 140, 175 ) bed_glyph(bed_closest(x, y)) x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 500, 600, \"chr2\", 5000, 6000 ) y <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 100, 200, \"chr1\", 150, 200, \"chr1\", 550, 580, \"chr2\", 7000, 8500 ) bed_closest(x, y) #> # A tibble: 4 × 7 #> chrom start.x end.x start.y end.y .overlap .dist #> #> 1 chr1 500 600 550 580 30 0 #> 2 chr1 500 600 100 200 0 -301 #> 3 chr1 500 600 150 200 0 -301 #> 4 chr2 5000 6000 7000 8500 0 1001 bed_closest(x, y, overlap = FALSE) #> # A tibble: 3 × 6 #> chrom start.x end.x start.y end.y .dist #> #> 1 chr1 500 600 100 200 -301 #> 2 chr1 500 600 150 200 -301 #> 3 chr2 5000 6000 7000 8500 1001 # Report distance based on strand x <- tibble::tribble( ~chrom, ~start, ~end, ~name, ~score, ~strand, \"chr1\", 10, 20, \"a\", 1, \"-\" ) y <- tibble::tribble( ~chrom, ~start, ~end, ~name, ~score, ~strand, \"chr1\", 8, 9, \"b\", 1, \"+\", \"chr1\", 21, 22, \"b\", 1, \"-\" ) res <- bed_closest(x, y) # convert distance based on strand res$.dist_strand <- ifelse(res$strand.x == \"+\", res$.dist, -(res$.dist)) res #> # A tibble: 2 × 14 #> chrom start.x end.x name.x score.x strand.x start.y end.y name.y score.y #> #> 1 chr1 10 20 a 1 - 21 22 b 1 #> 2 chr1 10 20 a 1 - 8 9 b 1 #> # ℹ 4 more variables: strand.y , .overlap , .dist , #> # .dist_strand # report absolute distances res$.abs_dist <- abs(res$.dist) res #> # A tibble: 2 × 15 #> chrom start.x end.x name.x score.x strand.x start.y end.y name.y score.y #> #> 1 chr1 10 20 a 1 - 21 22 b 1 #> 2 chr1 10 20 a 1 - 8 9 b 1 #> # ℹ 5 more variables: strand.y , .overlap , .dist , #> # .dist_strand , .abs_dist "},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_cluster.html","id":null,"dir":"Reference","previous_headings":"","what":"Cluster neighboring intervals. — bed_cluster","title":"Cluster neighboring intervals. — bed_cluster","text":"output .id column can used downstream grouping operations. Default max_dist = 0 means overlapping book-ended intervals clustered.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_cluster.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Cluster neighboring intervals. — bed_cluster","text":"","code":"bed_cluster(x, max_dist = 0)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_cluster.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Cluster neighboring intervals. — bed_cluster","text":"x ivl_df max_dist maximum distance clustered intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_cluster.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Cluster neighboring intervals. — bed_cluster","text":"ivl_df .id column specifying sets clustered intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_cluster.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Cluster neighboring intervals. — bed_cluster","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_cluster.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Cluster neighboring intervals. — bed_cluster","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 100, 200, \"chr1\", 180, 250, \"chr1\", 250, 500, \"chr1\", 501, 1000, \"chr2\", 1, 100, \"chr2\", 150, 200 ) bed_cluster(x) #> # A tibble: 6 × 4 #> chrom start end .id #> #> 1 chr1 100 200 1 #> 2 chr1 180 250 1 #> 3 chr1 250 500 1 #> 4 chr1 501 1000 2 #> 5 chr2 1 100 3 #> 6 chr2 150 200 4 # glyph illustrating clustering of overlapping and book-ended intervals x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 1, 10, \"chr1\", 5, 20, \"chr1\", 30, 40, \"chr1\", 40, 50, \"chr1\", 80, 90 ) bed_glyph(bed_cluster(x), label = \".id\")"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_complement.html","id":null,"dir":"Reference","previous_headings":"","what":"Identify intervals in a genome not covered by a query. — bed_complement","title":"Identify intervals in a genome not covered by a query. — bed_complement","text":"Identify intervals genome covered query.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_complement.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Identify intervals in a genome not covered by a query. — bed_complement","text":"","code":"bed_complement(x, genome)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_complement.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Identify intervals in a genome not covered by a query. — bed_complement","text":"x ivl_df genome ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_complement.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Identify intervals in a genome not covered by a query. — bed_complement","text":"ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_complement.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Identify intervals in a genome not covered by a query. — bed_complement","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 0, 10, \"chr1\", 75, 100 ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 200 ) bed_glyph(bed_complement(x, genome)) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 500, \"chr2\", 600, \"chr3\", 800 ) x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 100, 300, \"chr1\", 200, 400, \"chr2\", 0, 100, \"chr2\", 200, 400, \"chr3\", 500, 600 ) # intervals not covered by x bed_complement(x, genome) #> # A tibble: 6 × 3 #> chrom start end #> #> 1 chr1 0 100 #> 2 chr1 400 500 #> 3 chr2 100 200 #> 4 chr2 400 600 #> 5 chr3 0 500 #> 6 chr3 600 800"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_coverage.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute coverage of intervals. — bed_coverage","title":"Compute coverage of intervals. — bed_coverage","text":"Compute coverage intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_coverage.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute coverage of intervals. — bed_coverage","text":"","code":"bed_coverage(x, y, ...)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_coverage.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute coverage of intervals. — bed_coverage","text":"x ivl_df y ivl_df ... extra arguments (used)","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_coverage.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute coverage of intervals. — bed_coverage","text":"ivl_df following additional columns: .ints number x intersections .cov per-base coverage x intervals .len total length y intervals covered x intervals .frac .len scaled number y intervals","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_coverage.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Compute coverage of intervals. — bed_coverage","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_coverage.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Compute coverage of intervals. — bed_coverage","text":"Book-ended intervals included coverage calculations.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_coverage.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compute coverage of intervals. — bed_coverage","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, ~strand, \"chr1\", 100, 500, \"+\", \"chr2\", 200, 400, \"+\", \"chr2\", 300, 500, \"-\", \"chr2\", 800, 900, \"-\" ) y <- tibble::tribble( ~chrom, ~start, ~end, ~value, ~strand, \"chr1\", 150, 400, 100, \"+\", \"chr1\", 500, 550, 100, \"+\", \"chr2\", 230, 430, 200, \"-\", \"chr2\", 350, 430, 300, \"-\" ) bed_coverage(x, y) #> # A tibble: 4 × 8 #> chrom start end strand .ints .cov .len .frac #> #> 1 chr1 100 500 + 2 250 400 0.625 #> 2 chr2 200 400 + 2 170 200 0.85 #> 3 chr2 300 500 - 2 130 200 0.65 #> 4 chr2 800 900 - 0 0 100 0"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_fisher.html","id":null,"dir":"Reference","previous_headings":"","what":"Fisher's test to measure overlap between two sets of intervals. — bed_fisher","title":"Fisher's test to measure overlap between two sets of intervals. — bed_fisher","text":"Calculate Fisher's test number intervals shared unique two sets x y intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_fisher.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fisher's test to measure overlap between two sets of intervals. — bed_fisher","text":"","code":"bed_fisher(x, y, genome)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_fisher.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fisher's test to measure overlap between two sets of intervals. — bed_fisher","text":"x ivl_df y ivl_df genome genome_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_fisher.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fisher's test to measure overlap between two sets of intervals. — bed_fisher","text":"ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_fisher.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fisher's test to measure overlap between two sets of intervals. — bed_fisher","text":"Interval statistics can used combination dplyr::group_by() dplyr::() calculate statistics subsets data. See vignette('interval-stats') examples.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_fisher.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fisher's test to measure overlap between two sets of intervals. — bed_fisher","text":"","code":"genome <- read_genome(valr_example(\"hg19.chrom.sizes.gz\")) x <- bed_random(genome, n = 1e4, seed = 1010486) y <- bed_random(genome, n = 1e4, seed = 9203911) bed_fisher(x, y, genome) #> # A tibble: 1 × 6 #> estimate p.value conf.low conf.high method alternative #> #> 1 0.945 0.707 0.722 1.22 Fisher's Exact Test for… two.sided"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_flank.html","id":null,"dir":"Reference","previous_headings":"","what":"Create flanking intervals from input intervals. — bed_flank","title":"Create flanking intervals from input intervals. — bed_flank","text":"Create flanking intervals input intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_flank.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create flanking intervals from input intervals. — bed_flank","text":"","code":"bed_flank( x, genome, both = 0, left = 0, right = 0, fraction = FALSE, strand = FALSE, trim = FALSE, ... )"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_flank.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create flanking intervals from input intervals. — bed_flank","text":"x ivl_df genome genome_df number bases sizes left number bases left side right number bases right side fraction define flanks based fraction interval length strand define left right based strand trim adjust coordinates --bounds intervals ... extra arguments (used)","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_flank.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create flanking intervals from input intervals. — bed_flank","text":"ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_flank.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create flanking intervals from input intervals. — bed_flank","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 25, 50, \"chr1\", 100, 125 ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 130 ) bed_glyph(bed_flank(x, genome, both = 20)) x <- tibble::tribble( ~chrom, ~start, ~end, ~name, ~score, ~strand, \"chr1\", 500, 1000, \".\", \".\", \"+\", \"chr1\", 1000, 1500, \".\", \".\", \"-\" ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 5000 ) bed_flank(x, genome, left = 100) #> # A tibble: 2 × 6 #> chrom start end name score strand #> #> 1 chr1 400 500 . . + #> 2 chr1 900 1000 . . - bed_flank(x, genome, right = 100) #> # A tibble: 2 × 6 #> chrom start end name score strand #> #> 1 chr1 1000 1100 . . + #> 2 chr1 1500 1600 . . - bed_flank(x, genome, both = 100) #> # A tibble: 4 × 6 #> chrom start end name score strand #> #> 1 chr1 400 500 . . + #> 2 chr1 900 1000 . . - #> 3 chr1 1000 1100 . . + #> 4 chr1 1500 1600 . . - bed_flank(x, genome, both = 0.5, fraction = TRUE) #> # A tibble: 4 × 6 #> chrom start end name score strand #> #> 1 chr1 250 500 . . + #> 2 chr1 750 1000 . . - #> 3 chr1 1000 1250 . . + #> 4 chr1 1500 1750 . . -"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_genomecov.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate coverage across a genome — bed_genomecov","title":"Calculate coverage across a genome — bed_genomecov","text":"function useful calculating interval coverage across entire genome.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_genomecov.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate coverage across a genome — bed_genomecov","text":"","code":"bed_genomecov(x, genome, zero_depth = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_genomecov.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate coverage across a genome — bed_genomecov","text":"x ivl_df genome genome_df zero_depth TRUE, report intervals zero depth. Zero depth intervals reported respect groups.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_genomecov.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate coverage across a genome — bed_genomecov","text":"ivl_df additional column: .depth depth interval coverage","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_genomecov.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculate coverage across a genome — bed_genomecov","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_genomecov.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate coverage across a genome — bed_genomecov","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, ~strand, \"chr1\", 20, 70, \"+\", \"chr1\", 50, 100, \"-\", \"chr1\", 200, 250, \"+\", \"chr1\", 220, 250, \"+\" ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 500, \"chr2\", 1000 ) bed_genomecov(x, genome) #> # A tibble: 5 × 4 #> chrom start end .depth #> #> 1 chr1 20 50 1 #> 2 chr1 50 70 2 #> 3 chr1 70 100 1 #> 4 chr1 200 220 1 #> 5 chr1 220 250 2 bed_genomecov(dplyr::group_by(x, strand), genome) #> # A tibble: 4 × 5 #> chrom start end strand .depth #> #> 1 chr1 20 70 + 1 #> 2 chr1 200 220 + 1 #> 3 chr1 220 250 + 2 #> 4 chr1 50 100 - 1 bed_genomecov(dplyr::group_by(x, strand), genome, zero_depth = TRUE) #> # A tibble: 11 × 5 #> chrom start end strand .depth #> #> 1 chr1 0 20 + 0 #> 2 chr1 0 50 - 0 #> 3 chr1 20 70 + 1 #> 4 chr1 50 100 - 1 #> 5 chr1 70 200 + 0 #> 6 chr1 100 500 - 0 #> 7 chr1 200 220 + 1 #> 8 chr1 220 250 + 2 #> 9 chr1 250 500 + 0 #> 10 chr2 0 1000 + 0 #> 11 chr2 0 1000 - 0"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_glyph.html","id":null,"dir":"Reference","previous_headings":"","what":"Create example glyphs for valr functions. — bed_glyph","title":"Create example glyphs for valr functions. — bed_glyph","text":"Used illustrate output valr functions small examples.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_glyph.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create example glyphs for valr functions. — bed_glyph","text":"","code":"bed_glyph(expr, label = NULL)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_glyph.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create example glyphs for valr functions. — bed_glyph","text":"expr expression evaluate label column name use label values. present result call.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_glyph.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create example glyphs for valr functions. — bed_glyph","text":"ggplot2::ggplot()","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_glyph.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create example glyphs for valr functions. — bed_glyph","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 25, 50, \"chr1\", 100, 125 ) y <- tibble::tribble( ~chrom, ~start, ~end, ~value, \"chr1\", 30, 75, 50 ) bed_glyph(bed_intersect(x, y)) x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 30, 75, \"chr1\", 50, 90, \"chr1\", 91, 120 ) bed_glyph(bed_merge(x)) bed_glyph(bed_cluster(x), label = \".id\")"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_intersect.html","id":null,"dir":"Reference","previous_headings":"","what":"Identify intersecting intervals. — bed_intersect","title":"Identify intersecting intervals. — bed_intersect","text":"Report intersecting intervals x y tbls. Book-ended intervals .overlap values 0 output.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_intersect.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Identify intersecting intervals. — bed_intersect","text":"","code":"bed_intersect(x, ..., invert = FALSE, suffix = c(\".x\", \".y\"))"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_intersect.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Identify intersecting intervals. — bed_intersect","text":"x ivl_df ... one (e.g. list ) y ivl_df()s invert report x intervals y suffix colname suffixes output","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_intersect.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Identify intersecting intervals. — bed_intersect","text":"ivl_df original columns x y suffixed .x .y, new .overlap column extent overlap intersecting intervals. multiple y tbls supplied, .source contains variable names associated interval. original columns y suffixed .y output. ... contains named inputs (.e = y, b = z list(= y, b = z)), .source contain supplied names (see examples).","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_intersect.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Identify intersecting intervals. — bed_intersect","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_intersect.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Identify intersecting intervals. — bed_intersect","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 25, 50, \"chr1\", 100, 125 ) y <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 30, 75 ) bed_glyph(bed_intersect(x, y)) bed_glyph(bed_intersect(x, y, invert = TRUE)) x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 100, 500, \"chr2\", 200, 400, \"chr2\", 300, 500, \"chr2\", 800, 900 ) y <- tibble::tribble( ~chrom, ~start, ~end, ~value, \"chr1\", 150, 400, 100, \"chr1\", 500, 550, 100, \"chr2\", 230, 430, 200, \"chr2\", 350, 430, 300 ) bed_intersect(x, y) #> # A tibble: 6 × 7 #> chrom start.x end.x start.y end.y value.y .overlap #> #> 1 chr1 100 500 150 400 100 250 #> 2 chr1 100 500 500 550 100 0 #> 3 chr2 200 400 230 430 200 170 #> 4 chr2 200 400 350 430 300 50 #> 5 chr2 300 500 230 430 200 130 #> 6 chr2 300 500 350 430 300 80 bed_intersect(x, y, invert = TRUE) #> # A tibble: 1 × 3 #> chrom start end #> #> 1 chr2 800 900 # start and end of each overlapping interval res <- bed_intersect(x, y) dplyr::mutate(res, start = pmax(start.x, start.y), end = pmin(end.x, end.y) ) #> # A tibble: 6 × 9 #> chrom start.x end.x start.y end.y value.y .overlap start end #> #> 1 chr1 100 500 150 400 100 250 150 400 #> 2 chr1 100 500 500 550 100 0 500 500 #> 3 chr2 200 400 230 430 200 170 230 400 #> 4 chr2 200 400 350 430 300 50 350 400 #> 5 chr2 300 500 230 430 200 130 300 430 #> 6 chr2 300 500 350 430 300 80 350 430 z <- tibble::tribble( ~chrom, ~start, ~end, ~value, \"chr1\", 150, 400, 100, \"chr1\", 500, 550, 100, \"chr2\", 230, 430, 200, \"chr2\", 750, 900, 400 ) bed_intersect(x, y, z) #> # A tibble: 11 × 8 #> chrom start.x end.x start.y end.y value.y .source .overlap #> #> 1 chr1 100 500 150 400 100 y 250 #> 2 chr1 100 500 150 400 100 z 250 #> 3 chr1 100 500 500 550 100 y 0 #> 4 chr1 100 500 500 550 100 z 0 #> 5 chr2 200 400 230 430 200 y 170 #> 6 chr2 200 400 230 430 200 z 170 #> 7 chr2 200 400 350 430 300 y 50 #> 8 chr2 300 500 230 430 200 y 130 #> 9 chr2 300 500 230 430 200 z 130 #> 10 chr2 300 500 350 430 300 y 80 #> 11 chr2 800 900 750 900 400 z 100 bed_intersect(x, exons = y, introns = z) #> # A tibble: 11 × 8 #> chrom start.x end.x start.y end.y value.y .source .overlap #> #> 1 chr1 100 500 150 400 100 exons 250 #> 2 chr1 100 500 150 400 100 introns 250 #> 3 chr1 100 500 500 550 100 exons 0 #> 4 chr1 100 500 500 550 100 introns 0 #> 5 chr2 200 400 230 430 200 exons 170 #> 6 chr2 200 400 230 430 200 introns 170 #> 7 chr2 200 400 350 430 300 exons 50 #> 8 chr2 300 500 230 430 200 exons 130 #> 9 chr2 300 500 230 430 200 introns 130 #> 10 chr2 300 500 350 430 300 exons 80 #> 11 chr2 800 900 750 900 400 introns 100 # a list of tbl_intervals can also be passed bed_intersect(x, list(exons = y, introns = z)) #> # A tibble: 11 × 8 #> chrom start.x end.x start.y end.y value.y .source .overlap #> #> 1 chr1 100 500 150 400 100 exons 250 #> 2 chr1 100 500 150 400 100 introns 250 #> 3 chr1 100 500 500 550 100 exons 0 #> 4 chr1 100 500 500 550 100 introns 0 #> 5 chr2 200 400 230 430 200 exons 170 #> 6 chr2 200 400 230 430 200 introns 170 #> 7 chr2 200 400 350 430 300 exons 50 #> 8 chr2 300 500 230 430 200 exons 130 #> 9 chr2 300 500 230 430 200 introns 130 #> 10 chr2 300 500 350 430 300 exons 80 #> 11 chr2 800 900 750 900 400 introns 100"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_jaccard.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate the Jaccard statistic for two sets of intervals. — bed_jaccard","title":"Calculate the Jaccard statistic for two sets of intervals. — bed_jaccard","text":"Quantifies extent overlap sets intervals terms base-pairs. Groups shared input used calculate statistic subsets data.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_jaccard.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate the Jaccard statistic for two sets of intervals. — bed_jaccard","text":"","code":"bed_jaccard(x, y)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_jaccard.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate the Jaccard statistic for two sets of intervals. — bed_jaccard","text":"x ivl_df y ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_jaccard.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate the Jaccard statistic for two sets of intervals. — bed_jaccard","text":"tibble following columns: len_i length intersection base-pairs len_u length union base-pairs jaccard value jaccard statistic n_int number intersecting intervals x y inputs grouped, return value contain one set values per group.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_jaccard.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculate the Jaccard statistic for two sets of intervals. — bed_jaccard","text":"Jaccard statistic takes values [0,1] measured : $$ J(x,y) = \\frac{\\mid x \\bigcap y \\mid} {\\mid x \\bigcup y \\mid} = \\frac{\\mid x \\bigcap y \\mid} {\\mid x \\mid + \\mid y \\mid - \\mid x \\bigcap y \\mid} $$ Interval statistics can used combination dplyr::group_by() dplyr::() calculate statistics subsets data. See vignette('interval-stats') examples.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_jaccard.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate the Jaccard statistic for two sets of intervals. — bed_jaccard","text":"","code":"genome <- read_genome(valr_example(\"hg19.chrom.sizes.gz\")) x <- bed_random(genome, seed = 1010486) y <- bed_random(genome, seed = 9203911) bed_jaccard(x, y) #> # A tibble: 1 × 4 #> len_i len_u jaccard n #> #> 1 236184699 1708774142 0.160 399981 # calculate jaccard per chromosome bed_jaccard( dplyr::group_by(x, chrom), dplyr::group_by(y, chrom) ) #> # A tibble: 25 × 5 #> chrom len_i len_u jaccard n #> #> 1 chr1 18939046 137345996 0.160 32156 #> 2 chr10 10524360 75209830 0.163 17830 #> 3 chr11 10378246 74655177 0.161 17497 #> 4 chr12 10146255 73725046 0.160 17163 #> 5 chr13 8867024 63737541 0.162 14992 #> 6 chr14 8047103 59033144 0.158 13647 #> 7 chr15 7794057 56514322 0.160 13236 #> 8 chr16 6907575 49874077 0.161 11650 #> 9 chr17 6186446 44917522 0.160 10487 #> 10 chr18 6044900 43248877 0.162 10129 #> # ℹ 15 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_makewindows.html","id":null,"dir":"Reference","previous_headings":"","what":"Divide intervals into new sub-intervals (","title":"Divide intervals into new sub-intervals (","text":"Divide intervals new sub-intervals (\"windows\").","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_makewindows.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Divide intervals into new sub-intervals (","text":"","code":"bed_makewindows(x, win_size = 0, step_size = 0, num_win = 0, reverse = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_makewindows.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Divide intervals into new sub-intervals (","text":"x ivl_df win_size divide intervals fixed-size windows step_size size step next window num_win divide intervals fixed number windows reverse reverse window numbers","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_makewindows.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Divide intervals into new sub-intervals (","text":"ivl_df .win_id column contains numeric identifier window.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_makewindows.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Divide intervals into new sub-intervals (","text":"name .win_id columns can used create new interval names (see 'namenum' example ) subsequent group_by operations (see vignette).","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_makewindows.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Divide intervals into new sub-intervals (","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, ~name, ~score, ~strand, \"chr1\", 100, 200, \"A\", \".\", \"+\" ) bed_glyph(bed_makewindows(x, num_win = 10), label = \".win_id\") # Fixed number of windows bed_makewindows(x, num_win = 10) #> # A tibble: 10 × 7 #> chrom start end name score strand .win_id #> #> 1 chr1 100 110 A . + 1 #> 2 chr1 110 120 A . + 2 #> 3 chr1 120 130 A . + 3 #> 4 chr1 130 140 A . + 4 #> 5 chr1 140 150 A . + 5 #> 6 chr1 150 160 A . + 6 #> 7 chr1 160 170 A . + 7 #> 8 chr1 170 180 A . + 8 #> 9 chr1 180 190 A . + 9 #> 10 chr1 190 200 A . + 10 # Fixed window size bed_makewindows(x, win_size = 10) #> # A tibble: 10 × 7 #> chrom start end name score strand .win_id #> #> 1 chr1 100 110 A . + 1 #> 2 chr1 110 120 A . + 2 #> 3 chr1 120 130 A . + 3 #> 4 chr1 130 140 A . + 4 #> 5 chr1 140 150 A . + 5 #> 6 chr1 150 160 A . + 6 #> 7 chr1 160 170 A . + 7 #> 8 chr1 170 180 A . + 8 #> 9 chr1 180 190 A . + 9 #> 10 chr1 190 200 A . + 10 # Fixed window size with overlaps bed_makewindows(x, win_size = 10, step_size = 5) #> # A tibble: 20 × 7 #> chrom start end name score strand .win_id #> #> 1 chr1 100 110 A . + 1 #> 2 chr1 105 115 A . + 2 #> 3 chr1 110 120 A . + 3 #> 4 chr1 115 125 A . + 4 #> 5 chr1 120 130 A . + 5 #> 6 chr1 125 135 A . + 6 #> 7 chr1 130 140 A . + 7 #> 8 chr1 135 145 A . + 8 #> 9 chr1 140 150 A . + 9 #> 10 chr1 145 155 A . + 10 #> 11 chr1 150 160 A . + 11 #> 12 chr1 155 165 A . + 12 #> 13 chr1 160 170 A . + 13 #> 14 chr1 165 175 A . + 14 #> 15 chr1 170 180 A . + 15 #> 16 chr1 175 185 A . + 16 #> 17 chr1 180 190 A . + 17 #> 18 chr1 185 195 A . + 18 #> 19 chr1 190 200 A . + 19 #> 20 chr1 195 200 A . + 20 # reverse win_id bed_makewindows(x, win_size = 10, reverse = TRUE) #> # A tibble: 10 × 7 #> chrom start end name score strand .win_id #> #> 1 chr1 100 110 A . + 10 #> 2 chr1 110 120 A . + 9 #> 3 chr1 120 130 A . + 8 #> 4 chr1 130 140 A . + 7 #> 5 chr1 140 150 A . + 6 #> 6 chr1 150 160 A . + 5 #> 7 chr1 160 170 A . + 4 #> 8 chr1 170 180 A . + 3 #> 9 chr1 180 190 A . + 2 #> 10 chr1 190 200 A . + 1 # bedtools 'namenum' wins <- bed_makewindows(x, win_size = 10) dplyr::mutate(wins, namenum = stringr::str_c(name, \"_\", .win_id)) #> # A tibble: 10 × 8 #> chrom start end name score strand .win_id namenum #> #> 1 chr1 100 110 A . + 1 A_1 #> 2 chr1 110 120 A . + 2 A_2 #> 3 chr1 120 130 A . + 3 A_3 #> 4 chr1 130 140 A . + 4 A_4 #> 5 chr1 140 150 A . + 5 A_5 #> 6 chr1 150 160 A . + 6 A_6 #> 7 chr1 160 170 A . + 7 A_7 #> 8 chr1 170 180 A . + 8 A_8 #> 9 chr1 180 190 A . + 9 A_9 #> 10 chr1 190 200 A . + 10 A_10"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_map.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate summaries from overlapping intervals. — bed_map","title":"Calculate summaries from overlapping intervals. — bed_map","text":"Apply functions like min() count() intersecting intervals. bed_map() uses bed_intersect() identify intersecting intervals, output columns suffixed .x .y. Expressions refer input columns x y columns must take suffixes account.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_map.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate summaries from overlapping intervals. — bed_map","text":"","code":"bed_map(x, y, ..., min_overlap = 1) concat(.data, sep = \",\") values_unique(.data, sep = \",\") values(.data, sep = \",\")"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_map.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate summaries from overlapping intervals. — bed_map","text":"x ivl_df y ivl_df ... name-value pairs specifying column names expressions apply min_overlap minimum overlap intervals. .data data sep separator character","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_map.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate summaries from overlapping intervals. — bed_map","text":"ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_map.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculate summaries from overlapping intervals. — bed_map","text":"Book-ended intervals can included setting min_overlap = 0. Non-intersecting intervals x included result NA values. input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_map.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate summaries from overlapping intervals. — bed_map","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, 'chr1', 100, 250, 'chr2', 250, 500 ) y <- tibble::tribble( ~chrom, ~start, ~end, ~value, 'chr1', 100, 250, 10, 'chr1', 150, 250, 20, 'chr2', 250, 500, 500 ) bed_glyph(bed_map(x, y, value = sum(value)), label = 'value') # summary examples bed_map(x, y, .sum = sum(value)) #> # A tibble: 2 × 4 #> chrom start end .sum #> #> 1 chr1 100 250 30 #> 2 chr2 250 500 500 bed_map(x, y, .min = min(value), .max = max(value)) #> # A tibble: 2 × 5 #> chrom start end .min .max #> #> 1 chr1 100 250 10 20 #> 2 chr2 250 500 500 500 # identify non-intersecting intervals to include in the result res <- bed_map(x, y, .sum = sum(value)) x_not <- bed_intersect(x, y, invert = TRUE) dplyr::bind_rows(res, x_not) #> # A tibble: 2 × 4 #> chrom start end .sum #> #> 1 chr1 100 250 30 #> 2 chr2 250 500 500 # create a list-column bed_map(x, y, .values = list(value)) #> # A tibble: 2 × 4 #> chrom start end .values #> #> 1 chr1 100 250 #> 2 chr2 250 500 # use `nth` family from dplyr bed_map(x, y, .first = dplyr::first(value)) #> # A tibble: 2 × 4 #> chrom start end .first #> #> 1 chr1 100 250 10 #> 2 chr2 250 500 500 bed_map(x, y, .absmax = abs(max(value))) #> # A tibble: 2 × 4 #> chrom start end .absmax #> #> 1 chr1 100 250 20 #> 2 chr2 250 500 500 bed_map(x, y, .count = length(value)) #> # A tibble: 2 × 4 #> chrom start end .count #> #> 1 chr1 100 250 2 #> 2 chr2 250 500 1 bed_map(x, y, .vals = values(value)) #> # A tibble: 2 × 4 #> chrom start end .vals #> #> 1 chr1 100 250 10,20 #> 2 chr2 250 500 500 # count defaults are NA not 0; differs from bedtools2 ... bed_map(x, y, .counts = dplyr::n()) #> # A tibble: 2 × 4 #> chrom start end .counts #> #> 1 chr1 100 250 2 #> 2 chr2 250 500 1 # ... but NA counts can be coverted to 0's dplyr::mutate(bed_map(x, y, .counts = dplyr::n()), .counts = ifelse(is.na(.counts), 0, .counts)) #> # A tibble: 2 × 4 #> chrom start end .counts #> #> 1 chr1 100 250 2 #> 2 chr2 250 500 1"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_merge.html","id":null,"dir":"Reference","previous_headings":"","what":"Merge overlapping intervals. — bed_merge","title":"Merge overlapping intervals. — bed_merge","text":"Operations can performed merged intervals specifying name-value pairs. Default max_dist 0 means book-ended intervals merged.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_merge.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Merge overlapping intervals. — bed_merge","text":"","code":"bed_merge(x, max_dist = 0, ...)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_merge.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Merge overlapping intervals. — bed_merge","text":"x ivl_df max_dist maximum distance intervals merge ... name-value pairs specify operations merged intervals","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_merge.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Merge overlapping intervals. — bed_merge","text":"ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_merge.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Merge overlapping intervals. — bed_merge","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_merge.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Merge overlapping intervals. — bed_merge","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 1, 50, \"chr1\", 10, 75, \"chr1\", 100, 120 ) bed_glyph(bed_merge(x)) x <- tibble::tribble( ~chrom, ~start, ~end, ~value, ~strand, \"chr1\", 1, 50, 1, \"+\", \"chr1\", 100, 200, 2, \"+\", \"chr1\", 150, 250, 3, \"-\", \"chr2\", 1, 25, 4, \"+\", \"chr2\", 200, 400, 5, \"-\", \"chr2\", 400, 500, 6, \"+\", \"chr2\", 450, 550, 7, \"+\" ) bed_merge(x) #> # A tibble: 4 × 3 #> chrom start end #> #> 1 chr1 1 50 #> 2 chr1 100 250 #> 3 chr2 1 25 #> 4 chr2 200 550 bed_merge(x, max_dist = 100) #> # A tibble: 3 × 3 #> chrom start end #> #> 1 chr1 1 250 #> 2 chr2 1 25 #> 3 chr2 200 550 # merge intervals on same strand bed_merge(dplyr::group_by(x, strand)) #> # A tibble: 6 × 4 #> # Groups: strand [2] #> chrom start end strand #> #> 1 chr1 1 50 + #> 2 chr1 100 200 + #> 3 chr1 150 250 - #> 4 chr2 1 25 + #> 5 chr2 400 550 + #> 6 chr2 200 400 - bed_merge(x, .value = sum(value)) #> # A tibble: 4 × 4 #> chrom start end .value #> #> 1 chr1 1 50 1 #> 2 chr1 100 250 5 #> 3 chr2 1 25 4 #> 4 chr2 200 550 18"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_partition.html","id":null,"dir":"Reference","previous_headings":"","what":"Partition intervals into elemental intervals — bed_partition","title":"Partition intervals into elemental intervals — bed_partition","text":"Convert set intervals elemental intervals contain start end position set.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_partition.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Partition intervals into elemental intervals — bed_partition","text":"","code":"bed_partition(x, ...)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_partition.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Partition intervals into elemental intervals — bed_partition","text":"x ivl_df ... name-value pairs specifying column names expressions apply","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_partition.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Partition intervals into elemental intervals — bed_partition","text":"ivl_df()","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_partition.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Partition intervals into elemental intervals — bed_partition","text":"Summary operations, min() count() can performed elemental intervals specifying name-value pairs. function useful calculating summaries across overlapping intervals without merging intervals. input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_partition.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Partition intervals into elemental intervals — bed_partition","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, ~value, ~strand, \"chr1\", 100, 500, 10, \"+\", \"chr1\", 200, 400, 20, \"-\", \"chr1\", 300, 550, 30, \"+\", \"chr1\", 550, 575, 2, \"+\", \"chr1\", 800, 900, 5, \"+\" ) bed_glyph(bed_partition(x)) bed_glyph(bed_partition(x, value = sum(value)), label = \"value\") bed_partition(x) #> # A tibble: 7 × 3 #> chrom start end #> #> 1 chr1 100 200 #> 2 chr1 200 300 #> 3 chr1 300 400 #> 4 chr1 400 500 #> 5 chr1 500 550 #> 6 chr1 550 575 #> 7 chr1 800 900 # compute summary over each elemental interval bed_partition(x, value = sum(value)) #> # A tibble: 7 × 4 #> chrom start end value #> #> 1 chr1 100 200 10 #> 2 chr1 200 300 30 #> 3 chr1 300 400 60 #> 4 chr1 400 500 40 #> 5 chr1 500 550 30 #> 6 chr1 550 575 2 #> 7 chr1 800 900 5 # partition and compute summaries based on group x <- dplyr::group_by(x, strand) bed_partition(x, value = sum(value)) #> # A tibble: 6 × 5 #> chrom start end strand value #> #> 1 chr1 100 300 + 10 #> 2 chr1 200 400 - 20 #> 3 chr1 300 500 + 40 #> 4 chr1 500 550 + 30 #> 5 chr1 550 575 + 2 #> 6 chr1 800 900 + 5 # combine values across multiple tibbles y <- tibble::tribble( ~chrom, ~start, ~end, ~value, ~strand, \"chr1\", 10, 500, 100, \"+\", \"chr1\", 250, 420, 200, \"-\", \"chr1\", 350, 550, 300, \"+\", \"chr1\", 550, 555, 20, \"+\", \"chr1\", 800, 900, 50, \"+\" ) x <- dplyr::bind_rows(x, y) bed_partition(x, value = sum(value)) #> # A tibble: 11 × 5 #> chrom start end strand value #> #> 1 chr1 10 100 + 100 #> 2 chr1 100 300 + 110 #> 3 chr1 200 250 - 20 #> 4 chr1 250 400 - 220 #> 5 chr1 300 350 + 140 #> 6 chr1 350 500 + 440 #> 7 chr1 400 420 - 200 #> 8 chr1 500 550 + 330 #> 9 chr1 550 555 + 22 #> 10 chr1 555 575 + 2 #> 11 chr1 800 900 + 55"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_projection.html","id":null,"dir":"Reference","previous_headings":"","what":"Projection test for query interval overlap. — bed_projection","title":"Projection test for query interval overlap. — bed_projection","text":"Projection test query interval overlap.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_projection.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Projection test for query interval overlap. — bed_projection","text":"","code":"bed_projection(x, y, genome, by_chrom = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_projection.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Projection test for query interval overlap. — bed_projection","text":"x ivl_df y ivl_df genome genome_df by_chrom compute test per chromosome","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_projection.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Projection test for query interval overlap. — bed_projection","text":"ivl_df following columns: chrom name chromosome tested by_chrom = TRUE, otherwise value whole_genome p.value p-value binomial test. p-values > 0.5 converted 1 - p-value lower_tail FALSE obs_exp_ratio ratio observed expected overlap frequency lower_tail TRUE indicates observed overlaps lower tail distribution (e.g., less overlap expected). FALSE indicates observed overlaps upper tail distribution (e.g., overlap expected)","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_projection.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Projection test for query interval overlap. — bed_projection","text":"Interval statistics can used combination dplyr::group_by() dplyr::() calculate statistics subsets data. See vignette('interval-stats') examples.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_projection.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Projection test for query interval overlap. — bed_projection","text":"","code":"genome <- read_genome(valr_example(\"hg19.chrom.sizes.gz\")) x <- bed_random(genome, seed = 1010486) y <- bed_random(genome, seed = 9203911) bed_projection(x, y, genome) #> # A tibble: 1 × 4 #> chrom p.value obs_exp_ratio lower_tail #> #> 1 whole_genome 0.000850 1.01 FALSE bed_projection(x, y, genome, by_chrom = TRUE) #> # A tibble: 25 × 4 #> chrom p.value obs_exp_ratio lower_tail #> #> 1 chr1 0.176 1.01 FALSE #> 2 chr10 0.0209 1.02 FALSE #> 3 chr11 0.118 1.01 FALSE #> 4 chr12 0.479 1.00 FALSE #> 5 chr13 0.245 1.01 FALSE #> 6 chr14 0.120 0.990 TRUE #> 7 chr15 0.333 1.00 FALSE #> 8 chr16 0.213 1.01 FALSE #> 9 chr17 0.181 0.991 TRUE #> 10 chr18 0.0306 1.02 FALSE #> # ℹ 15 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_random.html","id":null,"dir":"Reference","previous_headings":"","what":"Generate randomly placed intervals on a genome. — bed_random","title":"Generate randomly placed intervals on a genome. — bed_random","text":"Generate randomly placed intervals genome.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_random.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generate randomly placed intervals on a genome. — bed_random","text":"","code":"bed_random(genome, length = 1000, n = 1e+06, seed = 0, sorted = TRUE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_random.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generate randomly placed intervals on a genome. — bed_random","text":"genome genome_df length length intervals n number intervals generate seed seed RNG reproducible intervals sorted return sorted output","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_random.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generate randomly placed intervals on a genome. — bed_random","text":"ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_random.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generate randomly placed intervals on a genome. — bed_random","text":"Sorting can suppressed sorted = FALSE.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_random.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generate randomly placed intervals on a genome. — bed_random","text":"","code":"genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 10000000, \"chr2\", 50000000, \"chr3\", 60000000, \"chrX\", 5000000 ) bed_random(genome, seed = 10104) #> # A tibble: 1,000,000 × 3 #> chrom start end #> #> 1 chr1 265 1265 #> 2 chr1 315 1315 #> 3 chr1 335 1335 #> 4 chr1 513 1513 #> 5 chr1 625 1625 #> 6 chr1 635 1635 #> 7 chr1 653 1653 #> 8 chr1 731 1731 #> 9 chr1 859 1859 #> 10 chr1 1024 2024 #> # ℹ 999,990 more rows # sorting can be suppressed bed_random(genome, sorted = FALSE, seed = 10104) #> # A tibble: 1,000,000 × 3 #> chrom start end #> #> 1 chr3 2681468 2682468 #> 2 chr3 25364020 25365020 #> 3 chr2 43134407 43135407 #> 4 chr2 36344257 36345257 #> 5 chr3 39019690 39020690 #> 6 chr3 59869387 59870387 #> 7 chr3 56220373 56221373 #> 8 chr3 57965913 57966913 #> 9 chr2 25303342 25304342 #> 10 chr3 16018594 16019594 #> # ℹ 999,990 more rows # 500 random intervals of length 500 bed_random(genome, length = 500, n = 500, seed = 10104) #> # A tibble: 500 × 3 #> chrom start end #> #> 1 chr1 379360 379860 #> 2 chr1 394770 395270 #> 3 chr1 1215880 1216380 #> 4 chr1 1339287 1339787 #> 5 chr1 2046513 2047013 #> 6 chr1 2156755 2157255 #> 7 chr1 2189109 2189609 #> 8 chr1 2221665 2222165 #> 9 chr1 2223456 2223956 #> 10 chr1 2253135 2253635 #> # ℹ 490 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_reldist.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute relative distances between intervals. — bed_reldist","title":"Compute relative distances between intervals. — bed_reldist","text":"Compute relative distances intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_reldist.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute relative distances between intervals. — bed_reldist","text":"","code":"bed_reldist(x, y, detail = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_reldist.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute relative distances between intervals. — bed_reldist","text":"x ivl_df y ivl_df detail report relative distances x interval.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_reldist.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute relative distances between intervals. — bed_reldist","text":"detail = FALSE, ivl_df summarizes calculated .reldist values following columns: .reldist relative distance metric .counts number metric observations .total total observations .freq frequency observation detail = TRUE, .reldist column reports relative distance input x interval.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_reldist.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Compute relative distances between intervals. — bed_reldist","text":"Interval statistics can used combination dplyr::group_by() dplyr::() calculate statistics subsets data. See vignette('interval-stats') examples.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_reldist.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compute relative distances between intervals. — bed_reldist","text":"","code":"genome <- read_genome(valr_example(\"hg19.chrom.sizes.gz\")) x <- bed_random(genome, seed = 1010486) y <- bed_random(genome, seed = 9203911) bed_reldist(x, y) #> # A tibble: 51 × 4 #> .reldist .counts .total .freq #> #> 1 0 20202 999938 0.0202 #> 2 0.01 20031 999938 0.0200 #> 3 0.02 19977 999938 0.0200 #> 4 0.03 19871 999938 0.0199 #> 5 0.04 20129 999938 0.0201 #> 6 0.05 20197 999938 0.0202 #> 7 0.06 20020 999938 0.0200 #> 8 0.07 20063 999938 0.0201 #> 9 0.08 20053 999938 0.0201 #> 10 0.09 20021 999938 0.0200 #> # ℹ 41 more rows bed_reldist(x, y, detail = TRUE) #> # A tibble: 999,938 × 4 #> chrom start end .reldist #> #> 1 chr1 5184 6184 0.270 #> 2 chr1 7663 8663 0.226 #> 3 chr1 9858 10858 0.317 #> 4 chr1 13805 14805 0.361 #> 5 chr1 14081 15081 0.402 #> 6 chr1 16398 17398 0.253 #> 7 chr1 17486 18486 0.0912 #> 8 chr1 22063 23063 0.107 #> 9 chr1 22494 23494 0.207 #> 10 chr1 29351 30351 0.400 #> # ℹ 999,928 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shift.html","id":null,"dir":"Reference","previous_headings":"","what":"Adjust intervals by a fixed size. — bed_shift","title":"Adjust intervals by a fixed size. — bed_shift","text":"--bounds intervals removed default.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shift.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Adjust intervals by a fixed size. — bed_shift","text":"","code":"bed_shift(x, genome, size = 0, fraction = 0, trim = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shift.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Adjust intervals by a fixed size. — bed_shift","text":"x ivl_df genome ivl_df size number bases shift. positive numbers shift right, negative shift left. fraction define size fraction interval trim adjust coordinates --bounds intervals","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shift.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Adjust intervals by a fixed size. — bed_shift","text":"ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shift.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Adjust intervals by a fixed size. — bed_shift","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 25, 50, \"chr1\", 100, 125 ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 125 ) bed_glyph(bed_shift(x, genome, size = -20)) x <- tibble::tribble( ~chrom, ~start, ~end, ~strand, \"chr1\", 100, 150, \"+\", \"chr1\", 200, 250, \"+\", \"chr2\", 300, 350, \"+\", \"chr2\", 400, 450, \"-\", \"chr3\", 500, 550, \"-\", \"chr3\", 600, 650, \"-\" ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 1000, \"chr2\", 2000, \"chr3\", 3000 ) bed_shift(x, genome, 100) #> # A tibble: 6 × 4 #> chrom start end strand #> #> 1 chr1 200 250 + #> 2 chr1 300 350 + #> 3 chr2 400 450 + #> 4 chr2 500 550 - #> 5 chr3 600 650 - #> 6 chr3 700 750 - bed_shift(x, genome, fraction = 0.5) #> # A tibble: 6 × 4 #> chrom start end strand #> #> 1 chr1 125 175 + #> 2 chr1 225 275 + #> 3 chr2 325 375 + #> 4 chr2 425 475 - #> 5 chr3 525 575 - #> 6 chr3 625 675 - # shift with respect to strand stranded <- dplyr::group_by(x, strand) bed_shift(stranded, genome, 100) #> # A tibble: 6 × 4 #> chrom start end strand #> #> 1 chr1 200 250 + #> 2 chr1 300 350 + #> 3 chr2 400 450 + #> 4 chr2 300 350 - #> 5 chr3 400 450 - #> 6 chr3 500 550 -"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shuffle.html","id":null,"dir":"Reference","previous_headings":"","what":"Shuffle input intervals. — bed_shuffle","title":"Shuffle input intervals. — bed_shuffle","text":"Shuffle input intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shuffle.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Shuffle input intervals. — bed_shuffle","text":"","code":"bed_shuffle( x, genome, incl = NULL, excl = NULL, max_tries = 1000, within = FALSE, seed = 0 )"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shuffle.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Shuffle input intervals. — bed_shuffle","text":"x ivl_df genome genome_df incl ivl_df included intervals excl ivl_df excluded intervals max_tries maximum tries identify bounded interval within shuffle within chromosomes seed seed reproducible intervals","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shuffle.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Shuffle input intervals. — bed_shuffle","text":"ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_shuffle.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Shuffle input intervals. — bed_shuffle","text":"","code":"genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 1e6, \"chr2\", 2e6, \"chr3\", 4e6 ) x <- bed_random(genome, seed = 1010486) bed_shuffle(x, genome, seed = 9830491) #> # A tibble: 1,000,000 × 3 #> chrom start end #> #> 1 chr2 1463822 1464822 #> 2 chr2 619967 620967 #> 3 chr2 1769865 1770865 #> 4 chr2 203953 204953 #> 5 chr3 2119387 2120387 #> 6 chr2 1216667 1217667 #> 7 chr3 2109652 2110652 #> 8 chr2 213473 214473 #> 9 chr1 154156 155156 #> 10 chr3 2201278 2202278 #> # ℹ 999,990 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_slop.html","id":null,"dir":"Reference","previous_headings":"","what":"Increase the size of input intervals. — bed_slop","title":"Increase the size of input intervals. — bed_slop","text":"Increase size input intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_slop.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Increase the size of input intervals. — bed_slop","text":"","code":"bed_slop( x, genome, both = 0, left = 0, right = 0, fraction = FALSE, strand = FALSE, trim = FALSE, ... )"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_slop.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Increase the size of input intervals. — bed_slop","text":"x ivl_df genome genome_df number bases sizes left number bases left side right number bases right side fraction define flanks based fraction interval length strand define left right based strand trim adjust coordinates --bounds intervals ... extra arguments (used)","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_slop.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Increase the size of input intervals. — bed_slop","text":"ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_slop.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Increase the size of input intervals. — bed_slop","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 110, 120, \"chr1\", 225, 235 ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 400 ) bed_glyph(bed_slop(x, genome, both = 20, trim = TRUE)) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 5000 ) x <- tibble::tribble( ~chrom, ~start, ~end, ~name, ~score, ~strand, \"chr1\", 500, 1000, \".\", \".\", \"+\", \"chr1\", 1000, 1500, \".\", \".\", \"-\" ) bed_slop(x, genome, left = 100) #> # A tibble: 2 × 6 #> chrom start end name score strand #> #> 1 chr1 400 1000 . . + #> 2 chr1 900 1500 . . - bed_slop(x, genome, right = 100) #> # A tibble: 2 × 6 #> chrom start end name score strand #> #> 1 chr1 500 1100 . . + #> 2 chr1 1000 1600 . . - bed_slop(x, genome, both = 100) #> # A tibble: 2 × 6 #> chrom start end name score strand #> #> 1 chr1 400 1100 . . + #> 2 chr1 900 1600 . . - bed_slop(x, genome, both = 0.5, fraction = TRUE) #> # A tibble: 2 × 6 #> chrom start end name score strand #> #> 1 chr1 250 1250 . . + #> 2 chr1 750 1750 . . -"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_sort.html","id":null,"dir":"Reference","previous_headings":"","what":"Sort a set of intervals. — bed_sort","title":"Sort a set of intervals. — bed_sort","text":"Sort set intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_sort.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sort a set of intervals. — bed_sort","text":"","code":"bed_sort(x, by_size = FALSE, by_chrom = FALSE, reverse = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_sort.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Sort a set of intervals. — bed_sort","text":"x ivl_df by_size sort interval size by_chrom sort within chromosome reverse reverse sort order","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_sort.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sort a set of intervals. — bed_sort","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr8\", 500, 1000, \"chr8\", 1000, 5000, \"chr8\", 100, 200, \"chr1\", 100, 300, \"chr1\", 100, 200 ) # sort by chrom and start bed_sort(x) #> # A tibble: 5 × 3 #> chrom start end #> #> 1 chr1 100 200 #> 2 chr1 100 300 #> 3 chr8 100 200 #> 4 chr8 500 1000 #> 5 chr8 1000 5000 # reverse sort order bed_sort(x, reverse = TRUE) #> # A tibble: 5 × 3 #> chrom start end #> #> 1 chr1 100 300 #> 2 chr1 100 200 #> 3 chr8 1000 5000 #> 4 chr8 500 1000 #> 5 chr8 100 200 # sort by interval size bed_sort(x, by_size = TRUE) #> # A tibble: 5 × 3 #> chrom start end #> #> 1 chr8 100 200 #> 2 chr1 100 200 #> 3 chr1 100 300 #> 4 chr8 500 1000 #> 5 chr8 1000 5000 # sort by decreasing interval size bed_sort(x, by_size = TRUE, reverse = TRUE) #> # A tibble: 5 × 3 #> chrom start end #> #> 1 chr8 1000 5000 #> 2 chr8 500 1000 #> 3 chr1 100 300 #> 4 chr8 100 200 #> 5 chr1 100 200 # sort by interval size within chrom bed_sort(x, by_size = TRUE, by_chrom = TRUE) #> # A tibble: 5 × 3 #> chrom start end #> #> 1 chr1 100 200 #> 2 chr1 100 300 #> 3 chr8 100 200 #> 4 chr8 500 1000 #> 5 chr8 1000 5000"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_subtract.html","id":null,"dir":"Reference","previous_headings":"","what":"Subtract two sets of intervals. — bed_subtract","title":"Subtract two sets of intervals. — bed_subtract","text":"Subtract y intervals x intervals.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_subtract.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Subtract two sets of intervals. — bed_subtract","text":"","code":"bed_subtract(x, y, any = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_subtract.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Subtract two sets of intervals. — bed_subtract","text":"x ivl_df y ivl_df remove x intervals overlap y","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_subtract.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Subtract two sets of intervals. — bed_subtract","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_subtract.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Subtract two sets of intervals. — bed_subtract","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 1, 100 ) y <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 50, 75 ) bed_glyph(bed_subtract(x, y)) x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 100, 200, \"chr1\", 250, 400, \"chr1\", 500, 600, \"chr1\", 1000, 1200, \"chr1\", 1300, 1500 ) y <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 150, 175, \"chr1\", 510, 525, \"chr1\", 550, 575, \"chr1\", 900, 1050, \"chr1\", 1150, 1250, \"chr1\", 1299, 1501 ) bed_subtract(x, y) #> # A tibble: 7 × 3 #> chrom start end #> #> 1 chr1 100 150 #> 2 chr1 175 200 #> 3 chr1 250 400 #> 4 chr1 500 510 #> 5 chr1 525 550 #> 6 chr1 575 600 #> 7 chr1 1050 1150 bed_subtract(x, y, any = TRUE) #> # A tibble: 1 × 3 #> chrom start end #> #> 1 chr1 250 400"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_window.html","id":null,"dir":"Reference","previous_headings":"","what":"Identify intervals within a specified distance. — bed_window","title":"Identify intervals within a specified distance. — bed_window","text":"Identify intervals within specified distance.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_window.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Identify intervals within a specified distance. — bed_window","text":"","code":"bed_window(x, y, genome, ...)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_window.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Identify intervals within a specified distance. — bed_window","text":"x ivl_df y ivl_df genome genome_df ... params bed_slop bed_intersect","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_window.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Identify intervals within a specified distance. — bed_window","text":"input tbls grouped chrom default, additional groups can added using dplyr::group_by(). example, grouping strand constrain analyses strand. compare opposing strands across two tbls, strands y tbl can first inverted using flip_strands().","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bed_window.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Identify intervals within a specified distance. — bed_window","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 25, 50, \"chr1\", 100, 125 ) y <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 60, 75 ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 125 ) bed_glyph(bed_window(x, y, genome, both = 15)) x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 10, 100, \"chr2\", 200, 400, \"chr2\", 300, 500, \"chr2\", 800, 900 ) y <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 150, 400, \"chr2\", 230, 430, \"chr2\", 350, 430 ) genome <- tibble::tribble( ~chrom, ~size, \"chr1\", 500, \"chr2\", 1000 ) bed_window(x, y, genome, both = 100) #> # A tibble: 4 × 7 #> chrom start.x end.x start.y end.y .source .overlap #> #> 1 chr2 200 400 230 430 1 200 #> 2 chr2 200 400 350 430 1 80 #> 3 chr2 300 500 230 430 1 200 #> 4 chr2 300 500 350 430 1 80"},{"path":"https://rnabioco.github.io/valr/dev/reference/bound_intervals.html","id":null,"dir":"Reference","previous_headings":"","what":"Select intervals bounded by a genome. — bound_intervals","title":"Select intervals bounded by a genome. — bound_intervals","text":"Used remove --bounds intervals, trim interval coordinates using genome.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bound_intervals.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Select intervals bounded by a genome. — bound_intervals","text":"","code":"bound_intervals(x, genome, trim = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/bound_intervals.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Select intervals bounded by a genome. — bound_intervals","text":"x ivl_df genome genome_df trim adjust coordinates --bounds intervals","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/bound_intervals.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Select intervals bounded by a genome. — bound_intervals","text":"ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/bound_intervals.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Select intervals bounded by a genome. — bound_intervals","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", -100, 500, \"chr1\", 100, 1e9, \"chr1\", 500, 1000 ) genome <- read_genome(valr_example(\"hg19.chrom.sizes.gz\")) # out-of-bounds are removed by default ... bound_intervals(x, genome) #> # A tibble: 1 × 3 #> chrom start end #> #> 1 chr1 500 1000 # ... or can be trimmed within the bounds of a genome bound_intervals(x, genome, trim = TRUE) #> # A tibble: 3 × 3 #> chrom start end #> #> 1 chr1 0 500 #> 2 chr1 100 249250621 #> 3 chr1 500 1000"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_introns.html","id":null,"dir":"Reference","previous_headings":"","what":"Create intron features. — create_introns","title":"Create intron features. — create_introns","text":"Numbers score column intron numbers 5' 3' independent strand. .e., first introns + - strand genes score values 1.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/create_introns.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create intron features. — create_introns","text":"","code":"create_introns(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_introns.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create intron features. — create_introns","text":"x ivl_df BED12 format","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/create_introns.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create intron features. — create_introns","text":"","code":"x <- read_bed12(valr_example(\"mm9.refGene.bed.gz\")) create_introns(x) #> # A tibble: 1,583 × 6 #> chrom start end name score strand #> #> 1 chr1 3207049 3411782 NM_001011874 2 - #> 2 chr1 3411982 3660632 NM_001011874 1 - #> 3 chr1 4283093 4341990 NM_001195662 3 - #> 4 chr1 4342162 4342282 NM_001195662 2 - #> 5 chr1 4342918 4399250 NM_001195662 1 - #> 6 chr1 4848057 4857550 NM_001159750 1 + #> 7 chr1 4848057 4857550 NM_011541 1 + #> 8 chr1 4848584 4857550 NM_001159751 1 + #> 9 chr1 4857613 4868107 NM_001159750 2 + #> 10 chr1 4857613 4868107 NM_011541 2 + #> # ℹ 1,573 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_tss.html","id":null,"dir":"Reference","previous_headings":"","what":"Create transcription start site features. — create_tss","title":"Create transcription start site features. — create_tss","text":"Create transcription start site features.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/create_tss.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create transcription start site features. — create_tss","text":"","code":"create_tss(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_tss.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create transcription start site features. — create_tss","text":"x ivl_df BED format","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/create_tss.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create transcription start site features. — create_tss","text":"","code":"x <- read_bed12(valr_example(\"mm9.refGene.bed.gz\")) create_tss(x) #> # A tibble: 100 × 6 #> chrom start end name score strand #> #> 1 chr1 3661578 3661579 NM_001011874 0 - #> 2 chr1 4399321 4399322 NM_001195662 0 - #> 3 chr1 4847774 4847775 NM_001159750 0 + #> 4 chr1 4847774 4847775 NM_011541 0 + #> 5 chr1 4848408 4848409 NM_001159751 0 + #> 6 chr1 5008814 5008815 NM_001290372 0 - #> 7 chr1 5009619 5009620 NM_021374 0 - #> 8 chr1 5060365 5060366 NM_001177795 0 - #> 9 chr1 5073166 5073167 NM_001310442 0 + #> 10 chr1 5073166 5073167 NM_133826 0 + #> # ℹ 90 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs3.html","id":null,"dir":"Reference","previous_headings":"","what":"Create 3' UTR features. — create_utrs3","title":"Create 3' UTR features. — create_utrs3","text":"Create 3' UTR features.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs3.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create 3' UTR features. — create_utrs3","text":"","code":"create_utrs3(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs3.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create 3' UTR features. — create_utrs3","text":"x ivl_df BED12 format","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs3.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create 3' UTR features. — create_utrs3","text":"","code":"x <- read_bed12(valr_example(\"mm9.refGene.bed.gz\")) create_utrs3(x) #> # A tibble: 99 × 6 #> chrom start end name score strand #> #> 1 chr1 3204562 3206102 NM_001011874 0 - #> 2 chr1 4280926 4283061 NM_001195662 0 - #> 3 chr1 4886445 4887990 NM_001159750 0 + #> 4 chr1 4886445 4887990 NM_011541 0 + #> 5 chr1 4886445 4887990 NM_001159751 0 + #> 6 chr1 4899656 4900554 NM_001290372 0 - #> 7 chr1 4899656 4900554 NM_021374 0 - #> 8 chr1 4899656 4900554 NM_001177795 0 - #> 9 chr1 5152246 5152630 NM_001310442 0 + #> 10 chr1 5152246 5152630 NM_133826 0 + #> # ℹ 89 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs5.html","id":null,"dir":"Reference","previous_headings":"","what":"Create 5' UTR features. — create_utrs5","title":"Create 5' UTR features. — create_utrs5","text":"Create 5' UTR features.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs5.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create 5' UTR features. — create_utrs5","text":"","code":"create_utrs5(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs5.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create 5' UTR features. — create_utrs5","text":"x ivl_df BED12 format","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/create_utrs5.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create 5' UTR features. — create_utrs5","text":"","code":"x <- read_bed12(valr_example(\"mm9.refGene.bed.gz\")) create_utrs5(x) #> # A tibble: 97 × 6 #> chrom start end name score strand #> #> 1 chr1 3661429 3661579 NM_001011874 0 - #> 2 chr1 4399268 4399322 NM_001195662 0 - #> 3 chr1 4847774 4847994 NM_001159750 0 + #> 4 chr1 4847774 4847994 NM_011541 0 + #> 5 chr1 4848408 4848488 NM_001159751 0 + #> 6 chr1 4914046 5008815 NM_001290372 0 - #> 7 chr1 5009460 5009620 NM_021374 0 - #> 8 chr1 5060258 5060366 NM_001177795 0 - #> 9 chr1 5073166 5074531 NM_001310442 0 + #> 10 chr1 5073166 5074531 NM_133826 0 + #> # ℹ 87 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/db.html","id":null,"dir":"Reference","previous_headings":"","what":"Fetch data from remote databases. — db","title":"Fetch data from remote databases. — db","text":"Currently db_ucsc db_ensembl available connections.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/db.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fetch data from remote databases. — db","text":"","code":"db_ucsc( dbname, host = \"genome-mysql.cse.ucsc.edu\", user = \"genomep\", password = \"password\", port = 3306, ... ) db_ensembl( dbname, host = \"ensembldb.ensembl.org\", user = \"anonymous\", password = \"\", port = 3306, ... )"},{"path":"https://rnabioco.github.io/valr/dev/reference/db.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fetch data from remote databases. — db","text":"dbname name database host hostname user username password password port MySQL connection port ... params connection","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/db.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fetch data from remote databases. — db","text":"","code":"if (FALSE) { if (require(RMariaDB)) { library(dplyr) ucsc <- db_ucsc(\"hg38\") # fetch the `refGene` tbl tbl(ucsc, \"refGene\") # the `chromInfo` tbls have size information tbl(ucsc, \"chromInfo\") } } if (FALSE) { if (require(RMariaDB)) { library(dplyr) # squirrel genome ensembl <- db_ensembl(\"spermophilus_tridecemlineatus_core_67_2\") tbl(ensembl, \"gene\") } }"},{"path":"https://rnabioco.github.io/valr/dev/reference/flip_strands.html","id":null,"dir":"Reference","previous_headings":"","what":"Flip strands in intervals. — flip_strands","title":"Flip strands in intervals. — flip_strands","text":"Flips positive (+) stranded intervals negative (-) strands, vice-versa. Facilitates comparisons among intervals opposing strands.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/flip_strands.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Flip strands in intervals. — flip_strands","text":"","code":"flip_strands(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/flip_strands.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Flip strands in intervals. — flip_strands","text":"x ivl_df","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/flip_strands.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Flip strands in intervals. — flip_strands","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, ~strand, \"chr1\", 1, 100, \"+\", \"chr2\", 1, 100, \"-\" ) flip_strands(x) #> # A tibble: 2 × 4 #> chrom start end strand #> #> 1 chr1 1 100 - #> 2 chr2 1 100 +"},{"path":"https://rnabioco.github.io/valr/dev/reference/gr_to_bed.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert Granges to bed tibble — gr_to_bed","title":"Convert Granges to bed tibble — gr_to_bed","text":"Convert Granges bed tibble","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/gr_to_bed.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert Granges to bed tibble — gr_to_bed","text":"","code":"gr_to_bed(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/gr_to_bed.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert Granges to bed tibble — gr_to_bed","text":"x GRanges object convert bed tibble.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/gr_to_bed.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert Granges to bed tibble — gr_to_bed","text":"tibble::tibble()","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/gr_to_bed.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convert Granges to bed tibble — gr_to_bed","text":"","code":"if (FALSE) { gr <- GenomicRanges::GRanges( seqnames = S4Vectors::Rle( c(\"chr1\", \"chr2\", \"chr1\", \"chr3\"), c(1, 1, 1, 1) ), ranges = IRanges::IRanges( start = c(1, 10, 50, 100), end = c(100, 500, 1000, 2000), names = head(letters, 4) ), strand = S4Vectors::Rle( c(\"-\", \"+\"), c(2, 2) ) ) gr_to_bed(gr) # There are two ways to convert a bed-like data.frame to GRanges: gr <- GenomicRanges::GRanges( seqnames = S4Vectors::Rle(x$chrom), ranges = IRanges::IRanges( start = x$start + 1, end = x$end, names = x$name ), strand = S4Vectors::Rle(x$strand) ) # or: gr <- GenomicRanges::makeGRangesFromDataFrame(dplyr::mutate(x, start = start + 1)) }"},{"path":"https://rnabioco.github.io/valr/dev/reference/id.html","id":null,"dir":"Reference","previous_headings":"","what":"Plyr function id packaged due to plyr being retired\nCompute a unique numeric id for each unique row in a data frame. — id","title":"Plyr function id packaged due to plyr being retired\nCompute a unique numeric id for each unique row in a data frame. — id","text":"Properties: order(id) equivalent .call(order, df) rows containing data value drop = FALSE room possibilites","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/id.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plyr function id packaged due to plyr being retired\nCompute a unique numeric id for each unique row in a data frame. — id","text":"","code":"id(.variables, drop = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/id.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plyr function id packaged due to plyr being retired\nCompute a unique numeric id for each unique row in a data frame. — id","text":".variables list variables drop drop unusued factor levels?","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/id.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Plyr function id packaged due to plyr being retired\nCompute a unique numeric id for each unique row in a data frame. — id","text":"numeric vector attribute n, giving total number possibilities","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/id_var.html","id":null,"dir":"Reference","previous_headings":"","what":"Plyr function id_var packaged due to plyr being retired\nNumeric id for a vector. — id_var","title":"Plyr function id_var packaged due to plyr being retired\nNumeric id for a vector. — id_var","text":"Plyr function id_var packaged due plyr retired Numeric id vector.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/id_var.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plyr function id_var packaged due to plyr being retired\nNumeric id for a vector. — id_var","text":"","code":"id_var(x, drop = FALSE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/interval_spacing.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate interval spacing. — interval_spacing","title":"Calculate interval spacing. — interval_spacing","text":"Spacing first interval chromosome undefined (NA). leading interval overlapping interval pair negative value.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/interval_spacing.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate interval spacing. — interval_spacing","text":"","code":"interval_spacing(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/interval_spacing.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate interval spacing. — interval_spacing","text":"x ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/interval_spacing.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate interval spacing. — interval_spacing","text":"ivl_df .spacing column.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/interval_spacing.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate interval spacing. — interval_spacing","text":"","code":"x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 1, 100, \"chr1\", 150, 200, \"chr2\", 200, 300 ) interval_spacing(x) #> # A tibble: 3 × 4 #> chrom start end .spacing #> #> 1 chr1 1 100 NA #> 2 chr1 150 200 50 #> 3 chr2 200 300 NA"},{"path":"https://rnabioco.github.io/valr/dev/reference/ivl_df.html","id":null,"dir":"Reference","previous_headings":"","what":"Bed-like data.frame requirements for valr functions — ivl_df","title":"Bed-like data.frame requirements for valr functions — ivl_df","text":"Required column names interval dataframes chrom, start end. Internally interval dataframes validated using check_interval() Required column names genome dataframes chrom size. Internally genome dataframes validated using check_genome().","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/ivl_df.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Bed-like data.frame requirements for valr functions — ivl_df","text":"","code":"check_interval(x) check_genome(x)"},{"path":"https://rnabioco.github.io/valr/dev/reference/ivl_df.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Bed-like data.frame requirements for valr functions — ivl_df","text":"x data.frame tibble::tibble","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/ivl_df.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Bed-like data.frame requirements for valr functions — ivl_df","text":"","code":"# using tibble x <- tibble::tribble( ~chrom, ~start, ~end, \"chr1\", 1, 50, \"chr1\", 10, 75, \"chr1\", 100, 120 ) check_interval(x) #> # A tibble: 3 × 3 #> chrom start end #> #> 1 chr1 1 50 #> 2 chr1 10 75 #> 3 chr1 100 120 # using base R data.frame x <- data.frame( chrom = \"chr1\", start = 0, end = 100, stringsAsFactors = FALSE ) check_interval(x) #> # A tibble: 1 × 3 #> chrom start end #> #> 1 chr1 0 100 # example genome input x <- tibble::tribble( ~chrom, ~size, \"chr1\", 1e6 ) check_genome(x) #> # A tibble: 1 × 2 #> chrom size #> #> 1 chr1 1000000"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bed.html","id":null,"dir":"Reference","previous_headings":"","what":"Read BED and related files. — read_bed","title":"Read BED and related files. — read_bed","text":"read functions BED related formats. Filenames can local file URLs. read functions load data tbls consistent chrom, start end colnames.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bed.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read BED and related files. — read_bed","text":"","code":"read_bed( filename, col_types = bed12_coltypes, sort = TRUE, ..., n_fields = NULL ) read_bed12(filename, ...) read_bedgraph(filename, ...) read_narrowpeak(filename, ...) read_broadpeak(filename, ...)"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bed.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read BED and related files. — read_bed","text":"filename file URL col_types column type spec readr::read_tsv() sort sort tbl chrom start ... options pass readr::read_tsv() n_fields","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bed.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Read BED and related files. — read_bed","text":"ivl_df","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bed.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Read BED and related files. — read_bed","text":"https://genome.ucsc.edu/FAQ/FAQformat.html#format1 https://genome.ucsc.edu/FAQ/FAQformat.html#format1 https://genome.ucsc.edu/goldenPath/help/bedgraph.html https://genome.ucsc.edu/FAQ/FAQformat.html#format12 https://genome.ucsc.edu/FAQ/FAQformat.html#format13","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bed.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read BED and related files. — read_bed","text":"","code":"# read_bed assumes 3 field BED format. read_bed(valr_example(\"3fields.bed.gz\")) #> # A tibble: 10 × 3 #> chrom start end #> #> 1 chr1 11873 14409 #> 2 chr1 14361 19759 #> 3 chr1 14406 29370 #> 4 chr1 34610 36081 #> 5 chr1 69090 70008 #> 6 chr1 134772 140566 #> 7 chr1 321083 321115 #> 8 chr1 321145 321207 #> 9 chr1 322036 326938 #> 10 chr1 327545 328439 # result is sorted by chrom and start unless `sort = FALSE` read_bed(valr_example(\"3fields.bed.gz\"), sort = FALSE) #> # A tibble: 10 × 3 #> chrom start end #> #> 1 chr1 11873 14409 #> 2 chr1 14361 19759 #> 3 chr1 14406 29370 #> 4 chr1 34610 36081 #> 5 chr1 69090 70008 #> 6 chr1 134772 140566 #> 7 chr1 321083 321115 #> 8 chr1 321145 321207 #> 9 chr1 322036 326938 #> 10 chr1 327545 328439 read_bed12(valr_example(\"mm9.refGene.bed.gz\")) #> # A tibble: 100 × 12 #> chrom start end name score strand cds_start cds_end item_rgb #> #> 1 chr1 3204562 3661579 NM_00101… 0 - 3206102 3661429 0 #> 2 chr1 4280926 4399322 NM_00119… 0 - 4283061 4399268 0 #> 3 chr1 4847774 4887990 NM_00115… 0 + 4847994 4886445 0 #> 4 chr1 4847774 4887990 NM_011541 0 + 4847994 4886445 0 #> 5 chr1 4848408 4887990 NM_00115… 0 + 4848488 4886445 0 #> 6 chr1 4899656 5008815 NM_00129… 0 - 4900554 4914046 0 #> 7 chr1 4899656 5009620 NM_021374 0 - 4900554 5009460 0 #> 8 chr1 4899656 5060366 NM_00117… 0 - 4900554 5060258 0 #> 9 chr1 5073166 5152630 NM_00131… 0 + 5074531 5152246 0 #> 10 chr1 5073166 5152630 NM_133826 0 + 5074531 5152246 0 #> # ℹ 90 more rows #> # ℹ 3 more variables: exon_count , exon_sizes , #> # exon_starts read_bedgraph(valr_example(\"test.bg.gz\")) #> # A tibble: 4 × 4 #> chrom start end value #> #> 1 chr19 49302000 49302300 -1 #> 2 chr19 49302300 49302600 -0.75 #> 3 chr19 49302600 49302900 -0.5 #> 4 chr19 49302900 49303200 -0.25 read_narrowpeak(valr_example(\"sample.narrowPeak.gz\")) #> # A tibble: 570 × 10 #> chrom start end name score strand signal pvalue qvalue peak #> #> 1 chr22 17372940 17373090 . 0 . 4 4.63 -1 -1 #> 2 chr22 17392200 17392350 . 0 . 5 4.67 -1 -1 #> 3 chr22 17398400 17398550 . 0 . 10 11.6 -1 -1 #> 4 chr22 17539180 17539330 . 0 . 21 30.9 -1 -1 #> 5 chr22 17652440 17652590 . 0 . 6 5.35 -1 -1 #> 6 chr22 17652780 17652930 . 0 . 12 12.5 -1 -1 #> 7 chr22 17980800 17980950 . 0 . 12 12.6 -1 -1 #> 8 chr22 18038260 18038410 . 0 . 29 36.0 -1 -1 #> 9 chr22 18225280 18225430 . 0 . 21 25.0 -1 -1 #> 10 chr22 18268020 18268170 . 0 . 14 13.0 -1 -1 #> # ℹ 560 more rows read_broadpeak(valr_example(\"sample.broadPeak.gz\")) #> # A tibble: 1,181 × 9 #> chrom start end name score strand signal pvalue qvalue #> #> 1 chr22 16847903 16848440 . 503 . 10.5 2.5 -1 #> 2 chr22 16849452 16851326 . 483 . 9.81 15.7 -1 #> 3 chr22 16849955 16850086 . 1000 . 32.4 4.2 -1 #> 4 chr22 16850694 16850924 . 831 . 22.5 4.9 -1 #> 5 chr22 16852964 16853782 . 499 . 10.4 6.2 -1 #> 6 chr22 16855065 16855803 . 477 . 9.58 3.9 -1 #> 7 chr22 16855944 16856974 . 491 . 10.1 8.5 -1 #> 8 chr22 16857425 16857958 . 505 . 10.6 2.5 -1 #> 9 chr22 16858284 16858824 . 549 . 12.2 4.5 -1 #> 10 chr22 16859972 16862024 . 404 . 6.89 9.3 -1 #> # ℹ 1,171 more rows"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bigwig.html","id":null,"dir":"Reference","previous_headings":"","what":"Import and convert a bigwig file into a valr compatible tbl — read_bigwig","title":"Import and convert a bigwig file into a valr compatible tbl — read_bigwig","text":"function output 5 column tibble zero-based chrom, start, end, score, strand columns.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bigwig.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Import and convert a bigwig file into a valr compatible tbl — read_bigwig","text":"","code":"read_bigwig(path, set_strand = \"+\")"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bigwig.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Import and convert a bigwig file into a valr compatible tbl — read_bigwig","text":"path path bigWig file set_strand strand add output (defaults \"+\")","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bigwig.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Import and convert a bigwig file into a valr compatible tbl — read_bigwig","text":"functions uses rtracklayer import bigwigs unstable support windows platform therefore may error windows users (particularly 32 bit window users).","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_bigwig.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Import and convert a bigwig file into a valr compatible tbl — read_bigwig","text":"","code":"if (FALSE) { if (.Platform$OS.type != \"windows\") { bw <- read_bigwig(valr_example(\"hg19.dnase1.bw\")) head(bw) } }"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_genome.html","id":null,"dir":"Reference","previous_headings":"","what":"Read genome files. — read_genome","title":"Read genome files. — read_genome","text":"Genome files (UCSC \"chromSize\" files) contain chromosome name size information. sizes used downstream functions identify computed intervals coordinates outside genome bounds.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_genome.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read genome files. — read_genome","text":"","code":"read_genome(path)"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_genome.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read genome files. — read_genome","text":"path containing chrom/contig names sizes, one-pair-per-line, tab-delimited","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_genome.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Read genome files. — read_genome","text":"genome_df, sorted size","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_genome.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Read genome files. — read_genome","text":"URLs genome files can also used.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/read_genome.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read genome files. — read_genome","text":"","code":"read_genome(valr_example(\"hg19.chrom.sizes.gz\")) #> # A tibble: 25 × 2 #> chrom size #> #> 1 chr1 249250621 #> 2 chr2 243199373 #> 3 chr3 198022430 #> 4 chr4 191154276 #> 5 chr5 180915260 #> 6 chr6 171115067 #> 7 chr7 159138663 #> 8 chrX 155270560 #> 9 chr8 146364022 #> 10 chr9 141213431 #> # ℹ 15 more rows if (FALSE) { # `read_genome` accepts a URL read_genome(\"https://genome.ucsc.edu/goldenpath/help/hg19.chrom.sizes\") }"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_gtf.html","id":null,"dir":"Reference","previous_headings":"","what":"Import and convert a GTF/GFF file into a valr compatible bed tbl format — read_gtf","title":"Import and convert a GTF/GFF file into a valr compatible bed tbl format — read_gtf","text":"function output tibble required chrom, start, end columns, well columns depending content GTF/GFF file.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_gtf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Import and convert a GTF/GFF file into a valr compatible bed tbl format — read_gtf","text":"","code":"read_gtf(path, zero_based = TRUE)"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_gtf.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Import and convert a GTF/GFF file into a valr compatible bed tbl format — read_gtf","text":"path path gtf gff file zero_based TRUE, convert zero based","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_gtf.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Import and convert a GTF/GFF file into a valr compatible bed tbl format — read_gtf","text":"","code":"gtf <- read_gtf(valr_example(\"hg19.gencode.gtf.gz\")) head(gtf) #> # A tibble: 6 × 26 #> chrom start end width strand source type score phase gene_id #> #> 1 chr2 43449540 43453748 4208 - HAVANA gene NA NA ENSG00… #> 2 chr2 43449540 43453748 4208 - HAVANA transcr… NA NA ENSG00… #> 3 chr2 43453403 43453748 345 - HAVANA exon NA NA ENSG00… #> 4 chr2 43453403 43453454 51 - HAVANA CDS NA 0 ENSG00… #> 5 chr2 43453451 43453454 3 - HAVANA start_c… NA 0 ENSG00… #> 6 chr2 43449540 43452891 3351 - HAVANA exon NA NA ENSG00… #> # ℹ 16 more variables: transcript_id , gene_type , #> # gene_status , gene_name , transcript_type , #> # transcript_status , transcript_name , level , #> # havana_gene , protein_id , tag , ccdsid , #> # havana_transcript , exon_number , exon_id , ont "},{"path":"https://rnabioco.github.io/valr/dev/reference/read_vcf.html","id":null,"dir":"Reference","previous_headings":"","what":"Read a VCF file. — read_vcf","title":"Read a VCF file. — read_vcf","text":"Read VCF file.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_vcf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read a VCF file. — read_vcf","text":"","code":"read_vcf(vcf)"},{"path":"https://rnabioco.github.io/valr/dev/reference/read_vcf.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read a VCF file. — read_vcf","text":"vcf vcf filename","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_vcf.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Read a VCF file. — read_vcf","text":"data_frame","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/read_vcf.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Read a VCF file. — read_vcf","text":"return value chrom, start end columns. Interval lengths size 'REF' field.","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/read_vcf.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read a VCF file. — read_vcf","text":"","code":"vcf_file <- valr_example(\"test.vcf.gz\") read_vcf(vcf_file) #> # A tibble: 11 × 18 #> CHROM POS ID REF ALT QUAL FILTER INFO FORMAT X1 X2 #> #> 1 1 10 1:10 A T 100 PASS NS=5;A… GT 0/0 ./. #> 2 1 20 1:20 G C 100 PASS NS=0;A… GT ./. ./. #> 3 1 30 1:30 C A 100 PASS NS=6;A… GT 0/0 0/0 #> 4 1 40 1:40 A C 100 PASS NS=6;A… GT 0/0 0/0 #> 5 1 10000 1:10000 G C 100 PASS NS=6;A… GT 0/0 0/0 #> 6 1 20000 1:20000 T A 100 PASS NS=6;A… GT 1/1 1/1 #> 7 4 5000 4:5000 A T 100 PASS NS=6;A… GT 1/1 1/1 #> 8 4 6000 4:6000 C T 100 PASS NS=6;A… GT 1/1 1/1 #> 9 X 800 X:800 A C 100 PASS NS=6;A… GT 1/1 1/1 #> 10 X 900 X:900 A T 100 PASS NS=6;A… GT 1/1 1/1 #> 11 X 1000 X:1000 T G 100 PASS NS=5;A… GT 1/1 1/1 #> # ℹ 7 more variables: X3 , X4 , X5 , X6 , #> # chrom , start , end "},{"path":"https://rnabioco.github.io/valr/dev/reference/valr.html","id":null,"dir":"Reference","previous_headings":"","what":"valr: genome interval arithmetic in R — valr","title":"valr: genome interval arithmetic in R — valr","text":"valr provides tools read manipulate intervals signals genome reference. valr developed facilitate interactive analysis genome-scale data sets, leveraging power dplyr piping.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/valr.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"valr: genome interval arithmetic in R — valr","text":"learn valr, start vignette: browseVignettes(package = \"valr\")","code":""},{"path":[]},{"path":"https://rnabioco.github.io/valr/dev/reference/valr.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"valr: genome interval arithmetic in R — valr","text":"Jay Hesselberth jay.hesselberth@gmail.com Kent Riemondy kent.riemondy@gmail.com","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/valr_example.html","id":null,"dir":"Reference","previous_headings":"","what":"Provide working directory for valr example files. — valr_example","title":"Provide working directory for valr example files. — valr_example","text":"Provide working directory valr example files.","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/valr_example.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Provide working directory for valr example files. — valr_example","text":"","code":"valr_example(path)"},{"path":"https://rnabioco.github.io/valr/dev/reference/valr_example.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Provide working directory for valr example files. — valr_example","text":"path path file","code":""},{"path":"https://rnabioco.github.io/valr/dev/reference/valr_example.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Provide working directory for valr example files. — valr_example","text":"","code":"valr_example(\"hg19.chrom.sizes.gz\") #> [1] \"/home/runner/work/_temp/Library/valr/extdata/hg19.chrom.sizes.gz\""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-development-version","dir":"Changelog","previous_headings":"","what":"valr (development version)","title":"valr (development version)","text":"Added bed_genomecov() compute interval coverage across genome.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-070","dir":"Changelog","previous_headings":"","what":"valr 0.7.0","title":"valr 0.7.0","text":"CRAN release: 2023-09-18 read_bed related functions now automatically calculate fields. Use n_fields deprecated.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-068","dir":"Changelog","previous_headings":"","what":"valr 0.6.8","title":"valr 0.6.8","text":"CRAN release: 2023-05-16 bed_closest() now reports x intervals, even closest y intervals (e.g. matching chromosome y intervals). intervals returned populated NA .overlap, .dist y interval locations. Reimplemented bed_closest() use binary search rather interval tree search. closest y interval can missed previous search strategy high depth interval trees. Fix one error using max_dist argument bed_cluster() (#401).","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-067","dir":"Changelog","previous_headings":"","what":"valr 0.6.7","title":"valr 0.6.7","text":"CRAN release: 2023-02-18 Removed SystemRequirements DESCRIPTION eliminate NOTE CRAN. bed_coverage() now reports intervals x matching group y (#395).","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-066","dir":"Changelog","previous_headings":"","what":"valr 0.6.6","title":"valr 0.6.6","text":"CRAN release: 2022-10-11 Updated intervalTree header commit f0c4046 valr now uses cli consistent errors messages interactive use. deprecated genome argument bed_makewindows() removed.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-065","dir":"Changelog","previous_headings":"","what":"valr 0.6.5","title":"valr 0.6.5","text":"CRAN release: 2022-08-19 Handle max_dist first intervals bed_cluster() (#388)","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-064","dir":"Changelog","previous_headings":"","what":"valr 0.6.4","title":"valr 0.6.4","text":"CRAN release: 2021-12-08 Fixed intron score numbering error create_introns (#377 @sheridar) Fixed bug handling list inputs bed_intersect()(#380 @sheridar) Added read_bigwig read_gtf functions import data valr compatible tibbles (#379) Kent Riemondy now maintainer.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-063","dir":"Changelog","previous_headings":"","what":"valr 0.6.3","title":"valr 0.6.3","text":"CRAN release: 2021-05-15 Update prepare readr 2.0.0","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-062","dir":"Changelog","previous_headings":"","what":"valr 0.6.2","title":"valr 0.6.2","text":"CRAN release: 2020-10-07","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-6-2","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.6.2","text":"RMariaDB replaced deprecated RMySQL package database backend. valr now imports Rcpp, always case, masked Import readr, recently dropped use Rcpp.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-061","dir":"Changelog","previous_headings":"","what":"valr 0.6.1","title":"valr 0.6.1","text":"CRAN release: 2020-05-08","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-6-1","dir":"Changelog","previous_headings":"","what":"Bug Fixes","title":"valr 0.6.1","text":"Fixed rchk unprotect error (#365)","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-060","dir":"Changelog","previous_headings":"","what":"valr 0.6.0","title":"valr 0.6.0","text":"CRAN release: 2020-05-04","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"major-changes-0-6-0","dir":"Changelog","previous_headings":"","what":"Major changes","title":"valr 0.6.0","text":"trbl_interval() trbl_genome() custom tibble subclasses deemed unnecessary removed package. coercing GRanges valr compatible data.frame now uses gr_to_bed() function rather .trbl_interal() methods.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-6-0","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.6.0","text":"dplyr version < 0.8.0 longer supported due unnecessary code bloat challenges handling multiple grouping structures (#359). sort_by argument bed_random() changed sorted, now default use bed_sort() sort output, rather rely naming sorting columns. Sorting can suppressed using sorted = FALSE. bed_sort() now uses base R sorting radix method increased speed. (#353) tbls processed bed_merge()bed_sort() longer store either merged sorted attributes, due attributes rarely checked codebase potential sources unexpected behavior.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-6-0","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"valr 0.6.0","text":"Fixed bed_closest() prevent erroneous intervals reported adjacent closest intervals present y table. (#348) Factor columns used grouping returned factors rather inappropriately coerced integer vectors (#360)","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-050","dir":"Changelog","previous_headings":"","what":"valr 0.5.0","title":"valr 0.5.0","text":"CRAN release: 2019-01-03","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"major-changes-0-5-0","dir":"Changelog","previous_headings":"","what":"Major changes","title":"valr 0.5.0","text":"Internal Rcpp functions reorganized remove dependencies dplyr C++ functions.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-5-0","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.5.0","text":"Due internal refactoring Rcpp functions, data.frames containing Numeric, Logical, Integer, Character, List column types supported. Columns containing Raw, Complex, R classes supported issue error. Factors now disallowed grouping variables multiset operations avoid sort order discrepancies, compatibility factor handling dplyr v.0.8.0. Factors now internally type-converted character warning issued.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-042","dir":"Changelog","previous_headings":"","what":"valr 0.4.2","title":"valr 0.4.2","text":"CRAN release: 2018-11-17","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-4-2","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"valr 0.4.2","text":"Changed behavior .tbl_interval() call as_tibble() non-tibble input, prevents groups stripped tibble() input (#338).","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-041","dir":"Changelog","previous_headings":"","what":"valr 0.4.1","title":"valr 0.4.1","text":"CRAN release: 2018-06-08 Added new function, bed_partition(), similar bed_merge() collapses intervals elemental intervals rather maximal overlapping region. bed_partition() also can compute summaries data overlapping intervals. See examples bed_partition() timings vignette('benchmarks') @kriemo. Several explicit comparisons Bioconductor GenomicRanges library included users considering using valr. See examples .tbl_interval() timings vignette('benchmarks').","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-040","dir":"Changelog","previous_headings":"","what":"valr 0.4.0","title":"valr 0.4.0","text":"CRAN release: 2018-01-25","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-4-0","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.4.0","text":"relevant tests bedtool2 ported valr. Bugs identified corner cases new tests fixed (#328 @raysinesis) bed_jaccard() now works grouped inputs (#216) Update dplyr header files v0.7 bed_intersect() internal intersect_impl refactored enable return non-intersecting intervals. genome argument bed_makewindows() deprecated produce warning used. Also error handling added check warn intervals smaller requested window size makewindows_impl() (#312 @kriemo)","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-4-0","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"valr 0.4.0","text":"Fixed one error reported distances bed_closest(). Distances reported now bedtools closest behavior (#311). bed_glyph() accepts trbl_intervals named x y (#318). bed_makewindows() now returns number windows specified num_win input intervals evenly divisble num_win, consistent bedtools behavior. output findOverlaps() now sorted subtract_impl() prevent reporting intervals dropped calling bed_subtract() (#316 @kriemo)","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-031","dir":"Changelog","previous_headings":"","what":"valr 0.3.1","title":"valr 0.3.1","text":"CRAN release: 2017-07-22","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"enhancements-0-3-1","dir":"Changelog","previous_headings":"","what":"Enhancements","title":"valr 0.3.1","text":"manuscript describing valr published F1000Research. New S3 generic .tbl_interval() converts GenomicRanges::GRanges objects tbl_interval. New create_tss() creating transcription start sites. Improve documentation interval statistics complex examples.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-3-1","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.3.1","text":"bed_sort() de-deprecated reduce arrange calls library code.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-3-1","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"valr 0.3.1","text":"bed_merge() now reports start/end columns spec provided (#288)","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-030","dir":"Changelog","previous_headings":"","what":"valr 0.3.0","title":"valr 0.3.0","text":"CRAN release: 2017-06-15","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"enhancements-0-3-0","dir":"Changelog","previous_headings":"","what":"Enhancements","title":"valr 0.3.0","text":"New create_introns(), create_utrs5() create_utrs3() functions generating features BED12 files. Speed-ups bed_makewindows() (~50x), bed_merge() (~4x), bed_flank() (~4x) (thanks @kriemo @sheridar). Thanks sponsors Biofrontiers Hackathon caffeine underlying improvements.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-3-0","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"valr 0.3.0","text":"intervals bed_random() now sorted properly.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-020","dir":"Changelog","previous_headings":"","what":"valr 0.2.0","title":"valr 0.2.0","text":"CRAN release: 2017-05-05","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"major-changes-0-2-0","dir":"Changelog","previous_headings":"","what":"Major changes","title":"valr 0.2.0","text":"Package dplyr v0.5.0 headers valr remove dplyr LinkingTo dependency. bed_intersect() now accepts multiple tbls intersection (#220 @kriemo). new tbl_interval() tbl_genome() wrap tibbles enforce strict column naming. trbl_interval() trbl_genome() constructors take tibble::tribble() formatting .tbl_interval() .tbl_genome() used check valid classes.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-2-0","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.2.0","text":"intervals returned bed_random() sorted chrom start default.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-2-0","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"valr 0.2.0","text":"Merge intervals bed_jaccard() use numeric values calculation (fixes #204).","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-012","dir":"Changelog","previous_headings":"","what":"valr 0.1.2","title":"valr 0.1.2","text":"CRAN release: 2017-03-16","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"major-changes-0-1-2","dir":"Changelog","previous_headings":"","what":"Major changes","title":"valr 0.1.2","text":"Deprecate bed_sort() favor using dplyr::arrange() explicitly (fixes #134).","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-1-2","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.1.2","text":"add src/init.c calls R_registerRoutines R_useDynamicSymbols address NOTE r-devel Deprecate dist parameter bed_closest() favor using user supplied functions (#182 @kriemo) Make .id values sequential across chroms bed_cluster() output (#171) Transfer repository http://github.com/rnabioco/valr, update links docs. Move shiny app new repo (http://github.com/rnabioco/valrdata). Add Kent Riemondy LICENSE file.","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"bug-fixes-0-1-2","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"valr 0.1.2","text":"bed_merge() now merges contained intervals (#177)","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-011","dir":"Changelog","previous_headings":"","what":"valr 0.1.1","title":"valr 0.1.1","text":"CRAN release: 2016-12-01","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"minor-changes-0-1-1","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"valr 0.1.1","text":"test / vignette guards Suggested RMySQL fixed memory leak absdist.cpp fixed vignette entry names","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"valr-010","dir":"Changelog","previous_headings":"","what":"valr 0.1.0","title":"valr 0.1.0","text":"CRAN release: 2016-11-21","code":""},{"path":"https://rnabioco.github.io/valr/dev/news/index.html","id":"major-changes-0-1-0","dir":"Changelog","previous_headings":"","what":"Major changes","title":"valr 0.1.0","text":"initial release CRAN","code":""}] diff --git a/dev/sitemap.xml b/dev/sitemap.xml index 32b743b3..2a4cdd8d 100644 --- a/dev/sitemap.xml +++ b/dev/sitemap.xml @@ -57,6 +57,9 @@ https://rnabioco.github.io/valr/dev/reference/bed_flank.html + + https://rnabioco.github.io/valr/dev/reference/bed_genomecov.html + https://rnabioco.github.io/valr/dev/reference/bed_glyph.html