changeset 3:b120a98cf623 draft

"planemo upload for repository https://github.com/mesocentre-clermont-auvergne/aubi_piaf commit 48a10de1b21f94ab8019d9d0e4a43e0bd9d0c31e-dirty"
author agpetit
date Fri, 27 May 2022 07:36:52 +0000
parents c574ada16e76
children 433dba16af7d
files run_installed_tests.html test-data/Distance_distribution_by_aquaporin.png test-data/Distance_distribution_by_protomer.png test-data/Distance_distribution_on_all_protomers.png test-data/all_graphics_distribution.pdf
diffstat 5 files changed, 947 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run_installed_tests.html	Fri May 27 07:36:52 2022 +0000
@@ -0,0 +1,947 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8"/>
+    <title>Test Report</title>
+    <style>body {
+  font-family: Helvetica, Arial, sans-serif;
+  font-size: 12px;
+  /* do not increase min-width as some may use split screens */
+  min-width: 800px;
+  color: #999;
+}
+
+h1 {
+  font-size: 24px;
+  color: black;
+}
+
+h2 {
+  font-size: 16px;
+  color: black;
+}
+
+p {
+  color: black;
+}
+
+a {
+  color: #999;
+}
+
+table {
+  border-collapse: collapse;
+}
+
+/******************************
+ * SUMMARY INFORMATION
+ ******************************/
+#environment td {
+  padding: 5px;
+  border: 1px solid #E6E6E6;
+}
+#environment tr:nth-child(odd) {
+  background-color: #f6f6f6;
+}
+
+/******************************
+ * TEST RESULT COLORS
+ ******************************/
+span.passed,
+.passed .col-result {
+  color: green;
+}
+
+span.skipped,
+span.xfailed,
+span.rerun,
+.skipped .col-result,
+.xfailed .col-result,
+.rerun .col-result {
+  color: orange;
+}
+
+span.error,
+span.failed,
+span.xpassed,
+.error .col-result,
+.failed .col-result,
+.xpassed .col-result {
+  color: red;
+}
+
+/******************************
+ * RESULTS TABLE
+ *
+ * 1. Table Layout
+ * 2. Extra
+ * 3. Sorting items
+ *
+ ******************************/
+/*------------------
+ * 1. Table Layout
+ *------------------*/
+#results-table {
+  border: 1px solid #e6e6e6;
+  color: #999;
+  font-size: 12px;
+  width: 100%;
+}
+#results-table th,
+#results-table td {
+  padding: 5px;
+  border: 1px solid #E6E6E6;
+  text-align: left;
+}
+#results-table th {
+  font-weight: bold;
+}
+
+/*------------------
+ * 2. Extra
+ *------------------*/
+.log {
+  background-color: #e6e6e6;
+  border: 1px solid #e6e6e6;
+  color: black;
+  display: block;
+  font-family: "Courier New", Courier, monospace;
+  height: 230px;
+  overflow-y: scroll;
+  padding: 5px;
+  white-space: pre-wrap;
+}
+.log:only-child {
+  height: inherit;
+}
+
+div.image {
+  border: 1px solid #e6e6e6;
+  float: right;
+  height: 240px;
+  margin-left: 5px;
+  overflow: hidden;
+  width: 320px;
+}
+div.image img {
+  width: 320px;
+}
+
+div.video {
+  border: 1px solid #e6e6e6;
+  float: right;
+  height: 240px;
+  margin-left: 5px;
+  overflow: hidden;
+  width: 320px;
+}
+div.video video {
+  overflow: hidden;
+  width: 320px;
+  height: 240px;
+}
+
+.collapsed {
+  display: none;
+}
+
+.expander::after {
+  content: " (show details)";
+  color: #BBB;
+  font-style: italic;
+  cursor: pointer;
+}
+
+.collapser::after {
+  content: " (hide details)";
+  color: #BBB;
+  font-style: italic;
+  cursor: pointer;
+}
+
+/*------------------
+ * 3. Sorting items
+ *------------------*/
+.sortable {
+  cursor: pointer;
+}
+
+.sort-icon {
+  font-size: 0px;
+  float: left;
+  margin-right: 5px;
+  margin-top: 5px;
+  /*triangle*/
+  width: 0;
+  height: 0;
+  border-left: 8px solid transparent;
+  border-right: 8px solid transparent;
+}
+.inactive .sort-icon {
+  /*finish triangle*/
+  border-top: 8px solid #E6E6E6;
+}
+.asc.active .sort-icon {
+  /*finish triangle*/
+  border-bottom: 8px solid #999;
+}
+.desc.active .sort-icon {
+  /*finish triangle*/
+  border-top: 8px solid #999;
+}
+</style></head>
+  <body onLoad="init()">
+    <script>/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+function toArray(iter) {
+    if (iter === null) {
+        return null;
+    }
+    return Array.prototype.slice.call(iter);
+}
+
+function find(selector, elem) { // eslint-disable-line no-redeclare
+    if (!elem) {
+        elem = document;
+    }
+    return elem.querySelector(selector);
+}
+
+function findAll(selector, elem) {
+    if (!elem) {
+        elem = document;
+    }
+    return toArray(elem.querySelectorAll(selector));
+}
+
+function sortColumn(elem) {
+    toggleSortStates(elem);
+    const colIndex = toArray(elem.parentNode.childNodes).indexOf(elem);
+    let key;
+    if (elem.classList.contains('result')) {
+        key = keyResult;
+    } else if (elem.classList.contains('links')) {
+        key = keyLink;
+    } else {
+        key = keyAlpha;
+    }
+    sortTable(elem, key(colIndex));
+}
+
+function showAllExtras() { // eslint-disable-line no-unused-vars
+    findAll('.col-result').forEach(showExtras);
+}
+
+function hideAllExtras() { // eslint-disable-line no-unused-vars
+    findAll('.col-result').forEach(hideExtras);
+}
+
+function showExtras(colresultElem) {
+    const extras = colresultElem.parentNode.nextElementSibling;
+    const expandcollapse = colresultElem.firstElementChild;
+    extras.classList.remove('collapsed');
+    expandcollapse.classList.remove('expander');
+    expandcollapse.classList.add('collapser');
+}
+
+function hideExtras(colresultElem) {
+    const extras = colresultElem.parentNode.nextElementSibling;
+    const expandcollapse = colresultElem.firstElementChild;
+    extras.classList.add('collapsed');
+    expandcollapse.classList.remove('collapser');
+    expandcollapse.classList.add('expander');
+}
+
+function showFilters() {
+    const filterItems = document.getElementsByClassName('filter');
+    for (let i = 0; i < filterItems.length; i++)
+        filterItems[i].hidden = false;
+}
+
+function addCollapse() {
+    // Add links for show/hide all
+    const resulttable = find('table#results-table');
+    const showhideall = document.createElement('p');
+    showhideall.innerHTML = '<a href="javascript:showAllExtras()">Show all details</a> / ' +
+                            '<a href="javascript:hideAllExtras()">Hide all details</a>';
+    resulttable.parentElement.insertBefore(showhideall, resulttable);
+
+    // Add show/hide link to each result
+    findAll('.col-result').forEach(function(elem) {
+        const collapsed = getQueryParameter('collapsed') || 'Passed';
+        const extras = elem.parentNode.nextElementSibling;
+        const expandcollapse = document.createElement('span');
+        if (extras.classList.contains('collapsed')) {
+            expandcollapse.classList.add('expander');
+        } else if (collapsed.includes(elem.innerHTML)) {
+            extras.classList.add('collapsed');
+            expandcollapse.classList.add('expander');
+        } else {
+            expandcollapse.classList.add('collapser');
+        }
+        elem.appendChild(expandcollapse);
+
+        elem.addEventListener('click', function(event) {
+            if (event.currentTarget.parentNode.nextElementSibling.classList.contains('collapsed')) {
+                showExtras(event.currentTarget);
+            } else {
+                hideExtras(event.currentTarget);
+            }
+        });
+    });
+}
+
+function getQueryParameter(name) {
+    const match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
+    return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
+}
+
+function init () { // eslint-disable-line no-unused-vars
+    resetSortHeaders();
+
+    addCollapse();
+
+    showFilters();
+
+    sortColumn(find('.initial-sort'));
+
+    findAll('.sortable').forEach(function(elem) {
+        elem.addEventListener('click',
+            function() {
+                sortColumn(elem);
+            }, false);
+    });
+}
+
+function sortTable(clicked, keyFunc) {
+    const rows = findAll('.results-table-row');
+    const reversed = !clicked.classList.contains('asc');
+    const sortedRows = sort(rows, keyFunc, reversed);
+    /* Whole table is removed here because browsers acts much slower
+     * when appending existing elements.
+     */
+    const thead = document.getElementById('results-table-head');
+    document.getElementById('results-table').remove();
+    const parent = document.createElement('table');
+    parent.id = 'results-table';
+    parent.appendChild(thead);
+    sortedRows.forEach(function(elem) {
+        parent.appendChild(elem);
+    });
+    document.getElementsByTagName('BODY')[0].appendChild(parent);
+}
+
+function sort(items, keyFunc, reversed) {
+    const sortArray = items.map(function(item, i) {
+        return [keyFunc(item), i];
+    });
+
+    sortArray.sort(function(a, b) {
+        const keyA = a[0];
+        const keyB = b[0];
+
+        if (keyA == keyB) return 0;
+
+        if (reversed) {
+            return keyA < keyB ? 1 : -1;
+        } else {
+            return keyA > keyB ? 1 : -1;
+        }
+    });
+
+    return sortArray.map(function(item) {
+        const index = item[1];
+        return items[index];
+    });
+}
+
+function keyAlpha(colIndex) {
+    return function(elem) {
+        return elem.childNodes[1].childNodes[colIndex].firstChild.data.toLowerCase();
+    };
+}
+
+function keyLink(colIndex) {
+    return function(elem) {
+        const dataCell = elem.childNodes[1].childNodes[colIndex].firstChild;
+        return dataCell == null ? '' : dataCell.innerText.toLowerCase();
+    };
+}
+
+function keyResult(colIndex) {
+    return function(elem) {
+        const strings = ['Error', 'Failed', 'Rerun', 'XFailed', 'XPassed',
+            'Skipped', 'Passed'];
+        return strings.indexOf(elem.childNodes[1].childNodes[colIndex].firstChild.data);
+    };
+}
+
+function resetSortHeaders() {
+    findAll('.sort-icon').forEach(function(elem) {
+        elem.parentNode.removeChild(elem);
+    });
+    findAll('.sortable').forEach(function(elem) {
+        const icon = document.createElement('div');
+        icon.className = 'sort-icon';
+        icon.textContent = 'vvv';
+        elem.insertBefore(icon, elem.firstChild);
+        elem.classList.remove('desc', 'active');
+        elem.classList.add('asc', 'inactive');
+    });
+}
+
+function toggleSortStates(elem) {
+    //if active, toggle between asc and desc
+    if (elem.classList.contains('active')) {
+        elem.classList.toggle('asc');
+        elem.classList.toggle('desc');
+    }
+
+    //if inactive, reset all other functions and add ascending active
+    if (elem.classList.contains('inactive')) {
+        resetSortHeaders();
+        elem.classList.remove('inactive');
+        elem.classList.add('active');
+    }
+}
+
+function isAllRowsHidden(value) {
+    return value.hidden == false;
+}
+
+function filterTable(elem) { // eslint-disable-line no-unused-vars
+    const outcomeAtt = 'data-test-result';
+    const outcome = elem.getAttribute(outcomeAtt);
+    const classOutcome = outcome + ' results-table-row';
+    const outcomeRows = document.getElementsByClassName(classOutcome);
+
+    for(let i = 0; i < outcomeRows.length; i++){
+        outcomeRows[i].hidden = !elem.checked;
+    }
+
+    const rows = findAll('.results-table-row').filter(isAllRowsHidden);
+    const allRowsHidden = rows.length == 0 ? true : false;
+    const notFoundMessage = document.getElementById('not-found-message');
+    notFoundMessage.hidden = !allRowsHidden;
+}
+</script>
+    <h1>run_installed_tests.html</h1>
+    <p>Report generated on 27-May-2022 at 09:08:27 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v3.1.1</p>
+    <h2>Environment</h2>
+    <table id="environment">
+      <tr>
+        <td>Packages</td>
+        <td>{"pluggy": "1.0.0", "py": "1.11.0", "pytest": "6.2.5"}</td></tr>
+      <tr>
+        <td>Platform</td>
+        <td>Linux-5.13.0-44-generic-x86_64-with-glibc2.29</td></tr>
+      <tr>
+        <td>Plugins</td>
+        <td>{"anyio": "3.5.0", "asyncio": "0.17.2", "celery": "0.0.0", "cov": "3.0.0", "html": "3.1.1", "json-report": "1.4.1", "metadata": "1.11.0", "mock": "3.7.0", "postgresql": "4.1.0", "pythonpath": "0.7.3", "shard": "0.1.2"}</td></tr>
+      <tr>
+        <td>Python</td>
+        <td>3.8.10</td></tr></table>
+    <h2>Summary</h2>
+    <p>5 tests ran in 162.57 seconds. </p>
+    <p class="filter" hidden="true">(Un)check the boxes to filter the results.</p><input checked="true" class="filter" data-test-result="passed" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="passed">3 passed</span>, <input checked="true" class="filter" data-test-result="skipped" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="skipped">0 skipped</span>, <input checked="true" class="filter" data-test-result="failed" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="failed">2 failed</span>, <input checked="true" class="filter" data-test-result="error" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="error">0 errors</span>, <input checked="true" class="filter" data-test-result="xfailed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="xfailed">0 expected failures</span>, <input checked="true" class="filter" data-test-result="xpassed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="xpassed">0 unexpected passes</span>
+    <h2>Results</h2>
+    <table id="results-table">
+      <thead id="results-table-head">
+        <tr>
+          <th class="sortable result initial-sort" col="result">Result</th>
+          <th class="sortable" col="name">Test</th>
+          <th class="sortable" col="duration">Duration</th>
+          <th class="sortable links" col="links">Links</th></tr>
+        <tr hidden="true" id="not-found-message">
+          <th colspan="4">No results found. Try to check the filters</th></tr></thead>
+      <tbody class="failed results-table-row">
+        <tr>
+          <td class="col-result">Failed</td>
+          <td class="col-name">test/functional/test_toolbox_pytest.py::test_tool[testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0_test_2]</td>
+          <td class="col-duration">38.80</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="log">testcases = (&#x27;testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0_test_2&#x27;, ...d.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0 testMethod=runTest&gt;, 1)<br/>driver = &lt;functional.test_toolbox_pytest.DefaultGalaxyTestDriver object at 0x7f227250c280&gt;<br/><br/>    @pytest.mark.parametrize(&quot;testcases&quot;, cases(), ids=idfn)<br/>    def test_tool(testcases, driver):<br/>        test = testcases[1]<br/>&gt;       test.do_it(test_index=testcases[2])<br/><br/>test/functional/test_toolbox_pytest.py:84: <br/>_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ <br/>test/functional/test_toolbox.py:35: in do_it<br/>    verify_tool(tool_id, self.galaxy_interactor, resource_parameters=resource_parameters, test_index=test_index, tool_version=tool_version, register_job_data=register_job_data)<br/>lib/galaxy/tool_util/verify/interactor.py:1127: in verify_tool<br/>    raise e<br/>lib/galaxy/tool_util/verify/interactor.py:1123: in verify_tool<br/>    job_stdio = _verify_outputs(testdef, test_history, jobs, data_list, data_collection_list, galaxy_interactor, quiet=quiet)<br/>_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ <br/><br/>testdef = &lt;galaxy.tool_util.verify.interactor.ToolTestDescription object at 0x7f226f4f3c40&gt;, history = &#x27;54f2a3a23292eb07&#x27;<br/>jobs = [{&#x27;create_time&#x27;: &#x27;2022-05-27T07:07:09.529613&#x27;, &#x27;exit_code&#x27;: None, &#x27;galaxy_version&#x27;: &#x27;22.01&#x27;, &#x27;history_id&#x27;: &#x27;54f2a3a23292eb07&#x27;, ...}]<br/>data_list = {&#x27;cut_log&#x27;: {&#x27;create_time&#x27;: &#x27;2022-05-27T07:07:09.533075&#x27;, &#x27;data_type&#x27;: &#x27;galaxy.datatypes.data.Text&#x27;, &#x27;deleted&#x27;: False,...157069a5-6727-4eb8-9d80-8a551afe1093&#x27;, &#x27;validated_state&#x27;: &#x27;unknown&#x27;, &#x27;validated_state_message&#x27;: None, &#x27;visible&#x27;: True}}<br/>data_collection_list = {&#x27;output_traj&#x27;: {&#x27;collection_type&#x27;: &#x27;list&#x27;, &#x27;contents_url&#x27;: &#x27;/api/dataset_collections/5729865256bc2525/contents/5729865256bc2525&#x27;, &#x27;create_time&#x27;: &#x27;2022-05-27T07:07:09.531693&#x27;, &#x27;deleted&#x27;: False, ...}}<br/>galaxy_interactor = &lt;galaxy.tool_util.verify.interactor.GalaxyInteractorApi object at 0x7f2214721b50&gt;, quiet = False<br/><br/>    def _verify_outputs(testdef, history, jobs, data_list, data_collection_list, galaxy_interactor, quiet=False):<br/>        assert len(jobs) == 1, &quot;Test framework logic error, somehow tool test resulted in more than one job.&quot;<br/>        job = jobs[0]<br/>    <br/>        found_exceptions = []<br/>    <br/>        def register_exception(e):<br/>            if not found_exceptions and not quiet:<br/>                # Only print this stuff out once.<br/>                for stream in [&#x27;stdout&#x27;, &#x27;stderr&#x27;]:<br/>                    if stream in job_stdio:<br/>                        print(_format_stream(job_stdio[stream], stream=stream, format=True), file=sys.stderr)<br/>            found_exceptions.append(e)<br/>    <br/>        if testdef.expect_failure:<br/>            if testdef.outputs:<br/>                raise Exception(&quot;Cannot specify outputs in a test expecting failure.&quot;)<br/>    <br/>        maxseconds = testdef.maxseconds<br/>        # Wait for the job to complete and register expections if the final<br/>        # status was not what test was expecting.<br/>        job_failed = False<br/>        try:<br/>            galaxy_interactor.wait_for_job(job[&#x27;id&#x27;], history, maxseconds)<br/>        except Exception as e:<br/>            job_failed = True<br/>            if not testdef.expect_failure:<br/>                found_exceptions.append(e)<br/>    <br/>        job_stdio = galaxy_interactor.get_job_stdio(job[&#x27;id&#x27;])<br/>    <br/>        if testdef.num_outputs is not None:<br/>            expected = testdef.num_outputs<br/>            actual = len(data_list) + len(data_collection_list)<br/>            if expected != actual:<br/>                message = f&quot;Incorrect number of outputs - expected {expected}, found {actual}: datasets {data_list.keys()} collections {data_collection_list.keys()}&quot;<br/>                error = AssertionError(message)<br/>                register_exception(error)<br/>    <br/>        if not job_failed and testdef.expect_failure:<br/>            error = AssertionError(&quot;Expected job to fail but Galaxy indicated the job successfully completed.&quot;)<br/>            register_exception(error)<br/>    <br/>        expect_exit_code = testdef.expect_exit_code<br/>        if expect_exit_code is not None:<br/>            exit_code = job_stdio[&quot;exit_code&quot;]<br/>            if str(expect_exit_code) != str(exit_code):<br/>                error = AssertionError(f&quot;Expected job to complete with exit code {expect_exit_code}, found {exit_code}&quot;)<br/>                register_exception(error)<br/>    <br/>        for output_index, output_dict in enumerate(testdef.outputs):<br/>            # Get the correct hid<br/>            name = output_dict[&quot;name&quot;]<br/>            outfile = output_dict[&quot;value&quot;]<br/>            attributes = output_dict[&quot;attributes&quot;]<br/>            output_testdef = Bunch(name=name, outfile=outfile, attributes=attributes)<br/>            try:<br/>                output_data = data_list[name]<br/>            except (TypeError, KeyError):<br/>                # Legacy - fall back on ordered data list access if data_list is<br/>                # just a list (case with twill variant or if output changes its<br/>                # name).<br/>                if hasattr(data_list, &quot;values&quot;):<br/>                    output_data = list(data_list.values())[output_index]<br/>                else:<br/>                    output_data = data_list[len(data_list) - len(testdef.outputs) + output_index]<br/>            assert output_data is not None<br/>            try:<br/>                galaxy_interactor.verify_output(history, jobs, output_data, output_testdef=output_testdef, tool_id=job[&#x27;tool_id&#x27;], maxseconds=maxseconds, tool_version=testdef.tool_version)<br/>            except Exception as e:<br/>                register_exception(e)<br/>    <br/>        other_checks = {<br/>            &quot;command_line&quot;: &quot;Command produced by the job&quot;,<br/>            &quot;command_version&quot;: &quot;Tool version indicated during job execution&quot;,<br/>            &quot;stdout&quot;: &quot;Standard output of the job&quot;,<br/>            &quot;stderr&quot;: &quot;Standard error of the job&quot;,<br/>        }<br/>        # TODO: Only hack the stdio like this for older profile, for newer tool profiles<br/>        # add some syntax for asserting job messages maybe - or just drop this because exit<br/>        # code and regex on stdio can be tested directly - so this is really testing Galaxy<br/>        # core handling more than the tool.<br/>        job_messages = job_stdio.get(&quot;job_messages&quot;) or []<br/>        stdout_prefix = &quot;&quot;<br/>        stderr_prefix = &quot;&quot;<br/>        for job_message in job_messages:<br/>            message_type = job_message.get(&quot;type&quot;)<br/>            if message_type == &quot;regex&quot; and job_message.get(&quot;stream&quot;) == &quot;stderr&quot;:<br/>                stderr_prefix += f&quot;{job_message.get(&#x27;desc&#x27;) or &#x27;&#x27;}\n&quot;<br/>            elif message_type == &quot;regex&quot; and job_message.get(&quot;stream&quot;) == &quot;stdout&quot;:<br/>                stdout_prefix += f&quot;{job_message.get(&#x27;desc&#x27;) or &#x27;&#x27;}\n&quot;<br/>            elif message_type == &quot;exit_code&quot;:<br/>                stderr_prefix += f&quot;{job_message.get(&#x27;desc&#x27;) or &#x27;&#x27;}\n&quot;<br/>            else:<br/>                raise Exception(f&quot;Unknown job message type [{message_type}] in [{job_message}]&quot;)<br/>    <br/>        for what, description in other_checks.items():<br/>            if getattr(testdef, what, None) is not None:<br/>                try:<br/>                    raw_data = job_stdio[what]<br/>                    assertions = getattr(testdef, what)<br/>                    if what == &quot;stdout&quot;:<br/>                        data = stdout_prefix + raw_data<br/>                    elif what == &quot;stderr&quot;:<br/>                        data = stderr_prefix + raw_data<br/>                    else:<br/>                        data = raw_data<br/>                    verify_assertions(data, assertions)<br/>                except AssertionError as err:<br/>                    errmsg = f&#x27;{description} different than expected\n&#x27;<br/>                    errmsg += util.unicodify(err)<br/>                    register_exception(AssertionError(errmsg))<br/>    <br/>        for output_collection_def in testdef.output_collections:<br/>            try:<br/>                name = output_collection_def.name<br/>                # TODO: data_collection_list is clearly a bad name for dictionary.<br/>                if name not in data_collection_list:<br/>                    message = f&quot;Failed to find output [{name}], tool outputs include [{&#x27;,&#x27;.join(data_collection_list.keys())}]&quot;<br/>                    raise AssertionError(message)<br/>    <br/>                # Data collection returned from submission, elements may have been populated after<br/>                # the job completed so re-hit the API for more information.<br/>                data_collection_id = data_collection_list[name][&quot;id&quot;]<br/>                galaxy_interactor.verify_output_collection(output_collection_def, data_collection_id, history, job[&#x27;tool_id&#x27;])<br/>            except Exception as e:<br/>                register_exception(e)<br/>    <br/>        if found_exceptions and not testdef.expect_test_failure:<br/>&gt;           raise JobOutputsError(found_exceptions, job_stdio)<br/><span class="error">E           galaxy.tool_util.verify.interactor.JobOutputsError: Output cut_log:  different than expected</span><br/><span class="error">E           Expected 241+-0 lines in the output found 163</span><br/><br/>lib/galaxy/tool_util/verify/interactor.py:1299: JobOutputsError<br/> ------------------------------Captured stderr call------------------------------ <br/>2022-05-27 09:06:44,120 DEBUG [multipart.multipart] Calling on_field_start with no data
+2022-05-27 09:06:44,121 DEBUG [multipart.multipart] Calling on_field_name with data[0:4]
+2022-05-27 09:06:44,121 DEBUG [multipart.multipart] Calling on_field_data with data[5:153]
+2022-05-27 09:06:44,121 DEBUG [multipart.multipart] Calling on_field_end with no data
+2022-05-27 09:06:44,121 DEBUG [multipart.multipart] Calling on_end with no data
+2022-05-27 09:06:45,213 INFO  [galaxy.tools] Validated and populated state for tool request (21.598 ms)
+2022-05-27 09:06:45,219 DEBUG [galaxy.tools.actions.upload] Persisted uploads (0.142 ms)
+2022-05-27 09:06:45,353 DEBUG [galaxy.tools.actions.upload] Checked uploads (134.155 ms)
+2022-05-27 09:06:45,360 DEBUG [galaxy.tools.actions.upload] Created upload job (6.274 ms)
+2022-05-27 09:06:45,381 INFO  [galaxy.web_stack.handlers] (Job[id=7,tool_id=upload1]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:06:46,309 INFO  [galaxy.jobs.handler] (7) Job dispatched
+2022-05-27 09:06:46,485 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/7/tool_script.sh] for tool command [python &#x27;/tmp/tmptoruqmiy/galaxy-dev/tools/data_source/upload.py&#x27; &#x27;/tmp/tmptoruqmiy/galaxy-dev&#x27; &#x27;/tmp/tmptoruqmiy/job_working_directory/000/7/registry.xml&#x27; &#x27;/tmp/upload_params_n9cdh_8t&#x27; &#x27;8:/tmp/tmptoruqmiy/job_working_directory/000/7/working/dataset_af8d1b0c-d748-4b88-935e-429302b926ec_files:/tmp/tmptoruqmiy/files/a/f/8/dataset_af8d1b0c-d748-4b88-935e-429302b926ec.dat&#x27;]
+2022-05-27 09:06:54,095 INFO  [galaxy.tools] Validated and populated state for tool request (24.710 ms)
+2022-05-27 09:06:54,102 DEBUG [galaxy.tools.actions.upload] Persisted uploads (0.144 ms)
+2022-05-27 09:06:54,215 DEBUG [galaxy.tools.actions.upload] Checked uploads (113.287 ms)
+2022-05-27 09:06:54,221 DEBUG [galaxy.tools.actions.upload] Created upload job (5.835 ms)
+2022-05-27 09:06:54,242 INFO  [galaxy.web_stack.handlers] (Job[id=8,tool_id=upload1]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:06:54,873 INFO  [galaxy.jobs.handler] (8) Job dispatched
+2022-05-27 09:06:55,123 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/8/tool_script.sh] for tool command [python &#x27;/tmp/tmptoruqmiy/galaxy-dev/tools/data_source/upload.py&#x27; &#x27;/tmp/tmptoruqmiy/galaxy-dev&#x27; &#x27;/tmp/tmptoruqmiy/job_working_directory/000/8/registry.xml&#x27; &#x27;/tmp/upload_params__n8zpgmo&#x27; &#x27;9:/tmp/tmptoruqmiy/job_working_directory/000/8/working/dataset_2f2d7be8-929e-4b65-a898-06a921300c73_files:/tmp/tmptoruqmiy/files/2/f/2/dataset_2f2d7be8-929e-4b65-a898-06a921300c73.dat&#x27;]
+2022-05-27 09:07:01,790 INFO  [galaxy.tools] Validated and populated state for tool request (23.541 ms)
+2022-05-27 09:07:01,796 DEBUG [galaxy.tools.actions.upload] Persisted uploads (0.142 ms)
+2022-05-27 09:07:01,908 DEBUG [galaxy.tools.actions.upload] Checked uploads (112.494 ms)
+2022-05-27 09:07:01,916 DEBUG [galaxy.tools.actions.upload] Created upload job (7.217 ms)
+2022-05-27 09:07:01,941 INFO  [galaxy.web_stack.handlers] (Job[id=9,tool_id=upload1]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:07:02,320 INFO  [galaxy.jobs.handler] (9) Job dispatched
+2022-05-27 09:07:02,533 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/9/tool_script.sh] for tool command [python &#x27;/tmp/tmptoruqmiy/galaxy-dev/tools/data_source/upload.py&#x27; &#x27;/tmp/tmptoruqmiy/galaxy-dev&#x27; &#x27;/tmp/tmptoruqmiy/job_working_directory/000/9/registry.xml&#x27; &#x27;/tmp/upload_params_d9ksd_uu&#x27; &#x27;10:/tmp/tmptoruqmiy/job_working_directory/000/9/working/dataset_1cbe15a0-33cd-4c77-a7eb-cfce8034f2bb_files:/tmp/tmptoruqmiy/files/1/c/b/dataset_1cbe15a0-33cd-4c77-a7eb-cfce8034f2bb.dat&#x27;]
+2022-05-27 09:07:09,478 INFO  [galaxy.tools] Validated and populated state for tool request (23.189 ms)
+2022-05-27 09:07:09,492 INFO  [galaxy.tools.actions] Handled collection output named output_traj for tool testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0 (2.367 ms)
+2022-05-27 09:07:09,494 INFO  [galaxy.tools.actions] Handled output named cut_log for tool testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0 (1.967 ms)
+2022-05-27 09:07:09,511 INFO  [galaxy.tools.actions] Added output datasets to history (17.096 ms)
+2022-05-27 09:07:09,515 INFO  [galaxy.tools.actions] Setup for job Job[unflushed,tool_id=testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0] complete, ready to be enqueued (3.762 ms)
+2022-05-27 09:07:09,558 INFO  [galaxy.web_stack.handlers] (Job[id=10,tool_id=testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:07:09,901 INFO  [galaxy.jobs.handler] (10) Job dispatched
+2022-05-27 09:07:10,139 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/10/tool_script.sh] for tool command [[ &quot;$(basename &quot;$CONDA_DEFAULT_ENV&quot;)&quot; = &quot;$(basename &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27;)&quot; ] || {
+MAX_TRIES=3
+COUNT=0
+while [ $COUNT -lt $MAX_TRIES ]; do
+    . &#x27;/home/aepetit/miniconda3/bin/activate&#x27; &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27; &gt; conda_activate.log 2&gt;&amp;1
+    if [ $? -eq 0 ];then
+        break
+    else
+        let COUNT=COUNT+1
+        if [ $COUNT -eq $MAX_TRIES ];then
+            echo &quot;Failed to activate conda environment! Error was:&quot;
+            cat conda_activate.log
+            exit 1
+        fi
+        sleep 10s
+    fi
+done
+} ; [ &quot;$(basename &quot;$CONDA_DEFAULT_ENV&quot;)&quot; = &quot;$(basename &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27;)&quot; ] || {
+MAX_TRIES=3
+COUNT=0
+while [ $COUNT -lt $MAX_TRIES ]; do
+    . &#x27;/home/aepetit/miniconda3/bin/activate&#x27; &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27; &gt; conda_activate.log 2&gt;&amp;1
+    if [ $? -eq 0 ];then
+        break
+    else
+        let COUNT=COUNT+1
+        if [ $COUNT -eq $MAX_TRIES ];then
+            echo &quot;Failed to activate conda environment! Error was:&quot;
+            cat conda_activate.log
+            exit 1
+        fi
+        sleep 10s
+    fi
+done
+} ; [ &quot;$(basename &quot;$CONDA_DEFAULT_ENV&quot;)&quot; = &quot;$(basename &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27;)&quot; ] || {
+MAX_TRIES=3
+COUNT=0
+while [ $COUNT -lt $MAX_TRIES ]; do
+    . &#x27;/home/aepetit/miniconda3/bin/activate&#x27; &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27; &gt; conda_activate.log 2&gt;&amp;1
+    if [ $? -eq 0 ];then
+        break
+    else
+        let COUNT=COUNT+1
+        if [ $COUNT -eq $MAX_TRIES ];then
+            echo &quot;Failed to activate conda environment! Error was:&quot;
+            cat conda_activate.log
+            exit 1
+        fi
+        sleep 10s
+    fi
+done
+} ; ln -s &#x27;/tmp/tmptoruqmiy/files/a/f/8/dataset_af8d1b0c-d748-4b88-935e-429302b926ec.dat&#x27; &#x27;PIP2.1_test.gro&#x27; &amp;&amp; ln -s &#x27;/tmp/tmptoruqmiy/files/2/f/2/dataset_2f2d7be8-929e-4b65-a898-06a921300c73.dat&#x27; &#x27;PIP2.1_test.xtc&#x27; &amp;&amp; ln -s &#x27;/tmp/tmptoruqmiy/files/1/c/b/dataset_1cbe15a0-33cd-4c77-a7eb-cfce8034f2bb.dat&#x27; &#x27;estimated_number_of_sub_trajectories.tsv&#x27; &amp;&amp; python &#x27;/tmp/tmptoruqmiy/shed_tools/testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/c09cf8acc4de/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories.py&#x27; --verbose --gro_file &#x27;PIP2.1_test.gro&#x27; --xtc_file &#x27;PIP2.1_test.xtc&#x27; --log_output &#x27;log/cut_trajectories.log&#x27; --output_directory &#x27;out/&#x27; --nbr_sub_traj &#x27;estimated_number_of_sub_trajectories.tsv&#x27; --group_output 0 --number_cpus &quot;${GALAXY_SLOTS:-1}&quot;]
+---------------------- &gt;&gt; begin tool stdout &lt;&lt; -----------------------
+
+----------------------- &gt;&gt; end tool stdout &lt;&lt; ------------------------
+
+---------------------- &gt;&gt; begin tool stderr &lt;&lt; -----------------------
+
+----------------------- &gt;&gt; end tool stderr &lt;&lt; ------------------------
+
+<br/> -------------------------------Captured log call-------------------------------- <br/>DEBUG    multipart.multipart:multipart.py:604 Calling on_field_start with no data
+DEBUG    multipart.multipart:multipart.py:601 Calling on_field_name with data[0:4]
+DEBUG    multipart.multipart:multipart.py:601 Calling on_field_data with data[5:153]
+DEBUG    multipart.multipart:multipart.py:604 Calling on_field_end with no data
+DEBUG    multipart.multipart:multipart.py:604 Calling on_end with no data<br/></div></td></tr></tbody>
+      <tbody class="failed results-table-row">
+        <tr>
+          <td class="col-result">Failed</td>
+          <td class="col-name">test/functional/test_toolbox_pytest.py::test_tool[testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0_test_3]</td>
+          <td class="col-duration">40.43</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="log">testcases = (&#x27;testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0_test_3&#x27;, ...d.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0 testMethod=runTest&gt;, 2)<br/>driver = &lt;functional.test_toolbox_pytest.DefaultGalaxyTestDriver object at 0x7f227250c280&gt;<br/><br/>    @pytest.mark.parametrize(&quot;testcases&quot;, cases(), ids=idfn)<br/>    def test_tool(testcases, driver):<br/>        test = testcases[1]<br/>&gt;       test.do_it(test_index=testcases[2])<br/><br/>test/functional/test_toolbox_pytest.py:84: <br/>_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ <br/>test/functional/test_toolbox.py:35: in do_it<br/>    verify_tool(tool_id, self.galaxy_interactor, resource_parameters=resource_parameters, test_index=test_index, tool_version=tool_version, register_job_data=register_job_data)<br/>lib/galaxy/tool_util/verify/interactor.py:1127: in verify_tool<br/>    raise e<br/>lib/galaxy/tool_util/verify/interactor.py:1123: in verify_tool<br/>    job_stdio = _verify_outputs(testdef, test_history, jobs, data_list, data_collection_list, galaxy_interactor, quiet=quiet)<br/>_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ <br/><br/>testdef = &lt;galaxy.tool_util.verify.interactor.ToolTestDescription object at 0x7f226f22bd30&gt;, history = &#x27;8155e4b4bf1581ff&#x27;<br/>jobs = [{&#x27;create_time&#x27;: &#x27;2022-05-27T07:07:50.059003&#x27;, &#x27;exit_code&#x27;: None, &#x27;galaxy_version&#x27;: &#x27;22.01&#x27;, &#x27;history_id&#x27;: &#x27;8155e4b4bf1581ff&#x27;, ...}]<br/>data_list = {&#x27;cut_log&#x27;: {&#x27;create_time&#x27;: &#x27;2022-05-27T07:07:50.063180&#x27;, &#x27;data_type&#x27;: &#x27;galaxy.datatypes.data.Text&#x27;, &#x27;deleted&#x27;: False,...11db857f-5e9e-40b7-ab71-3aba6213bc8b&#x27;, &#x27;validated_state&#x27;: &#x27;unknown&#x27;, &#x27;validated_state_message&#x27;: None, &#x27;visible&#x27;: True}}<br/>data_collection_list = {&#x27;output_traj&#x27;: {&#x27;collection_type&#x27;: &#x27;list&#x27;, &#x27;contents_url&#x27;: &#x27;/api/dataset_collections/54f2a3a23292eb07/contents/54f2a3a23292eb07&#x27;, &#x27;create_time&#x27;: &#x27;2022-05-27T07:07:50.061399&#x27;, &#x27;deleted&#x27;: False, ...}}<br/>galaxy_interactor = &lt;galaxy.tool_util.verify.interactor.GalaxyInteractorApi object at 0x7f2214721b50&gt;, quiet = False<br/><br/>    def _verify_outputs(testdef, history, jobs, data_list, data_collection_list, galaxy_interactor, quiet=False):<br/>        assert len(jobs) == 1, &quot;Test framework logic error, somehow tool test resulted in more than one job.&quot;<br/>        job = jobs[0]<br/>    <br/>        found_exceptions = []<br/>    <br/>        def register_exception(e):<br/>            if not found_exceptions and not quiet:<br/>                # Only print this stuff out once.<br/>                for stream in [&#x27;stdout&#x27;, &#x27;stderr&#x27;]:<br/>                    if stream in job_stdio:<br/>                        print(_format_stream(job_stdio[stream], stream=stream, format=True), file=sys.stderr)<br/>            found_exceptions.append(e)<br/>    <br/>        if testdef.expect_failure:<br/>            if testdef.outputs:<br/>                raise Exception(&quot;Cannot specify outputs in a test expecting failure.&quot;)<br/>    <br/>        maxseconds = testdef.maxseconds<br/>        # Wait for the job to complete and register expections if the final<br/>        # status was not what test was expecting.<br/>        job_failed = False<br/>        try:<br/>            galaxy_interactor.wait_for_job(job[&#x27;id&#x27;], history, maxseconds)<br/>        except Exception as e:<br/>            job_failed = True<br/>            if not testdef.expect_failure:<br/>                found_exceptions.append(e)<br/>    <br/>        job_stdio = galaxy_interactor.get_job_stdio(job[&#x27;id&#x27;])<br/>    <br/>        if testdef.num_outputs is not None:<br/>            expected = testdef.num_outputs<br/>            actual = len(data_list) + len(data_collection_list)<br/>            if expected != actual:<br/>                message = f&quot;Incorrect number of outputs - expected {expected}, found {actual}: datasets {data_list.keys()} collections {data_collection_list.keys()}&quot;<br/>                error = AssertionError(message)<br/>                register_exception(error)<br/>    <br/>        if not job_failed and testdef.expect_failure:<br/>            error = AssertionError(&quot;Expected job to fail but Galaxy indicated the job successfully completed.&quot;)<br/>            register_exception(error)<br/>    <br/>        expect_exit_code = testdef.expect_exit_code<br/>        if expect_exit_code is not None:<br/>            exit_code = job_stdio[&quot;exit_code&quot;]<br/>            if str(expect_exit_code) != str(exit_code):<br/>                error = AssertionError(f&quot;Expected job to complete with exit code {expect_exit_code}, found {exit_code}&quot;)<br/>                register_exception(error)<br/>    <br/>        for output_index, output_dict in enumerate(testdef.outputs):<br/>            # Get the correct hid<br/>            name = output_dict[&quot;name&quot;]<br/>            outfile = output_dict[&quot;value&quot;]<br/>            attributes = output_dict[&quot;attributes&quot;]<br/>            output_testdef = Bunch(name=name, outfile=outfile, attributes=attributes)<br/>            try:<br/>                output_data = data_list[name]<br/>            except (TypeError, KeyError):<br/>                # Legacy - fall back on ordered data list access if data_list is<br/>                # just a list (case with twill variant or if output changes its<br/>                # name).<br/>                if hasattr(data_list, &quot;values&quot;):<br/>                    output_data = list(data_list.values())[output_index]<br/>                else:<br/>                    output_data = data_list[len(data_list) - len(testdef.outputs) + output_index]<br/>            assert output_data is not None<br/>            try:<br/>                galaxy_interactor.verify_output(history, jobs, output_data, output_testdef=output_testdef, tool_id=job[&#x27;tool_id&#x27;], maxseconds=maxseconds, tool_version=testdef.tool_version)<br/>            except Exception as e:<br/>                register_exception(e)<br/>    <br/>        other_checks = {<br/>            &quot;command_line&quot;: &quot;Command produced by the job&quot;,<br/>            &quot;command_version&quot;: &quot;Tool version indicated during job execution&quot;,<br/>            &quot;stdout&quot;: &quot;Standard output of the job&quot;,<br/>            &quot;stderr&quot;: &quot;Standard error of the job&quot;,<br/>        }<br/>        # TODO: Only hack the stdio like this for older profile, for newer tool profiles<br/>        # add some syntax for asserting job messages maybe - or just drop this because exit<br/>        # code and regex on stdio can be tested directly - so this is really testing Galaxy<br/>        # core handling more than the tool.<br/>        job_messages = job_stdio.get(&quot;job_messages&quot;) or []<br/>        stdout_prefix = &quot;&quot;<br/>        stderr_prefix = &quot;&quot;<br/>        for job_message in job_messages:<br/>            message_type = job_message.get(&quot;type&quot;)<br/>            if message_type == &quot;regex&quot; and job_message.get(&quot;stream&quot;) == &quot;stderr&quot;:<br/>                stderr_prefix += f&quot;{job_message.get(&#x27;desc&#x27;) or &#x27;&#x27;}\n&quot;<br/>            elif message_type == &quot;regex&quot; and job_message.get(&quot;stream&quot;) == &quot;stdout&quot;:<br/>                stdout_prefix += f&quot;{job_message.get(&#x27;desc&#x27;) or &#x27;&#x27;}\n&quot;<br/>            elif message_type == &quot;exit_code&quot;:<br/>                stderr_prefix += f&quot;{job_message.get(&#x27;desc&#x27;) or &#x27;&#x27;}\n&quot;<br/>            else:<br/>                raise Exception(f&quot;Unknown job message type [{message_type}] in [{job_message}]&quot;)<br/>    <br/>        for what, description in other_checks.items():<br/>            if getattr(testdef, what, None) is not None:<br/>                try:<br/>                    raw_data = job_stdio[what]<br/>                    assertions = getattr(testdef, what)<br/>                    if what == &quot;stdout&quot;:<br/>                        data = stdout_prefix + raw_data<br/>                    elif what == &quot;stderr&quot;:<br/>                        data = stderr_prefix + raw_data<br/>                    else:<br/>                        data = raw_data<br/>                    verify_assertions(data, assertions)<br/>                except AssertionError as err:<br/>                    errmsg = f&#x27;{description} different than expected\n&#x27;<br/>                    errmsg += util.unicodify(err)<br/>                    register_exception(AssertionError(errmsg))<br/>    <br/>        for output_collection_def in testdef.output_collections:<br/>            try:<br/>                name = output_collection_def.name<br/>                # TODO: data_collection_list is clearly a bad name for dictionary.<br/>                if name not in data_collection_list:<br/>                    message = f&quot;Failed to find output [{name}], tool outputs include [{&#x27;,&#x27;.join(data_collection_list.keys())}]&quot;<br/>                    raise AssertionError(message)<br/>    <br/>                # Data collection returned from submission, elements may have been populated after<br/>                # the job completed so re-hit the API for more information.<br/>                data_collection_id = data_collection_list[name][&quot;id&quot;]<br/>                galaxy_interactor.verify_output_collection(output_collection_def, data_collection_id, history, job[&#x27;tool_id&#x27;])<br/>            except Exception as e:<br/>                register_exception(e)<br/>    <br/>        if found_exceptions and not testdef.expect_test_failure:<br/>&gt;           raise JobOutputsError(found_exceptions, job_stdio)<br/><span class="error">E           galaxy.tool_util.verify.interactor.JobOutputsError: Output cut_log:  different than expected</span><br/><span class="error">E           Expected 239+-0 lines in the output found 161</span><br/><br/>lib/galaxy/tool_util/verify/interactor.py:1299: JobOutputsError<br/> ------------------------------Captured stderr call------------------------------ <br/>2022-05-27 09:07:23,056 DEBUG [multipart.multipart] Calling on_field_start with no data
+2022-05-27 09:07:23,056 DEBUG [multipart.multipart] Calling on_field_name with data[0:4]
+2022-05-27 09:07:23,056 DEBUG [multipart.multipart] Calling on_field_data with data[5:153]
+2022-05-27 09:07:23,056 DEBUG [multipart.multipart] Calling on_field_end with no data
+2022-05-27 09:07:23,056 DEBUG [multipart.multipart] Calling on_end with no data
+2022-05-27 09:07:24,155 INFO  [galaxy.tools] Validated and populated state for tool request (22.557 ms)
+2022-05-27 09:07:24,161 DEBUG [galaxy.tools.actions.upload] Persisted uploads (0.147 ms)
+2022-05-27 09:07:24,267 DEBUG [galaxy.tools.actions.upload] Checked uploads (105.875 ms)
+2022-05-27 09:07:24,273 DEBUG [galaxy.tools.actions.upload] Created upload job (6.109 ms)
+2022-05-27 09:07:24,304 INFO  [galaxy.web_stack.handlers] (Job[id=11,tool_id=upload1]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:07:24,687 INFO  [galaxy.jobs.handler] (11) Job dispatched
+2022-05-27 09:07:24,908 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/11/tool_script.sh] for tool command [python &#x27;/tmp/tmptoruqmiy/galaxy-dev/tools/data_source/upload.py&#x27; &#x27;/tmp/tmptoruqmiy/galaxy-dev&#x27; &#x27;/tmp/tmptoruqmiy/job_working_directory/000/11/registry.xml&#x27; &#x27;/tmp/upload_params_149iajw4&#x27; &#x27;15:/tmp/tmptoruqmiy/job_working_directory/000/11/working/dataset_77bd9b6c-523e-47cf-9eab-81619349d30f_files:/tmp/tmptoruqmiy/files/7/7/b/dataset_77bd9b6c-523e-47cf-9eab-81619349d30f.dat&#x27;]
+2022-05-27 09:07:32,387 INFO  [galaxy.tools] Validated and populated state for tool request (22.918 ms)
+2022-05-27 09:07:32,394 DEBUG [galaxy.tools.actions.upload] Persisted uploads (0.147 ms)
+2022-05-27 09:07:32,506 DEBUG [galaxy.tools.actions.upload] Checked uploads (111.673 ms)
+2022-05-27 09:07:32,512 DEBUG [galaxy.tools.actions.upload] Created upload job (6.064 ms)
+2022-05-27 09:07:32,540 INFO  [galaxy.web_stack.handlers] (Job[id=12,tool_id=upload1]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:07:33,244 INFO  [galaxy.jobs.handler] (12) Job dispatched
+2022-05-27 09:07:33,510 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/12/tool_script.sh] for tool command [python &#x27;/tmp/tmptoruqmiy/galaxy-dev/tools/data_source/upload.py&#x27; &#x27;/tmp/tmptoruqmiy/galaxy-dev&#x27; &#x27;/tmp/tmptoruqmiy/job_working_directory/000/12/registry.xml&#x27; &#x27;/tmp/upload_params_t99uz5pr&#x27; &#x27;16:/tmp/tmptoruqmiy/job_working_directory/000/12/working/dataset_18454cb5-4d92-467e-a6fe-92717ffffe40_files:/tmp/tmptoruqmiy/files/1/8/4/dataset_18454cb5-4d92-467e-a6fe-92717ffffe40.dat&#x27;]
+2022-05-27 09:07:40,449 INFO  [galaxy.tools] Validated and populated state for tool request (22.896 ms)
+2022-05-27 09:07:40,456 DEBUG [galaxy.tools.actions.upload] Persisted uploads (0.352 ms)
+2022-05-27 09:07:40,576 DEBUG [galaxy.tools.actions.upload] Checked uploads (119.159 ms)
+2022-05-27 09:07:40,584 DEBUG [galaxy.tools.actions.upload] Created upload job (8.363 ms)
+2022-05-27 09:07:40,608 INFO  [galaxy.web_stack.handlers] (Job[id=13,tool_id=upload1]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:07:40,935 INFO  [galaxy.jobs.handler] (13) Job dispatched
+2022-05-27 09:07:41,109 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/13/tool_script.sh] for tool command [python &#x27;/tmp/tmptoruqmiy/galaxy-dev/tools/data_source/upload.py&#x27; &#x27;/tmp/tmptoruqmiy/galaxy-dev&#x27; &#x27;/tmp/tmptoruqmiy/job_working_directory/000/13/registry.xml&#x27; &#x27;/tmp/upload_params_e61k8ex6&#x27; &#x27;17:/tmp/tmptoruqmiy/job_working_directory/000/13/working/dataset_745f4487-3b81-44f5-9eb8-9d76e882a98a_files:/tmp/tmptoruqmiy/files/7/4/5/dataset_745f4487-3b81-44f5-9eb8-9d76e882a98a.dat&#x27;]
+2022-05-27 09:07:50,014 INFO  [galaxy.tools] Validated and populated state for tool request (24.877 ms)
+2022-05-27 09:07:50,027 INFO  [galaxy.tools.actions] Handled collection output named output_traj for tool testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0 (0.776 ms)
+2022-05-27 09:07:50,028 INFO  [galaxy.tools.actions] Handled output named cut_log for tool testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0 (0.902 ms)
+2022-05-27 09:07:50,042 INFO  [galaxy.tools.actions] Added output datasets to history (13.785 ms)
+2022-05-27 09:07:50,045 INFO  [galaxy.tools.actions] Setup for job Job[unflushed,tool_id=testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0] complete, ready to be enqueued (2.064 ms)
+2022-05-27 09:07:50,082 INFO  [galaxy.web_stack.handlers] (Job[id=14,tool_id=testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:07:50,482 INFO  [galaxy.jobs.handler] (14) Job dispatched
+2022-05-27 09:07:50,758 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/14/tool_script.sh] for tool command [[ &quot;$(basename &quot;$CONDA_DEFAULT_ENV&quot;)&quot; = &quot;$(basename &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27;)&quot; ] || {
+MAX_TRIES=3
+COUNT=0
+while [ $COUNT -lt $MAX_TRIES ]; do
+    . &#x27;/home/aepetit/miniconda3/bin/activate&#x27; &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27; &gt; conda_activate.log 2&gt;&amp;1
+    if [ $? -eq 0 ];then
+        break
+    else
+        let COUNT=COUNT+1
+        if [ $COUNT -eq $MAX_TRIES ];then
+            echo &quot;Failed to activate conda environment! Error was:&quot;
+            cat conda_activate.log
+            exit 1
+        fi
+        sleep 10s
+    fi
+done
+} ; [ &quot;$(basename &quot;$CONDA_DEFAULT_ENV&quot;)&quot; = &quot;$(basename &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27;)&quot; ] || {
+MAX_TRIES=3
+COUNT=0
+while [ $COUNT -lt $MAX_TRIES ]; do
+    . &#x27;/home/aepetit/miniconda3/bin/activate&#x27; &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27; &gt; conda_activate.log 2&gt;&amp;1
+    if [ $? -eq 0 ];then
+        break
+    else
+        let COUNT=COUNT+1
+        if [ $COUNT -eq $MAX_TRIES ];then
+            echo &quot;Failed to activate conda environment! Error was:&quot;
+            cat conda_activate.log
+            exit 1
+        fi
+        sleep 10s
+    fi
+done
+} ; [ &quot;$(basename &quot;$CONDA_DEFAULT_ENV&quot;)&quot; = &quot;$(basename &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27;)&quot; ] || {
+MAX_TRIES=3
+COUNT=0
+while [ $COUNT -lt $MAX_TRIES ]; do
+    . &#x27;/home/aepetit/miniconda3/bin/activate&#x27; &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27; &gt; conda_activate.log 2&gt;&amp;1
+    if [ $? -eq 0 ];then
+        break
+    else
+        let COUNT=COUNT+1
+        if [ $COUNT -eq $MAX_TRIES ];then
+            echo &quot;Failed to activate conda environment! Error was:&quot;
+            cat conda_activate.log
+            exit 1
+        fi
+        sleep 10s
+    fi
+done
+} ; ln -s &#x27;/tmp/tmptoruqmiy/files/7/7/b/dataset_77bd9b6c-523e-47cf-9eab-81619349d30f.dat&#x27; &#x27;PIP2.1_test.gro&#x27; &amp;&amp; ln -s &#x27;/tmp/tmptoruqmiy/files/1/8/4/dataset_18454cb5-4d92-467e-a6fe-92717ffffe40.dat&#x27; &#x27;PIP2.1_test.xtc&#x27; &amp;&amp; ln -s &#x27;/tmp/tmptoruqmiy/files/7/4/5/dataset_745f4487-3b81-44f5-9eb8-9d76e882a98a.dat&#x27; &#x27;PIP2.1_test_check.txt&#x27; &amp;&amp; python &#x27;/tmp/tmptoruqmiy/shed_tools/testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/c09cf8acc4de/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories.py&#x27; --verbose --gro_file &#x27;PIP2.1_test.gro&#x27; --xtc_file &#x27;PIP2.1_test.xtc&#x27; --log_output &#x27;log/cut_trajectories.log&#x27; --output_directory &#x27;out/&#x27; --nbr_sub_traj &#x27;3&#x27; --input_check &#x27;PIP2.1_test_check.txt&#x27; --start_traj &#x27;0&#x27; --end_traj &#x27;10&#x27; --group_output 0 --number_cpus &quot;${GALAXY_SLOTS:-1}&quot;]
+---------------------- &gt;&gt; begin tool stdout &lt;&lt; -----------------------
+
+----------------------- &gt;&gt; end tool stdout &lt;&lt; ------------------------
+
+---------------------- &gt;&gt; begin tool stderr &lt;&lt; -----------------------
+
+----------------------- &gt;&gt; end tool stderr &lt;&lt; ------------------------
+
+<br/> -------------------------------Captured log call-------------------------------- <br/>DEBUG    multipart.multipart:multipart.py:604 Calling on_field_start with no data
+DEBUG    multipart.multipart:multipart.py:601 Calling on_field_name with data[0:4]
+DEBUG    multipart.multipart:multipart.py:601 Calling on_field_data with data[5:153]
+DEBUG    multipart.multipart:multipart.py:604 Calling on_field_end with no data
+DEBUG    multipart.multipart:multipart.py:604 Calling on_end with no data<br/></div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">test/functional/test_toolbox_pytest.py::test_tool[testtoolshed.g2.bx.psu.edu/repos/agpetit/concatenate_table/concatenate_table/1.0.0_test_1]</td>
+          <td class="col-duration">30.08</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="log"> ------------------------------Captured stderr call------------------------------ <br/>2022-05-27 09:05:57,130 DEBUG [multipart.multipart] Calling on_field_start with no data
+2022-05-27 09:05:57,130 DEBUG [multipart.multipart] Calling on_field_name with data[0:4]
+2022-05-27 09:05:57,131 DEBUG [multipart.multipart] Calling on_field_data with data[5:129]
+2022-05-27 09:05:57,131 DEBUG [multipart.multipart] Calling on_field_end with no data
+2022-05-27 09:05:57,131 DEBUG [multipart.multipart] Calling on_end with no data
+2022-05-27 09:05:57,282 INFO  [galaxy.managers.configuration] Galaxy extra version JSON file /tmp/tmptoruqmiy/galaxy-dev/version.json not loaded.
+2022-05-27 09:05:57,369 INFO  [galaxy.tools] Validated and populated state for tool request (23.134 ms)
+2022-05-27 09:05:57,383 DEBUG [galaxy.tools.actions.upload] Persisted uploads (0.163 ms)
+2022-05-27 09:05:57,525 DEBUG [galaxy.tools.actions.upload] Checked uploads (141.865 ms)
+2022-05-27 09:05:57,531 DEBUG [galaxy.tools.actions.upload] Created upload job (5.830 ms)
+2022-05-27 09:05:57,566 INFO  [galaxy.web_stack.handlers] (Job[id=1,tool_id=upload1]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:05:58,195 INFO  [galaxy.jobs.handler] (1) Job dispatched
+2022-05-27 09:05:58,387 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/1/tool_script.sh] for tool command [python &#x27;/tmp/tmptoruqmiy/galaxy-dev/tools/data_source/upload.py&#x27; &#x27;/tmp/tmptoruqmiy/galaxy-dev&#x27; &#x27;/tmp/tmptoruqmiy/job_working_directory/000/1/registry.xml&#x27; &#x27;/tmp/upload_params_7yd43mro&#x27; &#x27;1:/tmp/tmptoruqmiy/job_working_directory/000/1/working/dataset_97392d40-4be1-455b-b5a1-d46e4721e0d8_files:/tmp/tmptoruqmiy/files/9/7/3/dataset_97392d40-4be1-455b-b5a1-d46e4721e0d8.dat&#x27;]
+2022-05-27 09:06:05,465 INFO  [galaxy.tools] Validated and populated state for tool request (29.005 ms)
+2022-05-27 09:06:05,474 DEBUG [galaxy.tools.actions.upload] Persisted uploads (0.156 ms)
+2022-05-27 09:06:05,608 DEBUG [galaxy.tools.actions.upload] Checked uploads (133.631 ms)
+2022-05-27 09:06:05,614 DEBUG [galaxy.tools.actions.upload] Created upload job (5.702 ms)
+2022-05-27 09:06:05,635 INFO  [galaxy.web_stack.handlers] (Job[id=2,tool_id=upload1]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:06:06,681 INFO  [galaxy.jobs.handler] (2) Job dispatched
+2022-05-27 09:06:06,896 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/2/tool_script.sh] for tool command [python &#x27;/tmp/tmptoruqmiy/galaxy-dev/tools/data_source/upload.py&#x27; &#x27;/tmp/tmptoruqmiy/galaxy-dev&#x27; &#x27;/tmp/tmptoruqmiy/job_working_directory/000/2/registry.xml&#x27; &#x27;/tmp/upload_params_niqt66u4&#x27; &#x27;2:/tmp/tmptoruqmiy/job_working_directory/000/2/working/dataset_cb889cdf-730a-428f-b94b-82c19b5bb4f4_files:/tmp/tmptoruqmiy/files/c/b/8/dataset_cb889cdf-730a-428f-b94b-82c19b5bb4f4.dat&#x27;]
+2022-05-27 09:06:13,887 INFO  [galaxy.tools] Validated and populated state for tool request (21.823 ms)
+2022-05-27 09:06:13,893 DEBUG [galaxy.tools.actions.upload] Persisted uploads (0.140 ms)
+2022-05-27 09:06:14,001 DEBUG [galaxy.tools.actions.upload] Checked uploads (108.369 ms)
+2022-05-27 09:06:14,007 DEBUG [galaxy.tools.actions.upload] Created upload job (5.655 ms)
+2022-05-27 09:06:14,035 INFO  [galaxy.web_stack.handlers] (Job[id=3,tool_id=upload1]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:06:14,310 INFO  [galaxy.jobs.handler] (3) Job dispatched
+2022-05-27 09:06:14,453 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/3/tool_script.sh] for tool command [python &#x27;/tmp/tmptoruqmiy/galaxy-dev/tools/data_source/upload.py&#x27; &#x27;/tmp/tmptoruqmiy/galaxy-dev&#x27; &#x27;/tmp/tmptoruqmiy/job_working_directory/000/3/registry.xml&#x27; &#x27;/tmp/upload_params_4_iqbmvk&#x27; &#x27;3:/tmp/tmptoruqmiy/job_working_directory/000/3/working/dataset_30dd8d24-f614-4ac7-8cd6-a4e18b4f1f3e_files:/tmp/tmptoruqmiy/files/3/0/d/dataset_30dd8d24-f614-4ac7-8cd6-a4e18b4f1f3e.dat&#x27;]
+2022-05-27 09:06:21,302 INFO  [galaxy.tools] Validated and populated state for tool request (28.288 ms)
+2022-05-27 09:06:21,362 INFO  [galaxy.tools.actions] Handled output named sort_file for tool testtoolshed.g2.bx.psu.edu/repos/agpetit/concatenate_table/concatenate_table/1.0.0 (3.760 ms)
+2022-05-27 09:06:21,377 INFO  [galaxy.tools.actions] Added output datasets to history (14.220 ms)
+2022-05-27 09:06:21,379 INFO  [galaxy.tools.actions] Setup for job Job[unflushed,tool_id=testtoolshed.g2.bx.psu.edu/repos/agpetit/concatenate_table/concatenate_table/1.0.0] complete, ready to be enqueued (1.770 ms)
+2022-05-27 09:06:21,418 INFO  [galaxy.web_stack.handlers] (Job[id=4,tool_id=testtoolshed.g2.bx.psu.edu/repos/agpetit/concatenate_table/concatenate_table/1.0.0]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:06:21,724 INFO  [galaxy.jobs.handler] (4) Job dispatched
+2022-05-27 09:06:22,041 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/4/tool_script.sh] for tool command [cat /tmp/tmptoruqmiy/files/9/7/3/dataset_97392d40-4be1-455b-b5a1-d46e4721e0d8.dat | awk -F&#x27;\t&#x27; &#x27;BEGIN{mean=&quot;Time (ps)&quot;; std=&quot;&quot;} /^Time/ {for (i=2; i&lt;(NF+1); i++) gsub(&quot; &quot;, &quot;,mean &quot;,$i) ; for (i=2; i&lt;(NF+1); i++) mean=mean &quot;\t&quot; $i ;  for (i=2; i&lt;(NF+1); i++) gsub(&quot;,mean&quot;, &quot;,std &quot;,$i); for (i=2; i&lt;(NF+1); i++) std=std &quot;\t&quot; $i } END{print (mean std)}&#x27;  &amp;&gt;&gt; &#x27;/tmp/tmptoruqmiy/files/e/e/c/dataset_eec2e4de-bddf-4d25-b9b2-aa655cfec902.dat&#x27; ; cat /tmp/tmptoruqmiy/files/9/7/3/dataset_97392d40-4be1-455b-b5a1-d46e4721e0d8.dat | awk -F&#x27;\t&#x27; -v min=200.0 &#x27;BEGIN{min_val=min ; max_val=0 ; means=&quot;&quot;; std=&quot;&quot;} /^[0-9]/ {if ($1 &lt;= min_val) {min_val=$1} ; if ($1 &gt;= max_val) {max_val=$1}} ; /Mean/ {for (i=2; i&lt;NF; i++) means=means&quot;\t&quot;$i ;means=means&quot;\t&quot;$NF } ; /Std/ {for (i=2; i&lt;NF; i++) std=std&quot;\t&quot;$i; ;std=std&quot;\t&quot;$NF} END {print (min_val &quot;-&quot; max_val means std)}&#x27; &amp;&gt;&gt; &#x27;test.tabular&#x27; ; cat /tmp/tmptoruqmiy/files/c/b/8/dataset_cb889cdf-730a-428f-b94b-82c19b5bb4f4.dat | awk -F&#x27;\t&#x27; -v min=500.0 &#x27;BEGIN{min_val=min ; max_val=0 ; means=&quot;&quot;; std=&quot;&quot;} /^[0-9]/ {if ($1 &lt;= min_val) {min_val=$1} ; if ($1 &gt;= max_val) {max_val=$1}} ; /Mean/ {for (i=2; i&lt;NF; i++) means=means&quot;\t&quot;$i ;means=means&quot;\t&quot;$NF } ; /Std/ {for (i=2; i&lt;NF; i++) std=std&quot;\t&quot;$i; ;std=std&quot;\t&quot;$NF} END {print (min_val &quot;-&quot; max_val means std)}&#x27; &amp;&gt;&gt; &#x27;test.tabular&#x27; ; cat /tmp/tmptoruqmiy/files/3/0/d/dataset_30dd8d24-f614-4ac7-8cd6-a4e18b4f1f3e.dat | awk -F&#x27;\t&#x27; -v min=1000.0 &#x27;BEGIN{min_val=min ; max_val=0 ; means=&quot;&quot;; std=&quot;&quot;} /^[0-9]/ {if ($1 &lt;= min_val) {min_val=$1} ; if ($1 &gt;= max_val) {max_val=$1}} ; /Mean/ {for (i=2; i&lt;NF; i++) means=means&quot;\t&quot;$i ;means=means&quot;\t&quot;$NF } ; /Std/ {for (i=2; i&lt;NF; i++) std=std&quot;\t&quot;$i; ;std=std&quot;\t&quot;$NF} END {print (min_val &quot;-&quot; max_val means std)}&#x27; &amp;&gt;&gt; &#x27;test.tabular&#x27; ; cat &#x27;test.tabular&#x27; | sort -k1 -n &amp;&gt;&gt; &#x27;/tmp/tmptoruqmiy/files/e/e/c/dataset_eec2e4de-bddf-4d25-b9b2-aa655cfec902.dat&#x27;]
+<br/> -------------------------------Captured log call-------------------------------- <br/>DEBUG    multipart.multipart:multipart.py:604 Calling on_field_start with no data
+DEBUG    multipart.multipart:multipart.py:601 Calling on_field_name with data[0:4]
+DEBUG    multipart.multipart:multipart.py:601 Calling on_field_data with data[5:129]
+DEBUG    multipart.multipart:multipart.py:604 Calling on_field_end with no data
+DEBUG    multipart.multipart:multipart.py:604 Calling on_end with no data<br/></div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">test/functional/test_toolbox_pytest.py::test_tool[testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0_test_1]</td>
+          <td class="col-duration">16.85</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="log"> ------------------------------Captured stderr call------------------------------ <br/>2022-05-27 09:06:27,235 DEBUG [multipart.multipart] Calling on_field_start with no data
+2022-05-27 09:06:27,236 DEBUG [multipart.multipart] Calling on_field_name with data[0:4]
+2022-05-27 09:06:27,236 DEBUG [multipart.multipart] Calling on_field_data with data[5:153]
+2022-05-27 09:06:27,237 DEBUG [multipart.multipart] Calling on_field_end with no data
+2022-05-27 09:06:27,237 DEBUG [multipart.multipart] Calling on_end with no data
+2022-05-27 09:06:27,445 INFO  [galaxy.tools] Validated and populated state for tool request (22.082 ms)
+2022-05-27 09:06:27,453 DEBUG [galaxy.tools.actions.upload] Persisted uploads (0.154 ms)
+2022-05-27 09:06:27,567 DEBUG [galaxy.tools.actions.upload] Checked uploads (113.879 ms)
+2022-05-27 09:06:27,572 DEBUG [galaxy.tools.actions.upload] Created upload job (5.676 ms)
+2022-05-27 09:06:27,592 INFO  [galaxy.web_stack.handlers] (Job[id=5,tool_id=upload1]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:06:28,223 INFO  [galaxy.jobs.handler] (5) Job dispatched
+2022-05-27 09:06:28,370 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/5/tool_script.sh] for tool command [python &#x27;/tmp/tmptoruqmiy/galaxy-dev/tools/data_source/upload.py&#x27; &#x27;/tmp/tmptoruqmiy/galaxy-dev&#x27; &#x27;/tmp/tmptoruqmiy/job_working_directory/000/5/registry.xml&#x27; &#x27;/tmp/upload_params_3z8ry2g5&#x27; &#x27;5:/tmp/tmptoruqmiy/job_working_directory/000/5/working/dataset_fedb0d1a-a7bd-401b-86ba-117e6751df12_files:/tmp/tmptoruqmiy/files/f/e/d/dataset_fedb0d1a-a7bd-401b-86ba-117e6751df12.dat&#x27;]
+2022-05-27 09:06:37,473 INFO  [galaxy.tools] Validated and populated state for tool request (22.142 ms)
+2022-05-27 09:06:37,488 INFO  [galaxy.tools.actions] Handled output named sub_trajectories_out_file for tool testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0 (2.549 ms)
+2022-05-27 09:06:37,490 INFO  [galaxy.tools.actions] Handled output named estimate_log for tool testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0 (1.954 ms)
+2022-05-27 09:06:37,505 INFO  [galaxy.tools.actions] Added output datasets to history (15.426 ms)
+2022-05-27 09:06:37,508 INFO  [galaxy.tools.actions] Setup for job Job[unflushed,tool_id=testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0] complete, ready to be enqueued (2.166 ms)
+2022-05-27 09:06:37,543 INFO  [galaxy.web_stack.handlers] (Job[id=6,tool_id=testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories/0.1.0]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:06:37,847 INFO  [galaxy.jobs.handler] (6) Job dispatched
+2022-05-27 09:06:37,982 WARNI [galaxy.security.object_wrapper] Unable to create dynamic subclass SafeStringWrapper(galaxy.model.none_like.None:&lt;class &#x27;NoneType&#x27;&gt;,&lt;class &#x27;NotImplementedType&#x27;&gt;,&lt;class &#x27;bool&#x27;&gt;,&lt;class &#x27;bytearray&#x27;&gt;,&lt;class &#x27;ellipsis&#x27;&gt;,&lt;class &#x27;galaxy.security.object_wrapper.SafeStringWrapper&#x27;&gt;,&lt;class &#x27;galaxy.tools.wrappers.ToolParameterValueWrapper&#x27;&gt;,&lt;class &#x27;numbers.Number&#x27;&gt;) for &lt;class &#x27;galaxy.model.none_like.NoneDataset&#x27;&gt;, None: type() doesn&#x27;t support MRO entry resolution; use types.new_class()
+2022-05-27 09:06:38,056 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/6/tool_script.sh] for tool command [[ &quot;$(basename &quot;$CONDA_DEFAULT_ENV&quot;)&quot; = &quot;$(basename &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27;)&quot; ] || {
+MAX_TRIES=3
+COUNT=0
+while [ $COUNT -lt $MAX_TRIES ]; do
+    . &#x27;/home/aepetit/miniconda3/bin/activate&#x27; &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27; &gt; conda_activate.log 2&gt;&amp;1
+    if [ $? -eq 0 ];then
+        break
+    else
+        let COUNT=COUNT+1
+        if [ $COUNT -eq $MAX_TRIES ];then
+            echo &quot;Failed to activate conda environment! Error was:&quot;
+            cat conda_activate.log
+            exit 1
+        fi
+        sleep 10s
+    fi
+done
+} ; [ &quot;$(basename &quot;$CONDA_DEFAULT_ENV&quot;)&quot; = &quot;$(basename &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27;)&quot; ] || {
+MAX_TRIES=3
+COUNT=0
+while [ $COUNT -lt $MAX_TRIES ]; do
+    . &#x27;/home/aepetit/miniconda3/bin/activate&#x27; &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27; &gt; conda_activate.log 2&gt;&amp;1
+    if [ $? -eq 0 ];then
+        break
+    else
+        let COUNT=COUNT+1
+        if [ $COUNT -eq $MAX_TRIES ];then
+            echo &quot;Failed to activate conda environment! Error was:&quot;
+            cat conda_activate.log
+            exit 1
+        fi
+        sleep 10s
+    fi
+done
+} ; [ &quot;$(basename &quot;$CONDA_DEFAULT_ENV&quot;)&quot; = &quot;$(basename &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27;)&quot; ] || {
+MAX_TRIES=3
+COUNT=0
+while [ $COUNT -lt $MAX_TRIES ]; do
+    . &#x27;/home/aepetit/miniconda3/bin/activate&#x27; &#x27;/home/aepetit/miniconda3/envs/mulled-v1-0569c04ab612909a373223b7f7da6469041d31d933b93b55db5a38a76d747ad1&#x27; &gt; conda_activate.log 2&gt;&amp;1
+    if [ $? -eq 0 ];then
+        break
+    else
+        let COUNT=COUNT+1
+        if [ $COUNT -eq $MAX_TRIES ];then
+            echo &quot;Failed to activate conda environment! Error was:&quot;
+            cat conda_activate.log
+            exit 1
+        fi
+        sleep 10s
+    fi
+done
+} ; ln -s &#x27;/tmp/tmptoruqmiy/files/f/e/d/dataset_fedb0d1a-a7bd-401b-86ba-117e6751df12.dat&#x27; &#x27;PIP2.1_test_check.txt&#x27; &amp;&amp; ln -s &#x27;/tmp/tmptoruqmiy/files/5/8/a/dataset_58ab194a-5436-4b35-aea0-6b66530a0562.dat&#x27; &#x27;estimated_number_of_sub_trajectories.tsv&#x27; &amp;&amp; python &#x27;/tmp/tmptoruqmiy/shed_tools/testtoolshed.g2.bx.psu.edu/repos/agpetit/estimate_cut_sub_trajectories/c09cf8acc4de/estimate_cut_sub_trajectories/estimate_cut_sub_trajectories.py&#x27; --input_check &#x27;PIP2.1_test_check.txt&#x27; --verbose --output_file &#x27;estimated_number_of_sub_trajectories.tsv&#x27; --log_output &#x27;log/estimated_number_of_sub_trajectories.log&#x27; --nb_frames &#x27;3&#x27; --start_traj &#x27;&#x27; --end_traj &#x27;&#x27;]
+<br/> -------------------------------Captured log call-------------------------------- <br/>DEBUG    multipart.multipart:multipart.py:604 Calling on_field_start with no data
+DEBUG    multipart.multipart:multipart.py:601 Calling on_field_name with data[0:4]
+DEBUG    multipart.multipart:multipart.py:601 Calling on_field_data with data[5:153]
+DEBUG    multipart.multipart:multipart.py:604 Calling on_field_end with no data
+DEBUG    multipart.multipart:multipart.py:604 Calling on_end with no data<br/></div></td></tr></tbody>
+      <tbody class="passed results-table-row">
+        <tr>
+          <td class="col-result">Passed</td>
+          <td class="col-name">test/functional/test_toolbox_pytest.py::test_tool[testtoolshed.g2.bx.psu.edu/repos/agpetit/visualize_pore_diameter_aqp/visualize_pore_diameter_aqp/0.1.0_test_1]</td>
+          <td class="col-duration">23.96</td>
+          <td class="col-links"></td></tr>
+        <tr>
+          <td class="extra" colspan="4">
+            <div class="log"> ------------------------------Captured stderr call------------------------------ <br/>2022-05-27 09:08:03,555 DEBUG [multipart.multipart] Calling on_field_start with no data
+2022-05-27 09:08:03,556 DEBUG [multipart.multipart] Calling on_field_name with data[0:4]
+2022-05-27 09:08:03,556 DEBUG [multipart.multipart] Calling on_field_data with data[5:149]
+2022-05-27 09:08:03,557 DEBUG [multipart.multipart] Calling on_field_end with no data
+2022-05-27 09:08:03,557 DEBUG [multipart.multipart] Calling on_end with no data
+2022-05-27 09:08:03,766 INFO  [galaxy.tools] Validated and populated state for tool request (22.328 ms)
+2022-05-27 09:08:03,772 DEBUG [galaxy.tools.actions.upload] Persisted uploads (0.146 ms)
+2022-05-27 09:08:03,874 DEBUG [galaxy.tools.actions.upload] Checked uploads (101.847 ms)
+2022-05-27 09:08:03,880 DEBUG [galaxy.tools.actions.upload] Created upload job (5.943 ms)
+2022-05-27 09:08:03,908 INFO  [galaxy.web_stack.handlers] (Job[id=15,tool_id=upload1]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:08:04,251 INFO  [galaxy.jobs.handler] (15) Job dispatched
+2022-05-27 09:08:04,484 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/15/tool_script.sh] for tool command [python &#x27;/tmp/tmptoruqmiy/galaxy-dev/tools/data_source/upload.py&#x27; &#x27;/tmp/tmptoruqmiy/galaxy-dev&#x27; &#x27;/tmp/tmptoruqmiy/job_working_directory/000/15/registry.xml&#x27; &#x27;/tmp/upload_params_fom2zjay&#x27; &#x27;22:/tmp/tmptoruqmiy/job_working_directory/000/15/working/dataset_14d25761-af75-46cc-b88e-fff28f41b237_files:/tmp/tmptoruqmiy/files/1/4/d/dataset_14d25761-af75-46cc-b88e-fff28f41b237.dat&#x27;]
+2022-05-27 09:08:11,110 INFO  [galaxy.tools] Validated and populated state for tool request (11.546 ms)
+2022-05-27 09:08:11,124 INFO  [galaxy.tools.actions] Handled output named out_file for tool testtoolshed.g2.bx.psu.edu/repos/agpetit/visualize_pore_diameter_aqp/visualize_pore_diameter_aqp/0.1.0 (2.658 ms)
+2022-05-27 09:08:11,126 INFO  [galaxy.tools.actions] Handled output named out_file2 for tool testtoolshed.g2.bx.psu.edu/repos/agpetit/visualize_pore_diameter_aqp/visualize_pore_diameter_aqp/0.1.0 (1.971 ms)
+2022-05-27 09:08:11,128 INFO  [galaxy.tools.actions] Handled output named out_file3 for tool testtoolshed.g2.bx.psu.edu/repos/agpetit/visualize_pore_diameter_aqp/visualize_pore_diameter_aqp/0.1.0 (1.959 ms)
+2022-05-27 09:08:11,131 INFO  [galaxy.tools.actions] Handled output named out_file4 for tool testtoolshed.g2.bx.psu.edu/repos/agpetit/visualize_pore_diameter_aqp/visualize_pore_diameter_aqp/0.1.0 (2.792 ms)
+2022-05-27 09:08:11,148 INFO  [galaxy.tools.actions] Added output datasets to history (16.256 ms)
+2022-05-27 09:08:11,150 INFO  [galaxy.tools.actions] Setup for job Job[unflushed,tool_id=testtoolshed.g2.bx.psu.edu/repos/agpetit/visualize_pore_diameter_aqp/visualize_pore_diameter_aqp/0.1.0] complete, ready to be enqueued (2.459 ms)
+2022-05-27 09:08:11,183 INFO  [galaxy.web_stack.handlers] (Job[id=16,tool_id=testtoolshed.g2.bx.psu.edu/repos/agpetit/visualize_pore_diameter_aqp/visualize_pore_diameter_aqp/0.1.0]) Handler &#x27;_default_&#x27; assigned using &#x27;HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED&#x27; assignment method
+2022-05-27 09:08:11,681 INFO  [galaxy.jobs.handler] (16) Job dispatched
+2022-05-27 09:08:11,940 INFO  [galaxy.jobs.command_factory] Built script [/tmp/tmptoruqmiy/job_working_directory/000/16/tool_script.sh] for tool command [[ &quot;$(basename &quot;$CONDA_DEFAULT_ENV&quot;)&quot; = &quot;$(basename &#x27;/home/aepetit/miniconda3/envs/mulled-v1-5a4fbc211f26cb04dc98136056f4848655807f4df79e1bb9f5b172569688ee2f&#x27;)&quot; ] || {
+MAX_TRIES=3
+COUNT=0
+while [ $COUNT -lt $MAX_TRIES ]; do
+    . &#x27;/home/aepetit/miniconda3/bin/activate&#x27; &#x27;/home/aepetit/miniconda3/envs/mulled-v1-5a4fbc211f26cb04dc98136056f4848655807f4df79e1bb9f5b172569688ee2f&#x27; &gt; conda_activate.log 2&gt;&amp;1
+    if [ $? -eq 0 ];then
+        break
+    else
+        let COUNT=COUNT+1
+        if [ $COUNT -eq $MAX_TRIES ];then
+            echo &quot;Failed to activate conda environment! Error was:&quot;
+            cat conda_activate.log
+            exit 1
+        fi
+        sleep 10s
+    fi
+done
+} ; [ &quot;$(basename &quot;$CONDA_DEFAULT_ENV&quot;)&quot; = &quot;$(basename &#x27;/home/aepetit/miniconda3/envs/mulled-v1-5a4fbc211f26cb04dc98136056f4848655807f4df79e1bb9f5b172569688ee2f&#x27;)&quot; ] || {
+MAX_TRIES=3
+COUNT=0
+while [ $COUNT -lt $MAX_TRIES ]; do
+    . &#x27;/home/aepetit/miniconda3/bin/activate&#x27; &#x27;/home/aepetit/miniconda3/envs/mulled-v1-5a4fbc211f26cb04dc98136056f4848655807f4df79e1bb9f5b172569688ee2f&#x27; &gt; conda_activate.log 2&gt;&amp;1
+    if [ $? -eq 0 ];then
+        break
+    else
+        let COUNT=COUNT+1
+        if [ $COUNT -eq $MAX_TRIES ];then
+            echo &quot;Failed to activate conda environment! Error was:&quot;
+            cat conda_activate.log
+            exit 1
+        fi
+        sleep 10s
+    fi
+done
+} ; [ &quot;$(basename &quot;$CONDA_DEFAULT_ENV&quot;)&quot; = &quot;$(basename &#x27;/home/aepetit/miniconda3/envs/mulled-v1-5a4fbc211f26cb04dc98136056f4848655807f4df79e1bb9f5b172569688ee2f&#x27;)&quot; ] || {
+MAX_TRIES=3
+COUNT=0
+while [ $COUNT -lt $MAX_TRIES ]; do
+    . &#x27;/home/aepetit/miniconda3/bin/activate&#x27; &#x27;/home/aepetit/miniconda3/envs/mulled-v1-5a4fbc211f26cb04dc98136056f4848655807f4df79e1bb9f5b172569688ee2f&#x27; &gt; conda_activate.log 2&gt;&amp;1
+    if [ $? -eq 0 ];then
+        break
+    else
+        let COUNT=COUNT+1
+        if [ $COUNT -eq $MAX_TRIES ];then
+            echo &quot;Failed to activate conda environment! Error was:&quot;
+            cat conda_activate.log
+            exit 1
+        fi
+        sleep 10s
+    fi
+done
+} ; [ &quot;$(basename &quot;$CONDA_DEFAULT_ENV&quot;)&quot; = &quot;$(basename &#x27;/home/aepetit/miniconda3/envs/mulled-v1-5a4fbc211f26cb04dc98136056f4848655807f4df79e1bb9f5b172569688ee2f&#x27;)&quot; ] || {
+MAX_TRIES=3
+COUNT=0
+while [ $COUNT -lt $MAX_TRIES ]; do
+    . &#x27;/home/aepetit/miniconda3/bin/activate&#x27; &#x27;/home/aepetit/miniconda3/envs/mulled-v1-5a4fbc211f26cb04dc98136056f4848655807f4df79e1bb9f5b172569688ee2f&#x27; &gt; conda_activate.log 2&gt;&amp;1
+    if [ $? -eq 0 ];then
+        break
+    else
+        let COUNT=COUNT+1
+        if [ $COUNT -eq $MAX_TRIES ];then
+            echo &quot;Failed to activate conda environment! Error was:&quot;
+            cat conda_activate.log
+            exit 1
+        fi
+        sleep 10s
+    fi
+done
+} ; ln -s &#x27;/tmp/tmptoruqmiy/files/1/4/d/dataset_14d25761-af75-46cc-b88e-fff28f41b237.dat&#x27; &#x27;table_sort_pore_diameter_aqp.tabular&#x27; &amp;&amp; Rscript &#x27;/tmp/tmptoruqmiy/shed_tools/testtoolshed.g2.bx.psu.edu/repos/agpetit/visualize_pore_diameter_aqp/3cdcc6eeb3ec/visualize_pore_diameter_aqp/visualize_pore_diameter_aqp.R&#x27; -i &#x27;table_sort_pore_diameter_aqp.tabular&#x27; -a TRUE -p TRUE -d TRUE -f TRUE]
+2022-05-27 09:08:24,745 INFO  [galaxy.tool_util.verify] ## files diff on &#x27;/tmp/tmpher3091iall_graphics_distribution.pdf&#x27; and &#x27;/tmp/tmpc_uqkw8kall_graphics_distribution.pdf&#x27;: lines_diff = 0, found diff = 4, found pdf invalid diff = 0
+<br/> -------------------------------Captured log call-------------------------------- <br/>DEBUG    multipart.multipart:multipart.py:604 Calling on_field_start with no data
+DEBUG    multipart.multipart:multipart.py:601 Calling on_field_name with data[0:4]
+DEBUG    multipart.multipart:multipart.py:601 Calling on_field_data with data[5:149]
+DEBUG    multipart.multipart:multipart.py:604 Calling on_field_end with no data
+DEBUG    multipart.multipart:multipart.py:604 Calling on_end with no data<br/> ----------------------------Captured stderr teardown---------------------------- <br/>2022-05-27 09:08:24,841 INFO  [test_driver] 21 threads were active before stopping embedded server
+2022-05-27 09:08:24,841 INFO  [test_driver] Shutting down embedded galaxy uvicorn server
+2022-05-27 09:08:24,841 INFO  [test_driver] Embedded web server galaxy stopped
+2022-05-27 09:08:24,841 INFO  [test_driver] Stopping embedded server thread
+INFO:     Shutting down
+2022-05-27 09:08:24,911 INFO  [uvicorn.error] Shutting down
+INFO:     Waiting for application shutdown.
+2022-05-27 09:08:25,013 INFO  [uvicorn.error] Waiting for application shutdown.
+INFO:     Application shutdown complete.
+2022-05-27 09:08:25,013 INFO  [uvicorn.error] Application shutdown complete.
+INFO:     Finished server process [23683]
+2022-05-27 09:08:25,014 INFO  [uvicorn.error] Finished server process [23683]
+2022-05-27 09:08:25,015 INFO  [test_driver] Event loop for uvicorn closed
+2022-05-27 09:08:25,016 INFO  [test_driver] Embedded server thread stopped
+2022-05-27 09:08:25,016 INFO  [test_driver] Stopping application galaxy
+2022-05-27 09:08:26,298 INFO  [galaxy.queue_worker] Sending reconfigure_watcher control task.
+2022-05-27 09:08:26,325 INFO  [galaxy.jobs.handler] sending stop signal to worker thread
+2022-05-27 09:08:27,337 INFO  [galaxy.jobs.handler] job handler queue stopped
+2022-05-27 09:08:27,338 INFO  [galaxy.jobs.runners] LocalRunner: Sending stop signal to 4 job worker threads
+2022-05-27 09:08:27,338 INFO  [galaxy.jobs.runners] Waiting up to 5 seconds for job worker threads to shutdown...
+2022-05-27 09:08:27,339 INFO  [galaxy.jobs.runners] All job worker threads shutdown cleanly
+2022-05-27 09:08:27,340 INFO  [galaxy.jobs.runners] TaskRunner: Sending stop signal to 2 job worker threads
+2022-05-27 09:08:27,340 INFO  [galaxy.jobs.runners] Waiting up to 5 seconds for job worker threads to shutdown...
+2022-05-27 09:08:27,468 INFO  [galaxy.jobs.runners] All job worker threads shutdown cleanly
+2022-05-27 09:08:27,469 INFO  [galaxy.jobs.handler] sending stop signal to worker thread
+2022-05-27 09:08:27,469 INFO  [galaxy.jobs.handler] job handler stop queue stopped
+2022-05-27 09:08:27,470 INFO  [test_driver] Application galaxy stopped.
+2022-05-27 09:08:27,471 INFO  [test_driver] 2 active after stopping embedded server
+<br/> -----------------------------Captured log teardown------------------------------ <br/>INFO     test_driver:driver_util.py:747 21 threads were active before stopping embedded server
+INFO     test_driver:driver_util.py:755 Shutting down embedded galaxy uvicorn server
+INFO     test_driver:driver_util.py:757 Embedded web server galaxy stopped
+INFO     test_driver:driver_util.py:760 Stopping embedded server thread
+INFO     uvicorn.error:server.py:252 Shutting down
+INFO     uvicorn.error:on.py:64 Waiting for application shutdown.
+INFO     uvicorn.error:on.py:75 Application shutdown complete.
+INFO     uvicorn.error:server.py:85 Finished server process [23683]
+INFO     test_driver:driver_util.py:587 Event loop for uvicorn closed
+INFO     test_driver:driver_util.py:762 Embedded server thread stopped
+INFO     test_driver:driver_util.py:765 Stopping application galaxy
+INFO     test_driver:driver_util.py:767 Application galaxy stopped.
+INFO     test_driver:driver_util.py:769 2 active after stopping embedded server<br/></div></td></tr></tbody></table></body></html>
\ No newline at end of file
Binary file test-data/Distance_distribution_by_aquaporin.png has changed
Binary file test-data/Distance_distribution_by_protomer.png has changed
Binary file test-data/Distance_distribution_on_all_protomers.png has changed
Binary file test-data/all_graphics_distribution.pdf has changed