mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
Merge branch 'okta-oidc-auth' of github.com:selten/galaxy into okta-oidc-auth
This commit is contained in:
Symlink
+1
@@ -0,0 +1 @@
|
||||
api
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
./run_tests.sh --dockerize --python3 --db postgres --clean_pyc --skip_flakey_fails -api "$@"
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
framework
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
./run_tests.sh --dockerize --python3 --db postgres --clean_pyc --framework "$@"
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
integration
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
DOCKER_RUN_EXTRA_ARGS="--privileged" ./run_tests.sh --dockerize --python3 --db postgres --clean_pyc --integration "$@"
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
main-tools
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
./run_tests.sh --dockerize --python3 --db postgres --clean_pyc -main "$@"
|
||||
@@ -20,8 +20,7 @@ virtualenv "$GALAXY_VIRTUAL_ENV"
|
||||
chown -R "$GALAXY_TEST_UID:$GALAXY_TEST_UID" "$GALAXY_VIRTUAL_ENV"
|
||||
|
||||
cd /galaxy
|
||||
HOME=/galaxy
|
||||
sudo -E -u "#${GALAXY_TEST_UID}" ./scripts/common_startup.sh || { echo "common_startup.sh failed"; exit 1; }
|
||||
sudo -E -H -u "#${GALAXY_TEST_UID}" ./scripts/common_startup.sh || { echo "common_startup.sh failed"; exit 1; }
|
||||
|
||||
echo "Waiting for postgres to become available"
|
||||
while ! nc -z postgres 5432;
|
||||
@@ -34,7 +33,7 @@ echo "Creating postgres database for Galaxy"
|
||||
createdb -w -U postgres -h postgres galaxy
|
||||
|
||||
echo "Starting and waiting for Galaxy daemon(s)"
|
||||
sudo -E -u "#${GALAXY_TEST_UID}" GALAXY_RUN_ALL=1 bash "$GALAXY_ROOT/run.sh" --daemon --wait
|
||||
sudo -E -H -u "#${GALAXY_TEST_UID}" GALAXY_RUN_ALL=1 bash "$GALAXY_ROOT/run.sh" --daemon --wait
|
||||
|
||||
echo "Galaxy daemon ready, monitoring Galaxy logs"
|
||||
tail -f "$GALAXY_ROOT/main.log"
|
||||
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
selenium
|
||||
@@ -1,26 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Enable retries on tests to reduce chances of transient failures.
|
||||
: ${GALAXY_TEST_SELENIUM_RETRIES:=1}
|
||||
|
||||
# If in Jenkins environment, use it for artifacts.
|
||||
if [ -n "$BUILD_NUMBER" ];
|
||||
then
|
||||
: ${GALAXY_TEST_ERRORS_DIRECTORY:=${BUILD_NUMBER}-test-errors}
|
||||
: ${GALAXY_TEST_SCREENSHOTS_DIRECTORY:=${BUILD_NUMBER}-test-screenshots}
|
||||
else
|
||||
: ${GALAXY_TEST_ERRORS_DIRECTORY:=database/test-errors}
|
||||
: ${GALAXY_TEST_SCREENSHOTS_DIRECTORY:=database/test-screenshots}
|
||||
fi
|
||||
|
||||
mkdir -p "$GALAXY_TEST_ERRORS_DIRECTORY"
|
||||
mkdir -p "$GALAXY_TEST_SCREENSHOTS_DIRECTORY"
|
||||
|
||||
mkdir -p ~/.jenkins-yarn-cache
|
||||
YARN_CACHE_FOLDER=~/.jenkins-yarn-cache
|
||||
|
||||
# Start Selenium server in the test Docker container.
|
||||
DOCKER_RUN_EXTRA_ARGS="${DOCKER_RUN_EXTRA_ARGS} --shm-size=2g -v $YARN_CACHE_FOLDER:$YARN_CACHE_FOLDER -e YARN_CACHE_FOLDER=$YARN_CACHE_FOLDER -e USE_SELENIUM=1 -e GALAXY_TEST_SELENIUM_RETRIES=${GALAXY_TEST_SELENIUM_RETRIES} -e GALAXY_TEST_ERRORS_DIRECTORY=${GALAXY_TEST_ERRORS_DIRECTORY} -e GALAXY_TEST_SCREENSHOTS_DIRECTORY=${GALAXY_TEST_SCREENSHOTS_DIRECTORY}"
|
||||
export DOCKER_RUN_EXTRA_ARGS
|
||||
|
||||
./run_tests.sh --dockerize --python3 --db postgres --clean_pyc --skip_flakey_fails --selenium "$@"
|
||||
+3
-35
@@ -81,23 +81,6 @@ jobs:
|
||||
key: v1-repo-{{ .Environment.CIRCLE_SHA1 }}
|
||||
paths:
|
||||
- ~/repo
|
||||
py27_lint:
|
||||
docker:
|
||||
- image: circleci/python:2.7
|
||||
<<: *set_workdir
|
||||
steps:
|
||||
- *restore_repo_cache
|
||||
- *install_tox
|
||||
- run: tox -e py27-lint
|
||||
py27_unit:
|
||||
docker:
|
||||
- image: circleci/python:2.7
|
||||
<<: *set_workdir
|
||||
steps:
|
||||
- *restore_repo_cache
|
||||
# Ensure minimum virtualenv version due to https://github.com/pypa/virtualenv/issues/1670
|
||||
- run: sudo pip install tox 'virtualenv>=20.0.8'
|
||||
- run: tox -e py27-unit
|
||||
py35_docstring:
|
||||
docker:
|
||||
- image: circleci/python:3.5
|
||||
@@ -106,14 +89,6 @@ jobs:
|
||||
- *restore_repo_cache
|
||||
- *install_tox
|
||||
- run: tox -e py35-lint_docstring_include_list
|
||||
py27_first_startup:
|
||||
docker:
|
||||
- image: circleci/python:2.7
|
||||
<<: *set_workdir
|
||||
steps:
|
||||
- *restore_repo_cache
|
||||
- *install_tox
|
||||
- run: tox -e py27-first_startup
|
||||
py35_lint:
|
||||
docker:
|
||||
- image: circleci/python:3.5
|
||||
@@ -136,10 +111,9 @@ jobs:
|
||||
<<: *set_workdir
|
||||
steps:
|
||||
- *restore_repo_cache
|
||||
- run: sh scripts/common_startup.sh
|
||||
- run: wget -q https://github.com/jmchilton/galaxy-downloads/raw/master/db_gx_rev_0127.sqlite
|
||||
- run: mv db_gx_rev_0127.sqlite database/universe.sqlite
|
||||
- run: sh manage_db.sh -c ./config/galaxy.yml.sample upgrade
|
||||
# Use this job to test the latest migrations
|
||||
- run: wget -q https://github.com/jmchilton/galaxy-downloads/raw/master/db_gx_rev_0141.sqlite
|
||||
- run: mv db_gx_rev_0141.sqlite database/universe.sqlite
|
||||
- *install_tox
|
||||
- run: tox -e py35-first_startup
|
||||
validate_test_tools:
|
||||
@@ -195,12 +169,6 @@ workflows:
|
||||
get_code_and_test:
|
||||
jobs:
|
||||
- get_code
|
||||
- py27_lint:
|
||||
<<: *requires_get_code
|
||||
- py27_unit:
|
||||
<<: *requires_get_code
|
||||
- py27_first_startup:
|
||||
<<: *requires_get_code
|
||||
- py35_docstring:
|
||||
<<: *requires_get_code
|
||||
- py35_lint:
|
||||
|
||||
@@ -27,10 +27,15 @@ jobs:
|
||||
steps:
|
||||
- name: Prune unused docker image, volumes and containers
|
||||
run: docker system prune -a -f
|
||||
- name: Clean dotnet folder for space
|
||||
if: matrix.subset == 'kubernetes'
|
||||
run: rm -Rf /usr/share/dotnet
|
||||
- name: Setup Minikube
|
||||
if: matrix.subset == 'kubernetes'
|
||||
id: minikube
|
||||
uses: CodingNagger/minikube-setup-action@v1.0.2
|
||||
uses: CodingNagger/minikube-setup-action@v1.0.3
|
||||
with:
|
||||
minikube-version: "1.9.0-0_amd64"
|
||||
- name: Launch Minikube
|
||||
if: matrix.subset == 'kubernetes'
|
||||
run: eval ${{ steps.minikube.outputs.launcher }}
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
name: OSX
|
||||
on: [push, pull_request]
|
||||
jobs:
|
||||
|
||||
test:
|
||||
name: Startup test
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
path: 'galaxy root'
|
||||
- name: Cache pip dir
|
||||
uses: actions/cache@v1
|
||||
id: pip-cache
|
||||
with:
|
||||
path: ~/Library/Caches/pip
|
||||
# scripts/common_startup.sh creates a conda env for Galaxy containing Python 3.6
|
||||
key: pip-cache-3.6-${{ hashFiles('galaxy root/requirements.txt') }}
|
||||
- name: Install tox
|
||||
run: pip install tox
|
||||
- name: Install and activate miniconda # use this job to test using Python from a conda environment
|
||||
uses: goanpeca/setup-miniconda@v1
|
||||
with:
|
||||
activate-environment: ''
|
||||
- name: run tests
|
||||
run: tox -e first_startup
|
||||
shell: bash -l {0} # need this to have CONDA_EXE set
|
||||
working-directory: 'galaxy root'
|
||||
@@ -0,0 +1,37 @@
|
||||
name: Toolshed
|
||||
on: [push, pull_request]
|
||||
env:
|
||||
GALAXY_TEST_DBURI: 'postgres://postgres:postgres@localhost:5432/galaxy?client_encoding=utf8'
|
||||
TOOL_SHED_TEST_DBURI: 'postgres://postgres:postgres@localhost:5432/toolshed?client_encoding=utf8'
|
||||
jobs:
|
||||
test:
|
||||
name: Test
|
||||
runs-on: ubuntu-18.04
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [3.7]
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:11
|
||||
env:
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: postgres
|
||||
POSTGRES_DB: postgres
|
||||
ports:
|
||||
- 5432:5432
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
path: 'galaxy root'
|
||||
- uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Cache pip dir
|
||||
uses: actions/cache@v1
|
||||
id: pip-cache
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: pip-cache-${{ matrix.python-version }}-${{ hashFiles('galaxy root/requirements.txt') }}
|
||||
- name: Run tests
|
||||
run: './run_tests.sh -toolshed'
|
||||
working-directory: 'galaxy root'
|
||||
-29
@@ -1,29 +0,0 @@
|
||||
os: osx
|
||||
# No version of Python is available via virtualenv on OS X workers, see https://github.com/travis-ci/travis-ci/issues/2312
|
||||
language: generic
|
||||
|
||||
env:
|
||||
- TOX_ENV=py27-first_startup
|
||||
- TOX_ENV=py37-first_startup
|
||||
|
||||
install:
|
||||
- set -e
|
||||
- pip install tox
|
||||
- |
|
||||
if [ "$TOX_ENV" == "py27-first_startup" ]; then
|
||||
# Use this job to test the latest migrations
|
||||
wget -q https://github.com/jmchilton/galaxy-downloads/raw/master/db_gx_rev_0141.sqlite
|
||||
mv db_gx_rev_0141.sqlite database/universe.sqlite
|
||||
elif [ "$TOX_ENV" == "py37-first_startup" ]; then
|
||||
# There is now a pre-installed python3 on osx Travis workers, but use this job to test using a conda environment
|
||||
MINICONDA_URL="https://repo.anaconda.com/miniconda"
|
||||
MINICONDA_FILE="Miniconda3-latest-MacOSX-x86_64.sh"
|
||||
curl -L -O "${MINICONDA_URL}/${MINICONDA_FILE}"
|
||||
bash $MINICONDA_FILE -b
|
||||
. ~/miniconda3/bin/activate
|
||||
fi
|
||||
|
||||
script: tox -e $TOX_ENV
|
||||
|
||||
notifications:
|
||||
email: false
|
||||
@@ -86,6 +86,7 @@ The following individuals have contributed code to Galaxy:
|
||||
* Joachim Jacob <joachim.jacob@gmail.com>
|
||||
* Xiaoqian Jiang <jxq198409@hotmail.com>
|
||||
* Jim Johnson <jj@umn.edu> <jj@msi.umn.edu>
|
||||
* Kaivan Kamali <kxk302@gmail.com>
|
||||
* Radhesh Kamath <radhesh@bx.psu.edu>
|
||||
* Iyad Kandalaft <ik@iyadk.com>
|
||||
* Jan Kanis <jan.code@jankanis.nl>
|
||||
|
||||
@@ -95,6 +95,7 @@ export { mountJobMetrics } from "components/JobMetrics";
|
||||
export { mountJobParameters } from "components/JobParameters";
|
||||
export { mountWorkflowEditor } from "components/Workflow/Editor/mount";
|
||||
export { mountPageDisplay } from "components/PageDisplay";
|
||||
export { mountDestinationParams } from "components/JobDestinationParams";
|
||||
|
||||
// Used in common.mako
|
||||
export { default as store } from "storemodern";
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
import Vuex from "vuex";
|
||||
import axios from "axios";
|
||||
import MockAdapter from "axios-mock-adapter";
|
||||
import { mount, createLocalVue } from "@vue/test-utils";
|
||||
import { createStore } from "../../store";
|
||||
import flushPromises from "flush-promises";
|
||||
import JobDestinationParams from "./JobDestinationParams";
|
||||
import jobDestinationResponse from "./testData/jobDestinationResponse";
|
||||
|
||||
const JOB_ID = "foo_job_id";
|
||||
|
||||
describe("JobDestinationParams/JobDestinationParams.vue", () => {
|
||||
const localVue = createLocalVue();
|
||||
localVue.use(Vuex);
|
||||
|
||||
const responseKeys = Object.keys(jobDestinationResponse);
|
||||
|
||||
let testStore, axiosMock, wrapper;
|
||||
|
||||
beforeEach(async () => {
|
||||
axiosMock = new MockAdapter(axios);
|
||||
testStore = createStore();
|
||||
const propsData = {
|
||||
jobId: JOB_ID,
|
||||
};
|
||||
axiosMock.onGet(`/api/jobs/${JOB_ID}/destination_params`).reply(200, jobDestinationResponse);
|
||||
wrapper = mount(JobDestinationParams, {
|
||||
store: testStore,
|
||||
propsData,
|
||||
localVue,
|
||||
});
|
||||
await flushPromises();
|
||||
assert(responseKeys.length > 0, "test data is invalid!");
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
axiosMock.restore();
|
||||
});
|
||||
|
||||
it("destination parameters should exist", async () => {
|
||||
expect(Object.keys(wrapper.vm.jobDestinationParams).length).to.equals(responseKeys.length);
|
||||
expect(wrapper.vm.jobId).to.equals(JOB_ID);
|
||||
expect(wrapper.vm.jobDestinationParams["docker_net"]).to.equals("bridge");
|
||||
expect(wrapper.vm.jobDestinationParams["docker_set_user"]).to.equals(null);
|
||||
});
|
||||
|
||||
it("destination parameters should be rendered", async () => {
|
||||
console.log(wrapper.html());
|
||||
const paramsTable = wrapper.find("#destination_parameters");
|
||||
expect(paramsTable.isVisible()).to.equals(true);
|
||||
const params = paramsTable.findAll("tbody > tr");
|
||||
expect(params.length).to.equals(responseKeys.length);
|
||||
|
||||
for (let counter = 0; counter < responseKeys.length - 1; counter++) {
|
||||
const parameter = params.at(counter).findAll("td");
|
||||
const parameterTitle = parameter.at(0).text();
|
||||
const parameterValue = parameter.at(1).text();
|
||||
|
||||
assert(responseKeys.includes(parameterTitle), "rendered parameter should exist in test data!");
|
||||
// since we render null as an empty string, rendered empty string should always equal null in test data
|
||||
assert(
|
||||
jobDestinationResponse[parameterTitle] === (parameterValue === "" ? null : parameterValue),
|
||||
"parameter value is not equal to test data!"
|
||||
);
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,36 @@
|
||||
<template>
|
||||
<div>
|
||||
<table id="destination_parameters" class="tabletip info_data_table">
|
||||
<tbody>
|
||||
<tr v-for="(value, title) in jobDestinationParams" :key="title">
|
||||
<td>{{ title }}</td>
|
||||
<td>{{ value }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapCacheActions } from "vuex-cache";
|
||||
|
||||
export default {
|
||||
props: {
|
||||
jobId: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
created: function () {
|
||||
this.fetchJobDestinationParams(this.jobId);
|
||||
},
|
||||
computed: {
|
||||
jobDestinationParams: function () {
|
||||
return this.$store.getters.jobDestinationParams(this.jobId);
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
...mapCacheActions(["fetchJobDestinationParams"]),
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,3 @@
|
||||
export { default as JobDestinationParams } from "./JobDestinationParams";
|
||||
|
||||
export { mountDestinationParams } from "./mount";
|
||||
@@ -0,0 +1,13 @@
|
||||
/**
|
||||
* Endpoint for mounting job metrics from non-Vue environment.
|
||||
*/
|
||||
import $ from "jquery";
|
||||
import JobDestinationParams from "./JobDestinationParams.vue";
|
||||
import { mountVueComponent } from "utils/mountVueComponent";
|
||||
|
||||
export const mountDestinationParams = (propsData = {}) => {
|
||||
$(".job-destination-parameters").each((index, el) => {
|
||||
propsData.jobId = $(el).attr("job_id");
|
||||
mountVueComponent(JobDestinationParams)(propsData, el);
|
||||
});
|
||||
};
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"Runner": "local",
|
||||
"Runner Job ID": "23027",
|
||||
"Handler": "main.web.1",
|
||||
"docker_auto_rm": "true",
|
||||
"docker_enabled": "true",
|
||||
"docker_net": "bridge",
|
||||
"docker_set_user": null,
|
||||
"docker_sudo": "false",
|
||||
"docker_volumes": "$galaxy_root:ro,$tool_directory:ro,$job_directory:rw,$working_directory:rw,$default_file_path:ro",
|
||||
"require_container": "true"
|
||||
}
|
||||
@@ -77,12 +77,15 @@ export default {
|
||||
},
|
||||
workflows: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
dataManagers: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
moduleSections: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div id="tool-recommendation" class="tool-recommendation-view">
|
||||
<div v-if="!deprecated" class="infomessagelarge">
|
||||
<div>
|
||||
<div v-if="!deprecated && showMessage" class="infomessagelarge">
|
||||
<h4>Tool recommendation</h4>
|
||||
You have used {{ getToolId }} tool. For further analysis, you could try using the following/recommended
|
||||
tools. The recommended tools are shown in the decreasing order of their scores predicted using machine
|
||||
@@ -8,14 +8,17 @@
|
||||
tool than a tool with a lower score. Please click on one of the following/recommended tools to open its
|
||||
definition.
|
||||
</div>
|
||||
<div v-else class="warningmessagelarge">You have used {{ getToolId }} tool. {{ deprecatedMessage }}</div>
|
||||
<div v-else-if="deprecated" class="warningmessagelarge">
|
||||
You have used {{ getToolId }} tool. {{ deprecatedMessage }}
|
||||
</div>
|
||||
<div id="tool-recommendation" class="tool-recommendation-view"></div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import * as d3 from "d3";
|
||||
import { getAppRoot } from "onload/loadConfig";
|
||||
import axios from "axios";
|
||||
import { getDatatypeMapping, getToolPredictions } from "components/Workflow/Editor/services";
|
||||
|
||||
export default {
|
||||
props: {
|
||||
@@ -26,8 +29,9 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
deprecated: null,
|
||||
deprecated: false,
|
||||
deprecatedMessage: "",
|
||||
showMessage: false,
|
||||
};
|
||||
},
|
||||
created() {
|
||||
@@ -46,86 +50,75 @@ export default {
|
||||
methods: {
|
||||
loadRecommendations() {
|
||||
const toolId = this.getToolId;
|
||||
const url = `${getAppRoot()}api/workflows/get_tool_predictions`;
|
||||
axios
|
||||
.post(url, {
|
||||
tool_sequence: toolId,
|
||||
})
|
||||
.then((response) => {
|
||||
axios.get(`${getAppRoot()}api/datatypes/mapping`).then((responseMapping) => {
|
||||
const predData = response.data.predicted_data;
|
||||
const datatypesMapping = responseMapping.data;
|
||||
const extToType = datatypesMapping.ext_to_class_name;
|
||||
const typeToType = datatypesMapping.class_to_classes;
|
||||
this.deprecated = predData.is_deprecated;
|
||||
|
||||
if (response.data !== null && predData.children.length > 0) {
|
||||
const filteredData = {};
|
||||
const compatibleTools = {};
|
||||
const filteredChildren = [];
|
||||
const outputDatatypes = predData.o_extensions;
|
||||
const children = predData.children;
|
||||
for (const nameObj of children.entries()) {
|
||||
const inputDatatypes = nameObj[1].i_extensions;
|
||||
for (const out_t of outputDatatypes.entries()) {
|
||||
for (const in_t of inputDatatypes.entries()) {
|
||||
const child = extToType[out_t[1]];
|
||||
const parent = extToType[in_t[1]];
|
||||
if (
|
||||
(typeToType[child] && parent in typeToType[child]) === true ||
|
||||
out_t[1] === "input" ||
|
||||
out_t[1] === "_sniff_" ||
|
||||
out_t[1] === "input_collection"
|
||||
) {
|
||||
compatibleTools[nameObj[1].tool_id] = nameObj[1].name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (const id in compatibleTools) {
|
||||
for (const nameObj of children.entries()) {
|
||||
if (nameObj[1].tool_id === id) {
|
||||
filteredChildren.push(nameObj[1]);
|
||||
const requestData = {
|
||||
tool_sequence: toolId,
|
||||
};
|
||||
getToolPredictions(requestData).then((responsePred) => {
|
||||
getDatatypeMapping().then((datatypesMapping) => {
|
||||
const predData = responsePred.predicted_data;
|
||||
const extToType = datatypesMapping.ext_to_class_name;
|
||||
const typeToType = datatypesMapping.class_to_classes;
|
||||
this.deprecated = predData.is_deprecated;
|
||||
this.deprecatedMessage = predData.message;
|
||||
if (responsePred !== null && predData.children.length > 0) {
|
||||
const filteredData = {};
|
||||
const compatibleTools = {};
|
||||
const filteredChildren = [];
|
||||
const outputDatatypes = predData.o_extensions;
|
||||
const children = predData.children;
|
||||
for (const nameObj of children.entries()) {
|
||||
const inputDatatypes = nameObj[1].i_extensions;
|
||||
for (const outT of outputDatatypes.entries()) {
|
||||
for (const inTool of inputDatatypes.entries()) {
|
||||
const child = extToType[outT[1]];
|
||||
const parent = extToType[inTool[1]];
|
||||
if (
|
||||
(typeToType[child] && parent in typeToType[child]) === true ||
|
||||
outT[1] === "input" ||
|
||||
outT[1] === "_sniff_" ||
|
||||
outT[1] === "input_collection"
|
||||
) {
|
||||
compatibleTools[nameObj[1].tool_id] = nameObj[1].name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
filteredData.o_extensions = predData.o_extensions;
|
||||
filteredData.name = predData.name;
|
||||
filteredData.children = filteredChildren;
|
||||
if (filteredChildren.length > 0 && this.deprecated === false) {
|
||||
this.renderD3Tree(filteredData);
|
||||
} else if (this.deprecated === true) {
|
||||
this.deprecatedMessage = predData.message;
|
||||
}
|
||||
for (const id in compatibleTools) {
|
||||
for (const nameObj of children.entries()) {
|
||||
if (nameObj[1].tool_id === id) {
|
||||
filteredChildren.push(nameObj[1]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
filteredData.o_extensions = predData.o_extensions;
|
||||
filteredData.name = predData.name;
|
||||
filteredData.children = filteredChildren;
|
||||
if (filteredChildren.length > 0 && this.deprecated === false) {
|
||||
this.showMessage = true;
|
||||
this.renderD3Tree(filteredData);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
renderD3Tree(predictedTools) {
|
||||
const duration = 750;
|
||||
const svg = d3.select("#tool-recommendation").append("svg").attr("class", "tree-size").append("g");
|
||||
let i = 0;
|
||||
let root = null;
|
||||
let x = 0;
|
||||
let y = 0;
|
||||
let translateX = 0;
|
||||
|
||||
const duration = 750;
|
||||
const maxTextLength = 20;
|
||||
const svg = d3.select("#tool-recommendation").append("svg").attr("class", "tree-size").append("g");
|
||||
const gElem = svg[0][0];
|
||||
const svgElem = gElem.parentNode;
|
||||
const clientH = svgElem.clientHeight;
|
||||
const clientW = svgElem.clientWidth;
|
||||
y = parseInt(clientH * 0.9);
|
||||
x = parseInt(clientW * 0.6);
|
||||
translateX = parseInt(clientW * 0.15);
|
||||
const translateX = parseInt(clientW * 0.15);
|
||||
|
||||
svgElem.setAttribute("viewBox", "0 0 " + x + " " + clientH);
|
||||
svgElem.setAttribute("preserveAspectRatio", "xMinYMin");
|
||||
gElem.setAttribute("transform", "translate(" + translateX + ", 5)");
|
||||
|
||||
const tree = d3.layout.tree().size([y, x]);
|
||||
svgElem.setAttribute("viewBox", -translateX + " 0 " + 0.5 * clientW + " " + clientH);
|
||||
svgElem.setAttribute("preserveAspectRatio", "xMidYMid meet");
|
||||
|
||||
const tree = d3.layout.tree().size([clientH, clientW]);
|
||||
const diagonal = d3.svg.diagonal().projection((d) => {
|
||||
return [d.y, d.x];
|
||||
});
|
||||
@@ -135,9 +128,9 @@ export default {
|
||||
const links = tree.links(nodes);
|
||||
// Normalize for fixed-depth.
|
||||
nodes.forEach((d) => {
|
||||
d.y = d.depth * 180;
|
||||
d.y = d.depth * (clientW / 10);
|
||||
});
|
||||
// Update the nodes…
|
||||
// Update the nodes
|
||||
const node = svg.selectAll("g.node").data(nodes, (d) => {
|
||||
return d.id || (d.id = ++i);
|
||||
});
|
||||
@@ -161,11 +154,14 @@ export default {
|
||||
return d.children || d._children ? "end" : "start";
|
||||
})
|
||||
.text((d) => {
|
||||
const tName = d.name;
|
||||
if (tName.length > maxTextLength) {
|
||||
return tName.slice(0, maxTextLength) + "...";
|
||||
}
|
||||
return d.name;
|
||||
})
|
||||
.attr("class", "node-enter");
|
||||
});
|
||||
nodeEnter.append("title").text((d) => {
|
||||
return d.children || d._children ? "Click to collapse" : "Click to open tool definition";
|
||||
return d.children || d._children ? d.name : "Open tool - " + d.name;
|
||||
});
|
||||
// Transition nodes to their new position.
|
||||
const nodeUpdate = node
|
||||
@@ -174,19 +170,15 @@ export default {
|
||||
.attr("transform", (d) => {
|
||||
return "translate(" + d.y + "," + d.x + ")";
|
||||
});
|
||||
nodeUpdate.select("circle").attr("r", 4.5);
|
||||
nodeUpdate.select("text").attr("class", "node-update");
|
||||
nodeUpdate.select("circle").attr("r", 2.5);
|
||||
// Transition exiting nodes to the parent's new position.
|
||||
const nodeExit = node
|
||||
.exit()
|
||||
node.exit()
|
||||
.transition()
|
||||
.duration(duration)
|
||||
.attr("transform", (d) => {
|
||||
return "translate(" + source.y + "," + source.x + ")";
|
||||
})
|
||||
.remove();
|
||||
nodeExit.select("circle").attr("r", 1e-6);
|
||||
nodeExit.select("text").attr("class", "node-enter");
|
||||
// Update the links
|
||||
const link = svg.selectAll("path.link").data(links, (d) => {
|
||||
return d.target.id;
|
||||
@@ -239,7 +231,7 @@ export default {
|
||||
}
|
||||
};
|
||||
root = predictedTools;
|
||||
root.x0 = y / 2;
|
||||
root.x0 = parseInt(clientH / 2);
|
||||
root.y0 = 0;
|
||||
root.children.forEach(collapse);
|
||||
update(root);
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
<div v-else>
|
||||
<b-input-group class="mb-3">
|
||||
<b-input
|
||||
id="toolshed-repo-search"
|
||||
placeholder="Search Repositories"
|
||||
v-model="queryInput"
|
||||
@input="delayQuery"
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<b-modal :static="modalStatic" v-model="modalShow" @ok="onOk" @hide="onHide">
|
||||
<b-modal id="repo-install-settings" :static="modalStatic" v-model="modalShow" @ok="onOk" @hide="onHide">
|
||||
<template v-slot:modal-header>
|
||||
<h4 class="title m-0">
|
||||
{{ modalTitle }}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
<b-table striped :items="repositories" :fields="fields">
|
||||
<b-table striped id="shed-search-results" :items="repositories" :fields="fields">
|
||||
<template v-slot:cell(name)="row">
|
||||
<b-link href="javascript:void(0)" role="button" class="font-weight-bold" @click="row.toggleDetails">
|
||||
{{ row.item.name }}
|
||||
|
||||
@@ -83,7 +83,7 @@ export const getUserPreferencesModel = () => {
|
||||
},
|
||||
logout: {
|
||||
title: _l("Sign Out"),
|
||||
id: "edit-preferences-custom-builds",
|
||||
id: "edit-preferences-sign-out",
|
||||
description: _l("Click here to sign out of all sessions."),
|
||||
icon: "fa-sign-out",
|
||||
shouldRender: !!Galaxy.session_csrf_token,
|
||||
|
||||
@@ -68,15 +68,19 @@ export default {
|
||||
},
|
||||
annotation: {
|
||||
type: String,
|
||||
default: "",
|
||||
},
|
||||
version: {
|
||||
type: Number,
|
||||
default: null,
|
||||
},
|
||||
versions: {
|
||||
type: Array,
|
||||
default: null,
|
||||
},
|
||||
parameters: {
|
||||
type: Array,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="unified-panel-body workflow-right">
|
||||
<div v-if="canvas" class="m-1">
|
||||
<div class="m-1" v-show="canvas">
|
||||
<slot name="attributes" />
|
||||
<div id="right-content" class="right-content" />
|
||||
</div>
|
||||
<ReportHelp v-else />
|
||||
<ReportHelp v-show="!canvas" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
<template v-slot:panel>
|
||||
<ToolBoxWorkflow
|
||||
:toolbox="toolbox"
|
||||
:module-sections="module_sections"
|
||||
:data-managers="data_managers"
|
||||
:module-sections="moduleSections"
|
||||
:data-managers="dataManagers"
|
||||
:workflows="workflows"
|
||||
@onInsertTool="onInsertTool"
|
||||
@onInsertModule="onInsertModule"
|
||||
@@ -110,30 +110,39 @@ export default {
|
||||
props: {
|
||||
id: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
version: {
|
||||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
name: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
tags: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
annotation: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
module_sections: {
|
||||
moduleSections: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
data_managers: {
|
||||
dataManagers: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
workflows: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
toolbox: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
|
||||
@@ -10,6 +10,19 @@
|
||||
>
|
||||
<i class="fa fa-times" />
|
||||
</b-button>
|
||||
<b-button
|
||||
:id="popoverId"
|
||||
v-if="isEnabled"
|
||||
class="node-recommendations py-0 float-right"
|
||||
variant="primary"
|
||||
size="sm"
|
||||
aria-label="tool recommendations"
|
||||
>
|
||||
<i class="fa fa-arrow-right" />
|
||||
</b-button>
|
||||
<b-popover :target="popoverId" triggers="hover" placement="bottom" :show.sync="popoverShow">
|
||||
<WorkflowRecommendations :node="node" @onCreate="onCreate" />
|
||||
</b-popover>
|
||||
<b-button
|
||||
v-if="canClone"
|
||||
class="node-clone py-0 float-right"
|
||||
@@ -35,17 +48,27 @@
|
||||
import Vue from "vue";
|
||||
import BootstrapVue from "bootstrap-vue";
|
||||
import WorkflowIcons from "components/Workflow/icons";
|
||||
import { getModule } from "./services";
|
||||
import LoadingSpan from "components/LoadingSpan";
|
||||
import { getGalaxyInstance } from "app";
|
||||
import WorkflowRecommendations from "components/Workflow/Editor/Recommendations";
|
||||
|
||||
Vue.use(BootstrapVue);
|
||||
|
||||
export default {
|
||||
components: {
|
||||
LoadingSpan,
|
||||
WorkflowRecommendations,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
popoverShow: false,
|
||||
};
|
||||
},
|
||||
props: {
|
||||
id: {
|
||||
type: String,
|
||||
default: "",
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
@@ -57,6 +80,11 @@ export default {
|
||||
},
|
||||
node: {
|
||||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
nodeId: {
|
||||
type: String,
|
||||
default: "",
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
@@ -67,9 +95,15 @@ export default {
|
||||
}
|
||||
return null;
|
||||
},
|
||||
popoverId() {
|
||||
return `popover-${this.nodeId}`;
|
||||
},
|
||||
canClone() {
|
||||
return this.type != "subworkflow";
|
||||
},
|
||||
isEnabled() {
|
||||
return getGalaxyInstance().config.enable_tool_recommendations;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
onDestroy() {
|
||||
@@ -78,6 +112,18 @@ export default {
|
||||
onClone() {
|
||||
this.node.clone();
|
||||
},
|
||||
onCreate(toolId, event) {
|
||||
const requestData = {
|
||||
tool_id: toolId,
|
||||
type: "tool",
|
||||
_: "true",
|
||||
};
|
||||
getModule(requestData).then((response) => {
|
||||
var node = this.node.app.create_node("tool", response.name, toolId);
|
||||
this.node.app.set_node(node, response);
|
||||
this.popoverShow = false;
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
<template>
|
||||
<div class="workflow-recommendations">
|
||||
<div class="header-background">
|
||||
<h4>{{ popoverHeaderText }}</h4>
|
||||
</div>
|
||||
<LoadingSpan v-if="showLoading" message="Loading recommendations" />
|
||||
<div v-if="compatibleTools.length > 0 && !isDeprecated">
|
||||
<div v-for="tool in compatibleTools" :key="tool.id">
|
||||
<i class="fa mr-1 fa-wrench"></i>
|
||||
<a href="#" title="Open tool" :id="tool.id" @click="$emit('onCreate', tool.id, $event)">
|
||||
{{ tool.name }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else-if="isDeprecated">
|
||||
{{ deprecatedMessage }}
|
||||
</div>
|
||||
<div v-if="compatibleTools.length === 0 && !showLoading">
|
||||
{{ noRecommendationsMessage }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getToolPredictions } from "./services";
|
||||
import LoadingSpan from "components/LoadingSpan";
|
||||
import _l from "utils/localization";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
LoadingSpan,
|
||||
},
|
||||
props: {
|
||||
node: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
compatibleTools: [],
|
||||
isDeprecated: false,
|
||||
popoverHeaderText: _l("Tool recommendations"),
|
||||
noRecommendationsMessage: _l("No tool recommendations"),
|
||||
deprecatedMessage: "",
|
||||
showLoading: true,
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.loadRecommendations();
|
||||
},
|
||||
methods: {
|
||||
getToolId(toolId) {
|
||||
if (toolId !== undefined && toolId !== null && toolId.indexOf("/") > -1) {
|
||||
const toolIdSlash = toolId.split("/");
|
||||
toolId = toolIdSlash[toolIdSlash.length - 2];
|
||||
}
|
||||
return toolId;
|
||||
},
|
||||
getWorkflowPath(wfSteps, currentNodeId) {
|
||||
const steps = {};
|
||||
const stepNames = {};
|
||||
for (const stpIdx in wfSteps.steps) {
|
||||
const step = wfSteps.steps[stpIdx];
|
||||
const inputConnections = step.input_connections;
|
||||
stepNames[step.id] = this.getToolId(step.content_id);
|
||||
for (const icIdx in inputConnections) {
|
||||
const ic = inputConnections[icIdx];
|
||||
if (ic !== null && ic !== undefined) {
|
||||
const prevConn = [];
|
||||
for (const conn of ic) {
|
||||
prevConn.push(conn.id.toString());
|
||||
}
|
||||
steps[step.id.toString()] = prevConn;
|
||||
}
|
||||
}
|
||||
}
|
||||
// recursive call to determine path
|
||||
function readPaths(nodeId, ph) {
|
||||
for (const st in steps) {
|
||||
if (parseInt(st) === parseInt(nodeId)) {
|
||||
const parentId = parseInt(steps[st][0]);
|
||||
if (parentId !== undefined && parentId !== null) {
|
||||
ph.push(parentId);
|
||||
if (steps[parentId] !== undefined && steps[parentId] !== null) {
|
||||
readPaths(parentId, ph);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ph;
|
||||
}
|
||||
let ph = [];
|
||||
const stepNameList = [];
|
||||
ph.push(currentNodeId);
|
||||
ph = readPaths(currentNodeId, ph);
|
||||
for (const sIdx of ph) {
|
||||
const sName = stepNames[sIdx.toString()];
|
||||
if (sName !== undefined && sName !== null) {
|
||||
stepNameList.push(sName);
|
||||
}
|
||||
}
|
||||
return stepNameList.join(",");
|
||||
},
|
||||
loadRecommendations() {
|
||||
const workflowSimple = this.node.app.to_simple();
|
||||
const node = this.node;
|
||||
const toolSequence = this.getWorkflowPath(workflowSimple, node.id);
|
||||
const requestData = { tool_sequence: toolSequence };
|
||||
getToolPredictions(requestData).then((responsePred) => {
|
||||
const predictedData = responsePred.predicted_data;
|
||||
const outputDatatypes = predictedData.o_extensions;
|
||||
const predictedDataChildren = predictedData.children;
|
||||
const app = this.node.app;
|
||||
this.isDeprecated = predictedData.is_deprecated;
|
||||
this.deprecatedMessage = predictedData.message;
|
||||
if (predictedDataChildren.length > 0) {
|
||||
const cTools = [];
|
||||
for (const nameObj of predictedDataChildren.entries()) {
|
||||
const t = {};
|
||||
const inputDatatypes = nameObj[1].i_extensions;
|
||||
for (const outT of outputDatatypes.entries()) {
|
||||
for (const inTool of inputDatatypes.entries()) {
|
||||
if (
|
||||
app.isSubType(outT[1], inTool[1]) === true ||
|
||||
outT[1] === "input" ||
|
||||
outT[1] === "_sniff_" ||
|
||||
outT[1] === "input_collection"
|
||||
) {
|
||||
t.id = nameObj[1].tool_id;
|
||||
t.name = nameObj[1].name;
|
||||
cTools.push(t);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.compatibleTools = cTools;
|
||||
}
|
||||
this.showLoading = false;
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -67,3 +67,21 @@ export async function saveWorkflow(workflow, id) {
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
export async function getDatatypeMapping() {
|
||||
try {
|
||||
const mappingRequest = await axios.get(`${getAppRoot()}api/datatypes/mapping`);
|
||||
return mappingRequest.data;
|
||||
} catch (e) {
|
||||
rethrowSimple(e);
|
||||
}
|
||||
}
|
||||
|
||||
export async function getToolPredictions(requestData) {
|
||||
try {
|
||||
const response = await axios.post(`${getAppRoot()}api/workflows/get_tool_predictions`, requestData);
|
||||
return response.data;
|
||||
} catch (e) {
|
||||
rethrowSimple(e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,9 +144,9 @@ export function getWorkflowParameters(nodes) {
|
||||
});
|
||||
}
|
||||
if (node.post_job_actions) {
|
||||
Object.entries(node.post_job_actions).forEach(([k, pja]) => {
|
||||
Object.values(node.post_job_actions).forEach((pja) => {
|
||||
if (pja.action_arguments) {
|
||||
Object.entries(pja.action_arguments).forEach(([k, action_argument]) => {
|
||||
Object.values(pja.action_arguments).forEach((action_argument) => {
|
||||
if (typeof action_argument === "string") {
|
||||
const arg_matches = action_argument.match(parameter_re);
|
||||
if (arg_matches) {
|
||||
@@ -198,7 +198,8 @@ export function saveAs(workflow) {
|
||||
window.location = `${getAppRoot()}workflow/editor?id=${id}`;
|
||||
hide_modal();
|
||||
})
|
||||
.fail(() => {
|
||||
.fail((err) => {
|
||||
console.debug(err);
|
||||
hide_modal();
|
||||
alert("Saving this workflow failed. Please contact this site's administrator.");
|
||||
});
|
||||
|
||||
@@ -87,6 +87,7 @@ const AdminPanel = Backbone.View.extend({
|
||||
title: _l("Forms"),
|
||||
url: "admin/forms",
|
||||
target: "__use_router__",
|
||||
id: "admin-link-forms",
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -97,17 +98,20 @@ const AdminPanel = Backbone.View.extend({
|
||||
title: _l("Install and Uninstall"),
|
||||
url: "admin/toolshed",
|
||||
target: "__use_router__",
|
||||
id: "admin-link-toolshed",
|
||||
enabled: this.settings.is_tool_shed_installed,
|
||||
},
|
||||
{
|
||||
title: _l("Manage Metadata"),
|
||||
url: "admin/reset_metadata",
|
||||
id: "admin-link-metadata",
|
||||
enabled: this.settings.is_repo_installed,
|
||||
target: "__use_router__",
|
||||
},
|
||||
{
|
||||
title: _l("Manage Whitelist"),
|
||||
url: "admin/sanitize_whitelist",
|
||||
id: "admin-link-whitelist",
|
||||
},
|
||||
{
|
||||
title: _l("Manage Dependencies"),
|
||||
@@ -123,14 +127,17 @@ const AdminPanel = Backbone.View.extend({
|
||||
title: _l("View Lineage"),
|
||||
url: "admin/tool_versions",
|
||||
target: "__use_router__",
|
||||
id: "admin-link-tool-versions",
|
||||
},
|
||||
{
|
||||
title: _l("View Migration Stages"),
|
||||
url: "admin/review_tool_migration_stages",
|
||||
id: "admin-link-migrations",
|
||||
},
|
||||
{
|
||||
title: _l("View Error Logs"),
|
||||
url: "admin/error_stack",
|
||||
id: "admin-link-error-stack",
|
||||
target: "__use_router__",
|
||||
},
|
||||
],
|
||||
|
||||
@@ -24,7 +24,7 @@ export default FormBase.extend({
|
||||
FormBase.prototype.initialize.call(this, options);
|
||||
|
||||
// optional model update
|
||||
this._update(this.model.get("initialmodel"));
|
||||
this._update();
|
||||
|
||||
// listen to history panel
|
||||
if (this.model.get("listen_to_history") && Galaxy.currHistoryPanel) {
|
||||
@@ -39,9 +39,9 @@ export default FormBase.extend({
|
||||
},
|
||||
|
||||
/** Allows tool form variation to update tool model */
|
||||
_update: function (callback) {
|
||||
_update: function () {
|
||||
var self = this;
|
||||
callback = callback || this.model.get("buildmodel");
|
||||
var callback = this.model.get("buildmodel");
|
||||
if (callback) {
|
||||
this.deferred.reset();
|
||||
this.deferred.execute((process) => {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import $ from "jquery";
|
||||
import axios from "axios";
|
||||
import { getAppRoot } from "onload/loadConfig";
|
||||
import { getGalaxyInstance } from "app";
|
||||
import _l from "utils/localization";
|
||||
@@ -11,95 +11,85 @@ export class DefaultForm {
|
||||
constructor(options) {
|
||||
var self = this;
|
||||
var node = options.node;
|
||||
this.form = new Form(
|
||||
Utils.merge(options, {
|
||||
onchange: function () {
|
||||
Utils.request({
|
||||
type: "POST",
|
||||
url: `${getAppRoot()}api/workflows/build_module`,
|
||||
data: {
|
||||
id: node.id,
|
||||
type: node.type,
|
||||
content_id: node.content_id,
|
||||
inputs: self.form.data.create(),
|
||||
},
|
||||
success: function (data) {
|
||||
node.update_field_data(data);
|
||||
},
|
||||
this.workflow = options.workflow;
|
||||
_addLabelAnnotation(this, node);
|
||||
this.form = new Form({
|
||||
...options,
|
||||
onchange() {
|
||||
axios
|
||||
.post(`${getAppRoot()}api/workflows/build_module`, {
|
||||
id: node.id,
|
||||
type: node.type,
|
||||
content_id: node.content_id,
|
||||
inputs: self.form.data.create(),
|
||||
})
|
||||
.then((response) => {
|
||||
const data = response.data;
|
||||
node.update_field_data(data);
|
||||
});
|
||||
},
|
||||
})
|
||||
);
|
||||
_addLabelAnnotation(this.form);
|
||||
this.form.render();
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/** Tool form wrapper for the workflow editor. */
|
||||
export class ToolForm {
|
||||
constructor(options) {
|
||||
var self = this;
|
||||
var node = options.node;
|
||||
this.form = new ToolFormBase(
|
||||
Utils.merge(options, {
|
||||
text_enable: "Set in Advance",
|
||||
text_disable: "Set at Runtime",
|
||||
narrow: true,
|
||||
initial_errors: true,
|
||||
cls: "ui-portlet-section",
|
||||
initialmodel: function (process, form) {
|
||||
self._customize(form);
|
||||
process.resolve();
|
||||
},
|
||||
buildmodel: function (process, form) {
|
||||
form.model.get("postchange")(process, form);
|
||||
},
|
||||
postchange: function (process, form) {
|
||||
const Galaxy = getGalaxyInstance();
|
||||
var options = form.model.attributes;
|
||||
var current_state = {
|
||||
tool_id: options.id,
|
||||
tool_version: options.version,
|
||||
type: "tool",
|
||||
inputs: $.extend(true, {}, form.data.create()),
|
||||
};
|
||||
Galaxy.emit.debug("tool-form-workflow::postchange()", "Sending current state.", current_state);
|
||||
Utils.request({
|
||||
type: "POST",
|
||||
url: `${getAppRoot()}api/workflows/build_module`,
|
||||
data: current_state,
|
||||
success: function (data) {
|
||||
form.model.set(data.config_form);
|
||||
self._customize(form);
|
||||
form.update(data.config_form);
|
||||
form.errors(data.config_form);
|
||||
// This hasn't modified the workflow, just returned
|
||||
// module information for the tool to update the workflow
|
||||
// state stored on the client with. User needs to save
|
||||
// for this to take effect.
|
||||
node.update_field_data(data);
|
||||
Galaxy.emit.debug("tool-form-workflow::postchange()", "Received new model.", data);
|
||||
process.resolve();
|
||||
},
|
||||
error: function (response) {
|
||||
Galaxy.emit.debug("tool-form-workflow::postchange()", "Refresh request failed.", response);
|
||||
process.reject();
|
||||
},
|
||||
const self = this;
|
||||
const node = options.node;
|
||||
this.workflow = options.workflow;
|
||||
this.datatypes = options.datatypes;
|
||||
this._customize(node);
|
||||
this.form = new ToolFormBase({
|
||||
...node.config_form,
|
||||
text_enable: "Set in Advance",
|
||||
text_disable: "Set at Runtime",
|
||||
narrow: true,
|
||||
initial_errors: true,
|
||||
cls: "ui-portlet-section",
|
||||
postchange(process, form) {
|
||||
const Galaxy = getGalaxyInstance();
|
||||
const options = form.model.attributes;
|
||||
const current_state = {
|
||||
tool_id: options.id,
|
||||
tool_version: options.version,
|
||||
type: "tool",
|
||||
inputs: Object.assign({}, form.data.create()),
|
||||
};
|
||||
Galaxy.emit.debug("tool-form-workflow::postchange()", "Sending current state.", current_state);
|
||||
axios
|
||||
.post(`${getAppRoot()}api/workflows/build_module`, current_state)
|
||||
.then((response) => {
|
||||
const data = response.data;
|
||||
self._customize(data);
|
||||
self.form.model.set(data.config_form);
|
||||
self.form.update(data.config_form);
|
||||
self.form.errors(data.config_form);
|
||||
// This hasn't modified the workflow, just returned
|
||||
// module information for the tool to update the workflow
|
||||
// state stored on the client with. User needs to save
|
||||
// for this to take effect.
|
||||
node.update_field_data(data);
|
||||
Galaxy.emit.debug("tool-form-workflow::postchange()", "Received new model.", data);
|
||||
process.resolve();
|
||||
})
|
||||
.catch((response) => {
|
||||
Galaxy.emit.debug("tool-form-workflow::postchange()", "Refresh request failed.", response);
|
||||
process.reject();
|
||||
});
|
||||
},
|
||||
})
|
||||
);
|
||||
},
|
||||
});
|
||||
}
|
||||
_customize(form) {
|
||||
var options = form.model.attributes;
|
||||
Utils.deepeach(options.inputs, (input) => {
|
||||
_customize(node) {
|
||||
const inputs = node.config_form.inputs;
|
||||
Utils.deepeach(inputs, (input) => {
|
||||
if (input.type) {
|
||||
input.connectable = true;
|
||||
if (["data", "data_collection"].indexOf(input.type) != -1) {
|
||||
input.type = "hidden";
|
||||
input.info = `Data input '${input.name}' (${Utils.textify(input.extensions)})`;
|
||||
input.value = { __class__: "RuntimeValue" };
|
||||
} else if (!input.fixed) {
|
||||
input.connectable = true;
|
||||
input.collapsible_value = {
|
||||
__class__: "RuntimeValue",
|
||||
};
|
||||
@@ -108,23 +98,22 @@ export class ToolForm {
|
||||
}
|
||||
}
|
||||
});
|
||||
Utils.deepeach(options.inputs, (input) => {
|
||||
Utils.deepeach(inputs, (input) => {
|
||||
if (input.type === "conditional") {
|
||||
input.connectable = false;
|
||||
input.test_param.collapsible_value = undefined;
|
||||
}
|
||||
});
|
||||
_addSections(form);
|
||||
_addLabelAnnotation(form);
|
||||
_addSections(this, node);
|
||||
_addLabelAnnotation(this, node);
|
||||
}
|
||||
}
|
||||
|
||||
/** Augments the module form definition by adding label and annotation fields */
|
||||
function _addLabelAnnotation(form) {
|
||||
var options = form.model.attributes;
|
||||
var workflow = options.workflow;
|
||||
var node = options.node;
|
||||
options.inputs.unshift({
|
||||
function _addLabelAnnotation(self, node) {
|
||||
var workflow = self.workflow;
|
||||
const inputs = node.config_form.inputs;
|
||||
inputs.unshift({
|
||||
type: "text",
|
||||
name: "__annotation",
|
||||
label: "Annotation",
|
||||
@@ -133,7 +122,7 @@ function _addLabelAnnotation(form) {
|
||||
area: true,
|
||||
help: "Add an annotation or notes to this step. Annotations are available when a workflow is viewed.",
|
||||
});
|
||||
options.inputs.unshift({
|
||||
inputs.unshift({
|
||||
type: "text",
|
||||
name: "__label",
|
||||
label: "Label",
|
||||
@@ -149,20 +138,20 @@ function _addLabelAnnotation(form) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
var input_id = form.data.match("__label");
|
||||
var input_element = form.element_list[input_id];
|
||||
var input_id = self.form.data.match("__label");
|
||||
var input_element = self.form.element_list[input_id];
|
||||
input_element.model.set(
|
||||
"error_text",
|
||||
duplicate && "Duplicate label. Please fix this before saving the workflow."
|
||||
);
|
||||
form.trigger("change");
|
||||
self.form.trigger("change");
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
/** Visit input nodes and enrich by name/value pairs from server data */
|
||||
function _visit(head, head_list, output_id, options) {
|
||||
var post_job_actions = options.node.post_job_actions;
|
||||
function _visit(head, head_list, output_id, node) {
|
||||
var post_job_actions = node.post_job_actions;
|
||||
head_list = head_list || [];
|
||||
head_list.push(head);
|
||||
for (var i in head.inputs) {
|
||||
@@ -192,7 +181,7 @@ function _visit(head, head_list, output_id, options) {
|
||||
}
|
||||
}
|
||||
if (input.inputs) {
|
||||
_visit(input, head_list.slice(0), output_id, options);
|
||||
_visit(input, head_list.slice(0), output_id, node);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -215,13 +204,11 @@ function _makeRenameHelp(name_labels) {
|
||||
}
|
||||
|
||||
/** Builds sub section with step actions/annotation */
|
||||
function _makeSection(output_id, label, options) {
|
||||
function _makeSection(self, output_id, label, node) {
|
||||
var extensions = [];
|
||||
var name_label_map = [];
|
||||
var datatypes = options.datatypes;
|
||||
var node = options.node;
|
||||
var workflow = options.workflow;
|
||||
|
||||
var datatypes = self.datatypes;
|
||||
var workflow = self.workflow;
|
||||
for (const key in datatypes) {
|
||||
extensions.push({ 0: datatypes[key], 1: datatypes[key] });
|
||||
}
|
||||
@@ -350,18 +337,15 @@ function _makeSection(output_id, label, options) {
|
||||
},
|
||||
],
|
||||
};
|
||||
_visit(input_config, [], output_id, options);
|
||||
_visit(input_config, [], output_id, node);
|
||||
return input_config;
|
||||
}
|
||||
|
||||
/** Builds all sub sections */
|
||||
function _addSections(form) {
|
||||
var options = form.model.attributes;
|
||||
var inputs = options.inputs;
|
||||
var node = options.node;
|
||||
function _addSections(self, node) {
|
||||
var inputs = node.config_form.inputs;
|
||||
var post_job_actions = node.post_job_actions;
|
||||
var output_id = node.output_terminals && Object.keys(node.output_terminals)[0];
|
||||
|
||||
if (output_id) {
|
||||
inputs.push({
|
||||
name: `pja__${output_id}__EmailAction`,
|
||||
@@ -385,7 +369,7 @@ function _addSections(form) {
|
||||
});
|
||||
for (const output_id in node.output_terminals) {
|
||||
const label = node.output_terminals[output_id].label || output_id;
|
||||
inputs.push(_makeSection(output_id, label, options));
|
||||
inputs.push(_makeSection(self, output_id, label, node));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ class Workflow extends EventEmitter {
|
||||
this.has_changes = false;
|
||||
this.workflowOutputLabels = {};
|
||||
this.workflow_version = 0;
|
||||
this.popover_counter = 0;
|
||||
|
||||
// Canvas overview management
|
||||
this.canvas_manager = new WorkflowCanvas(this, $("#canvas-viewport"), $("#overview-container"));
|
||||
@@ -49,7 +50,7 @@ class Workflow extends EventEmitter {
|
||||
set_node(node, data) {
|
||||
node.init_field_data(data);
|
||||
node.update_field_data(data);
|
||||
$.each(node.output_terminals, (ot_id, ot) => {
|
||||
Object.values(node.output_terminals).forEach((ot) => {
|
||||
node.addWorkflowOutput(ot.name);
|
||||
node.markWorkflowOutput(ot.name);
|
||||
});
|
||||
@@ -142,8 +143,10 @@ class Workflow extends EventEmitter {
|
||||
type: type,
|
||||
title: title_text,
|
||||
node: node,
|
||||
nodeId: this.popover_counter,
|
||||
});
|
||||
|
||||
this.popover_counter++;
|
||||
// Set initial scroll position
|
||||
$f.css("left", $(window).scrollLeft() + 20);
|
||||
$f.css("top", $(window).scrollTop() + 20);
|
||||
@@ -195,20 +198,20 @@ class Workflow extends EventEmitter {
|
||||
}
|
||||
remove_all() {
|
||||
var wf = this;
|
||||
$.each(this.nodes, (k, v) => {
|
||||
v.destroy();
|
||||
wf.remove_node(v);
|
||||
Object.values(this.nodes).forEach((node) => {
|
||||
node.destroy();
|
||||
wf.remove_node(node);
|
||||
});
|
||||
}
|
||||
rectify_workflow_outputs() {
|
||||
// Find out if we're using workflow_outputs or not.
|
||||
var using_workflow_outputs = false;
|
||||
var has_existing_pjas = false;
|
||||
$.each(this.nodes, (k, node) => {
|
||||
Object.values(this.nodes).forEach((node) => {
|
||||
if (node.type === "tool" && node.workflow_outputs && node.workflow_outputs.length > 0) {
|
||||
using_workflow_outputs = true;
|
||||
}
|
||||
$.each(node.post_job_actions, (pja_id, pja) => {
|
||||
Object.values(node.post_job_actions).forEach((pja) => {
|
||||
if (pja.action_type === "HideDatasetAction") {
|
||||
has_existing_pjas = true;
|
||||
}
|
||||
@@ -216,26 +219,26 @@ class Workflow extends EventEmitter {
|
||||
});
|
||||
if (using_workflow_outputs !== false || has_existing_pjas !== false) {
|
||||
// Using workflow outputs, or has existing pjas. Remove all PJAs and recreate based on outputs.
|
||||
$.each(this.nodes, (k, node) => {
|
||||
Object.values(this.nodes).forEach((node) => {
|
||||
var node_changed = false;
|
||||
if (node.post_job_actions === null) {
|
||||
node.post_job_actions = {};
|
||||
node_changed = true;
|
||||
}
|
||||
var pjas_to_rem = [];
|
||||
$.each(node.post_job_actions, (pja_id, pja) => {
|
||||
Object.entries(node.post_job_actions).forEach(([pja_id, pja]) => {
|
||||
if (pja.action_type == "HideDatasetAction") {
|
||||
pjas_to_rem.push(pja_id);
|
||||
}
|
||||
});
|
||||
if (pjas_to_rem.length > 0) {
|
||||
$.each(pjas_to_rem, (i, pja_name) => {
|
||||
pjas_to_rem.forEach((pja_name) => {
|
||||
node_changed = true;
|
||||
delete node.post_job_actions[pja_name];
|
||||
});
|
||||
}
|
||||
if (using_workflow_outputs) {
|
||||
$.each(node.output_terminals, (ot_id, ot) => {
|
||||
Object.values(node.output_terminals).forEach((ot) => {
|
||||
var create_pja = !node.isWorkflowOutput(ot.name);
|
||||
if (create_pja === true) {
|
||||
node_changed = true;
|
||||
@@ -258,14 +261,14 @@ class Workflow extends EventEmitter {
|
||||
}
|
||||
to_simple() {
|
||||
var nodes = {};
|
||||
$.each(this.nodes, (i, node) => {
|
||||
Object.values(this.nodes).forEach((node) => {
|
||||
var input_connections = {};
|
||||
$.each(node.input_terminals, (k, t) => {
|
||||
Object.values(node.input_terminals).forEach((t) => {
|
||||
input_connections[t.name] = null;
|
||||
// There should only be 0 or 1 connectors, so this is
|
||||
// really a sneaky if statement
|
||||
var cons = [];
|
||||
$.each(t.connectors, (i, c) => {
|
||||
t.connectors.forEach((c, i) => {
|
||||
if (c.handle1) {
|
||||
var con_dict = {
|
||||
id: c.handle1.node.id,
|
||||
@@ -282,8 +285,8 @@ class Workflow extends EventEmitter {
|
||||
});
|
||||
var post_job_actions = {};
|
||||
if (node.post_job_actions) {
|
||||
$.each(node.post_job_actions, (i, act) => {
|
||||
var pja = {
|
||||
Object.values(node.post_job_actions).forEach((act) => {
|
||||
const pja = {
|
||||
action_type: act.action_type,
|
||||
output_name: act.output_name,
|
||||
action_arguments: act.action_arguments,
|
||||
@@ -316,8 +319,7 @@ class Workflow extends EventEmitter {
|
||||
const report = this.report;
|
||||
return { steps: nodes, report: report };
|
||||
}
|
||||
from_simple(data, initialImport_) {
|
||||
var initialImport = initialImport_ === undefined ? true : initialImport_;
|
||||
from_simple(data, initialImport = true) {
|
||||
var wf = this;
|
||||
var offset = 0;
|
||||
if (initialImport) {
|
||||
@@ -330,13 +332,13 @@ class Workflow extends EventEmitter {
|
||||
var using_workflow_outputs = false;
|
||||
wf.workflow_version = data.version;
|
||||
wf.report = data.report || {};
|
||||
$.each(data.steps, (id, step) => {
|
||||
Object.entries(data.steps).forEach(([id, step]) => {
|
||||
var node = wf.prebuildNode(step.type, step.name, step.content_id);
|
||||
// If workflow being copied into another, wipe UUID and let
|
||||
// Galaxy assign new ones.
|
||||
if (!initialImport) {
|
||||
step.uuid = null;
|
||||
$.each(step.workflow_outputs, (name, workflow_output) => {
|
||||
step.workflow_outputs.forEach((workflow_output) => {
|
||||
workflow_output.uuid = null;
|
||||
});
|
||||
}
|
||||
@@ -358,7 +360,7 @@ class Workflow extends EventEmitter {
|
||||
if (node.workflow_outputs.length > 0) {
|
||||
using_workflow_outputs = true;
|
||||
} else {
|
||||
$.each(node.post_job_actions || [], (pja_id, pja) => {
|
||||
Object.values(node.post_job_actions).forEach((pja) => {
|
||||
if (pja.action_type === "HideDatasetAction") {
|
||||
using_workflow_outputs = true;
|
||||
}
|
||||
@@ -368,14 +370,14 @@ class Workflow extends EventEmitter {
|
||||
});
|
||||
wf.id_counter = max_id + 1;
|
||||
// Second pass, connections
|
||||
$.each(data.steps, (id, step) => {
|
||||
Object.entries(data.steps).forEach(([id, step]) => {
|
||||
const node = wf.nodes[parseInt(id) + offset];
|
||||
$.each(step.input_connections, (k, v) => {
|
||||
Object.entries(step.input_connections).forEach(([k, v]) => {
|
||||
if (v) {
|
||||
if (!$.isArray(v)) {
|
||||
if (!Array.isArray(v)) {
|
||||
v = [v];
|
||||
}
|
||||
$.each(v, (l, x) => {
|
||||
v.forEach((x) => {
|
||||
const other_node = wf.nodes[parseInt(x.id) + offset];
|
||||
const c = new Connector(this.canvas_manager);
|
||||
c.connect(other_node.output_terminals[x.output_name], node.input_terminals[k]);
|
||||
@@ -385,7 +387,7 @@ class Workflow extends EventEmitter {
|
||||
});
|
||||
if (using_workflow_outputs) {
|
||||
// Ensure that every output terminal has a WorkflowOutput or HideDatasetAction.
|
||||
$.each(node.output_terminals, (ot_id, ot) => {
|
||||
Object.values(node.output_terminals).forEach((ot) => {
|
||||
if (node.post_job_actions[`HideDatasetAction${ot.name}`] === undefined) {
|
||||
node.addWorkflowOutput(ot.name);
|
||||
node.markWorkflowOutput(ot.name);
|
||||
@@ -451,7 +453,7 @@ class Workflow extends EventEmitter {
|
||||
var n_pred = {};
|
||||
var successors = {};
|
||||
// First pass to initialize arrays even for nodes with no connections
|
||||
$.each(this.nodes, (id, node) => {
|
||||
Object.keys(this.nodes).forEach((id) => {
|
||||
if (n_pred[id] === undefined) {
|
||||
n_pred[id] = 0;
|
||||
}
|
||||
@@ -460,9 +462,9 @@ class Workflow extends EventEmitter {
|
||||
}
|
||||
});
|
||||
// Second pass to count predecessors and successors
|
||||
$.each(this.nodes, (id, node) => {
|
||||
$.each(node.input_terminals, (j, t) => {
|
||||
$.each(t.connectors, (k, c) => {
|
||||
Object.values(this.nodes).forEach((node) => {
|
||||
Object.values(node.input_terminals).forEach((t) => {
|
||||
t.connectors.forEach((c) => {
|
||||
// A connection exists from `other` to `node`
|
||||
var other = c.handle1.node;
|
||||
// node gains a predecessor
|
||||
@@ -505,14 +507,14 @@ class Workflow extends EventEmitter {
|
||||
var h_pad = 80;
|
||||
var v_pad = 30;
|
||||
var left = h_pad;
|
||||
$.each(node_ids_by_level, (i, ids) => {
|
||||
node_ids_by_level.forEach((ids) => {
|
||||
// We keep nodes in the same order in a level to give the user
|
||||
// some control over ordering
|
||||
ids.sort((a, b) => $(all_nodes[a].element).position().top - $(all_nodes[b].element).position().top);
|
||||
// Position each node
|
||||
var max_width = 0;
|
||||
var top = v_pad;
|
||||
$.each(ids, (j, id) => {
|
||||
ids.forEach((id) => {
|
||||
var node = all_nodes[id];
|
||||
var element = $(node.element);
|
||||
$(element).css({ top: top, left: left });
|
||||
@@ -522,7 +524,7 @@ class Workflow extends EventEmitter {
|
||||
left += max_width + h_pad;
|
||||
});
|
||||
// Need to redraw all connectors
|
||||
$.each(all_nodes, (_, node) => {
|
||||
Object.values(all_nodes).forEach((node) => {
|
||||
node.redraw();
|
||||
});
|
||||
}
|
||||
@@ -532,7 +534,7 @@ class Workflow extends EventEmitter {
|
||||
var ymin = Infinity;
|
||||
var ymax = -Infinity;
|
||||
var p;
|
||||
$.each(this.nodes, (id, node) => {
|
||||
Object.values(this.nodes).forEach((node) => {
|
||||
var e = $(node.element);
|
||||
p = e.position();
|
||||
xmin = Math.min(xmin, p.left);
|
||||
|
||||
@@ -274,7 +274,7 @@ export class Node {
|
||||
x.destroy(); // Removes the noodle connectors
|
||||
}
|
||||
});
|
||||
nodeView.outputViews[unused_output].remove(); // removes the rendered output
|
||||
nodeView.outputViews[unused_output].$el.remove(); // removes the rendered output
|
||||
delete nodeView.outputViews[unused_output]; // removes the reference to the output
|
||||
delete node.output_terminals[unused_output]; // removes the output terminal
|
||||
});
|
||||
|
||||
@@ -9,6 +9,7 @@ import createCache from "vuex-cache";
|
||||
import { gridSearchStore } from "./gridSearchStore";
|
||||
import { tagStore } from "./tagStore";
|
||||
import { jobMetricsStore } from "./jobMetricsStore";
|
||||
import { jobDestinationParametersStore } from "./jobDestinationParametersStore";
|
||||
import { invocationStore } from "./invocationStore";
|
||||
import { historyStore } from "./historyStore";
|
||||
import { userStore } from "./userStore";
|
||||
@@ -31,6 +32,7 @@ export function createStore() {
|
||||
histories: historyStore,
|
||||
tags: tagStore,
|
||||
jobMetrics: jobMetricsStore,
|
||||
destinationParameters: jobDestinationParametersStore,
|
||||
invocations: invocationStore,
|
||||
user: userStore,
|
||||
config: configStore,
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
export const state = {
|
||||
jobDestinationParametersByJobId: {},
|
||||
};
|
||||
|
||||
import Vue from "vue";
|
||||
import { getAppRoot } from "onload/loadConfig";
|
||||
import axios from "axios";
|
||||
|
||||
const getters = {
|
||||
jobDestinationParams: (state) => (jobId) => {
|
||||
return state.jobDestinationParametersByJobId[jobId] || [];
|
||||
},
|
||||
};
|
||||
|
||||
const actions = {
|
||||
fetchJobDestinationParams: async ({ commit }, jobId) => {
|
||||
const { data } = await axios.get(`${getAppRoot()}api/jobs/${jobId}/destination_params`);
|
||||
commit("saveJobDestinationParamsForJobId", { jobId, jobDestinationParams: data });
|
||||
},
|
||||
};
|
||||
|
||||
const mutations = {
|
||||
saveJobDestinationParamsForJobId: (state, { jobId, jobDestinationParams }) => {
|
||||
Vue.set(state.jobDestinationParametersByJobId, jobId, jobDestinationParams);
|
||||
},
|
||||
};
|
||||
|
||||
export const jobDestinationParametersStore = {
|
||||
state,
|
||||
getters,
|
||||
actions,
|
||||
mutations,
|
||||
};
|
||||
@@ -9,5 +9,6 @@ export function errorMessageAsString(e) {
|
||||
}
|
||||
|
||||
export function rethrowSimple(e) {
|
||||
console.debug(e);
|
||||
throw errorMessageAsString(e);
|
||||
}
|
||||
|
||||
@@ -1656,31 +1656,29 @@ body.reports {
|
||||
.node {
|
||||
cursor: pointer;
|
||||
circle {
|
||||
fill: lighten($brand-primary, 20%);
|
||||
stroke: lighten($brand-primary, 20%);
|
||||
stroke-width: 0.1rem;
|
||||
fill: $brand-primary;
|
||||
stroke: $brand-primary;
|
||||
}
|
||||
text {
|
||||
font: 0.4rem sans-serif;
|
||||
font-size: 0.4rem;
|
||||
}
|
||||
}
|
||||
|
||||
.node-enter {
|
||||
fill-opacity: 1e-6;
|
||||
}
|
||||
|
||||
.node-update {
|
||||
fill-opacity: 1;
|
||||
}
|
||||
|
||||
.tree-size {
|
||||
width: 100%;
|
||||
height: 50%;
|
||||
}
|
||||
|
||||
.link {
|
||||
fill: none;
|
||||
stroke: lighten($brand-primary, 20%);
|
||||
stroke-width: 0.2rem;
|
||||
stroke: $brand-primary;
|
||||
stroke-width: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.workflow-recommendations {
|
||||
display: block;
|
||||
.header-background {
|
||||
border-bottom: solid 1px $brand-primary;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-grow: 1;
|
||||
.workflow-recommendations {
|
||||
height: 30rem;
|
||||
}
|
||||
.workflow-node {
|
||||
@extend .card;
|
||||
@extend .position-absolute;
|
||||
|
||||
+1
-1
@@ -21,7 +21,7 @@ const paths = {
|
||||
// "../config/plugins/{visualizations,interactive_environments}/*/*/package.json"
|
||||
//],
|
||||
plugin_build_dirs: [
|
||||
"../config/plugins/visualizations/{annotate_image,hyphyvision,openlayers}/package.json",
|
||||
"../config/plugins/visualizations/{annotate_image,hyphyvision,openlayers,editor}/package.json",
|
||||
],
|
||||
lib_locs: {
|
||||
// This is a stepping stone towards having all this staged
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE visualization SYSTEM "../../visualization.dtd">
|
||||
<visualization name="Editor">
|
||||
<description>Manually edit text</description>
|
||||
<data_sources>
|
||||
<data_source>
|
||||
<model_class>HistoryDatasetAssociation</model_class>
|
||||
<test type="isinstance" test_attr="datatype" result_type="datatype">data.Data</test>
|
||||
<to_param param_attr="id">dataset_id</to_param>
|
||||
</data_source>
|
||||
</data_sources>
|
||||
<params>
|
||||
<param type="dataset" var_name_in_template="hda" required="true">dataset_id</param>
|
||||
</params>
|
||||
<entry_point entry_point_type="mako">editor.mako</entry_point>
|
||||
</visualization>
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"devDependencies": {
|
||||
"css-loader": "^3.4.2",
|
||||
"file-loader": "^5.0.2",
|
||||
"mini-css-extract-plugin": "^0.9.0",
|
||||
"style-loader": "^1.1.3",
|
||||
"webpack": "^4.41.6",
|
||||
"webpack-cli": "^3.3.11",
|
||||
"extract-text-webpack-plugin": "^3.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"ace-builds": "^1.4.8"
|
||||
},
|
||||
"name": "galaxy-vis-editor",
|
||||
"version": "1.1.0",
|
||||
"main": "index.js",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"build": "webpack --mode production"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
import './styles/style.css';
|
||||
import "ace-builds/src-noconflict/ace";
|
||||
import "ace-builds/src-noconflict/mode-powershell";
|
||||
import "ace-builds/src-noconflict/theme-textmate";
|
||||
@@ -0,0 +1,41 @@
|
||||
#editor {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
#export-btn {
|
||||
position: relative;
|
||||
z-index: 3;
|
||||
left: 90%;
|
||||
}
|
||||
|
||||
.transparent_btn {
|
||||
display: inline-block;
|
||||
padding: 10px 14px;
|
||||
color: #FFF;
|
||||
border: 1px solid #FFF;
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
line-height: 120%;
|
||||
background-color: rgba(255, 255, 255, 0);
|
||||
-webkit-border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
-webkit-transition: 300ms ease;
|
||||
-moz-transition: 300ms ease;
|
||||
transition: 300ms ease;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.transparent_btn.blue {
|
||||
color: #aeddf5;
|
||||
border-color: #aeddf5;
|
||||
}
|
||||
|
||||
.transparent_btn.blue:hover {
|
||||
color: #0062ff;
|
||||
background-color: rgba(174, 221, 245, 0.3);
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
<%
|
||||
default_title = "JS Editor"
|
||||
|
||||
# Use root for resource loading.
|
||||
root = h.url_for( '/static/' )
|
||||
app_root = root + "plugins/visualizations/editor/static/"
|
||||
%>
|
||||
## ----------------------------------------------------------------------------
|
||||
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||
<title> ${visualization_name}</title>
|
||||
${h.javascript_link( app_root + "script.js" )}
|
||||
${h.stylesheet_link( app_root + "main.css" )}
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="editor">
|
||||
</div>
|
||||
<button onclick="exportData()" class="transparent_btn blue" id="export-btn">export</button>
|
||||
<script>
|
||||
function httpGet(theUrl) {
|
||||
var xmlHttp = new XMLHttpRequest();
|
||||
xmlHttp.open("GET", theUrl, false);
|
||||
xmlHttp.send(null);
|
||||
return xmlHttp.responseText;
|
||||
}
|
||||
|
||||
function exportData() {
|
||||
## Prepare data for export
|
||||
const upload_data = {
|
||||
tool_id: "upload1",
|
||||
history_id: "${trans.security.encode_id(hda.history_id)}",
|
||||
inputs: {
|
||||
"file_count": 1,
|
||||
"file_type": "auto",
|
||||
"files_0|file_type": "auto",
|
||||
"files_0|url_paste": editor.getValue(),
|
||||
"files_0|NAME": "${ hda.name } (modified)"
|
||||
}
|
||||
};
|
||||
## upload data
|
||||
const request = new XMLHttpRequest();
|
||||
request.open("POST", "/api/tools");
|
||||
request.setRequestHeader("Content-Type", "application/json");
|
||||
request.send(JSON.stringify(upload_data));
|
||||
request.onreadystatechange = function () {
|
||||
if (request.readyState === XMLHttpRequest.DONE) {
|
||||
var status = request.status;
|
||||
if (status === 0 || (200 >= status && status < 400)) {
|
||||
top.location = "/"
|
||||
} else {
|
||||
alert("something went wrong, please contact us!");
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
const hda_id = '${ trans.security.encode_id( hda.id ) }';
|
||||
|
||||
const ajax_url = "${h.url_for( controller='/datasets', action='index')}/" + hda_id + "/display";
|
||||
const data = httpGet(ajax_url);
|
||||
document.getElementById("editor").innerHTML = data;
|
||||
var editor = ace.edit("editor", {
|
||||
mode: "ace/mode/powershell",
|
||||
theme: "ace/theme/textmate"
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,39 @@
|
||||
const webpack = require("webpack");
|
||||
const path = require("path");
|
||||
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
||||
|
||||
module.exports = {
|
||||
mode: 'production',
|
||||
entry: path.resolve(__dirname, "src/index.js"),
|
||||
output: {
|
||||
filename: "script.js",
|
||||
path: path.resolve(__dirname, "static")
|
||||
},
|
||||
plugins: [
|
||||
new MiniCssExtractPlugin(),
|
||||
],
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.css$/i,
|
||||
use: [MiniCssExtractPlugin.loader, 'css-loader'],
|
||||
},
|
||||
{
|
||||
test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/,
|
||||
loader: "url-loader",
|
||||
options: {limit: 10000, mimetype: "application/font-woff"}
|
||||
},
|
||||
{
|
||||
test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
|
||||
loader: "url-loader",
|
||||
options: {limit: 10000, mimetype: "application/octet-stream"}
|
||||
},
|
||||
{test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loaders: "file-loader"},
|
||||
{
|
||||
test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
|
||||
loaders: "url-loader",
|
||||
options: {limit: 10000, mimetype: "image/svg+xml"}
|
||||
}
|
||||
]
|
||||
},
|
||||
};
|
||||
@@ -1376,6 +1376,27 @@
|
||||
:Type: bool
|
||||
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
``interactivetools_proxy_host``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
:Description:
|
||||
Proxy host - assumed to just be hosted on the same hostname and
|
||||
port as Galaxy by default.
|
||||
:Default: ``None``
|
||||
:Type: str
|
||||
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
``interactivetools_map``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
:Description:
|
||||
Map for interactivetool proxy.
|
||||
:Default: ``interactivetools_map.sqlite``
|
||||
:Type: str
|
||||
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
``visualizations_visible``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -116,9 +116,9 @@ class PSAAuthnz(IdentityProvider):
|
||||
|
||||
# Secondary AuthZ with Google identities is currently supported
|
||||
if provider != "google":
|
||||
if "SOCIAL_AUTH_SECONDARY_AUTH_PROVIDER" in self.config:
|
||||
if 'SOCIAL_AUTH_SECONDARY_AUTH_PROVIDER' in self.config:
|
||||
del self.config["SOCIAL_AUTH_SECONDARY_AUTH_PROVIDER"]
|
||||
if "SOCIAL_AUTH_SECONDARY_AUTH_ENDPOINT" in self.config:
|
||||
if 'SOCIAL_AUTH_SECONDARY_AUTH_ENDPOINT' in self.config:
|
||||
del self.config["SOCIAL_AUTH_SECONDARY_AUTH_ENDPOINT"]
|
||||
|
||||
def _setup_idp(self, oidc_backend_config):
|
||||
|
||||
+89
-100
@@ -118,6 +118,10 @@ class BaseAppConfiguration(object):
|
||||
self._create_attributes_from_raw_config() # Create attributes based on raw_config
|
||||
self._resolve_paths() # Overwrite attribute values with resolved paths
|
||||
|
||||
def resolve_path(self, path):
|
||||
"""Resolve a path relative to Galaxy's root."""
|
||||
return self._in_root_dir(path)
|
||||
|
||||
def _set_config_base(self, config_kwargs):
|
||||
|
||||
def _set_global_conf():
|
||||
@@ -245,17 +249,23 @@ class BaseAppConfiguration(object):
|
||||
for key in self.schema.paths_to_resolve:
|
||||
resolve(key)
|
||||
|
||||
def _in_root_dir(self, path):
|
||||
return self._in_dir(self.root, path)
|
||||
|
||||
def _in_managed_config_dir(self, path):
|
||||
return os.path.join(self.managed_config_dir, path)
|
||||
return self._in_dir(self.managed_config_dir, path)
|
||||
|
||||
def _in_config_dir(self, path):
|
||||
return os.path.join(self.config_dir, path)
|
||||
return self._in_dir(self.config_dir, path)
|
||||
|
||||
def _in_sample_dir(self, path):
|
||||
return os.path.join(self.sample_config_dir, path)
|
||||
return self._in_dir(self.sample_config_dir, path)
|
||||
|
||||
def _in_data_dir(self, path):
|
||||
return os.path.join(self.data_dir, path)
|
||||
return self._in_dir(self.data_dir, path)
|
||||
|
||||
def _in_dir(self, _dir, path):
|
||||
return os.path.join(_dir, path) if path else None
|
||||
|
||||
def _parse_config_file_options(self, defaults, listify_defaults, config_kwargs):
|
||||
for var, values in defaults.items():
|
||||
@@ -291,7 +301,47 @@ class BaseAppConfiguration(object):
|
||||
setattr(self, var, [os.path.join(self.root, x) for x in paths])
|
||||
|
||||
|
||||
class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
class CommonConfigurationMixin(object):
|
||||
"""Shared configuration settings code for Galaxy and ToolShed."""
|
||||
|
||||
@property
|
||||
def admin_users(self):
|
||||
return self._admin_users
|
||||
|
||||
@admin_users.setter
|
||||
def admin_users(self, value):
|
||||
self._admin_users = value
|
||||
if value:
|
||||
self.admin_users_list = [u.strip() for u in value.split(',') if u]
|
||||
else: # provide empty list for convenience (check membership, etc.)
|
||||
self.admin_users_list = []
|
||||
|
||||
def is_admin_user(self, user):
|
||||
"""Determine if the provided user is listed in `admin_users`."""
|
||||
return user is not None and user.email in self.admin_users_list
|
||||
|
||||
@property
|
||||
def sentry_dsn_public(self):
|
||||
"""
|
||||
Sentry URL with private key removed for use in client side scripts,
|
||||
sentry server will need to be configured to accept events
|
||||
"""
|
||||
if self.sentry_dsn:
|
||||
return re.sub(r"^([^:/?#]+:)?//(\w+):(\w+)", r"\1//\2", self.sentry_dsn)
|
||||
|
||||
def get_bool(self, key, default):
|
||||
# Warning: the value of self.config_dict['foo'] may be different from self.foo
|
||||
if key in self.config_dict:
|
||||
return string_as_bool(self.config_dict[key])
|
||||
else:
|
||||
return default
|
||||
|
||||
def get(self, key, default=None):
|
||||
# Warning: the value of self.config_dict['foo'] may be different from self.foo
|
||||
return self.config_dict.get(key, default)
|
||||
|
||||
|
||||
class GalaxyAppConfiguration(BaseAppConfiguration, CommonConfigurationMixin):
|
||||
deprecated_options = ('database_file', 'track_jobs_in_database')
|
||||
default_config_file_name = 'galaxy.yml'
|
||||
deprecated_dirs = {'config_dir': 'config', 'data_dir': 'database'}
|
||||
@@ -317,12 +367,11 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
# Database related configuration
|
||||
self.check_migrate_databases = kwargs.get('check_migrate_databases', True)
|
||||
if not self.database_connection: # Provide default if not supplied by user
|
||||
db_path = os.path.join(self.data_dir, 'universe.sqlite')
|
||||
db_path = self._in_data_dir('universe.sqlite')
|
||||
self.database_connection = 'sqlite:///%s?isolation_level=IMMEDIATE' % db_path
|
||||
self.database_engine_options = get_database_engine_options(kwargs)
|
||||
self.database_create_tables = string_as_bool(kwargs.get('database_create_tables', 'True'))
|
||||
self.database_encoding = kwargs.get('database_encoding') # Create new databases with this encoding
|
||||
self.database_log_query_counts = string_as_bool(kwargs.get("database_log_query_counts", 'False'))
|
||||
self.thread_local_log = None
|
||||
if self.enable_per_request_sql_debugging:
|
||||
self.thread_local_log = threading.local()
|
||||
@@ -334,10 +383,10 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
tempfile.tempdir = self.new_file_path
|
||||
self.shared_home_dir = kwargs.get("shared_home_dir")
|
||||
self.cookie_path = kwargs.get("cookie_path")
|
||||
self.tool_path = os.path.join(self.root, self.tool_path)
|
||||
self.tool_data_path = os.path.join(self.root, self.tool_data_path)
|
||||
self.tool_path = self._in_root_dir(self.tool_path)
|
||||
self.tool_data_path = self._in_root_dir(self.tool_data_path)
|
||||
if not running_from_source and kwargs.get("tool_data_path") is None:
|
||||
self.tool_data_path = os.path.join(self.data_dir, "tool-data")
|
||||
self.tool_data_path = self._in_data_dir(self.schema.defaults['tool_data_path'])
|
||||
self.builds_file_path = os.path.join(self.tool_data_path, self.builds_file_path)
|
||||
self.len_file_path = os.path.join(self.tool_data_path, self.len_file_path)
|
||||
# Galaxy OIDC settings.
|
||||
@@ -347,7 +396,7 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
self.integrated_tool_panel_config = self._in_managed_config_dir(self.integrated_tool_panel_config)
|
||||
integrated_tool_panel_tracking_directory = kwargs.get('integrated_tool_panel_tracking_directory')
|
||||
if integrated_tool_panel_tracking_directory:
|
||||
self.integrated_tool_panel_tracking_directory = os.path.join(self.root, integrated_tool_panel_tracking_directory)
|
||||
self.integrated_tool_panel_tracking_directory = self._in_root_dir(integrated_tool_panel_tracking_directory)
|
||||
else:
|
||||
self.integrated_tool_panel_tracking_directory = None
|
||||
self.toolbox_filter_base_modules = listify(self.toolbox_filter_base_modules)
|
||||
@@ -363,7 +412,7 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
self.password_expiration_period = timedelta(days=int(self.password_expiration_period))
|
||||
|
||||
if self.shed_tool_data_path:
|
||||
self.shed_tool_data_path = os.path.join(self.root, self.shed_tool_data_path)
|
||||
self.shed_tool_data_path = self._in_root_dir(self.shed_tool_data_path)
|
||||
else:
|
||||
self.shed_tool_data_path = self.tool_data_path
|
||||
|
||||
@@ -398,21 +447,21 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
for ip in kwargs.get("fetch_url_whitelist", "").split(',')
|
||||
if len(ip.strip()) > 0
|
||||
]
|
||||
self.template_path = os.path.join(self.root, kwargs.get("template_path", "templates"))
|
||||
self.template_path = self._in_root_dir(kwargs.get("template_path", "templates"))
|
||||
self.job_queue_cleanup_interval = int(kwargs.get("job_queue_cleanup_interval", "5"))
|
||||
self.cluster_files_directory = self.resolve_path(self.cluster_files_directory)
|
||||
self.cluster_files_directory = self._in_root_dir(self.cluster_files_directory)
|
||||
|
||||
# Fall back to legacy job_working_directory config variable if set.
|
||||
self.jobs_directory = os.path.join(self.data_dir, kwargs.get("jobs_directory", self.job_working_directory))
|
||||
self.jobs_directory = self._in_data_dir(kwargs.get("jobs_directory", self.job_working_directory))
|
||||
if self.preserve_python_environment not in ["legacy_only", "legacy_and_local", "always"]:
|
||||
log.warning("preserve_python_environment set to unknown value [%s], defaulting to legacy_only")
|
||||
self.preserve_python_environment = "legacy_only"
|
||||
self.nodejs_path = kwargs.get("nodejs_path")
|
||||
# Older default container cache path, I don't think anyone is using it anymore and it wasn't documented - we
|
||||
# should probably drop the backward compatiblity to save the path check.
|
||||
self.container_image_cache_path = os.path.join(self.data_dir, kwargs.get("container_image_cache_path", "container_images"))
|
||||
self.container_image_cache_path = self._in_data_dir(kwargs.get("container_image_cache_path", "container_images"))
|
||||
if not os.path.exists(self.container_image_cache_path):
|
||||
self.container_image_cache_path = self.resolve_path(kwargs.get("container_image_cache_path", os.path.join(self.data_dir, "container_cache")))
|
||||
self.container_image_cache_path = self._in_root_dir(kwargs.get("container_image_cache_path", self._in_data_dir("container_cache")))
|
||||
self.output_size_limit = int(kwargs.get('output_size_limit', 0))
|
||||
# activation_email was used until release_15.03
|
||||
activation_email = kwargs.get('activation_email')
|
||||
@@ -421,7 +470,7 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
# Get the disposable email domains blacklist file and its contents
|
||||
self.blacklist_content = None
|
||||
if self.blacklist_file:
|
||||
self.blacklist_file = os.path.join(self.root, self.blacklist_file)
|
||||
self.blacklist_file = self._in_root_dir(self.blacklist_file)
|
||||
try:
|
||||
with open(self.blacklist_file) as f:
|
||||
self.blacklist_content = [line.rstrip() for line in f]
|
||||
@@ -449,7 +498,7 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
workflow_resource_params_mapper = None
|
||||
elif ":" not in workflow_resource_params_mapper:
|
||||
# Assume it is not a Python function, so a file
|
||||
workflow_resource_params_mapper = self.resolve_path(workflow_resource_params_mapper)
|
||||
workflow_resource_params_mapper = self._in_root_dir(workflow_resource_params_mapper)
|
||||
# else: a Python a function!
|
||||
self.workflow_resource_params_mapper = workflow_resource_params_mapper
|
||||
|
||||
@@ -460,7 +509,7 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
|
||||
_sanitize_whitelist_path = self._in_managed_config_dir(self.sanitize_whitelist_file)
|
||||
if not os.path.isfile(_sanitize_whitelist_path): # then check old default location
|
||||
deprecated = os.path.join(self.root, 'config/sanitize_whitelist.txt')
|
||||
deprecated = self._in_root_dir('config/sanitize_whitelist.txt')
|
||||
if os.path.isfile(deprecated):
|
||||
log.warning("The path '%s' for the 'sanitize_whitelist_file' config option is "
|
||||
"deprecated and will be no longer checked in a future release. Please consult "
|
||||
@@ -488,29 +537,26 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
# not needed on production systems but useful if running many functional tests.
|
||||
self.index_tool_help = string_as_bool(kwargs.get("index_tool_help", True))
|
||||
self.tool_labels_boost = kwargs.get("tool_labels_boost", 1)
|
||||
default_tool_test_data_directories = os.environ.get("GALAXY_TEST_FILE_DIR", os.path.join(self.root, "test-data"))
|
||||
default_tool_test_data_directories = os.environ.get("GALAXY_TEST_FILE_DIR", self._in_root_dir("test-data"))
|
||||
self.tool_test_data_directories = kwargs.get("tool_test_data_directories", default_tool_test_data_directories)
|
||||
# Deployers may either specify a complete list of mapping files or get the default for free and just
|
||||
# specify a local mapping file to adapt and extend the default one.
|
||||
if "conda_mapping_files" not in kwargs:
|
||||
conda_mapping_files = [
|
||||
self.local_conda_mapping_file,
|
||||
os.path.join(self.root, "lib", "galaxy", "tool_util", "deps", "resolvers", "default_conda_mapping.yml"),
|
||||
]
|
||||
_default_mapping = self._in_root_dir(os.path.join("lib", "galaxy", "tool_util", "deps", "resolvers", "default_conda_mapping.yml"))
|
||||
# dependency resolution options are consumed via config_dict - so don't populate
|
||||
# self, populate config_dict
|
||||
self.config_dict["conda_mapping_files"] = conda_mapping_files
|
||||
self.config_dict["conda_mapping_files"] = [self.local_conda_mapping_file, _default_mapping]
|
||||
|
||||
if self.containers_resolvers_config_file:
|
||||
self.containers_resolvers_config_file = os.path.join(self.config_dir, self.containers_resolvers_config_file)
|
||||
self.containers_resolvers_config_file = self._in_config_dir(self.containers_resolvers_config_file)
|
||||
|
||||
# tool_dependency_dir can be "none" (in old configs). If so, set it to None
|
||||
if self.tool_dependency_dir and self.tool_dependency_dir.lower() == 'none':
|
||||
self.tool_dependency_dir = None
|
||||
if self.involucro_path is None:
|
||||
target_dir = self.tool_dependency_dir or self.schema.defaults['tool_dependency_dir']
|
||||
self.involucro_path = os.path.join(self.data_dir, target_dir, "involucro")
|
||||
self.involucro_path = os.path.join(self.root, self.involucro_path)
|
||||
self.involucro_path = self._in_data_dir(os.path.join(target_dir, "involucro"))
|
||||
self.involucro_path = self._in_root_dir(self.involucro_path)
|
||||
if self.mulled_channels:
|
||||
self.mulled_channels = [c.strip() for c in self.mulled_channels.split(',')]
|
||||
|
||||
@@ -524,18 +570,12 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
self.nginx_upload_store = os.path.abspath(self.nginx_upload_store)
|
||||
self.object_store = kwargs.get('object_store', 'disk')
|
||||
self.object_store_check_old_style = string_as_bool(kwargs.get('object_store_check_old_style', False))
|
||||
self.object_store_cache_path = self.resolve_path(kwargs.get("object_store_cache_path", os.path.join(self.data_dir, "object_store_cache")))
|
||||
object_store_store_by = kwargs.get('object_store_store_by', None)
|
||||
if object_store_store_by is None:
|
||||
if not self.file_path_set:
|
||||
if self.file_path.endswith('objects'):
|
||||
object_store_store_by = 'uuid'
|
||||
else:
|
||||
object_store_store_by = 'id'
|
||||
else:
|
||||
object_store_store_by = 'id'
|
||||
assert object_store_store_by in ['id', 'uuid'], "Invalid value for object_store_store_by [%s]" % object_store_store_by
|
||||
self.object_store_store_by = object_store_store_by
|
||||
self.object_store_cache_path = self._in_root_dir(kwargs.get("object_store_cache_path", self._in_data_dir("object_store_cache")))
|
||||
if self.object_store_store_by is None:
|
||||
self.object_store_store_by = 'id'
|
||||
if not self.file_path_set and self.file_path.endswith('objects'):
|
||||
self.object_store_store_by = 'uuid'
|
||||
assert self.object_store_store_by in ['id', 'uuid'], "Invalid value for object_store_store_by [%s]" % self.object_store_store_by
|
||||
# Handle AWS-specific config options for backward compatibility
|
||||
if kwargs.get('aws_access_key') is not None:
|
||||
self.os_access_key = kwargs.get('aws_access_key')
|
||||
@@ -554,7 +594,7 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
self.object_store_cache_size = float(kwargs.get('object_store_cache_size', -1))
|
||||
self.distributed_object_store_config_file = kwargs.get('distributed_object_store_config_file')
|
||||
if self.distributed_object_store_config_file is not None:
|
||||
self.distributed_object_store_config_file = os.path.join(self.root, self.distributed_object_store_config_file)
|
||||
self.distributed_object_store_config_file = self._in_root_dir(self.distributed_object_store_config_file)
|
||||
self.irods_root_collection_path = kwargs.get('irods_root_collection_path')
|
||||
self.irods_default_resource = kwargs.get('irods_default_resource')
|
||||
# Heartbeat log file name override
|
||||
@@ -600,7 +640,7 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
elif 'database_connection' in kwargs:
|
||||
self.amqp_internal_connection = "sqlalchemy+" + self.database_connection
|
||||
else:
|
||||
self.amqp_internal_connection = "sqlalchemy+sqlite:///%s?isolation_level=IMMEDIATE" % os.path.join(self.data_dir, "control.sqlite")
|
||||
self.amqp_internal_connection = "sqlalchemy+sqlite:///%s?isolation_level=IMMEDIATE" % self._in_data_dir("control.sqlite")
|
||||
self.pretty_datetime_format = expand_pretty_datetime_format(self.pretty_datetime_format)
|
||||
try:
|
||||
with open(self.user_preferences_extra_conf_path, 'r') as stream:
|
||||
@@ -617,7 +657,6 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
# This is for testing new library browsing capabilities.
|
||||
self.new_lib_browse = string_as_bool(kwargs.get('new_lib_browse', False))
|
||||
# Logging configuration with logging.config.configDict:
|
||||
self.logging = kwargs.get('logging')
|
||||
# Statistics and profiling with statsd
|
||||
self.statsd_host = kwargs.get('statsd_host', '')
|
||||
|
||||
@@ -630,8 +669,9 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
self.manage_dynamic_proxy = self.dynamic_proxy_manage # Set to false if being launched externally
|
||||
|
||||
# InteractiveTools propagator mapping file
|
||||
self.interactivetool_map = self.resolve_path(kwargs.get("interactivetools_map", os.path.join(self.data_dir, "interactivetools_map.sqlite")))
|
||||
self.interactivetools_map = self._in_root_dir(kwargs.get("interactivetools_map", self._in_data_dir("interactivetools_map.sqlite")))
|
||||
self.interactivetool_prefix = kwargs.get("interactivetools_prefix", "interactivetool")
|
||||
self.interactivetool_proxy_host = kwargs.get("interactivetool_proxy_host", None)
|
||||
|
||||
self.containers_conf = parse_containers_config(self.containers_config_file)
|
||||
|
||||
@@ -708,33 +748,8 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
'UWSGI_PORT': port
|
||||
})
|
||||
|
||||
@property
|
||||
def admin_users(self):
|
||||
return self._admin_users
|
||||
|
||||
@admin_users.setter
|
||||
def admin_users(self, value):
|
||||
self._admin_users = value
|
||||
if value:
|
||||
self.admin_users_list = [u.strip() for u in value.split(',') if u]
|
||||
else: # provide empty list for convenience (check membership, etc.)
|
||||
self.admin_users_list = []
|
||||
|
||||
@property
|
||||
def sentry_dsn_public(self):
|
||||
"""
|
||||
Sentry URL with private key removed for use in client side scripts,
|
||||
sentry server will need to be configured to accept events
|
||||
"""
|
||||
if self.sentry_dsn:
|
||||
return re.sub(r"^([^:/?#]+:)?//(\w+):(\w+)", r"\1//\2", self.sentry_dsn)
|
||||
else:
|
||||
return None
|
||||
|
||||
def parse_config_file_options(self, kwargs):
|
||||
"""
|
||||
Backwards compatibility for config files moved to the config/ dir.
|
||||
"""
|
||||
"""Backwards compatibility for config files moved to the config/ dir."""
|
||||
defaults = dict(
|
||||
auth_config_file=[self._in_config_dir('auth_conf.xml')],
|
||||
build_sites_config_file=[self._in_config_dir('build_sites.yml'), self._in_sample_dir('build_sites.yml.sample')],
|
||||
@@ -792,15 +807,6 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
if explicit:
|
||||
log.warning("Sanitize log file explicitly specified as '%s' but does not exist, continuing with no tools whitelisted.", self.sanitize_whitelist_file)
|
||||
|
||||
def get(self, key, default=None):
|
||||
return self.config_dict.get(key, default)
|
||||
|
||||
def get_bool(self, key, default):
|
||||
if key in self.config_dict:
|
||||
return string_as_bool(self.config_dict[key])
|
||||
else:
|
||||
return default
|
||||
|
||||
def ensure_tempdir(self):
|
||||
self._ensure_directory(self.new_file_path)
|
||||
|
||||
@@ -838,20 +844,6 @@ class GalaxyAppConfiguration(BaseAppConfiguration):
|
||||
if key in self.deprecated_options:
|
||||
log.warning("Config option '%s' is deprecated and will be removed in a future release. Please consult the latest version of the sample configuration file." % key)
|
||||
|
||||
def is_admin_user(self, user):
|
||||
"""
|
||||
Determine if the provided user is listed in `admin_users`.
|
||||
|
||||
NOTE: This is temporary, admin users will likely be specified in the
|
||||
database in the future.
|
||||
"""
|
||||
return user is not None and user.email in self.admin_users_list
|
||||
|
||||
def resolve_path(self, path):
|
||||
""" Resolve a path relative to Galaxy's root.
|
||||
"""
|
||||
return os.path.join(self.root, path)
|
||||
|
||||
@staticmethod
|
||||
def _parse_allowed_origin_hostnames(kwargs):
|
||||
"""
|
||||
@@ -877,7 +869,7 @@ Configuration = GalaxyAppConfiguration
|
||||
|
||||
|
||||
def reload_config_options(current_config):
|
||||
""" Reload modified reloadable config options """
|
||||
"""Reload modified reloadable config options."""
|
||||
modified_config = read_properties_from_file(current_config.config_file)
|
||||
for option in current_config.schema.reloadable_options:
|
||||
if option in modified_config:
|
||||
@@ -978,8 +970,7 @@ def configure_logging(config):
|
||||
|
||||
|
||||
class ConfiguresGalaxyMixin(object):
|
||||
""" Shared code for configuring Galaxy-like app objects.
|
||||
"""
|
||||
"""Shared code for configuring Galaxy-like app objects."""
|
||||
|
||||
def _configure_genome_builds(self, data_table_name="__dbkeys__", load_old_style=True):
|
||||
self.genome_builds = GenomeBuilds(self, data_table_name=data_table_name, load_old_style=load_old_style)
|
||||
@@ -1116,9 +1107,7 @@ class ConfiguresGalaxyMixin(object):
|
||||
self.tool_shed_registry = galaxy.tool_shed.tool_shed_registry.Registry()
|
||||
|
||||
def _configure_models(self, check_migrate_databases=False, check_migrate_tools=False, config_file=None):
|
||||
"""
|
||||
Preconditions: object_store must be set on self.
|
||||
"""
|
||||
"""Preconditions: object_store must be set on self."""
|
||||
db_url = get_database_url(self.config)
|
||||
install_db_url = self.config.install_database_connection
|
||||
# TODO: Consider more aggressive check here that this is not the same
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
<datatype extension="anvio_structure_db" type="galaxy.datatypes.anvio:AnvioStructureDB" display_in_upload="false" />
|
||||
<datatype extension="anvio_variability" type="galaxy.datatypes.tabular:TSV" display_in_upload="false" subclass="true" />
|
||||
<datatype extension="arff" type="galaxy.datatypes.text:Arff" mimetype="text/plain" display_in_upload="true"/>
|
||||
<datatype extension="paf" type="galaxy.datatypes.text:Paf" mimetype="text/plain" display_in_upload="true"/>
|
||||
<datatype extension="gfa1" type="galaxy.datatypes.text:Gfa1" mimetype="text/plain" display_in_upload="true"/>
|
||||
<datatype extension="asn1" type="galaxy.datatypes.data:GenericAsn1" mimetype="text/plain" display_in_upload="true"/>
|
||||
<datatype extension="asn1-binary" type="galaxy.datatypes.binary:GenericAsn1Binary" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="axt" type="galaxy.datatypes.sequence:Axt" display_in_upload="true" description="blastz pairwise alignment format. Each alignment block in an axt file contains three lines: a summary line and 2 sequence lines. Blocks are separated from one another by blank lines. The summary line contains chromosomal position and size information about the alignment. It consists of 9 required fields." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#Axt"/>
|
||||
@@ -228,19 +230,27 @@
|
||||
<datatype extension="directory" type="galaxy.datatypes.data:Directory">
|
||||
</datatype>
|
||||
<!-- Proteomics Datatypes -->
|
||||
<datatype extension="mrm" type="galaxy.datatypes.tabular:Tabular" display_in_upload="true" subclass="true"/>
|
||||
<datatype extension="dta" type="galaxy.datatypes.proteomics:Dta" display_in_upload="true" />
|
||||
<datatype extension="dta2d" type="galaxy.datatypes.proteomics:Dta2d" display_in_upload="true" />
|
||||
<datatype extension="edta" type="galaxy.datatypes.proteomics:Edta" display_in_upload="true" />
|
||||
<datatype extension="pepxml" type="galaxy.datatypes.proteomics:PepXml" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="raw_pepxml" type="galaxy.datatypes.proteomics:PepXml" mimetype="application/xml" subclass="true"/>
|
||||
<datatype extension="peptideprophet_pepxml" type="galaxy.datatypes.proteomics:PepXml" mimetype="application/xml" subclass="true"/>
|
||||
<datatype extension="interprophet_pepxml" type="galaxy.datatypes.proteomics:PepXml" mimetype="application/xml" subclass="true"/>
|
||||
<datatype extension="protxml" type="galaxy.datatypes.proteomics:ProtXML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="trafoxml" type="galaxy.datatypes.xml:GenericXml" mimetype="application/xml" subclass="true" display_in_upload="true" description="Transformation of retention times"/>
|
||||
<datatype extension="paramxml" type="galaxy.datatypes.proteomics:ParamXml" mimetype="application/xml" subclass="true" display_in_upload="true" />
|
||||
<datatype extension="qcml" type="galaxy.datatypes.xml:GenericXml" mimetype="application/xml" subclass="true" display_in_upload="true" description="Quality control data in XML format (https://code.google.com/p/qcml/)."/>
|
||||
<datatype extension="kroenik" type="galaxy.datatypes.proteomics:Kroenik" display_in_upload="true"/>
|
||||
<datatype extension="peplist" type="galaxy.datatypes.proteomics:PepList" display_in_upload="true"/>
|
||||
<datatype extension="psms" type="galaxy.datatypes.proteomics:PSMS" display_in_upload="true"/>
|
||||
<datatype extension="pepxml.tsv" type="galaxy.datatypes.proteomics:PepXmlReport" display_in_upload="true"/>
|
||||
<datatype extension="protxml.tsv" type="galaxy.datatypes.proteomics:ProtXmlReport" display_in_upload="true"/>
|
||||
<datatype extension="mascotdat" type="galaxy.datatypes.proteomics:MascotDat" display_in_upload="false"/>
|
||||
<datatype extension="mzid" type="galaxy.datatypes.proteomics:MzIdentML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="idxml" type="galaxy.datatypes.proteomics:IdXML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="tandem" type="galaxy.datatypes.proteomics:TandemXML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="sirius.ms" type="galaxy.datatypes.data:Text" subclass="true" display_in_upload="false"/>
|
||||
<datatype extension="thermo.raw" type="galaxy.datatypes.proteomics:ThermoRAW" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="brukerbaf.d.tar" type="galaxy.datatypes.binary:BafTar" display_in_upload="true"/>
|
||||
<datatype extension="agilentbrukeryep.d.tar" type="galaxy.datatypes.binary:YepTar" display_in_upload="true"/>
|
||||
@@ -248,6 +258,9 @@
|
||||
<datatype extension="agilentmasshunter.d.tar" type="galaxy.datatypes.binary:MassHunterTar" display_in_upload="true"/>
|
||||
<datatype extension="watersmasslynx.raw.tar" type="galaxy.datatypes.binary:MassLynxTar" display_in_upload="true"/>
|
||||
<datatype extension="wiff.tar" type="galaxy.datatypes.binary:WiffTar" display_in_upload="true"/>
|
||||
<datatype extension="mascotxml" type="galaxy.datatypes.proteomics:MascotXML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="mztab" type="galaxy.datatypes.proteomics:MzTab" display_in_upload="true"/>
|
||||
<datatype extension="mztab2" type="galaxy.datatypes.proteomics:MzTab2" display_in_upload="true"/>
|
||||
<datatype extension="mzml" type="galaxy.datatypes.proteomics:MzML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="nmrml" type="galaxy.datatypes.proteomics:NmrML" mimetype="application/xml" display_in_upload="true" description="nmrML is an open mark-up language for NMR data." description_url="http://nmrml.org/schema/"/>
|
||||
<datatype extension="mgf" type="galaxy.datatypes.proteomics:Mgf" display_in_upload="true"/>
|
||||
@@ -256,11 +269,18 @@
|
||||
<datatype extension="mzdata" type="galaxy.datatypes.proteomics:MzData" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="ms2" type="galaxy.datatypes.proteomics:Ms2" display_in_upload="true"/>
|
||||
<datatype extension="mzq" type="galaxy.datatypes.proteomics:MzQuantML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="sqlite" type="galaxy.datatypes.binary:SQlite" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="mz.sqlite" type="galaxy.datatypes.binary:MzSQlite" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="osw" type="galaxy.datatypes.binary:OSW" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="pqp" type="galaxy.datatypes.binary:PQP" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="traml" type="galaxy.datatypes.proteomics:TraML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="trafoxml" type="galaxy.datatypes.proteomics:TrafoXML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="featurexml" type="galaxy.datatypes.proteomics:FeatureXML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="consensusxml" type="galaxy.datatypes.proteomics:ConsensusXML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="uniprotxml" type="galaxy.datatypes.proteomics:UniProtXML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="xquest.xml" type="galaxy.datatypes.proteomics:XquestXML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="spec.xml" type="galaxy.datatypes.proteomics:XquestSpecXML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="qcml" type="galaxy.datatypes.proteomics:QCML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="msp" type="galaxy.datatypes.proteomics:Msp" display_in_upload="true"/>
|
||||
<datatype extension="splib_noindex" type="galaxy.datatypes.proteomics:SPLibNoIndex" display_in_upload="true"/>
|
||||
<datatype extension="splib" type="galaxy.datatypes.proteomics:SPLib" display_in_upload="true"/>
|
||||
@@ -284,6 +304,7 @@
|
||||
<datatype extension="kronik" type="galaxy.datatypes.tabular:Tabular" subclass="true"/>
|
||||
<datatype extension="imzml" type="galaxy.datatypes.proteomics:ImzML" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="analyze75" type="galaxy.datatypes.proteomics:Analyze75" mimetype="application/xml" display_in_upload="true"/>
|
||||
<datatype extension="peff" type="galaxy.datatypes.proteomics:PEFF" display_in_upload="true"/>
|
||||
<!-- End Proteomics Datatypes -->
|
||||
<datatype extension="deeptools_compute_matrix_archive" type="galaxy.datatypes.binary:CompressedArchive" subclass="true" display_in_upload="true"/>
|
||||
<datatype extension="deeptools_coverage_matrix" type="galaxy.datatypes.binary:CompressedArchive" subclass="true" display_in_upload="true"/>
|
||||
@@ -341,9 +362,7 @@
|
||||
<converter file="tabular_to_csv.xml" target_datatype="csv"/>
|
||||
</datatype>
|
||||
<datatype extension="twobit" type="galaxy.datatypes.binary:TwoBit" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="sqlite" type="galaxy.datatypes.binary:SQlite" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="pqp" type="galaxy.datatypes.binary:SQlite" mimetype="application/octet-stream" display_in_upload="true" subclass="true"/>
|
||||
<datatype extension="osw" type="galaxy.datatypes.binary:SQlite" mimetype="application/octet-stream" display_in_upload="true" subclass="true"/>
|
||||
<datatype extension="sqmass" type="galaxy.datatypes.binary:SQmass" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="gemini.sqlite" type="galaxy.datatypes.binary:GeminiSQLite" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="cuffdiff.sqlite" type="galaxy.datatypes.binary:CuffDiffSQlite" display_in_upload="true"/>
|
||||
<datatype extension="gafa.sqlite" type="galaxy.datatypes.binary:GAFASQLite" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
@@ -379,6 +398,7 @@
|
||||
<display file="igb/wig.xml"/>
|
||||
</datatype>
|
||||
<datatype extension="interval_index" type="galaxy.datatypes.binary:Binary" subclass="true"/>
|
||||
<datatype extension="odgi" type="galaxy.datatypes.binary:Binary" subclass="true" description="Genomic variation graphs self index used by odgi."/>
|
||||
<datatype extension="tabix" type="galaxy.datatypes.binary:Binary" subclass="true"/>
|
||||
<datatype extension="bgzip" type="galaxy.datatypes.binary:Binary" subclass="true"/>
|
||||
<datatype extension="vcf_bgzip" type="galaxy.datatypes.tabular:VcfGz" display_in_upload="true">
|
||||
@@ -798,7 +818,10 @@
|
||||
<sniffer type="galaxy.datatypes.tabular:Vcf"/>
|
||||
<sniffer type="galaxy.datatypes.binary:TwoBit"/>
|
||||
<sniffer type="galaxy.datatypes.binary:GeminiSQLite"/>
|
||||
<sniffer type="galaxy.datatypes.binary:SQmass"/>
|
||||
<sniffer type="galaxy.datatypes.binary:MzSQlite"/>
|
||||
<sniffer type="galaxy.datatypes.binary:OSW"/>
|
||||
<sniffer type="galaxy.datatypes.binary:PQP"/>
|
||||
<sniffer type="galaxy.datatypes.binary:IdpDB"/>
|
||||
<sniffer type="galaxy.datatypes.binary:ElibSQlite"/>
|
||||
<sniffer type="galaxy.datatypes.binary:DlibSQlite"/>
|
||||
@@ -840,27 +863,48 @@
|
||||
<sniffer type="galaxy.datatypes.binary:Cpt"/>
|
||||
<sniffer type="galaxy.datatypes.binary:Edr"/>
|
||||
<sniffer type="galaxy.datatypes.binary:Vel"/>
|
||||
<sniffer type="galaxy.datatypes.binary:Xlsx"/>
|
||||
<sniffer type="galaxy.datatypes.binary:CompressedZipArchive"/>
|
||||
<sniffer type="galaxy.datatypes.annotation:Augustus"/>
|
||||
<sniffer type="galaxy.datatypes.triples:Rdf"/>
|
||||
<sniffer type="galaxy.datatypes.blast:BlastXml"/>
|
||||
<sniffer type="galaxy.datatypes.xml:Phyloxml"/>
|
||||
<sniffer type="galaxy.datatypes.xml:Owl"/>
|
||||
<sniffer type="galaxy.datatypes.xml:Sbml"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:MzML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:NmrML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:TandemXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:PepXml"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:Dta2d"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:Edta"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:ConsensusXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:IdXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:FeatureXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:MascotXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:Mgf"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:ProtXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:MzXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:MzData"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:TraML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:MzIdentML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:MzQuantML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:UniProtXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:Ms2"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:Msp"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:MzData"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:MzIdentML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:MzML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:MzQuantML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:MzTab"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:MzTab2"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:ParamXml"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:MzXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:NmrML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:Kroenik"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:PepList"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:PSMS"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:PepXml"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:ProtXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:SPLib"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:TandemXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:ThermoRAW"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:TraML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:TrafoXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:UniProtXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:XquestXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:XquestSpecXML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:QCML"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:Wiff"/>
|
||||
<sniffer type="galaxy.datatypes.proteomics:PEFF"/>
|
||||
<sniffer type="galaxy.datatypes.molecules:CML"/>
|
||||
<sniffer type="galaxy.datatypes.xml:GenericXml"/>
|
||||
<sniffer type="galaxy.datatypes.triples:HDT"/>
|
||||
@@ -897,6 +941,7 @@
|
||||
<sniffer type="galaxy.datatypes.interval:Gff"/>
|
||||
<sniffer type="galaxy.datatypes.interval:Gff3"/>
|
||||
<sniffer type="galaxy.datatypes.tabular:Pileup"/>
|
||||
<sniffer type="galaxy.datatypes.text:Paf"/>
|
||||
<sniffer type="galaxy.datatypes.interval:Interval"/>
|
||||
<sniffer type="galaxy.datatypes.tabular:Sam"/>
|
||||
<sniffer type="galaxy.datatypes.data:Newick"/>
|
||||
|
||||
@@ -761,6 +761,13 @@ galaxy:
|
||||
# Enable InteractiveTools.
|
||||
#interactivetools_enable: false
|
||||
|
||||
# Proxy host - assumed to just be hosted on the same hostname and port
|
||||
# as Galaxy by default.
|
||||
#interactivetools_proxy_host: null
|
||||
|
||||
# Map for interactivetool proxy.
|
||||
#interactivetools_map: interactivetools_map.sqlite
|
||||
|
||||
# Show visualization tab and list in masthead.
|
||||
#visualizations_visible: true
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
<tool file="data_source/ucsc_tablebrowser.xml" />
|
||||
<!-- <tool file="data_source/ucsc_tablebrowser_test.xml" /> -->
|
||||
<tool file="data_source/ucsc_tablebrowser_archaea.xml" />
|
||||
<tool file="data_source/sra.xml" />
|
||||
<tool file="data_source/ebi_sra.xml" />
|
||||
<tool file="data_source/fly_modencode.xml" />
|
||||
<tool file="data_source/intermine.xml" />
|
||||
|
||||
@@ -249,6 +249,16 @@ class CompressedZipArchive(CompressedArchive):
|
||||
except Exception:
|
||||
return "Compressed zip file (%s)" % (nice_size(dataset.get_size()))
|
||||
|
||||
def sniff(self, filename):
|
||||
with zipfile.ZipFile(filename) as zf:
|
||||
zf_files = zf.infolist()
|
||||
count = 0
|
||||
for f in zf_files:
|
||||
if f.file_size > 0 and not f.filename.startswith('__MACOSX/') and not f.filename.endswith('.DS_Store'):
|
||||
count += 1
|
||||
if count > 1:
|
||||
return True
|
||||
|
||||
|
||||
class GenericAsn1Binary(Binary):
|
||||
"""Class for generic ASN.1 binary format"""
|
||||
@@ -1571,6 +1581,91 @@ class MzSQlite(SQlite):
|
||||
return False
|
||||
|
||||
|
||||
class PQP(SQlite):
|
||||
"""
|
||||
Class describing a Peptide query parameters file
|
||||
|
||||
>>> from galaxy.datatypes.sniff import get_test_fname
|
||||
>>> fname = get_test_fname('test.pqp')
|
||||
>>> PQP().sniff(fname)
|
||||
True
|
||||
>>> fname = get_test_fname('test.osw')
|
||||
>>> PQP().sniff(fname)
|
||||
False
|
||||
"""
|
||||
file_ext = "pqp"
|
||||
|
||||
def set_meta(self, dataset, overwrite=True, **kwd):
|
||||
super(PQP, self).set_meta(dataset, overwrite=overwrite, **kwd)
|
||||
|
||||
def sniff(self, filename):
|
||||
"""
|
||||
table definition according to https://github.com/grosenberger/OpenMS/blob/develop/src/openms/source/ANALYSIS/OPENSWATH/TransitionPQPFile.cpp#L264
|
||||
for now VERSION GENE PEPTIDE_GENE_MAPPING are excluded, since
|
||||
there is test data wo these tables, see also here https://github.com/OpenMS/OpenMS/issues/4365
|
||||
"""
|
||||
if not super(PQP, self).sniff(filename):
|
||||
return False
|
||||
table_names = ['COMPOUND', 'PEPTIDE', 'PEPTIDE_PROTEIN_MAPPING', 'PRECURSOR',
|
||||
'PRECURSOR_COMPOUND_MAPPING', 'PRECURSOR_PEPTIDE_MAPPING', 'PROTEIN',
|
||||
'TRANSITION', 'TRANSITION_PEPTIDE_MAPPING', 'TRANSITION_PRECURSOR_MAPPING']
|
||||
osw_table_names = ['FEATURE', 'FEATURE_MS1', 'FEATURE_MS2', 'FEATURE_TRANSITION', 'RUN']
|
||||
return self.sniff_table_names(filename, table_names) and not self.sniff_table_names(filename, osw_table_names)
|
||||
|
||||
|
||||
class OSW(SQlite):
|
||||
"""
|
||||
Class describing OpenSwath output
|
||||
|
||||
>>> from galaxy.datatypes.sniff import get_test_fname
|
||||
>>> fname = get_test_fname('test.osw')
|
||||
>>> OSW().sniff(fname)
|
||||
True
|
||||
>>> fname = get_test_fname('test.sqmass')
|
||||
>>> OSW().sniff(fname)
|
||||
False
|
||||
"""
|
||||
file_ext = "osw"
|
||||
|
||||
def set_meta(self, dataset, overwrite=True, **kwd):
|
||||
super(OSW, self).set_meta(dataset, overwrite=overwrite, **kwd)
|
||||
|
||||
def sniff(self, filename):
|
||||
# osw seems to be an extension of pqp (few tables are added)
|
||||
# see also here https://github.com/OpenMS/OpenMS/issues/4365
|
||||
if not super(OSW, self).sniff(filename):
|
||||
return False
|
||||
table_names = ['COMPOUND', 'PEPTIDE', 'PEPTIDE_PROTEIN_MAPPING', 'PRECURSOR',
|
||||
'PRECURSOR_COMPOUND_MAPPING', 'PRECURSOR_PEPTIDE_MAPPING', 'PROTEIN',
|
||||
'TRANSITION', 'TRANSITION_PEPTIDE_MAPPING', 'TRANSITION_PRECURSOR_MAPPING',
|
||||
'FEATURE', 'FEATURE_MS1', 'FEATURE_MS2', 'FEATURE_TRANSITION', 'RUN']
|
||||
return self.sniff_table_names(filename, table_names)
|
||||
|
||||
|
||||
class SQmass(SQlite):
|
||||
"""
|
||||
Class describing a Sqmass database
|
||||
|
||||
>>> from galaxy.datatypes.sniff import get_test_fname
|
||||
>>> fname = get_test_fname('test.sqmass')
|
||||
>>> SQmass().sniff(fname)
|
||||
True
|
||||
>>> fname = get_test_fname('test.pqp')
|
||||
>>> SQmass().sniff(fname)
|
||||
False
|
||||
"""
|
||||
file_ext = "sqmass"
|
||||
|
||||
def set_meta(self, dataset, overwrite=True, **kwd):
|
||||
super(SQmass, self).set_meta(dataset, overwrite=overwrite, **kwd)
|
||||
|
||||
def sniff(self, filename):
|
||||
if super(SQmass, self).sniff(filename):
|
||||
table_names = ["CHROMATOGRAM", "PRECURSOR", "RUN", "SPECTRUM", "DATA", "PRODUCT", "RUN_EXTRA"]
|
||||
return self.sniff_table_names(filename, table_names)
|
||||
return False
|
||||
|
||||
|
||||
class BlibSQlite(SQlite):
|
||||
"""Class describing a Proteomics Spectral Library Sqlite database """
|
||||
MetadataElement(name="blib_version", default='1.8', param=MetadataParameter, desc="Blib Version",
|
||||
|
||||
@@ -7,8 +7,9 @@ import re
|
||||
from galaxy.datatypes import data
|
||||
from galaxy.datatypes.binary import Binary
|
||||
from galaxy.datatypes.data import Text
|
||||
from galaxy.datatypes.sequence import Sequence
|
||||
from galaxy.datatypes.sniff import build_sniff_from_prefix
|
||||
from galaxy.datatypes.tabular import Tabular
|
||||
from galaxy.datatypes.tabular import Tabular, TabularData
|
||||
from galaxy.datatypes.xml import GenericXml
|
||||
from galaxy.util import nice_size
|
||||
|
||||
@@ -53,6 +54,221 @@ class Wiff(Binary):
|
||||
return "\n".join(rval)
|
||||
|
||||
|
||||
@build_sniff_from_prefix
|
||||
class MzTab(Text):
|
||||
"""
|
||||
exchange format for proteomics and metabolomics results
|
||||
|
||||
>>> from galaxy.datatypes.sniff import get_test_fname
|
||||
>>> fname = get_test_fname('test.mztab')
|
||||
>>> MzTab().sniff(fname)
|
||||
True
|
||||
>>> fname = get_test_fname('test.mztab2')
|
||||
>>> MzTab().sniff(fname)
|
||||
False
|
||||
"""
|
||||
edam_data = "data_3681"
|
||||
file_ext = "mztab"
|
||||
# section names (except MTD)
|
||||
_sections = ["PRH", "PRT", "PEH", "PEP", "PSH", "PSM", "SMH", "SML", "COM"]
|
||||
# mandatory metadata fields and list of allowed entries (in lower case)
|
||||
# (or None if everything is allowed)
|
||||
_man_mtd = {"mzTab-mode": ["complete", "summary"],
|
||||
"mzTab-type": ['quantification', 'identification'],
|
||||
"description": None}
|
||||
_version_re = r"(1)(\.[0-9])?(\.[0-9])?"
|
||||
|
||||
def __init__(self, **kwd):
|
||||
super(MzTab, self).__init__(**kwd)
|
||||
|
||||
def set_peek(self, dataset, is_multi_byte=False):
|
||||
"""Set the peek and blurb text"""
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = data.get_file_peek(dataset.file_name)
|
||||
dataset.blurb = 'mzTab Format'
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
|
||||
def sniff_prefix(self, file_prefix):
|
||||
""" Determines whether the file is the correct type. """
|
||||
has_version = False
|
||||
found_man_mtd = set()
|
||||
contents = file_prefix.string_io()
|
||||
for line in contents:
|
||||
if re.match(r"^\s*$", line):
|
||||
continue
|
||||
line = line.strip("\r\n").split("\t")
|
||||
if line[0] == "MTD":
|
||||
if line[1] == "mzTab-version" and re.match(self._version_re, line[2]) is not None:
|
||||
has_version = True
|
||||
elif line[1] in self._man_mtd and (self._man_mtd[line[1]] is None or line[2].lower() in self._man_mtd[line[1]]):
|
||||
found_man_mtd.add(line[1])
|
||||
elif not line[0] in self._sections:
|
||||
return False
|
||||
return has_version and found_man_mtd == set(self._man_mtd.keys())
|
||||
|
||||
|
||||
class MzTab2(MzTab):
|
||||
"""
|
||||
exchange format for proteomics and metabolomics results
|
||||
|
||||
>>> from galaxy.datatypes.sniff import get_test_fname
|
||||
>>> fname = get_test_fname('test.mztab2')
|
||||
>>> MzTab2().sniff(fname)
|
||||
True
|
||||
>>> fname = get_test_fname('test.mztab')
|
||||
>>> MzTab2().sniff(fname)
|
||||
False
|
||||
"""
|
||||
file_ext = "mztab2"
|
||||
_sections = ["SMH", "SML", "SFH", "SMF", "SEH", "SME", "COM"]
|
||||
_version_re = r"(2)(\.[0-9])?(\.[0-9])?-M$"
|
||||
_man_mtd = {"mzTab-ID": None}
|
||||
|
||||
def __init__(self, **kwd):
|
||||
super(MzTab2, self).__init__(**kwd)
|
||||
|
||||
def set_peek(self, dataset, is_multi_byte=False):
|
||||
"""Set the peek and blurb text"""
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = data.get_file_peek(dataset.file_name)
|
||||
dataset.blurb = 'mzTab2 Format'
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
|
||||
|
||||
@build_sniff_from_prefix
|
||||
class Kroenik(Tabular):
|
||||
"""
|
||||
Kroenik (HardKloer sibling) files
|
||||
|
||||
>>> from galaxy.datatypes.sniff import get_test_fname
|
||||
>>> fname = get_test_fname('test.kroenik')
|
||||
>>> Kroenik().sniff(fname)
|
||||
True
|
||||
>>> fname = get_test_fname('test.peplist')
|
||||
>>> Kroenik().sniff(fname)
|
||||
False
|
||||
"""
|
||||
file_ext = "kroenik"
|
||||
|
||||
def __init__(self, **kwd):
|
||||
super(Kroenik, self).__init__(**kwd)
|
||||
self.column_names = ["File", "First Scan", "Last Scan", "Num of Scans", "Charge", "Monoisotopic Mass", "Base Isotope Peak", "Best Intensity", "Summed Intensity", "First RTime", "Last RTime", "Best RTime", "Best Correlation", "Modifications"]
|
||||
|
||||
def display_peek(self, dataset):
|
||||
"""Returns formated html of peek"""
|
||||
return self.make_html_table(dataset, column_names=self.column_names)
|
||||
|
||||
def sniff_prefix(self, file_prefix):
|
||||
fh = file_prefix.string_io()
|
||||
line = [_.strip() for _ in fh.readline().split("\t")]
|
||||
if line != self.column_names:
|
||||
return False
|
||||
line = fh.readline().split("\t")
|
||||
try:
|
||||
[int(_) for _ in line[1:5]]
|
||||
[float(_) for _ in line[5:13]]
|
||||
except ValueError:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
@build_sniff_from_prefix
|
||||
class PepList(Tabular):
|
||||
"""
|
||||
Peplist file as used in OpenMS
|
||||
https://github.com/OpenMS/OpenMS/blob/0fc8765670a0ad625c883f328de60f738f7325a4/src/openms/source/FORMAT/FileHandler.cpp#L432
|
||||
|
||||
>>> from galaxy.datatypes.sniff import get_test_fname
|
||||
>>> fname = get_test_fname('test.peplist')
|
||||
>>> PepList().sniff(fname)
|
||||
True
|
||||
>>> fname = get_test_fname('test.psms')
|
||||
>>> PepList().sniff(fname)
|
||||
False
|
||||
"""
|
||||
file_ext = "peplist"
|
||||
|
||||
def __init__(self, **kwd):
|
||||
super(PepList, self).__init__(**kwd)
|
||||
self.column_names = ["m/z", "rt(min)", "snr", "charge", "intensity"]
|
||||
|
||||
def display_peek(self, dataset):
|
||||
"""Returns formated html of peek"""
|
||||
return self.make_html_table(dataset, column_names=self.column_names)
|
||||
|
||||
def sniff_prefix(self, file_prefix):
|
||||
fh = file_prefix.string_io()
|
||||
line = [_.strip() for _ in fh.readline().split("\t")]
|
||||
if line == self.column_names:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
@build_sniff_from_prefix
|
||||
class PSMS(Tabular):
|
||||
"""
|
||||
Percolator tab-delimited output (PSM level, .psms) as used in OpenMS
|
||||
https://github.com/OpenMS/OpenMS/blob/0fc8765670a0ad625c883f328de60f738f7325a4/src/openms/source/FORMAT/FileHandler.cpp#L453
|
||||
see also http://www.kojak-ms.org/docs/percresults.html
|
||||
|
||||
Note that the data rows can have more columns than the header line
|
||||
since ProteinIds are listed tab-separated.
|
||||
|
||||
>>> from galaxy.datatypes.sniff import get_test_fname
|
||||
>>> fname = get_test_fname('test.psms')
|
||||
>>> PSMS().sniff(fname)
|
||||
True
|
||||
>>> fname = get_test_fname('test.kroenik')
|
||||
>>> PSMS().sniff(fname)
|
||||
False
|
||||
"""
|
||||
file_ext = "psms"
|
||||
|
||||
def __init__(self, **kwd):
|
||||
super(PSMS, self).__init__(**kwd)
|
||||
self.column_names = ["PSMId", "score", "q-value", "posterior_error_prob", "peptide", "proteinIds"]
|
||||
|
||||
def display_peek(self, dataset):
|
||||
"""Returns formated html of peek"""
|
||||
return self.make_html_table(dataset, column_names=self.column_names)
|
||||
|
||||
def sniff_prefix(self, file_prefix):
|
||||
fh = file_prefix.string_io()
|
||||
line = [_.strip() for _ in fh.readline().split("\t")]
|
||||
if line == self.column_names:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
@build_sniff_from_prefix
|
||||
class PEFF(Sequence):
|
||||
"""
|
||||
PSI Extended FASTA Format
|
||||
https://github.com/HUPO-PSI/PEFF
|
||||
"""
|
||||
file_ext = "peff"
|
||||
|
||||
def sniff_prefix(self, file_prefix):
|
||||
"""
|
||||
>>> from galaxy.datatypes.sniff import get_test_fname
|
||||
>>> fname = get_test_fname( 'test.peff' )
|
||||
>>> PEFF().sniff( fname )
|
||||
True
|
||||
>>> fname = get_test_fname( 'sequence.fasta' )
|
||||
>>> PEFF().sniff( fname )
|
||||
False
|
||||
"""
|
||||
fh = file_prefix.string_io()
|
||||
if re.match(r"# PEFF \d+.\d+", fh.readline()):
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
class PepXmlReport(Tabular):
|
||||
"""pepxml converted to tabular report"""
|
||||
edam_data = "data_2536"
|
||||
@@ -92,6 +308,277 @@ class ProtXmlReport(Tabular):
|
||||
return self.make_html_table(dataset, column_names=self.column_names)
|
||||
|
||||
|
||||
class Dta(TabularData):
|
||||
"""dta
|
||||
The first line contains the singly protonated peptide mass (MH+) and the
|
||||
peptide charge state separated by a space. Subsequent lines contain space
|
||||
separated pairs of fragment ion m/z and intensity values.
|
||||
"""
|
||||
file_ext = "dta"
|
||||
comment_lines = 0
|
||||
|
||||
def set_meta(self, dataset, **kwd):
|
||||
column_types = []
|
||||
data_row = []
|
||||
data_lines = 0
|
||||
if dataset.has_data():
|
||||
with open(dataset.file_name, 'r') as dtafile:
|
||||
for line in dtafile:
|
||||
data_lines += 1
|
||||
|
||||
# Guess column types
|
||||
for cell in data_row:
|
||||
column_types.append(self.guess_type(cell))
|
||||
|
||||
# Set metadata
|
||||
dataset.metadata.data_lines = data_lines
|
||||
dataset.metadata.comment_lines = 0
|
||||
dataset.metadata.column_types = ['float', 'float']
|
||||
dataset.metadata.columns = 2
|
||||
dataset.metadata.column_names = ['m/z', 'intensity']
|
||||
dataset.metadata.delimiter = " "
|
||||
|
||||
|
||||
@build_sniff_from_prefix
|
||||
class Dta2d(TabularData):
|
||||
"""
|
||||
dta2d: files with three tab/space-separated columns.
|
||||
The default format is: retention time (seconds) , m/z , intensity.
|
||||
If the first line starts with '#', a different order is defined by the the
|
||||
order of the keywords 'MIN' (retention time in minutes) or 'SEC' (retention
|
||||
time in seconds), 'MZ', and 'INT'.
|
||||
Example: '#MZ MIN INT'
|
||||
The peaks of one retention time have to be in subsequent lines.
|
||||
|
||||
Note: sniffer detects (tab or space separated) dta2d files with correct
|
||||
header, wo header seems to generic
|
||||
|
||||
>>> from galaxy.datatypes.sniff import get_test_fname
|
||||
>>> fname = get_test_fname('test.dta2d')
|
||||
>>> Dta2d().sniff(fname)
|
||||
True
|
||||
>>> fname = get_test_fname('test.edta')
|
||||
>>> Dta2d().sniff(fname)
|
||||
False
|
||||
"""
|
||||
file_ext = "dta2d"
|
||||
comment_lines = 0
|
||||
|
||||
def _parse_header(self, line):
|
||||
if len(line) != 3 or len(line[0]) < 3 or not line[0].startswith("#"):
|
||||
return None
|
||||
line[0] = line[0].lstrip("#")
|
||||
line = [_.strip() for _ in line]
|
||||
if 'MZ' not in line or 'INT' not in line or ('MIN' not in line and 'SEC' not in line):
|
||||
return None
|
||||
return line
|
||||
|
||||
def _parse_delimiter(self, line):
|
||||
if len(line.split(" ")) == 3:
|
||||
return " "
|
||||
elif len(line.split("\t")) == 3:
|
||||
return "\t"
|
||||
return None
|
||||
|
||||
def _parse_dataline(self, line):
|
||||
try:
|
||||
line = [float(_) for _ in line]
|
||||
except ValueError:
|
||||
return False
|
||||
if not all(_ >= 0 for _ in line):
|
||||
return False
|
||||
return True
|
||||
|
||||
def set_meta(self, dataset, **kwd):
|
||||
data_lines = 0
|
||||
delim = None
|
||||
if dataset.has_data():
|
||||
with open(dataset.file_name, 'r') as dtafile:
|
||||
for line in dtafile:
|
||||
if delim is None:
|
||||
delim = self._parse_delimiter(line)
|
||||
dataset.metadata.column_names = self._parse_header(line.split(delim))
|
||||
data_lines += 1
|
||||
|
||||
# Set metadata
|
||||
if delim is not None:
|
||||
dataset.metadata.delimiter = delim
|
||||
|
||||
dataset.metadata.data_lines = data_lines
|
||||
dataset.metadata.comment_lines = 0
|
||||
dataset.metadata.column_types = ['float', 'float', 'float']
|
||||
dataset.metadata.columns = 3
|
||||
if dataset.metadata.column_names is None or dataset.metadata.column_names == []:
|
||||
dataset.metadata.comment_lines += 1
|
||||
dataset.metadata.data_lines -= 1
|
||||
dataset.metadata.column_names = ['SEC', 'MZ', 'INT']
|
||||
|
||||
def sniff_prefix(self, file_prefix):
|
||||
sep = None
|
||||
header = None
|
||||
for idx, line in enumerate(file_prefix.line_iterator()):
|
||||
line = line.strip()
|
||||
if sep is None:
|
||||
sep = self._parse_delimiter(line)
|
||||
if sep is None:
|
||||
return False
|
||||
line = line.split(sep)
|
||||
if len(line) != 3:
|
||||
return False
|
||||
if idx == 0:
|
||||
header = self._parse_header(line)
|
||||
if (header is None) and not self._parse_dataline(line):
|
||||
return False
|
||||
elif not self._parse_dataline(line):
|
||||
return False
|
||||
if sep is None or header is None:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
@build_sniff_from_prefix
|
||||
class Edta(TabularData):
|
||||
"""
|
||||
Input text file containing tab, space or comma separated columns.
|
||||
The separator between columns is checked in the first line in this order.
|
||||
|
||||
It supports three variants of this format.
|
||||
|
||||
1. Columns are: RT, MZ, Intensity A header is optional.
|
||||
2. Columns are: RT, MZ, Intensity, Charge, <Meta-Data> columns{0,} A header is mandatory.
|
||||
3. Columns are: (RT, MZ, Intensity, Charge){1,}, <Meta-Data> columns{0,}
|
||||
Header is mandatory. First quadruplet is the consensus. All following
|
||||
quadruplets describe the sub-features. This variant is discerned from
|
||||
variant #2 by the name of the fifth column, which is required to be RT1
|
||||
(or rt1). All other column names for sub-features are faithfully ignored.
|
||||
|
||||
Note the sniffer only detects files with header.
|
||||
|
||||
>>> from galaxy.datatypes.sniff import get_test_fname
|
||||
>>> fname = get_test_fname('test.edta')
|
||||
>>> Edta().sniff(fname)
|
||||
True
|
||||
>>> fname = get_test_fname('test.dta2d')
|
||||
>>> Edta().sniff(fname)
|
||||
False
|
||||
"""
|
||||
file_ext = "edta"
|
||||
comment_lines = 0
|
||||
|
||||
def _parse_delimiter(self, line):
|
||||
if len(line.split(" ")) >= 3:
|
||||
return " "
|
||||
elif len(line.split("\t")) >= 3:
|
||||
return "\t"
|
||||
elif len(line.split(",")) >= 3:
|
||||
return "\t"
|
||||
return None
|
||||
|
||||
def _parse_type(self, line):
|
||||
"""
|
||||
parse the type from the header line
|
||||
types 1-3 as in the class docs, 0: type 1 wo/wrong header
|
||||
"""
|
||||
if len(line) < 3:
|
||||
return None
|
||||
line = [_.lower().replace("/", "") for _ in line]
|
||||
if len(line) == 3:
|
||||
if line[0] == "rt" and line[1] == "mz" and (line[2] == "int" or line[2] == "intensity"):
|
||||
return 1
|
||||
else:
|
||||
return None
|
||||
if line[0] != "rt" or line[1] != "mz" or (line[2] != "int" and line[2] != "intensity") or line[3] != "charge":
|
||||
return None
|
||||
if not line[4].startswith("rt"):
|
||||
return 2
|
||||
else:
|
||||
return 3
|
||||
|
||||
def _parse_dataline(self, line, tpe):
|
||||
if tpe == 2 or tpe == 3:
|
||||
idx = 4
|
||||
else:
|
||||
idx = 3
|
||||
try:
|
||||
line = [float(_) for _ in line[:idx]]
|
||||
except ValueError:
|
||||
return False
|
||||
if not all(_ >= 0 for _ in line[:idx]):
|
||||
return False
|
||||
return True
|
||||
|
||||
def _clean_header(self, line):
|
||||
for idx, el in enumerate(line):
|
||||
el = el.lower()
|
||||
if el.startswith("rt"):
|
||||
line[idx] = "RT"
|
||||
elif el.startswith("int"):
|
||||
line[idx] = "intensity"
|
||||
elif el.startswith("mz"):
|
||||
line[idx] = "m/z"
|
||||
elif el.startswith("charge"):
|
||||
line[idx] = "charge"
|
||||
else:
|
||||
break
|
||||
if idx // 4 > 0:
|
||||
line[idx] += str(idx // 4)
|
||||
return line
|
||||
|
||||
def set_meta(self, dataset, **kwd):
|
||||
data_lines = 0
|
||||
delim = None
|
||||
if dataset.has_data():
|
||||
with open(dataset.file_name, 'r') as dtafile:
|
||||
for idx, line in enumerate(dtafile):
|
||||
if idx == 0:
|
||||
delim = self._parse_delimiter(line)
|
||||
tpe = self._parse_type(line.split(delim))
|
||||
if tpe == 0:
|
||||
dataset.metadata.column_names = ["RT", "m/z", "intensity"]
|
||||
else:
|
||||
dataset.metadata.column_names = self._clean_header(line.split(delim))
|
||||
data_lines += 1
|
||||
|
||||
# Set metadata
|
||||
if delim is not None:
|
||||
dataset.metadata.delimiter = delim
|
||||
for c in dataset.metadata.column_names:
|
||||
if any(c.startswith(_) for _ in ["RT", "m/z", "intensity", "charge"]):
|
||||
dataset.metadata.column_types.append("float")
|
||||
else:
|
||||
dataset.metadata.column_types.append("str")
|
||||
|
||||
dataset.metadata.data_lines = data_lines
|
||||
dataset.metadata.comment_lines = 0
|
||||
dataset.metadata.columns = len(dataset.metadata.column_names)
|
||||
if tpe > 0:
|
||||
dataset.metadata.comment_lines += 1
|
||||
dataset.metadata.data_lines -= 1
|
||||
|
||||
def sniff_prefix(self, file_prefix):
|
||||
sep = None
|
||||
tpe = None
|
||||
for idx, line in enumerate(file_prefix.line_iterator()):
|
||||
line = line.strip("\r\n")
|
||||
if sep is None:
|
||||
sep = self._parse_delimiter(line)
|
||||
if sep is None:
|
||||
return False
|
||||
line = line.split(sep)
|
||||
|
||||
if idx == 0:
|
||||
tpe = self._parse_type(line)
|
||||
if tpe is None:
|
||||
return False
|
||||
elif tpe == 0 and not self._parse_dataline(line, tpe):
|
||||
return False
|
||||
elif not self._parse_dataline(line, tpe):
|
||||
return False
|
||||
if tpe is None:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
class ProteomicsXml(GenericXml):
|
||||
""" An enhanced XML datatype used to reuse code across several
|
||||
proteomic/mass-spec datatypes. """
|
||||
@@ -102,12 +589,12 @@ class ProteomicsXml(GenericXml):
|
||||
""" Determines whether the file is the correct XML type. """
|
||||
contents = file_prefix.string_io()
|
||||
while True:
|
||||
line = contents.readline()
|
||||
line = contents.readline().strip()
|
||||
if line is None or not line.startswith('<?'):
|
||||
break
|
||||
# pattern match <root or <ns:root for any ns string
|
||||
pattern = r'^<(\w*:)?%s' % self.root
|
||||
return line is not None and re.match(pattern, line) is not None
|
||||
pattern = r'<(\w*:)?%s' % self.root
|
||||
return line is not None and re.search(pattern, line) is not None
|
||||
|
||||
def set_peek(self, dataset, is_multi_byte=False):
|
||||
"""Set the peek and blurb text"""
|
||||
@@ -119,6 +606,13 @@ class ProteomicsXml(GenericXml):
|
||||
dataset.blurb = 'file purged from disk'
|
||||
|
||||
|
||||
class ParamXml(ProteomicsXml):
|
||||
"""store Parameters in XML formal"""
|
||||
file_ext = "paramxml"
|
||||
blurb = "parameters in xmls"
|
||||
root = "parameters|PARAMETERS"
|
||||
|
||||
|
||||
class PepXml(ProteomicsXml):
|
||||
"""pepXML data"""
|
||||
edam_format = "format_3655"
|
||||
@@ -127,6 +621,13 @@ class PepXml(ProteomicsXml):
|
||||
root = "msms_pipeline_analysis"
|
||||
|
||||
|
||||
class MascotXML(ProteomicsXml):
|
||||
"""mzXML data"""
|
||||
file_ext = "mascotxml"
|
||||
blurb = "mascot Mass Spectrometry data"
|
||||
root = "mascot_search_results"
|
||||
|
||||
|
||||
class MzML(ProteomicsXml):
|
||||
"""mzML data"""
|
||||
edam_format = "format_3244"
|
||||
@@ -180,6 +681,12 @@ class TraML(ProteomicsXml):
|
||||
root = "TraML"
|
||||
|
||||
|
||||
class TrafoXML(ProteomicsXml):
|
||||
file_ext = "trafoxml"
|
||||
blurb = "RT alignment tranformation"
|
||||
root = "TrafoXML"
|
||||
|
||||
|
||||
class MzQuantML(ProteomicsXml):
|
||||
edam_format = "format_3248"
|
||||
file_ext = "mzq"
|
||||
@@ -218,6 +725,29 @@ class UniProtXML(ProteomicsXml):
|
||||
root = "uniprot"
|
||||
|
||||
|
||||
class XquestXML(ProteomicsXml):
|
||||
file_ext = "xquest.xml"
|
||||
blurb = "XQuest XML file"
|
||||
root = "xquest_results"
|
||||
|
||||
|
||||
class XquestSpecXML(ProteomicsXml):
|
||||
"""spec.xml"""
|
||||
file_ext = "spec.xml"
|
||||
blurb = 'xquest_spectra'
|
||||
root = "xquest_spectra"
|
||||
|
||||
|
||||
class QCML(ProteomicsXml):
|
||||
"""qcml
|
||||
https://github.com/OpenMS/OpenMS/blob/113c49d01677f7f03343ce7cd542d83c99b351ee/share/OpenMS/SCHEMAS/mzQCML_0_0_5.xsd
|
||||
https://github.com/OpenMS/OpenMS/blob/3cfc57ad1788e7ab2bd6dd9862818b2855234c3f/share/OpenMS/SCHEMAS/qcML_0.0.7.xsd
|
||||
"""
|
||||
file_ext = "qcml"
|
||||
blurb = 'QualityAssessments to runs'
|
||||
root = "qcML|MzQualityML)"
|
||||
|
||||
|
||||
class Mgf(Text):
|
||||
"""Mascot Generic Format data"""
|
||||
edam_data = "data_2536"
|
||||
@@ -278,7 +808,7 @@ class ThermoRAW(Binary):
|
||||
"""Class describing a Thermo Finnigan binary RAW file"""
|
||||
edam_data = "data_2536"
|
||||
edam_format = "format_3712"
|
||||
file_ext = "raw"
|
||||
file_ext = "thermo.raw"
|
||||
|
||||
def sniff(self, filename):
|
||||
# Thermo Finnigan RAW format is proprietary and hence not well documented.
|
||||
|
||||
@@ -765,23 +765,19 @@ class Registry(object):
|
||||
'coverage' : coverage.LastzCoverage(),
|
||||
'customtrack' : interval.CustomTrack(),
|
||||
'csfasta' : sequence.csFasta(),
|
||||
'db3' : binary.SQlite(),
|
||||
'fasta' : sequence.Fasta(),
|
||||
'eland' : tabular.Eland(),
|
||||
'fastq' : sequence.Fastq(),
|
||||
'fastqsanger' : sequence.FastqSanger(),
|
||||
'gemini.sqlite' : binary.GeminiSQLite(),
|
||||
'gtf' : interval.Gtf(),
|
||||
'gff' : interval.Gff(),
|
||||
'gff3' : interval.Gff3(),
|
||||
'genetrack' : tracks.GeneTrack(),
|
||||
'h5' : binary.H5(),
|
||||
'idpdb' : binary.IdpDB(),
|
||||
'interval' : interval.Interval(),
|
||||
'laj' : images.Laj(),
|
||||
'lav' : sequence.Lav(),
|
||||
'maf' : sequence.Maf(),
|
||||
'mz.sqlite' : binary.MzSQlite(),
|
||||
'pileup' : tabular.Pileup(),
|
||||
'qualsolid' : qualityscore.QualityScoreSOLiD(),
|
||||
'qualsolexa' : qualityscore.QualityScoreSolexa(),
|
||||
@@ -801,26 +797,21 @@ class Registry(object):
|
||||
'axt' : 'text/plain',
|
||||
'bam' : 'application/octet-stream',
|
||||
'bed' : 'text/plain',
|
||||
'blib' : 'application/octet-stream',
|
||||
'customtrack' : 'text/plain',
|
||||
'csfasta' : 'text/plain',
|
||||
'db3' : 'application/octet-stream',
|
||||
'eland' : 'application/octet-stream',
|
||||
'fasta' : 'text/plain',
|
||||
'fastq' : 'text/plain',
|
||||
'fastqsanger' : 'text/plain',
|
||||
'gemini.sqlite' : 'application/octet-stream',
|
||||
'gtf' : 'text/plain',
|
||||
'gff' : 'text/plain',
|
||||
'gff3' : 'text/plain',
|
||||
'h5' : 'application/octet-stream',
|
||||
'idpdb' : 'application/octet-stream',
|
||||
'interval' : 'text/plain',
|
||||
'laj' : 'text/plain',
|
||||
'lav' : 'text/plain',
|
||||
'maf' : 'text/plain',
|
||||
'memexml' : 'application/xml',
|
||||
'mz.sqlite' : 'application/octet-stream',
|
||||
'pileup' : 'text/plain',
|
||||
'qualsolid' : 'text/plain',
|
||||
'qualsolexa' : 'text/plain',
|
||||
@@ -846,10 +837,6 @@ class Registry(object):
|
||||
binary.Bam(),
|
||||
binary.Sff(),
|
||||
binary.H5(),
|
||||
binary.GeminiSQLite(),
|
||||
binary.MzSQlite(),
|
||||
binary.IdpDB(),
|
||||
binary.SQlite(),
|
||||
xml.GenericXml(),
|
||||
sequence.Maf(),
|
||||
sequence.Lav(),
|
||||
|
||||
@@ -0,0 +1,245 @@
|
||||
gi|568815454:1200216-1203631 3416 0 3416 + gi|568815529:1421891-1425306 3416 0 3416 3416 3416 0 NM:i:0 ms:i:6832 AS:i:6832 nn:i:0 tp:A:S cm:i:637 s1:i:3404 de:f:0 rl:i:0 cg:Z:3416M
|
||||
gi|568815454:1200216-1203631 3416 0 3416 + gi|568815592:29942469-29945883 3415 0 3415 3371 3416 0 NM:i:45 ms:i:6560 AS:i:6560 nn:i:0 tp:A:S cm:i:540 s1:i:3085 de:f:0.0132 rl:i:0 cg:Z:1212M1I2203M
|
||||
gi|568815454:1200216-1203631 3416 0 3411 + gi|568815567:1196244-1200852 4609 1184 4609 3297 3432 0 NM:i:135 ms:i:6090 AS:i:6090 nn:i:0 tp:A:S cm:i:381 s1:i:2452 de:f:0.0329 rl:i:0 cg:Z:1339M4D149M17D495M3I183M1I238M3I1000M
|
||||
gi|568815454:1200216-1203631 3416 0 3411 + gi|568815551:1197321-1201446 4126 701 4126 3289 3432 0 NM:i:143 ms:i:6038 AS:i:6038 nn:i:0 tp:A:S cm:i:385 s1:i:2485 de:f:0.0355 rl:i:0 cg:Z:1343M3D1M1D144M17D495M3I183M1I238M3I1000M
|
||||
gi|568815454:1200216-1203631 3416 0 3411 + gi|568815561:1196951-1200436 3486 60 3486 3290 3434 0 NM:i:144 ms:i:6038 AS:i:6038 nn:i:0 tp:A:S cm:i:371 s1:i:2447 de:f:0.0352 rl:i:0 cg:Z:175M1I1163M4D149M17D495M3I165M2D18M1I238M3I1000M
|
||||
gi|568815454:1200216-1203631 3416 5 3411 + gi|568815569:1240288-1243708 3421 0 3421 3284 3429 0 NM:i:145 ms:i:6022 AS:i:6022 nn:i:0 tp:A:S cm:i:383 s1:i:2483 de:f:0.0355 rl:i:0 cg:Z:170M1I1163M4D149M17D495M3I165M2D18M1I238M3I1000M
|
||||
gi|568815454:1200216-1203631 3416 92 3411 + gi|568815564:1286641-1289973 3333 0 3333 3198 3340 0 NM:i:142 ms:i:5860 AS:i:5860 nn:i:0 tp:A:S cm:i:372 s1:i:2412 de:f:0.0362 rl:i:0 cg:Z:1251M3D1M1D144M17D495M3I183M1I238M3I1000M
|
||||
gi|568815529:1421891-1425306 3416 0 3416 + gi|568815592:29942469-29945883 3415 0 3415 3371 3416 0 NM:i:45 ms:i:6560 AS:i:6560 nn:i:0 tp:A:S cm:i:540 s1:i:3085 de:f:0.0132 rl:i:0 cg:Z:1212M1I2203M
|
||||
gi|568815529:1421891-1425306 3416 0 3411 + gi|568815567:1196244-1200852 4609 1184 4609 3297 3432 0 NM:i:135 ms:i:6090 AS:i:6090 nn:i:0 tp:A:S cm:i:381 s1:i:2452 de:f:0.0329 rl:i:0 cg:Z:1339M4D149M17D495M3I183M1I238M3I1000M
|
||||
gi|568815529:1421891-1425306 3416 0 3411 + gi|568815561:1196951-1200436 3486 60 3486 3290 3434 0 NM:i:144 ms:i:6038 AS:i:6038 nn:i:0 tp:A:S cm:i:371 s1:i:2447 de:f:0.0352 rl:i:0 cg:Z:175M1I1163M4D149M17D495M3I165M2D18M1I238M3I1000M
|
||||
gi|568815529:1421891-1425306 3416 0 3411 + gi|568815551:1197321-1201446 4126 701 4126 3289 3432 0 NM:i:143 ms:i:6038 AS:i:6038 nn:i:0 tp:A:S cm:i:385 s1:i:2485 de:f:0.0355 rl:i:0 cg:Z:1343M3D1M1D144M17D495M3I183M1I238M3I1000M
|
||||
gi|568815529:1421891-1425306 3416 5 3411 + gi|568815569:1240288-1243708 3421 0 3421 3284 3429 0 NM:i:145 ms:i:6022 AS:i:6022 nn:i:0 tp:A:S cm:i:383 s1:i:2483 de:f:0.0355 rl:i:0 cg:Z:170M1I1163M4D149M17D495M3I165M2D18M1I238M3I1000M
|
||||
gi|568815529:1421891-1425306 3416 92 3411 + gi|568815564:1286641-1289973 3333 0 3333 3198 3340 0 NM:i:142 ms:i:5860 AS:i:5860 nn:i:0 tp:A:S cm:i:372 s1:i:2412 de:f:0.0362 rl:i:0 cg:Z:1251M3D1M1D144M17D495M3I183M1I238M3I1000M
|
||||
gi|568815551:1197321-1201446 4126 0 4126 + gi|568815567:1196244-1200852 4609 483 4609 4061 4126 0 NM:i:65 ms:i:7862 AS:i:7862 nn:i:0 tp:A:S cm:i:604 s1:i:3595 de:f:0.0158 rl:i:0 cg:Z:4126M
|
||||
gi|568815551:1197321-1201446 4126 793 4126 + gi|568815564:1286641-1289973 3333 0 3333 3333 3333 0 NM:i:0 ms:i:6666 AS:i:6666 nn:i:0 tp:A:S cm:i:615 s1:i:3324 de:f:0 rl:i:0 cg:Z:3333M
|
||||
gi|568815551:1197321-1201446 4126 641 4126 + gi|568815561:1196951-1200436 3486 0 3486 3409 3487 0 NM:i:78 ms:i:6504 AS:i:6504 nn:i:0 tp:A:S cm:i:456 s1:i:2855 de:f:0.0221 rl:i:0 cg:Z:235M1I1996M2D1253M
|
||||
gi|568815551:1197321-1201446 4126 706 4126 + gi|568815569:1240288-1243708 3421 0 3421 3343 3422 0 NM:i:79 ms:i:6368 AS:i:6368 nn:i:0 tp:A:S cm:i:455 s1:i:2819 de:f:0.0228 rl:i:0 cg:Z:170M1I1996M2D1253M
|
||||
gi|568815551:1197321-1201446 4126 701 4126 + gi|568815592:29942469-29945883 3415 0 3410 3296 3432 0 NM:i:136 ms:i:6078 AS:i:6078 nn:i:0 tp:A:S cm:i:381 s1:i:2471 de:f:0.0334 rl:i:0 cg:Z:1212M1I130M3I1M1I144M17I495M3D183M1D238M3D1000M
|
||||
gi|568815561:1196951-1200436 3486 65 3486 + gi|568815569:1240288-1243708 3421 0 3421 3398 3421 0 NM:i:23 ms:i:6704 AS:i:6704 nn:i:0 tp:A:S cm:i:574 s1:i:3257 de:f:0.0067 rl:i:0 cg:Z:3421M
|
||||
gi|568815561:1196951-1200436 3486 0 3486 + gi|568815567:1196244-1200852 4609 1124 4609 3435 3487 0 NM:i:52 ms:i:6660 AS:i:6660 nn:i:0 tp:A:S cm:i:518 s1:i:3068 de:f:0.0146 rl:i:0 cg:Z:235M1D1996M2I1253M
|
||||
gi|568815561:1196951-1200436 3486 152 3486 + gi|568815564:1286641-1289973 3333 0 3333 3257 3335 0 NM:i:78 ms:i:6200 AS:i:6200 nn:i:0 tp:A:S cm:i:426 s1:i:2708 de:f:0.0231 rl:i:0 cg:Z:83M1D1996M2I1253M
|
||||
gi|568815561:1196951-1200436 3486 60 3486 + gi|568815592:29942469-29945883 3415 0 3410 3298 3434 0 NM:i:136 ms:i:6084 AS:i:6084 nn:i:0 tp:A:S cm:i:380 s1:i:2501 de:f:0.0328 rl:i:0 cg:Z:175M1D1036M1I126M4I149M17I495M3D165M2I18M1D238M3D1000M
|
||||
gi|568815564:1286641-1289973 3333 0 3333 + gi|568815567:1196244-1200852 4609 1276 4609 3271 3333 0 NM:i:62 ms:i:6294 AS:i:6294 nn:i:0 tp:A:S cm:i:459 s1:i:2836 de:f:0.0186 rl:i:0 cg:Z:3333M
|
||||
gi|568815564:1286641-1289973 3333 0 3333 + gi|568815569:1240288-1243708 3421 87 3421 3256 3335 0 NM:i:79 ms:i:6194 AS:i:6194 nn:i:0 tp:A:S cm:i:439 s1:i:2735 de:f:0.0234 rl:i:0 cg:Z:83M1I1996M2D1253M
|
||||
gi|568815564:1286641-1289973 3333 0 3333 + gi|568815592:29942469-29945883 3415 92 3410 3206 3340 0 NM:i:134 ms:i:5906 AS:i:5906 nn:i:0 tp:A:S cm:i:370 s1:i:2404 de:f:0.0338 rl:i:0 cg:Z:1120M1I130M3I1M1I144M17I495M3D183M1D238M3D1000M
|
||||
gi|568815567:1196244-1200852 4609 1189 4609 + gi|568815569:1240288-1243708 3421 0 3421 3368 3422 0 NM:i:54 ms:i:6518 AS:i:6518 nn:i:0 tp:A:S cm:i:514 s1:i:3034 de:f:0.0155 rl:i:0 cg:Z:170M1I1996M2D1253M
|
||||
gi|568815567:1196244-1200852 4609 1184 4609 + gi|568815592:29942469-29945883 3415 0 3410 3293 3432 0 NM:i:139 ms:i:6064 AS:i:6064 nn:i:0 tp:A:S cm:i:374 s1:i:2444 de:f:0.0340 rl:i:0 cg:Z:1212M1I126M4I149M17I495M3D183M1D238M3D1000M
|
||||
gi|568815569:1240288-1243708 3421 0 3421 + gi|568815592:29942469-29945883 3415 5 3410 3289 3429 0 NM:i:140 ms:i:6050 AS:i:6050 nn:i:0 tp:A:S cm:i:388 s1:i:2487 de:f:0.0341 rl:i:0 cg:Z:170M1D1036M1I126M4I149M17I495M3D165M2I18M1D238M3D1000M
|
||||
gi|342187237:5004-8419 3416 0 3416 + gi|568815529:1421891-1425306 3416 0 3416 3416 3416 0 NM:i:0 ms:i:6832 AS:i:6832 nn:i:0 tp:A:S cm:i:637 s1:i:3404 de:f:0 rl:i:0 cg:Z:3416M
|
||||
gi|342187237:5004-8419 3416 0 3416 + gi|568815454:1200216-1203631 3416 0 3416 3416 3416 0 NM:i:0 ms:i:6832 AS:i:6832 nn:i:0 tp:A:S cm:i:637 s1:i:3404 de:f:0 rl:i:0 cg:Z:3416M
|
||||
gi|342187237:5004-8419 3416 0 3416 + gi|568815592:29942469-29945883 3415 0 3415 3371 3416 0 NM:i:45 ms:i:6560 AS:i:6560 nn:i:0 tp:A:S cm:i:540 s1:i:3085 de:f:0.0132 rl:i:0 cg:Z:1212M1I2203M
|
||||
gi|342187237:5004-8419 3416 0 3411 + gi|568815567:1196244-1200852 4609 1184 4609 3297 3432 0 NM:i:135 ms:i:6090 AS:i:6090 nn:i:0 tp:A:S cm:i:381 s1:i:2452 de:f:0.0329 rl:i:0 cg:Z:1339M4D149M17D495M3I183M1I238M3I1000M
|
||||
gi|342187237:5004-8419 3416 0 3416 + gi|528476637:29857558-29915771 58214 54784 58214 3296 3437 0 NM:i:141 ms:i:6060 AS:i:6060 nn:i:0 tp:A:S cm:i:389 s1:i:2505 de:f:0.0348 rl:i:0 cg:Z:1343M3D1M1D144M17D495M3I183M1I238M3I1005M
|
||||
gi|342187237:5004-8419 3416 0 3411 + gi|568815551:1197321-1201446 4126 701 4126 3289 3432 0 NM:i:143 ms:i:6038 AS:i:6038 nn:i:0 tp:A:S cm:i:385 s1:i:2485 de:f:0.0355 rl:i:0 cg:Z:1343M3D1M1D144M17D495M3I183M1I238M3I1000M
|
||||
gi|342187237:5004-8419 3416 0 3411 + gi|568815561:1196951-1200436 3486 60 3486 3290 3434 0 NM:i:144 ms:i:6038 AS:i:6038 nn:i:0 tp:A:S cm:i:371 s1:i:2447 de:f:0.0352 rl:i:0 cg:Z:175M1I1163M4D149M17D495M3I165M2D18M1I238M3I1000M
|
||||
gi|342187237:5004-8419 3416 5 3411 + gi|568815569:1240288-1243708 3421 0 3421 3284 3429 0 NM:i:145 ms:i:6022 AS:i:6022 nn:i:0 tp:A:S cm:i:383 s1:i:2483 de:f:0.0355 rl:i:0 cg:Z:170M1I1163M4D149M17D495M3I165M2D18M1I238M3I1000M
|
||||
gi|342187237:5004-8419 3416 92 3411 + gi|568815564:1286641-1289973 3333 0 3333 3198 3340 0 NM:i:142 ms:i:5860 AS:i:5860 nn:i:0 tp:A:S cm:i:372 s1:i:2412 de:f:0.0362 rl:i:0 cg:Z:1251M3D1M1D144M17D495M3I183M1I238M3I1000M
|
||||
gi|342187237:5004-8419 3416 0 3416 + gi|528476637:29857558-29915771 58214 0 3428 3142 3464 0 NM:i:322 ms:i:5064 AS:i:5064 nn:i:0 tp:A:S cm:i:215 s1:i:1596 de:f:0.0772 rl:i:0 cg:Z:185M2I2M4I224M1D3M1I61M1I5M1D108M3D13M1I118M1I486M12I112M4D22M19D127M17D296M1I433M2I589M1I40M1D33M1I37M1I48M1I57M1D1M2I31M4I96M1D88M1I165M
|
||||
gi|342187237:5004-8419 3416 3 3416 + gi|528476637:29857558-29915771 58214 38484 41952 3039 3493 0 NM:i:454 ms:i:4320 AS:i:4320 nn:i:0 tp:A:S cm:i:107 s1:i:1001 de:f:0.1130 rl:i:0 cg:Z:34M1D52M1I123M2I1M1D255M1I4M1D11M1I21M1D12M4I3M1D2M1D4M2D59M3D33M3D38M1I3M2D60M1I25M1D277M1I327M1D132M16D164M5D6M2D207M2I74M7D52M20D363M1D41M3D90M1I103M6I96M1D6M1I117M1D2M1I208M1I132M2D26M4D60M1I165M
|
||||
gi|342187237:5004-8419 3416 1488 3158 + gi|528476637:29857558-29915771 58214 8636 10269 1295 1729 0 NM:i:434 ms:i:964 AS:i:970 nn:i:0 tp:A:S cm:i:10 s1:i:118 de:f:0.2026 rl:i:0 cg:Z:35M1I414M1D3M1I7M1I12M3D44M20D84M3I2M2I2M10I42M1D3M1I9M3I2M4I21M1D24M2I2M4I11M9D11M1D1M1D11M4I8M1D4M1D8M4I60M3I11M1D6M1D17M2I8M1D5M2D38M2D4M1D3M1I39M2I15M26I105M2D1M5D59M1I108M1I2M1D47M2I71M2I47M1D6M7I3M3I40M2I3M1D19M1D7M1D37M3I12M1I41M
|
||||
gi|342187237:5004-8419 3416 891 1307 + gi|528476637:29857558-29915771 58214 44457 44873 392 416 0 NM:i:24 ms:i:688 AS:i:688 nn:i:0 tp:A:S cm:i:36 s1:i:238 de:f:0.0577 rl:i:0 cg:Z:416M
|
||||
gi|528476637:29857558-29915771 58214 53600 58209 + gi|568815567:1196244-1200852 4609 0 4609 4559 4609 0 NM:i:50 ms:i:8918 AS:i:8918 nn:i:0 tp:A:S cm:i:729 s1:i:4180 de:f:0.0108 rl:i:25 cg:Z:4609M
|
||||
gi|528476637:29857558-29915771 58214 33375 41952 + gi|528476637:29857558-29915771 58214 49822 58214 7180 8967 0 NM:i:1787 ms:i:8814 AS:i:9504 nn:i:0 tp:A:S cm:i:225 s1:i:2063 de:f:0.1118 rl:i:25 cg:Z:24M4D11M3I103M2I43M2I32M3D51M1D139M5D1M1D573M3I3M2I49M1D3M1D13M2D5M1I189M1D36M17D448M1I3M1D215M3I35M4I263M8I23M1D91M1D279M1I137M310D48M4I225M6I3M1D3M350I6M2I46M1D379M1I54M1I85M2I21M1I6M90I167M1I74M1D1M2D236M1D10M4D48M19I109M4D346M1I52M1D125M1D271M1D21M1I12M4D3M1I2M1I4M2I57M2I3M1I32M3I40M1I62M1D25M1I277M1D311M3D2M1D14M1I148M1D170M7I207M2D66M2I5M6I2M1D39M3I10M20I173M1I189M1I41M3I8M3I79M1D103M6D96M1I6M1D328M1D132M2I26M4I60M1D165M
|
||||
gi|528476637:29857558-29915771 58214 49822 58214 + gi|528476637:29857558-29915771 58214 33375 41952 7180 8967 0 NM:i:1787 ms:i:8814 AS:i:9504 nn:i:0 tp:A:S cm:i:225 s1:i:2063 de:f:0.1118 rl:i:25 cg:Z:24M4I11M3D103M2D43M2D32M3I51M1I139M5I1M1I573M3D3M2D49M1I3M1I13M2I5M1D189M1I36M17I448M1D3M1I215M3D35M4D263M8D23M1I91M1I279M1D137M310I48M4D225M6D3M1I3M350D6M2D46M1I379M1D54M1D85M2D21M1D6M90D167M1D74M1I1M2I236M1I10M4I48M19D109M4I346M1D52M1I125M1I271M1I21M1D12M4I3M1D2M1D4M2D57M2D3M1D32M3D40M1D62M1I25M1D277M1I311M3I2M1I14M1D148M1I170M7D207M2I66M2D5M6D2M1I39M3D10M20D173M1D189M1D41M3D8M3D79M1I103M6I96M1D6M1I328M1I132M2D26M4D60M1I165M
|
||||
gi|528476637:29857558-29915771 58214 54083 58209 + gi|568815551:1197321-1201446 4126 0 4126 4107 4126 0 NM:i:19 ms:i:8138 AS:i:8138 nn:i:0 tp:A:S cm:i:726 s1:i:3964 de:f:0.0046 rl:i:25 cg:Z:4126M
|
||||
gi|528476637:29857558-29915771 58214 54876 58209 + gi|568815564:1286641-1289973 3333 0 3333 3317 3333 0 NM:i:16 ms:i:6570 AS:i:6570 nn:i:0 tp:A:S cm:i:578 s1:i:3203 de:f:0.0048 rl:i:25 cg:Z:3333M
|
||||
gi|528476637:29857558-29915771 58214 54724 58209 + gi|568815561:1196951-1200436 3486 0 3486 3417 3487 0 NM:i:70 ms:i:6552 AS:i:6552 nn:i:0 tp:A:S cm:i:469 s1:i:2920 de:f:0.0198 rl:i:25 cg:Z:235M1I1996M2D1253M
|
||||
gi|528476637:29857558-29915771 58214 54789 58209 + gi|568815569:1240288-1243708 3421 0 3421 3347 3422 0 NM:i:75 ms:i:6392 AS:i:6392 nn:i:0 tp:A:S cm:i:462 s1:i:2853 de:f:0.0216 rl:i:25 cg:Z:170M1I1996M2D1253M
|
||||
gi|528476637:29857558-29915771 58214 54784 58214 + gi|568815592:29942469-29945883 3415 0 3415 3305 3437 0 NM:i:132 ms:i:6112 AS:i:6112 nn:i:0 tp:A:S cm:i:393 s1:i:2554 de:f:0.0322 rl:i:25 cg:Z:1212M1I130M3I1M1I144M17I495M3D183M1D238M3D1005M
|
||||
gi|528476637:29857558-29915771 58214 54784 58214 + gi|568815454:1200216-1203631 3416 0 3416 3296 3437 0 NM:i:141 ms:i:6060 AS:i:6060 nn:i:0 tp:A:S cm:i:389 s1:i:2505 de:f:0.0348 rl:i:25 cg:Z:1343M3I1M1I144M17I495M3D183M1D238M3D1005M
|
||||
gi|528476637:29857558-29915771 58214 54784 58214 + gi|568815529:1421891-1425306 3416 0 3416 3296 3437 0 NM:i:141 ms:i:6060 AS:i:6060 nn:i:0 tp:A:S cm:i:389 s1:i:2505 de:f:0.0348 rl:i:25 cg:Z:1343M3I1M1I144M17I495M3D183M1D238M3D1005M
|
||||
gi|528476637:29857558-29915771 58214 37198 41947 + gi|568815567:1196244-1200852 4609 4 4609 4086 4791 0 NM:i:705 ms:i:5600 AS:i:5670 nn:i:0 tp:A:S cm:i:117 s1:i:1106 de:f:0.1146 rl:i:25 cg:Z:48M1I54M1I85M2I21M1I6M90I167M1I74M1D1M2D236M1D10M4D48M19I109M4D346M1I52M1D125M1D271M1D21M1I12M4D3M1I2M1I4M2I59M3I33M3I40M1I62M1D25M1I217M3D9M3I48M1D311M1D2M3D14M1I148M1D170M7I207M2D66M2I5M6I2M1D39M3I10M20I173M1I189M1I41M3I8M3I79M1D103M6D96M1I6M1D328M1D132M2I26M4I60M1D160M
|
||||
gi|528476637:29857558-29915771 58214 37770 41947 + gi|568815551:1197321-1201446 4126 0 4126 3656 4215 0 NM:i:559 ms:i:5146 AS:i:5146 nn:i:0 tp:A:S cm:i:119 s1:i:1088 de:f:0.1156 rl:i:25 cg:Z:216M1D10M4D48M19I109M4D346M1I52M1D123M1I1M2D254M1D5M1I11M1D21M1I12M4D3M1I2M1I4M2I57M2I3M1I32M3I40M1I62M1D25M1I277M1D311M3D2M1D14M1I148M1D170M7I207M2D66M2I5M6I2M1D39M3I10M20I173M1I189M1I41M3I8M3I79M1D103M6D96M1I6M1D328M1D132M2I26M4I60M1D160M
|
||||
gi|528476637:29857558-29915771 58214 0 3423 + gi|568815567:1196244-1200852 4609 1184 4609 3154 3460 0 NM:i:306 ms:i:5116 AS:i:5116 nn:i:0 tp:A:S cm:i:190 s1:i:1543 de:f:0.0767 rl:i:25 cg:Z:185M2D2M4D225M1I2M1D61M1D5M1I108M3I13M1D118M1D486M12D138M19I440M1D198M3I184M1I47M2D188M3I398M1D40M1I33M1D37M1D11M1D3M1I33M1D57M1I1M2D31M4D96M1I88M1D160M
|
||||
gi|528476637:29857558-29915771 58214 0 3428 + gi|528476637:29857558-29915771 58214 54784 58214 3155 3464 0 NM:i:309 ms:i:5110 AS:i:5110 nn:i:0 tp:A:S cm:i:202 s1:i:1617 de:f:0.0775 rl:i:25 cg:Z:185M2D2M4D225M1I2M1D61M1D5M1I108M3I13M1D118M1D486M12D138M19I440M1D198M3I184M1I47M2D188M3I398M1D40M1I33M1D37M1D48M1D57M1I1M2D31M4D96M1I88M1D165M
|
||||
gi|528476637:29857558-29915771 58214 54784 58214 + gi|528476637:29857558-29915771 58214 0 3428 3155 3464 0 NM:i:309 ms:i:5110 AS:i:5110 nn:i:0 tp:A:S cm:i:202 s1:i:1617 de:f:0.0775 rl:i:25 cg:Z:185M2I2M4I225M1D2M1I61M1I5M1D108M3D13M1I118M1I486M12I138M19D440M1I198M3D184M1D47M2I188M3D398M1I40M1D33M1I37M1I48M1I57M1D1M2I31M4I96M1D88M1I165M
|
||||
gi|528476637:29857558-29915771 58214 5 3423 + gi|568815569:1240288-1243708 3421 0 3421 3148 3458 0 NM:i:310 ms:i:5086 AS:i:5086 nn:i:0 tp:A:S cm:i:191 s1:i:1564 de:f:0.0774 rl:i:25 cg:Z:167M1D2M2I9M2D2M4D225M1I2M1D61M1D5M1I108M3I13M1D118M1D486M12D138M19I440M1D198M3I168M2D16M1I47M2D188M3I398M1D40M1I33M1D37M1D11M1D3M1I33M1D57M1I1M2D31M4D96M1I88M1D160M
|
||||
gi|528476637:29857558-29915771 58214 0 3428 + gi|568815529:1421891-1425306 3416 0 3416 3142 3464 0 NM:i:322 ms:i:5064 AS:i:5064 nn:i:0 tp:A:S cm:i:215 s1:i:1596 de:f:0.0772 rl:i:25 cg:Z:185M2D2M4D224M1I3M1D61M1D5M1I108M3I13M1D118M1D486M12D112M4I22M19I127M17I296M1D433M2D589M1D40M1I33M1D37M1D48M1D57M1I1M2D31M4D96M1I88M1D165M
|
||||
gi|528476637:29857558-29915771 58214 0 3428 + gi|568815454:1200216-1203631 3416 0 3416 3142 3464 0 NM:i:322 ms:i:5064 AS:i:5064 nn:i:0 tp:A:S cm:i:215 s1:i:1596 de:f:0.0772 rl:i:25 cg:Z:185M2D2M4D224M1I3M1D61M1D5M1I108M3I13M1D118M1D486M12D112M4I22M19I127M17I296M1D433M2D589M1D40M1I33M1D37M1D48M1D57M1I1M2D31M4D96M1I88M1D165M
|
||||
gi|528476637:29857558-29915771 58214 0 3423 + gi|568815561:1196951-1200436 3486 60 3486 3144 3463 0 NM:i:319 ms:i:5042 AS:i:5042 nn:i:0 tp:A:S cm:i:188 s1:i:1556 de:f:0.0799 rl:i:25 cg:Z:172M1D2M2I9M2D2M4D225M1I2M1D61M1D5M1I108M3I13M1D118M1D486M12D138M19I440M1D198M3I168M2D16M1I47M2D188M3I398M1D40M1I33M1D37M1D11M1D3M1I33M1D57M1I1M2D31M4D96M1I88M1D160M
|
||||
gi|528476637:29857558-29915771 58214 0 3423 + gi|568815551:1197321-1201446 4126 701 4126 3137 3459 0 NM:i:322 ms:i:5022 AS:i:5022 nn:i:0 tp:A:S cm:i:196 s1:i:1569 de:f:0.0814 rl:i:25 cg:Z:185M2D2M4D225M1I2M1D61M1D5M1I108M3I13M1D118M1D486M12D138M19I440M1D198M3I184M1I47M2D188M3I398M1D40M1I33M1D37M1D48M1D57M1I1M2D31M4D96M1I88M1D160M
|
||||
gi|528476637:29857558-29915771 58214 0 3428 + gi|568815592:29942469-29945883 3415 0 3415 3134 3463 0 NM:i:329 ms:i:5014 AS:i:5014 nn:i:0 tp:A:S cm:i:206 s1:i:1582 de:f:0.0799 rl:i:25 cg:Z:185M2D2M4D225M1I2M1D61M1D5M1I108M3I13M1D118M1D485M10D1M1D112M4I22M19I127M17I296M1D433M2D589M1D40M1I33M1D37M1D48M1D57M1I1M2D31M4D96M1I88M1D165M
|
||||
gi|528476637:29857558-29915771 58214 92 3423 + gi|568815564:1286641-1289973 3333 0 3333 3053 3367 0 NM:i:314 ms:i:4886 AS:i:4886 nn:i:0 tp:A:S cm:i:191 s1:i:1531 de:f:0.0813 rl:i:25 cg:Z:93M2D2M4D225M1I2M1D61M1D5M1I108M3I13M1D118M1D486M12D138M19I440M1D198M3I184M1I47M2D188M3I398M1D40M1I33M1D37M1D48M1D57M1I1M2D31M4D96M1I88M1D160M
|
||||
gi|528476637:29857558-29915771 58214 38484 42085 + gi|528476637:29857558-29915771 58214 3 3561 3171 3642 0 NM:i:471 ms:i:4520 AS:i:4520 nn:i:0 tp:A:S cm:i:135 s1:i:1107 de:f:0.1103 rl:i:25 cg:Z:34M1I52M1D95M2I2M4I22M1D202M1D2M1I67M1D19M1I104M1I9M3I47M1I87M1I277M1D106M1D7M2I2M1D68M12I114M1D2M3D20M17D1M1D142M1D164M5I6M2I120M1I86M2D74M7I58M14I6M5I1M1I209M2I139M1I42M2I1M1I88M1D103M6D96M1I6M1D106M1I40M1D33M1I37M1I52M1I84M4I101M1I26M4I358M
|
||||
gi|528476637:29857558-29915771 58214 3 3561 + gi|528476637:29857558-29915771 58214 38484 42085 3171 3642 0 NM:i:471 ms:i:4520 AS:i:4520 nn:i:0 tp:A:S cm:i:135 s1:i:1107 de:f:0.1103 rl:i:25 cg:Z:34M1D52M1I95M2D2M4D22M1I202M1I2M1D67M1I19M1D104M1D9M3D47M1D87M1D277M1I106M1I7M2D2M1I68M12D114M1I2M3I20M17I1M1I142M1I164M5D6M2D120M1D86M2I74M7D58M14D6M5D1M1D209M2D139M1D42M2D1M1D88M1I103M6I96M1D6M1I106M1D40M1I33M1D37M1D52M1D84M4D101M1D26M4D358M
|
||||
gi|528476637:29857558-29915771 58214 38421 41947 + gi|568815561:1196951-1200436 3486 0 3486 3090 3555 0 NM:i:465 ms:i:4352 AS:i:4352 nn:i:0 tp:A:S cm:i:95 s1:i:919 de:f:0.1166 rl:i:25 cg:Z:97M1I52M1D81M1I43M1D255M1D4M1I11M1D21M1I12M4D3M1I2M1I4M2I57M2I3M1I32M3I40M1I62M1D25M1I277M1D311M1D2M3D14M1I148M1D170M7I207M2D74M7I39M3I10M20I158M2D15M1I189M1I41M3I8M3I79M1D103M6D96M1I6M1D328M1D132M2I26M4I60M1D160M
|
||||
gi|528476637:29857558-29915771 58214 38484 41952 + gi|568815592:29942469-29945883 3415 3 3415 3041 3495 0 NM:i:454 ms:i:4326 AS:i:4326 nn:i:0 tp:A:S cm:i:110 s1:i:990 de:f:0.1121 rl:i:25 cg:Z:34M1I52M1D123M1I1M2D255M1D4M1I11M1D21M1I12M4D3M1I2M1I4M2I59M3I33M3I40M1I62M1D25M1I222M3D4M3I48M1D180M1I146M1I132M16I164M5I6M2I207M2D74M7I52M20I363M1I41M3I90M1D103M6D96M1I6M1D117M1I2M1D208M1D132M2I26M4I60M1D165M
|
||||
gi|528476637:29857558-29915771 58214 38484 41952 + gi|568815454:1200216-1203631 3416 3 3416 3039 3493 0 NM:i:454 ms:i:4320 AS:i:4320 nn:i:0 tp:A:S cm:i:107 s1:i:1001 de:f:0.1130 rl:i:25 cg:Z:34M1I52M1D123M1I1M2D255M1D4M1I11M1D21M1I12M4D3M1I2M1I4M2I59M3I33M3I38M1D3M2I60M1D25M1I277M1D327M1I132M16I164M5I6M2I207M2D74M7I52M20I363M1I41M3I90M1D103M6D96M1I6M1D117M1I2M1D208M1D132M2I26M4I60M1D165M
|
||||
gi|528476637:29857558-29915771 58214 38484 41952 + gi|568815529:1421891-1425306 3416 3 3416 3039 3493 0 NM:i:454 ms:i:4320 AS:i:4320 nn:i:0 tp:A:S cm:i:107 s1:i:1001 de:f:0.1130 rl:i:25 cg:Z:34M1I52M1D123M1I1M2D255M1D4M1I11M1D21M1I12M4D3M1I2M1I4M2I59M3I33M3I38M1D3M2I60M1D25M1I277M1D327M1I132M16I164M5I6M2I207M2D74M7I52M20I363M1I41M3I90M1D103M6D96M1I6M1D117M1I2M1D208M1D132M2I26M4I60M1D165M
|
||||
gi|528476637:29857558-29915771 58214 38486 41947 + gi|568815569:1240288-1243708 3421 0 3421 3037 3486 0 NM:i:449 ms:i:4310 AS:i:4310 nn:i:0 tp:A:S cm:i:97 s1:i:949 de:f:0.1154 rl:i:25 cg:Z:32M1I52M1D81M1I43M1D255M1D4M1I11M1D21M1I82M2I3M1I32M3I40M1I62M1D25M1I277M1D311M1D2M3D14M1I148M1D170M7I207M2D74M7I39M3I10M20I158M2D15M1I189M1I41M3I8M3I79M1D103M6D96M1I6M1D328M1D132M2I26M4I60M1D160M
|
||||
gi|528476637:29857558-29915771 58214 38573 41947 + gi|568815564:1286641-1289973 3333 0 3333 2962 3402 0 NM:i:440 ms:i:4198 AS:i:4198 nn:i:0 tp:A:S cm:i:100 s1:i:935 de:f:0.1145 rl:i:25 cg:Z:121M1I1M2D254M1D5M1I11M1D21M1I12M4D3M1I2M1I4M2I57M2I3M1I32M3I40M1I62M1D25M1I277M1D311M3D2M1D14M1I148M1D170M7I207M2D66M2I5M6I2M1D39M3I10M20I173M1I189M1I41M3I8M3I79M1D103M6D96M1I6M1D328M1D132M2I26M4I60M1D160M
|
||||
gi|528476637:29857558-29915771 58214 3555 4654 + gi|528476637:29857558-29915771 58214 43020 44118 982 1103 0 NM:i:121 ms:i:1478 AS:i:1478 nn:i:0 tp:A:S cm:i:30 s1:i:230 de:f:0.1065 rl:i:25 cg:Z:156M1I416M3D62M3I27M1I156M1D277M
|
||||
gi|528476637:29857558-29915771 58214 43020 44118 + gi|528476637:29857558-29915771 58214 3555 4654 982 1103 0 NM:i:121 ms:i:1478 AS:i:1478 nn:i:0 tp:A:S cm:i:30 s1:i:230 de:f:0.1065 rl:i:25 cg:Z:156M1D416M3I62M3D27M1D156M1I277M
|
||||
gi|528476637:29857558-29915771 58214 48998 49823 + gi|528476637:29857558-29915771 58214 31581 32408 735 834 0 NM:i:99 ms:i:1062 AS:i:1062 nn:i:0 tp:A:S cm:i:17 s1:i:194 de:f:0.1134 rl:i:25 cg:Z:9M2D100M1I166M1I2M1D93M1D142M1D28M2D3M2D113M1I3M3I4M1I155M
|
||||
gi|528476637:29857558-29915771 58214 31581 32408 + gi|528476637:29857558-29915771 58214 48998 49823 735 834 0 NM:i:99 ms:i:1062 AS:i:1062 nn:i:0 tp:A:S cm:i:17 s1:i:194 de:f:0.1134 rl:i:25 cg:Z:9M2I100M1D166M1D2M1I93M1I142M1I28M2I3M2I113M1D3M3D4M1D155M
|
||||
gi|528476637:29857558-29915771 58214 1488 3170 + gi|528476637:29857558-29915771 58214 8615 10269 1320 1753 0 NM:i:433 ms:i:1012 AS:i:1018 nn:i:0 tp:A:S cm:i:12 s1:i:120 de:f:0.1961 rl:i:25 cg:Z:11M2I45M1I260M1D153M1D3M1I7M1I12M3D41M14D4M6D78M3I6M5I3M7I55M5I2M2I21M1D26M2D2M6D11M1I6M2I5M2D11M4I8M1D4M1D8M4I59M3I12M1D6M1D17M2I8M1D5M2D38M2D47M2I15M26I22M1I7M1D75M2D1M5D22M1I5M1I6M1I3M3D20M1I115M1D44M5I3M1D1M1D17M1D41M1D2M2I7M1I3M1D36M2D6M7I3M3I63M1D3M5D37M3I2M2I9M1D41M
|
||||
gi|528476637:29857558-29915771 58214 8615 10269 + gi|528476637:29857558-29915771 58214 1488 3170 1320 1753 0 NM:i:433 ms:i:1012 AS:i:1018 nn:i:0 tp:A:S cm:i:12 s1:i:120 de:f:0.1961 rl:i:25 cg:Z:11M2D45M1D260M1I153M1I3M1D7M1D12M3I41M14I4M6I78M3D6M5D3M7D55M5D2M2D21M1I26M2I2M6I11M1D6M2D5M2I11M4D8M1I4M1I8M4D59M3D12M1I6M1I17M2D8M1I5M2I38M2I47M2D15M26D22M1D7M1I75M2I1M5I22M1D5M1D6M1D3M3I20M1D115M1I44M5D3M1I1M1I17M1I41M1I2M2D7M1D3M1I36M2I6M7D3M3D63M1I3M5I37M3D2M2D9M1I41M
|
||||
gi|528476637:29857558-29915771 58214 39969 41686 + gi|528476637:29857558-29915771 58214 8615 10266 1323 1759 0 NM:i:436 ms:i:974 AS:i:981 nn:i:0 tp:A:S cm:i:11 s1:i:113 de:f:0.2059 rl:i:25 cg:Z:11M2I12M1D32M1I131M1I1M5I6M1I202M2D69M4I9M1I2M3I15M3D162M15I32M1I5M6I31M1D26M2D1M4D14M1I6M2I5M2D11M4I8M1D4M1D8M4I55M3I23M1D17M2I54M2D4M1D3M1I43M1I23M27I1M1D51M5D1M1D33M2D1M2D6M3D55M2I6M1D38M1I4M1D24M1I5M1D74M1I6M1D2M1I1M1I61M2I49M1I7M5I3M3I63M1D3M1D41M3I2M2I9M1D38M
|
||||
gi|528476637:29857558-29915771 58214 8615 10266 + gi|528476637:29857558-29915771 58214 39969 41686 1323 1759 0 NM:i:436 ms:i:974 AS:i:981 nn:i:0 tp:A:S cm:i:11 s1:i:113 de:f:0.2059 rl:i:25 cg:Z:11M2D12M1I32M1D131M1D1M5D6M1D202M2I69M4D9M1D2M3D15M3I162M15D32M1D5M6D31M1I26M2I1M4I14M1D6M2D5M2I11M4D8M1I4M1I8M4D55M3D23M1I17M2D54M2I4M1I3M1D43M1D23M27D1M1I51M5I1M1I33M2I1M2I6M3I55M2D6M1I39M1I3M1D24M1D5M1I74M1D6M1I2M1D1M1D61M2D49M1D7M5D3M3D63M1I3M1I41M3D2M2D9M1I38M
|
||||
gi|528476637:29857558-29915771 58214 8636 10269 + gi|568815454:1200216-1203631 3416 1488 3158 1295 1726 0 NM:i:431 ms:i:964 AS:i:970 nn:i:0 tp:A:S cm:i:10 s1:i:118 de:f:0.2041 rl:i:25 cg:Z:35M1D414M1I3M1D7M1D12M3I44M20I84M3D2M2D2M10D42M1I3M1D9M3D2M4D21M1I30M6I7M1D3M2D11M1I1M1I11M4D8M1I4M1I8M4D60M3D11M1I6M1I17M2D8M1I5M2I38M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D71M2D47M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|528476637:29857558-29915771 58214 8636 10269 + gi|568815529:1421891-1425306 3416 1488 3158 1295 1726 0 NM:i:431 ms:i:964 AS:i:970 nn:i:0 tp:A:S cm:i:10 s1:i:118 de:f:0.2041 rl:i:25 cg:Z:35M1D414M1I3M1D7M1D12M3I44M20I84M3D2M2D2M10D42M1I3M1D9M3D2M4D21M1I30M6I7M1D3M2D11M1I1M1I11M4D8M1I4M1I8M4D60M3D11M1I6M1I17M2D8M1I5M2I38M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D71M2D47M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|528476637:29857558-29915771 58214 8636 10269 + gi|568815592:29942469-29945883 3415 1487 3157 1291 1726 0 NM:i:435 ms:i:944 AS:i:950 nn:i:0 tp:A:S cm:i:9 s1:i:103 de:f:0.2060 rl:i:25 cg:Z:35M1D414M1I3M1D7M1D12M3I44M20I84M3D2M2D2M10D42M1I3M1D9M3D2M4D21M1I30M6I7M1D3M2D11M2I12M4D8M1I4M1I8M4D60M3D11M1I6M1I17M2D8M1I5M2I38M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D71M2D47M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|528476637:29857558-29915771 58214 30702 31515 + gi|528476637:29857558-29915771 58214 45466 46301 718 857 0 NM:i:139 ms:i:940 AS:i:952 nn:i:0 tp:A:S cm:i:50 s1:i:326 de:f:0.1125 rl:i:25 cg:Z:36M2D6M1I4M3I8M3D14M2I4M1I10M2I15M1I27M1I80M1I63M1I128M32D197M7I1M2I3M1D15M2D1M1D138M3D41M
|
||||
gi|528476637:29857558-29915771 58214 45466 46301 + gi|528476637:29857558-29915771 58214 30702 31515 718 857 0 NM:i:139 ms:i:940 AS:i:952 nn:i:0 tp:A:S cm:i:50 s1:i:326 de:f:0.1125 rl:i:25 cg:Z:36M2I6M1D4M3D8M3I14M2D4M1D10M2D15M1D27M1D80M1D63M1D128M32I197M7D1M2D3M1I15M2I1M1I138M3I41M
|
||||
gi|528476637:29857558-29915771 58214 8629 10269 + gi|568815564:1286641-1289973 3333 1410 3080 1286 1731 0 NM:i:445 ms:i:888 AS:i:894 nn:i:0 tp:A:S cm:i:12 s1:i:132 de:f:0.2115 rl:i:25 cg:Z:42M1D414M1I3M1D7M1D12M3I21M1I2M2I18M20I79M3D3M4D2M6D1M2D58M3D2M3D21M1I30M6I11M1D6M1I4M3I13M3D10M1D2M2D7M4D60M3D11M1I6M1I17M2D8M1I5M2I8M2I2M1I25M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D69M2D49M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|528476637:29857558-29915771 58214 8629 10269 + gi|568815551:1197321-1201446 4126 2203 3873 1286 1731 0 NM:i:445 ms:i:888 AS:i:894 nn:i:0 tp:A:S cm:i:12 s1:i:132 de:f:0.2115 rl:i:25 cg:Z:42M1D414M1I3M1D7M1D12M3I21M1I2M2I18M20I79M3D3M4D2M6D1M2D58M3D2M3D21M1I30M6I11M1D6M1I4M3I13M3D10M1D2M2D7M4D60M3D11M1I6M1I17M2D8M1I5M2I8M2I2M1I25M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D69M2D49M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|528476637:29857558-29915771 58214 8629 10269 + gi|528476637:29857558-29915771 58214 56286 57956 1286 1731 0 NM:i:445 ms:i:888 AS:i:894 nn:i:0 tp:A:S cm:i:12 s1:i:132 de:f:0.2115 rl:i:25 cg:Z:42M1D414M1I3M1D7M1D12M3I21M1I2M2I18M20I79M3D3M4D2M6D1M2D58M3D2M3D21M1I30M6I11M1D6M1I4M3I13M3D10M1D2M2D7M4D60M3D11M1I6M1I17M2D8M1I5M2I8M2I2M1I25M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D69M2D49M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|528476637:29857558-29915771 58214 56286 57956 + gi|528476637:29857558-29915771 58214 8629 10269 1286 1732 0 NM:i:446 ms:i:888 AS:i:894 nn:i:0 tp:A:S cm:i:12 s1:i:132 de:f:0.2110 rl:i:25 cg:Z:42M1I414M1D3M1I7M1I12M3D21M1D2M2D18M20D78M12I3M2I1M2I2M1D58M3I2M3I21M1D30M6D11M1I6M1D4M3D13M3I10M1I2M2I7M4I60M3I11M1D6M1D17M2I8M1D5M2D8M2D2M1D25M2D4M1D3M1I39M2I15M26I105M2D1M5D59M1I108M1I2M1D47M2I69M2I49M1D6M7I3M3I40M2I3M1D19M1D7M1D37M3I12M1I41M
|
||||
gi|528476637:29857558-29915771 58214 8629 10269 + gi|568815561:1196951-1200436 3486 1561 3233 1285 1737 0 NM:i:452 ms:i:874 AS:i:880 nn:i:0 tp:A:S cm:i:10 s1:i:116 de:f:0.2107 rl:i:25 cg:Z:42M1D414M1I3M1D7M1D12M3I21M1I2M2I18M20I78M14D4M2D2M1I48M2D10M3D2M3D21M1I30M6I11M1D6M2D7M4I4M1I3M7D7M1I4M1I8M4D60M3D11M1I6M1I17M2D8M1I5M2I8M2I2M1I25M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D69M2D49M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|528476637:29857558-29915771 58214 8629 10269 + gi|568815567:1196244-1200852 4609 2686 4356 1284 1732 0 NM:i:448 ms:i:868 AS:i:874 nn:i:0 tp:A:S cm:i:9 s1:i:100 de:f:0.2132 rl:i:25 cg:Z:42M1D414M1I3M1D7M1D12M3I21M1I2M2I18M20I79M3D3M4D2M3D1M5D58M3D2M3D21M1I30M6I11M1D6M2D7M4I4M1I3M1D1M1D11M1D2M2D7M4D60M3D11M1I6M1I17M2D8M1I5M2I8M2I2M1I25M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D69M2D49M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|528476637:29857558-29915771 58214 8629 10269 + gi|568815569:1240288-1243708 3421 1496 3168 1284 1736 0 NM:i:452 ms:i:868 AS:i:874 nn:i:0 tp:A:S cm:i:10 s1:i:116 de:f:0.2118 rl:i:25 cg:Z:42M1D414M1I3M1D7M1D12M3I21M1I2M2I18M20I79M3D3M4D3M8D48M2D10M3D2M3D21M1I30M6I11M1D6M2D7M4I4M1I3M7D7M1I4M1I8M4D60M3D11M1I6M1I17M2D8M1I5M2I8M2I2M1I25M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D69M2D49M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|528476637:29857558-29915771 58214 27052 28249 + gi|528476637:29857558-29915771 58214 4739 5908 925 1206 0 NM:i:281 ms:i:726 AS:i:726 nn:i:0 tp:A:S cm:i:8 s1:i:95 de:f:0.2181 rl:i:25 cg:Z:100M1D5M1I139M7I13M1I133M7I80M1D58M1I6M1D70M1I31M2D5M1I15M1I3M1I16M1I3M1D168M9I2M1I48M2I113M2D73M1I5M1D15M1I23M1I36M
|
||||
gi|528476637:29857558-29915771 58214 4739 5908 + gi|528476637:29857558-29915771 58214 27052 28249 925 1207 0 NM:i:282 ms:i:726 AS:i:726 nn:i:0 tp:A:S cm:i:8 s1:i:95 de:f:0.2174 rl:i:25 cg:Z:100M1I5M1D139M7D13M1D133M7D80M1I58M1D6M1I70M1D31M2I5M1D15M1D3M1D17M1I2M1D168M9D2M1D48M2D113M2I73M2I4M2D15M1D23M1D36M
|
||||
gi|528476637:29857558-29915771 58214 44457 44873 + gi|568815569:1240288-1243708 3421 885 1301 398 416 0 NM:i:18 ms:i:724 AS:i:724 nn:i:0 tp:A:S cm:i:39 s1:i:284 de:f:0.0433 rl:i:25 cg:Z:416M
|
||||
gi|528476637:29857558-29915771 58214 44457 44873 + gi|568815567:1196244-1200852 4609 2075 2491 398 416 0 NM:i:18 ms:i:724 AS:i:724 nn:i:0 tp:A:S cm:i:39 s1:i:295 de:f:0.0433 rl:i:25 cg:Z:416M
|
||||
gi|528476637:29857558-29915771 58214 44457 44873 + gi|568815592:29942469-29945883 3415 891 1306 398 416 0 NM:i:18 ms:i:722 AS:i:722 nn:i:0 tp:A:S cm:i:42 s1:i:282 de:f:0.0433 rl:i:25 cg:Z:321M1I94M
|
||||
gi|528476637:29857558-29915771 58214 44457 44873 + gi|568815561:1196951-1200436 3486 950 1366 397 416 0 NM:i:19 ms:i:718 AS:i:718 nn:i:0 tp:A:S cm:i:36 s1:i:274 de:f:0.0457 rl:i:25 cg:Z:416M
|
||||
gi|528476637:29857558-29915771 58214 55675 56091 + gi|528476637:29857558-29915771 58214 44457 44873 396 416 0 NM:i:20 ms:i:712 AS:i:712 nn:i:0 tp:A:S cm:i:37 s1:i:254 de:f:0.0481 rl:i:25 cg:Z:416M
|
||||
gi|528476637:29857558-29915771 58214 44457 44873 + gi|568815551:1197321-1201446 4126 1592 2008 396 416 0 NM:i:20 ms:i:712 AS:i:712 nn:i:0 tp:A:S cm:i:37 s1:i:254 de:f:0.0481 rl:i:25 cg:Z:416M
|
||||
gi|528476637:29857558-29915771 58214 44457 44873 + gi|568815564:1286641-1289973 3333 799 1215 396 416 0 NM:i:20 ms:i:712 AS:i:712 nn:i:0 tp:A:S cm:i:37 s1:i:254 de:f:0.0481 rl:i:25 cg:Z:416M
|
||||
gi|528476637:29857558-29915771 58214 44457 44873 + gi|528476637:29857558-29915771 58214 55675 56091 396 416 0 NM:i:20 ms:i:712 AS:i:712 nn:i:0 tp:A:S cm:i:37 s1:i:254 de:f:0.0481 rl:i:25 cg:Z:416M
|
||||
gi|528476637:29857558-29915771 58214 44457 44873 + gi|568815454:1200216-1203631 3416 891 1307 392 416 0 NM:i:24 ms:i:688 AS:i:688 nn:i:0 tp:A:S cm:i:36 s1:i:238 de:f:0.0577 rl:i:25 cg:Z:416M
|
||||
gi|528476637:29857558-29915771 58214 44457 44873 + gi|568815529:1421891-1425306 3416 891 1307 392 416 0 NM:i:24 ms:i:688 AS:i:688 nn:i:0 tp:A:S cm:i:36 s1:i:238 de:f:0.0577 rl:i:25 cg:Z:416M
|
||||
gi|528476637:29857558-29915771 58214 886 1289 + gi|528476637:29857558-29915771 58214 44457 44872 368 415 0 NM:i:47 ms:i:568 AS:i:568 nn:i:0 tp:A:S cm:i:17 s1:i:133 de:f:0.0891 rl:i:25 cg:Z:324M12D79M
|
||||
gi|528476637:29857558-29915771 58214 44457 44872 + gi|528476637:29857558-29915771 58214 886 1289 368 415 0 NM:i:47 ms:i:568 AS:i:568 nn:i:0 tp:A:S cm:i:17 s1:i:133 de:f:0.0891 rl:i:25 cg:Z:324M12I79M
|
||||
gi|528476637:29857558-29915771 58214 44457 44872 + gi|528476637:29857558-29915771 58214 39378 39792 361 418 0 NM:i:57 ms:i:496 AS:i:496 nn:i:0 tp:A:S cm:i:7 s1:i:93 de:f:0.1280 rl:i:25 cg:Z:85M3I4M3D48M1I274M
|
||||
gi|528476637:29857558-29915771 58214 39378 39792 + gi|528476637:29857558-29915771 58214 44457 44872 361 418 0 NM:i:57 ms:i:496 AS:i:496 nn:i:0 tp:A:S cm:i:7 s1:i:93 de:f:0.1280 rl:i:25 cg:Z:85M3D4M3I48M1D274M
|
||||
gi|528476637:29857558-29915771 58214 49208 49824 + gi|528476637:29857558-29915771 58214 7043 7661 489 643 0 NM:i:154 ms:i:370 AS:i:370 nn:i:0 tp:A:S cm:i:5 s1:i:47 de:f:0.2049 rl:i:25 cg:Z:26M4I20M1D64M2I7M1D1M1D39M9D5M2D5M4D75M2I8M1D4M2I25M1I11M1D5M1D2M2I4M1D4M1D7M5I7M1I133M1I49M1I29M4I5M3D3M1D53M
|
||||
gi|528476637:29857558-29915771 58214 7043 7661 + gi|528476637:29857558-29915771 58214 49208 49824 489 643 0 NM:i:154 ms:i:370 AS:i:370 nn:i:0 tp:A:S cm:i:5 s1:i:47 de:f:0.2049 rl:i:25 cg:Z:26M4D20M1I64M2D7M1I1M1I39M9I5M2I5M4I75M2D8M1I4M2D25M1D11M1I5M1I2M2D4M1I4M1I7M5D7M1D133M1D49M1D29M4D5M3I3M1I53M
|
||||
gi|528476637:29857558-29915771 58214 29092 29357 - gi|528476637:29857558-29915771 58214 28378 28643 236 265 0 NM:i:29 ms:i:356 AS:i:356 nn:i:0 tp:A:S cm:i:4 s1:i:46 de:f:0.1094 zd:i:1 rl:i:25 cg:Z:265M
|
||||
gi|528476637:29857558-29915771 58214 28378 28643 - gi|528476637:29857558-29915771 58214 29092 29357 236 265 31 NM:i:29 ms:i:356 AS:i:356 nn:i:0 tp:A:P cm:i:4 s1:i:46 s2:i:0 de:f:0.1094 zd:i:2 rl:i:25 cg:Z:265M
|
||||
gi|528476637:29857558-29915771 58214 45137 45465 - gi|528476637:29857558-29915771 58214 14421 14731 269 329 0 NM:i:60 ms:i:318 AS:i:318 nn:i:0 tp:A:S cm:i:3 s1:i:42 de:f:0.1433 rl:i:25 cg:Z:35M1D115M1I2M14I113M1I28M3I16M
|
||||
gi|528476637:29857558-29915771 58214 14421 14731 - gi|528476637:29857558-29915771 58214 45137 45465 269 329 0 NM:i:60 ms:i:318 AS:i:318 nn:i:0 tp:A:S cm:i:3 s1:i:42 de:f:0.1433 rl:i:25 cg:Z:14M3D30M1D113M14D2M1D114M1I36M
|
||||
gi|528476637:29857558-29915771 58214 6307 7004 - gi|528476637:29857558-29915771 58214 6307 7004 528 727 0 NM:i:199 ms:i:272 AS:i:272 nn:i:0 tp:A:S cm:i:4 s1:i:44 de:f:0.2392 rl:i:25 cg:Z:11M1D155M1I43M2D64M2I1M1I6M3I5M2I1M2I6M1D9M2I3M3D6M8I5M1I8M1I5M1I10M1D5M1D5M1D8M8D5M3I4M2D3M2D13M2D7M5D70M2I43M1D154M1I12M
|
||||
gi|528476637:29857558-29915771 58214 8056 8300 + gi|528476637:29857558-29915771 58214 8056 8376 225 321 0 NM:i:96 ms:i:258 AS:i:271 nn:i:0 tp:A:S cm:i:7 s1:i:51 de:f:0.0816 rl:i:25 cg:Z:129M77D89M1I25M
|
||||
gi|528476637:29857558-29915771 58214 8056 8376 + gi|528476637:29857558-29915771 58214 8056 8300 225 321 0 NM:i:96 ms:i:258 AS:i:271 nn:i:0 tp:A:S cm:i:7 s1:i:51 de:f:0.0816 rl:i:25 cg:Z:129M77I89M1D25M
|
||||
gi|528476637:29857558-29915771 58214 17754 17858 + gi|528476637:29857558-29915771 58214 17845 17947 98 104 0 NM:i:6 ms:i:172 AS:i:172 nn:i:0 tp:A:S cm:i:8 s1:i:52 de:f:0.0485 rl:i:25 cg:Z:13M2I89M
|
||||
gi|528476637:29857558-29915771 58214 17845 17947 + gi|528476637:29857558-29915771 58214 17754 17858 98 104 0 NM:i:6 ms:i:172 AS:i:172 nn:i:0 tp:A:S cm:i:8 s1:i:52 de:f:0.0485 rl:i:25 cg:Z:13M2D89M
|
||||
gi|157734152:29655295-29712160 56866 0 46508 + gi|528476637:29857558-29915771 58214 0 46366 45990 46508 0 NM:i:603 ms:i:90335 AS:i:90495 nn:i:85 tp:A:S cm:i:7995 s1:i:44368 de:f:0.0051 rl:i:96 cg:Z:412M1D2M1I907M4D23M18D6334M7I858M94I3086M37D2996M9D806M2D2326M89I5050M1D4412M2I3477M4D393M1D344M2I610M4I1397M1D4480M1I2166M2D10M2D209M2I678M2I1528M1D21M2I2527M2D17M1I7M2I1114M18I91M
|
||||
gi|157734152:29655295-29712160 56866 12900 22956 + gi|528476637:29857558-29915771 58214 12858 22836 9939 10067 0 NM:i:128 ms:i:19554 AS:i:19623 nn:i:0 tp:A:S cm:i:5 s1:i:51 de:f:0.0031 rl:i:96 cg:Z:1820M9D806M2D2415M89I4926M
|
||||
gi|157734152:29655295-29712160 56866 47082 56866 + gi|528476637:29857558-29915771 58214 48429 58214 9630 9801 0 NM:i:171 ms:i:18606 AS:i:18606 nn:i:0 tp:A:S cm:i:1505 s1:i:8643 de:f:0.0150 rl:i:96 cg:Z:179M2D335M1D587M2D3229M2I161M13I113M1I180M8D563M1D518M3D3903M
|
||||
gi|157734152:29655295-29712160 56866 48470 56866 + gi|528476637:29857558-29915771 58214 33375 41952 7179 8982 60 NM:i:1803 ms:i:8784 AS:i:9498 nn:i:0 tp:A:P cm:i:223 s1:i:1956 s2:i:0 de:f:0.1112 zd:i:2 rl:i:96 cg:Z:24M4I11M3D103M2D43M2D32M3I51M1I139M5I1M1I573M3D3M2D49M1I3M1I13M2I5M1D189M1I36M17I448M1D3M1I215M3D35M4D263M8D23M1I91M1I279M1D133M325I52M4D50M1I175M6D3M359D48M1I379M1D54M1D84M3D21M1D6M90D168M1D72M2I2M1I236M1I10M1I48M19D109M4I346M1D52M1I123M2I1M1D254M1I5M1D11M1I21M1D12M4I3M1D2M1D4M2D57M2D3M1D32M3D40M1D62M1I25M1D277M1I311M3I2M1I14M1D148M1I170M7D207M2I66M2D5M6D2M1I39M3D10M20D173M1D189M1D41M3D8M3D79M1I103M6I96M1D6M1I117M1D2M1I208M1I132M2D26M4D60M1I165M
|
||||
gi|157734152:29655295-29712160 56866 33497 42074 + gi|528476637:29857558-29915771 58214 49822 58214 7174 8964 0 NM:i:1790 ms:i:8766 AS:i:9456 nn:i:0 tp:A:S cm:i:227 s1:i:2051 de:f:0.1132 rl:i:96 cg:Z:24M4D11M3I103M1I43M2I32M3D51M1D139M5D1M1D573M3I3M2I49M1D3M1D13M2D5M1I189M1D36M17D448M1I3M1D215M3I35M4I263M8I23M1D91M1D279M1I137M310D48M4I225M6I3M1D3M350I6M2I46M1D379M1I54M1I85M2I21M1I6M90I167M1I74M1D1M2D247M4D48M19I109M4D346M1I52M1D125M1D271M1D21M1I12M4D3M1I2M1I4M2I57M2I3M1I32M3I40M1I62M1D25M1I277M1D307M4D20M1I148M1D172M2I2M1I271M1I3M1I2M1I2M4I40M3I10M20I173M1I189M1I41M3I8M3I79M1D17M1D3M1I9M1I1M1I72M6D96M1I6M1D328M1D132M2I26M4I60M1D165M
|
||||
gi|157734152:29655295-29712160 56866 33497 42074 + gi|157734152:29655295-29712160 56866 48470 56866 7171 8978 60 NM:i:1807 ms:i:8732 AS:i:9446 nn:i:0 tp:A:P cm:i:226 s1:i:1962 s2:i:0 de:f:0.1127 zd:i:2 rl:i:96 cg:Z:24M4D11M3I103M1I43M2I32M3D51M1D139M5D1M1D573M3I3M2I49M1D3M1D13M2D5M1I189M1D36M17D448M1I3M1D215M3I35M4I263M8I23M1D91M1D279M1I133M325D52M4I50M1D175M6I3M359I48M1D379M1I54M1I84M3I21M1I6M90I168M1I72M2D2M1D236M1D59M19I109M4D346M1I52M1D123M1I1M2D254M1D5M1I11M1D21M1I12M4D3M1I2M1I4M2I57M2I3M1I32M3I40M1I62M1D25M1I277M1D307M4D20M1I148M1D172M2I2M1I271M1I3M1I2M1I2M4I40M3I10M20I173M1I189M1I41M3I8M3I79M1D30M1I1M1I72M6D96M1I6M1D116M1I3M1D208M1D132M2I26M4I60M1D165M
|
||||
gi|157734152:29655295-29712160 56866 48470 56866 + gi|157734152:29655295-29712160 56866 33497 42074 7171 8978 60 NM:i:1807 ms:i:8732 AS:i:9446 nn:i:0 tp:A:P cm:i:226 s1:i:1962 s2:i:0 de:f:0.1127 zd:i:2 rl:i:96 cg:Z:24M4I11M3D103M1D43M2D32M3I51M1I139M5I1M1I573M3D3M2D49M1I3M1I13M2I5M1D189M1I36M17I448M1D3M1I215M3D35M4D263M8D23M1I91M1I279M1D133M325I52M4D50M1I175M6D3M359D48M1I379M1D54M1D84M3D21M1D6M90D168M1D72M2I2M1I236M1I59M19D109M4I346M1D52M1I123M2I1M1D254M1I5M1D11M1I21M1D12M4I3M1D2M1D4M2D57M2D3M1D32M3D40M1D62M1I25M1D277M1I307M4I20M1D148M1I172M2D2M1D271M1D3M1D2M1D2M4D40M3D10M20D173M1D189M1D41M3D8M3D79M1I30M1D1M1D72M6I96M1D6M1I116M1D3M1I208M1I132M2D26M4D60M1I165M
|
||||
gi|157734152:29655295-29712160 56866 52256 56861 + gi|568815567:1196244-1200852 4609 0 4609 4503 4609 0 NM:i:106 ms:i:8582 AS:i:8582 nn:i:0 tp:A:S cm:i:628 s1:i:3840 de:f:0.0226 rl:i:96 cg:Z:189M1D518M3D3898M
|
||||
gi|157734152:29655295-29712160 56866 52738 56861 + gi|568815551:1197321-1201446 4126 0 4126 4100 4126 0 NM:i:26 ms:i:8098 AS:i:8098 nn:i:0 tp:A:S cm:i:722 s1:i:3930 de:f:0.0058 rl:i:96 cg:Z:225M3D3898M
|
||||
gi|157734152:29655295-29712160 56866 53528 56861 + gi|568815564:1286641-1289973 3333 0 3333 3317 3333 0 NM:i:16 ms:i:6570 AS:i:6570 nn:i:0 tp:A:S cm:i:585 s1:i:3212 de:f:0.0048 rl:i:96 cg:Z:3333M
|
||||
gi|157734152:29655295-29712160 56866 53376 56861 + gi|568815561:1196951-1200436 3486 0 3486 3397 3487 0 NM:i:90 ms:i:6432 AS:i:6432 nn:i:0 tp:A:S cm:i:442 s1:i:2777 de:f:0.0255 rl:i:96 cg:Z:235M1I1996M2D1253M
|
||||
gi|157734152:29655295-29712160 56866 53441 56861 + gi|568815569:1240288-1243708 3421 0 3421 3331 3422 0 NM:i:91 ms:i:6296 AS:i:6296 nn:i:0 tp:A:S cm:i:441 s1:i:2741 de:f:0.0263 rl:i:96 cg:Z:170M1I1996M2D1253M
|
||||
gi|157734152:29655295-29712160 56866 53436 56866 + gi|342187237:5004-8419 3416 0 3416 3310 3437 0 NM:i:127 ms:i:6144 AS:i:6144 nn:i:0 tp:A:S cm:i:427 s1:i:2612 de:f:0.0307 rl:i:96 cg:Z:1343M3I1M1I144M17I495M3D183M1D238M3D1005M
|
||||
gi|157734152:29655295-29712160 56866 53436 56866 + gi|568815454:1200216-1203631 3416 0 3416 3310 3437 0 NM:i:127 ms:i:6144 AS:i:6144 nn:i:0 tp:A:S cm:i:427 s1:i:2612 de:f:0.0307 rl:i:96 cg:Z:1343M3I1M1I144M17I495M3D183M1D238M3D1005M
|
||||
gi|157734152:29655295-29712160 56866 53436 56866 + gi|568815529:1421891-1425306 3416 0 3416 3310 3437 0 NM:i:127 ms:i:6144 AS:i:6144 nn:i:0 tp:A:S cm:i:427 s1:i:2612 de:f:0.0307 rl:i:96 cg:Z:1343M3I1M1I144M17I495M3D183M1D238M3D1005M
|
||||
gi|157734152:29655295-29712160 56866 53436 56866 + gi|568815592:29942469-29945883 3415 0 3415 3305 3437 0 NM:i:132 ms:i:6112 AS:i:6112 nn:i:0 tp:A:S cm:i:396 s1:i:2527 de:f:0.0322 rl:i:96 cg:Z:1212M1I130M3I1M1I144M17I495M3D183M1D238M3D1005M
|
||||
gi|157734152:29655295-29712160 56866 37319 42069 + gi|568815567:1196244-1200852 4609 4 4609 4082 4789 0 NM:i:707 ms:i:5566 AS:i:5636 nn:i:0 tp:A:S cm:i:119 s1:i:1112 de:f:0.1165 rl:i:96 cg:Z:48M1I54M1I85M2I21M1I6M90I167M1I74M1D1M2D247M4D48M19I109M4D346M1I52M1D125M1D271M1D21M1I12M4D3M1I2M1I4M2I59M3I33M3I40M1I62M1D25M1I217M3D9M3I48M1D307M4D20M1I148M1D169M3I276M1I3M1I2M1I2M4I40M3I10M20I173M1I189M1I41M3I8M3I79M1D17M1D3M1I9M1I1M1I72M6D96M1I6M1D328M1D132M2I26M4I60M1D160M
|
||||
gi|157734152:29655295-29712160 56866 43615 46576 + gi|157734152:29655295-29712160 56866 43615 46614 2915 3042 0 NM:i:127 ms:i:5546 AS:i:5600 nn:i:0 tp:A:S cm:i:16 s1:i:120 de:f:0.0031 rl:i:96 cg:Z:1340M41D41I1438M32D17M6D6M2D100M2I17M
|
||||
gi|157734152:29655295-29712160 56866 43615 46614 + gi|157734152:29655295-29712160 56866 43615 46576 2915 3042 0 NM:i:127 ms:i:5546 AS:i:5600 nn:i:0 tp:A:S cm:i:16 s1:i:120 de:f:0.0031 rl:i:96 cg:Z:1340M41I41D1438M32I17M6I6M2I100M2D17M
|
||||
gi|157734152:29655295-29712160 56866 0 3406 + gi|528476637:29857558-29915771 58214 54784 58214 3161 3445 0 NM:i:284 ms:i:5194 AS:i:5194 nn:i:0 tp:A:S cm:i:208 s1:i:1674 de:f:0.0746 rl:i:96 cg:Z:185M2D2M4D289M1D5M1I108M3I13M1D118M1D486M12D112M4D20M1I442M1D198M3I184M1I47M2D188M3I398M1D40M1I33M1D37M1D48M1D57M1I1M2D31M4D96M1I88M1D165M
|
||||
gi|157734152:29655295-29712160 56866 0 3401 + gi|568815567:1196244-1200852 4609 1184 4609 3157 3441 0 NM:i:284 ms:i:5182 AS:i:5182 nn:i:0 tp:A:S cm:i:194 s1:i:1592 de:f:0.0747 rl:i:96 cg:Z:185M2D2M4D289M1D5M1I108M3I13M1D118M1D486M12D112M4D20M1I442M1D198M3I184M1I47M2D188M3I398M1D40M1I33M1D37M1D11M1D3M1I33M1D57M1I1M2D31M4D96M1I88M1D160M
|
||||
gi|157734152:29655295-29712160 56866 5 3401 + gi|568815569:1240288-1243708 3421 0 3421 3152 3439 0 NM:i:287 ms:i:5158 AS:i:5158 nn:i:0 tp:A:S cm:i:196 s1:i:1628 de:f:0.0751 rl:i:96 cg:Z:167M1D2M2I9M2D2M4D289M1D5M1I108M3I13M1D118M1D486M12D112M4D20M1I442M1D198M3I168M2D16M1I47M2D188M3I398M1D40M1I33M1D37M1D11M1D3M1I33M1D57M1I1M2D31M4D96M1I88M1D160M
|
||||
gi|157734152:29655295-29712160 56866 0 3406 + gi|568815529:1421891-1425306 3416 0 3416 3143 3441 0 NM:i:298 ms:i:5126 AS:i:5126 nn:i:0 tp:A:S cm:i:206 s1:i:1579 de:f:0.0764 rl:i:96 cg:Z:185M2D2M4D289M1D5M1I108M3I13M1D118M1D486M12D132M1I129M17I296M1D433M2D589M1D40M1I33M1D37M1D48M1D57M1I1M2D31M4D96M1I88M1D165M
|
||||
gi|157734152:29655295-29712160 56866 0 3406 + gi|342187237:5004-8419 3416 0 3416 3143 3441 0 NM:i:298 ms:i:5126 AS:i:5126 nn:i:0 tp:A:S cm:i:206 s1:i:1579 de:f:0.0764 rl:i:96 cg:Z:185M2D2M4D289M1D5M1I108M3I13M1D118M1D486M12D132M1I129M17I296M1D433M2D589M1D40M1I33M1D37M1D48M1D57M1I1M2D31M4D96M1I88M1D165M
|
||||
gi|157734152:29655295-29712160 56866 0 3406 + gi|568815454:1200216-1203631 3416 0 3416 3143 3441 0 NM:i:298 ms:i:5126 AS:i:5126 nn:i:0 tp:A:S cm:i:206 s1:i:1579 de:f:0.0764 rl:i:96 cg:Z:185M2D2M4D289M1D5M1I108M3I13M1D118M1D486M12D132M1I129M17I296M1D433M2D589M1D40M1I33M1D37M1D48M1D57M1I1M2D31M4D96M1I88M1D165M
|
||||
gi|157734152:29655295-29712160 56866 37891 42069 + gi|568815551:1197321-1201446 4126 0 4126 3654 4213 0 NM:i:559 ms:i:5120 AS:i:5120 nn:i:0 tp:A:S cm:i:117 s1:i:1076 de:f:0.1174 rl:i:96 cg:Z:227M4D48M19I109M4D346M1I52M1D123M1I1M2D254M1D5M1I11M1D21M1I12M4D3M1I2M1I4M2I57M2I3M1I32M3I40M1I62M1D25M1I277M1D307M4D20M1I148M1D172M2I2M1I271M1I3M1I2M1I2M4I40M3I10M20I173M1I189M1I41M3I8M3I79M1D17M1D3M1I9M1I1M1I72M6D96M1I6M1D328M1D132M2I26M4I60M1D160M
|
||||
gi|157734152:29655295-29712160 56866 0 3401 + gi|568815561:1196951-1200436 3486 60 3486 3149 3444 0 NM:i:295 ms:i:5120 AS:i:5120 nn:i:0 tp:A:S cm:i:189 s1:i:1603 de:f:0.0774 rl:i:96 cg:Z:172M1D2M2I9M2D2M4D289M1D5M1I108M3I13M1D118M1D486M12D112M4D20M1I442M1D198M3I168M2D16M1I47M2D188M3I398M1D40M1I33M1D37M1D11M1D3M1I33M1D57M1I1M2D31M4D96M1I88M1D160M
|
||||
gi|157734152:29655295-29712160 56866 0 3406 + gi|568815592:29942469-29945883 3415 0 3415 3142 3440 0 NM:i:298 ms:i:5118 AS:i:5118 nn:i:0 tp:A:S cm:i:207 s1:i:1610 de:f:0.0770 rl:i:96 cg:Z:185M2D2M4D289M1D5M1I108M3I13M1D118M1D485M10D1M1D132M1I129M17I296M1D433M2D589M1D40M1I33M1D37M1D48M1D57M1I1M2D31M4D96M1I88M1D165M
|
||||
gi|157734152:29655295-29712160 56866 0 3401 + gi|568815551:1197321-1201446 4126 701 4126 3142 3440 0 NM:i:298 ms:i:5100 AS:i:5100 nn:i:0 tp:A:S cm:i:198 s1:i:1597 de:f:0.0789 rl:i:96 cg:Z:185M2D2M4D289M1D5M1I108M3I13M1D118M1D486M12D112M4D20M1I442M1D198M3I184M1I47M2D188M3I398M1D40M1I33M1D37M1D48M1D57M1I1M2D31M4D96M1I88M1D160M
|
||||
gi|157734152:29655295-29712160 56866 53436 56866 + gi|157734152:29655295-29712160 56866 0 3406 3142 3445 0 NM:i:303 ms:i:5080 AS:i:5080 nn:i:0 tp:A:S cm:i:193 s1:i:1577 de:f:0.0802 rl:i:96 cg:Z:185M2I2M4I289M1I5M1D108M3D13M1I118M1I486M12I112M4I20M1D442M1I198M3D184M1D47M2I188M3D398M1I40M1D33M1I37M1I48M1I57M1D1M2I31M4I96M1D88M1I165M
|
||||
gi|157734152:29655295-29712160 56866 0 3406 + gi|157734152:29655295-29712160 56866 53436 56866 3142 3445 0 NM:i:303 ms:i:5080 AS:i:5080 nn:i:0 tp:A:S cm:i:193 s1:i:1577 de:f:0.0802 rl:i:96 cg:Z:185M2D2M4D289M1D5M1I108M3I13M1D118M1D486M12D112M4D20M1I442M1D198M3I184M1I47M2D188M3I398M1D40M1I33M1D37M1D48M1D57M1I1M2D31M4D96M1I88M1D165M
|
||||
gi|157734152:29655295-29712160 56866 53436 56866 + gi|528476637:29857558-29915771 58214 0 3428 3137 3464 0 NM:i:327 ms:i:5002 AS:i:5002 nn:i:0 tp:A:S cm:i:191 s1:i:1549 de:f:0.0827 rl:i:96 cg:Z:185M2I2M4I225M1D2M1I61M1I5M1D108M3D13M1I118M1I486M12I138M19D440M1I198M3D184M1D47M2I188M3D398M1I40M1D33M1I37M1I48M1I57M1D1M2I31M4I96M1D88M1I165M
|
||||
gi|157734152:29655295-29712160 56866 92 3401 + gi|568815564:1286641-1289973 3333 0 3333 3058 3348 0 NM:i:290 ms:i:4964 AS:i:4964 nn:i:0 tp:A:S cm:i:193 s1:i:1559 de:f:0.0786 rl:i:96 cg:Z:93M2D2M4D289M1D5M1I108M3I13M1D118M1D486M12D112M4D20M1I442M1D198M3I184M1I47M2D188M3I398M1D40M1I33M1D37M1D48M1D57M1I1M2D31M4D96M1I88M1D160M
|
||||
gi|157734152:29655295-29712160 56866 3 3539 + gi|528476637:29857558-29915771 58214 38484 42085 3172 3624 0 NM:i:452 ms:i:4586 AS:i:4586 nn:i:0 tp:A:S cm:i:136 s1:i:1127 de:f:0.1080 rl:i:96 cg:Z:34M1D52M1I95M2D2M4D22M1I272M1I19M1D104M1D9M3D47M1D87M1D222M5I3M5D47M1I106M1I7M2D2M1I68M12D279M1I164M5D6M2D120M1D86M2I74M7D58M14D6M5D1M1D209M2D139M1D42M2D1M1D88M1I103M6I96M1D6M1I106M1D40M1I33M1D37M1D52M1D84M4D101M1D26M4D358M
|
||||
gi|157734152:29655295-29712160 56866 38606 42207 + gi|157734152:29655295-29712160 56866 3 3539 3166 3622 0 NM:i:456 ms:i:4550 AS:i:4550 nn:i:0 tp:A:S cm:i:135 s1:i:1116 de:f:0.1102 rl:i:96 cg:Z:34M1I52M1D95M2I2M4I22M1D272M1D19M1I104M1I9M3I47M1I87M1I222M5D3M5I47M1D106M1D7M2I2M1D68M12I279M1D169M3I121M1I162M7I58M14I6M5I1M1I209M2I139M1I42M2I1M1I88M1D30M1I1M1I72M6D96M1I6M1D106M1I40M1D33M1I37M1I52M1I85M4I100M1I26M4I358M
|
||||
gi|157734152:29655295-29712160 56866 3 3539 + gi|157734152:29655295-29712160 56866 38606 42207 3166 3622 0 NM:i:456 ms:i:4550 AS:i:4550 nn:i:0 tp:A:S cm:i:135 s1:i:1116 de:f:0.1102 rl:i:96 cg:Z:34M1D52M1I95M2D2M4D22M1I272M1I19M1D104M1D9M3D47M1D87M1D222M5I3M5D47M1I106M1I7M2D2M1I68M12D279M1I169M3D121M1D162M7D58M14D6M5D1M1D209M2D139M1D42M2D1M1D88M1I30M1D1M1D72M6I96M1D6M1I106M1D40M1I33M1D37M1D52M1D85M4D100M1D26M4D358M
|
||||
gi|157734152:29655295-29712160 56866 38606 42207 + gi|528476637:29857558-29915771 58214 3 3561 3162 3640 0 NM:i:478 ms:i:4470 AS:i:4470 nn:i:0 tp:A:S cm:i:132 s1:i:1092 de:f:0.1130 rl:i:96 cg:Z:34M1I52M1D95M2I2M4I22M1D202M1D2M1I67M1D19M1I104M1I9M3I47M1I87M1I277M1D106M1D7M2I2M1D68M12I110M4D26M17D1M1D142M1D169M3I121M1I162M7I58M14I6M5I1M1I209M2I139M1I42M2I1M1I88M1D30M1I1M1I72M6D96M1I6M1D106M1I40M1D33M1I37M1I52M1I85M4I100M1I26M4I358M
|
||||
gi|157734152:29655295-29712160 56866 38543 42069 + gi|568815561:1196951-1200436 3486 0 3486 3089 3554 0 NM:i:465 ms:i:4338 AS:i:4338 nn:i:0 tp:A:S cm:i:95 s1:i:925 de:f:0.1177 rl:i:96 cg:Z:97M1I52M1D81M1I43M1D255M1D4M1I11M1D21M1I12M4D3M1I2M1I4M2I57M2I3M1I32M3I40M1I62M1D25M1I277M1D307M4D20M1I148M1D169M3I284M7I39M3I10M20I158M2D15M1I189M1I41M3I8M3I79M1D17M1D3M1I9M1I1M1I72M6D96M1I6M1D328M1D132M2I26M4I60M1D160M
|
||||
gi|157734152:29655295-29712160 56866 38606 42074 + gi|568815592:29942469-29945883 3415 3 3415 3036 3493 0 NM:i:457 ms:i:4300 AS:i:4300 nn:i:0 tp:A:S cm:i:112 s1:i:1008 de:f:0.1138 rl:i:96 cg:Z:34M1I52M1D123M1I1M2D255M1D4M1I11M1D21M1I12M4D3M1I2M1I4M2I59M3I33M3I40M1I62M1D25M1I222M3D4M3I48M1D180M1I146M1I132M16I169M3I284M7I52M20I363M1I41M3I90M1D29M2I74M6D96M1I6M1D116M1I3M1D208M1D132M2I26M4I60M1D165M
|
||||
gi|157734152:29655295-29712160 56866 38606 42074 + gi|342187237:5004-8419 3416 3 3416 3034 3491 0 NM:i:457 ms:i:4294 AS:i:4294 nn:i:0 tp:A:S cm:i:108 s1:i:1013 de:f:0.1147 rl:i:96 cg:Z:34M1I52M1D123M1I1M2D255M1D4M1I11M1D21M1I12M4D3M1I2M1I4M2I59M3I33M3I38M1D3M2I60M1D25M1I277M1D327M1I132M16I169M3I284M7I52M20I363M1I41M3I90M1D29M2I74M6D96M1I6M1D116M1I3M1D208M1D132M2I26M4I60M1D165M
|
||||
gi|157734152:29655295-29712160 56866 38606 42074 + gi|568815454:1200216-1203631 3416 3 3416 3034 3491 0 NM:i:457 ms:i:4294 AS:i:4294 nn:i:0 tp:A:S cm:i:108 s1:i:1013 de:f:0.1147 rl:i:96 cg:Z:34M1I52M1D123M1I1M2D255M1D4M1I11M1D21M1I12M4D3M1I2M1I4M2I59M3I33M3I38M1D3M2I60M1D25M1I277M1D327M1I132M16I169M3I284M7I52M20I363M1I41M3I90M1D29M2I74M6D96M1I6M1D116M1I3M1D208M1D132M2I26M4I60M1D165M
|
||||
gi|157734152:29655295-29712160 56866 38606 42074 + gi|568815529:1421891-1425306 3416 3 3416 3034 3491 0 NM:i:457 ms:i:4294 AS:i:4294 nn:i:0 tp:A:S cm:i:108 s1:i:1013 de:f:0.1147 rl:i:96 cg:Z:34M1I52M1D123M1I1M2D255M1D4M1I11M1D21M1I12M4D3M1I2M1I4M2I59M3I33M3I38M1D3M2I60M1D25M1I277M1D327M1I132M16I169M3I284M7I52M20I363M1I41M3I90M1D29M2I74M6D96M1I6M1D116M1I3M1D208M1D132M2I26M4I60M1D165M
|
||||
gi|157734152:29655295-29712160 56866 38608 42069 + gi|568815569:1240288-1243708 3421 0 3421 3034 3485 0 NM:i:451 ms:i:4284 AS:i:4284 nn:i:0 tp:A:S cm:i:97 s1:i:955 de:f:0.1170 rl:i:96 cg:Z:32M1I52M1D81M1I43M1D255M1D4M1I11M1D21M1I82M2I3M1I32M3I40M1I62M1D25M1I277M1D307M4D20M1I148M1D169M3I284M7I39M3I10M20I158M2D15M1I189M1I41M3I8M3I79M1D17M1D3M1I9M1I1M1I72M6D96M1I6M1D328M1D132M2I26M4I60M1D160M
|
||||
gi|157734152:29655295-29712160 56866 38697 42069 + gi|568815564:1286641-1289973 3333 2 3333 2959 3398 0 NM:i:439 ms:i:4172 AS:i:4172 nn:i:0 tp:A:S cm:i:98 s1:i:923 de:f:0.1165 rl:i:96 cg:Z:119M1I1M2D254M1D5M1I11M1D21M1I12M4D3M1I2M1I4M2I57M2I3M1I32M3I40M1I62M1D25M1I277M1D307M4D20M1I148M1D172M2I2M1I271M1I3M1I2M1I2M4I40M3I10M20I173M1I189M1I41M3I8M3I79M1D17M1D3M1I9M1I1M1I72M6D96M1I6M1D328M1D132M2I26M4I60M1D160M
|
||||
gi|157734152:29655295-29712160 56866 3533 4632 + gi|528476637:29857558-29915771 58214 43020 44118 979 1103 0 NM:i:124 ms:i:1460 AS:i:1460 nn:i:0 tp:A:S cm:i:27 s1:i:217 de:f:0.1092 rl:i:96 cg:Z:156M1I416M3D62M3I27M1I156M1D277M
|
||||
gi|157734152:29655295-29712160 56866 43143 44241 + gi|528476637:29857558-29915771 58214 3555 4654 977 1103 0 NM:i:126 ms:i:1448 AS:i:1448 nn:i:0 tp:A:S cm:i:31 s1:i:245 de:f:0.1110 rl:i:96 cg:Z:156M1D416M3I62M3D27M1D156M1I277M
|
||||
gi|157734152:29655295-29712160 56866 43143 44241 + gi|157734152:29655295-29712160 56866 3533 4632 975 1103 0 NM:i:128 ms:i:1436 AS:i:1436 nn:i:0 tp:A:S cm:i:28 s1:i:232 de:f:0.1128 rl:i:96 cg:Z:156M1D416M3I62M3D27M1D156M1I277M
|
||||
gi|157734152:29655295-29712160 56866 3533 4632 + gi|157734152:29655295-29712160 56866 43143 44241 975 1103 0 NM:i:128 ms:i:1436 AS:i:1436 nn:i:0 tp:A:S cm:i:28 s1:i:232 de:f:0.1128 rl:i:96 cg:Z:156M1I416M3D62M3I27M1I156M1D277M
|
||||
gi|157734152:29655295-29712160 56866 47648 48471 + gi|528476637:29857558-29915771 58214 31581 32408 734 834 0 NM:i:100 ms:i:1064 AS:i:1064 nn:i:0 tp:A:S cm:i:19 s1:i:213 de:f:0.1114 rl:i:96 cg:Z:9M2D100M1I166M1I2M1D93M1D142M1D29M6D113M2I3M2I4M1I155M
|
||||
gi|157734152:29655295-29712160 56866 31699 32530 + gi|528476637:29857558-29915771 58214 48998 49823 733 838 0 NM:i:105 ms:i:1046 AS:i:1046 nn:i:0 tp:A:S cm:i:17 s1:i:193 de:f:0.1147 rl:i:96 cg:Z:9M2I100M1D166M1D2M1I93M1I142M1I31M8I113M1D3M3D4M1D155M
|
||||
gi|157734152:29655295-29712160 56866 47648 48471 + gi|157734152:29655295-29712160 56866 31699 32530 732 838 0 NM:i:106 ms:i:1044 AS:i:1044 nn:i:0 tp:A:S cm:i:19 s1:i:213 de:f:0.1138 rl:i:96 cg:Z:9M2D100M1I166M1I2M1D93M1D142M1D29M10D113M2I3M2I4M1I155M
|
||||
gi|157734152:29655295-29712160 56866 31699 32530 + gi|157734152:29655295-29712160 56866 47648 48471 732 838 0 NM:i:106 ms:i:1044 AS:i:1044 nn:i:0 tp:A:S cm:i:19 s1:i:213 de:f:0.1138 rl:i:96 cg:Z:9M2I100M1D166M1D2M1I93M1I142M1I29M10I113M2D3M2D4M1D155M
|
||||
gi|157734152:29655295-29712160 56866 8694 10348 + gi|528476637:29857558-29915771 58214 1488 3170 1320 1753 0 NM:i:433 ms:i:1012 AS:i:1018 nn:i:0 tp:A:S cm:i:12 s1:i:120 de:f:0.1961 rl:i:96 cg:Z:11M2D45M1D260M1I153M1I3M1D7M1D12M3I41M14I4M6I78M3D6M5D3M7D55M5D2M2D21M1I26M2I2M6I11M1D6M2D5M2I11M4D8M1I4M1I8M4D59M3D12M1I6M1I17M2D8M1I5M2I38M2I47M2D15M26D22M1D7M1I75M2I1M5I22M1D5M1D6M1D3M3I20M1D115M1I44M5D3M1I1M1I17M1I41M1I2M2D7M1D3M1I36M2I6M7D3M3D63M1I3M5I37M3D2M2D9M1I41M
|
||||
gi|157734152:29655295-29712160 56866 8694 10348 + gi|157734152:29655295-29712160 56866 1466 3148 1318 1753 0 NM:i:435 ms:i:1000 AS:i:1006 nn:i:0 tp:A:S cm:i:12 s1:i:120 de:f:0.1973 rl:i:96 cg:Z:11M2D45M1D260M1I153M1I3M1D7M1D12M3I41M14I4M6I78M3D6M5D3M7D55M5D2M2D21M1I26M2I2M6I11M1D6M2D5M2I11M4D8M1I4M1I8M4D59M3D12M1I6M1I17M2D8M1I5M2I38M2I47M2D15M26D22M1D7M1I75M2I1M5I22M1D5M1D6M1D3M3I20M1D115M1I44M5D3M1I1M1I17M1I41M1I2M2D7M1D3M1I36M2I6M7D3M3D63M1I3M5I37M3D2M2D9M1I41M
|
||||
gi|157734152:29655295-29712160 56866 1466 3148 + gi|528476637:29857558-29915771 58214 8615 10269 1318 1753 0 NM:i:435 ms:i:1000 AS:i:1006 nn:i:0 tp:A:S cm:i:12 s1:i:120 de:f:0.1973 rl:i:96 cg:Z:11M2I45M1I260M1D153M1D3M1I7M1I12M3D41M14D4M6D78M3I6M5I3M7I55M5I2M2I21M1D26M2D2M6D11M1I6M2I5M2D11M4I8M1D4M1D8M4I59M3I12M1D6M1D17M2I8M1D5M2D38M2D47M2I15M26I22M1I7M1D75M2D1M5D22M1I5M1I6M1I3M3D20M1I115M1D44M5I3M1D1M1D17M1D41M1D2M2I7M1I3M1D36M2D6M7I3M3I63M1D3M5D37M3I2M2I9M1D41M
|
||||
gi|157734152:29655295-29712160 56866 1466 3148 + gi|157734152:29655295-29712160 56866 8694 10348 1318 1753 0 NM:i:435 ms:i:1000 AS:i:1006 nn:i:0 tp:A:S cm:i:12 s1:i:120 de:f:0.1973 rl:i:96 cg:Z:11M2I45M1I260M1D153M1D3M1I7M1I12M3D41M14D4M6D78M3I6M5I3M7I55M5I2M2I21M1D26M2D2M6D11M1I6M2I5M2D11M4I8M1D4M1D8M4I59M3I12M1D6M1D17M2I8M1D5M2D38M2D47M2I15M26I22M1I7M1D75M2D1M5D22M1I5M1I6M1I3M3D20M1I115M1D44M5I3M1D1M1D17M1D41M1D2M2I7M1I3M1D36M2D6M7I3M3I63M1D3M5D37M3I2M2I9M1D41M
|
||||
gi|157734152:29655295-29712160 56866 40091 41811 + gi|528476637:29857558-29915771 58214 8615 10269 1326 1760 0 NM:i:434 ms:i:984 AS:i:993 nn:i:0 tp:A:S cm:i:7 s1:i:86 de:f:0.2060 rl:i:96 cg:Z:11M2I12M1D32M1I131M2I6M1I268M1I4M3I11M1I2M3I15M3D162M15I32M1I5M6I31M1D26M2D1M4D14M1I6M2I5M2D11M4I8M1D4M1D8M4I55M3I23M1D17M2I54M2D4M1D3M1I43M1I23M29I1M1D51M5D1M1D33M2D1M2D6M3D55M2I6M1D38M1I4M1D24M1I5M1D74M1I6M1D2M1I1M1I61M2I49M1I7M5I3M3I63M1D3M1D41M3I2M2I9M1D41M
|
||||
gi|157734152:29655295-29712160 56866 40091 41811 + gi|157734152:29655295-29712160 56866 8694 10348 1326 1760 0 NM:i:434 ms:i:984 AS:i:993 nn:i:0 tp:A:S cm:i:7 s1:i:86 de:f:0.2060 rl:i:96 cg:Z:11M2I12M1D32M1I131M2I6M1I268M1I4M3I11M1I2M3I15M3D162M15I32M1I5M6I31M1D26M2D1M4D14M1I6M2I5M2D11M4I8M1D4M1D8M4I55M3I23M1D17M2I54M2D4M1D3M1I43M1I23M29I1M1D51M5D1M1D33M2D1M2D6M3D55M2I6M1D38M1I4M1D24M1I5M1D74M1I6M1D2M1I1M1I61M2I49M1I7M5I3M3I63M1D3M1D41M3I2M2I9M1D41M
|
||||
gi|157734152:29655295-29712160 56866 8694 10348 + gi|157734152:29655295-29712160 56866 40091 41811 1326 1760 0 NM:i:434 ms:i:984 AS:i:993 nn:i:0 tp:A:S cm:i:7 s1:i:86 de:f:0.2060 rl:i:96 cg:Z:11M2D12M1I32M1D131M2D6M1D268M1D4M3D11M1D2M3D15M3I162M15D32M1D5M6D31M1I26M2I1M4I14M1D6M2D5M2I11M4D8M1I4M1I8M4D55M3D23M1I17M2D54M2I4M1I3M1D43M1D23M29D1M1I51M5I1M1I33M2I1M2I6M3I55M2D6M1I39M1I3M1D24M1D5M1I74M1D6M1I2M1D1M1D61M2D49M1D7M5D3M3D63M1I3M1I41M3D2M2D9M1I41M
|
||||
gi|157734152:29655295-29712160 56866 8694 10345 + gi|528476637:29857558-29915771 58214 39969 41686 1323 1759 0 NM:i:436 ms:i:974 AS:i:981 nn:i:0 tp:A:S cm:i:11 s1:i:113 de:f:0.2059 rl:i:96 cg:Z:11M2D12M1I32M1D131M1D1M5D6M1D202M2I69M4D9M1D2M3D15M3I162M15D32M1D5M6D31M1I26M2I1M4I14M1D6M2D5M2I11M4D8M1I4M1I8M4D55M3D23M1I17M2D54M2I4M1I3M1D43M1D23M27D1M1I51M5I1M1I33M2I1M2I6M3I55M2D6M1I39M1I3M1D24M1D5M1I74M1D6M1I2M1D1M1D61M2D49M1D7M5D3M3D63M1I3M1I41M3D2M2D9M1I38M
|
||||
gi|157734152:29655295-29712160 56866 8715 10348 + gi|342187237:5004-8419 3416 1488 3158 1295 1726 0 NM:i:431 ms:i:964 AS:i:970 nn:i:0 tp:A:S cm:i:10 s1:i:118 de:f:0.2041 rl:i:96 cg:Z:35M1D414M1I3M1D7M1D12M3I44M20I84M3D2M2D2M10D42M1I3M1D9M3D2M4D21M1I30M6I7M1D3M2D11M1I1M1I11M4D8M1I4M1I8M4D60M3D11M1I6M1I17M2D8M1I5M2I38M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D71M2D47M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|157734152:29655295-29712160 56866 8715 10348 + gi|568815529:1421891-1425306 3416 1488 3158 1295 1726 0 NM:i:431 ms:i:964 AS:i:970 nn:i:0 tp:A:S cm:i:10 s1:i:118 de:f:0.2041 rl:i:96 cg:Z:35M1D414M1I3M1D7M1D12M3I44M20I84M3D2M2D2M10D42M1I3M1D9M3D2M4D21M1I30M6I7M1D3M2D11M1I1M1I11M4D8M1I4M1I8M4D60M3D11M1I6M1I17M2D8M1I5M2I38M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D71M2D47M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|157734152:29655295-29712160 56866 8715 10348 + gi|568815454:1200216-1203631 3416 1488 3158 1295 1726 0 NM:i:431 ms:i:964 AS:i:970 nn:i:0 tp:A:S cm:i:10 s1:i:118 de:f:0.2041 rl:i:96 cg:Z:35M1D414M1I3M1D7M1D12M3I44M20I84M3D2M2D2M10D42M1I3M1D9M3D2M4D21M1I30M6I7M1D3M2D11M1I1M1I11M4D8M1I4M1I8M4D60M3D11M1I6M1I17M2D8M1I5M2I38M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D71M2D47M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|157734152:29655295-29712160 56866 45590 46424 + gi|528476637:29857558-29915771 58214 30702 31514 718 856 0 NM:i:138 ms:i:944 AS:i:956 nn:i:0 tp:A:S cm:i:50 s1:i:439 de:f:0.1114 zd:i:1 rl:i:96 cg:Z:36M2I6M1D4M3D8M3I14M2D4M1D10M2D15M1D27M1D80M1D63M1D128M32I197M7D1M2D3M1I15M2I1M1I138M3I40M
|
||||
gi|157734152:29655295-29712160 56866 8715 10348 + gi|568815592:29942469-29945883 3415 1487 3157 1291 1726 0 NM:i:435 ms:i:944 AS:i:950 nn:i:0 tp:A:S cm:i:9 s1:i:103 de:f:0.2060 rl:i:96 cg:Z:35M1D414M1I3M1D7M1D12M3I44M20I84M3D2M2D2M10D42M1I3M1D9M3D2M4D21M1I30M6I7M1D3M2D11M2I12M4D8M1I4M1I8M4D60M3D11M1I6M1I17M2D8M1I5M2I38M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D71M2D47M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|157734152:29655295-29712160 56866 30823 31632 + gi|157734152:29655295-29712160 56866 45590 46426 716 858 0 NM:i:142 ms:i:934 AS:i:946 nn:i:0 tp:A:S cm:i:47 s1:i:408 de:f:0.1106 zd:i:1 rl:i:96 cg:Z:36M2D5M7D20M4I3M2I4M1I10M2I15M1I27M1I80M1I63M1I128M32D48M1D148M7I1M2I3M1D15M2D1M1D138M3D42M
|
||||
gi|157734152:29655295-29712160 56866 45590 46426 + gi|157734152:29655295-29712160 56866 30823 31632 716 858 0 NM:i:142 ms:i:934 AS:i:946 nn:i:0 tp:A:S cm:i:47 s1:i:408 de:f:0.1106 zd:i:1 rl:i:96 cg:Z:36M2I5M7I20M4D3M2D4M1D10M2D15M1D27M1D80M1D63M1D128M32I48M1I148M7D1M2D3M1I15M2I1M1I138M3I42M
|
||||
gi|157734152:29655295-29712160 56866 30823 31630 + gi|528476637:29857558-29915771 58214 45466 46300 713 856 0 NM:i:143 ms:i:924 AS:i:936 nn:i:0 tp:A:S cm:i:47 s1:i:312 de:f:0.1121 rl:i:96 cg:Z:36M2D5M7D20M4I3M2I4M1I10M2I15M1I27M1I80M1I63M1I128M32D48M1D148M7I1M2I3M1D15M2D1M1D138M3D40M
|
||||
gi|157734152:29655295-29712160 56866 8708 10348 + gi|568815551:1197321-1201446 4126 2203 3873 1286 1731 0 NM:i:445 ms:i:888 AS:i:894 nn:i:0 tp:A:S cm:i:12 s1:i:132 de:f:0.2115 rl:i:96 cg:Z:42M1D414M1I3M1D7M1D12M3I21M1I2M2I18M20I79M3D3M4D2M6D1M2D58M3D2M3D21M1I30M6I11M1D6M1I4M3I13M3D10M1D2M2D7M4D60M3D11M1I6M1I17M2D8M1I5M2I8M2I2M1I25M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D69M2D49M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|157734152:29655295-29712160 56866 8708 10348 + gi|157734152:29655295-29712160 56866 54938 56608 1286 1731 0 NM:i:445 ms:i:888 AS:i:894 nn:i:0 tp:A:S cm:i:12 s1:i:132 de:f:0.2115 rl:i:96 cg:Z:42M1D414M1I3M1D7M1D12M3I21M1I2M2I18M20I79M3D3M4D2M6D1M2D58M3D2M3D21M1I30M6I11M1D6M1I4M3I13M3D10M1D2M2D7M4D60M3D11M1I6M1I17M2D8M1I5M2I8M2I2M1I25M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D71M2D47M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|157734152:29655295-29712160 56866 8708 10348 + gi|568815564:1286641-1289973 3333 1410 3080 1286 1731 0 NM:i:445 ms:i:888 AS:i:894 nn:i:0 tp:A:S cm:i:12 s1:i:132 de:f:0.2115 rl:i:96 cg:Z:42M1D414M1I3M1D7M1D12M3I21M1I2M2I18M20I79M3D3M4D2M6D1M2D58M3D2M3D21M1I30M6I11M1D6M1I4M3I13M3D10M1D2M2D7M4D60M3D11M1I6M1I17M2D8M1I5M2I8M2I2M1I25M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D69M2D49M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|157734152:29655295-29712160 56866 54938 56608 + gi|157734152:29655295-29712160 56866 8708 10348 1286 1732 0 NM:i:446 ms:i:888 AS:i:894 nn:i:0 tp:A:S cm:i:12 s1:i:132 de:f:0.2110 rl:i:96 cg:Z:42M1I414M1D3M1I7M1I12M3D21M1D2M2D18M20D78M12I3M2I1M2I2M1D58M3I2M3I21M1D30M6D11M1I6M1D4M3D13M3I10M1I2M2I7M4I60M3I11M1D6M1D17M2I8M1D5M2D8M2D2M1D25M2D4M1D3M1I39M2I15M26I105M2D1M5D59M1I108M1I2M1D47M2I71M2I47M1D6M7I3M3I40M2I3M1D19M1D7M1D37M3I12M1I41M
|
||||
gi|157734152:29655295-29712160 56866 8708 10348 + gi|528476637:29857558-29915771 58214 56286 57956 1286 1731 0 NM:i:445 ms:i:888 AS:i:894 nn:i:0 tp:A:S cm:i:12 s1:i:132 de:f:0.2115 rl:i:96 cg:Z:42M1D414M1I3M1D7M1D12M3I21M1I2M2I18M20I79M3D3M4D2M6D1M2D58M3D2M3D21M1I30M6I11M1D6M1I4M3I13M3D10M1D2M2D7M4D60M3D11M1I6M1I17M2D8M1I5M2I8M2I2M1I25M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D69M2D49M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|157734152:29655295-29712160 56866 54938 56608 + gi|528476637:29857558-29915771 58214 8629 10269 1286 1732 0 NM:i:446 ms:i:888 AS:i:894 nn:i:0 tp:A:S cm:i:12 s1:i:132 de:f:0.2110 rl:i:96 cg:Z:42M1I414M1D3M1I7M1I12M3D21M1D2M2D18M20D78M12I3M2I1M2I2M1D58M3I2M3I21M1D30M6D11M1I6M1D4M3D13M3I10M1I2M2I7M4I60M3I11M1D6M1D17M2I8M1D5M2D8M2D2M1D25M2D4M1D3M1I39M2I15M26I105M2D1M5D59M1I108M1I2M1D47M2I71M2I47M1D6M7I3M3I40M2I3M1D19M1D7M1D37M3I12M1I41M
|
||||
gi|157734152:29655295-29712160 56866 8708 10348 + gi|568815561:1196951-1200436 3486 1561 3233 1285 1737 0 NM:i:452 ms:i:874 AS:i:880 nn:i:0 tp:A:S cm:i:10 s1:i:116 de:f:0.2107 rl:i:96 cg:Z:42M1D414M1I3M1D7M1D12M3I21M1I2M2I18M20I78M14D4M2D2M1I48M2D10M3D2M3D21M1I30M6I11M1D6M2D7M4I4M1I3M7D7M1I4M1I8M4D60M3D11M1I6M1I17M2D8M1I5M2I8M2I2M1I25M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D69M2D49M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|157734152:29655295-29712160 56866 8708 10348 + gi|568815567:1196244-1200852 4609 2686 4356 1284 1732 0 NM:i:448 ms:i:868 AS:i:874 nn:i:0 tp:A:S cm:i:9 s1:i:100 de:f:0.2132 rl:i:96 cg:Z:42M1D414M1I3M1D7M1D12M3I21M1I2M2I18M20I79M3D3M4D2M3D1M5D58M3D2M3D21M1I30M6I11M1D6M2D7M4I4M1I3M1D1M1D11M1D2M2D7M4D60M3D11M1I6M1I17M2D8M1I5M2I8M2I2M1I25M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D69M2D49M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|157734152:29655295-29712160 56866 8708 10348 + gi|568815569:1240288-1243708 3421 1496 3168 1284 1736 0 NM:i:452 ms:i:868 AS:i:874 nn:i:0 tp:A:S cm:i:10 s1:i:116 de:f:0.2118 rl:i:96 cg:Z:42M1D414M1I3M1D7M1D12M3I21M1I2M2I18M20I79M3D3M4D3M8D48M2D10M3D2M3D21M1I30M6I11M1D6M2D7M4I4M1I3M7D7M1I4M1I8M4D60M3D11M1I6M1I17M2D8M1I5M2I8M2I2M1I25M2I4M1I3M1D39M2D15M26D105M2I1M5I59M1D108M1D2M1I47M2D69M2D49M1I6M7D3M3D40M2D3M1I19M1I7M1I37M3D12M1D41M
|
||||
gi|157734152:29655295-29712160 56866 46634 47076 + gi|157734152:29655295-29712160 56866 46006 46443 427 443 0 NM:i:16 ms:i:796 AS:i:796 nn:i:0 tp:A:S cm:i:59 s1:i:350 de:f:0.0251 rl:i:96 cg:Z:405M6I20M1D11M
|
||||
gi|157734152:29655295-29712160 56866 46006 46443 + gi|157734152:29655295-29712160 56866 46634 47076 427 442 0 NM:i:15 ms:i:796 AS:i:796 nn:i:0 tp:A:S cm:i:59 s1:i:350 de:f:0.0273 rl:i:96 cg:Z:405M4D21M1D11M
|
||||
gi|157734152:29655295-29712160 56866 46634 47073 + gi|528476637:29857558-29915771 58214 45882 46332 428 450 0 NM:i:22 ms:i:782 AS:i:782 nn:i:0 tp:A:S cm:i:56 s1:i:327 de:f:0.0295 rl:i:96 cg:Z:393M10D38M1D8M
|
||||
gi|157734152:29655295-29712160 56866 4717 5886 + gi|528476637:29857558-29915771 58214 27052 28249 926 1207 0 NM:i:281 ms:i:732 AS:i:732 nn:i:0 tp:A:S cm:i:8 s1:i:95 de:f:0.2166 rl:i:96 cg:Z:100M1I5M1D139M7D13M1D133M7D80M1I58M1D6M1I70M1D31M2I5M1D15M1D3M1D17M1I2M1D168M9D2M1D48M2D113M2I73M2I4M2D15M1D23M1D36M
|
||||
gi|157734152:29655295-29712160 56866 27171 28370 + gi|157734152:29655295-29712160 56866 4717 5886 925 1208 0 NM:i:283 ms:i:722 AS:i:722 nn:i:0 tp:A:S cm:i:8 s1:i:95 de:f:0.2181 rl:i:96 cg:Z:100M1D5M1I139M9I13M1I133M7I80M1D58M1I6M1D70M1I31M2D5M1I15M1I3M1I16M1I3M1D168M9I2M1I48M2I113M2D73M1I5M1D15M1I23M1I36M
|
||||
gi|157734152:29655295-29712160 56866 4717 5886 + gi|157734152:29655295-29712160 56866 27171 28370 925 1209 0 NM:i:284 ms:i:722 AS:i:722 nn:i:0 tp:A:S cm:i:8 s1:i:95 de:f:0.2174 rl:i:96 cg:Z:100M1I5M1D139M9D13M1D133M7D80M1I58M1D6M1I70M1D31M2I5M1D15M1D3M1D17M1I2M1D168M9D2M1D48M2D113M2I73M2I4M2D15M1D23M1D36M
|
||||
gi|157734152:29655295-29712160 56866 27171 28370 + gi|528476637:29857558-29915771 58214 4739 5908 924 1208 0 NM:i:284 ms:i:716 AS:i:716 nn:i:0 tp:A:S cm:i:8 s1:i:95 de:f:0.2189 rl:i:96 cg:Z:100M1D5M1I139M9I13M1I133M7I80M1D58M1I6M1D70M1I31M2D5M1I15M1I3M1I16M1I3M1D168M9I2M1I48M2I113M2D73M1I5M1D15M1I23M1I36M
|
||||
gi|157734152:29655295-29712160 56866 54327 54743 + gi|528476637:29857558-29915771 58214 44457 44873 396 416 0 NM:i:20 ms:i:712 AS:i:712 nn:i:0 tp:A:S cm:i:37 s1:i:254 de:f:0.0481 rl:i:96 cg:Z:416M
|
||||
gi|157734152:29655295-29712160 56866 44580 44996 + gi|568815569:1240288-1243708 3421 885 1301 396 416 0 NM:i:20 ms:i:712 AS:i:712 nn:i:0 tp:A:S cm:i:32 s1:i:246 de:f:0.0481 rl:i:96 cg:Z:416M
|
||||
gi|157734152:29655295-29712160 56866 44580 44996 + gi|568815567:1196244-1200852 4609 2075 2491 396 416 0 NM:i:20 ms:i:712 AS:i:712 nn:i:0 tp:A:S cm:i:32 s1:i:257 de:f:0.0481 rl:i:96 cg:Z:416M
|
||||
gi|157734152:29655295-29712160 56866 44580 44996 + gi|568815592:29942469-29945883 3415 891 1306 396 416 0 NM:i:20 ms:i:710 AS:i:710 nn:i:0 tp:A:S cm:i:35 s1:i:244 de:f:0.0481 rl:i:96 cg:Z:321M1I94M
|
||||
gi|157734152:29655295-29712160 56866 44580 44996 + gi|568815561:1196951-1200436 3486 950 1366 395 416 0 NM:i:21 ms:i:706 AS:i:706 nn:i:0 tp:A:S cm:i:29 s1:i:236 de:f:0.0505 rl:i:96 cg:Z:416M
|
||||
gi|157734152:29655295-29712160 56866 44580 44996 + gi|528476637:29857558-29915771 58214 55675 56091 393 416 0 NM:i:23 ms:i:694 AS:i:694 nn:i:0 tp:A:S cm:i:30 s1:i:216 de:f:0.0553 rl:i:96 cg:Z:416M
|
||||
gi|157734152:29655295-29712160 56866 44580 44996 + gi|568815551:1197321-1201446 4126 1592 2008 393 416 0 NM:i:23 ms:i:694 AS:i:694 nn:i:0 tp:A:S cm:i:30 s1:i:216 de:f:0.0553 rl:i:96 cg:Z:416M
|
||||
gi|157734152:29655295-29712160 56866 44580 44996 + gi|568815564:1286641-1289973 3333 799 1215 393 416 0 NM:i:23 ms:i:694 AS:i:694 nn:i:0 tp:A:S cm:i:30 s1:i:216 de:f:0.0553 rl:i:96 cg:Z:416M
|
||||
gi|157734152:29655295-29712160 56866 44580 44996 + gi|157734152:29655295-29712160 56866 54327 54743 393 416 0 NM:i:23 ms:i:694 AS:i:694 nn:i:0 tp:A:S cm:i:30 s1:i:216 de:f:0.0553 rl:i:96 cg:Z:416M
|
||||
gi|157734152:29655295-29712160 56866 54327 54743 + gi|157734152:29655295-29712160 56866 44580 44996 393 416 0 NM:i:23 ms:i:694 AS:i:694 nn:i:0 tp:A:S cm:i:30 s1:i:216 de:f:0.0553 rl:i:96 cg:Z:416M
|
||||
gi|157734152:29655295-29712160 56866 44580 44996 + gi|568815529:1421891-1425306 3416 891 1307 390 416 0 NM:i:26 ms:i:676 AS:i:676 nn:i:0 tp:A:S cm:i:29 s1:i:188 de:f:0.0625 rl:i:96 cg:Z:416M
|
||||
gi|157734152:29655295-29712160 56866 44580 44996 + gi|568815454:1200216-1203631 3416 891 1307 390 416 0 NM:i:26 ms:i:676 AS:i:676 nn:i:0 tp:A:S cm:i:29 s1:i:188 de:f:0.0625 rl:i:96 cg:Z:416M
|
||||
gi|157734152:29655295-29712160 56866 44580 44996 + gi|342187237:5004-8419 3416 891 1307 390 416 0 NM:i:26 ms:i:676 AS:i:676 nn:i:0 tp:A:S cm:i:29 s1:i:188 de:f:0.0625 rl:i:96 cg:Z:416M
|
||||
gi|157734152:29655295-29712160 56866 886 1289 + gi|528476637:29857558-29915771 58214 44457 44872 370 415 0 NM:i:45 ms:i:580 AS:i:580 nn:i:0 tp:A:S cm:i:16 s1:i:142 de:f:0.0842 rl:i:96 cg:Z:324M12D79M
|
||||
gi|157734152:29655295-29712160 56866 46651 47139 + gi|528476637:29857558-29915771 58214 31111 31578 418 497 0 NM:i:79 ms:i:570 AS:i:573 nn:i:0 tp:A:S cm:i:18 s1:i:159 de:f:0.1011 rl:i:96 cg:Z:196M7D1M2D3M1I15M2I1M1I138M3I30M23I74M
|
||||
gi|157734152:29655295-29712160 56866 44580 44995 + gi|157734152:29655295-29712160 56866 886 1289 368 415 0 NM:i:47 ms:i:568 AS:i:568 nn:i:0 tp:A:S cm:i:11 s1:i:116 de:f:0.0891 rl:i:96 cg:Z:324M12I79M
|
||||
gi|157734152:29655295-29712160 56866 886 1289 + gi|157734152:29655295-29712160 56866 44580 44995 368 415 0 NM:i:47 ms:i:568 AS:i:568 nn:i:0 tp:A:S cm:i:11 s1:i:116 de:f:0.0891 rl:i:96 cg:Z:324M12D79M
|
||||
gi|157734152:29655295-29712160 56866 31228 31696 + gi|157734152:29655295-29712160 56866 46651 47139 418 497 0 NM:i:79 ms:i:560 AS:i:560 nn:i:0 tp:A:S cm:i:16 s1:i:161 de:f:0.1068 rl:i:96 cg:Z:47M1D148M7I1M2I3M1D15M2D1M1D138M3D25M8D7M13D74M
|
||||
gi|157734152:29655295-29712160 56866 46651 47139 + gi|157734152:29655295-29712160 56866 31228 31696 418 497 0 NM:i:79 ms:i:560 AS:i:560 nn:i:0 tp:A:S cm:i:16 s1:i:161 de:f:0.1068 rl:i:96 cg:Z:47M1I148M7D1M2D3M1I15M2I1M1I138M3I25M8I7M13I74M
|
||||
gi|157734152:29655295-29712160 56866 44580 44995 + gi|528476637:29857558-29915771 58214 886 1289 366 415 0 NM:i:49 ms:i:556 AS:i:556 nn:i:0 tp:A:S cm:i:12 s1:i:107 de:f:0.0941 rl:i:96 cg:Z:324M12I79M
|
||||
gi|157734152:29655295-29712160 56866 44580 44995 + gi|528476637:29857558-29915771 58214 39378 39792 363 418 0 NM:i:55 ms:i:508 AS:i:508 nn:i:0 tp:A:S cm:i:7 s1:i:93 de:f:0.1232 rl:i:96 cg:Z:85M3I4M3D48M1I274M
|
||||
gi|157734152:29655295-29712160 56866 44580 44995 + gi|157734152:29655295-29712160 56866 39500 39914 362 418 0 NM:i:56 ms:i:502 AS:i:502 nn:i:0 tp:A:S cm:i:6 s1:i:78 de:f:0.1256 rl:i:96 cg:Z:85M3I4M3D48M1I274M
|
||||
gi|157734152:29655295-29712160 56866 39500 39914 + gi|157734152:29655295-29712160 56866 44580 44995 362 418 0 NM:i:56 ms:i:502 AS:i:502 nn:i:0 tp:A:S cm:i:6 s1:i:78 de:f:0.1256 rl:i:96 cg:Z:85M3D4M3I48M1D274M
|
||||
gi|157734152:29655295-29712160 56866 39500 39914 + gi|528476637:29857558-29915771 58214 44457 44872 360 418 0 NM:i:58 ms:i:490 AS:i:490 nn:i:0 tp:A:S cm:i:6 s1:i:78 de:f:0.1304 rl:i:96 cg:Z:85M3D4M3I48M1D274M
|
||||
gi|157734152:29655295-29712160 56866 7021 7639 + gi|528476637:29857558-29915771 58214 49208 49824 489 643 0 NM:i:154 ms:i:370 AS:i:370 nn:i:0 tp:A:S cm:i:5 s1:i:47 de:f:0.2049 rl:i:96 cg:Z:26M4D20M1I64M2D7M1I1M1I39M9I5M2I5M4I75M2D8M1I4M2D25M1D11M1I5M1I2M2D4M1I4M1I7M5D7M1D133M1D49M1D29M4D5M3I3M1I53M
|
||||
gi|157734152:29655295-29712160 56866 7021 7639 + gi|157734152:29655295-29712160 56866 47858 48472 488 641 0 NM:i:153 ms:i:364 AS:i:364 nn:i:0 tp:A:S cm:i:5 s1:i:48 de:f:0.2078 rl:i:96 cg:Z:26M4D20M1I64M2D7M1I1M1I39M9I5M2I5M4I75M2D9M1I3M2D25M1D11M1I5M1I3M1D8M1I7M3D7M1D90M1I5M1D37M1D49M1D30M4D4M3I3M1I53M
|
||||
gi|157734152:29655295-29712160 56866 47858 48472 + gi|528476637:29857558-29915771 58214 7043 7661 488 641 0 NM:i:153 ms:i:364 AS:i:364 nn:i:0 tp:A:S cm:i:5 s1:i:48 de:f:0.2078 rl:i:96 cg:Z:26M4I20M1D64M2I7M1D1M1D39M9D5M2D5M4D75M2I9M1D3M2I25M1I11M1D5M1D3M1I8M1D7M3I7M1I90M1D5M1I37M1I49M1I30M4I4M3D3M1D53M
|
||||
gi|157734152:29655295-29712160 56866 47858 48472 + gi|157734152:29655295-29712160 56866 7021 7639 488 641 0 NM:i:153 ms:i:364 AS:i:364 nn:i:0 tp:A:S cm:i:5 s1:i:48 de:f:0.2078 rl:i:96 cg:Z:26M4I20M1D64M2I7M1D1M1D39M9D5M2D5M4D75M2I9M1D3M2I25M1I11M1D5M1D3M1I8M1D7M3I7M1I90M1D5M1I37M1I49M1I30M4I4M3D3M1D53M
|
||||
gi|157734152:29655295-29712160 56866 28499 28764 - gi|528476637:29857558-29915771 58214 29092 29357 235 265 41 NM:i:30 ms:i:350 AS:i:350 nn:i:0 tp:A:P cm:i:4 s1:i:46 s2:i:0 de:f:0.1132 zd:i:2 rl:i:96 cg:Z:265M
|
||||
gi|157734152:29655295-29712160 56866 14465 14764 - gi|528476637:29857558-29915771 58214 45149 45463 266 316 0 NM:i:50 ms:i:350 AS:i:350 nn:i:0 tp:A:S cm:i:3 s1:i:40 de:f:0.1192 rl:i:96 cg:Z:5M1I26M2D116M14D2M1D114M1I34M
|
||||
gi|157734152:29655295-29712160 56866 29213 29478 - gi|528476637:29857558-29915771 58214 28378 28643 234 265 0 NM:i:31 ms:i:344 AS:i:344 nn:i:0 tp:A:S cm:i:4 s1:i:46 de:f:0.1170 zd:i:1 rl:i:96 cg:Z:265M
|
||||
gi|157734152:29655295-29712160 56866 28499 28764 - gi|157734152:29655295-29712160 56866 29213 29478 233 265 40 NM:i:32 ms:i:338 AS:i:338 nn:i:0 tp:A:P cm:i:4 s1:i:46 s2:i:0 de:f:0.1208 zd:i:2 rl:i:96 cg:Z:265M
|
||||
gi|157734152:29655295-29712160 56866 29213 29478 - gi|157734152:29655295-29712160 56866 28499 28764 233 265 0 NM:i:32 ms:i:338 AS:i:338 nn:i:0 tp:A:S cm:i:4 s1:i:46 de:f:0.1208 zd:i:1 rl:i:96 cg:Z:265M
|
||||
gi|157734152:29655295-29712160 56866 17792 17978 + gi|157734152:29655295-29712160 56866 17883 18067 176 186 0 NM:i:10 ms:i:312 AS:i:312 nn:i:0 tp:A:S cm:i:11 s1:i:86 de:f:0.0486 rl:i:96 cg:Z:6M2I178M
|
||||
gi|157734152:29655295-29712160 56866 17883 18067 + gi|157734152:29655295-29712160 56866 17792 17978 176 186 0 NM:i:10 ms:i:312 AS:i:312 nn:i:0 tp:A:S cm:i:11 s1:i:86 de:f:0.0486 rl:i:96 cg:Z:6M2D178M
|
||||
gi|157734152:29655295-29712160 56866 6285 6982 - gi|528476637:29857558-29915771 58214 6307 7004 528 727 0 NM:i:199 ms:i:272 AS:i:272 nn:i:0 tp:A:S cm:i:4 s1:i:44 de:f:0.2392 rl:i:96 cg:Z:11M1D155M1I43M2D64M2I1M1I6M3I5M2I1M2I6M1D9M2I3M3D6M8I5M1I8M1I5M1I9M1D6M1D5M1D8M8D5M3I4M2D3M2D13M2D7M5D70M2I43M1D154M1I12M
|
||||
gi|157734152:29655295-29712160 56866 6285 6982 - gi|157734152:29655295-29712160 56866 6285 6982 528 723 0 NM:i:195 ms:i:272 AS:i:272 nn:i:0 tp:A:S cm:i:4 s1:i:44 de:f:0.2436 rl:i:96 cg:Z:11M1D155M1I43M2D64M2I1M1I6M3I5M2I1M2I6M1D9M2I3M3D6M1I7M2D2M2I3M2D26M2I3M2D2M2I7M1D5M3I4M2D3M2D13M2D7M5D70M2I43M1D154M1I12M
|
||||
gi|157734152:29655295-29712160 56866 8039 8361 + gi|157734152:29655295-29712160 56866 8039 8285 228 323 0 NM:i:95 ms:i:262 AS:i:281 nn:i:0 tp:A:S cm:i:8 s1:i:53 de:f:0.0769 rl:i:96 cg:Z:131M77I89M1D25M
|
||||
gi|157734152:29655295-29712160 56866 8039 8285 + gi|157734152:29655295-29712160 56866 8039 8361 228 323 0 NM:i:95 ms:i:262 AS:i:281 nn:i:0 tp:A:S cm:i:8 s1:i:53 de:f:0.0769 rl:i:96 cg:Z:131M77D89M1I25M
|
||||
gi|157734152:29655295-29712160 56866 46497 46603 - gi|157734152:29655295-29712160 56866 46497 46603 92 106 0 NM:i:14 ms:i:128 AS:i:128 nn:i:0 tp:A:S cm:i:4 s1:i:54 de:f:0.1321 rl:i:96 cg:Z:106M
|
||||
gi|157734152:29655295-29712160 56866 8206 8392 + gi|157734152:29655295-29712160 56866 8003 8199 154 201 0 NM:i:47 ms:i:116 AS:i:116 nn:i:0 tp:A:S cm:i:5 s1:i:41 de:f:0.1979 rl:i:96 cg:Z:14M3D43M2I1M1I28M1D2M2D3M1D14M1D11M2D3M2D5M2I5M3D52M
|
||||
gi|157734152:29655295-29712160 56866 8003 8199 + gi|157734152:29655295-29712160 56866 8206 8392 154 201 0 NM:i:47 ms:i:116 AS:i:116 nn:i:0 tp:A:S cm:i:5 s1:i:41 de:f:0.1979 rl:i:96 cg:Z:14M3I43M2D1M1D28M1I2M2I3M1I14M1I11M2I3M2I5M2D5M3I52M
|
||||
gi|157734152:29655295-29712160 56866 46537 46603 - gi|157734152:29655295-29712160 56866 46537 46603 60 66 0 NM:i:6 ms:i:96 AS:i:96 nn:i:0 tp:A:S cm:i:4 s1:i:48 de:f:0.0909 rl:i:96 cg:Z:66M
|
||||
@@ -0,0 +1,137 @@
|
||||
# Downloaded from https://github.com/sjackman/gfalint/blob/master/examples/big1.gfa
|
||||
H VN:Z:1.0
|
||||
S 3 * LN:i:5376 KC:i:485841
|
||||
S 5 * LN:i:124 KC:i:6306
|
||||
S 7 * LN:i:3602 KC:i:327981
|
||||
S 8 * LN:i:52 KC:i:2218
|
||||
S 9 * LN:i:48 KC:i:154
|
||||
S 10 * LN:i:144 KC:i:4604
|
||||
S 11 * LN:i:6491 KC:i:611916
|
||||
S 13 * LN:i:10648 KC:i:1023627
|
||||
S 14 * LN:i:48 KC:i:16
|
||||
S 15 * LN:i:5930 KC:i:599587
|
||||
S 17 * LN:i:9404 KC:i:991226
|
||||
S 18 * LN:i:2206 KC:i:240150
|
||||
S 19 * LN:i:893 KC:i:82277
|
||||
S 20 * LN:i:12201 KC:i:1351219
|
||||
S 21 * LN:i:49 KC:i:300
|
||||
S 22 * LN:i:11669 KC:i:1131776
|
||||
S 23 * LN:i:7665 KC:i:766424
|
||||
S 27 * LN:i:48 KC:i:35
|
||||
S 28 * LN:i:1597 KC:i:142681
|
||||
S 30 * LN:i:48 KC:i:7874
|
||||
S 31 * LN:i:94 KC:i:805
|
||||
S 32 * LN:i:3065 KC:i:275287
|
||||
S 33 * LN:i:70 KC:i:5123
|
||||
S 34 * LN:i:49 KC:i:23
|
||||
S 36 * LN:i:12335 KC:i:1315304
|
||||
S 37 * LN:i:130 KC:i:5258
|
||||
S 38 * LN:i:4516 KC:i:440430
|
||||
S 39 * LN:i:59 KC:i:4094
|
||||
S 41 * LN:i:215 KC:i:11423
|
||||
S 42 * LN:i:146 KC:i:3161
|
||||
S 43 * LN:i:50 KC:i:563
|
||||
S 44 * LN:i:3913 KC:i:434585
|
||||
S 46 * LN:i:2710 KC:i:268203
|
||||
S 47 * LN:i:49 KC:i:200
|
||||
S 49 * LN:i:61 KC:i:3442
|
||||
S 50 * LN:i:5010 KC:i:532820
|
||||
S 51 * LN:i:9644 KC:i:950549
|
||||
S 52 * LN:i:417 KC:i:16750
|
||||
S 54 * LN:i:50 KC:i:600
|
||||
S 55 * LN:i:69 KC:i:11532
|
||||
S 56 * LN:i:1550 KC:i:141042
|
||||
S 57 * LN:i:346 KC:i:12512
|
||||
S 58 * LN:i:3825 KC:i:349334
|
||||
S 59 * LN:i:11508 KC:i:1237494
|
||||
S 60 * LN:i:720 KC:i:72448
|
||||
S 61 * LN:i:1086 KC:i:83405
|
||||
S 62 * LN:i:4818 KC:i:464490
|
||||
S 63 * LN:i:8207 KC:i:822244
|
||||
S 65 * LN:i:67 KC:i:2088
|
||||
S 66 * LN:i:4375 KC:i:421128
|
||||
S 67 * LN:i:5063 KC:i:530425
|
||||
S 68 * LN:i:78 KC:i:10057
|
||||
S 69 * LN:i:10204 KC:i:1039066
|
||||
S 71 * LN:i:789 KC:i:65350
|
||||
S 72 * LN:i:95 KC:i:6170
|
||||
S 73 * LN:i:48 KC:i:14
|
||||
S 76 * LN:i:54 KC:i:1373
|
||||
S 77 * LN:i:4167 KC:i:460259
|
||||
S 78 * LN:i:49 KC:i:925
|
||||
S 79 * LN:i:95 KC:i:5402
|
||||
S 83 * LN:i:15015 KC:i:1487985
|
||||
S 84 * LN:i:9811 KC:i:1021233
|
||||
S 85 * LN:i:3483 KC:i:365113
|
||||
S 86 * LN:i:7953 KC:i:722908
|
||||
L 3 + 65 - 47M
|
||||
L 3 - 76 - 47M
|
||||
L 5 + 47 - 47M
|
||||
L 5 - 22 - 47M
|
||||
L 5 - 32 + 47M
|
||||
L 7 + 49 - 47M
|
||||
L 8 + 33 - 47M
|
||||
L 8 + 55 - 36M
|
||||
L 8 - 78 + 47M
|
||||
L 8 - 79 + 47M
|
||||
L 9 + 37 - 47M
|
||||
L 9 + 47 + 46M
|
||||
L 9 - 67 - 47M
|
||||
L 9 - 69 - 47M
|
||||
L 10 + 47 + 47M
|
||||
L 11 - 43 - 47M
|
||||
L 14 + 30 + 47M
|
||||
L 14 + 31 + 47M
|
||||
L 14 + 73 - 47M
|
||||
L 17 + 21 - 47M
|
||||
L 18 + 78 - 47M
|
||||
L 19 + 76 + 47M
|
||||
L 19 - 76 - 47M
|
||||
L 20 - 76 + 47M
|
||||
L 21 + 51 - 47M
|
||||
L 21 - 32 - 47M
|
||||
L 21 - 66 + 47M
|
||||
L 22 + 63 + 47M
|
||||
L 23 + 68 - 47M
|
||||
L 27 + 30 + 47M
|
||||
L 27 + 31 + 47M
|
||||
L 27 + 73 - 47M
|
||||
L 27 - 31 - 47M
|
||||
L 27 - 83 + 47M
|
||||
L 28 + 43 + 47M
|
||||
L 30 + 30 + 47M
|
||||
L 30 + 31 + 47M
|
||||
L 30 + 73 - 47M
|
||||
L 30 - 34 - 47M
|
||||
L 31 - 34 - 47M
|
||||
L 32 - 63 + 47M
|
||||
L 33 + 72 - 47M
|
||||
L 33 - 44 - 47M
|
||||
L 33 - 55 - 16M
|
||||
L 34 + 73 - 47M
|
||||
L 36 - 63 - 47M
|
||||
L 36 - 85 + 47M
|
||||
L 37 - 49 + 47M
|
||||
L 39 + 56 + 47M
|
||||
L 39 + 67 + 47M
|
||||
L 39 - 71 - 47M
|
||||
L 39 - 65 + 14M
|
||||
L 41 + 43 + 47M
|
||||
L 42 + 65 - 47M
|
||||
L 43 + 60 + 47M
|
||||
L 47 + 59 + 47M
|
||||
L 49 + 71 + 47M
|
||||
L 49 - 84 + 47M
|
||||
L 52 - 65 + 47M
|
||||
L 54 + 77 - 47M
|
||||
L 54 + 54 + 46M
|
||||
L 54 - 58 - 47M
|
||||
L 55 + 72 - 36M
|
||||
L 55 - 79 - 47M
|
||||
L 55 - 78 - 44M
|
||||
L 57 + 63 - 47M
|
||||
L 57 + 85 + 47M
|
||||
L 61 + 68 + 47M
|
||||
L 68 + 68 + 26M
|
||||
L 72 - 78 + 47M
|
||||
L 72 - 79 + 47M
|
||||
@@ -0,0 +1,9 @@
|
||||
#MZ SEC INT
|
||||
500.0 0 50
|
||||
600.0 1 100
|
||||
700.0 2 200
|
||||
800.0 3 400
|
||||
900.0 4 200
|
||||
1000.0 5 100
|
||||
1100.0 6 50
|
||||
900.0 2 200
|
||||
@@ -0,0 +1,7 @@
|
||||
RT mz Int charge Meta2
|
||||
10 114 2342 1
|
||||
10 115 232 2
|
||||
10 116 523 2
|
||||
14 220 343 1 value
|
||||
14 431.1 343 2
|
||||
15 543.2393 343 3 b
|
||||
@@ -0,0 +1,23 @@
|
||||
File First Scan Last Scan Num of Scans Charge Monoisotopic Mass Base Isotope Peak Best Intensity Summed Intensity First RTime Last RTime Best RTime Best Correlation Modifications
|
||||
20060502data08_exc_RTf.mzXML 1480 1578 15 3 1345.607960 449.543300 60834.925781 506348.656250 521.106018 553.833008 533.018982 0.991700 _
|
||||
20060502data08_exc_RTf.mzXML 1487 1557 11 2 1345.608400 673.811500 26904.589844 199969.046875 523.559998 546.731018 533.018982 0.995300 _
|
||||
20060502data08_exc_RTf.mzXML 1557 1620 10 3 2002.810800 668.945100 38904.792969 217929.312500 546.731018 567.784973 553.833008 0.986300 _
|
||||
20060502data08_exc_RTf.mzXML 1571 1592 4 2 2002.811525 1002.913800 4603.663086 14353.689453 551.427979 558.577026 556.184998 0.978400 _
|
||||
20060502data08_exc_RTf.mzXML 1592 1690 15 3 1772.892100 591.971200 91715.507813 502103.500000 558.577026 590.963013 567.784973 0.986900 _
|
||||
20060502data08_exc_RTf.mzXML 1599 1683 13 4 1772.891285 444.230100 72974.398438 417335.125000 560.914001 588.521973 570.002014 0.974700 _
|
||||
20060502data08_exc_RTf.mzXML 1599 1676 11 2 1772.889336 887.452600 22342.041016 122096.265625 560.914001 586.155029 567.784973 0.994600 _
|
||||
20060502data08_exc_RTf.mzXML 1690 1774 13 2 1401.655615 701.834900 37010.062500 262936.343750 590.963013 619.705017 605.291992 0.995500 _
|
||||
20060502data08_exc_RTf.mzXML 1746 1816 11 2 1065.545100 533.779800 48403.296875 347601.562500 610.046997 634.202026 622.135986 0.979800 _
|
||||
20060502data08_exc_RTf.mzXML 1816 1851 6 4 2095.873767 525.226300 17985.734375 73192.179688 634.202026 646.385986 641.471008 0.986700 _
|
||||
20060502data08_exc_RTf.mzXML 1858 1879 4 4 1904.987400 477.504500 7037.772461 16893.957031 648.786011 656.114014 656.114014 0.962100 _
|
||||
20060502data08_exc_RTf.mzXML 1879 1907 4 2 994.581075 498.297700 28557.644531 92082.468750 656.114014 665.525024 660.861023 0.996100 _
|
||||
20060502data08_exc_RTf.mzXML 1886 1994 15 3 1506.688193 503.236500 223091.640625 1329185.625000 658.479980 693.369995 670.021973 0.989100 _
|
||||
20060502data08_exc_RTf.mzXML 1893 1955 10 2 1506.689740 754.352500 49197.664063 307397.281250 660.861023 680.966003 672.174988 0.990500 _
|
||||
20060502data08_exc_RTf.mzXML 1907 2056 23 4 2239.081209 561.027900 189284.390625 1359320.875000 665.525024 713.080994 685.143005 0.973600 _
|
||||
20060502data08_exc_RTf.mzXML 1914 1994 13 2 1336.644692 669.329400 174888.703125 994234.375000 667.744019 693.369995 676.612000 0.990700 _
|
||||
20060502data08_exc_RTf.mzXML 1921 1988 10 2 1478.675160 740.344800 119720.226563 577115.250000 670.021973 691.309998 678.859985 0.985600 _
|
||||
20060502data08_exc_RTf.mzXML 1928 1948 3 2 1697.803500 849.907800 3211.451660 7545.761719 672.174988 678.859985 672.174988 0.927400 _
|
||||
20060502data08_exc_RTf.mzXML 1935 1955 4 2 1127.618850 564.816500 67462.703125 183348.593750 674.471985 680.966003 680.966003 0.950400 _
|
||||
20060502data08_exc_RTf.mzXML 1941 2021 12 3 2239.081067 747.701800 67137.210938 463090.031250 676.612000 701.872009 683.143982 0.991200 _
|
||||
20060502data08_exc_RTf.mzXML 1948 2028 13 2 1583.758454 792.886000 36854.781250 262471.843750 678.859985 704.109009 691.309998 0.993400 _
|
||||
20060502data08_exc_RTf.mzXML 1955 2021 11 3 1583.757945 528.926500 128648.492188 829892.062500 680.966003 701.872009 691.309998 0.990400 _
|
||||
@@ -0,0 +1,28 @@
|
||||
MTD mzTab-version 1.0 rc5
|
||||
MTD mzTab-mode Summary
|
||||
MTD mzTab-type Identification
|
||||
MTD mzTab-ID Cytidine
|
||||
MTD description LC-MS/MS Reference Standard
|
||||
MTD sample_processing[1] [MS, MS:1000544, Conversion to mzML, ]|[MS, MS:1000035, Peak picking, ]|[MS, MS:1001994, Top Hat baseline reduction, ]|[MS, MS:1000782, Savitzky-Golay smoothing, ]|[MS, MS:1000594, Low intensity data point removal, ]
|
||||
MTD instrument[1]-name [MS, MS:1000483, Thermo Fisher Scientific instrument model, LTQ Orbitrap Velos]
|
||||
MTD instrument[1]-source [MS, MS:1000008, Ionization Type, ESI]
|
||||
MTD instrument[1]-analyzer[1] [MS, MS:1000443, Mass Analyzer Type, Orbitrap]
|
||||
MTD instrument[1]-detector [MS, MS:1000453, Detector, Dynode Detector]
|
||||
MTD software[1] [MS, MS:1002205, ProteoWizard msconvert, ]
|
||||
MTD software[1]-setting[1] Peak Picking MS1
|
||||
MTD software[1] [MS, MS:1001457, data processing software, MassCascade-KNIME]
|
||||
MTD smallmolecule_search_engine_score[1] [MS, MS:1001153, search engine specific score,]
|
||||
MTD contact[1]-name Stephan Beisken
|
||||
MTD contact[1]-affiliation European Bioinformatics Institute (EMBL-EBI)
|
||||
MTD contact[1]-email beiken@ebi.ac.uk
|
||||
MTD uri[1] http://www.ebi.ac.uk/metabolights/MTBLS38
|
||||
MTD fixed_mod[1] [MS, MS:1002453, No fixed modifications searched, ]
|
||||
MTD variable_mod[1] [ , , CHEMMOD:2M+H, ]
|
||||
MTD variable_mod[2] [ , , CHEMMOD:M-C5H8O4, ]
|
||||
MTD ms_run[1]-format [MS, MS:1000584, Proteomics Standards Inititative mzML file format, mzML file]
|
||||
MTD ms_run[1]-location ftp://ftp.ebi.ac.uk/pub/databases/metabolights/studies/public/MTBLS38/cytidine.mzML
|
||||
MTD ms_run[1]-id_format [MS, MS:1000767, Native spectrum identifier format, ]
|
||||
MTD ms_run[1]-fragmentation_method [MS, MS:1000133, Collision-induced dissociation, ]
|
||||
|
||||
SMH identifier chemical_formula smiles inchi_key description exp_mass_to_charge calc_mass_to_charge charge retention_time taxid species database database_version spectra_ref search_engine best_search_engine_score[1] modifications
|
||||
SML CHEBI:17562 C9H13N3O5 Nc1ccn([C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O)c(=O)n1 UHDGCWIWMRVCDJ-XVFCMESISA-N Cytidine 244.0928 null 1 193.25 null null ChEBI 109 null [MS, MS:1001083, ms-ms search, MassBank] 977 CHEMMOD:2M+H,CHEMMOD:M-C5H8O4
|
||||
@@ -0,0 +1,92 @@
|
||||
COM Meta data section
|
||||
MTD mzTab-version 2.0.0-M
|
||||
MTD mzTab-ID mzTab-GCxGC-MS
|
||||
MTD description Minimal sample file for GCxGC-MS quantification of small molecules between two experiments
|
||||
MTD instrument[1]-name [MS, MS:1001945, Pegasus 4D, ]
|
||||
MTD instrument[1]-source [MS, MS:1000389, electron Ionization, ]
|
||||
MTD instrument[1]-analyzer[1] [MS, MS:1000084, time-of-flight, ]
|
||||
MTD instrument[1]-detector [MS, MS:1000114, microchannel plate detector, ]
|
||||
MTD software[1] [MS, MS:1001799, ChromaTOF software, 3.21]
|
||||
MTD software[1]-setting[1] baseline=0.2
|
||||
MTD software[1]-setting[2] dbMatchTreshold=900
|
||||
MTD sample[1]-species[1] [NCBITaxon, NCBITaxon:9606, Homo sapiens, ]
|
||||
MTD sample[1]-cell_type[1] [CL, CL:0000233, platelet, ]
|
||||
MTD sample[1]-description Unstimulated human blood platelets
|
||||
MTD sample[2]-species[1] [NCBITaxon, NCBITaxon:9606, Homo sapiens, ]
|
||||
MTD sample[2]-cell_type[1] [CL, CL:0000233, platelet, ]
|
||||
MTD sample[2]-description Unstimulated human blood platelets
|
||||
MTD ms_run[1]-location file://c:/data/control.mzML
|
||||
MTD ms_run[1]-format [MS, MS:1000584, mzML file, ]
|
||||
MTD ms_run[1]-id_format [MS, MS:1000776, scan number only nativeID format, ]
|
||||
MTD ms_run[1]-scan_polarity[1] [MS, MS:1000130, positive scan, ]
|
||||
MTD ms_run[2]-location file://c:/data/treatment.mzML
|
||||
MTD ms_run[2]-format [MS, MS:1000584, mzML file, ]
|
||||
MTD ms_run[2]-id_format [MS, MS:1000776, scan number only nativeID format, ]
|
||||
MTD ms_run[2]-scan_polarity[1] [MS, MS:1000130, positive scan, ]
|
||||
MTD assay[1]-sample_ref sample[1]
|
||||
MTD assay[1]-ms_run_ref ms_run[1]
|
||||
MTD assay[2]-sample_ref sample[2]
|
||||
MTD assay[2]-ms_run_ref ms_run[2]
|
||||
MTD study_variable[1] Untreated
|
||||
MTD study_variable[1]-assay_refs assay[1]
|
||||
MTD study_variable[1]-description drug response control
|
||||
MTD study_variable[1]-average_function [MS, MS:1002962, mean, ]
|
||||
MTD study_variable[1]-variation_function [MS, MS:1002885, standard error, ]
|
||||
MTD study_variable[2] Treated
|
||||
MTD study_variable[2]-assay_refs assay[2]
|
||||
MTD study_variable[2]-description drug response treatment
|
||||
MTD study_variable[2]-average_function [MS, MS:1002962, mean, ]
|
||||
MTD study_variable[2]-variation_function [MS, MS:1002885, standard error, ]
|
||||
MTD cv[1]-label MS
|
||||
MTD cv[1]-full_name PSI-MS controlled vocabulary
|
||||
MTD cv[1]-version 20-06-2018
|
||||
MTD cv[1]-uri https://www.ebi.ac.uk/ols/ontologies/ms
|
||||
MTD cv[2]-label NCBITaxon
|
||||
MTD cv[2]-full_name An ontology representation of the NCBI organismal taxonomy Ontology
|
||||
MTD cv[2]-version 2018-03-02
|
||||
MTD cv[2]-uri https://www.ebi.ac.uk/ols/ontologies/ncbitaxon
|
||||
MTD cv[3]-label CL
|
||||
MTD cv[3]-full_name The Cell Ontology is a structured controlled vocabulary for cell types in animals.
|
||||
MTD cv[3]-version 2017-12-11
|
||||
MTD cv[3]-uri https://www.ebi.ac.uk/ols/ontologies/cl
|
||||
MTD cv[4]-label PRIDE
|
||||
MTD cv[4]-full_name PRIDE PRoteomics IDEntifications (PRIDE) database controlled vocabulary
|
||||
MTD cv[4]-version 14-06-2018
|
||||
MTD cv[4]-uri https://www.ebi.ac.uk/ols/ontologies/pride
|
||||
MTD cv[5]-label CHEBI
|
||||
MTD cv[5]-full_name Chemical Entities of Biological Interest
|
||||
MTD cv[5]-version 08-02-2019
|
||||
MTD cv[5]-uri https://www.ebi.ac.uk/ols/ontologies/chebi
|
||||
MTD database[1] [, ,Golm Metabolite Database, ]
|
||||
MTD database[1]-prefix GMD
|
||||
MTD database[1]-version 2.3
|
||||
MTD database[1]-uri http://gmd.mpimp-golm.mpg.de/
|
||||
MTD database[2] [, , no database, null]
|
||||
MTD database[2]-prefix null
|
||||
MTD database[2]-uri null
|
||||
MTD database[2]-version Unknown
|
||||
MTD derivatization_agent[1] [,,Methoxylamine hydrochloride,]
|
||||
MTD derivatization_agent[2] [CHEBI, CHEBI:85064, N-methyl-N-(trimethylsilyl)trifluoroacetamide,]
|
||||
MTD small_molecule-identification_reliability [MS, MS:1002896, compound identification confidence level, ]
|
||||
MTD id_confidence_measure[1] [MS, MS:1002890, fragmentation score, ]
|
||||
MTD small_molecule-quantification_unit [PRIDE, PRIDE:0000330, Arbitrary quantification unit, ]
|
||||
MTD small_molecule_feature-quantification_unit [PRIDE, PRIDE:0000330, Arbitrary quantification unit, ]
|
||||
MTD quantification_method [,,baseline-corrected intensity quantification,]
|
||||
MTD custom[1] [MS, MS:1000901, retention time normalization standard, n-alkanes C10–C36]
|
||||
|
||||
COM Small molecule summary rows (similar to Protein section).
|
||||
COM Evidences (e.g. multiple modifications, adducts incl. charge variants are summarized).
|
||||
COM For most use cases this summary lines might be sufficient.
|
||||
SMH SML_ID SMF_ID_REFS database_identifier chemical_formula smiles inchi chemical_name uri theoretical_neutral_mass adduct_ions reliability best_id_confidence_measure best_id_confidence_value abundance_assay[1] abundance_study_variable[1] abundance_variation_study_variable[1] abundance_assay[2] abundance_study_variable[2] abundance_variation_study_variable[2]
|
||||
SML 1 1 | 2 GMD:cd7993ea-ad14-452a-a907-33376cc98790 C18H36O2 CCCCCCCCCCCCCCCCCC(O)=O InChI=1S/C18H36O2/c1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18(19)20/h2-17H2,1H3,(H,19,20) Octadecanoic acid http://identifiers.org/gmd/cd7993ea-ad14-452a-a907-33376cc98790 284.478 [M+H]1+ 2 [MS, MS:1002890, fragmentation score, ] 978 805.16 805.16 0 589.9 589.9 0
|
||||
|
||||
COM Small molecule feature rows (only reported in Complete Quantification files and if feature information like e.g. mass traces are important)
|
||||
SFH SMF_ID SME_ID_REFS SME_ID_REF_ambiguity_code adduct_ion isotopomer exp_mass_to_charge charge retention_time_in_seconds retention_time_in_seconds_start retention_time_in_seconds_end abundance_assay[1] abundance_assay[2] opt_global_retention_time_nd opt_global_retention_time_nd_window_start opt_global_retention_time_nd_window_end
|
||||
SMF 1 1 null [M+H]1+ null 285.484 1 1564.47 1559.45 1564.48 805.16 805.16 1562 | 2.47 1557 | 2.45 1562 | 2.48
|
||||
SMF 2 2 null [M+H]1+ null 285.484 1 1564.48 1554.45 1569.47 589.9 589.9 1562 | 2.48 1552 | 2.45 1567| 2.47
|
||||
|
||||
COM Small molecule evidence rows for parent ions. Analog to PSM.
|
||||
COM Primary use case: report single hits from spectral library or accurate mass searches without quantification.
|
||||
SEH SME_ID evidence_input_id database_identifier chemical_formula smiles inchi chemical_name uri derivatized_form adduct_ion exp_mass_to_charge charge theoretical_mass_to_charge spectra_ref identification_method ms_level id_confidence_measure[1] rank
|
||||
SME 1 ms_run[1]:scan=8 GMD:f634c736-39e8-4323-8155-fa3cc26ac9e3 C18H36O2 CCCCCCCCCCCCCCCCCC(O)=O InChI=1S/C18H36O2/c1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18(19)20/h2-17H2,1H3,(H,19,20) Octadecanoic acid (1TMS) http://identifiers.org/gmd.analyte/f634c736-39e8-4323-8155-fa3cc26ac9e3 [CHEBI, CHEBI:51088, trimethylsilyl group, 1] [M+H]+ 356.6588 1 356.659 ms_run[1]:scan=8 [,, ChromaTOF database search,] [MS, MS:1000511, ms level, 1] 957 1
|
||||
SME 2 ms_run[2]:scan=23 GMD:f634c736-39e8-4323-8155-fa3cc26ac9e3 C18H36O2 CCCCCCCCCCCCCCCCCC(O)=O InChI=1S/C18H36O2/c1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18(19)20/h2-17H2,1H3,(H,19,20) Octadecanoic acid (1TMS) http://identifiers.org/gmd.analyte/f634c736-39e8-4323-8155-fa3cc26ac9e3 [CHEBI, CHEBI:51088, trimethylsilyl group, 1] [M+H]+ 356.6589 1 356.659 ms_run[2]:scan=23 [,, ChromaTOF database search,] [MS, MS:1000511, ms level, 1] 972 1
|
||||
Binary file not shown.
@@ -0,0 +1,11 @@
|
||||
# PEFF 1.0
|
||||
# //
|
||||
# DbName=Minimal Test example PEFF_Minimal_Valid.peff
|
||||
# Prefix=sp
|
||||
# DbSource=http://www.peptideatlas.org/formats/PEFF/PEFF_Minimal_Valid.peff
|
||||
# DbVersion=1
|
||||
# SequenceType=AA
|
||||
# NumberOfEntries=1
|
||||
# //
|
||||
>sp:Q9Y2X3 \Length=1
|
||||
M
|
||||
@@ -0,0 +1,36 @@
|
||||
m/z rt(min) snr charge intensity
|
||||
706.0656 47.997 70.443 3 3709.630
|
||||
740.4292 60.127 28.895 4 2153.832
|
||||
708.7055 63.321 28.970 3 2377.576
|
||||
728.7255 56.390 28.530 3 1820.929
|
||||
721.3855 57.410 25.965 3 1332.942
|
||||
740.4400 64.272 16.639 2 1024.329
|
||||
707.3855 63.423 20.248 3 1495.899
|
||||
735.7055 50.275 29.838 3 804.873
|
||||
726.7255 63.966 13.282 3 1364.349
|
||||
723.4000 57.647 13.069 2 713.563
|
||||
700.4400 61.588 11.435 2 579.007
|
||||
736.3400 61.113 9.765 2 464.364
|
||||
705.4000 54.454 12.855 2 457.507
|
||||
709.0056 57.104 12.614 3 454.622
|
||||
710.3000 49.459 18.364 2 534.519
|
||||
719.4000 64.714 7.860 3 447.372
|
||||
742.4400 64.170 6.799 2 357.583
|
||||
752.4000 55.983 7.138 2 290.348
|
||||
714.1492 47.114 22.442 4 576.568
|
||||
753.4256 61.486 7.788 3 318.019
|
||||
730.3800 53.536 8.914 2 284.038
|
||||
708.8400 58.836 6.272 2 246.319
|
||||
737.0400 50.207 12.257 3 309.824
|
||||
716.9200 58.123 6.188 2 283.297
|
||||
729.7456 50.308 9.760 3 428.650
|
||||
712.3200 49.391 8.749 2 235.981
|
||||
748.9400 51.294 9.114 2 250.202
|
||||
712.8800 53.672 6.466 2 160.206
|
||||
714.9000 53.604 6.417 2 202.450
|
||||
716.8800 54.080 6.920 2 225.521
|
||||
715.7055 49.017 10.866 3 198.560
|
||||
728.3600 53.299 6.913 3 156.242
|
||||
753.8800 49.527 6.406 2 113.352
|
||||
724.0400 47.997 6.559 3 281.194
|
||||
745.9200 47.521 6.732 2 87.974
|
||||
Binary file not shown.
@@ -0,0 +1,122 @@
|
||||
PSMId score q-value posterior_error_prob peptide proteinIds
|
||||
query:161610;rank:1;spectrum:1093.0258_2187.96_spectrum=40633_uteruspremenopause;rt:2187.96;mz:1093.0258;charge:2 11.0472 0 1.48741e-12 X.SLAGSSGPGASSGTSGDHGELVVR.X UniProt_E9PI39 UniProt_E9PIZ1 UniProt_E9PK01 UniProt_E9PL12 UniProt_E9PMW7 UniProt_E9PPR1 UniProt_E9PQ49 UniProt_E9PRY8 UniProt_H0YCK7 UniProt_P29692 UniProt_P29692-2 genCDS_ENST00000317198_8_143579792-143586845_-1 genCDS_ENST00000395119_8_143579792-143586845_-1 genCDS_ENST00000419152_8_143579792-143586845_-1 genCDS_ENST00000423316_8_143579792-143590081_-1 genCDS_ENST00000442189_8_143579792-143590081_-1 genCDS_ENST00000524397_8_143580630-143586845_-1 genCDS_ENST00000529007_8_143580630-143586845_-1 genCDS_ENST00000529272_8_143579792-143586845_-1 genCDS_ENST00000530191_8_143580506-143586845_-1 genCDS_ENST00000530445_8_143580620-143586845_-1 genCDS_ENST00000530616_8_143580630-143589222_-1 genCDS_ENST00000531218_8_143580522-143586845_-1 genCDS_ENST00000532741_8_143579792-143590231_-1 genCDS_ENST00000533204_8_143580506-143586845_-1 genCDS_ENST00000533494_8_143580613-143586845_-1 genCDS_ENST00000533749_8_143581079-143599321_-1 genCDS_ENST00000534380_8_143580034-143586845_-1 genCDS_ENST00000618139_8_143580019-143590081_-1
|
||||
query:132093;rank:1;spectrum:832.40479_2605.29_spectrum=72602_uteruspremenopause;rt:2605.29;mz:832.40479;charge:2 9.36298 0 7.2763e-11 X.AAAFEEQENETVVVK.X UniProt_Q5TCU6 UniProt_Q9Y490 genCDS_ENST00000314888_9_35697791-35725694_-1
|
||||
query:119552;rank:1;spectrum:769.39142_3320.48_spectrum=167622_uteruspremenopause;rt:3320.48;mz:769.39142;charge:2 8.72204 0 3.19783e-10 X.FALQDLSVEETSAK.X UniProt_B2RCS5 UniProt_G3V2E8 UniProt_G3V2N5 UniProt_G3V2W4 UniProt_G3V2X9 UniProt_G3V5M4 UniProt_H9KV75 UniProt_O43707 UniProt_P12814 UniProt_P12814-2 UniProt_P12814-3 UniProt_P12814-4 UniProt_P35609 UniProt_Q08043 genCDS_ENST00000193403_14_68874859-68979056_-1 genCDS_ENST00000252699_19_38647746-38729432_1 genCDS_ENST00000366578_1_236686674-236762619_1 genCDS_ENST00000376839_14_68874859-68925582_-1 genCDS_ENST00000394419_14_68874859-68979056_-1 genCDS_ENST00000438964_14_68874859-68979056_-1 genCDS_ENST00000502692_11_66546511-66563193_1 genCDS_ENST00000513398_11_66546938-66563193_1 genCDS_ENST00000538545_14_68874859-68979056_-1 genCDS_ENST00000542672_1_236686674-236762619_1 genCDS_ENST00000553370_14_68904702-68925582_-1 genCDS_ENST00000553779_14_68910020-68925582_-1 genCDS_ENST00000555616_14_68892228-68925582_-1 genCDS_ENST00000556433_14_68893665-68978258_-1 genCDS_ENST00000556571_14_68910022-68978051_-1
|
||||
query:105717;rank:1;spectrum:715.89587_3127.2_spectrum=82140_uteruspremenopause;rt:3127.2;mz:715.89587;charge:2 8.58807 0 4.35755e-10 X.LDSLSAQLSQLQK.X UniProt_P02545 UniProt_P02545-2 UniProt_P02545-3 UniProt_P02545-4 UniProt_P02545-5 UniProt_P02545-6 UniProt_Q5TCI8 genCDS_ENST00000347559_1_156114919-156139106_1 genCDS_ENST00000361308_1_156114919-156137764_1 genCDS_ENST00000368297_1_156126803-156137764_1 genCDS_ENST00000368299_1_156114919-156139106_1 genCDS_ENST00000368300_1_156114919-156139106_1 genCDS_ENST00000368301_1_156114919-156137764_1 genCDS_ENST00000448611_1_156126204-156139839_1 genCDS_ENST00000473598_1_156129850-156139106_1
|
||||
query:121144;rank:1;spectrum:776.86639_1943.52_spectrum=62937_uteruspremenopause;rt:1943.52;mz:776.86639;charge:2 8.31993 0 8.09508e-10 X.TSTTSSMVASAEQPR.X UniProt_E7EMN6 UniProt_E7EUI7 UniProt_P41236 UniProt_Q6NXS1 genCDS_ENST00000413183_3_195527890-195543025_-1 genCDS_ENST00000438848_3_195516925-195543025_-1 genCDS_ENST00000618156_3_195516896-195543025_-1
|
||||
query:91084;rank:1;spectrum:661.3443_2685.51_spectrum=127861_uteruspremenopause;rt:2685.51;mz:661.3443;charge:2 7.84396 0 2.43037e-09 X.STSGGTAALGCLVK.X UniProt_P01857 UniProt_P01860 genCDS_ENST00000390542_14_105741473-105743071_-1 genCDS_ENST00000390548_14_105737762-105743071_-1 genCDS_ENST00000390549_14_105741473-105743071_-1 genCDS_ENST00000390551_14_105769237-105771405_-1 genCDS_ENST00000612473_14_105741473-106005532_-1 genCDS_ENST00000613152_14_105741473-106211391_-1 genCDS_ENST00000615822_14_105741473-106062604_-1 genCDS_ENST00000616127_14_105769237-106038345_-1 genCDS_ENST00000618145_14_105741473-106012356_-1 genCDS_ENST00000618756_14_105668245-106538265_-1 genCDS_ENST00000619212_14_105741473-106211391_-1 genCDS_ENST00000621473_14_105769237-106005532_-1
|
||||
query:128131;rank:1;spectrum:813.40948_2244.71_spectrum=40773_uteruspremenopause;rt:2244.71;mz:813.40948;charge:2 7.38397 0 7.03248e-09 X.DALQNPNDLQLQEK.X UniProt_C9IYV6 UniProt_C9JPE5 UniProt_Q9H0Q0 genCDS_ENST00000381323_2_16552936-16588119_-1 genCDS_ENST00000406434_2_16552936-16588119_-1 genCDS_ENST00000445605_2_16564005-16588119_-1 genCDS_ENST00000451689_2_16564024-16588119_-1
|
||||
query:141775;rank:1;spectrum:893.9129_2874.06_spectrum=158864_uteruspremenopause;rt:2874.06;mz:893.9129;charge:2 7.1148 0 1.30952e-08 X.NKDQGTYEDYVEGLR.X Augustus2_AUGUSTUS00000061902_12_56160654-56153919_1 UniProt_B7Z6Z4 UniProt_F8VPF3 UniProt_F8VZU9 UniProt_F8W180 UniProt_F8W1R7 UniProt_G3V1V0 UniProt_G3V1Y7 UniProt_G8JLA2 UniProt_J3KND3 UniProt_P60660 UniProt_P60660-2 genCDS_ENST00000293422_12_56158402-56161415_1 genCDS_ENST00000348108_12_56158402-56160654_1 genCDS_ENST00000536128_12_56158402-56160331_1 genCDS_ENST00000547408_12_56158402-56162322_1 genCDS_ENST00000547649_12_56158402-56161415_1 genCDS_ENST00000548293_12_56158402-56160654_1 genCDS_ENST00000548400_12_56158402-56160654_1 genCDS_ENST00000548580_12_56158402-56161415_1 genCDS_ENST00000549392_12_56158402-56160320_1 genCDS_ENST00000549566_12_56158402-56161415_1 genCDS_ENST00000550697_12_56158402-56160654_1 genCDS_ENST00000551589_12_56158402-56160331_1
|
||||
query:71406;rank:1;spectrum:404.21942_2506.81_spectrum=119549_uteruspremenopause;rt:2506.81;mz:404.21942;charge:3 7.03952 0 1.55822e-08 X.TANDAVELHLK.X UniProt_Q9P2B2 genCDS_ENST00000393203_1_116910204-116986967_1
|
||||
query:129027;rank:1;spectrum:817.40759_3010.12_spectrum=35161_uteruspremenopause;rt:3010.12;mz:817.40759;charge:2 7.02828 0 1.5992e-08 X.EGCTVSPETLSLNVK.X UniProt_E5KLJ5 UniProt_E5KLJ6 UniProt_E5KLJ9 UniProt_E5KLK1 UniProt_O60313 UniProt_O60313-2 genCDS_ENST00000361150_3_193593378-193692127_1 genCDS_ENST00000361510_3_193593378-193692127_1 genCDS_ENST00000361715_3_193593378-193692127_1 genCDS_ENST00000361828_3_193593378-193692127_1 genCDS_ENST00000361908_3_193593378-193692127_1 genCDS_ENST00000392438_3_193593378-193692127_1
|
||||
query:79758;rank:1;spectrum:627.82471_1646.41_spectrum=69987_uteruspremenopause;rt:1646.41;mz:627.82471;charge:2 6.79995 0 2.70985e-08 X.LEPGGGAEAQAVR.X UniProt_Q14315 UniProt_Q14315-2 genCDS_ENST00000325888_7_128830638-128858523_1 genCDS_ENST00000346177_7_128830638-128858523_1
|
||||
query:107233;rank:1;spectrum:721.87775_2878.99_spectrum=96857_uteruspremenopause;rt:2878.99;mz:721.87775;charge:2 6.53355 0 5.01392e-08 X.EAGAGGLSLAVEGPSK.X UniProt_E7EN95 UniProt_O75369 UniProt_O75369-2 UniProt_O75369-3 UniProt_O75369-6 UniProt_O75369-7 UniProt_O75369-8 UniProt_O75369-9 UniProt_Q14315 UniProt_Q14315-2 genCDS_ENST00000295956_3_58008565-58170762_1 genCDS_ENST00000325888_7_128830638-128858523_1 genCDS_ENST00000346177_7_128830638-128858523_1 genCDS_ENST00000358537_3_58008565-58170762_1 genCDS_ENST00000429972_3_58008565-58170762_1 genCDS_ENST00000490882_3_58008565-58170762_1 genCDS_ENST00000493452_3_58078486-58170762_1
|
||||
query:146872;rank:1;spectrum:619.28918_2152.13_spectrum=141583_uteruspremenopause;rt:2152.13;mz:619.28918;charge:3 6.13383 0 1.26226e-07 X.SEETKENEGFTVTAEGK.X UniProt_M0QYC8 UniProt_P01024 genCDS_ENST00000245907_19_6677882-6720589_-1 genCDS_ENST00000596548_19_6680159-6685038_-1
|
||||
query:172404;rank:1;spectrum:871.76086_2726.33_spectrum=42005_uteruspremenopause;rt:2726.33;mz:871.76086;charge:3 5.99128 0 1.75446e-07 X.SEAEEALTSFN(Deamidated)GHKPPGSSEPLTVK.X UniProt_B4DVB8 UniProt_Q15717 genCDS_ENST00000351593_19_7963483-7991815_-1 genCDS_ENST00000407627_19_7963483-7991815_-1 genCDS_ENST00000596459_19_7963483-7991815_-1
|
||||
query:105836;rank:1;spectrum:716.36646_2072.32_spectrum=141400_uteruspremenopause;rt:2072.32;mz:716.36646;charge:2 5.83486 0 2.51791e-07 X.VASSPVM(Oxidation)VSNPATR.X UniProt_A6NEM2 UniProt_P51610 UniProt_P51610-2 UniProt_P51610-4 genCDS_ENST00000310441_X_153949347-153970840_-1 genCDS_ENST00000369984_X_153949347-153970840_-1
|
||||
query:89905;rank:1;spectrum:657.87396_3407.52_spectrum=152816_uteruspremenopause;rt:3407.52;mz:657.87396;charge:2 5.75831 0 3.00493e-07 X.EHALLAYTLGVK.X Augustus2_AUGUSTUS00000028250_3_184026960-184027756_-1 UniProt_P68104 UniProt_Q05639 UniProt_Q5VTE0 calCuffs_CUFF.68550.1_19_35873852-35875252_1_1_ORF2 ensBodymap_RNASEQT00000006703_5_14651962-14653630_-1 ensBodymap_RNASEQT00000053260_5_14650973-14653630_-1 ensBodymap_RNASEQT00000095825_9_135894020-135896638_1 ensBodymap_RNASEQT00000213862_9_135894020-135896638_1 genCDS_ENST00000217182_20_63488298-63497763_-1 genCDS_ENST00000298049_20_63488298-63497763_-1 genCDS_ENST00000309268_6_73517810-73520026_-1 genCDS_ENST00000316292_6_73517810-73520026_-1 genCDS_ENST00000331523_6_73517810-73520026_-1 genCDS_ENST00000615060_6_73517916-73520026_-1 genpseudogene_ENST00000415278_1_96446930-96448318_1_1_ORF2 genpseudogene_ENST00000419025_3_184026369-184027756_-1_2_ORF4 genpseudogene_ENST00000436459_9_133019486-133020874_1_1_ORF1 genpseudogene_ENST00000514975_4_105484698-105486080_1_1_ORF1 genpseudogene_ENST00000596811_19_35382172-35384052_1_1_ORF5 yalePseudo_PGOHUM00000234671_19_35873074-35874951_1_2_ORF13 yalePseudo_PGOHUM00000237893_3_183744160-183745544_-1_2_ORF4 yalePseudo_PGOHUM00000244804_1_96912486-96913871_1_1_ORF2 yalePseudo_PGOHUM00000246017_4_106405855-106407234_1_1_ORF1
|
||||
query:120224;rank:1;spectrum:772.3432_1845.25_spectrum=39781_uteruspremenopause;rt:1845.25;mz:772.3432;charge:2 5.59137 0 4.41859e-07 X.FYEQM(Oxidation)N(Deamidated)GPVAGASR.X UniProt_E9PI39 UniProt_E9PIZ1 UniProt_E9PK01 UniProt_E9PK06 UniProt_E9PK72 UniProt_E9PKK3 UniProt_E9PL12 UniProt_E9PL71 UniProt_E9PMW7 UniProt_E9PN91 UniProt_E9PPR1 UniProt_E9PQ49 UniProt_E9PQZ1 UniProt_E9PRY8 UniProt_H0YCK7 UniProt_P29692 UniProt_P29692-2 UniProt_P29692-3 UniProt_P29692-4 genCDS_ENST00000317198_8_143579792-143586845_-1 genCDS_ENST00000395119_8_143579792-143586845_-1 genCDS_ENST00000419152_8_143579792-143586845_-1 genCDS_ENST00000423316_8_143579792-143590081_-1 genCDS_ENST00000442189_8_143579792-143590081_-1 genCDS_ENST00000524397_8_143580630-143586845_-1 genCDS_ENST00000524624_8_143579792-143586845_-1 genCDS_ENST00000525223_8_143586729-143586845_-1 genCDS_ENST00000526340_8_143586219-143586845_-1 genCDS_ENST00000526838_8_143579792-143586845_-1 genCDS_ENST00000528610_8_143579792-143586845_-1 genCDS_ENST00000529007_8_143580630-143586845_-1 genCDS_ENST00000529272_8_143579792-143586845_-1 genCDS_ENST00000529516_8_143580642-143586845_-1 genCDS_ENST00000530191_8_143580506-143586845_-1 genCDS_ENST00000530445_8_143580620-143586845_-1 genCDS_ENST00000530616_8_143580630-143589222_-1 genCDS_ENST00000531218_8_143580522-143586845_-1 genCDS_ENST00000531621_8_143579792-143586845_-1 genCDS_ENST00000532543_8_143586729-143586845_-1 genCDS_ENST00000532741_8_143579792-143590231_-1 genCDS_ENST00000533204_8_143580506-143586845_-1 genCDS_ENST00000533494_8_143580613-143586845_-1 genCDS_ENST00000533749_8_143581079-143599321_-1 genCDS_ENST00000533833_8_143580630-143586845_-1 genCDS_ENST00000534377_8_143580186-143586845_-1 genCDS_ENST00000534380_8_143580034-143586845_-1 genCDS_ENST00000618139_8_143580019-143590081_-1 genpseudogene_ENST00000433698_9_92836826-92837668_-1_1_ORF1 yalePseudo_PGOHUM00000236264_9_95599111-95599989_-1_1_ORF1
|
||||
query:83950;rank:1;spectrum:640.32916_1950.76_spectrum=62954_uteruspremenopause;rt:1950.76;mz:640.32916;charge:2 5.43278 0 6.3732e-07 X.YLAEVAAGDDKK.X UniProt_B0AZS6 UniProt_B7Z2E6 UniProt_E7EX29 UniProt_H0YB80 UniProt_P63104 UniProt_P63104-2 genCDS_ENST00000353245_8_100920693-100948889_-1 genCDS_ENST00000395948_8_100920693-100948658_-1 genCDS_ENST00000395951_8_100920693-100948889_-1 genCDS_ENST00000395953_8_100920693-100948889_-1 genCDS_ENST00000395956_8_100920693-100948889_-1 genCDS_ENST00000395957_8_100920693-100948889_-1 genCDS_ENST00000395958_8_100920693-100948889_-1 genCDS_ENST00000419477_8_100920693-100948889_-1 genCDS_ENST00000457309_8_100920693-100948889_-1 genCDS_ENST00000521309_8_100920693-100924973_-1 genCDS_ENST00000521607_8_100920716-100948889_-1 genCDS_ENST00000522542_8_100920693-100948145_-1 genCDS_ENST00000522819_8_100920693-100924973_-1 genCDS_ENST00000523848_8_100920693-100924988_-1 genpseudogene_ENST00000415292_10_23136924-23137661_1_1_ORF1
|
||||
query:70327;rank:1;spectrum:602.85034_3098.02_spectrum=159460_uteruspremenopause;rt:3098.02;mz:602.85034;charge:2 5.3382 0 7.92901e-07 X.TLMALGSLAVTK.X UniProt_H0YCU9 UniProt_Q01995 genCDS_ENST00000278968_11_117203014-117204359_1 genCDS_ENST00000392951_11_117203014-117204359_1 genCDS_ENST00000525531_11_117203014-117204359_1 genCDS_ENST00000529622_11_117203144-117204359_1 genCDS_ENST00000530649_11_117203014-117204359_1 genCDS_ENST00000532870_11_117203014-117204359_1
|
||||
query:161278;rank:1;spectrum:725.35535_3439.5_spectrum=82985_uteruspremenopause;rt:3439.5;mz:725.35535;charge:3 5.26056 0 9.48615e-07 X.LEWLESHQDADLEDFKAK.X UniProt_P11021 genCDS_ENST00000324460_9_125236592-125241126_-1
|
||||
query:61382;rank:1;spectrum:578.83197_2603.98_spectrum=142644_uteruspremenopause;rt:2603.98;mz:578.83197;charge:2 5.23568 0 1.00471e-06 X.VKGDVDVSLPK.X UniProt_Q09666 genCDS_ENST00000378024_11_62516744-62536098_-1
|
||||
query:121082;rank:1;spectrum:776.46204_3500.05_spectrum=153073_uteruspremenopause;rt:3500.05;mz:776.46204;charge:2 4.84174 0 2.49494e-06 X.LVQVALNGLENLLR.X UniProt_F5GYL8 UniProt_F5H4G7 UniProt_H0Y3K0 UniProt_O15131 UniProt_O60684 UniProt_P52294 genCDS_ENST00000344337_3_122426985-122496565_-1 genCDS_ENST00000356348_6_116681335-116732323_1 genCDS_ENST00000368564_6_116681335-116732323_1 genCDS_ENST00000373625_1_32108131-32170894_1 genCDS_ENST00000392517_6_116729563-116732323_1
|
||||
query:93986;rank:1;spectrum:671.32318_2044.34_spectrum=17669_uteruspremenopause;rt:2044.34;mz:671.32318;charge:2 4.67543 0 3.66237e-06 X.YELEETETVTK.X UniProt_C9J813 UniProt_E7EX44 UniProt_E9PGZ1 UniProt_F5H1Z9 UniProt_Q05682 UniProt_Q05682-2 UniProt_Q05682-3 UniProt_Q05682-4 UniProt_Q05682-5 UniProt_Q05682-6 genCDS_ENST00000361675_7_134867734-134968345_1 genCDS_ENST00000361901_7_134867734-134968345_1 genCDS_ENST00000393118_7_134891621-134968345_1 genCDS_ENST00000417172_7_134867734-134968345_1 genCDS_ENST00000422748_7_134867734-134968345_1 genCDS_ENST00000424922_7_134891621-134968345_1 genCDS_ENST00000436461_7_134867734-134960056_1 genCDS_ENST00000443197_7_134891621-134962918_1 genCDS_ENST00000495522_7_134891621-134968345_1
|
||||
query:108382;rank:1;spectrum:363.20432_2784.99_spectrum=158641_uteruspremenopause;rt:2784.99;mz:363.20432;charge:4 4.56709 0 4.70247e-06 X.VVAGVANALAHKYH.X UniProt_P02042 UniProt_P68871 genCDS_ENST00000335295_11_5225598-5227021_-1 genCDS_ENST00000380299_11_5232964-5234433_-1
|
||||
query:102060;rank:1;spectrum:701.8067_912.458_spectrum=14837_uteruspremenopause;rt:912.458;mz:701.8067;charge:2 4.56217 0 4.75611e-06 X.SDESDQQESLHK.X UniProt_G3V5E5 UniProt_H0YJJ8 UniProt_P49770 genCDS_ENST00000266126_14_75002991-75009188_1 genCDS_ENST00000553401_14_75003018-75005873_1 genCDS_ENST00000556028_14_75002991-75005920_1
|
||||
query:41841;rank:1;spectrum:522.80469_1137.9_spectrum=15355_uteruspremenopause;rt:1137.9;mz:522.80469;charge:2 4.55643 0 4.8195e-06 X.TSTGAPAALKK.X UniProt_B8ZZL6 UniProt_E7ENU9 UniProt_P40121 UniProt_P40121-2 genCDS_ENST00000263867_2_85394893-85402145_-1 genCDS_ENST00000409275_2_85399146-85402145_-1 genCDS_ENST00000409670_2_85394893-85402145_-1 genCDS_ENST00000409724_2_85394893-85402145_-1 genCDS_ENST00000409921_2_85394893-85402145_-1 genCDS_ENST00000439385_2_85398690-85402145_-1 genCDS_ENST00000447219_2_85398690-85402145_-1 genCDS_ENST00000449030_2_85398690-85402145_-1
|
||||
query:67749;rank:1;spectrum:596.77612_2303.32_spectrum=10843_uteruspremenopause;rt:2303.32;mz:596.77612;charge:2 4.29846 0 8.73504e-06 X.(Acetyl)EAESSPFVER.X UniProt_P14625 genCDS_ENST00000299767_12_103930516-103947662_1
|
||||
query:113387;rank:1;spectrum:745.88556_2835.91_spectrum=65124_uteruspremenopause;rt:2835.91;mz:745.88556;charge:2 4.24758 0 9.82097e-06 X.NQYVTLHDM(Oxidation)LLK.X UniProt_B3KQ25 UniProt_K7ESG5 UniProt_P61289 UniProt_P61289-2 genCDS_ENST00000293362_17_42833632-42841578_1 genCDS_ENST00000441946_17_42834182-42841578_1 genCDS_ENST00000541124_17_42833632-42841578_1 genCDS_ENST00000545225_17_42834817-42841578_1 genCDS_ENST00000590720_17_42833632-42841578_1 genCDS_ENST00000592169_17_42833632-42841578_1 genCDS_ENST00000622892_17_42833632-42841578_1
|
||||
query:125401;rank:1;spectrum:532.63049_2532.44_spectrum=80569_uteruspremenopause;rt:2532.44;mz:532.63049;charge:3 4.23343 0 1.01462e-05 X.GLHQSTLDLKNELK.X UniProt_Q14258 genCDS_ENST00000316881_17_56891700-56913988_-1 genCDS_ENST00000537230_17_56891700-56913988_-1
|
||||
query:164495;rank:1;spectrum:1143.5902_3304.6_spectrum=121470_uteruspremenopause;rt:3304.6;mz:1143.5902;charge:2 4.20795 0 1.07591e-05 X.YTPVQQGPVGVNVTYGGDPLPK.X UniProt_P21333 UniProt_P21333-2 UniProt_Q5HY54 genCDS_ENST00000344736_X_154348849-154371245_-1 genCDS_ENST00000360319_X_154348849-154371245_-1 genCDS_ENST00000369850_X_154348849-154371245_-1 genCDS_ENST00000369856_X_154348849-154371164_-1 genCDS_ENST00000422373_X_154348849-154371245_-1 genCDS_ENST00000610817_X_154348849-154371164_-1
|
||||
query:139545;rank:1;spectrum:586.2818_2698.67_spectrum=72867_uteruspremenopause;rt:2698.67;mz:586.2818;charge:3 3.86858 0 2.34555e-05 X.SPFEVYVDKSQGDASK.X UniProt_F8WE98 UniProt_P21333 UniProt_P21333-2 UniProt_Q5HY54 genCDS_ENST00000344736_X_154348849-154371245_-1 genCDS_ENST00000360319_X_154348849-154371245_-1 genCDS_ENST00000369850_X_154348849-154371245_-1 genCDS_ENST00000369856_X_154348849-154371164_-1 genCDS_ENST00000420627_X_154364689-154371203_-1 genCDS_ENST00000422373_X_154348849-154371245_-1 genCDS_ENST00000610817_X_154348849-154371164_-1
|
||||
query:20233;rank:1;spectrum:453.24112_1930.62_spectrum=171610_uteruspremenopause;rt:1930.62;mz:453.24112;charge:2 3.73764 0 3.16384e-05 X.ATDVMLAGK.X UniProt_P23526 UniProt_P23526-2 genCDS_ENST00000217426_20_34281034-34303270_-1 genCDS_ENST00000538132_20_34281034-34295529_-1
|
||||
query:81528;rank:1;spectrum:422.55518_3442.78_spectrum=98225_uteruspremenopause;rt:3442.78;mz:422.55518;charge:3 3.73141 0 3.20907e-05 X.TEFSLLHYAGK.X UniProt_P35749 UniProt_P35749-2 UniProt_P35749-3 UniProt_P35749-4 genCDS_ENST00000300036_16_15703991-15838252_-1 genCDS_ENST00000396324_16_15703991-15838252_-1 genCDS_ENST00000452625_16_15708811-15838252_-1 genCDS_ENST00000576790_16_15708811-15838252_-1 genCDS_ENST00000611087_16_15703879-15838252_-1 genCDS_ENST00000616439_16_15703879-15838252_-1
|
||||
query:116580;rank:1;spectrum:505.94232_2944.82_spectrum=120611_uteruspremenopause;rt:2944.82;mz:505.94232;charge:3 3.69185 0 3.51185e-05 X.TLRDLEVVEGSAAR.X UniProt_Q15746 UniProt_Q15746-10 UniProt_Q15746-11 UniProt_Q15746-2 UniProt_Q15746-3 UniProt_Q15746-4 UniProt_Q15746-5 UniProt_Q15746-6 UniProt_Q15746-7 UniProt_Q15746-8 UniProt_Q15746-9 genCDS_ENST00000346322_3_123614105-123793841_-1 genCDS_ENST00000354792_3_123614105-123793841_-1 genCDS_ENST00000359169_3_123614105-123793841_-1 genCDS_ENST00000360304_3_123614105-123793841_-1 genCDS_ENST00000360772_3_123614105-123793841_-1 genCDS_ENST00000418370_3_123614105-123620294_-1 genCDS_ENST00000475616_3_123614105-123793841_-1 genCDS_ENST00000578202_3_123614105-123620294_-1 genCDS_ENST00000583087_3_123614105-123620294_-1
|
||||
query:68430;rank:1;spectrum:598.2746_1630.22_spectrum=54409_uteruspremenopause;rt:1630.22;mz:598.2746;charge:2 3.62415 0 4.09639e-05 X.WCALSHHER.X UniProt_J3KN47 UniProt_P02787 genCDS_ENST00000402696_3_133746441-133778620_1
|
||||
query:74880;rank:1;spectrum:614.34271_3247.74_spectrum=43355_uteruspremenopause;rt:3247.74;mz:614.34271;charge:2 3.44948 0 6.07926e-05 X.EVM(Oxidation)LLLTGAHK.X UniProt_B7Z3X4 UniProt_D6R9P4 UniProt_D6RFF8 UniProt_E7EVU7 UniProt_P46926 UniProt_Q8TDQ7 UniProt_Q8TDQ7-2 UniProt_Q8TDQ7-3 UniProt_Q8TDQ7-4 UniProt_Q8TDQ7-5 UniProt_V9GYK3 genCDS_ENST00000295448_4_44703081-44722207_-1 genCDS_ENST00000311337_5_142002029-142012035_-1 genCDS_ENST00000500692_5_142002029-142012035_-1 genCDS_ENST00000503794_5_142002029-142012035_-1 genCDS_ENST00000505689_5_142002090-142012035_-1 genCDS_ENST00000507534_4_44703081-44718324_-1 genCDS_ENST00000507917_4_44703081-44722207_-1 genCDS_ENST00000508177_5_142002029-142012035_-1 genCDS_ENST00000509756_4_44707741-44722207_-1 genCDS_ENST00000513454_5_141991865-142012035_-1 genCDS_ENST00000609092_4_44682339-44711023_-1
|
||||
query:28620;rank:1;spectrum:480.78506_3493.94_spectrum=83136_uteruspremenopause;rt:3493.94;mz:480.78506;charge:2 3.4276 0 6.3855e-05 X.FQNALLVR.X CON_P02768-1 UniProt_B7WNR0 UniProt_C9JKR2 UniProt_D6RHD5 UniProt_H0YA55 UniProt_P02768 UniProt_P02768-2 genCDS_ENST00000295897_4_73404328-73420298_1 genCDS_ENST00000401494_4_73404328-73420298_1 genCDS_ENST00000415165_4_73404328-73420298_1 genCDS_ENST00000503124_4_73406730-73420298_1 genCDS_ENST00000509063_4_73404328-73421121_1 genCDS_ENST00000511370_4_73409340-73420298_1 genCDS_ENST00000621085_4_73404328-73420298_1 genCDS_ENST00000621628_4_73404328-73420298_1
|
||||
query:103766;rank:1;spectrum:473.23645_1715.59_spectrum=163581_uteruspremenopause;rt:1715.59;mz:473.23645;charge:3 3.41086 0 6.62984e-05 X.DLSTNYYASQKK.X UniProt_H0YIV0 UniProt_P14625 genCDS_ENST00000299767_12_103930516-103947662_1 genCDS_ENST00000550595_12_103943796-103953394_1
|
||||
query:150850;rank:1;spectrum:961.95966_2525.59_spectrum=88300_uteruspremenopause;rt:2525.59;mz:961.95966;charge:2 3.3544 0 7.52191e-05 X.DLQM(Oxidation)TQSPSSLSVSVGDR.X UniProt_P01605
|
||||
query:42641;rank:1;spectrum:525.26251_2586.03_spectrum=158158_uteruspremenopause;rt:2586.03;mz:525.26251;charge:2 3.24482 0 9.5912e-05 X.HTNFVEFR.X UniProt_M0QYZ2 UniProt_M0QZ21 UniProt_M0R0N4 UniProt_P53680 genCDS_ENST00000263270_19_46838447-46850766_-1 genCDS_ENST00000597020_19_46838447-46846085_-1 genCDS_ENST00000599990_19_46838447-46850664_-1 genCDS_ENST00000601498_19_46838447-46850184_-1
|
||||
query:81555;rank:1;spectrum:633.38092_3300.56_spectrum=13202_uteruspremenopause;rt:3300.56;mz:633.38092;charge:2 3.13577 0 0.000121753 X.VVLAPQDVVVAR.X UniProt_Q13308 UniProt_Q13308-2 UniProt_Q13308-3 UniProt_Q13308-4 UniProt_Q13308-5 UniProt_Q13308-6 UniProt_Q86X91 genCDS_ENST00000230418_6_43076489-43146661_1 genCDS_ENST00000230419_6_43076489-43160881_1 genCDS_ENST00000345201_6_43076489-43160881_1 genCDS_ENST00000349241_6_43076489-43160881_1 genCDS_ENST00000352931_6_43076489-43160881_1 genCDS_ENST00000471863_6_43076489-43132839_1 genCDS_ENST00000481273_6_43076884-43160881_1
|
||||
query:155440;rank:1;spectrum:673.72321_3106.63_spectrum=143874_uteruspremenopause;rt:3106.63;mz:673.72321;charge:3 3.10231 2.28599e-05 0.00013089 X.LKPEDLTQLQPQQLVLR.X UniProt_C9JPK5 UniProt_E7EQW5 UniProt_E7ERX5 UniProt_E7EUI6 UniProt_E9PLR6 UniProt_P05556 UniProt_P05556-2 UniProt_P05556-3 UniProt_P05556-4 UniProt_P05556-5 UniProt_Q5T3E6 genCDS_ENST00000302278_10_32901570-32935558_-1 genCDS_ENST00000396033_10_32901570-32935558_-1 genCDS_ENST00000423113_10_32907069-32935558_-1 genCDS_ENST00000437302_10_32928232-32935558_-1 genCDS_ENST00000474568_10_32928174-32930026_-1 genCDS_ENST00000475184_10_32929824-32935558_-1 genCDS_ENST00000480226_10_32928150-32935558_-1 genCDS_ENST00000488494_10_32928193-32935558_-1 genCDS_ENST00000534049_10_32928212-32935558_-1
|
||||
query:23764;rank:1;spectrum:465.2739_1931.52_spectrum=118184_uteruspremenopause;rt:1931.52;mz:465.2739;charge:2 2.96175 4.11168e-05 0.000176679 X.QVNLTVQK.X UniProt_H3BPZ1 UniProt_H3BS72 UniProt_Q9P035 genCDS_ENST00000261875_15_65530632-65576379_1 genCDS_ENST00000565299_15_65530632-65576379_1 genCDS_ENST00000568793_15_65530632-65576379_1
|
||||
query:113164;rank:1;spectrum:744.89307_1335.79_spectrum=53683_uteruspremenopause;rt:1335.79;mz:744.89307;charge:2 2.94029 4.11168e-05 0.000184873 X.RKPDTLEVQQM(Oxidation)K.X Augustus2_AUGUSTUS00000009543_5_25910749-25909503_1 UniProt_E7EQR4 UniProt_P15311 UniProt_P26038 UniProt_P35241 UniProt_P35241-4 UniProt_P35241-5 ensBodymap_RNASEQT00000007907_5_25909357-26027537_1 ensBodymap_RNASEQT00000020282_5_25909357-26027537_1 ensBodymap_RNASEQT00000153980_5_25909357-25913455_1 genCDS_ENST00000337147_6_158766914-158818093_-1 genCDS_ENST00000343115_11_110231869-110279692_-1 genCDS_ENST00000360270_X_65667842-65739893_1 genCDS_ENST00000367075_6_158766914-158818093_-1 genCDS_ENST00000392177_6_158766914-158789474_-1 genCDS_ENST00000405097_11_110199612-110279692_-1 genCDS_ENST00000528498_11_110199612-110279692_-1 genCDS_ENST00000530749_11_110199612-110279692_-1 genCDS_ENST00000544551_11_110231869-110272594_-1 genpseudogene_ENST00000367074_X_27517884-27519759_1_3_ORF10 genpseudogene_ENST00000511640_5_25909503-25911234_1_3_ORF3 yalePseudo_PGOHUM00000235534_5_25909612-25911337_1_3_ORF3
|
||||
query:88804;rank:1;spectrum:655.29285_1964.03_spectrum=141151_uteruspremenopause;rt:1964.03;mz:655.29285;charge:2 2.93857 4.11168e-05 0.000185547 X.EVEVEVESM(Oxidation)DK.X UniProt_Q7KZF4 genCDS_ENST00000354725_7_127652374-128092058_1
|
||||
query:86060;rank:1;spectrum:646.33569_2494.06_spectrum=33876_uteruspremenopause;rt:2494.06;mz:646.33569;charge:2 2.87421 4.11168e-05 0.000212455 X.AQSLEPYGTGLR.X UniProt_K7ERU2 UniProt_Q63ZY3 UniProt_Q63ZY3-2 UniProt_Q63ZY3-3 genCDS_ENST00000586659_19_11166558-11194511_-1 genCDS_ENST00000589359_19_11166558-11194511_-1 genCDS_ENST00000589894_19_11169853-11194511_-1 genCDS_ENST00000592675_19_11192881-11193248_-1
|
||||
query:90688;rank:1;spectrum:660.26282_1490.8_spectrum=109667_uteruspremenopause;rt:1490.8;mz:660.26282;charge:2 2.87129 4.11168e-05 0.000213763 X.YTM(Oxidation)GDAPDYDR.X UniProt_B9ZVX7 UniProt_E7EWW9 UniProt_E9PHN6 UniProt_E9PHN7 UniProt_E9PLF1 UniProt_F6XZQ7 UniProt_H3BQT3 UniProt_P09488 UniProt_P09488-2 UniProt_P28161 UniProt_P28161-2 UniProt_Q03013 UniProt_Q03013-2 UniProt_Q03013-3 genCDS_ENST00000241337_1_109668116-109674836_1 genCDS_ENST00000309851_1_109687874-109693295_1 genCDS_ENST00000326729_1_109656390-109665031_1 genCDS_ENST00000336075_1_109656390-109674836_1 genCDS_ENST00000349334_1_109687874-109693295_1 genCDS_ENST00000369819_1_109687874-109693295_1 genCDS_ENST00000369823_1_109687874-109693295_1 genCDS_ENST00000369827_1_109668116-109674836_1 genCDS_ENST00000369829_1_109668116-109673217_1 genCDS_ENST00000369831_1_109668116-109708576_1 genCDS_ENST00000369836_1_109656390-109661254_1 genCDS_ENST00000442650_1_109668116-109681817_1 genCDS_ENST00000460717_1_109668116-109681817_1 genCDS_ENST00000467579_1_109668116-109671486_1 genCDS_ENST00000483399_1_109687874-109689305_1
|
||||
query:127987;rank:1;spectrum:813.32916_1266.09_spectrum=69023_uteruspremenopause;rt:1266.09;mz:813.32916;charge:2 2.77394 5.68587e-05 0.000262028 X.LECDDKGDGSCDVR.X UniProt_P21333 UniProt_P21333-2 UniProt_Q14315 UniProt_Q14315-2 UniProt_Q5HY54 genCDS_ENST00000325888_7_128830638-128858523_1 genCDS_ENST00000344736_X_154348849-154371245_-1 genCDS_ENST00000346177_7_128830638-128858523_1 genCDS_ENST00000360319_X_154348849-154371245_-1 genCDS_ENST00000369850_X_154348849-154371245_-1 genCDS_ENST00000369856_X_154348849-154371164_-1 genCDS_ENST00000422373_X_154348849-154371245_-1 genCDS_ENST00000610817_X_154348849-154371164_-1
|
||||
query:154012;rank:1;spectrum:663.6684_2273.32_spectrum=79890_uteruspremenopause;rt:2273.32;mz:663.6684;charge:3 2.74607 5.68587e-05 0.000277701 X.VNPFRPGDSEPPPAPGAQR.X UniProt_C9IZ41 UniProt_H0Y2Y8 UniProt_Q15942 genCDS_ENST00000322764_7_143381572-143390682_1 genCDS_ENST00000354434_7_143381575-143390682_1 genCDS_ENST00000457235_7_143381572-143382676_1
|
||||
query:136470;rank:1;spectrum:572.59875_1543.09_spectrum=101367_uteruspremenopause;rt:1543.09;mz:572.59875;charge:3 2.67373 5.68587e-05 0.000322851 X.QEPERN(Deamidated)ECFLQHK.X CON_P02768-1 UniProt_H7C013 UniProt_P02768 genCDS_ENST00000295897_4_73404328-73420298_1 genCDS_ENST00000441319_4_73397114-73409457_1 genCDS_ENST00000509063_4_73404328-73421121_1 genCDS_ENST00000621085_4_73404328-73420298_1 genCDS_ENST00000621628_4_73404328-73420298_1
|
||||
query:106081;rank:1;spectrum:717.35742_2615.44_spectrum=165819_uteruspremenopause;rt:2615.44;mz:717.35742;charge:2 2.64505 5.68587e-05 0.00034272 X.AYGPGLEPTGNMVK.X UniProt_F8WE98 UniProt_P21333 UniProt_P21333-2 UniProt_Q5HY54 genCDS_ENST00000344736_X_154348849-154371245_-1 genCDS_ENST00000360319_X_154348849-154371245_-1 genCDS_ENST00000369850_X_154348849-154371245_-1 genCDS_ENST00000369856_X_154348849-154371164_-1 genCDS_ENST00000420627_X_154364689-154371203_-1 genCDS_ENST00000422373_X_154348849-154371245_-1 genCDS_ENST00000610817_X_154348849-154371164_-1
|
||||
query:135079;rank:1;spectrum:425.48462_2830.36_spectrum=96739_uteruspremenopause;rt:2830.36;mz:425.48462;charge:4 2.64252 5.68587e-05 0.000344529 X.TGVELGKPTHFTVNAK.X UniProt_P21333 UniProt_P21333-2 UniProt_Q5HY54 genCDS_ENST00000344736_X_154348849-154371245_-1 genCDS_ENST00000360319_X_154348849-154371245_-1 genCDS_ENST00000369850_X_154348849-154371245_-1 genCDS_ENST00000369856_X_154348849-154371164_-1 genCDS_ENST00000422373_X_154348849-154371245_-1 genCDS_ENST00000610817_X_154348849-154371164_-1
|
||||
query:133212;rank:1;spectrum:558.92828_2461.58_spectrum=18781_uteruspremenopause;rt:2461.58;mz:558.92828;charge:3 2.52804 6.99035e-05 0.000437424 X.LSPQFPNEEDSFHK.X UniProt_P49770 genCDS_ENST00000266126_14_75002991-75009188_1
|
||||
query:139472;rank:1;spectrum:585.95319_3414.38_spectrum=137257_uteruspremenopause;rt:3414.38;mz:585.95319;charge:3 2.48232 6.99035e-05 0.000481293 X.VFDKDGN(Deamidated)GYLSAAELR.X UniProt_E7EMB3 UniProt_E7ETZ0 UniProt_G3V361 UniProt_H0Y7A7 UniProt_P62158 UniProt_Q96HY3 genCDS_ENST00000272298_2_47160776-47176443_-1 genCDS_ENST00000291295_19_46601435-46609153_1 genCDS_ENST00000356978_14_90397231-90404717_1 genCDS_ENST00000391918_19_46608271-46609153_1 genCDS_ENST00000409563_2_47160776-47167650_-1 genCDS_ENST00000447653_14_90399082-90404717_1 genCDS_ENST00000456319_2_47160776-47176511_-1 genCDS_ENST00000544280_14_90401333-90404717_1 genCDS_ENST00000553542_14_90401333-90404717_1 genCDS_ENST00000557020_14_90401333-90404496_1 genCDS_ENST00000594523_19_46608271-46609153_1 genCDS_ENST00000596362_19_46602208-46609153_1 genCDS_ENST00000598871_19_46608271-46609153_1 genCDS_ENST00000599839_19_46608271-46609153_1
|
||||
query:75760;rank:1;spectrum:411.56995_2371.79_spectrum=149868_uteruspremenopause;rt:2371.79;mz:411.56995;charge:3 2.46586 6.99035e-05 0.000498166 X.SNFKPSLLAQK.X UniProt_C9JJ47 UniProt_E9PFW3 UniProt_Q96CW1 UniProt_Q96CW1-2 genCDS_ENST00000292807_3_184176994-184183616_1 genCDS_ENST00000382456_3_184176994-184183616_1 genCDS_ENST00000411763_3_184176994-184183616_1 genCDS_ENST00000432591_3_184176994-184182054_1 genCDS_ENST00000439647_3_184176994-184183616_1 genCDS_ENST00000621863_3_184176994-184183616_1
|
||||
query:13577;rank:1;spectrum:430.2381_2030.02_spectrum=133876_uteruspremenopause;rt:2030.02;mz:430.2381;charge:2 2.43497 6.99035e-05 0.000531473 X.LQLPNM(Oxidation)K.X UniProt_G3V281 UniProt_G3V5R2 UniProt_H0YJ34 UniProt_Q96AC1 UniProt_Q96AC1-2 UniProt_Q96AC1-3 genCDS_ENST00000341590_14_52858377-52950568_-1 genCDS_ENST00000343279_14_52858377-52950568_-1 genCDS_ENST00000395631_14_52858377-52950568_-1 genCDS_ENST00000399304_14_52859561-52950568_-1 genCDS_ENST00000553373_14_52858377-52950568_-1 genCDS_ENST00000554152_14_52858377-52919339_-1 genCDS_ENST00000554712_14_52893359-52950568_-1 genCDS_ENST00000555692_14_52893288-52928044_-1
|
||||
query:23073;rank:1;spectrum:463.27121_2707.23_spectrum=57220_uteruspremenopause;rt:2707.23;mz:463.27121;charge:2 2.37455 6.99035e-05 0.000603366 X.VPSGLPDLK.X UniProt_P21810 genCDS_ENST00000331595_X_153504632-153508445_1
|
||||
query:35867;rank:1;spectrum:503.7821_2660.72_spectrum=19332_uteruspremenopause;rt:2660.72;mz:503.7821;charge:2 2.36667 6.99035e-05 0.000613454 X.LVLEYVDR.X UniProt_E7ETH0 UniProt_G3XAM2 UniProt_P05156 genCDS_ENST00000394634_4_109740893-109801971_-1 genCDS_ENST00000394635_4_109740893-109801971_-1 genCDS_ENST00000512148_4_109740893-109801971_-1
|
||||
query:776;rank:1;spectrum:365.2341_2550.23_spectrum=11418_uteruspremenopause;rt:2550.23;mz:365.2341;charge:2 2.30486 8.72312e-05 0.000698664 X.ATVGLLR.X UniProt_B4DGU4 UniProt_P35222 calCuffs_CUFF.144442.10_7_134101990-134117256_-1_3_ORF25 calCuffs_CUFF.144442.11_7_134101990-134117266_-1_2_ORF13 calCuffs_CUFF.144442.12_7_134101990-134117277_-1_1_ORF18 calCuffs_CUFF.144442.13_7_134101990-134117277_-1_2_ORF23 calCuffs_CUFF.144442.9_7_134101990-134117207_-1_1_ORF15 genCDS_ENST00000349496_3_41224069-41239342_1 genCDS_ENST00000396183_3_41224069-41239342_1 genCDS_ENST00000396185_3_41224069-41239342_1 genCDS_ENST00000405570_3_41224069-41239342_1 genCDS_ENST00000453024_3_41224534-41239342_1
|
||||
query:18439;rank:1;spectrum:447.25858_2796.88_spectrum=73148_uteruspremenopause;rt:2796.88;mz:447.25858;charge:2 2.29139 0.000102579 0.000718741 X.TLLFSGQK.X UniProt_Q07954 genCDS_ENST00000243077_12_57128965-57212555_1
|
||||
query:16494;rank:1;spectrum:440.72366_1790.49_spectrum=86445_uteruspremenopause;rt:1790.49;mz:440.72366;charge:2 2.26159 0.000102579 0.00076526 X.AEFAEVSK.X CON_P02768-1 UniProt_B7WNR0 UniProt_C9JKR2 UniProt_D6RHD5 UniProt_H0YA55 UniProt_P02768 UniProt_P02768-2 genCDS_ENST00000295897_4_73404328-73420298_1 genCDS_ENST00000401494_4_73404328-73420298_1 genCDS_ENST00000415165_4_73404328-73420298_1 genCDS_ENST00000503124_4_73406730-73420298_1 genCDS_ENST00000509063_4_73404328-73421121_1 genCDS_ENST00000511370_4_73409340-73420298_1
|
||||
query:146021;rank:1;spectrum:614.65961_2560.2_spectrum=34039_uteruspremenopause;rt:2560.2;mz:614.65961;charge:3 2.19403 0.000116791 0.00088215 X.HVVPAQVHVN(Deamidated)GGALASER.X UniProt_E7ERH1 UniProt_E9PF55 UniProt_E9PGF5 UniProt_Q9HBL0 genCDS_ENST00000171887_2_217804459-217897965_-1 genCDS_ENST00000419504_2_217804459-217897965_-1 genCDS_ENST00000430930_2_217804459-217897965_-1 genCDS_ENST00000446903_2_217848176-218002872_-1 genCDS_ENST00000611415_2_217804459-217897965_-1 genCDS_ENST00000615025_2_217804459-217880904_-1
|
||||
query:40708;rank:1;spectrum:519.25708_2498.24_spectrum=127342_uteruspremenopause;rt:2498.24;mz:519.25708;charge:2 2.15281 0.000132074 0.00096205 X.(Acetyl)VNFAM(Oxidation)NVGK.X UniProt_P14618 UniProt_P14618-2 UniProt_P14618-3 UniProt_Q504U3 genCDS_ENST00000319622_15_72199650-72219097_-1 genCDS_ENST00000335181_15_72199650-72219097_-1 genCDS_ENST00000389093_15_72199650-72219097_-1 genCDS_ENST00000449901_15_72199650-72221201_-1 genCDS_ENST00000565154_15_72199650-72219097_-1 genCDS_ENST00000565184_15_72199650-72219097_-1 genCDS_ENST00000568459_15_72199650-72219097_-1 genCDS_ENST00000568883_15_72199650-72219097_-1
|
||||
query:101279;rank:1;spectrum:465.91821_2796_spectrum=73145_uteruspremenopause;rt:2796;mz:465.91821;charge:3 2.15095 0.000132074 0.000965824 X.VEHGSVALPALM(Oxidation)R.X UniProt_Q5TCU6 UniProt_Q9Y490 genCDS_ENST00000314888_9_35697791-35725694_-1
|
||||
query:65246;rank:1;spectrum:589.34381_3432.2_spectrum=182979_uteruspremenopause;rt:3432.2;mz:589.34381;charge:2 2.1457 0.000132074 0.00097655 X.EKGDYLLLVK.X UniProt_Q14315 UniProt_Q14315-2 genCDS_ENST00000325888_7_128830638-128858523_1 genCDS_ENST00000346177_7_128830638-128858523_1
|
||||
query:111686;rank:1;spectrum:492.8963_1268.73_spectrum=15674_uteruspremenopause;rt:1268.73;mz:492.8963;charge:3 2.14508 0.000132074 0.00097782 X.LEEAEKAADESER.X Augustus2_AUGUSTUS00000096365_2_230573165-230575961_-1 CON_Q3SX28 UniProt_B7Z596 UniProt_D6R904 UniProt_F5H7S3 UniProt_H0YK48 UniProt_H0YKP3 UniProt_H0YKX5 UniProt_H0YL52 UniProt_H0YL80 UniProt_H0YNC7 UniProt_H7BYY1 UniProt_J3KN67 UniProt_K7ENT6 UniProt_K7EP68 UniProt_K7ERG3 UniProt_P06753 UniProt_P06753-2 UniProt_P06753-3 UniProt_P06753-4 UniProt_P06753-5 UniProt_P07951 UniProt_P07951-2 UniProt_P07951-3 UniProt_P09493 UniProt_P09493-10 UniProt_P09493-2 UniProt_P09493-3 UniProt_P09493-4 UniProt_P09493-5 UniProt_P09493-6 UniProt_P09493-7 UniProt_P09493-8 UniProt_P09493-9 UniProt_P67936 UniProt_P67936-2 UniProt_Q5TCU3 UniProt_Q5TCU8 UniProt_Q5VU58 UniProt_Q5VU61 UniProt_Q6ZN40 genCDS_ENST00000267996_15_63042830-63071172_1 genCDS_ENST00000271850_1_154157639-154192018_-1 genCDS_ENST00000288398_15_63042830-63064146_1 genCDS_ENST00000300933_19_16076566-16101346_1 genCDS_ENST00000317516_15_63048576-63069943_1 genCDS_ENST00000323144_1_154158969-154183119_-1 genCDS_ENST00000328159_1_154157718-154183119_-1 genCDS_ENST00000329305_9_35682081-35689817_-1 genCDS_ENST00000330188_1_154157639-154183119_-1 genCDS_ENST00000334895_15_63048576-63069943_1 genCDS_ENST00000341372_1_154157639-154183119_-1 genCDS_ENST00000344824_19_16067625-16101346_1 genCDS_ENST00000357980_15_63042830-63071172_1 genCDS_ENST00000358278_15_63042830-63071172_1 genCDS_ENST00000360958_9_35683159-35689817_-1 genCDS_ENST00000368530_1_154167937-154192018_-1 genCDS_ENST00000368531_1_154158969-154183119_-1 genCDS_ENST00000368533_1_154157639-154183119_-1 genCDS_ENST00000378292_9_35682081-35689817_-1 genCDS_ENST00000378300_9_35682708-35689817_-1 genCDS_ENST00000403994_15_63042830-63065899_1 genCDS_ENST00000404484_15_63048576-63071172_1 genCDS_ENST00000509601_1_154172070-154183119_-1 genCDS_ENST00000558347_15_63042830-63061226_1 genCDS_ENST00000559281_15_63048576-63065899_1 genCDS_ENST00000559397_15_63042830-63071172_1 genCDS_ENST00000559556_15_63042830-63071172_1 genCDS_ENST00000559831_15_63044141-63061730_1 genCDS_ENST00000560959_15_63048576-63062809_1 genCDS_ENST00000560970_15_63042888-63064146_1 genCDS_ENST00000561266_15_63043776-63064146_1 genCDS_ENST00000561395_15_63057006-63061730_1 genCDS_ENST00000586499_19_16067897-16088093_1 genCDS_ENST00000586833_19_16075707-16093544_1 genCDS_ENST00000588410_19_16080953-16088066_1 genCDS_ENST00000611659_1_154157639-154183119_-1 genpseudogene_ENST00000330554_2_230573167-230573809_-1_1_ORF1 genpseudogene_ENST00000368528_3_27632976-27633720_1_2_ORF2 genpseudogene_ENST00000600996_19_41506152-41506898_1_3_ORF3 yalePseudo_PGOHUM00000240545_2_231437883-231438626_-1_1_ORF1
|
||||
query:48481;rank:1;spectrum:361.85358_1714.94_spectrum=140581_uteruspremenopause;rt:1714.94;mz:361.85358;charge:3 2.12562 0.000132074 0.00101867 X.VYLYHSSSK.X UniProt_B4DDT0 UniProt_H0YA32 UniProt_K7EMU3 UniProt_P26006 UniProt_P26006-1 genCDS_ENST00000007722_17_50056440-50089265_1 genCDS_ENST00000320031_17_50056440-50088335_1 genCDS_ENST00000510809_17_50072160-50074284_1 genCDS_ENST00000512553_17_50070873-50074514_1
|
||||
query:29295;rank:1;spectrum:483.24051_2183.66_spectrum=149333_uteruspremenopause;rt:2183.66;mz:483.24051;charge:2 2.06983 0.000144798 0.00114547 X.VDFNVPM(Oxidation)K.X UniProt_E7ERH5 UniProt_P00558 UniProt_P07205 genCDS_ENST00000304801_6_49785934-49787187_-1 genCDS_ENST00000373316_X_78104341-78125830_1
|
||||
query:36143;rank:1;spectrum:504.74222_1377.49_spectrum=31223_uteruspremenopause;rt:1377.49;mz:504.74222;charge:2 2.02503 0.000173319 0.00125862 X.SLM(Oxidation)SADNVR.X UniProt_O43143 genCDS_ENST00000336812_4_24527924-24584393_-1
|
||||
query:123327;rank:1;spectrum:525.58398_2676.85_spectrum=49516_uteruspremenopause;rt:2676.85;mz:525.58398;charge:3 1.99921 0.000173319 0.00132883 X.QVDVTSFAGHPCTR.X UniProt_H0Y5U1 UniProt_O00468 UniProt_O00468-2 UniProt_O00468-3 UniProt_O00468-4 UniProt_O00468-5 UniProt_O00468-6 UniProt_O00468-7 genCDS_ENST00000379370_1_1020173-1054981_1 genCDS_ENST00000419249_1_1050556-1053950_1 genCDS_ENST00000620552_1_1022414-1054981_1
|
||||
query:59938;rank:1;spectrum:575.31378_2777.5_spectrum=112771_uteruspremenopause;rt:2777.5;mz:575.31378;charge:2 1.9623 0.000173319 0.00143597 X.LVNEVTEFAK.X CON_P02768-1 UniProt_H7C013 UniProt_P02768 genCDS_ENST00000295897_4_73404328-73420298_1 genCDS_ENST00000441319_4_73397114-73409457_1 genCDS_ENST00000509063_4_73404328-73421121_1 genCDS_ENST00000621085_4_73404328-73420298_1 genCDS_ENST00000621628_4_73404328-73420298_1
|
||||
query:23238;rank:1;spectrum:464.21664_1155.55_spectrum=169721_uteruspremenopause;rt:1155.55;mz:464.21664;charge:2 1.87479 0.000198798 0.00172556 X.CQYVTEK.X UniProt_H3BPS8 UniProt_H3BQN4 UniProt_J3KPS3 UniProt_P04075 UniProt_P04075-2 UniProt_P09972 genCDS_ENST00000226253_17_28573526-28575532_-1 genCDS_ENST00000338110_16_30067255-30070212_1 genCDS_ENST00000395240_16_30067255-30070212_1 genCDS_ENST00000395248_16_30066898-30070212_1 genCDS_ENST00000395321_17_28573526-28575532_-1 genCDS_ENST00000412304_16_30067255-30070212_1 genCDS_ENST00000562679_16_30066898-30069547_1 genCDS_ENST00000563060_16_30067255-30070212_1 genCDS_ENST00000564546_16_30067255-30070212_1 genCDS_ENST00000564595_16_30066898-30070212_1 genCDS_ENST00000566897_16_30067255-30070212_1 genCDS_ENST00000569545_16_30067255-30070212_1 genCDS_ENST00000569798_16_30067255-30070116_1
|
||||
query:57302;rank:1;spectrum:379.21075_3171.84_spectrum=50657_uteruspremenopause;rt:3171.84;mz:379.21075;charge:3 1.8485 0.000212479 0.00182324 X.FKM(Oxidation)PELNLK.X UniProt_Q09666 genCDS_ENST00000378024_11_62516744-62536098_-1
|
||||
query:17102;rank:1;spectrum:442.76447_2988.18_spectrum=166780_uteruspremenopause;rt:2988.18;mz:442.76447;charge:2 1.7864 0.000268723 0.00207556 X.(Acetyl)VATVSLPR.X CON_P00761
|
||||
query:86128;rank:1;spectrum:431.55176_762.55_spectrum=60182_uteruspremenopause;rt:762.55;mz:431.55176;charge:3 1.68922 0.000320239 0.00253864 X.HM(Oxidation)QANPEPPKK.X UniProt_Q15404 UniProt_Q15404-2 genCDS_ENST00000345264_10_16593394-16817081_-1 genCDS_ENST00000377921_10_16593394-16817081_-1 genCDS_ENST00000602389_10_16593394-16782034_-1
|
||||
query:5783;rank:1;spectrum:395.23944_2103.35_spectrum=103066_uteruspremenopause;rt:2103.35;mz:395.23944;charge:2 1.63365 0.000371014 0.00284701 X.LVTDLTK.X CON_P02768-1 CON_P02769 UniProt_B7WNR0 UniProt_C9JKR2 UniProt_D6RHD5 UniProt_H0YA55 UniProt_P02768 UniProt_P02768-2 genCDS_ENST00000295897_4_73404328-73420298_1 genCDS_ENST00000401494_4_73404328-73420298_1 genCDS_ENST00000415165_4_73404328-73420298_1 genCDS_ENST00000503124_4_73406730-73420298_1 genCDS_ENST00000509063_4_73404328-73421121_1 genCDS_ENST00000511370_4_73409340-73420298_1
|
||||
query:95400;rank:1;spectrum:450.9129_2783.38_spectrum=4821_uteruspremenopause;rt:2783.38;mz:450.9129;charge:3 1.62591 0.000371014 0.00289274 X.TAAENEFVTLKK.X CON_P02538 CON_P04259 CON_P12035 CON_P48668 CON_P50446 UniProt_J3QST3 UniProt_P02538 UniProt_P04259 UniProt_P12035 UniProt_P48668 genCDS_ENST00000252250_12_52469062-52473737_-1 genCDS_ENST00000252252_12_52447190-52452078_-1 genCDS_ENST00000330722_12_52487720-52493188_-1 genCDS_ENST00000417996_12_52790042-52796042_-1
|
||||
query:16267;rank:1;spectrum:439.74139_3590.06_spectrum=75323_uteruspremenopause;rt:3590.06;mz:439.74139;charge:2 1.62109 0.000371014 0.00292163 X.FVADLWK.X UniProt_P35749 UniProt_P35749-2 UniProt_P35749-3 UniProt_P35749-4 genCDS_ENST00000300036_16_15703991-15838252_-1 genCDS_ENST00000396324_16_15703991-15838252_-1 genCDS_ENST00000452625_16_15708811-15838252_-1 genCDS_ENST00000576790_16_15708811-15838252_-1 genCDS_ENST00000611087_16_15703879-15838252_-1 genCDS_ENST00000616439_16_15703879-15838252_-1
|
||||
query:96057;rank:1;spectrum:452.58298_2886.61_spectrum=166517_uteruspremenopause;rt:2886.61;mz:452.58298;charge:3 1.60885 0.000371014 0.00299626 X.VTGEVHLGGVM(Oxidation)LK.X UniProt_G3V281 UniProt_G3V379 UniProt_Q96AC1 UniProt_Q96AC1-2 UniProt_Q96AC1-3 genCDS_ENST00000341590_14_52858377-52950568_-1 genCDS_ENST00000343279_14_52858377-52950568_-1 genCDS_ENST00000395631_14_52858377-52950568_-1 genCDS_ENST00000399304_14_52859561-52950568_-1 genCDS_ENST00000553373_14_52858377-52950568_-1 genCDS_ENST00000554712_14_52893359-52950568_-1 genCDS_ENST00000557562_14_52919335-52950568_-1
|
||||
query:47514;rank:1;spectrum:360.18124_1413.26_spectrum=124451_uteruspremenopause;rt:1413.26;mz:360.18124;charge:3 1.48919 0.000510326 0.00383368 X.FLENEDRR.X UniProt_P01009 UniProt_P01009-2 UniProt_P01009-3 genCDS_ENST00000355814_14_94378449-94383237_-1 genCDS_ENST00000393087_14_94378449-94383237_-1 genCDS_ENST00000393088_14_94378449-94383237_-1 genCDS_ENST00000402629_14_94379449-94383237_-1 genCDS_ENST00000404814_14_94378449-94383237_-1 genCDS_ENST00000437397_14_94378449-94383237_-1 genCDS_ENST00000440909_14_94378449-94383237_-1 genCDS_ENST00000448921_14_94378449-94383237_-1 genCDS_ENST00000449399_14_94378449-94383237_-1 genCDS_ENST00000489769_14_94380867-94383237_-1
|
||||
query:31310;rank:1;spectrum:489.31235_2716.22_spectrum=127949_uteruspremenopause;rt:2716.22;mz:489.31235;charge:2 1.36197 0.000578424 0.0050008 X.KLELHLPK.X UniProt_P29622 genCDS_ENST00000298841_14_94563483-94569595_1 genCDS_ENST00000555095_14_94563483-94569595_1 genCDS_ENST00000557004_14_94563483-94569595_1
|
||||
query:129404;rank:1;spectrum:546.57996_1004.75_spectrum=161953_uteruspremenopause;rt:1004.75;mz:546.57996;charge:3 1.28237 0.000726094 0.005938 X.LGREEPAM(Oxidation)SM(Oxidation)DANGK.X UniProt_B4DZI8 UniProt_P35606 genCDS_ENST00000333188_3_139357863-139389550_-1 genCDS_ENST00000507777_3_139357863-139383351_-1
|
||||
query:40260;rank:1;spectrum:517.28729_2307.21_spectrum=95484_uteruspremenopause;rt:2307.21;mz:517.28729;charge:2 1.25301 0.000760157 0.00633558 X.YVPGVGNVTK.X UniProt_Q8IWV7 UniProt_Q8IWV7-2 genCDS_ENST00000290650_15_42945329-43106022_-1 genCDS_ENST00000546274_15_43015684-43106022_-1 genCDS_ENST00000569066_15_43026631-43037829_-1
|
||||
query:19664;rank:1;spectrum:451.27832_3344.97_spectrum=106687_uteruspremenopause;rt:3344.97;mz:451.27832;charge:2 1.24376 0.000772162 0.00646756 X.GPFLVALGK.X UniProt_F5H7Y0 UniProt_H0Y8Y3 UniProt_Q96HC4 UniProt_Q96HC4-4 UniProt_Q96HC4-6 UniProt_Q96HC4-7 genCDS_ENST00000317968_4_94455289-94664067_1 genCDS_ENST00000437932_4_94618059-94664067_1 genCDS_ENST00000503974_4_94455289-94666026_1 genCDS_ENST00000506632_4_94585627-94656820_1 genCDS_ENST00000514743_4_94455289-94664067_1 genCDS_ENST00000542407_4_94575691-94664067_1 genCDS_ENST00000615540_4_94455289-94664067_1
|
||||
query:25040;rank:1;spectrum:469.26465_1783.6_spectrum=54803_uteruspremenopause;rt:1783.6;mz:469.26465;charge:2 1.2271 0.000782926 0.00671406 X.LLHTYYK.X UniProt_B5ME19 UniProt_H3BRV0 UniProt_Q99613 genCDS_ENST00000331666_16_28711687-28735513_1 genCDS_ENST00000380876_16_28379798-28403618_-1 genCDS_ENST00000395587_16_28711687-28735513_1 genCDS_ENST00000398944_16_28379798-28403618_-1 genCDS_ENST00000564243_16_28711687-28735513_1 genCDS_ENST00000566501_16_28711687-28735513_1 genCDS_ENST00000566866_16_28711687-28735513_1
|
||||
query:136411;rank:1;spectrum:429.48587_1838.93_spectrum=163885_uteruspremenopause;rt:1838.93;mz:429.48587;charge:4 1.16869 0.000861273 0.00767686 X.LDSEDKDKEGKPLLK.X UniProt_P13639 genCDS_ENST00000309311_19_3976554-3985380_-1
|
||||
query:11971;rank:1;spectrum:423.73737_1581.19_spectrum=24615_uteruspremenopause;rt:1581.19;mz:423.73737;charge:2 1.15731 0.00087327 0.00788465 X.ATEVTVAR.X UniProt_F5GZL7 UniProt_F8W8Q1 UniProt_H0Y390 UniProt_H3BPE1 UniProt_H3BQK9 UniProt_Q9UPN3 UniProt_Q9UPN3-2 UniProt_Q9UPN3-3 UniProt_Q9UPN3-4 UniProt_Q9UPN3-5 genCDS_ENST00000289893_1_39331269-39485794_1 genCDS_ENST00000361689_1_39084219-39485794_1 genCDS_ENST00000372915_1_39084219-39485794_1 genCDS_ENST00000372925_1_39300314-39485794_1 genCDS_ENST00000564288_1_39205023-39485794_1 genCDS_ENST00000567887_1_39084219-39485794_1
|
||||
query:1271;rank:1;spectrum:368.20523_2167.57_spectrum=33073_uteruspremenopause;rt:2167.57;mz:368.20523;charge:2 1.14788 0.000884565 0.00806222 X.GDVAFVK.X CON_Q0IIK2 CON_Q29443 CON_Q2HJF0 UniProt_H7C5E8 UniProt_J3KN47 UniProt_P02787 genCDS_ENST00000402696_3_133746441-133778620_1 genCDS_ENST00000461695_3_133766278-133775445_1
|
||||
query:95023;rank:1;spectrum:450.21964_926.016_spectrum=108365_uteruspremenopause;rt:926.016;mz:450.21964;charge:3 1.14691 0.000884565 0.00808068 X.SDDNRESLEKR.X UniProt_P30085 UniProt_P30085-2 genCDS_ENST00000371873_1_47333946-47376745_1 genCDS_ENST00000450808_1_47333946-47376745_1
|
||||
query:78779;rank:1;spectrum:625.27612_1963.17_spectrum=17448_uteruspremenopause;rt:1963.17;mz:625.27612;charge:2 1.11901 0.000928303 0.0086392 X.DNVDDPTGNFR.X UniProt_Q12907 genCDS_ENST00000303127_5_177332086-177351647_-1
|
||||
query:32633;rank:1;spectrum:493.74869_1021.76_spectrum=139019_uteruspremenopause;rt:1021.76;mz:493.74869;charge:2 1.11186 0.000928303 0.00879018 X.ASPEAASTPR.X UniProt_H3BT29 UniProt_H3BT57 UniProt_H3BUJ5 UniProt_H3BVD2 UniProt_P29590 UniProt_P29590-10 UniProt_P29590-11 UniProt_P29590-12 UniProt_P29590-13 UniProt_P29590-14 UniProt_P29590-2 UniProt_P29590-3 UniProt_P29590-4 UniProt_P29590-5 UniProt_P29590-8 UniProt_P29590-9 genCDS_ENST00000268058_15_73994813-74045008_1 genCDS_ENST00000268059_15_73994813-74035951_1 genCDS_ENST00000354026_15_73994813-74035951_1 genCDS_ENST00000359928_15_73994813-74034495_1 genCDS_ENST00000395132_15_73994813-74036060_1 genCDS_ENST00000395135_15_73994813-74043180_1 genCDS_ENST00000435786_15_73994813-74034656_1 genCDS_ENST00000436891_15_73994813-74034495_1 genCDS_ENST00000563500_15_73994813-74033608_1 genCDS_ENST00000564428_15_73994813-74043180_1 genCDS_ENST00000565239_15_74022912-74036060_1 genCDS_ENST00000565898_15_73994813-74045008_1 genCDS_ENST00000566068_15_74023295-74035154_1 genCDS_ENST00000567543_15_73994813-74034495_1 genCDS_ENST00000567606_15_74022981-74034495_1 genCDS_ENST00000569477_15_73994813-74035347_1 genCDS_ENST00000569965_15_73994813-74034495_1
|
||||
query:38217;rank:1;spectrum:511.28668_2167.71_spectrum=55788_uteruspremenopause;rt:2167.71;mz:511.28668;charge:2 1.03421 0.00103826 0.0106727 X.DLPEHAVLK.X UniProt_Q00839 UniProt_Q00839-2 genCDS_ENST00000283179_1_244854450-244864307_-1 genCDS_ENST00000444376_1_244854450-244864307_-1
|
||||
query:162959;rank:1;spectrum:1114.509_3262.17_spectrum=159859_uteruspremenopause;rt:3262.17;mz:1114.509;charge:2 1.02402 0.00105016 0.0109563 X.AM(Oxidation)LSGPGQ(Deamidated)FAENETNEVNFR.X UniProt_E5RHG8 UniProt_Q15369 UniProt_Q15369-2 calCuffs_CUFF.49941.1_15_41849132-41849866_1_1_ORF2 genCDS_ENST00000284811_8_73946630-73959768_-1 genCDS_ENST00000518127_8_73946630-73959768_-1 genCDS_ENST00000519082_8_73946700-73959768_-1 genCDS_ENST00000519487_8_73946630-73959768_-1 genCDS_ENST00000520210_8_73946630-73956010_-1 genCDS_ENST00000520242_8_73946630-73959768_-1 genCDS_ENST00000522337_8_73946630-73959768_-1 genCDS_ENST00000523815_8_73946630-73959768_-1 genCDS_ENST00000622804_8_73946630-73959768_-1
|
||||
query:493;rank:1;spectrum:364.2103_2722.7_spectrum=34432_uteruspremenopause;rt:2722.7;mz:364.2103;charge:2 1.01234 0.00107207 0.011293 X.YLYLR.X CON_Q05443 UniProt_A2RUS2 UniProt_A2RUS2-2 UniProt_E9PF32 UniProt_H0YAY3 UniProt_P51884 UniProt_Q8IZT6 XXX_1317687 XXX_1318739 XXX_1319802 XXX_1320698 XXX_1321015 XXX_1322425 XXX_1508340 XXX_1759976 XXX_1802721 XXX_1908615 XXX_244137 XXX_24581 XXX_2923480 XXX_2928492 XXX_2928493 XXX_2928495 XXX_2928496 XXX_2949234 XXX_2981109 XXX_2981110 XXX_3632075 XXX_3860754 XXX_3986952 XXX_3986953 XXX_3986954 XXX_3986955 XXX_3987789 XXX_4011861 XXX_4011867 XXX_4011870 XXX_815771 XXX_816106 calCuffs_CUFF.103119.2_3_161317860-161356881_1_2_ORF21 calCuffs_CUFF.103119.5_3_161333860-161356881_1_3_ORF17 calCuffs_CUFF.103119.6_3_161334114-161356881_1_1_ORF14 calCuffs_CUFF.103119.8_3_161346370-161356881_1_3_ORF15 calCuffs_CUFF.115499.1_5_1473232-1481829_1_2_ORF7 calCuffs_CUFF.128368.1_6_31802244-31811541_-1_1_ORF46 calCuffs_CUFF.128368.2_6_31802244-31811541_-1_1_ORF46 calCuffs_CUFF.1336.1_1_22047526-22055216_1_1_ORF1 calCuffs_CUFF.165574.1_X_121355709-121383470_1_3_ORF111 calCuffs_CUFF.165574.2_X_121355709-121383470_1_3_ORF155 calCuffs_CUFF.165574.3_X_121355857-121383470_1_1_ORF180 calCuffs_CUFF.165574.4_X_121355857-121383470_1_3_ORF146 calCuffs_CUFF.165574.6_X_121356178-121383470_1_3_ORF139 calCuffs_CUFF.165574.7_X_121363426-121383470_1_2_ORF112 calCuffs_CUFF.46425.1_14_68586652-68634192_-1_3_ORF32 calCuffs_CUFF.46425.2_14_68586652-68634288_-1_1_ORF52 calCuffs_CUFF.64507.5_18_33515874-33530500_-1_1_ORF63 calCuffs_CUFF.65492.2_18_61137255-61172334_-1_2_ORF176 calCuffs_CUFF.65972.3_18_70992026-71027992_1_1_ORF37 calCuffs_CUFF.65972.4_18_70992026-71027992_1_1_ORF19 calCuffs_CUFF.65972.7_18_70992235-71027992_1_3_ORF16 calCuffs_CUFF.87619.6_20_49983340-50039104_1_1_ORF17 calCuffs_CUFF.9273.1_1_173606791-173638011_1_1_ORF112 calCuffs_CUFF.9273.2_1_173606791-173638011_1_1_ORF106 genCDS_ENST00000262585_8_141136647-141194233_1 genCDS_ENST00000266718_12_91104165-91108979_-1 genCDS_ENST00000367409_1_197084324-197146437_-1 genCDS_ENST00000424248_8_141136647-141194233_1 genCDS_ENST00000518668_8_141128779-141194233_1 genCDS_ENST00000519811_8_141128708-141194233_1 genlncRNA_ENST00000449713_21_44485577-44490288_1_3_ORF3 genlncRNA_ENST00000562834_6_54943167-54945099_1_3_ORF15 genlncRNA_ENST00000614289_7_9082557-9189785_-1_1_ORF3
|
||||
query:172844;rank:1;spectrum:659.81531_2195.32_spectrum=87449_uteruspremenopause;rt:2195.32;mz:659.81531;charge:4 0.865178 0.00138098 0.0168505 X.QEPERNECFLQHKDDNPNLPR.X CON_P02768-1 UniProt_H7C013 UniProt_P02768 genCDS_ENST00000295897_4_73404328-73420298_1 genCDS_ENST00000441319_4_73397114-73409457_1 genCDS_ENST00000509063_4_73404328-73421121_1 genCDS_ENST00000621085_4_73404328-73420298_1 genCDS_ENST00000621628_4_73404328-73420298_1
|
||||
query:3314;rank:1;spectrum:381.23285_2666.74_spectrum=19351_uteruspremenopause;rt:2666.74;mz:381.23285;charge:2 0.532423 0.00282806 0.0455454 X.LM(Oxidation)VALAK.X Augustus2_AUGUSTUS00000042791_4_153307709-153311274_-1 UniProt_A6NMY6 UniProt_H0YKS4 UniProt_H0YL33 UniProt_H0YM50 UniProt_H0YMD0 UniProt_H0YMU9 UniProt_H0YN28 UniProt_H0YN42 UniProt_H0YN52 UniProt_H0YNA0 UniProt_H0YNP5 UniProt_P07355 UniProt_P07355-2 genCDS_ENST00000332680_15_60347630-60397913_-1 genCDS_ENST00000396024_15_60347630-60386075_-1 genCDS_ENST00000421017_15_60347630-60386075_-1 genCDS_ENST00000451270_15_60347630-60386075_-1 genCDS_ENST00000557906_15_60355919-60386075_-1 genCDS_ENST00000558132_15_60351782-60386075_-1 genCDS_ENST00000558985_15_60351724-60360946_-1 genCDS_ENST00000558998_15_60354154-60360946_-1 genCDS_ENST00000559113_15_60355919-60360946_-1 genCDS_ENST00000559176_15_60351192-60374505_-1 genCDS_ENST00000559818_15_60351733-60386075_-1 genCDS_ENST00000560014_15_60351813-60386075_-1 genCDS_ENST00000560165_15_60355919-60386075_-1 genCDS_ENST00000560367_15_60352383-60386075_-1 genCDS_ENST00000560389_15_60355919-60386075_-1 genCDS_ENST00000560466_15_60351733-60360946_-1 genpseudogene_ENST00000435128_9_33624274-33625293_1_1_ORF1
|
||||
query:14008;rank:1;spectrum:431.7608_3415_spectrum=82918_uteruspremenopause;rt:3415;mz:431.7608;charge:2 0.482234 0.0031261 0.0531809 X.FLLSNLR.X UniProt_E9PGM4 UniProt_Q04446 XXX_3648561 genCDS_ENST00000429644_3_81490407-81761517_-1 genCDS_ENST00000489715_3_81490407-81743576_-1
|
||||
query:26472;rank:1;spectrum:474.24692_2020.57_spectrum=133852_uteruspremenopause;rt:2020.57;mz:474.24692;charge:2 0.378973 0.00408 0.0731188 X.CLLVEEGK.X Augustus2_AUGUSTUS00000097311_8_73984804-73984493_1 UniProt_F6RFD5 UniProt_P60981 UniProt_P60981-2 genCDS_ENST00000246069_20_17570209-17607146_1 genCDS_ENST00000449141_20_17570209-17605129_1 genCDS_ENST00000474024_20_17600786-17607146_1 genpseudogene_ENST00000399472_3_39214199-39214672_1_1_ORF1 genpseudogene_ENST00000517767_8_73984493-73984883_1_1_ORF1 yalePseudo_PGOHUM00000249715_8_74896728-74897132_1_1_ORF1
|
||||
query:25242;rank:1;spectrum:470.24841_1903.97_spectrum=25332_uteruspremenopause;rt:1903.97;mz:470.24841;charge:2 0.374892 0.00415655 0.0740455 X.VSSYGGTLR.X UniProt_O15230 genCDS_ENST00000252999_20_62309336-62367245_-1
|
||||
query:14390;rank:1;spectrum:433.73349_2095.35_spectrum=156931_uteruspremenopause;rt:2095.35;mz:433.73349;charge:2 0.337635 0.00458149 0.0830843 X.(Carbamidomethyl)YLSALN(Deamidated)K.X genlncRNA_ENST00000433639_3_6490479-6736129_1_3_ORF9
|
||||
query:59374;rank:1;spectrum:574.29547_1290.25_spectrum=46381_uteruspremenopause;rt:1290.25;mz:574.29547;charge:2 0.216141 0.00585082 0.121453 X.ESKPAQGQFR.X UniProt_Q05707 UniProt_Q05707-2 UniProt_Q05707-3 UniProt_Q4G0W3 genCDS_ENST00000297848_8_120147843-120371231_1 genCDS_ENST00000309791_8_120147843-120370367_1 genCDS_ENST00000498051_8_120147843-120213942_1 genCDS_ENST00000537875_8_120147843-120213942_1
|
||||
query:139088;rank:1;spectrum:584.30249_2663.68_spectrum=181151_uteruspremenopause;rt:2663.68;mz:584.30249;charge:3 0.201002 0.00605916 0.127366 X.(Acetyl)LRTEGDGVYTLNDKK.X Augustus2_AUGUSTUS00000011721_16_72077081-72063214_1 UniProt_H0Y300 UniProt_J3KRH2 UniProt_J3KTC3 UniProt_J3QLC9 UniProt_J3QR68 UniProt_P00738 UniProt_P00739 UniProt_P00739-2 genCDS_ENST00000355906_16_72054653-72060890_1 genCDS_ENST00000357763_16_72054653-72060890_1 genCDS_ENST00000540303_16_72063256-72077081_1 genCDS_ENST00000561690_16_72063256-72076993_1 genCDS_ENST00000565574_16_72054653-72060890_1 genCDS_ENST00000567185_16_72056161-72060890_1 genCDS_ENST00000567612_16_72056161-72060890_1 genCDS_ENST00000576168_16_72056161-72059199_1
|
||||
query:41161;rank:1;spectrum:520.79297_2617.01_spectrum=165822_uteruspremenopause;rt:2617.01;mz:520.79297;charge:2 0.17738 0.00651168 0.137133 X.SVPM(Oxidation)VPPGLK.X CON_Q05443 UniProt_P51884 genCDS_ENST00000266718_12_91104165-91108979_-1
|
||||
query:46620;rank:1;spectrum:537.77405_1721.6_spectrum=2503_uteruspremenopause;rt:1721.6;mz:537.77405;charge:2 0.107507 0.00780292 0.169915 X.LDELRDEGK.X CON_P02768-1 UniProt_B7WNR0 UniProt_D6RHD5 UniProt_H0YA55 UniProt_P02768 genCDS_ENST00000295897_4_73404328-73420298_1 genCDS_ENST00000401494_4_73404328-73420298_1 genCDS_ENST00000503124_4_73406730-73420298_1 genCDS_ENST00000509063_4_73404328-73421121_1 genCDS_ENST00000511370_4_73409340-73420298_1
|
||||
query:70107;rank:1;spectrum:602.77112_906.603_spectrum=45528_uteruspremenopause;rt:906.603;mz:602.77112;charge:2 0.100629 0.00788342 0.173457 X.QQQQMEQER.X UniProt_H0YDN1 UniProt_Q15149 UniProt_Q15149-2 UniProt_Q15149-3 UniProt_Q15149-4 UniProt_Q15149-5 UniProt_Q15149-6 UniProt_Q15149-7 UniProt_Q15149-8 UniProt_Q15149-9 genCDS_ENST00000322810_8_143916177-143950706_-1 genCDS_ENST00000345136_8_143916177-143939461_-1 genCDS_ENST00000354589_8_143916177-143943890_-1 genCDS_ENST00000354958_8_143916177-143953771_-1 genCDS_ENST00000356346_8_143916177-143973472_-1 genCDS_ENST00000357649_8_143916177-143942515_-1 genCDS_ENST00000398774_8_143916177-143944663_-1 genCDS_ENST00000436759_8_143916177-143975369_-1 genCDS_ENST00000527096_8_143916177-143975369_-1 genCDS_ENST00000527303_8_143921932-143927011_-1
|
||||
query:58423;rank:1;spectrum:571.82373_3329.4_spectrum=28523_uteruspremenopause;rt:3329.4;mz:571.82373;charge:2 -0.0664699 0.0118764 0.276689 X.VKGDVDVSVPK.X UniProt_Q09666 genCDS_ENST00000378024_11_62516744-62536098_-1
|
||||
query:4273;rank:1;spectrum:388.21448_1441.57_spectrum=147307_uteruspremenopause;rt:1441.57;mz:388.21448;charge:2 -0.0871283 0.0123296 0.291726 X.LASLDEK.X UniProt_E9PNR6 UniProt_H0YE29 UniProt_Q07960 genCDS_ENST00000311956_11_46679037-46696107_-1 genCDS_ENST00000525488_11_46681069-46696107_-1 genCDS_ENST00000528837_11_46679217-46696099_-1
|
||||
query:981;rank:1;spectrum:366.20657_1827.57_spectrum=78717_uteruspremenopause;rt:1827.57;mz:366.20657;charge:2 -0.266624 0.0180136 0.438278 X.DNTLLR.X UniProt_A6NN80 UniProt_H0YG46 UniProt_J3KNE4 UniProt_P08133 UniProt_P08133-2 UniProt_Q8WZ42 UniProt_Q8WZ42-11 UniProt_Q8WZ42-12 UniProt_Q8WZ42-13 UniProt_Q8WZ42-2 UniProt_Q8WZ42-4 UniProt_Q8WZ42-5 UniProt_Q8WZ42-7 UniProt_Q8WZ42-8 UniProt_Q99550 UniProt_Q99550-2 UniProt_U3KQ28 XXX_3776517 XXX_3780596 XXX_3818260 XXX_3846030 XXX_3896565 XXX_4087153 XXX_4095718 XXX_4139454 XXX_4158810 XXX_4177746 genCDS_ENST00000302373_12_123161368-123221847_-1 genCDS_ENST00000342992_2_178527012-178804642_-1 genCDS_ENST00000354546_5_151101448-151147901_-1 genCDS_ENST00000523714_5_151101448-151140165_-1 genCDS_ENST00000539024_12_123161368-123218478_-1 genCDS_ENST00000541076_12_123156807-123230364_-1 genCDS_ENST00000589042_2_178527012-178804642_-1 genCDS_ENST00000591111_2_178527012-178804642_-1 genCDS_ENST00000606320_12_123156807-123230364_-1 genCDS_ENST00000615779_2_178527012-178804642_-1
|
||||
query:33052;rank:1;spectrum:494.77515_1390.27_spectrum=155237_uteruspremenopause;rt:1390.27;mz:494.77515;charge:2 -0.390915 0.0229485 0.545281 X.KQVENKN(Deamidated)K.X UniProt_Q15431 UniProt_Q5VXJ5 genCDS_ENST00000369518_1_114855465-114995019_1 genCDS_ENST00000369522_1_114855465-114995019_1 genCDS_ENST00000455987_1_114855465-114977610_1 genCDS_ENST00000613524_1_114855465-114995019_1 genCDS_ENST00000618516_1_114855465-114995019_1
|
||||
query:15821;rank:1;spectrum:438.23367_2620.9_spectrum=88556_uteruspremenopause;rt:2620.9;mz:438.23367;charge:2 -0.554281 0.0308507 0.671862 X.QGGPEFLK.X calCuffs_CUFF.56789.1_16_67551854-67597900_-1_1_ORF3 calCuffs_CUFF.56789.2_16_67551854-67562677_-1_1_ORF3 calCuffs_CUFF.56789.3_16_67551854-67562643_-1_3_ORF2 calCuffs_CUFF.56789.4_16_67551854-67564404_-1_2_ORF5 calCuffs_CUFF.56789.5_16_67551854-67556024_-1_1_ORF2 ensBodymap_RNASEQT00000108700_16_67551703-67597612_-1 genlncRNA_ENST00000613438_16_67517862-67528632_-1_3_ORF2 genlncRNA_ENST00000621378_16_67517950-67528675_-1_2_ORF4 mitSBM_kidney_16_67551858-67562264_-1_3_ORF1 mitSBM_lymphNode_16_67551861-67562262_-1_1_ORF1
|
||||
query:149496;rank:1;spectrum:951.48413_3058.62_spectrum=89727_uteruspremenopause;rt:3058.62;mz:951.48413;charge:2 -0.634256 0.0352042 0.722362 X.(Acetyl)KPGAAGQHPAPFDPQSVR.X genlncRNA_ENST00000449990_9_90463659-90582744_-1_3_ORF1
|
||||
query:106872;rank:1;spectrum:720.35449_2699.4_spectrum=150809_uteruspremenopause;rt:2699.4;mz:720.35449;charge:2 -0.816145 0.0457039 0.814517 X.STDNVFLACWVK.X calCuffs_CUFF.6079.5_1_107514034-107541205_-1_3_ORF3
|
||||
query:44599;rank:1;spectrum:531.28_2604.3_spectrum=19171_uteruspremenopause;rt:2604.3;mz:531.28;charge:2 -0.98233 0.0555745 0.881893 X.KQ(Deamidated)WERTGR.X calCuffs_CUFF.84105.1_2_227648862-227677259_1_3_ORF138 calCuffs_CUFF.84105.2_2_227653754-227677259_1_1_ORF74
|
||||
query:2044;rank:1;spectrum:374.22897_2891.89_spectrum=135978_uteruspremenopause;rt:2891.89;mz:374.22897;charge:2 -1.04589 0.0593188 0.912796 X.FLLQAR.X UniProt_P07360 UniProt_Q5SQ08 XXX_2911659 XXX_2911660 XXX_3992543 XXX_4073578 calCuffs_CUFF.65457.2_18_60989274-60994029_1_2_ORF3 genCDS_ENST00000224181_9_136945321-136946781_1 genCDS_ENST00000371634_9_136945321-136946361_1
|
||||
query:154157;rank:1;spectrum:664.31238_3596.01_spectrum=176082_uteruspremenopause;rt:3596.01;mz:664.31238;charge:3 -1.09757 0.0622534 0.94086 X.(Acetyl)SKCFASN(Deamidated)SQ(Deamidated)LLYSQGEK.X genlncRNA_ENST00000428520_10_10934524-10952095_-1_1_ORF2
|
||||
query:109576;rank:1;spectrum:730.34552_2652.62_spectrum=142764_uteruspremenopause;rt:2652.62;mz:730.34552;charge:2 -1.13897 0.0647164 0.964364 X.(Carbamidomethyl)NN(Deamidated)PVMSLQDQ(Deamidated)VR.X UniProt_A6ND99 UniProt_K7EP71 UniProt_Q7LGA3 UniProt_Q7LGA3-2 UniProt_Q7LGA3-3 genCDS_ENST00000370548_1_86993082-87168176_1 genCDS_ENST00000370550_1_86915037-87104696_1 genCDS_ENST00000370551_1_86915037-87097939_1 genCDS_ENST00000591456_1_87072984-87092588_1
|
||||
query:10757;rank:1;spectrum:419.25119_2212.53_spectrum=126558_uteruspremenopause;rt:2212.53;mz:419.25119;charge:2 -1.35549 0.0765402 1 X.KSRFTAK.X calCuffs_CUFF.117687.1_5_43436710-43444350_-1_3_ORF32
|
||||
query:81984;rank:1;spectrum:634.33673_1983.63_spectrum=10106_uteruspremenopause;rt:1983.63;mz:634.33673;charge:2 -1.63897 0.0885601 1 X.(Acetyl)KGLDVAEPGPSR.X UniProt_Q01433 genCDS_ENST00000256578_1_109621014-109631152_1 genCDS_ENST00000528667_1_109621014-109631152_1
|
||||
query:58730;rank:1;spectrum:572.7724_1350.11_spectrum=155143_uteruspremenopause;rt:1350.11;mz:572.7724;charge:2 -1.85044 0.0949322 1 X.LGGQ(Deamidated)M(Oxidation)Q(Deamidated)VHQ(Deamidated)K.X genpseudogene_ENST00000442645_7_14985378-14986074_-1_3_ORF2
|
||||
query:175487;rank:1;spectrum:943.40503_1694.59_spectrum=101873_uteruspremenopause;rt:1694.59;mz:943.40503;charge:3 -2.1027 0.100208 1 X.(Acetyl)YEDSQQ(Deamidated)EEAQ(Deamidated)YGAMFQ(Deamidated)EQLM(Oxidation)TLK.X UniProt_F5H4J1 UniProt_Q14980 UniProt_Q14980-2 UniProt_Q14980-3 UniProt_Q14980-4 genCDS_ENST00000358965_11_72003527-72035943_-1 genCDS_ENST00000393695_11_72003527-72035943_-1 genCDS_ENST00000542977_11_72014948-72035943_-1 genCDS_ENST00000616538_11_72003527-72035943_-1 genCDS_ENST00000620566_11_72003527-72035943_-1
|
||||
query:90871;rank:1;spectrum:660.8255_2297.68_spectrum=111599_uteruspremenopause;rt:2297.68;mz:660.8255;charge:2 -2.46345 0.104155 1 X.(Carbamidomethyl)AHN(Deamidated)FDERVFK.X UniProt_Q96M60 UniProt_Q96M60-2 genCDS_ENST00000299338_15_49328568-49615171_-1 genCDS_ENST00000561064_15_49422710-49615171_-1
|
||||
Binary file not shown.
@@ -730,3 +730,84 @@ class IQTree(Text):
|
||||
False
|
||||
"""
|
||||
return file_prefix.startswith("IQ-TREE")
|
||||
|
||||
|
||||
@build_sniff_from_prefix
|
||||
class Paf(Text):
|
||||
"""
|
||||
PAF: a Pairwise mApping Format
|
||||
|
||||
https://github.com/lh3/miniasm/blob/master/PAF.md
|
||||
"""
|
||||
file_ext = "paf"
|
||||
|
||||
def sniff_prefix(self, file_prefix):
|
||||
"""
|
||||
>>> from galaxy.datatypes.sniff import get_test_fname
|
||||
>>> fname = get_test_fname('A-3105.paf')
|
||||
>>> Paf().sniff(fname)
|
||||
True
|
||||
"""
|
||||
found_valid_lines = False
|
||||
for line in iter_headers(file_prefix, "\t"):
|
||||
if len(line) < 12:
|
||||
return False
|
||||
for i in (1, 2, 3, 6, 7, 8, 9, 10, 11):
|
||||
int(line[i])
|
||||
if line[4] not in ('+', '-'):
|
||||
return False
|
||||
if not (0 <= int(line[11]) <= 255):
|
||||
return False
|
||||
# Check that the optional columns after the 12th contain SAM-like typed key-value pairs
|
||||
for i in range(12, len(line)):
|
||||
if len(line[i].split(':')) != 3:
|
||||
return False
|
||||
found_valid_lines = True
|
||||
return found_valid_lines
|
||||
|
||||
|
||||
@build_sniff_from_prefix
|
||||
class Gfa1(Text):
|
||||
"""
|
||||
Graphical Fragment Assembly (GFA) 1.0
|
||||
|
||||
http://gfa-spec.github.io/GFA-spec/GFA1.html
|
||||
"""
|
||||
file_ext = "gfa1"
|
||||
|
||||
def sniff_prefix(self, file_prefix):
|
||||
"""
|
||||
>>> from galaxy.datatypes.sniff import get_test_fname
|
||||
>>> fname = get_test_fname('big.gfa1')
|
||||
>>> Gfa1().sniff(fname)
|
||||
True
|
||||
"""
|
||||
found_valid_lines = False
|
||||
for line in iter_headers(file_prefix, "\t"):
|
||||
if line[0].startswith('#'):
|
||||
continue
|
||||
if line[0] == 'H':
|
||||
return len(line) == 2 and line[1] == 'VN:Z:1.0'
|
||||
elif line[0] == 'S':
|
||||
if len(line) < 3:
|
||||
return False
|
||||
elif line[0] == 'L':
|
||||
if len(line) < 6:
|
||||
return False
|
||||
for i in (2, 4):
|
||||
if line[i] not in ('+', '-'):
|
||||
return False
|
||||
elif line[0] == 'C':
|
||||
if len(line) < 7:
|
||||
return False
|
||||
for i in (2, 4):
|
||||
if line[i] not in ('+', '-'):
|
||||
return False
|
||||
int(line[5])
|
||||
elif line[0] == 'P':
|
||||
if len(line) < 4:
|
||||
return False
|
||||
else:
|
||||
return False
|
||||
found_valid_lines = True
|
||||
return found_valid_lines
|
||||
|
||||
@@ -175,6 +175,9 @@ class ConditionalDependencies(object):
|
||||
def check_kamaki(self):
|
||||
return 'pithos' in self.object_stores
|
||||
|
||||
def check_python_irodsclient(self):
|
||||
return 'irods' in self.object_stores
|
||||
|
||||
def check_watchdog(self):
|
||||
install_set = {'auto', 'True', 'true', 'polling'}
|
||||
return (self.config['watch_tools'] in install_set or
|
||||
|
||||
@@ -8,7 +8,7 @@ drmaa
|
||||
statsd
|
||||
docker
|
||||
azure-storage==0.32.0
|
||||
# PyRods not in PyPI
|
||||
python-irodsclient==0.8.2
|
||||
python-ldap==3.2.0
|
||||
python-pam
|
||||
galaxycloudrunner
|
||||
@@ -31,4 +31,4 @@ influxdb
|
||||
|
||||
# Deep learning packages for tool recommendation
|
||||
keras==2.2.4
|
||||
tensorflow==1.12.2
|
||||
tensorflow==1.15.2
|
||||
|
||||
@@ -25,8 +25,9 @@ Sphinx = "*"
|
||||
sphinx_markdown_tables = "*"
|
||||
sphinx_rtd_theme = "*"
|
||||
testfixtures = "*"
|
||||
twill = {version = "==0.9.1", markers = "python_version < '3'"}
|
||||
twill = "*"
|
||||
watchdog = "*"
|
||||
python-irodsclient = "*"
|
||||
|
||||
[packages]
|
||||
numpy = "*"
|
||||
|
||||
@@ -4,20 +4,20 @@ alabaster==0.7.12
|
||||
atomicwrites==1.3.0
|
||||
attrs==19.3.0
|
||||
babel==2.8.0
|
||||
certifi==2019.11.28
|
||||
certifi==2020.4.5.1
|
||||
chardet==3.0.4
|
||||
commonmark==0.9.1
|
||||
configparser==4.0.2 ; python_version < '3.2'
|
||||
contextlib2==0.6.0.post1 ; python_version < '3.5'
|
||||
coverage==5.0.3
|
||||
deprecated==1.2.7
|
||||
coverage==5.0.4
|
||||
deprecated==1.2.9
|
||||
docutils==0.15.2
|
||||
funcsigs==1.0.2 ; python_version < '3.3'
|
||||
future==0.18.2
|
||||
gunicorn==19.10.0
|
||||
idna==2.9
|
||||
imagesize==1.2.0
|
||||
importlib-metadata==1.5.0 ; python_version < '3.8'
|
||||
importlib-metadata==1.6.0 ; python_version < '3.8'
|
||||
jinja2==2.11.1
|
||||
lxml==4.5.0
|
||||
markdown==3.1.1
|
||||
@@ -27,23 +27,25 @@ mock==3.0.5
|
||||
more-itertools==5.0.0
|
||||
nose==1.3.7
|
||||
nosehtml==0.4.5
|
||||
packaging==20.1
|
||||
packaging==20.3
|
||||
pathlib2==2.3.5 ; python_version < '3.6'
|
||||
pathtools==0.1.2
|
||||
pluggy==0.13.1
|
||||
port-for==0.4
|
||||
prettytable==0.7.2
|
||||
psutil==5.7.0
|
||||
py==1.8.1
|
||||
pygithub==1.45
|
||||
pygments==2.5.2
|
||||
pyjwt==1.7.1
|
||||
pyparsing==2.4.6
|
||||
pyparsing==2.4.7
|
||||
pytest-cov==2.8.1
|
||||
pytest-html==1.22.1
|
||||
pytest-metadata==1.8.0
|
||||
pytest-postgresql==1.4.1
|
||||
pytest-pythonpath==0.7.3
|
||||
pytest==4.6.9
|
||||
python-irodsclient==0.8.2
|
||||
pytz==2019.3
|
||||
recommonmark==0.6.0
|
||||
requests==2.23.0
|
||||
@@ -56,10 +58,11 @@ sphinx-rtd-theme==0.4.3
|
||||
sphinx==1.8.5
|
||||
sphinxcontrib-websupport==1.1.2
|
||||
testfixtures==6.14.0
|
||||
twill==0.9.1 ; python_version < '3'
|
||||
twill==2.0
|
||||
typing==3.7.4.1 ; python_version < '3.5'
|
||||
urllib3==1.25.8
|
||||
watchdog==0.10.2
|
||||
wcwidth==0.1.8
|
||||
wrapt==1.12.0
|
||||
wcwidth==0.1.9
|
||||
wrapt==1.12.1
|
||||
xmlrunner==1.7.7
|
||||
zipp==1.2.0
|
||||
|
||||
@@ -23,8 +23,8 @@ bcrypt==3.1.7
|
||||
bdbag==1.5.6
|
||||
beaker==1.11.0
|
||||
bioblend==0.13.0
|
||||
bleach==3.1.1
|
||||
boltons==20.0.0
|
||||
bleach==3.1.4
|
||||
boltons==20.1.0
|
||||
boto3==1.9.114
|
||||
boto==2.49.0
|
||||
botocore==1.12.253
|
||||
@@ -32,7 +32,7 @@ bx-python==0.8.8
|
||||
bz2file==0.98 ; python_version < '3.3'
|
||||
cachecontrol==0.11.7
|
||||
cachetools==3.1.1
|
||||
certifi==2019.11.28
|
||||
certifi==2020.4.5.1
|
||||
cffi==1.14.0
|
||||
chardet==3.0.4
|
||||
cheetah3==3.2.4
|
||||
@@ -43,18 +43,18 @@ cmd2==0.8.9
|
||||
coloredlogs==14.0
|
||||
configparser==4.0.2 ; python_version < '3.2'
|
||||
contextlib2==0.6.0.post1 ; python_version < '3.5'
|
||||
cryptography==2.8
|
||||
cryptography==2.9
|
||||
cwltool==1.0.20191225192155
|
||||
debtcollector==1.22.0
|
||||
decorator==4.4.2
|
||||
deprecated==1.2.7
|
||||
deprecated==1.2.9
|
||||
deprecation==2.0.7
|
||||
dictobj==0.4
|
||||
docopt==0.6.2
|
||||
docutils==0.15.2
|
||||
dogpile.cache==0.9.0
|
||||
ecdsa==0.15
|
||||
enum34==1.1.9 ; python_version < '3.4'
|
||||
enum34==1.1.10 ; python_version < '3.4'
|
||||
fabric3==1.14.post1
|
||||
funcsigs==1.0.2 ; python_version < '3.3'
|
||||
functools32==3.2.3.post2 ; python_version < '3.2'
|
||||
@@ -63,13 +63,13 @@ futures==3.3.0 ; python_version == '2.6' or python_version == '2.7'
|
||||
galaxy-sequence-utils==1.1.5
|
||||
google-api-python-client==1.7.8
|
||||
google-auth-httplib2==0.0.3
|
||||
google-auth==1.11.2
|
||||
gxformat2==0.10.1
|
||||
google-auth==1.13.1
|
||||
gxformat2==0.11.1
|
||||
h5py==2.10.0
|
||||
httplib2==0.17.0
|
||||
humanfriendly==7.1.1
|
||||
httplib2==0.17.2
|
||||
humanfriendly==8.1
|
||||
idna==2.9
|
||||
importlib-metadata==1.5.0 ; python_version < '3.8'
|
||||
importlib-metadata==1.6.0 ; python_version < '3.8'
|
||||
ipaddress==1.0.23 ; python_version < '3.3'
|
||||
isa-rwval==0.10.7
|
||||
iso8601==0.1.12
|
||||
@@ -78,14 +78,14 @@ jmespath==0.9.5
|
||||
jsonpatch==1.25
|
||||
jsonpointer==2.0
|
||||
jsonschema==3.2.0
|
||||
keystoneauth1==3.18.0
|
||||
kombu==4.6.7
|
||||
keystoneauth1==4.0.0
|
||||
kombu==4.6.8
|
||||
lockfile==0.12.2
|
||||
lxml==4.5.0
|
||||
mako==1.1.1
|
||||
mako==1.1.2
|
||||
markdown==3.1.1
|
||||
markupsafe==1.1.1
|
||||
mercurial==5.3
|
||||
mercurial==5.3.2
|
||||
mistune==0.8.4
|
||||
monotonic==1.5
|
||||
msgpack==1.0.0
|
||||
@@ -102,7 +102,7 @@ numpy==1.16.6
|
||||
oauth2client==4.1.3
|
||||
oauthlib==3.1.0
|
||||
openstacksdk==0.17.0
|
||||
os-client-config==2.0.0
|
||||
os-client-config==2.1.0
|
||||
os-service-types==1.7.0
|
||||
osc-lib==2.0.0
|
||||
oslo.config==7.0.0
|
||||
@@ -111,21 +111,21 @@ oslo.i18n==3.25.1
|
||||
oslo.log==3.45.2
|
||||
oslo.serialization==2.29.2
|
||||
oslo.utils==3.42.1
|
||||
packaging==20.1
|
||||
packaging==20.3
|
||||
paramiko==2.7.1
|
||||
parsley==1.3
|
||||
paste==3.4.0
|
||||
pastedeploy==2.1.0
|
||||
pastescript==3.2.0
|
||||
pathlib2==2.3.5 ; python_version < '3.6'
|
||||
pbr==5.4.4
|
||||
pbr==5.4.5
|
||||
prettytable==0.7.2
|
||||
prov==1.5.1
|
||||
psutil==5.7.0
|
||||
pulsar-galaxy-lib==0.14.0.dev1
|
||||
pyasn1-modules==0.2.8
|
||||
pyasn1==0.4.8
|
||||
pycparser==2.19
|
||||
pycparser==2.20
|
||||
pycryptodome==3.9.7
|
||||
pyeventsystem==0.1.0
|
||||
pyinotify==0.9.6 ; sys_platform != 'win32' and sys_platform != 'darwin' and sys_platform != 'sunos5'
|
||||
@@ -133,9 +133,9 @@ pyjwt==1.7.1
|
||||
pykwalify==1.7.0
|
||||
pynacl==1.3.0
|
||||
pyopenssl==19.1.0
|
||||
pyparsing==2.4.6
|
||||
pyperclip==1.7.0
|
||||
pyrsistent==0.15.7
|
||||
pyparsing==2.4.7
|
||||
pyperclip==1.8.0
|
||||
pyrsistent==0.16.0
|
||||
pysam==0.15.2
|
||||
pysftp==0.2.9
|
||||
python-cinderclient==4.0.0
|
||||
@@ -149,7 +149,7 @@ python-openid==2.2.5 ; python_version < '3.0'
|
||||
python-swiftclient==3.6.0
|
||||
pytz==2019.3
|
||||
pyuwsgi==2.0.18.post0
|
||||
pyyaml==5.3
|
||||
pyyaml==5.3.1
|
||||
rdflib-jsonld==0.4.0
|
||||
rdflib==4.2.2
|
||||
repoze.lru==0.7
|
||||
@@ -157,7 +157,7 @@ requests-oauthlib==1.3.0
|
||||
requests-toolbelt==0.9.1
|
||||
requests==2.23.0
|
||||
requestsexceptions==1.4.0
|
||||
rfc3986==1.3.2
|
||||
rfc3986==1.4.0
|
||||
routes==2.4.1
|
||||
rsa==4.0
|
||||
ruamel.ordereddict==0.4.14 ; platform_python_implementation == 'CPython' and python_version <= '2.7'
|
||||
@@ -172,15 +172,15 @@ simplejson==3.17.0
|
||||
six==1.11.0
|
||||
social-auth-core[openidconnect]==3.3.0
|
||||
sqlalchemy-migrate==0.13.0
|
||||
sqlalchemy-utils==0.36.1
|
||||
sqlalchemy==1.3.13
|
||||
sqlalchemy-utils==0.36.3
|
||||
sqlalchemy==1.3.16
|
||||
sqlparse==0.3.1
|
||||
stevedore==1.32.0
|
||||
subprocess32==3.5.4 ; python_version < '3.0'
|
||||
svgwrite==1.3.1
|
||||
tempita==0.5.2
|
||||
tenacity==4.12.0
|
||||
typing-extensions==3.7.4.1
|
||||
typing-extensions==3.7.4.2
|
||||
typing==3.7.4.1 ; python_version < '3.5'
|
||||
tzlocal==2.0.0
|
||||
unicodecsv==0.14.1 ; python_version < '3.0'
|
||||
@@ -188,9 +188,9 @@ uritemplate==3.0.1
|
||||
urllib3==1.25.8
|
||||
vine==1.3.0
|
||||
warlock==1.3.3
|
||||
wcwidth==0.1.8
|
||||
wcwidth==0.1.9
|
||||
webencodings==0.5.1
|
||||
webob==1.8.6
|
||||
whoosh==2.7.4
|
||||
wrapt==1.12.0
|
||||
wrapt==1.12.1
|
||||
zipp==1.2.0
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
-i https://pypi.python.org/simple
|
||||
configparser==4.0.2 ; python_version < '3.2'
|
||||
entrypoints==0.3
|
||||
enum34==1.1.9 ; python_version < '3.4'
|
||||
enum34==1.1.10 ; python_version < '3.4'
|
||||
flake8-import-order==0.18.1
|
||||
flake8==3.7.9
|
||||
functools32==3.2.3.post2 ; python_version < '3.2'
|
||||
|
||||
@@ -139,7 +139,7 @@ class InteractiveToolManager(object):
|
||||
self.security = app.security
|
||||
self.sa_session = app.model.context
|
||||
self.job_manager = app.job_manager
|
||||
self.propagator = InteractiveToolSqlite(app.config.interactivetool_map, app.security.encode_id)
|
||||
self.propagator = InteractiveToolSqlite(app.config.interactivetools_map, app.security.encode_id)
|
||||
|
||||
def create_entry_points(self, job, tool, entry_points=None, flush=True):
|
||||
entry_points = entry_points or tool.ports
|
||||
@@ -260,8 +260,13 @@ class InteractiveToolManager(object):
|
||||
def target_if_active(self, trans, entry_point):
|
||||
if entry_point.active and not entry_point.deleted:
|
||||
request_host = trans.request.host
|
||||
rval = '%s//%s-%s.%s.%s.%s/' % (trans.request.host_url.split('//', 1)[0], trans.security.encode_id(entry_point.id),
|
||||
entry_point.token, entry_point.__class__.__name__.lower(), self.app.config.interactivetool_prefix, request_host)
|
||||
protocol = trans.request.host_url.split('//', 1)[0]
|
||||
entry_point_encoded_id = trans.security.encode_id(entry_point.id)
|
||||
entry_point_class = entry_point.__class__.__name__.lower()
|
||||
entry_point_prefix = self.app.config.interactivetool_prefix
|
||||
interactivetool_proxy_host = self.app.config.interactivetool_proxy_host or request_host
|
||||
rval = '%s//%s-%s.%s.%s.%s/' % (protocol, entry_point_encoded_id,
|
||||
entry_point.token, entry_point_class, entry_point_prefix, interactivetool_proxy_host)
|
||||
if entry_point.entry_url:
|
||||
rval = '%s/%s' % (rval.rstrip('/'), entry_point.entry_url.lstrip('/'))
|
||||
return rval
|
||||
|
||||
@@ -498,6 +498,20 @@ def summarize_job_metrics(trans, job):
|
||||
return list(map(metric_to_dict, metrics))
|
||||
|
||||
|
||||
def summarize_destination_params(trans, job):
|
||||
"""Produce a dict-ified version of job destination parameters ready for tabular rendering.
|
||||
|
||||
Precondition: the caller has verified the job is accessible to the user
|
||||
represented by the trans parameter.
|
||||
"""
|
||||
|
||||
destination_params = {'Runner': job.job_runner_name,
|
||||
'Runner Job ID': job.job_runner_external_id,
|
||||
'Handler': job.handler}
|
||||
destination_params.update(job.destination_params)
|
||||
return destination_params
|
||||
|
||||
|
||||
def summarize_job_parameters(trans, job):
|
||||
"""Produce a dict-ified version of job parameters ready for tabular rendering.
|
||||
|
||||
|
||||
@@ -617,8 +617,8 @@ class WorkflowContentsManager(UsesAnnotations):
|
||||
else:
|
||||
data['upgrade_messages'][step.order_index] = {module.tool.name: "\n".join(module.version_changes)}
|
||||
# Get user annotation.
|
||||
annotation_str = self.get_item_annotation_str(trans.sa_session, trans.user, step) or ''
|
||||
config_form = module.get_config_form(step=step)
|
||||
annotation_str = self.get_item_annotation_str(trans.sa_session, trans.user, step) or ''
|
||||
# Pack attributes into plain dictionary
|
||||
step_dict = {
|
||||
'id': step.order_index,
|
||||
|
||||
@@ -12,6 +12,10 @@ from sqlalchemy import (
|
||||
Table
|
||||
)
|
||||
from sqlalchemy.exc import NoSuchTableError
|
||||
from sqlalchemy_utils import (
|
||||
create_database,
|
||||
database_exists,
|
||||
)
|
||||
|
||||
from galaxy.model.tool_shed_install import mapping
|
||||
|
||||
@@ -27,6 +31,11 @@ def create_or_verify_database(url, engine_options={}, app=None):
|
||||
"""
|
||||
"""
|
||||
# Create engine and metadata
|
||||
if not database_exists(url):
|
||||
message = "Creating database for URI [%s]" % url
|
||||
log.info(message)
|
||||
create_database(url)
|
||||
|
||||
engine = create_engine(url, **engine_options)
|
||||
|
||||
def migrate():
|
||||
|
||||
+204
-152
@@ -5,6 +5,7 @@ all providers ensure that data can be accessed on the filesystem for running
|
||||
tools
|
||||
"""
|
||||
|
||||
import abc
|
||||
import logging
|
||||
import os
|
||||
import random
|
||||
@@ -39,8 +40,9 @@ log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ObjectStore(object):
|
||||
__metaclass__ = abc.ABCMeta
|
||||
|
||||
"""ObjectStore abstract interface.
|
||||
"""ObjectStore interface.
|
||||
|
||||
FIELD DESCRIPTIONS (these apply to all the methods in this class):
|
||||
|
||||
@@ -82,6 +84,120 @@ class ObjectStore(object):
|
||||
000/obj.id)
|
||||
"""
|
||||
|
||||
@abc.abstractmethod
|
||||
def exists(self, obj, base_dir=None, dir_only=False, extra_dir=None, extra_dir_at_root=False, alt_name=None):
|
||||
"""Return True if the object identified by `obj` exists, False otherwise."""
|
||||
raise NotImplementedError()
|
||||
|
||||
@abc.abstractmethod
|
||||
def create(self, obj, base_dir=None, dir_only=False, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Mark the object (`obj`) as existing in the store, but with no content.
|
||||
|
||||
This method will create a proper directory structure for
|
||||
the file if the directory does not already exist.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@abc.abstractmethod
|
||||
def empty(self, obj, base_dir=None, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Test if the object identified by `obj` has content.
|
||||
|
||||
If the object does not exist raises `ObjectNotFound`.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@abc.abstractmethod
|
||||
def size(self, obj, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Return size of the object identified by `obj`.
|
||||
|
||||
If the object does not exist, return 0.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@abc.abstractmethod
|
||||
def delete(self, obj, entire_dir=False, base_dir=None, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Delete the object identified by `obj`.
|
||||
|
||||
:type entire_dir: boolean
|
||||
:param entire_dir: If True, delete the entire directory pointed to by
|
||||
extra_dir. For safety reasons, this option applies
|
||||
only for and in conjunction with the extra_dir or
|
||||
obj_dir options.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@abc.abstractmethod
|
||||
def get_data(self, obj, start=0, count=-1, base_dir=None, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Fetch `count` bytes of data offset by `start` bytes using `obj.id`.
|
||||
|
||||
If the object does not exist raises `ObjectNotFound`.
|
||||
|
||||
:type start: int
|
||||
:param start: Set the position to start reading the dataset file
|
||||
|
||||
:type count: int
|
||||
:param count: Read at most `count` bytes from the dataset
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@abc.abstractmethod
|
||||
def get_filename(self, obj, base_dir=None, dir_only=False, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Get the expected filename with absolute path for object with id `obj.id`.
|
||||
|
||||
This can be used to access the contents of the object.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@abc.abstractmethod
|
||||
def update_from_file(self, obj, base_dir=None, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False, file_name=None, create=False):
|
||||
"""
|
||||
Inform the store that the file associated with `obj.id` has been updated.
|
||||
|
||||
If `file_name` is provided, update from that file instead of the
|
||||
default.
|
||||
If the object does not exist raises `ObjectNotFound`.
|
||||
|
||||
:type file_name: string
|
||||
:param file_name: Use file pointed to by `file_name` as the source for
|
||||
updating the dataset identified by `obj`
|
||||
|
||||
:type create: boolean
|
||||
:param create: If True and the default dataset does not exist, create
|
||||
it first.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@abc.abstractmethod
|
||||
def get_object_url(self, obj, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Return the URL for direct acces if supported, otherwise return None.
|
||||
|
||||
Note: need to be careful to not bypass dataset security with this.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@abc.abstractmethod
|
||||
def get_store_usage_percent(self):
|
||||
"""Return the percentage indicating how full the store is."""
|
||||
raise NotImplementedError()
|
||||
|
||||
@abc.abstractmethod
|
||||
def get_store_by(self, obj):
|
||||
"""Return how object is stored (by 'uuid', 'id', or None if not yet saved).
|
||||
|
||||
Certain Galaxy remote data features aren't available if objects are stored by 'id'.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
class BaseObjectStore(ObjectStore):
|
||||
|
||||
def __init__(self, config, config_dict=None, **kwargs):
|
||||
"""
|
||||
:type config: object
|
||||
@@ -111,10 +227,6 @@ class ObjectStore(object):
|
||||
"""Close any connections for this ObjectStore."""
|
||||
self.running = False
|
||||
|
||||
def exists(self, obj, base_dir=None, dir_only=False, extra_dir=None, extra_dir_at_root=False, alt_name=None):
|
||||
"""Return True if the object identified by `obj` exists, False otherwise."""
|
||||
raise NotImplementedError()
|
||||
|
||||
def file_ready(self, obj, base_dir=None, dir_only=False, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Check if a file corresponding to a dataset is ready to be used.
|
||||
@@ -123,102 +235,6 @@ class ObjectStore(object):
|
||||
"""
|
||||
return True
|
||||
|
||||
def create(self, obj, base_dir=None, dir_only=False, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Mark the object (`obj`) as existing in the store, but with no content.
|
||||
|
||||
This method will create a proper directory structure for
|
||||
the file if the directory does not already exist.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def empty(self, obj, base_dir=None, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Test if the object identified by `obj` has content.
|
||||
|
||||
If the object does not exist raises `ObjectNotFound`.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def size(self, obj, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Return size of the object identified by `obj`.
|
||||
|
||||
If the object does not exist, return 0.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def delete(self, obj, entire_dir=False, base_dir=None, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Delete the object identified by `obj`.
|
||||
|
||||
:type entire_dir: boolean
|
||||
:param entire_dir: If True, delete the entire directory pointed to by
|
||||
extra_dir. For safety reasons, this option applies
|
||||
only for and in conjunction with the extra_dir or
|
||||
obj_dir options.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def get_data(self, obj, start=0, count=-1, base_dir=None, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Fetch `count` bytes of data offset by `start` bytes using `obj.id`.
|
||||
|
||||
If the object does not exist raises `ObjectNotFound`.
|
||||
|
||||
:type start: int
|
||||
:param start: Set the position to start reading the dataset file
|
||||
|
||||
:type count: int
|
||||
:param count: Read at most `count` bytes from the dataset
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def get_filename(self, obj, base_dir=None, dir_only=False, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Get the expected filename with absolute path for object with id `obj.id`.
|
||||
|
||||
This can be used to access the contents of the object.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def update_from_file(self, obj, base_dir=None, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False, file_name=None, create=False):
|
||||
"""
|
||||
Inform the store that the file associated with `obj.id` has been updated.
|
||||
|
||||
If `file_name` is provided, update from that file instead of the
|
||||
default.
|
||||
If the object does not exist raises `ObjectNotFound`.
|
||||
|
||||
:type file_name: string
|
||||
:param file_name: Use file pointed to by `file_name` as the source for
|
||||
updating the dataset identified by `obj`
|
||||
|
||||
:type create: boolean
|
||||
:param create: If True and the default dataset does not exist, create
|
||||
it first.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def get_object_url(self, obj, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Return the URL for direct acces if supported, otherwise return None.
|
||||
|
||||
Note: need to be careful to not bypass dataset security with this.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def get_store_usage_percent(self):
|
||||
"""Return the percentage indicating how full the store is."""
|
||||
raise NotImplementedError()
|
||||
|
||||
def get_store_by(self, obj):
|
||||
"""Return how object is stored (by 'uuid', 'id', or None if not yet saved).
|
||||
|
||||
Certain Galaxy remote data features aren't available if objects are stored by 'id'.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@classmethod
|
||||
def parse_xml(clazz, config_xml):
|
||||
"""Parse an XML description of a configuration for this object store.
|
||||
@@ -251,8 +267,44 @@ class ObjectStore(object):
|
||||
# job working directories.
|
||||
return obj.id
|
||||
|
||||
def _invoke(self, delegate, obj=None, **kwargs):
|
||||
return self.__getattribute__("_" + delegate)(obj=obj, **kwargs)
|
||||
|
||||
class ConcreteObjectStore(ObjectStore):
|
||||
def exists(self, obj, **kwargs):
|
||||
return self._invoke('exists', obj, **kwargs)
|
||||
|
||||
def create(self, obj, **kwargs):
|
||||
return self._invoke('create', obj, **kwargs)
|
||||
|
||||
def empty(self, obj, **kwargs):
|
||||
return self._invoke('empty', obj, **kwargs)
|
||||
|
||||
def size(self, obj, **kwargs):
|
||||
return self._invoke('size', obj, **kwargs)
|
||||
|
||||
def delete(self, obj, **kwargs):
|
||||
return self._invoke('delete', obj, **kwargs)
|
||||
|
||||
def get_data(self, obj, **kwargs):
|
||||
return self._invoke('get_data', obj, **kwargs)
|
||||
|
||||
def get_filename(self, obj, **kwargs):
|
||||
return self._invoke('get_filename', obj, **kwargs)
|
||||
|
||||
def update_from_file(self, obj, **kwargs):
|
||||
return self._invoke('update_from_file', obj, **kwargs)
|
||||
|
||||
def get_object_url(self, obj, **kwargs):
|
||||
return self._invoke('get_object_url', obj, **kwargs)
|
||||
|
||||
def get_store_usage_percent(self):
|
||||
return self._invoke('get_store_usage_percent')
|
||||
|
||||
def get_store_by(self, obj, **kwargs):
|
||||
return self._invoke('get_store_by', obj, **kwargs)
|
||||
|
||||
|
||||
class ConcreteObjectStore(BaseObjectStore):
|
||||
"""Subclass of ObjectStore for stores that don't delegate (non-nested).
|
||||
|
||||
Currently only adds store_by functionality. Which doesn't make
|
||||
@@ -280,7 +332,7 @@ class ConcreteObjectStore(ObjectStore):
|
||||
rval["store_by"] = self.store_by
|
||||
return rval
|
||||
|
||||
def get_store_by(self, obj):
|
||||
def _get_store_by(self, obj):
|
||||
return self.store_by
|
||||
|
||||
|
||||
@@ -343,7 +395,7 @@ class DiskObjectStore(ConcreteObjectStore):
|
||||
as_dict["files_dir"] = self.file_path
|
||||
return as_dict
|
||||
|
||||
def _get_filename(self, obj, base_dir=None, dir_only=False, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
def __get_filename(self, obj, base_dir=None, dir_only=False, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False):
|
||||
"""
|
||||
Return the absolute path for the file corresponding to the `obj.id`.
|
||||
|
||||
@@ -425,7 +477,7 @@ class DiskObjectStore(ConcreteObjectStore):
|
||||
path = os.path.join(path, alt_name if alt_name else "dataset_%s.dat" % obj_id)
|
||||
return os.path.abspath(path)
|
||||
|
||||
def exists(self, obj, **kwargs):
|
||||
def _exists(self, obj, **kwargs):
|
||||
"""Override `ObjectStore`'s stub and check on disk."""
|
||||
if self.check_old_style:
|
||||
path = self._construct_path(obj, old_style=True, **kwargs)
|
||||
@@ -435,9 +487,9 @@ class DiskObjectStore(ConcreteObjectStore):
|
||||
return True
|
||||
return os.path.exists(self._construct_path(obj, **kwargs))
|
||||
|
||||
def create(self, obj, **kwargs):
|
||||
def _create(self, obj, **kwargs):
|
||||
"""Override `ObjectStore`'s stub by creating any files and folders on disk."""
|
||||
if not self.exists(obj, **kwargs):
|
||||
if not self._exists(obj, **kwargs):
|
||||
path = self._construct_path(obj, **kwargs)
|
||||
dir_only = kwargs.get('dir_only', False)
|
||||
# Create directory if it does not exist
|
||||
@@ -448,18 +500,18 @@ class DiskObjectStore(ConcreteObjectStore):
|
||||
open(path, 'w').close() # Should be rb?
|
||||
umask_fix_perms(path, self.config.umask, 0o666)
|
||||
|
||||
def empty(self, obj, **kwargs):
|
||||
def _empty(self, obj, **kwargs):
|
||||
"""Override `ObjectStore`'s stub by checking file size on disk."""
|
||||
return self.size(obj, **kwargs) == 0
|
||||
|
||||
def size(self, obj, **kwargs):
|
||||
def _size(self, obj, **kwargs):
|
||||
"""Override `ObjectStore`'s stub by return file size on disk.
|
||||
|
||||
Returns 0 if the object doesn't exist yet or other error.
|
||||
"""
|
||||
if self.exists(obj, **kwargs):
|
||||
if self._exists(obj, **kwargs):
|
||||
try:
|
||||
filepath = self.get_filename(obj, **kwargs)
|
||||
filepath = self._get_filename(obj, **kwargs)
|
||||
for _ in range(0, 2):
|
||||
size = os.path.getsize(filepath)
|
||||
if size != 0:
|
||||
@@ -472,31 +524,31 @@ class DiskObjectStore(ConcreteObjectStore):
|
||||
else:
|
||||
return 0
|
||||
|
||||
def delete(self, obj, entire_dir=False, **kwargs):
|
||||
def _delete(self, obj, entire_dir=False, **kwargs):
|
||||
"""Override `ObjectStore`'s stub; delete the file or folder on disk."""
|
||||
path = self.get_filename(obj, **kwargs)
|
||||
path = self._get_filename(obj, **kwargs)
|
||||
extra_dir = kwargs.get('extra_dir', None)
|
||||
obj_dir = kwargs.get('obj_dir', False)
|
||||
try:
|
||||
if entire_dir and (extra_dir or obj_dir):
|
||||
shutil.rmtree(path)
|
||||
return True
|
||||
if self.exists(obj, **kwargs):
|
||||
if self._exists(obj, **kwargs):
|
||||
os.remove(path)
|
||||
return True
|
||||
except OSError as ex:
|
||||
log.critical('%s delete error %s' % (self._get_filename(obj, **kwargs), ex))
|
||||
log.critical('%s delete error %s' % (self.__get_filename(obj, **kwargs), ex))
|
||||
return False
|
||||
|
||||
def get_data(self, obj, start=0, count=-1, **kwargs):
|
||||
def _get_data(self, obj, start=0, count=-1, **kwargs):
|
||||
"""Override `ObjectStore`'s stub; retrieve data directly from disk."""
|
||||
data_file = open(self.get_filename(obj, **kwargs), 'r') # Should be rb?
|
||||
data_file = open(self._get_filename(obj, **kwargs), 'r') # Should be rb?
|
||||
data_file.seek(start)
|
||||
content = data_file.read(count)
|
||||
data_file.close()
|
||||
return content
|
||||
|
||||
def get_filename(self, obj, **kwargs):
|
||||
def _get_filename(self, obj, **kwargs):
|
||||
"""
|
||||
Override `ObjectStore`'s stub.
|
||||
|
||||
@@ -514,27 +566,27 @@ class DiskObjectStore(ConcreteObjectStore):
|
||||
raise ObjectNotFound
|
||||
return path
|
||||
|
||||
def update_from_file(self, obj, file_name=None, create=False, **kwargs):
|
||||
def _update_from_file(self, obj, file_name=None, create=False, **kwargs):
|
||||
"""`create` parameter is not used in this implementation."""
|
||||
preserve_symlinks = kwargs.pop('preserve_symlinks', False)
|
||||
# FIXME: symlinks and the object store model may not play well together
|
||||
# these should be handled better, e.g. registering the symlink'd file
|
||||
# as an object
|
||||
if create:
|
||||
self.create(obj, **kwargs)
|
||||
if file_name and self.exists(obj, **kwargs):
|
||||
self._create(obj, **kwargs)
|
||||
if file_name and self._exists(obj, **kwargs):
|
||||
try:
|
||||
if preserve_symlinks and os.path.islink(file_name):
|
||||
force_symlink(os.readlink(file_name), self.get_filename(obj, **kwargs))
|
||||
force_symlink(os.readlink(file_name), self._get_filename(obj, **kwargs))
|
||||
else:
|
||||
path = self.get_filename(obj, **kwargs)
|
||||
path = self._get_filename(obj, **kwargs)
|
||||
shutil.copy(file_name, path)
|
||||
umask_fix_perms(path, self.config.umask, 0o666)
|
||||
except IOError as ex:
|
||||
log.critical('Error copying %s to %s: %s' % (file_name, self._get_filename(obj, **kwargs), ex))
|
||||
log.critical('Error copying %s to %s: %s' % (file_name, self.__get_filename(obj, **kwargs), ex))
|
||||
raise ex
|
||||
|
||||
def get_object_url(self, obj, **kwargs):
|
||||
def _get_object_url(self, obj, **kwargs):
|
||||
"""
|
||||
Override `ObjectStore`'s stub.
|
||||
|
||||
@@ -542,13 +594,13 @@ class DiskObjectStore(ConcreteObjectStore):
|
||||
"""
|
||||
return None
|
||||
|
||||
def get_store_usage_percent(self):
|
||||
def _get_store_usage_percent(self, **kwargs):
|
||||
"""Override `ObjectStore`'s stub by return percent storage used."""
|
||||
st = os.statvfs(self.file_path)
|
||||
return (float(st.f_blocks - st.f_bavail) / st.f_blocks) * 100
|
||||
|
||||
|
||||
class NestedObjectStore(ObjectStore):
|
||||
class NestedObjectStore(BaseObjectStore):
|
||||
|
||||
"""
|
||||
Base for ObjectStores that use other ObjectStores.
|
||||
@@ -567,51 +619,51 @@ class NestedObjectStore(ObjectStore):
|
||||
store.shutdown()
|
||||
super(NestedObjectStore, self).shutdown()
|
||||
|
||||
def exists(self, obj, **kwargs):
|
||||
def _exists(self, obj, **kwargs):
|
||||
"""Determine if the `obj` exists in any of the backends."""
|
||||
return self._call_method('exists', obj, False, False, **kwargs)
|
||||
return self._call_method('_exists', obj, False, False, **kwargs)
|
||||
|
||||
def file_ready(self, obj, **kwargs):
|
||||
"""Determine if the file for `obj` is ready to be used by any of the backends."""
|
||||
return self._call_method('file_ready', obj, False, False, **kwargs)
|
||||
|
||||
def create(self, obj, **kwargs):
|
||||
def _create(self, obj, **kwargs):
|
||||
"""Create a backing file in a random backend."""
|
||||
random.choice(list(self.backends.values())).create(obj, **kwargs)
|
||||
|
||||
def empty(self, obj, **kwargs):
|
||||
def _empty(self, obj, **kwargs):
|
||||
"""For the first backend that has this `obj`, determine if it is empty."""
|
||||
return self._call_method('empty', obj, True, False, **kwargs)
|
||||
return self._call_method('_empty', obj, True, False, **kwargs)
|
||||
|
||||
def size(self, obj, **kwargs):
|
||||
def _size(self, obj, **kwargs):
|
||||
"""For the first backend that has this `obj`, return its size."""
|
||||
return self._call_method('size', obj, 0, False, **kwargs)
|
||||
return self._call_method('_size', obj, 0, False, **kwargs)
|
||||
|
||||
def delete(self, obj, **kwargs):
|
||||
def _delete(self, obj, **kwargs):
|
||||
"""For the first backend that has this `obj`, delete it."""
|
||||
return self._call_method('delete', obj, False, False, **kwargs)
|
||||
return self._call_method('_delete', obj, False, False, **kwargs)
|
||||
|
||||
def get_data(self, obj, **kwargs):
|
||||
def _get_data(self, obj, **kwargs):
|
||||
"""For the first backend that has this `obj`, get data from it."""
|
||||
return self._call_method('get_data', obj, ObjectNotFound, True, **kwargs)
|
||||
return self._call_method('_get_data', obj, ObjectNotFound, True, **kwargs)
|
||||
|
||||
def get_filename(self, obj, **kwargs):
|
||||
def _get_filename(self, obj, **kwargs):
|
||||
"""For the first backend that has this `obj`, get its filename."""
|
||||
return self._call_method('get_filename', obj, ObjectNotFound, True, **kwargs)
|
||||
return self._call_method('_get_filename', obj, ObjectNotFound, True, **kwargs)
|
||||
|
||||
def update_from_file(self, obj, **kwargs):
|
||||
def _update_from_file(self, obj, **kwargs):
|
||||
"""For the first backend that has this `obj`, update it from the given file."""
|
||||
if kwargs.get('create', False):
|
||||
self.create(obj, **kwargs)
|
||||
self._create(obj, **kwargs)
|
||||
kwargs['create'] = False
|
||||
return self._call_method('update_from_file', obj, ObjectNotFound, True, **kwargs)
|
||||
return self._call_method('_update_from_file', obj, ObjectNotFound, True, **kwargs)
|
||||
|
||||
def get_object_url(self, obj, **kwargs):
|
||||
def _get_object_url(self, obj, **kwargs):
|
||||
"""For the first backend that has this `obj`, get its URL."""
|
||||
return self._call_method('get_object_url', obj, None, False, **kwargs)
|
||||
return self._call_method('_get_object_url', obj, None, False, **kwargs)
|
||||
|
||||
def get_store_by(self, obj):
|
||||
return self._call_method('get_store_by', obj, None, False)
|
||||
def _get_store_by(self, obj):
|
||||
return self._call_method('_get_store_by', obj, None, False)
|
||||
|
||||
def _repr_object_for_exception(self, obj):
|
||||
try:
|
||||
@@ -791,9 +843,9 @@ class DistributedObjectStore(NestedObjectStore):
|
||||
self.weighted_backend_ids = new_weighted_backend_ids
|
||||
self.sleeper.sleep(120) # Test free space every 2 minutes
|
||||
|
||||
def create(self, obj, **kwargs):
|
||||
def _create(self, obj, **kwargs):
|
||||
"""The only method in which obj.object_store_id may be None."""
|
||||
if obj.object_store_id is None or not self.exists(obj, **kwargs):
|
||||
if obj.object_store_id is None or not self._exists(obj, **kwargs):
|
||||
if obj.object_store_id is None or obj.object_store_id not in self.backends:
|
||||
try:
|
||||
obj.object_store_id = random.choice(self.weighted_backend_ids)
|
||||
@@ -880,14 +932,14 @@ class HierarchicalObjectStore(NestedObjectStore):
|
||||
as_dict["backends"] = backends
|
||||
return as_dict
|
||||
|
||||
def exists(self, obj, **kwargs):
|
||||
def _exists(self, obj, **kwargs):
|
||||
"""Check all child object stores."""
|
||||
for store in self.backends.values():
|
||||
if store.exists(obj, **kwargs):
|
||||
return True
|
||||
return False
|
||||
|
||||
def create(self, obj, **kwargs):
|
||||
def _create(self, obj, **kwargs):
|
||||
"""Call the primary object store."""
|
||||
self.backends[0].create(obj, **kwargs)
|
||||
|
||||
@@ -913,7 +965,7 @@ def type_to_object_store_class(store, fsmon=False):
|
||||
objectstore_class = HierarchicalObjectStore
|
||||
objectstore_constructor_kwds["fsmon"] = fsmon
|
||||
elif store == 'irods':
|
||||
from .rods import IRODSObjectStore
|
||||
from .irods import IRODSObjectStore
|
||||
objectstore_class = IRODSObjectStore
|
||||
elif store == 'azure_blob':
|
||||
from .azure_blob import AzureBlobObjectStore
|
||||
|
||||
@@ -310,7 +310,7 @@ class AzureBlobObjectStore(ConcreteObjectStore):
|
||||
# Public Methods #
|
||||
##################
|
||||
|
||||
def exists(self, obj, **kwargs):
|
||||
def _exists(self, obj, **kwargs):
|
||||
in_cache = in_azure = False
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
|
||||
@@ -357,9 +357,9 @@ class AzureBlobObjectStore(ConcreteObjectStore):
|
||||
|
||||
return False
|
||||
|
||||
def create(self, obj, **kwargs):
|
||||
def _create(self, obj, **kwargs):
|
||||
|
||||
if not self.exists(obj, **kwargs):
|
||||
if not self._exists(obj, **kwargs):
|
||||
|
||||
# Pull out locally used fields
|
||||
extra_dir = kwargs.get('extra_dir', None)
|
||||
@@ -393,25 +393,25 @@ class AzureBlobObjectStore(ConcreteObjectStore):
|
||||
open(os.path.join(self.staging_path, rel_path), 'w').close()
|
||||
self._push_to_os(rel_path, from_string='')
|
||||
|
||||
def empty(self, obj, **kwargs):
|
||||
if self.exists(obj, **kwargs):
|
||||
return bool(self.size(obj, **kwargs) > 0)
|
||||
def _empty(self, obj, **kwargs):
|
||||
if self._exists(obj, **kwargs):
|
||||
return bool(self._size(obj, **kwargs) > 0)
|
||||
else:
|
||||
raise ObjectNotFound('objectstore.empty, object does not exist: %s, kwargs: %s' % (str(obj), str(kwargs)))
|
||||
|
||||
def size(self, obj, **kwargs):
|
||||
def _size(self, obj, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
if self._in_cache(rel_path):
|
||||
try:
|
||||
return os.path.getsize(self._get_cache_path(rel_path))
|
||||
except OSError as ex:
|
||||
log.info("Could not get size of file '%s' in local cache, will try Azure. Error: %s", rel_path, ex)
|
||||
elif self.exists(obj, **kwargs):
|
||||
elif self._exists(obj, **kwargs):
|
||||
return self._get_size_in_azure(rel_path)
|
||||
log.warning("Did not find dataset '%s', returning 0 for size", rel_path)
|
||||
return 0
|
||||
|
||||
def delete(self, obj, entire_dir=False, **kwargs):
|
||||
def _delete(self, obj, entire_dir=False, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
extra_dir = kwargs.get('extra_dir', None)
|
||||
base_dir = kwargs.get('base_dir', None)
|
||||
@@ -445,10 +445,10 @@ class AzureBlobObjectStore(ConcreteObjectStore):
|
||||
except AzureHttpError:
|
||||
log.exception("Could not delete blob '%s' from Azure", rel_path)
|
||||
except OSError:
|
||||
log.exception('%s delete error', self.get_filename(obj, **kwargs))
|
||||
log.exception('%s delete error', self._get_filename(obj, **kwargs))
|
||||
return False
|
||||
|
||||
def get_data(self, obj, start=0, count=-1, **kwargs):
|
||||
def _get_data(self, obj, start=0, count=-1, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
# Check cache first and get file if not there
|
||||
if not self._in_cache(rel_path):
|
||||
@@ -460,7 +460,7 @@ class AzureBlobObjectStore(ConcreteObjectStore):
|
||||
data_file.close()
|
||||
return content
|
||||
|
||||
def get_filename(self, obj, **kwargs):
|
||||
def _get_filename(self, obj, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
base_dir = kwargs.get('base_dir', None)
|
||||
dir_only = kwargs.get('dir_only', False)
|
||||
@@ -483,7 +483,7 @@ class AzureBlobObjectStore(ConcreteObjectStore):
|
||||
if self._in_cache(rel_path):
|
||||
return cache_path
|
||||
# Check if the file exists in persistent storage and, if it does, pull it into cache
|
||||
elif self.exists(obj, **kwargs):
|
||||
elif self._exists(obj, **kwargs):
|
||||
if dir_only: # Directories do not get pulled into cache
|
||||
return cache_path
|
||||
else:
|
||||
@@ -495,10 +495,10 @@ class AzureBlobObjectStore(ConcreteObjectStore):
|
||||
# return cache_path
|
||||
raise ObjectNotFound('objectstore.get_filename, no cache_path: %s, kwargs: %s' % (str(obj), str(kwargs)))
|
||||
|
||||
def update_from_file(self, obj, file_name=None, create=False, **kwargs):
|
||||
def _update_from_file(self, obj, file_name=None, create=False, **kwargs):
|
||||
if create is True:
|
||||
self.create(obj, **kwargs)
|
||||
elif self.exists(obj, **kwargs):
|
||||
self._create(obj, **kwargs)
|
||||
elif self._exists(obj, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
# Chose whether to use the dataset file itself or an alternate file
|
||||
if file_name:
|
||||
@@ -520,8 +520,8 @@ class AzureBlobObjectStore(ConcreteObjectStore):
|
||||
else:
|
||||
raise ObjectNotFound('objectstore.update_from_file, object does not exist: %s, kwargs: %s' % (str(obj), str(kwargs)))
|
||||
|
||||
def get_object_url(self, obj, **kwargs):
|
||||
if self.exists(obj, **kwargs):
|
||||
def _get_object_url(self, obj, **kwargs):
|
||||
if self._exists(obj, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
try:
|
||||
url = self.service.make_blob_url(container_name=self.container_name, blob_name=rel_path)
|
||||
@@ -530,7 +530,7 @@ class AzureBlobObjectStore(ConcreteObjectStore):
|
||||
log.exception("Trouble generating URL for dataset '%s'", rel_path)
|
||||
return None
|
||||
|
||||
def get_store_usage_percent(self):
|
||||
def _get_store_usage_percent(self):
|
||||
return 0.0
|
||||
|
||||
##################
|
||||
|
||||
@@ -510,7 +510,7 @@ class Cloud(ConcreteObjectStore, CloudConfigMixin):
|
||||
os.path.getsize(self._get_cache_path(rel_path)), self._get_size_in_cloud(rel_path))
|
||||
return False
|
||||
|
||||
def exists(self, obj, **kwargs):
|
||||
def _exists(self, obj, **kwargs):
|
||||
in_cache = False
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
|
||||
@@ -543,8 +543,8 @@ class Cloud(ConcreteObjectStore, CloudConfigMixin):
|
||||
else:
|
||||
return False
|
||||
|
||||
def create(self, obj, **kwargs):
|
||||
if not self.exists(obj, **kwargs):
|
||||
def _create(self, obj, **kwargs):
|
||||
if not self._exists(obj, **kwargs):
|
||||
|
||||
# Pull out locally used fields
|
||||
extra_dir = kwargs.get('extra_dir', None)
|
||||
@@ -572,26 +572,26 @@ class Cloud(ConcreteObjectStore, CloudConfigMixin):
|
||||
open(os.path.join(self.staging_path, rel_path), 'w').close()
|
||||
self._push_to_os(rel_path, from_string='')
|
||||
|
||||
def empty(self, obj, **kwargs):
|
||||
if self.exists(obj, **kwargs):
|
||||
return bool(self.size(obj, **kwargs) > 0)
|
||||
def _empty(self, obj, **kwargs):
|
||||
if self._exists(obj, **kwargs):
|
||||
return bool(self._size(obj, **kwargs) > 0)
|
||||
else:
|
||||
raise ObjectNotFound('objectstore.empty, object does not exist: %s, kwargs: %s'
|
||||
% (str(obj), str(kwargs)))
|
||||
|
||||
def size(self, obj, **kwargs):
|
||||
def _size(self, obj, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
if self._in_cache(rel_path):
|
||||
try:
|
||||
return os.path.getsize(self._get_cache_path(rel_path))
|
||||
except OSError as ex:
|
||||
log.info("Could not get size of file '%s' in local cache, will try cloud. Error: %s", rel_path, ex)
|
||||
elif self.exists(obj, **kwargs):
|
||||
elif self._exists(obj, **kwargs):
|
||||
return self._get_size_in_cloud(rel_path)
|
||||
log.warning("Did not find dataset '%s', returning 0 for size", rel_path)
|
||||
return 0
|
||||
|
||||
def delete(self, obj, entire_dir=False, **kwargs):
|
||||
def _delete(self, obj, entire_dir=False, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
extra_dir = kwargs.get('extra_dir', None)
|
||||
base_dir = kwargs.get('base_dir', None)
|
||||
@@ -626,10 +626,10 @@ class Cloud(ConcreteObjectStore, CloudConfigMixin):
|
||||
except Exception:
|
||||
log.exception("Could not delete key '%s' from cloud", rel_path)
|
||||
except OSError:
|
||||
log.exception('%s delete error', self.get_filename(obj, **kwargs))
|
||||
log.exception('%s delete error', self._get_filename(obj, **kwargs))
|
||||
return False
|
||||
|
||||
def get_data(self, obj, start=0, count=-1, **kwargs):
|
||||
def _get_data(self, obj, start=0, count=-1, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
# Check cache first and get file if not there
|
||||
if not self._in_cache(rel_path):
|
||||
@@ -641,7 +641,7 @@ class Cloud(ConcreteObjectStore, CloudConfigMixin):
|
||||
data_file.close()
|
||||
return content
|
||||
|
||||
def get_filename(self, obj, **kwargs):
|
||||
def _get_filename(self, obj, **kwargs):
|
||||
base_dir = kwargs.get('base_dir', None)
|
||||
dir_only = kwargs.get('dir_only', False)
|
||||
obj_dir = kwargs.get('obj_dir', False)
|
||||
@@ -664,7 +664,7 @@ class Cloud(ConcreteObjectStore, CloudConfigMixin):
|
||||
if self._in_cache(rel_path):
|
||||
return cache_path
|
||||
# Check if the file exists in persistent storage and, if it does, pull it into cache
|
||||
elif self.exists(obj, **kwargs):
|
||||
elif self._exists(obj, **kwargs):
|
||||
if dir_only: # Directories do not get pulled into cache
|
||||
return cache_path
|
||||
else:
|
||||
@@ -678,10 +678,10 @@ class Cloud(ConcreteObjectStore, CloudConfigMixin):
|
||||
% (str(obj), str(kwargs)))
|
||||
# return cache_path # Until the upload tool does not explicitly create the dataset, return expected path
|
||||
|
||||
def update_from_file(self, obj, file_name=None, create=False, **kwargs):
|
||||
def _update_from_file(self, obj, file_name=None, create=False, **kwargs):
|
||||
if create:
|
||||
self.create(obj, **kwargs)
|
||||
if self.exists(obj, **kwargs):
|
||||
self._create(obj, **kwargs)
|
||||
if self._exists(obj, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
# Chose whether to use the dataset file itself or an alternate file
|
||||
if file_name:
|
||||
@@ -703,8 +703,8 @@ class Cloud(ConcreteObjectStore, CloudConfigMixin):
|
||||
raise ObjectNotFound('objectstore.update_from_file, object does not exist: %s, kwargs: %s'
|
||||
% (str(obj), str(kwargs)))
|
||||
|
||||
def get_object_url(self, obj, **kwargs):
|
||||
if self.exists(obj, **kwargs):
|
||||
def _get_object_url(self, obj, **kwargs):
|
||||
if self._exists(obj, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
try:
|
||||
key = self.bucket.objects.get(rel_path)
|
||||
@@ -713,5 +713,5 @@ class Cloud(ConcreteObjectStore, CloudConfigMixin):
|
||||
log.exception("Trouble generating URL for dataset '%s'", rel_path)
|
||||
return None
|
||||
|
||||
def get_store_usage_percent(self):
|
||||
def _get_store_usage_percent(self):
|
||||
return 0.0
|
||||
|
||||
@@ -0,0 +1,653 @@
|
||||
"""
|
||||
Object Store plugin for the Integrated Rule-Oriented Data Store (iRODS)
|
||||
"""
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
from datetime import datetime
|
||||
from functools import partial
|
||||
try:
|
||||
from pathlib import Path
|
||||
except ImportError:
|
||||
# Use backport on python 2
|
||||
from pathlib2 import Path
|
||||
|
||||
try:
|
||||
import irods
|
||||
import irods.keywords as kw
|
||||
from irods.exception import CollectionDoesNotExist
|
||||
from irods.exception import DataObjectDoesNotExist
|
||||
from irods.exception import NetworkException
|
||||
from irods.session import iRODSSession
|
||||
except ImportError:
|
||||
irods = None
|
||||
|
||||
from galaxy.exceptions import ObjectInvalid, ObjectNotFound
|
||||
from galaxy.util import directory_hash_id, umask_fix_perms
|
||||
from galaxy.util.path import safe_relpath
|
||||
from ..objectstore import DiskObjectStore
|
||||
|
||||
IRODS_IMPORT_MESSAGE = ('The Python irods package is required to use this feature, please install it')
|
||||
# 1 MB
|
||||
CHUNK_SIZE = 2**20
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _config_xml_error(tag):
|
||||
msg = 'No {tag} element in config XML tree'.format(tag=tag)
|
||||
raise Exception(msg)
|
||||
|
||||
|
||||
def _config_dict_error(key):
|
||||
msg = 'No {key} key in config dictionary'.forma(key=key)
|
||||
raise Exception(msg)
|
||||
|
||||
|
||||
def parse_config_xml(config_xml):
|
||||
try:
|
||||
a_xml = config_xml.findall('auth')
|
||||
if not a_xml:
|
||||
_config_xml_error('auth')
|
||||
username = a_xml[0].get('username')
|
||||
password = a_xml[0].get('password')
|
||||
|
||||
r_xml = config_xml.findall('resource')
|
||||
if not r_xml:
|
||||
_config_xml_error('resource')
|
||||
resource_name = r_xml[0].get('name')
|
||||
|
||||
z_xml = config_xml.findall('zone')
|
||||
if not z_xml:
|
||||
_config_xml_error('zone')
|
||||
zone_name = z_xml[0].get('name')
|
||||
|
||||
c_xml = config_xml.findall('connection')
|
||||
if not c_xml:
|
||||
_config_xml_error('connection')
|
||||
host = c_xml[0].get('host', None)
|
||||
port = int(c_xml[0].get('port', 0))
|
||||
timeout = int(c_xml[0].get('timeout', 30))
|
||||
|
||||
c_xml = config_xml.findall('cache')
|
||||
if not c_xml:
|
||||
_config_xml_error('cache')
|
||||
cache_size = float(c_xml[0].get('size', -1))
|
||||
staging_path = c_xml[0].get('path', None)
|
||||
|
||||
attrs = ('type', 'path')
|
||||
e_xml = config_xml.findall('extra_dir')
|
||||
if not e_xml:
|
||||
_config_xml_error('extra_dir')
|
||||
extra_dirs = [dict(((k, e.get(k)) for k in attrs)) for e in e_xml]
|
||||
|
||||
return {
|
||||
'auth': {
|
||||
'username': username,
|
||||
'password': password,
|
||||
},
|
||||
'resource': {
|
||||
'name': resource_name,
|
||||
},
|
||||
'zone': {
|
||||
'name': zone_name,
|
||||
},
|
||||
'connection': {
|
||||
'host': host,
|
||||
'port': port,
|
||||
'timeout': timeout
|
||||
},
|
||||
'cache': {
|
||||
'size': cache_size,
|
||||
'path': staging_path,
|
||||
},
|
||||
'extra_dirs': extra_dirs,
|
||||
}
|
||||
except Exception:
|
||||
# Toss it back up after logging, we can't continue loading at this point.
|
||||
log.exception("Malformed iRODS ObjectStore Configuration XML -- unable to continue.")
|
||||
raise
|
||||
|
||||
|
||||
class CloudConfigMixin(object):
|
||||
|
||||
def _config_to_dict(self):
|
||||
return {
|
||||
'auth': {
|
||||
'username': self.username,
|
||||
'password': self.password,
|
||||
},
|
||||
'resource': {
|
||||
'name': self.resource,
|
||||
},
|
||||
'zone': {
|
||||
'name': self.zone,
|
||||
},
|
||||
'connection': {
|
||||
'host': self.host,
|
||||
'port': self.port,
|
||||
'timeout': self.timeout,
|
||||
},
|
||||
'cache': {
|
||||
'size': self.cache_size,
|
||||
'path': self.staging_path,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class IRODSObjectStore(DiskObjectStore, CloudConfigMixin):
|
||||
"""
|
||||
Object store that stores objects as data objects in an iRODS collections. A local cache
|
||||
exists that is used as an intermediate location for files between Galaxy and iRODS.
|
||||
"""
|
||||
|
||||
store_type = 'irods'
|
||||
|
||||
def __init__(self, config, config_dict):
|
||||
super(IRODSObjectStore, self).__init__(config, config_dict)
|
||||
|
||||
auth_dict = config_dict.get('auth')
|
||||
if auth_dict is None:
|
||||
_config_dict_error('auth')
|
||||
|
||||
self.username = auth_dict.get('username')
|
||||
if self.username is None:
|
||||
_config_dict_error('auth->username')
|
||||
self.password = auth_dict.get('password')
|
||||
if self.password is None:
|
||||
_config_dict_error('auth->password')
|
||||
|
||||
resource_dict = config_dict['resource']
|
||||
if resource_dict is None:
|
||||
_config_dict_error('resource')
|
||||
self.resource = resource_dict.get('name')
|
||||
if self.resource is None:
|
||||
_config_dict_error('resource->name')
|
||||
|
||||
zone_dict = config_dict['zone']
|
||||
if zone_dict is None:
|
||||
_config_dict_error('zone')
|
||||
self.zone = zone_dict.get('name')
|
||||
if self.zone is None:
|
||||
_config_dict_error('zone->name')
|
||||
|
||||
connection_dict = config_dict['connection']
|
||||
if connection_dict is None:
|
||||
_config_dict_error('connection')
|
||||
self.host = connection_dict.get('host')
|
||||
if self.host is None:
|
||||
_config_dict_error('connection->host')
|
||||
self.port = connection_dict.get('port')
|
||||
if self.port is None:
|
||||
_config_dict_error('connection->port')
|
||||
self.timeout = connection_dict.get('timeout')
|
||||
if self.timeout is None:
|
||||
_config_dict_error('connection->timeout')
|
||||
|
||||
cache_dict = config_dict['cache']
|
||||
if cache_dict is None:
|
||||
_config_dict_error('cache')
|
||||
self.cache_size = cache_dict.get('size', -1)
|
||||
if self.cache_size is None:
|
||||
_config_dict_error('cache->size')
|
||||
self.staging_path = cache_dict.get('path') or self.config.object_store_cache_path
|
||||
if self.staging_path is None:
|
||||
_config_dict_error('cache->path')
|
||||
|
||||
extra_dirs = dict((e['type'], e['path']) for e in config_dict.get('extra_dirs', []))
|
||||
if not extra_dirs:
|
||||
_config_dict_error('extra_dirs')
|
||||
self.extra_dirs.update(extra_dirs)
|
||||
|
||||
self._initialize()
|
||||
|
||||
def __del__(self):
|
||||
self.session.cleanup()
|
||||
|
||||
def _initialize(self):
|
||||
if irods is None:
|
||||
raise Exception(IRODS_IMPORT_MESSAGE)
|
||||
|
||||
self.home = "/" + self.zone + "/home/" + self.username
|
||||
|
||||
self.session = self._configure_connection(host=self.host, port=self.port, user=self.username, password=self.password, zone=self.zone)
|
||||
|
||||
def _configure_connection(self, host='localhost', port='1247', user='rods', password='rods', zone='tempZone'):
|
||||
with iRODSSession(host=host, port=port, user=user, password=password, zone=zone) as session:
|
||||
# Set connection timeout
|
||||
session.connection_timeout = self.timeout
|
||||
# Throws NetworkException if connection fails
|
||||
try:
|
||||
session.pool.get_connection()
|
||||
except NetworkException as e:
|
||||
log.error('Could not create iRODS session: ' + str(e))
|
||||
raise
|
||||
return session
|
||||
|
||||
@classmethod
|
||||
def parse_xml(cls, config_xml):
|
||||
return parse_config_xml(config_xml)
|
||||
|
||||
def to_dict(self):
|
||||
as_dict = super(IRODSObjectStore, self).to_dict()
|
||||
as_dict.update(self._config_to_dict())
|
||||
return as_dict
|
||||
|
||||
def _fix_permissions(self, rel_path):
|
||||
""" Set permissions on rel_path"""
|
||||
for basedir, _, files in os.walk(rel_path):
|
||||
umask_fix_perms(basedir, self.config.umask, 0o777, self.config.gid)
|
||||
for filename in files:
|
||||
path = os.path.join(basedir, filename)
|
||||
# Ignore symlinks
|
||||
if os.path.islink(path):
|
||||
continue
|
||||
umask_fix_perms(path, self.config.umask, 0o666, self.config.gid)
|
||||
|
||||
def _construct_path(self, obj, base_dir=None, dir_only=None, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False, **kwargs):
|
||||
# extra_dir should never be constructed from provided data but just
|
||||
# make sure there are no shenannigans afoot
|
||||
if extra_dir and extra_dir != os.path.normpath(extra_dir):
|
||||
log.warning('extra_dir is not normalized: %s', extra_dir)
|
||||
raise ObjectInvalid("The requested object is invalid")
|
||||
# ensure that any parent directory references in alt_name would not
|
||||
# result in a path not contained in the directory path constructed here
|
||||
if alt_name:
|
||||
if not safe_relpath(alt_name):
|
||||
log.warning('alt_name would locate path outside dir: %s', alt_name)
|
||||
raise ObjectInvalid("The requested object is invalid")
|
||||
# alt_name can contain parent directory references, but S3 will not
|
||||
# follow them, so if they are valid we normalize them out
|
||||
alt_name = os.path.normpath(alt_name)
|
||||
rel_path = os.path.join(*directory_hash_id(obj.id))
|
||||
if extra_dir is not None:
|
||||
if extra_dir_at_root:
|
||||
rel_path = os.path.join(extra_dir, rel_path)
|
||||
else:
|
||||
rel_path = os.path.join(rel_path, extra_dir)
|
||||
|
||||
# for JOB_WORK directory
|
||||
if obj_dir:
|
||||
rel_path = os.path.join(rel_path, str(obj.id))
|
||||
if base_dir:
|
||||
base = self.extra_dirs.get(base_dir)
|
||||
return os.path.join(base, rel_path)
|
||||
|
||||
if not dir_only:
|
||||
rel_path = os.path.join(rel_path, alt_name if alt_name else "dataset_%s.dat" % obj.id)
|
||||
return rel_path
|
||||
|
||||
def _get_cache_path(self, rel_path):
|
||||
return os.path.abspath(os.path.join(self.staging_path, rel_path))
|
||||
|
||||
# rel_path is file or folder?
|
||||
def _get_size_in_irods(self, rel_path):
|
||||
p = Path(rel_path)
|
||||
data_object_name = p.stem + p.suffix
|
||||
subcollection_name = p.parent
|
||||
|
||||
collection_path = self.home + "/" + str(subcollection_name)
|
||||
data_object_path = collection_path + "/" + str(data_object_name)
|
||||
|
||||
try:
|
||||
data_obj = self.session.data_objects.get(data_object_path)
|
||||
return data_obj.__sizeof__()
|
||||
except (DataObjectDoesNotExist, CollectionDoesNotExist):
|
||||
log.warn("Collection or data object (%s) does not exist", data_object_path)
|
||||
return -1
|
||||
|
||||
# rel_path is file or folder?
|
||||
def _data_object_exists(self, rel_path):
|
||||
p = Path(rel_path)
|
||||
data_object_name = p.stem + p.suffix
|
||||
subcollection_name = p.parent
|
||||
|
||||
collection_path = self.home + "/" + str(subcollection_name)
|
||||
data_object_path = collection_path + "/" + str(data_object_name)
|
||||
|
||||
try:
|
||||
self.session.data_objects.get(data_object_path)
|
||||
return True
|
||||
except (DataObjectDoesNotExist, CollectionDoesNotExist):
|
||||
log.warn("Collection or data object (%s) does not exist", data_object_path)
|
||||
return False
|
||||
|
||||
def _in_cache(self, rel_path):
|
||||
""" Check if the given dataset is in the local cache and return True if so. """
|
||||
cache_path = self._get_cache_path(rel_path)
|
||||
return os.path.exists(cache_path)
|
||||
|
||||
def _pull_into_cache(self, rel_path):
|
||||
# Ensure the cache directory structure exists (e.g., dataset_#_files/)
|
||||
rel_path_dir = os.path.dirname(rel_path)
|
||||
if not os.path.exists(self._get_cache_path(rel_path_dir)):
|
||||
os.makedirs(self._get_cache_path(rel_path_dir))
|
||||
# Now pull in the file
|
||||
file_ok = self._download(rel_path)
|
||||
self._fix_permissions(self._get_cache_path(rel_path_dir))
|
||||
return file_ok
|
||||
|
||||
def _download(self, rel_path):
|
||||
log.debug("Pulling data object '%s' into cache to %s", rel_path, self._get_cache_path(rel_path))
|
||||
|
||||
p = Path(rel_path)
|
||||
data_object_name = p.stem + p.suffix
|
||||
subcollection_name = p.parent
|
||||
|
||||
collection_path = self.home + "/" + str(subcollection_name)
|
||||
data_object_path = collection_path + "/" + str(data_object_name)
|
||||
data_obj = None
|
||||
|
||||
try:
|
||||
data_obj = self.session.data_objects.get(data_object_path)
|
||||
except (DataObjectDoesNotExist, CollectionDoesNotExist):
|
||||
log.warn("Collection or data object (%s) does not exist", data_object_path)
|
||||
return False
|
||||
|
||||
if self.cache_size > 0 and data_obj.__sizeof__() > self.cache_size:
|
||||
log.critical("File %s is larger (%s) than the cache size (%s). Cannot download.",
|
||||
rel_path, data_obj.__sizeof__(), self.cache_size)
|
||||
return False
|
||||
|
||||
log.debug("Pulled data object '%s' into cache to %s", rel_path, self._get_cache_path(rel_path))
|
||||
|
||||
with data_obj.open('r') as data_obj_fp, open(self._get_cache_path(rel_path), "wb") as cache_fp:
|
||||
for chunk in iter(partial(data_obj_fp.read, CHUNK_SIZE), b''):
|
||||
cache_fp.write(chunk)
|
||||
return True
|
||||
|
||||
def _push_to_irods(self, rel_path, source_file=None, from_string=None):
|
||||
"""
|
||||
Push the file pointed to by ``rel_path`` to the iRODS. Extract folder name
|
||||
from rel_path as iRODS collection name, and extract file name from rel_path
|
||||
as iRODS data object name.
|
||||
If ``source_file`` is provided, push that file instead while
|
||||
still using ``rel_path`` for collection and object store names.
|
||||
If ``from_string`` is provided, set contents of the file to the value of the string.
|
||||
"""
|
||||
p = Path(rel_path)
|
||||
data_object_name = p.stem + p.suffix
|
||||
subcollection_name = p.parent
|
||||
|
||||
source_file = source_file if source_file else self._get_cache_path(rel_path)
|
||||
options = {kw.FORCE_FLAG_KW: ''}
|
||||
|
||||
if os.path.exists(source_file):
|
||||
# Check if the data object exists in iRODS
|
||||
collection_path = self.home + "/" + str(subcollection_name)
|
||||
data_object_path = collection_path + "/" + str(data_object_name)
|
||||
exists = self.session.data_objects.exists(data_object_path)
|
||||
if os.path.getsize(source_file) == 0 and exists:
|
||||
log.debug("Wanted to push file '%s' to iRODS collection '%s' but its size is 0; skipping.", source_file, rel_path)
|
||||
return True
|
||||
if from_string:
|
||||
data_obj = self.session.data_objects.create(data_object_path, self.resource, **options)
|
||||
with data_obj.open('w') as data_obj_fp:
|
||||
data_obj_fp.write(from_string)
|
||||
log.debug("Pushed data from string '%s' to collection '%s'", from_string, data_object_path)
|
||||
else:
|
||||
start_time = datetime.now()
|
||||
log.debug("Pushing cache file '%s' of size %s bytes to collection '%s'", source_file, os.path.getsize(source_file), rel_path)
|
||||
|
||||
# Create sub-collection first
|
||||
self.session.collections.create(collection_path, recurse=True)
|
||||
data_obj = self.session.data_objects.create(data_object_path, self.resource, **options)
|
||||
|
||||
# Write to file in subcollection created above
|
||||
with open(source_file, 'rb') as content_file, data_obj.open('w') as data_obj_fp:
|
||||
for chunk in iter(partial(content_file.read, CHUNK_SIZE), b''):
|
||||
data_obj_fp.write(chunk)
|
||||
|
||||
end_time = datetime.now()
|
||||
log.debug("Pushed cache file '%s' to collection '%s' (%s bytes transfered in %s sec)",
|
||||
source_file, rel_path, os.path.getsize(source_file), end_time - start_time)
|
||||
return True
|
||||
else:
|
||||
log.error("Tried updating key '%s' from source file '%s', but source file does not exist.",
|
||||
rel_path, source_file)
|
||||
return False
|
||||
|
||||
def file_ready(self, obj, **kwargs):
|
||||
"""
|
||||
A helper method that checks if a file corresponding to a dataset is
|
||||
ready and available to be used. Return ``True`` if so, ``False`` otherwise.
|
||||
"""
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
# Make sure the size in cache is available in its entirety
|
||||
if self._in_cache(rel_path):
|
||||
if os.path.getsize(self._get_cache_path(rel_path)) == self._get_size_in_irods(rel_path):
|
||||
return True
|
||||
log.debug("Waiting for dataset %s to transfer from OS: %s/%s", rel_path,
|
||||
os.path.getsize(self._get_cache_path(rel_path)), self._get_size_in_irods(rel_path))
|
||||
return False
|
||||
|
||||
def _exists(self, obj, **kwargs):
|
||||
in_cache = in_irods = False
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
|
||||
# Check cache
|
||||
if self._in_cache(rel_path):
|
||||
in_cache = True
|
||||
# Check iRODS
|
||||
in_irods = self._data_object_exists(rel_path)
|
||||
|
||||
# dir_only does not get synced so shortcut the decision
|
||||
dir_only = kwargs.get('dir_only', False)
|
||||
base_dir = kwargs.get('base_dir', None)
|
||||
if dir_only:
|
||||
if in_cache or in_irods:
|
||||
return True
|
||||
# for JOB_WORK directory
|
||||
elif base_dir:
|
||||
if not os.path.exists(rel_path):
|
||||
os.makedirs(rel_path)
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
if in_cache and not in_irods:
|
||||
return True
|
||||
elif in_irods:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def _create(self, obj, **kwargs):
|
||||
if not self._exists(obj, **kwargs):
|
||||
# Pull out locally used fields
|
||||
extra_dir = kwargs.get('extra_dir', None)
|
||||
extra_dir_at_root = kwargs.get('extra_dir_at_root', False)
|
||||
dir_only = kwargs.get('dir_only', False)
|
||||
alt_name = kwargs.get('alt_name', None)
|
||||
|
||||
# Construct hashed path
|
||||
rel_path = os.path.join(*directory_hash_id(obj.id))
|
||||
|
||||
# Optionally append extra_dir
|
||||
if extra_dir is not None:
|
||||
if extra_dir_at_root:
|
||||
rel_path = os.path.join(extra_dir, rel_path)
|
||||
else:
|
||||
rel_path = os.path.join(rel_path, extra_dir)
|
||||
|
||||
# Create given directory in cache
|
||||
cache_dir = os.path.join(self.staging_path, rel_path)
|
||||
if not os.path.exists(cache_dir):
|
||||
os.makedirs(cache_dir)
|
||||
|
||||
if not dir_only:
|
||||
rel_path = os.path.join(rel_path, alt_name if alt_name else "dataset_%s.dat" % obj.id)
|
||||
open(os.path.join(self.staging_path, rel_path), 'w').close()
|
||||
self._push_to_irods(rel_path, from_string='')
|
||||
|
||||
def _empty(self, obj, **kwargs):
|
||||
if self._exists(obj, **kwargs):
|
||||
return bool(self._size(obj, **kwargs) > 0)
|
||||
else:
|
||||
raise ObjectNotFound('objectstore.empty, object does not exist: %s, kwargs: %s'
|
||||
% (str(obj), str(kwargs)))
|
||||
|
||||
def _size(self, obj, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
if self._in_cache(rel_path):
|
||||
try:
|
||||
return os.path.getsize(self._get_cache_path(rel_path))
|
||||
except OSError as ex:
|
||||
log.info("Could not get size of file '%s' in local cache, will try S3. Error: %s", rel_path, ex)
|
||||
elif self._exists(obj, **kwargs):
|
||||
return self._get_size_in_irods(rel_path)
|
||||
log.warning("Did not find dataset '%s', returning 0 for size", rel_path)
|
||||
return 0
|
||||
|
||||
def _delete(self, obj, entire_dir=False, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
extra_dir = kwargs.get('extra_dir', None)
|
||||
base_dir = kwargs.get('base_dir', None)
|
||||
dir_only = kwargs.get('dir_only', False)
|
||||
obj_dir = kwargs.get('obj_dir', False)
|
||||
try:
|
||||
# Remove temparory data in JOB_WORK directory
|
||||
if base_dir and dir_only and obj_dir:
|
||||
shutil.rmtree(os.path.abspath(rel_path))
|
||||
return True
|
||||
|
||||
# For the case of extra_files, because we don't have a reference to
|
||||
# individual files we need to remove the entire directory structure
|
||||
# with all the files in it. This is easy for the local file system,
|
||||
# but requires iterating through each individual key in irods and deleing it.
|
||||
if entire_dir and extra_dir:
|
||||
shutil.rmtree(self._get_cache_path(rel_path))
|
||||
|
||||
col_path = self.home + "/" + str(rel_path)
|
||||
col = None
|
||||
try:
|
||||
col = self.session.collections.get(col_path)
|
||||
except CollectionDoesNotExist:
|
||||
log.warn("Collection (%s) does not exist!", col_path)
|
||||
return False
|
||||
|
||||
cols = col.walk()
|
||||
# Traverse the tree only one level deep
|
||||
for _ in range(2):
|
||||
# get next result
|
||||
_, _, data_objects = next(cols)
|
||||
|
||||
# Delete data objects
|
||||
for data_object in data_objects:
|
||||
data_object.unlink(force=True)
|
||||
|
||||
return True
|
||||
|
||||
else:
|
||||
# Delete from cache first
|
||||
os.unlink(self._get_cache_path(rel_path))
|
||||
# Delete from irods as well
|
||||
p = Path(rel_path)
|
||||
data_object_name = p.stem + p.suffix
|
||||
subcollection_name = p.parent
|
||||
|
||||
collection_path = self.home + "/" + str(subcollection_name)
|
||||
data_object_path = collection_path + "/" + str(data_object_name)
|
||||
|
||||
try:
|
||||
data_obj = self.session.data_objects.get(data_object_path)
|
||||
# remove object
|
||||
data_obj.unlink(force=True)
|
||||
return True
|
||||
except (DataObjectDoesNotExist, CollectionDoesNotExist):
|
||||
log.info("Collection or data object (%s) does not exist", data_object_path)
|
||||
return True
|
||||
|
||||
except OSError:
|
||||
log.exception('%s delete error', self._get_filename(obj, **kwargs))
|
||||
return False
|
||||
|
||||
def _get_data(self, obj, start=0, count=-1, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
# Check cache first and get file if not there
|
||||
if not self._in_cache(rel_path):
|
||||
self._pull_into_cache(rel_path)
|
||||
# Read the file content from cache
|
||||
data_file = open(self._get_cache_path(rel_path), 'r')
|
||||
data_file.seek(start)
|
||||
content = data_file.read(count)
|
||||
data_file.close()
|
||||
return content
|
||||
|
||||
def _get_filename(self, obj, **kwargs):
|
||||
base_dir = kwargs.get('base_dir', None)
|
||||
dir_only = kwargs.get('dir_only', False)
|
||||
obj_dir = kwargs.get('obj_dir', False)
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
|
||||
# for JOB_WORK directory
|
||||
if base_dir and dir_only and obj_dir:
|
||||
return os.path.abspath(rel_path)
|
||||
|
||||
cache_path = self._get_cache_path(rel_path)
|
||||
# iRODS does not recognize directories as files so cannot check if those exist.
|
||||
# So, if checking dir only, ensure given dir exists in cache and return
|
||||
# the expected cache path.
|
||||
# dir_only = kwargs.get('dir_only', False)
|
||||
# if dir_only:
|
||||
# if not os.path.exists(cache_path):
|
||||
# os.makedirs(cache_path)
|
||||
# return cache_path
|
||||
# Check if the file exists in the cache first
|
||||
if self._in_cache(rel_path):
|
||||
return cache_path
|
||||
# Check if the file exists in persistent storage and, if it does, pull it into cache
|
||||
elif self._exists(obj, **kwargs):
|
||||
if dir_only: # Directories do not get pulled into cache
|
||||
return cache_path
|
||||
else:
|
||||
if self._pull_into_cache(rel_path):
|
||||
return cache_path
|
||||
# For the case of retrieving a directory only, return the expected path
|
||||
# even if it does not exist.
|
||||
# if dir_only:
|
||||
# return cache_path
|
||||
raise ObjectNotFound('objectstore.get_filename, no cache_path: %s, kwargs: %s'
|
||||
% (str(obj), str(kwargs)))
|
||||
# return cache_path # Until the upload tool does not explicitly create the dataset, return expected path
|
||||
|
||||
def _update_from_file(self, obj, file_name=None, create=False, **kwargs):
|
||||
if create:
|
||||
self._create(obj, **kwargs)
|
||||
if self._exists(obj, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
# Chose whether to use the dataset file itself or an alternate file
|
||||
if file_name:
|
||||
source_file = os.path.abspath(file_name)
|
||||
# Copy into cache
|
||||
cache_file = self._get_cache_path(rel_path)
|
||||
try:
|
||||
if source_file != cache_file:
|
||||
# FIXME? Should this be a `move`?
|
||||
shutil.copy2(source_file, cache_file)
|
||||
self._fix_permissions(cache_file)
|
||||
except OSError:
|
||||
log.exception("Trouble copying source file '%s' to cache '%s'", source_file, cache_file)
|
||||
else:
|
||||
source_file = self._get_cache_path(rel_path)
|
||||
# Update the file on iRODS
|
||||
self._push_to_irods(rel_path, source_file)
|
||||
else:
|
||||
raise ObjectNotFound('objectstore.update_from_file, object does not exist: %s, kwargs: %s'
|
||||
% (str(obj), str(kwargs)))
|
||||
|
||||
# Unlike S3, url is not really applicable to iRODS
|
||||
def _get_object_url(self, obj, **kwargs):
|
||||
if self._exists(obj, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
|
||||
p = Path(rel_path)
|
||||
data_object_name = p.stem + p.suffix
|
||||
subcollection_name = p.parent
|
||||
|
||||
collection_path = self.home + "/" + str(subcollection_name)
|
||||
data_object_path = collection_path + "/" + str(data_object_name)
|
||||
|
||||
return data_object_path
|
||||
|
||||
def _get_store_usage_percent(self):
|
||||
return 0.0
|
||||
@@ -221,7 +221,7 @@ class PithosObjectStore(ConcreteObjectStore):
|
||||
|
||||
# No need to overwrite "shutdown"
|
||||
|
||||
def exists(self, obj, **kwargs):
|
||||
def _exists(self, obj, **kwargs):
|
||||
"""Check if file exists, fix if file in cache and not on Pithos+
|
||||
:returns: weather the file exists remotely or in cache
|
||||
"""
|
||||
@@ -253,9 +253,9 @@ class PithosObjectStore(ConcreteObjectStore):
|
||||
return True
|
||||
return False
|
||||
|
||||
def create(self, obj, **kwargs):
|
||||
def _create(self, obj, **kwargs):
|
||||
"""Touch a file (aka create empty), if it doesn't exist"""
|
||||
if not self.exists(obj, **kwargs):
|
||||
if not self._exists(obj, **kwargs):
|
||||
# Pull out locally used fields
|
||||
extra_dir = kwargs.get('extra_dir', None)
|
||||
extra_dir_at_root = kwargs.get('extra_dir_at_root', False)
|
||||
@@ -288,18 +288,18 @@ class PithosObjectStore(ConcreteObjectStore):
|
||||
open(new_file, 'w').close()
|
||||
self.pithos.upload_from_string(rel_path, '')
|
||||
|
||||
def empty(self, obj, **kwargs):
|
||||
def _empty(self, obj, **kwargs):
|
||||
"""
|
||||
:returns: weather the object has content
|
||||
:raises ObjectNotFound:
|
||||
"""
|
||||
if not self.exists(obj, **kwargs):
|
||||
if not self._exists(obj, **kwargs):
|
||||
raise ObjectNotFound(
|
||||
'objectstore.empty, object does not exist: {obj}, '
|
||||
'kwargs: {kwargs}'.format(obj=obj, kwargs=kwargs))
|
||||
return bool(self.size(obj, **kwargs))
|
||||
return bool(self._size(obj, **kwargs))
|
||||
|
||||
def size(self, obj, **kwargs):
|
||||
def _size(self, obj, **kwargs):
|
||||
"""
|
||||
:returns: The size of the object, or 0 if it doesn't exist (sorry for
|
||||
that, not our fault, the ObjectStore interface is like that some
|
||||
@@ -321,7 +321,7 @@ class PithosObjectStore(ConcreteObjectStore):
|
||||
return 0
|
||||
return int(file['content-length'])
|
||||
|
||||
def delete(self, obj, **kwargs):
|
||||
def _delete(self, obj, **kwargs):
|
||||
"""Delete the object
|
||||
:returns: weather the object was deleted
|
||||
"""
|
||||
@@ -347,13 +347,13 @@ class PithosObjectStore(ConcreteObjectStore):
|
||||
self.pithos.del_object(path)
|
||||
except OSError:
|
||||
log.exception(
|
||||
'{0} delete error'.format(self.get_filename(obj, **kwargs)))
|
||||
'{0} delete error'.format(self._get_filename(obj, **kwargs)))
|
||||
except ClientError as ce:
|
||||
log.exception('Could not delete {path} from Pithos, {err}'.format(
|
||||
path=path, err=ce))
|
||||
return False
|
||||
|
||||
def get_data(self, obj, start=0, count=-1, **kwargs):
|
||||
def _get_data(self, obj, start=0, count=-1, **kwargs):
|
||||
"""Fetch (e.g., download) data
|
||||
:param start: Chunk of data starts here
|
||||
:param count: Fetch at most as many data, fetch all if negative
|
||||
@@ -369,7 +369,7 @@ class PithosObjectStore(ConcreteObjectStore):
|
||||
data_file.close()
|
||||
return content
|
||||
|
||||
def get_filename(self, obj, **kwargs):
|
||||
def _get_filename(self, obj, **kwargs):
|
||||
"""Get the expected filename with absolute path"""
|
||||
base_dir = kwargs.get('base_dir', None)
|
||||
dir_only = kwargs.get('dir_only', False)
|
||||
@@ -386,7 +386,7 @@ class PithosObjectStore(ConcreteObjectStore):
|
||||
return cache_path
|
||||
if self._in_cache(path):
|
||||
return cache_path
|
||||
elif self.exists(obj, **kwargs):
|
||||
elif self._exists(obj, **kwargs):
|
||||
if not dir_only:
|
||||
self._pull_into_cache(path)
|
||||
return cache_path
|
||||
@@ -394,11 +394,11 @@ class PithosObjectStore(ConcreteObjectStore):
|
||||
'objectstore.get_filename, no cache_path: {obj}, '
|
||||
'kwargs: {kwargs}'.format(obj, kwargs))
|
||||
|
||||
def update_from_file(self, obj, **kwargs):
|
||||
def _update_from_file(self, obj, **kwargs):
|
||||
"""Update the store when a file is updated"""
|
||||
if kwargs.get('create'):
|
||||
self.create(obj, **kwargs)
|
||||
if not self.exists(obj, **kwargs):
|
||||
self._create(obj, **kwargs)
|
||||
if not self._exists(obj, **kwargs):
|
||||
raise ObjectNotFound(
|
||||
'objectstore.update_from_file, object does not exist: {obj}, '
|
||||
'kwargs: {kwargs}'.format(obj, kwargs))
|
||||
@@ -420,11 +420,11 @@ class PithosObjectStore(ConcreteObjectStore):
|
||||
with open(cache_path) as f:
|
||||
self.pithos.upload_object(obj, f)
|
||||
|
||||
def get_object_url(self, obj, **kwargs):
|
||||
def _get_object_url(self, obj, **kwargs):
|
||||
"""
|
||||
:returns: URL for direct access, None if no object
|
||||
"""
|
||||
if self.exists(obj, **kwargs):
|
||||
if self._exists(obj, **kwargs):
|
||||
path = self._construct_path(obj, **kwargs)
|
||||
try:
|
||||
return self.pithos.publish_object(path)
|
||||
@@ -434,7 +434,7 @@ class PithosObjectStore(ConcreteObjectStore):
|
||||
log.exception('Kamaki: {0}'.format(ce))
|
||||
return None
|
||||
|
||||
def get_store_usage_percent(self):
|
||||
def _get_store_usage_percent(self):
|
||||
"""
|
||||
:returns: percentage indicating how full the store is
|
||||
"""
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from __future__ import absolute_import # Need to import pulsar_client absolutely.
|
||||
|
||||
from ..objectstore import ObjectStore
|
||||
from ..objectstore import BaseObjectStore
|
||||
|
||||
try:
|
||||
from pulsar.client.manager import ObjectStoreClientManager
|
||||
@@ -8,7 +8,7 @@ except ImportError:
|
||||
ObjectStoreClientManager = None
|
||||
|
||||
|
||||
class PulsarObjectStore(ObjectStore):
|
||||
class PulsarObjectStore(BaseObjectStore):
|
||||
"""
|
||||
Object store implementation that delegates to a remote Pulsar server.
|
||||
|
||||
@@ -26,38 +26,38 @@ class PulsarObjectStore(ObjectStore):
|
||||
def __init__(self, config, config_xml):
|
||||
self.pulsar_client = self.__build_pulsar_client(config_xml)
|
||||
|
||||
def exists(self, obj, **kwds):
|
||||
def _exists(self, obj, **kwds):
|
||||
return self.pulsar_client.exists(**self.__build_kwds(obj, **kwds))
|
||||
|
||||
def file_ready(self, obj, **kwds):
|
||||
return self.pulsar_client.file_ready(**self.__build_kwds(obj, **kwds))
|
||||
|
||||
def create(self, obj, **kwds):
|
||||
def _create(self, obj, **kwds):
|
||||
return self.pulsar_client.create(**self.__build_kwds(obj, **kwds))
|
||||
|
||||
def empty(self, obj, **kwds):
|
||||
def _empty(self, obj, **kwds):
|
||||
return self.pulsar_client.empty(**self.__build_kwds(obj, **kwds))
|
||||
|
||||
def size(self, obj, **kwds):
|
||||
def _size(self, obj, **kwds):
|
||||
return self.pulsar_client.size(**self.__build_kwds(obj, **kwds))
|
||||
|
||||
def delete(self, obj, **kwds):
|
||||
def _delete(self, obj, **kwds):
|
||||
return self.pulsar_client.delete(**self.__build_kwds(obj, **kwds))
|
||||
|
||||
# TODO: Optimize get_data.
|
||||
def get_data(self, obj, **kwds):
|
||||
def _get_data(self, obj, **kwds):
|
||||
return self.pulsar_client.get_data(**self.__build_kwds(obj, **kwds))
|
||||
|
||||
def get_filename(self, obj, **kwds):
|
||||
def _get_filename(self, obj, **kwds):
|
||||
return self.pulsar_client.get_filename(**self.__build_kwds(obj, **kwds))
|
||||
|
||||
def update_from_file(self, obj, **kwds):
|
||||
def _update_from_file(self, obj, **kwds):
|
||||
return self.pulsar_client.update_from_file(**self.__build_kwds(obj, **kwds))
|
||||
|
||||
def get_store_usage_percent(self):
|
||||
def _get_store_usage_percent(self):
|
||||
return self.pulsar_client.get_store_usage_percent()
|
||||
|
||||
def get_object_url(self, obj, extra_dir=None, extra_dir_at_root=False, alt_name=None):
|
||||
def _get_object_url(self, obj, extra_dir=None, extra_dir_at_root=False, alt_name=None):
|
||||
return None
|
||||
|
||||
def __build_kwds(self, obj, **kwds):
|
||||
|
||||
@@ -1,355 +0,0 @@
|
||||
"""
|
||||
Object Store plugin for the Integrated Rule-Oriented Data Store (iRODS)
|
||||
|
||||
The module is named rods to avoid conflicting with the PyRods module, irods
|
||||
"""
|
||||
|
||||
import logging
|
||||
import os
|
||||
import time
|
||||
from posixpath import (
|
||||
basename as path_basename,
|
||||
dirname as path_dirname,
|
||||
join as path_join
|
||||
)
|
||||
|
||||
try:
|
||||
import irods
|
||||
except ImportError:
|
||||
irods = None
|
||||
|
||||
from galaxy.exceptions import (
|
||||
ObjectInvalid,
|
||||
ObjectNotFound
|
||||
)
|
||||
from galaxy.util.path import safe_relpath
|
||||
from ..objectstore import (
|
||||
DiskObjectStore,
|
||||
local_extra_dirs
|
||||
)
|
||||
|
||||
IRODS_IMPORT_MESSAGE = ('The Python irods package is required to use this '
|
||||
'feature, please install it')
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class IRODSObjectStore(DiskObjectStore):
|
||||
"""
|
||||
Galaxy object store based on iRODS
|
||||
"""
|
||||
|
||||
def __init__(self, config, file_path=None, extra_dirs=None):
|
||||
super(IRODSObjectStore, self).__init__(config, file_path=file_path, extra_dirs=extra_dirs)
|
||||
assert irods is not None, IRODS_IMPORT_MESSAGE
|
||||
self.cache_path = config.object_store_cache_path
|
||||
self.default_resource = config.irods_default_resource or None
|
||||
|
||||
# Connect to iRODS (AssertionErrors will be raised if anything goes wrong)
|
||||
self.rods_env, self.rods_conn = rods_connect()
|
||||
|
||||
# if the root collection path in the config is unset or relative, try to use a sensible default
|
||||
if config.irods_root_collection_path is None or (config.irods_root_collection_path is not None and not config.irods_root_collection_path.startswith('/')):
|
||||
rods_home = self.rods_env.rodsHome
|
||||
assert rods_home != '', "Unable to initialize iRODS Object Store: rodsHome cannot be determined and irods_root_collection_path in Galaxy config is unset or not absolute."
|
||||
if config.irods_root_collection_path is None:
|
||||
self.root_collection_path = path_join(rods_home, 'galaxy_data')
|
||||
else:
|
||||
self.root_collection_path = path_join(rods_home, config.irods_root_collection_path)
|
||||
else:
|
||||
self.root_collection_path = config.irods_root_collection_path
|
||||
|
||||
# will return a collection object regardless of whether it exists
|
||||
self.root_collection = irods.irodsCollection(self.rods_conn, self.root_collection_path)
|
||||
|
||||
if self.root_collection.getId() == -1:
|
||||
log.warning("iRODS root collection does not exist, will attempt to create: %s", self.root_collection_path)
|
||||
self.root_collection.upCollection()
|
||||
assert self.root_collection.createCollection(os.path.basename(self.root_collection_path)) == 0, "iRODS root collection creation failed: %s" % self.root_collection_path
|
||||
self.root_collection = irods.irodsCollection(self.rods_conn, self.root_collection_path)
|
||||
assert self.root_collection.getId() != -1, "iRODS root collection creation claimed success but still does not exist"
|
||||
|
||||
if self.default_resource is None:
|
||||
self.default_resource = self.rods_env.rodsDefResource
|
||||
|
||||
log.info("iRODS data for this instance will be stored in collection: %s, resource: %s", self.root_collection_path, self.default_resource)
|
||||
|
||||
def __get_rods_path(self, obj, base_dir=None, dir_only=False, extra_dir=None, extra_dir_at_root=False, alt_name=None, strip_dat=True, **kwargs):
|
||||
# extra_dir should never be constructed from provided data but just
|
||||
# make sure there are no shenannigans afoot
|
||||
if extra_dir and extra_dir != os.path.normpath(extra_dir):
|
||||
log.warning('extra_dir is not normalized: %s', extra_dir)
|
||||
raise ObjectInvalid("The requested object is invalid")
|
||||
# ensure that any parent directory references in alt_name would not
|
||||
# result in a path not contained in the directory path constructed here
|
||||
if alt_name:
|
||||
if not safe_relpath(alt_name):
|
||||
log.warning('alt_name would locate path outside dir: %s', alt_name)
|
||||
raise ObjectInvalid("The requested object is invalid")
|
||||
# alt_name can contain parent directory references, but iRODS will
|
||||
# not follow them, so if they are valid we normalize them out
|
||||
alt_name = os.path.normpath(alt_name)
|
||||
path = ""
|
||||
if extra_dir is not None:
|
||||
path = extra_dir
|
||||
|
||||
# extra_dir_at_root is ignored - since the iRODS plugin does not use
|
||||
# the directory hash, there is only one level of subdirectory.
|
||||
|
||||
if not dir_only:
|
||||
# the .dat extension is stripped when stored in iRODS
|
||||
# TODO: is the strip_dat kwarg the best way to implement this?
|
||||
if strip_dat and alt_name and alt_name.endswith('.dat'):
|
||||
alt_name = os.path.splitext(alt_name)[0]
|
||||
default_name = 'dataset_%s' % obj.id
|
||||
if not strip_dat:
|
||||
default_name += '.dat'
|
||||
path = path_join(path, alt_name if alt_name else default_name)
|
||||
|
||||
path = path_join(self.root_collection_path, path)
|
||||
return path
|
||||
|
||||
def __get_cache_path(self, obj, **kwargs):
|
||||
# FIXME: does not handle collections
|
||||
# FIXME: collisions could occur here
|
||||
return os.path.join(self.cache_path, path_basename(self.__get_rods_path(obj, strip_dat=False, **kwargs)))
|
||||
|
||||
def __clean_cache_entry(self, obj, **kwargs):
|
||||
# FIXME: does not handle collections
|
||||
try:
|
||||
os.unlink(self.__get_cache_path(obj, **kwargs))
|
||||
except OSError:
|
||||
# it is expected that we'll call this method a lot regardless of
|
||||
# whether we think the cached file exists
|
||||
pass
|
||||
|
||||
def __get_rods_handle(self, obj, mode='r', **kwargs):
|
||||
if kwargs.get('dir_only', False):
|
||||
return irods.irodsCollection(self.rods_conn, self.__get_rods_path(obj, **kwargs))
|
||||
else:
|
||||
return irods.irodsOpen(self.rods_conn, self.__get_rods_path(obj, **kwargs), mode)
|
||||
|
||||
def __mkcolls(self, rods_path):
|
||||
"""
|
||||
An os.makedirs() for iRODS collections. `rods_path` is the desired collection to create.
|
||||
"""
|
||||
assert rods_path.startswith(self.root_collection_path + '/'), '__mkcolls(): Creating collections outside the root collection is not allowed (requested path was: %s)' % rods_path
|
||||
mkcolls = []
|
||||
c = irods.irodsCollection(self.rods_conn, rods_path)
|
||||
while c.getId() == -1:
|
||||
assert c.getCollName().startswith(self.root_collection_path + '/'), '__mkcolls(): Attempted to move above the root collection: %s' % c.getCollName()
|
||||
mkcolls.append(c.getCollName())
|
||||
c.upCollection()
|
||||
for collname in reversed(mkcolls):
|
||||
log.debug('Creating collection %s' % collname)
|
||||
ci = irods.collInp_t()
|
||||
ci.collName = collname
|
||||
status = irods.rcCollCreate(self.rods_conn, ci)
|
||||
assert status == 0, '__mkcolls(): Failed to create collection: %s' % collname
|
||||
|
||||
@local_extra_dirs
|
||||
def exists(self, obj, **kwargs):
|
||||
doi = irods.dataObjInp_t()
|
||||
doi.objPath = self.__get_rods_path(obj, **kwargs)
|
||||
log.debug('exists(): checking: %s', doi.objPath)
|
||||
return irods.rcObjStat(self.rods_conn, doi) is not None
|
||||
|
||||
@local_extra_dirs
|
||||
def create(self, obj, **kwargs):
|
||||
if not self.exists(obj, **kwargs):
|
||||
rods_path = self.__get_rods_path(obj, **kwargs)
|
||||
log.debug('create(): %s', rods_path)
|
||||
dir_only = kwargs.get('dir_only', False)
|
||||
# short circuit collection creation since most of the time it will
|
||||
# be the root collection which already exists
|
||||
collection_path = rods_path if dir_only else path_dirname(rods_path)
|
||||
if collection_path != self.root_collection_path:
|
||||
self.__mkcolls(collection_path)
|
||||
if not dir_only:
|
||||
# rcDataObjCreate is used instead of the irodsOpen wrapper so
|
||||
# that we can prevent overwriting
|
||||
doi = irods.dataObjInp_t()
|
||||
doi.objPath = rods_path
|
||||
doi.createMode = 0o640
|
||||
doi.dataSize = 0 # 0 actually means "unknown", although literally 0 would be preferable
|
||||
irods.addKeyVal(doi.condInput, irods.DEST_RESC_NAME_KW, self.default_resource)
|
||||
status = irods.rcDataObjCreate(self.rods_conn, doi)
|
||||
assert status >= 0, 'create(): rcDataObjCreate() failed: %s: %s: %s' % (rods_path, status, irods.strerror(status))
|
||||
|
||||
@local_extra_dirs
|
||||
def empty(self, obj, **kwargs):
|
||||
assert 'dir_only' not in kwargs, 'empty(): `dir_only` parameter is invalid here'
|
||||
h = self.__get_rods_handle(obj, **kwargs)
|
||||
try:
|
||||
return h.getSize() == 0
|
||||
except AttributeError:
|
||||
# h is None
|
||||
raise ObjectNotFound()
|
||||
|
||||
def size(self, obj, **kwargs):
|
||||
assert 'dir_only' not in kwargs, 'size(): `dir_only` parameter is invalid here'
|
||||
h = self.__get_rods_handle(obj, **kwargs)
|
||||
try:
|
||||
return h.getSize()
|
||||
except AttributeError:
|
||||
# h is None
|
||||
return 0
|
||||
|
||||
@local_extra_dirs
|
||||
def delete(self, obj, entire_dir=False, **kwargs):
|
||||
assert 'dir_only' not in kwargs, 'delete(): `dir_only` parameter is invalid here'
|
||||
rods_path = self.__get_rods_path(obj, **kwargs)
|
||||
# __get_rods_path prepends self.root_collection_path but we are going
|
||||
# to ensure that it's valid anyway for safety's sake
|
||||
assert rods_path.startswith(self.root_collection_path + '/'), 'ERROR: attempt to delete object outside root collection (path was: %s)' % rods_path
|
||||
if entire_dir:
|
||||
# TODO
|
||||
raise NotImplementedError()
|
||||
h = self.__get_rods_handle(obj, **kwargs)
|
||||
try:
|
||||
# note: PyRods' irodsFile.delete() does not set force
|
||||
status = h.delete()
|
||||
assert status == 0, '%d: %s' % (status, irods.strerror(status))
|
||||
return True
|
||||
except AttributeError:
|
||||
log.warning('delete(): operation failed: object does not exist: %s', rods_path)
|
||||
except AssertionError as e:
|
||||
# delete() does not raise on deletion failure
|
||||
log.error('delete(): operation failed: %s', e)
|
||||
finally:
|
||||
# remove the cached entry (finally is executed even when the try
|
||||
# contains a return)
|
||||
self.__clean_cache_entry(self, obj, **kwargs)
|
||||
return False
|
||||
|
||||
@local_extra_dirs
|
||||
def get_data(self, obj, start=0, count=-1, **kwargs):
|
||||
log.debug('get_data(): %s')
|
||||
h = self.__get_rods_handle(obj, **kwargs)
|
||||
try:
|
||||
h.seek(start)
|
||||
except AttributeError:
|
||||
raise ObjectNotFound()
|
||||
if count == -1:
|
||||
return h.read()
|
||||
else:
|
||||
return h.read(count)
|
||||
# TODO: make sure implicit close is okay, DiskObjectStore actually
|
||||
# reads data into a var, closes, and returns the var
|
||||
|
||||
@local_extra_dirs
|
||||
def get_filename(self, obj, **kwargs):
|
||||
log.debug("get_filename(): called on %s %s. For better performance, avoid this method and use get_data() instead.", obj.__class__.__name__, obj.id)
|
||||
cached_path = self.__get_cache_path(obj, **kwargs)
|
||||
|
||||
if not self.exists(obj, **kwargs):
|
||||
raise ObjectNotFound()
|
||||
|
||||
# TODO: implement or define whether dir_only is valid
|
||||
if 'dir_only' in kwargs:
|
||||
raise NotImplementedError()
|
||||
|
||||
# cache hit
|
||||
if os.path.exists(cached_path):
|
||||
return os.path.abspath(cached_path)
|
||||
|
||||
# cache miss
|
||||
# TODO: thread this
|
||||
incoming_path = os.path.join(os.path.dirname(cached_path), "__incoming_%s" % os.path.basename(cached_path))
|
||||
doi = irods.dataObjInp_t()
|
||||
doi.objPath = self.__get_rods_path(obj, **kwargs)
|
||||
doi.dataSize = 0 # TODO: does this affect performance? should we get size?
|
||||
doi.numThreads = 0
|
||||
# TODO: might want to VERIFY_CHKSUM_KW
|
||||
log.debug('get_filename(): caching %s to %s', doi.objPath, incoming_path)
|
||||
|
||||
# do the iget
|
||||
status = irods.rcDataObjGet(self.rods_conn, doi, incoming_path)
|
||||
|
||||
# if incoming already exists, we'll wait for another process or thread
|
||||
# to finish caching
|
||||
if status != irods.OVERWRITE_WITHOUT_FORCE_FLAG:
|
||||
assert status == 0, 'get_filename(): iget %s failed (%s): %s' % (doi.objPath, status, irods.strerror(status))
|
||||
# POSIX rename is atomic
|
||||
# TODO: rename without clobbering
|
||||
os.rename(incoming_path, cached_path)
|
||||
log.debug('get_filename(): cached %s to %s', doi.objPath, cached_path)
|
||||
|
||||
# another process or thread is caching, wait for it
|
||||
while not os.path.exists(cached_path):
|
||||
# TODO: force restart after mod time > some configurable, or
|
||||
# otherwise deal with this potential deadlock and interrupted
|
||||
# transfers
|
||||
time.sleep(5)
|
||||
log.debug("get_filename(): waiting on incoming '%s' for %s %s", incoming_path, obj.__class__.__name__, obj.id)
|
||||
|
||||
return os.path.abspath(cached_path)
|
||||
|
||||
@local_extra_dirs
|
||||
def update_from_file(self, obj, file_name=None, create=False, **kwargs):
|
||||
assert 'dir_only' not in kwargs, 'update_from_file(): `dir_only` parameter is invalid here'
|
||||
|
||||
# do not create if not requested
|
||||
if create and not self.exists(obj, **kwargs):
|
||||
raise ObjectNotFound()
|
||||
|
||||
if file_name is None:
|
||||
file_name = self.__get_cache_path(obj, **kwargs)
|
||||
|
||||
# put will create if necessary
|
||||
doi = irods.dataObjInp_t()
|
||||
doi.objPath = self.__get_rods_path(obj, **kwargs)
|
||||
doi.createMode = 0o640
|
||||
doi.dataSize = os.stat(file_name).st_size
|
||||
doi.numThreads = 0
|
||||
irods.addKeyVal(doi.condInput, irods.DEST_RESC_NAME_KW, self.default_resource)
|
||||
irods.addKeyVal(doi.condInput, irods.FORCE_FLAG_KW, '')
|
||||
# TODO: might want to VERIFY_CHKSUM_KW
|
||||
log.debug('update_from_file(): updating %s to %s', file_name, doi.objPath)
|
||||
|
||||
# do the iput
|
||||
status = irods.rcDataObjPut(self.rods_conn, doi, file_name)
|
||||
assert status == 0, 'update_from_file(): iput %s failed (%s): %s' % (doi.objPath, status, irods.strerror(status))
|
||||
|
||||
def get_object_url(self, obj, **kwargs):
|
||||
return None
|
||||
|
||||
def get_store_usage_percent(self):
|
||||
return 0.0
|
||||
|
||||
|
||||
# monkeypatch an strerror method into the irods module
|
||||
def _rods_strerror(errno):
|
||||
"""
|
||||
The missing `strerror` for iRODS error codes
|
||||
"""
|
||||
if not hasattr(irods, '__rods_strerror_map'):
|
||||
irods.__rods_strerror_map = {}
|
||||
for name in dir(irods):
|
||||
v = getattr(irods, name)
|
||||
if type(v) == int and v < 0:
|
||||
irods.__rods_strerror_map[v] = name
|
||||
return irods.__rods_strerror_map.get(errno, 'GALAXY_NO_ERRNO_MAPPING_FOUND')
|
||||
|
||||
|
||||
if irods is not None:
|
||||
irods.strerror = _rods_strerror
|
||||
|
||||
|
||||
def rods_connect():
|
||||
"""
|
||||
A basic iRODS connection mechanism that connects using the current iRODS
|
||||
environment
|
||||
"""
|
||||
status, env = irods.getRodsEnv()
|
||||
assert status == 0, 'connect(): getRodsEnv() failed (%s): %s' % (status, irods.strerror(status))
|
||||
conn, err = irods.rcConnect(env.rodsHost,
|
||||
env.rodsPort,
|
||||
env.rodsUserName,
|
||||
env.rodsZone)
|
||||
assert err.status == 0, 'connect(): rcConnect() failed (%s): %s' % (err.status, err.msg)
|
||||
status, pw = irods.obfGetPw()
|
||||
assert status == 0, 'connect(): getting password with obfGetPw() failed (%s): %s' % (status, irods.strerror(status))
|
||||
status = irods.clientLoginWithObfPassword(conn, pw)
|
||||
assert status == 0, 'connect(): logging in with clientLoginWithObfPassword() failed (%s): %s' % (status, irods.strerror(status))
|
||||
return env, conn
|
||||
@@ -504,7 +504,7 @@ class S3ObjectStore(ConcreteObjectStore, CloudConfigMixin):
|
||||
os.path.getsize(self._get_cache_path(rel_path)), self._get_size_in_s3(rel_path))
|
||||
return False
|
||||
|
||||
def exists(self, obj, **kwargs):
|
||||
def _exists(self, obj, **kwargs):
|
||||
in_cache = in_s3 = False
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
|
||||
@@ -537,8 +537,8 @@ class S3ObjectStore(ConcreteObjectStore, CloudConfigMixin):
|
||||
else:
|
||||
return False
|
||||
|
||||
def create(self, obj, **kwargs):
|
||||
if not self.exists(obj, **kwargs):
|
||||
def _create(self, obj, **kwargs):
|
||||
if not self._exists(obj, **kwargs):
|
||||
|
||||
# Pull out locally used fields
|
||||
extra_dir = kwargs.get('extra_dir', None)
|
||||
@@ -572,26 +572,26 @@ class S3ObjectStore(ConcreteObjectStore, CloudConfigMixin):
|
||||
open(os.path.join(self.staging_path, rel_path), 'w').close()
|
||||
self._push_to_os(rel_path, from_string='')
|
||||
|
||||
def empty(self, obj, **kwargs):
|
||||
if self.exists(obj, **kwargs):
|
||||
return bool(self.size(obj, **kwargs) > 0)
|
||||
def _empty(self, obj, **kwargs):
|
||||
if self._exists(obj, **kwargs):
|
||||
return bool(self._size(obj, **kwargs) > 0)
|
||||
else:
|
||||
raise ObjectNotFound('objectstore.empty, object does not exist: %s, kwargs: %s'
|
||||
% (str(obj), str(kwargs)))
|
||||
|
||||
def size(self, obj, **kwargs):
|
||||
def _size(self, obj, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
if self._in_cache(rel_path):
|
||||
try:
|
||||
return os.path.getsize(self._get_cache_path(rel_path))
|
||||
except OSError as ex:
|
||||
log.info("Could not get size of file '%s' in local cache, will try S3. Error: %s", rel_path, ex)
|
||||
elif self.exists(obj, **kwargs):
|
||||
elif self._exists(obj, **kwargs):
|
||||
return self._get_size_in_s3(rel_path)
|
||||
log.warning("Did not find dataset '%s', returning 0 for size", rel_path)
|
||||
return 0
|
||||
|
||||
def delete(self, obj, entire_dir=False, **kwargs):
|
||||
def _delete(self, obj, entire_dir=False, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
extra_dir = kwargs.get('extra_dir', None)
|
||||
base_dir = kwargs.get('base_dir', None)
|
||||
@@ -626,10 +626,10 @@ class S3ObjectStore(ConcreteObjectStore, CloudConfigMixin):
|
||||
except S3ResponseError:
|
||||
log.exception("Could not delete key '%s' from S3", rel_path)
|
||||
except OSError:
|
||||
log.exception('%s delete error', self.get_filename(obj, **kwargs))
|
||||
log.exception('%s delete error', self._get_filename(obj, **kwargs))
|
||||
return False
|
||||
|
||||
def get_data(self, obj, start=0, count=-1, **kwargs):
|
||||
def _get_data(self, obj, start=0, count=-1, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
# Check cache first and get file if not there
|
||||
if not self._in_cache(rel_path):
|
||||
@@ -641,7 +641,7 @@ class S3ObjectStore(ConcreteObjectStore, CloudConfigMixin):
|
||||
data_file.close()
|
||||
return content
|
||||
|
||||
def get_filename(self, obj, **kwargs):
|
||||
def _get_filename(self, obj, **kwargs):
|
||||
base_dir = kwargs.get('base_dir', None)
|
||||
dir_only = kwargs.get('dir_only', False)
|
||||
obj_dir = kwargs.get('obj_dir', False)
|
||||
@@ -664,7 +664,7 @@ class S3ObjectStore(ConcreteObjectStore, CloudConfigMixin):
|
||||
if self._in_cache(rel_path):
|
||||
return cache_path
|
||||
# Check if the file exists in persistent storage and, if it does, pull it into cache
|
||||
elif self.exists(obj, **kwargs):
|
||||
elif self._exists(obj, **kwargs):
|
||||
if dir_only: # Directories do not get pulled into cache
|
||||
return cache_path
|
||||
else:
|
||||
@@ -678,10 +678,10 @@ class S3ObjectStore(ConcreteObjectStore, CloudConfigMixin):
|
||||
% (str(obj), str(kwargs)))
|
||||
# return cache_path # Until the upload tool does not explicitly create the dataset, return expected path
|
||||
|
||||
def update_from_file(self, obj, file_name=None, create=False, **kwargs):
|
||||
def _update_from_file(self, obj, file_name=None, create=False, **kwargs):
|
||||
if create:
|
||||
self.create(obj, **kwargs)
|
||||
if self.exists(obj, **kwargs):
|
||||
self._create(obj, **kwargs)
|
||||
if self._exists(obj, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
# Chose whether to use the dataset file itself or an alternate file
|
||||
if file_name:
|
||||
@@ -703,8 +703,8 @@ class S3ObjectStore(ConcreteObjectStore, CloudConfigMixin):
|
||||
raise ObjectNotFound('objectstore.update_from_file, object does not exist: %s, kwargs: %s'
|
||||
% (str(obj), str(kwargs)))
|
||||
|
||||
def get_object_url(self, obj, **kwargs):
|
||||
if self.exists(obj, **kwargs):
|
||||
def _get_object_url(self, obj, **kwargs):
|
||||
if self._exists(obj, **kwargs):
|
||||
rel_path = self._construct_path(obj, **kwargs)
|
||||
try:
|
||||
key = Key(self._bucket, rel_path)
|
||||
@@ -713,7 +713,7 @@ class S3ObjectStore(ConcreteObjectStore, CloudConfigMixin):
|
||||
log.exception("Trouble generating URL for dataset '%s'", rel_path)
|
||||
return None
|
||||
|
||||
def get_store_usage_percent(self):
|
||||
def _get_store_usage_percent(self):
|
||||
return 0.0
|
||||
|
||||
def shutdown(self):
|
||||
|
||||
@@ -50,6 +50,10 @@ WAIT_TYPES = Bunch(
|
||||
JOB_COMPLETION=WaitType("job_completion", 30),
|
||||
# Wait time for a GIE to spawn.
|
||||
GIE_SPAWN=WaitType("gie_spawn", 30),
|
||||
# Wait time for toolshed search
|
||||
SHED_SEARCH=WaitType('shed_search', 30),
|
||||
# Wait time for repository installation
|
||||
REPO_INSTALL=WaitType('repo_install', 60),
|
||||
)
|
||||
|
||||
# Choose a moderate wait type for operations that don't specify a type.
|
||||
@@ -389,6 +393,12 @@ class NavigatesGalaxy(HasDriver):
|
||||
domain = domain or 'test.test'
|
||||
return self._get_random_name(prefix=username, suffix="@" + domain)
|
||||
|
||||
# Creates a random password of length len by creating an array with all ASCII letters and the numbers 0 to 9,
|
||||
# then using the random number generator to pick one elemenent to concatinate it to the end of the password string until
|
||||
# we have a password of length len.
|
||||
def _get_random_password(self, len=6):
|
||||
return ''.join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(len))
|
||||
|
||||
def submit_login(self, email, password=None, assert_valid=True, retries=0):
|
||||
if password is None:
|
||||
password = self.default_password
|
||||
|
||||
@@ -70,6 +70,7 @@ masthead:
|
||||
|
||||
preferences:
|
||||
selectors:
|
||||
sign_out: "#edit-preferences-sign-out"
|
||||
change_password: "#edit-preferences-password"
|
||||
manage_information: '#edit-preferences-information'
|
||||
current_email: "#user-preferences-current-email"
|
||||
@@ -88,6 +89,11 @@ change_user_address:
|
||||
type: xpath
|
||||
selector: '//span[contains(text(), "Insert Address")]'
|
||||
|
||||
sign_out:
|
||||
selectors:
|
||||
cancel_button: '.modal-footer .buttons #button-0'
|
||||
sign_out_button: '.modal-footer .buttons #button-1'
|
||||
|
||||
history_panel:
|
||||
menu:
|
||||
labels:
|
||||
@@ -353,18 +359,31 @@ tour:
|
||||
|
||||
admin:
|
||||
|
||||
toolshed:
|
||||
selectors:
|
||||
repo_search: '#toolshed-repo-search'
|
||||
search_results: '#shed-search-results'
|
||||
|
||||
index:
|
||||
selectors:
|
||||
datatypes: '#admin-link-datatypes'
|
||||
dependencies: '#admin-link-manage-dependencies'
|
||||
data_tables: '#admin-link-data-tables'
|
||||
display_applications: '#admin-link-display-applications'
|
||||
errors: '#admin-link-error-stack'
|
||||
forms: '#admin-link-forms'
|
||||
jobs: '#admin-link-jobs'
|
||||
local_data: '#admin-link-local-data'
|
||||
metadata: '#admin-link-metadata'
|
||||
migrations: '#admin-link-migrations'
|
||||
tool_versions: '#admin-link-tool-versions'
|
||||
toolshed: '#admin-link-toolshed'
|
||||
users: '#admin-link-users'
|
||||
quotas: '#admin-link-quotas'
|
||||
groups: '#admin-link-groups'
|
||||
roles: '#admin-link-roles'
|
||||
impersonate: '#admin-link-impersonate'
|
||||
whitelist: '#admin-link-whitelist'
|
||||
|
||||
selectors:
|
||||
# TODO: place betters IDS or something on this in these grids in the DOM
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import logging
|
||||
import threading
|
||||
|
||||
from galaxy.util import unicodify
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -20,8 +22,8 @@ class AsynchronousReader(threading.Thread):
|
||||
"""Read lines and put them on the queue."""
|
||||
thread_lock = threading.Lock()
|
||||
thread_lock.acquire()
|
||||
for line in iter(self._fd.readline, ''):
|
||||
stripped_line = line.rstrip()
|
||||
for line in iter(self._fd.readline, b''):
|
||||
stripped_line = unicodify(line).rstrip()
|
||||
self.lines.append(stripped_line)
|
||||
self._queue.put(stripped_line)
|
||||
thread_lock.release()
|
||||
|
||||
+21
-19
@@ -13,13 +13,16 @@ from fabric.operations import _AttributeString
|
||||
from six.moves import queue
|
||||
|
||||
from galaxy.tool_shed.galaxy_install.tool_dependencies.recipe import asynchronous_reader
|
||||
from galaxy.tool_shed.util.basic_util import INSTALLATION_LOG, NO_OUTPUT_TIMEOUT
|
||||
from galaxy.tool_shed.util.basic_util import (
|
||||
INSTALLATION_LOG,
|
||||
NO_OUTPUT_TIMEOUT,
|
||||
)
|
||||
from galaxy.tool_shed.util.tool_dependency_util import set_tool_dependency_attributes
|
||||
from galaxy.util import (
|
||||
DATABASE_MAX_STRING_SIZE,
|
||||
DATABASE_MAX_STRING_SIZE_PRETTY,
|
||||
shrink_string_by_size,
|
||||
unicodify
|
||||
unicodify,
|
||||
)
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@@ -78,13 +81,13 @@ class InstallEnvironment(object):
|
||||
"""
|
||||
stdout_logger = logging.getLogger('install_environment.STDOUT')
|
||||
stderr_logger = logging.getLogger('install_environment.STDERR')
|
||||
for line in iter(stdout.readline, ''):
|
||||
output = line.rstrip()
|
||||
for line in iter(stdout.readline, b''):
|
||||
output = unicodify(line).rstrip()
|
||||
stdout_logger.debug(output)
|
||||
stdout_queue.put(output)
|
||||
stdout_queue.put(None)
|
||||
for line in iter(stderr.readline, ''):
|
||||
output = line.rstrip()
|
||||
for line in iter(stderr.readline, b''):
|
||||
output = unicodify(line).rstrip()
|
||||
stderr_logger.debug(output)
|
||||
stderr_queue.put(output)
|
||||
stderr_queue.put(None)
|
||||
@@ -245,19 +248,18 @@ class InstallEnvironment(object):
|
||||
|
||||
def log_results(self, command, fabric_AttributeString, file_path):
|
||||
"""Write attributes of fabric.operations._AttributeString to a specified log file."""
|
||||
if os.path.exists(file_path):
|
||||
logfile = open(file_path, 'ab')
|
||||
else:
|
||||
logfile = open(file_path, 'wb')
|
||||
logfile.write("\n#############################################\n")
|
||||
logfile.write('%s\nSTDOUT\n' % command)
|
||||
logfile.write(str(fabric_AttributeString.stdout))
|
||||
logfile.write("\n#############################################\n")
|
||||
logfile.write("\n#############################################\n")
|
||||
logfile.write('%s\nSTDERR\n' % command)
|
||||
logfile.write(str(fabric_AttributeString.stderr))
|
||||
logfile.write("\n#############################################\n")
|
||||
logfile.close()
|
||||
mode = 'a' if os.path.exists(file_path) else 'w'
|
||||
with open(file_path, mode) as logfile:
|
||||
logfile.write("\n#############################################\n")
|
||||
logfile.write(command)
|
||||
logfile.write('\nSTDOUT\n')
|
||||
logfile.write(fabric_AttributeString.stdout)
|
||||
logfile.write("\n#############################################\n")
|
||||
logfile.write("\n#############################################\n")
|
||||
logfile.write(command)
|
||||
logfile.write('\nSTDERR\n')
|
||||
logfile.write(fabric_AttributeString.stderr)
|
||||
logfile.write("\n#############################################\n")
|
||||
|
||||
@contextmanager
|
||||
def use_tmp_dir(self):
|
||||
|
||||
@@ -17,10 +17,7 @@ from galaxy.tool_shed.util import (
|
||||
tool_util,
|
||||
)
|
||||
from galaxy.tool_shed.util.basic_util import remove_dir, strip_path
|
||||
from galaxy.tool_shed.util.hg_util import (
|
||||
get_config_from_disk,
|
||||
get_repo_for_repository,
|
||||
)
|
||||
from galaxy.tool_shed.util.hg_util import get_config_from_disk
|
||||
from galaxy.tool_shed.util.metadata_util import get_updated_changeset_revisions_from_tool_shed
|
||||
from galaxy.tool_shed.util.repository_util import get_repository_for_dependency_relationship
|
||||
from galaxy.tool_util.loader_directory import looks_like_a_tool
|
||||
@@ -77,7 +74,7 @@ class MetadataGenerator(object):
|
||||
else:
|
||||
# We're in the Tool Shed.
|
||||
if changeset_revision is None and self.repository is not None:
|
||||
self.changeset_revision = self.repository.tip(self.app)
|
||||
self.changeset_revision = self.repository.tip()
|
||||
else:
|
||||
self.changeset_revision = changeset_revision
|
||||
if repository_clone_url is None and self.repository is not None:
|
||||
@@ -989,7 +986,7 @@ class MetadataGenerator(object):
|
||||
log.debug(error_message)
|
||||
is_valid = False
|
||||
return repository_dependency_tup, is_valid, error_message
|
||||
repo = get_repo_for_repository(self.app, repository=repository)
|
||||
repo = repository.hg_repo
|
||||
|
||||
# The received changeset_revision may be None since defining it in the dependency definition is optional.
|
||||
# If this is the case, the default will be to set its value to the repository dependency tip revision.
|
||||
@@ -1080,7 +1077,7 @@ class MetadataGenerator(object):
|
||||
if relative_install_dir is None and self.repository is not None:
|
||||
relative_install_dir = repository.repo_path(self.app)
|
||||
if changeset_revision is None and self.repository is not None:
|
||||
self.set_changeset_revision(self.repository.tip(self.app))
|
||||
self.set_changeset_revision(self.repository.tip())
|
||||
else:
|
||||
self.set_changeset_revision(changeset_revision)
|
||||
self.shed_config_dict = {}
|
||||
|
||||
@@ -77,7 +77,7 @@ def get_ctx_file_path_from_manifest(filename, repo, changeset_revision):
|
||||
for changeset in reversed_upper_bounded_changelog(repo, changeset_revision):
|
||||
manifest_ctx = repo[changeset]
|
||||
for ctx_file in manifest_ctx.files():
|
||||
ctx_file_name = basic_util.strip_path(ctx_file)
|
||||
ctx_file_name = basic_util.strip_path(unicodify(ctx_file))
|
||||
if ctx_file_name == stripped_filename:
|
||||
return manifest_ctx, ctx_file
|
||||
return None, None
|
||||
@@ -93,7 +93,7 @@ def get_file_context_from_ctx(ctx, filename):
|
||||
deleted = False
|
||||
filename = basic_util.strip_path(filename)
|
||||
for ctx_file in ctx.files():
|
||||
ctx_file_name = basic_util.strip_path(ctx_file)
|
||||
ctx_file_name = basic_util.strip_path(unicodify(ctx_file))
|
||||
if filename == ctx_file_name:
|
||||
try:
|
||||
# If the file was moved, its destination will be returned here.
|
||||
@@ -107,18 +107,6 @@ def get_file_context_from_ctx(ctx, filename):
|
||||
return None
|
||||
|
||||
|
||||
def get_repo_for_repository(app, repository=None, repo_path=None):
|
||||
# Import from mercurial here to let Galaxy start under Python 3
|
||||
from mercurial import (
|
||||
hg,
|
||||
ui
|
||||
)
|
||||
if repository is not None:
|
||||
return hg.repository(ui.ui(), repository.repo_path(app))
|
||||
if repo_path is not None:
|
||||
return hg.repository(ui.ui(), repo_path)
|
||||
|
||||
|
||||
def pull_repository(repo_path, repository_clone_url, ctx_rev):
|
||||
"""Pull changes from a remote repository to a local one."""
|
||||
try:
|
||||
@@ -199,7 +187,6 @@ __all__ = (
|
||||
'get_config_from_disk',
|
||||
'get_ctx_file_path_from_manifest',
|
||||
'get_file_context_from_ctx',
|
||||
'get_repo_for_repository',
|
||||
'pull_repository',
|
||||
'reversed_lower_upper_bounded_changelog',
|
||||
'reversed_upper_bounded_changelog',
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user