galaxy-commits
Threads by month
- ----- 2026 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions
9 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f58a9199e992/
Changeset: f58a9199e992
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Fix failing test test/unit/workflows/test_extract_summary.py.
Affected #: 1 file
diff -r de2e33813275b89a04e7de4e95b21f6d2e100d4e -r f58a9199e9922c3bef27240aa613a9a3c5bae67e test/unit/workflows/test_extract_summary.py
--- a/test/unit/workflows/test_extract_summary.py
+++ b/test/unit/workflows/test_extract_summary.py
@@ -71,6 +71,10 @@
def __init__( self ):
self.active_datasets = []
+ @property
+ def active_contents( self ):
+ return self.active_datasets
+
class MockTrans( object ):
@@ -87,6 +91,7 @@
self.id = 123
self.state = state
self.copied_from_history_dataset_association = None
+ self.history_content_type = "dataset"
if job is not UNDEFINED_JOB:
if not job:
job = model.Job()
https://bitbucket.org/galaxy/galaxy-central/commits/f1a1c52f8495/
Changeset: f1a1c52f8495
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Move galaxy.dataset_collections.util to galaxy.managers.collections_util to prevent circular dependency error.
Still some problems with histories and hda managers when loading from unit tests:
======================================================================
ERROR: Failure: ImportError (cannot import name histories)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/john/workspace/lwr/.venv/local/lib/python2.7/site-packages/nose/loader.py", line 414, in loadTestsFromName
addr.filename, addr.module)
File "/home/john/workspace/lwr/.venv/local/lib/python2.7/site-packages/nose/importer.py", line 47, in importFromPath
return self.importFromDir(dir_path, fqname)
File "/home/john/workspace/lwr/.venv/local/lib/python2.7/site-packages/nose/importer.py", line 94, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "/home/john/workspace/galaxy-central/test/unit/workflows/test_workflow_run_request.py", line 4, in <module>
from galaxy.workflow import run_request
File "/home/john/workspace/galaxy-central/lib/galaxy/workflow/run_request.py", line 4, in <module>
import galaxy.managers.histories
File "/home/john/workspace/galaxy-central/lib/galaxy/managers/histories.py", line 12, in <module>
import galaxy.managers.hdas
File "/home/john/workspace/galaxy-central/lib/galaxy/managers/hdas.py", line 11, in <module>
from galaxy.managers import histories as history_manager
ImportError: cannot import name histories
Affected #: 9 files
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/dataset_collections/__init__.py
--- a/lib/galaxy/dataset_collections/__init__.py
+++ b/lib/galaxy/dataset_collections/__init__.py
@@ -1,7 +1,6 @@
from .registry import DatasetCollectionTypesRegistry
from .matching import MatchingCollections
from .type_description import CollectionTypeDescriptionFactory
-from .util import validate_input_element_identifiers
from galaxy import model
@@ -14,7 +13,7 @@
UsesTagsMixin,
)
from galaxy.managers import hdas # TODO: Refactor all mixin use into managers.
-
+from galaxy.managers.collections_util import validate_input_element_identifiers
from galaxy.util import validation
from galaxy.util import odict
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/dataset_collections/util.py
--- a/lib/galaxy/dataset_collections/util.py
+++ /dev/null
@@ -1,95 +0,0 @@
-from galaxy import exceptions
-from galaxy import web
-from galaxy import model
-
-import logging
-log = logging.getLogger( __name__ )
-
-ERROR_MESSAGE_UNKNOWN_SRC = "Unknown dataset source (src) %s."
-ERROR_MESSAGE_NO_NESTED_IDENTIFIERS = "Dataset source new_collection requires nested element_identifiers for new collection."
-ERROR_MESSAGE_NO_NAME = "Cannot load invalid dataset identifier - missing name - %s"
-ERROR_MESSAGE_NO_COLLECTION_TYPE = "No collection_type define for nested collection %s."
-ERROR_MESSAGE_INVALID_PARAMETER_FOUND = "Found invalid parameter %s in element identifier description %s."
-ERROR_MESSAGE_DUPLICATED_IDENTIFIER_FOUND = "Found duplicated element identifier name %s."
-
-
-def api_payload_to_create_params( payload ):
- """
- Cleanup API payload to pass into dataset_collections.
- """
- required_parameters = [ "collection_type", "element_identifiers" ]
- missing_parameters = [ p for p in required_parameters if p not in payload ]
- if missing_parameters:
- message = "Missing required parameters %s" % missing_parameters
- raise exceptions.ObjectAttributeMissingException( message )
-
- params = dict(
- collection_type=payload.get( "collection_type" ),
- element_identifiers=payload.get( "element_identifiers" ),
- name=payload.get( "name", None ),
- )
-
- return params
-
-
-def validate_input_element_identifiers( element_identifiers ):
- """ Scan through the list of element identifiers supplied by the API consumer
- and verify the structure is valid.
- """
- log.debug( "Validating %d element identifiers for collection creation." % len( element_identifiers ) )
- identifier_names = set()
- for element_identifier in element_identifiers:
- if "__object__" in element_identifier:
- message = ERROR_MESSAGE_INVALID_PARAMETER_FOUND % ( "__model_object__", element_identifier )
- raise exceptions.RequestParameterInvalidException( message )
- if "name" not in element_identifier:
- message = ERROR_MESSAGE_NO_NAME % element_identifier
- raise exceptions.RequestParameterInvalidException( message )
- name = element_identifier[ "name" ]
- if name in identifier_names:
- message = ERROR_MESSAGE_DUPLICATED_IDENTIFIER_FOUND % name
- raise exceptions.RequestParameterInvalidException( message )
- else:
- identifier_names.add( name )
- src = element_identifier.get( "src", "hda" )
- if src not in [ "hda", "hdca", "ldda", "new_collection" ]:
- message = ERROR_MESSAGE_UNKNOWN_SRC % src
- raise exceptions.RequestParameterInvalidException( message )
- if src == "new_collection":
- if "element_identifiers" not in element_identifier:
- message = ERROR_MESSAGE_NO_NESTED_IDENTIFIERS
- raise exceptions.RequestParameterInvalidException( ERROR_MESSAGE_NO_NESTED_IDENTIFIERS )
- if "collection_type" not in element_identifier:
- message = ERROR_MESSAGE_NO_COLLECTION_TYPE % element_identifier
- raise exceptions.RequestParameterInvalidException( message )
- validate_input_element_identifiers( element_identifier[ "element_identifiers" ] )
-
-
-def dictify_dataset_collection_instance( dataset_colleciton_instance, parent, security, view="element" ):
- dict_value = dataset_colleciton_instance.to_dict( view=view )
- encoded_id = security.encode_id( dataset_colleciton_instance.id )
- if isinstance( parent, model.History ):
- encoded_history_id = security.encode_id( parent.id )
- dict_value[ 'url' ] = web.url_for( 'history_content_typed', history_id=encoded_history_id, id=encoded_id, type="dataset_collection" )
- elif isinstance( parent, model.LibraryFolder ):
- encoded_library_id = security.encode_id( parent.library.id )
- encoded_folder_id = security.encode_id( parent.id )
- # TODO: Work in progress - this end-point is not right yet...
- dict_value[ 'url' ] = web.url_for( 'library_content', library_id=encoded_library_id, id=encoded_id, folder_id=encoded_folder_id )
- if view == "element":
- dict_value[ 'elements' ] = map( dictify_element, dataset_colleciton_instance.collection.elements )
- security.encode_all_ids( dict_value, recursive=True ) # TODO: Use Kyle's recusrive formulation of this.
- return dict_value
-
-
-def dictify_element( element ):
- dictified = element.to_dict( view="element" )
- object_detials = element.element_object.to_dict()
- if element.child_collection:
- # Recursively yield elements for each nested collection...
- object_detials[ "elements" ] = map( dictify_element, element.child_collection.elements )
-
- dictified[ "object" ] = object_detials
- return dictified
-
-__all__ = [ api_payload_to_create_params, dictify_dataset_collection_instance ]
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/managers/collections.py
--- /dev/null
+++ b/lib/galaxy/managers/collections.py
@@ -0,0 +1,1 @@
+""" Future home of dataset collections managers. """
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/managers/collections_util.py
--- /dev/null
+++ b/lib/galaxy/managers/collections_util.py
@@ -0,0 +1,95 @@
+from galaxy import exceptions
+from galaxy import web
+from galaxy import model
+
+import logging
+log = logging.getLogger( __name__ )
+
+ERROR_MESSAGE_UNKNOWN_SRC = "Unknown dataset source (src) %s."
+ERROR_MESSAGE_NO_NESTED_IDENTIFIERS = "Dataset source new_collection requires nested element_identifiers for new collection."
+ERROR_MESSAGE_NO_NAME = "Cannot load invalid dataset identifier - missing name - %s"
+ERROR_MESSAGE_NO_COLLECTION_TYPE = "No collection_type define for nested collection %s."
+ERROR_MESSAGE_INVALID_PARAMETER_FOUND = "Found invalid parameter %s in element identifier description %s."
+ERROR_MESSAGE_DUPLICATED_IDENTIFIER_FOUND = "Found duplicated element identifier name %s."
+
+
+def api_payload_to_create_params( payload ):
+ """
+ Cleanup API payload to pass into dataset_collections.
+ """
+ required_parameters = [ "collection_type", "element_identifiers" ]
+ missing_parameters = [ p for p in required_parameters if p not in payload ]
+ if missing_parameters:
+ message = "Missing required parameters %s" % missing_parameters
+ raise exceptions.ObjectAttributeMissingException( message )
+
+ params = dict(
+ collection_type=payload.get( "collection_type" ),
+ element_identifiers=payload.get( "element_identifiers" ),
+ name=payload.get( "name", None ),
+ )
+
+ return params
+
+
+def validate_input_element_identifiers( element_identifiers ):
+ """ Scan through the list of element identifiers supplied by the API consumer
+ and verify the structure is valid.
+ """
+ log.debug( "Validating %d element identifiers for collection creation." % len( element_identifiers ) )
+ identifier_names = set()
+ for element_identifier in element_identifiers:
+ if "__object__" in element_identifier:
+ message = ERROR_MESSAGE_INVALID_PARAMETER_FOUND % ( "__model_object__", element_identifier )
+ raise exceptions.RequestParameterInvalidException( message )
+ if "name" not in element_identifier:
+ message = ERROR_MESSAGE_NO_NAME % element_identifier
+ raise exceptions.RequestParameterInvalidException( message )
+ name = element_identifier[ "name" ]
+ if name in identifier_names:
+ message = ERROR_MESSAGE_DUPLICATED_IDENTIFIER_FOUND % name
+ raise exceptions.RequestParameterInvalidException( message )
+ else:
+ identifier_names.add( name )
+ src = element_identifier.get( "src", "hda" )
+ if src not in [ "hda", "hdca", "ldda", "new_collection" ]:
+ message = ERROR_MESSAGE_UNKNOWN_SRC % src
+ raise exceptions.RequestParameterInvalidException( message )
+ if src == "new_collection":
+ if "element_identifiers" not in element_identifier:
+ message = ERROR_MESSAGE_NO_NESTED_IDENTIFIERS
+ raise exceptions.RequestParameterInvalidException( ERROR_MESSAGE_NO_NESTED_IDENTIFIERS )
+ if "collection_type" not in element_identifier:
+ message = ERROR_MESSAGE_NO_COLLECTION_TYPE % element_identifier
+ raise exceptions.RequestParameterInvalidException( message )
+ validate_input_element_identifiers( element_identifier[ "element_identifiers" ] )
+
+
+def dictify_dataset_collection_instance( dataset_colleciton_instance, parent, security, view="element" ):
+ dict_value = dataset_colleciton_instance.to_dict( view=view )
+ encoded_id = security.encode_id( dataset_colleciton_instance.id )
+ if isinstance( parent, model.History ):
+ encoded_history_id = security.encode_id( parent.id )
+ dict_value[ 'url' ] = web.url_for( 'history_content_typed', history_id=encoded_history_id, id=encoded_id, type="dataset_collection" )
+ elif isinstance( parent, model.LibraryFolder ):
+ encoded_library_id = security.encode_id( parent.library.id )
+ encoded_folder_id = security.encode_id( parent.id )
+ # TODO: Work in progress - this end-point is not right yet...
+ dict_value[ 'url' ] = web.url_for( 'library_content', library_id=encoded_library_id, id=encoded_id, folder_id=encoded_folder_id )
+ if view == "element":
+ dict_value[ 'elements' ] = map( dictify_element, dataset_colleciton_instance.collection.elements )
+ security.encode_all_ids( dict_value, recursive=True ) # TODO: Use Kyle's recusrive formulation of this.
+ return dict_value
+
+
+def dictify_element( element ):
+ dictified = element.to_dict( view="element" )
+ object_detials = element.element_object.to_dict()
+ if element.child_collection:
+ # Recursively yield elements for each nested collection...
+ object_detials[ "elements" ] = map( dictify_element, element.child_collection.elements )
+
+ dictified[ "object" ] = object_detials
+ return dictified
+
+__all__ = [ api_payload_to_create_params, dictify_dataset_collection_instance ]
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/managers/histories.py
--- a/lib/galaxy/managers/histories.py
+++ b/lib/galaxy/managers/histories.py
@@ -10,9 +10,9 @@
from galaxy.managers import base as manager_base
import galaxy.managers.hdas
+import galaxy.managers.collections_util
import galaxy.web
-import galaxy.dataset_collections.util
import logging
log = logging.getLogger( __name__ )
@@ -141,7 +141,7 @@
history and an array of serialized history contents respectively.
"""
hda_mgr = galaxy.managers.hdas.HDAManager()
- collection_dictifier = galaxy.dataset_collections.util.dictify_dataset_collection_instance
+ collection_dictifier = galaxy.managers.collections_util.dictify_dataset_collection_instance
history_dictionary = {}
contents_dictionaries = []
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/webapps/galaxy/api/dataset_collections.py
--- a/lib/galaxy/webapps/galaxy/api/dataset_collections.py
+++ b/lib/galaxy/webapps/galaxy/api/dataset_collections.py
@@ -4,8 +4,7 @@
from galaxy.web.base.controller import UsesHistoryMixin
from galaxy.web.base.controller import UsesLibraryMixinItems
-from galaxy.dataset_collections.util import api_payload_to_create_params
-from galaxy.dataset_collections.util import dictify_dataset_collection_instance
+from galaxy.managers.collections_util import api_payload_to_create_params, dictify_dataset_collection_instance
from logging import getLogger
log = getLogger( __name__ )
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/webapps/galaxy/api/history_contents.py
--- a/lib/galaxy/webapps/galaxy/api/history_contents.py
+++ b/lib/galaxy/webapps/galaxy/api/history_contents.py
@@ -16,12 +16,9 @@
from galaxy.web.base.controller import UsesLibraryMixinItems
from galaxy.web.base.controller import UsesTagsMixin
-from galaxy.dataset_collections.util import api_payload_to_create_params
-from galaxy.dataset_collections.util import dictify_dataset_collection_instance
-
-
from galaxy.managers import histories
from galaxy.managers import hdas
+from galaxy.managers.collections_util import api_payload_to_create_params, dictify_dataset_collection_instance
import logging
log = logging.getLogger( __name__ )
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/webapps/galaxy/api/library_contents.py
--- a/lib/galaxy/webapps/galaxy/api/library_contents.py
+++ b/lib/galaxy/webapps/galaxy/api/library_contents.py
@@ -5,11 +5,10 @@
from galaxy import web
from galaxy import exceptions
from galaxy.web import _future_expose_api as expose_api
-from galaxy.dataset_collections.util import api_payload_to_create_params
-from galaxy.dataset_collections.util import dictify_dataset_collection_instance
from galaxy.web.base.controller import BaseAPIController, UsesLibraryMixin, UsesLibraryMixinItems
from galaxy.web.base.controller import UsesHistoryDatasetAssociationMixin
from galaxy.web.base.controller import HTTPBadRequest, url_for
+from galaxy.managers.collections_util import api_payload_to_create_params, dictify_dataset_collection_instance
from galaxy.model import ExtendedMetadata, ExtendedMetadataIndex
from sqlalchemy.orm.exc import MultipleResultsFound
from sqlalchemy.orm.exc import NoResultFound
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/webapps/galaxy/api/tools.py
--- a/lib/galaxy/webapps/galaxy/api/tools.py
+++ b/lib/galaxy/webapps/galaxy/api/tools.py
@@ -9,7 +9,8 @@
from galaxy.visualization.genomes import GenomeRegion
from galaxy.util.json import to_json_string
from galaxy.visualization.data_providers.genome import *
-from galaxy.dataset_collections.util import dictify_dataset_collection_instance
+
+from galaxy.managers.collections_util import dictify_dataset_collection_instance
import logging
log = logging.getLogger( __name__ )
https://bitbucket.org/galaxy/galaxy-central/commits/b17747153f1a/
Changeset: b17747153f1a
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Extract all the workflow run API param handling out...
This should allow for the reuse of all of this in asynchronous workflow running and make unit testing of all the different paths easier (though that is not included in this commit - the API functional test coverage for this code is pretty decent at this point).
Affected #: 2 files
diff -r f1a1c52f8495d1035d1c0a5e21b710974db0908e -r b17747153f1a55292a03392cf2c9f5a6c69c5460 lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -15,7 +15,7 @@
from galaxy.web.base.controller import SharableMixin
from galaxy.workflow.extract import extract_workflow
from galaxy.workflow.run import invoke
-from galaxy.workflow.run import WorkflowRunConfig
+from galaxy.workflow.run_request import build_workflow_run_config
log = logging.getLogger(__name__)
@@ -212,105 +212,12 @@
message = "Invalid workflow_id specified."
raise exceptions.RequestParameterInvalidException( message )
- # Pull other parameters out of payload.
- param_map = payload.get( 'parameters', {} )
- inputs = payload.get( 'inputs', None )
- inputs_by = payload.get( 'inputs_by', None )
- if inputs is None:
- # Default to legacy behavior - read ds_map and reference steps
- # by unencoded step id (a raw database id).
- inputs = payload.get( 'ds_map', {} )
- inputs_by = inputs_by or 'step_id'
- else:
- inputs = inputs or {}
- # New default is to reference steps by index of workflow step
- # which is intrinsic to the workflow and independent of the state
- # of Galaxy at the time of workflow import.
- inputs_by = inputs_by or 'step_index'
-
- valid_inputs_by = [ 'step_id', 'step_index', 'name' ]
- if inputs_by not in valid_inputs_by:
- trans.response.status = 403
- error_message_template = "Invalid inputs_by specified '%s' must be one of %s"
- error_message = error_message_template % ( inputs_by, valid_inputs_by )
- raise ValueError( error_message )
-
- add_to_history = 'no_add_to_history' not in payload
- history_param = payload.get('history', '')
-
# Get workflow + accessibility check.
stored_workflow = self.__get_stored_accessible_workflow( trans, workflow_id )
workflow = stored_workflow.latest_workflow
- # Sanity checks.
- if len( workflow.steps ) == 0:
- raise exceptions.MessageException( "Workflow cannot be run because it does not have any steps" )
- if workflow.has_cycles:
- raise exceptions.MessageException( "Workflow cannot be run because it contains cycles" )
- if workflow.has_errors:
- message = "Workflow cannot be run because of validation errors in some steps"
- raise exceptions.MessageException( message )
-
- # Get target history.
- if history_param.startswith('hist_id='):
- # Passing an existing history to use.
- encoded_history_id = history_param[ 8: ]
- history_id = self.__decode_id( trans, encoded_history_id, model_type="history" )
- history = self.history_manager.get( trans, history_id, check_ownership=True )
- else:
- # Send workflow outputs to new history.
- history = self.app.model.History(name=history_param, user=trans.user)
- trans.sa_session.add(history)
- trans.sa_session.flush()
-
- # Set workflow inputs.
- for k in inputs:
- try:
- if inputs[k]['src'] == 'ldda':
- ldda = trans.sa_session.query(self.app.model.LibraryDatasetDatasetAssociation).get(
- trans.security.decode_id(inputs[k]['id']))
- assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), ldda.dataset )
- content = ldda.to_history_dataset_association(history, add_to_history=add_to_history)
- elif inputs[k]['src'] == 'ld':
- ldda = trans.sa_session.query(self.app.model.LibraryDataset).get(
- trans.security.decode_id(inputs[k]['id'])).library_dataset_dataset_association
- assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), ldda.dataset )
- content = ldda.to_history_dataset_association(history, add_to_history=add_to_history)
- elif inputs[k]['src'] == 'hda':
- # Get dataset handle, add to dict and history if necessary
- content = trans.sa_session.query(self.app.model.HistoryDatasetAssociation).get(
- trans.security.decode_id(inputs[k]['id']))
- assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), content.dataset )
- elif inputs[k]['src'] == 'hdca':
- content = self.app.dataset_collections_service.get_dataset_collection_instance(
- trans,
- 'history',
- inputs[k]['id']
- )
- else:
- message = "Unknown workflow input source '%s' specified." % inputs[k]['src']
- raise exceptions.RequestParameterInvalidException( message )
- if add_to_history and content.history != history:
- content = content.copy()
- if isinstance( content, self.app.model.HistoryDatasetAssociation ):
- history.add_dataset( content )
- else:
- history.add_dataset_collection( content )
- inputs[k]['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
- except AssertionError:
- message = "Invalid workflow input '%s' specified" % inputs[k]['id']
- raise exceptions.ItemAccessibilityException( message )
-
- # Run each step, connecting outputs to inputs
- replacement_dict = payload.get('replacement_params', {})
-
- run_config = WorkflowRunConfig(
- target_history=history,
- replacement_dict=replacement_dict,
- inputs=inputs,
- inputs_by=inputs_by,
- param_map=param_map,
- )
+ run_config = build_workflow_run_config( trans, workflow, payload )
+ history = run_config.target_history
# invoke may throw MessageExceptions on tool erors, failure
# to match up inputs, etc...
@@ -525,8 +432,8 @@
return stored_workflow
def __get_stored_workflow( self, trans, workflow_id ):
+ workflow_id = self.__decode_id( trans, workflow_id )
try:
- workflow_id = self.__decode_id( trans, workflow_id )
query = trans.sa_session.query( trans.app.model.StoredWorkflow )
stored_workflow = query.get( workflow_id )
except Exception:
diff -r f1a1c52f8495d1035d1c0a5e21b710974db0908e -r b17747153f1a55292a03392cf2c9f5a6c69c5460 lib/galaxy/workflow/run_request.py
--- /dev/null
+++ b/lib/galaxy/workflow/run_request.py
@@ -0,0 +1,114 @@
+from galaxy import exceptions
+
+from galaxy.managers import histories
+from galaxy.workflow.run import WorkflowRunConfig
+
+
+def build_workflow_run_config( trans, workflow, payload ):
+ app = trans.app
+ history_manager = histories.HistoryManager()
+
+ # Pull other parameters out of payload.
+ param_map = payload.get( 'parameters', {} )
+ inputs = payload.get( 'inputs', None )
+ inputs_by = payload.get( 'inputs_by', None )
+ if inputs is None:
+ # Default to legacy behavior - read ds_map and reference steps
+ # by unencoded step id (a raw database id).
+ inputs = payload.get( 'ds_map', {} )
+ inputs_by = inputs_by or 'step_id'
+ else:
+ inputs = inputs or {}
+ # New default is to reference steps by index of workflow step
+ # which is intrinsic to the workflow and independent of the state
+ # of Galaxy at the time of workflow import.
+ inputs_by = inputs_by or 'step_index'
+
+ valid_inputs_by = [ 'step_id', 'step_index', 'name' ]
+ if inputs_by not in valid_inputs_by:
+ trans.response.status = 403
+ error_message_template = "Invalid inputs_by specified '%s' must be one of %s"
+ error_message = error_message_template % ( inputs_by, valid_inputs_by )
+ raise ValueError( error_message )
+
+ add_to_history = 'no_add_to_history' not in payload
+ history_param = payload.get('history', '')
+
+ # Sanity checks.
+ if len( workflow.steps ) == 0:
+ raise exceptions.MessageException( "Workflow cannot be run because it does not have any steps" )
+ if workflow.has_cycles:
+ raise exceptions.MessageException( "Workflow cannot be run because it contains cycles" )
+ if workflow.has_errors:
+ message = "Workflow cannot be run because of validation errors in some steps"
+ raise exceptions.MessageException( message )
+
+ # Get target history.
+ if history_param.startswith('hist_id='):
+ # Passing an existing history to use.
+ encoded_history_id = history_param[ 8: ]
+ history_id = __decode_id( trans, encoded_history_id, model_type="history" )
+ history = history_manager.get( trans, history_id, check_ownership=True )
+ else:
+ # Send workflow outputs to new history.
+ history = app.model.History(name=history_param, user=trans.user)
+ trans.sa_session.add(history)
+ trans.sa_session.flush()
+
+ # Set workflow inputs.
+ for k in inputs:
+ try:
+ if inputs[k]['src'] == 'ldda':
+ ldda = trans.sa_session.query(app.model.LibraryDatasetDatasetAssociation).get(
+ trans.security.decode_id(inputs[k]['id']))
+ assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), ldda.dataset )
+ content = ldda.to_history_dataset_association(history, add_to_history=add_to_history)
+ elif inputs[k]['src'] == 'ld':
+ ldda = trans.sa_session.query(app.model.LibraryDataset).get(
+ trans.security.decode_id(inputs[k]['id'])).library_dataset_dataset_association
+ assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), ldda.dataset )
+ content = ldda.to_history_dataset_association(history, add_to_history=add_to_history)
+ elif inputs[k]['src'] == 'hda':
+ # Get dataset handle, add to dict and history if necessary
+ content = trans.sa_session.query(app.model.HistoryDatasetAssociation).get(
+ trans.security.decode_id(inputs[k]['id']))
+ assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), content.dataset )
+ elif inputs[k]['src'] == 'hdca':
+ content = app.dataset_collections_service.get_dataset_collection_instance(
+ trans,
+ 'history',
+ inputs[k]['id']
+ )
+ else:
+ message = "Unknown workflow input source '%s' specified." % inputs[k]['src']
+ raise exceptions.RequestParameterInvalidException( message )
+ if add_to_history and content.history != history:
+ content = content.copy()
+ if isinstance( content, app.model.HistoryDatasetAssociation ):
+ history.add_dataset( content )
+ else:
+ history.add_dataset_collection( content )
+ inputs[k]['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
+ except AssertionError:
+ message = "Invalid workflow input '%s' specified" % inputs[k]['id']
+ raise exceptions.ItemAccessibilityException( message )
+
+ # Run each step, connecting outputs to inputs
+ replacement_dict = payload.get('replacement_params', {})
+
+ run_config = WorkflowRunConfig(
+ target_history=history,
+ replacement_dict=replacement_dict,
+ inputs=inputs,
+ inputs_by=inputs_by,
+ param_map=param_map,
+ )
+ return run_config
+
+
+def __decode_id( trans, workflow_id, model_type="workflow" ):
+ try:
+ return trans.security.decode_id( workflow_id )
+ except Exception:
+ message = "Malformed %s id ( %s ) specified, unable to decode" % ( model_type, workflow_id )
+ raise exceptions.MalformedId( message )
https://bitbucket.org/galaxy/galaxy-central/commits/041779f857a1/
Changeset: 041779f857a1
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Hack to get around circular dependency by histories and hdas manager modules.
======================================================================
ERROR: Failure: ImportError (cannot import name histories)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/john/workspace/lwr/.venv/local/lib/python2.7/site-packages/nose/loader.py", line 414, in loadTestsFromName
addr.filename, addr.module)
File "/home/john/workspace/lwr/.venv/local/lib/python2.7/site-packages/nose/importer.py", line 47, in importFromPath
return self.importFromDir(dir_path, fqname)
File "/home/john/workspace/lwr/.venv/local/lib/python2.7/site-packages/nose/importer.py", line 94, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "/home/john/workspace/galaxy-central/test/unit/workflows/test_workflow_run_request.py", line 4, in <module>
from galaxy.workflow import run_request
File "/home/john/workspace/galaxy-central/lib/galaxy/workflow/run_request.py", line 4, in <module>
import galaxy.managers.histories
File "/home/john/workspace/galaxy-central/lib/galaxy/managers/histories.py", line 12, in <module>
import galaxy.managers.hdas
File "/home/john/workspace/galaxy-central/lib/galaxy/managers/hdas.py", line 11, in <module>
from galaxy.managers import histories as history_manager
ImportError: cannot import name histories
Affected #: 1 file
diff -r b17747153f1a55292a03392cf2c9f5a6c69c5460 -r 041779f857a178092e216a628b62d3c04a4c8977 lib/galaxy/managers/histories.py
--- a/lib/galaxy/managers/histories.py
+++ b/lib/galaxy/managers/histories.py
@@ -9,7 +9,6 @@
from galaxy.model import orm
from galaxy.managers import base as manager_base
-import galaxy.managers.hdas
import galaxy.managers.collections_util
import galaxy.web
@@ -140,6 +139,8 @@
Returns a dictionary containing ``history`` and ``contents``, serialized
history and an array of serialized history contents respectively.
"""
+ # import here prevents problems related to circular dependecy between histories and hdas managers.
+ import galaxy.managers.hdas
hda_mgr = galaxy.managers.hdas.HDAManager()
collection_dictifier = galaxy.managers.collections_util.dictify_dataset_collection_instance
https://bitbucket.org/galaxy/galaxy-central/commits/7772ff282e95/
Changeset: 7772ff282e95
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Cleanup repeated dictionary access in build_workflow_run_config, better error handling.
Affected #: 1 file
diff -r 041779f857a178092e216a628b62d3c04a4c8977 -r 7772ff282e95516a4d39ef0a87afeabb8b123d23 lib/galaxy/workflow/run_request.py
--- a/lib/galaxy/workflow/run_request.py
+++ b/lib/galaxy/workflow/run_request.py
@@ -56,31 +56,39 @@
trans.sa_session.flush()
# Set workflow inputs.
- for k in inputs:
+ for input_dict in inputs.itervalues():
+ if 'src' not in input_dict:
+ message = "Not input source type defined for input '%s'." % input_dict
+ raise exceptions.RequestParameterInvalidException( message )
+ if 'id' not in input_dict:
+ message = "Not input id defined for input '%s'." % input_dict
+ raise exceptions.RequestParameterInvalidException( message )
+ input_source = input_dict['src']
+ input_id = input_dict['id']
try:
- if inputs[k]['src'] == 'ldda':
+ if input_source == 'ldda':
ldda = trans.sa_session.query(app.model.LibraryDatasetDatasetAssociation).get(
- trans.security.decode_id(inputs[k]['id']))
+ trans.security.decode_id(input_id))
assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), ldda.dataset )
content = ldda.to_history_dataset_association(history, add_to_history=add_to_history)
- elif inputs[k]['src'] == 'ld':
+ elif input_source == 'ld':
ldda = trans.sa_session.query(app.model.LibraryDataset).get(
- trans.security.decode_id(inputs[k]['id'])).library_dataset_dataset_association
+ trans.security.decode_id(input_id)).library_dataset_dataset_association
assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), ldda.dataset )
content = ldda.to_history_dataset_association(history, add_to_history=add_to_history)
- elif inputs[k]['src'] == 'hda':
+ elif input_source == 'hda':
# Get dataset handle, add to dict and history if necessary
content = trans.sa_session.query(app.model.HistoryDatasetAssociation).get(
- trans.security.decode_id(inputs[k]['id']))
+ trans.security.decode_id(input_id))
assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), content.dataset )
- elif inputs[k]['src'] == 'hdca':
+ elif input_source == 'hdca':
content = app.dataset_collections_service.get_dataset_collection_instance(
trans,
'history',
- inputs[k]['id']
+ input_id
)
else:
- message = "Unknown workflow input source '%s' specified." % inputs[k]['src']
+ message = "Unknown workflow input source '%s' specified." % input_source
raise exceptions.RequestParameterInvalidException( message )
if add_to_history and content.history != history:
content = content.copy()
@@ -88,9 +96,9 @@
history.add_dataset( content )
else:
history.add_dataset_collection( content )
- inputs[k]['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
+ input_dict['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
except AssertionError:
- message = "Invalid workflow input '%s' specified" % inputs[k]['id']
+ message = "Invalid workflow input '%s' specified" % input_id
raise exceptions.ItemAccessibilityException( message )
# Run each step, connecting outputs to inputs
https://bitbucket.org/galaxy/galaxy-central/commits/84caa9526b5f/
Changeset: 84caa9526b5f
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Change 'hda' input name in workflow inputs dict to 'content'...
... 'content' better reflects that this can be either an HDA or an HDCA.
Affected #: 2 files
diff -r 7772ff282e95516a4d39ef0a87afeabb8b123d23 -r 84caa9526b5fe407718082dcdd7c8b65cb210175 lib/galaxy/workflow/run.py
--- a/lib/galaxy/workflow/run.py
+++ b/lib/galaxy/workflow/run.py
@@ -224,7 +224,7 @@
else:
raise Exception("Unknown history content encountered")
if self.inputs:
- outputs[ step.id ][ 'output' ] = self.inputs_by_step_id[ step.id ][ 'hda' ]
+ outputs[ step.id ][ 'output' ] = self.inputs_by_step_id[ step.id ][ 'content' ]
return job
diff -r 7772ff282e95516a4d39ef0a87afeabb8b123d23 -r 84caa9526b5fe407718082dcdd7c8b65cb210175 lib/galaxy/workflow/run_request.py
--- a/lib/galaxy/workflow/run_request.py
+++ b/lib/galaxy/workflow/run_request.py
@@ -63,6 +63,9 @@
if 'id' not in input_dict:
message = "Not input id defined for input '%s'." % input_dict
raise exceptions.RequestParameterInvalidException( message )
+ if 'content' in input_dict:
+ message = "Input cannot specify explicit 'content' attribute %s'." % input_dict
+ raise exceptions.RequestParameterInvalidException( message )
input_source = input_dict['src']
input_id = input_dict['id']
try:
@@ -96,7 +99,7 @@
history.add_dataset( content )
else:
history.add_dataset_collection( content )
- input_dict['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
+ input_dict['content'] = content
except AssertionError:
message = "Invalid workflow input '%s' specified" % input_id
raise exceptions.ItemAccessibilityException( message )
https://bitbucket.org/galaxy/galaxy-central/commits/483ceff2d2b6/
Changeset: 483ceff2d2b6
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Normalize workflow step parameters earlier...
... this will allow linking to actual steps (referential integrity) if/when we store workflow requests in the database.
Also unit tests.
Affected #: 4 files
diff -r 84caa9526b5fe407718082dcdd7c8b65cb210175 -r 483ceff2d2b6f41432cd16f4dbf539355c3f4dde lib/galaxy/workflow/run.py
--- a/lib/galaxy/workflow/run.py
+++ b/lib/galaxy/workflow/run.py
@@ -41,9 +41,9 @@
that step ('name').
:type inputs_by: str
- :param param_map: Override tool and/or step parameters (see documentation on
- _update_step_parameters below).
- :type param_map:
+ :param param_map: Override step parameters - should be dict with step id keys and
+ tool param name-value dicts as values.
+ :type param_map: dict
"""
def __init__( self, target_history, replacement_dict, copy_inputs_to_history=False, inputs={}, inputs_by='step_id', param_map={} ):
@@ -304,36 +304,9 @@
self.inputs_by_step_id[ step.id ] = self.inputs[ key ]
-def _update_step_parameters(step, param_map):
- """
- Update ``step`` parameters based on the user-provided ``param_map`` dict.
-
- ``param_map`` should be structured as follows::
-
- PARAM_MAP = {STEP_ID: PARAM_DICT, ...}
- PARAM_DICT = {NAME: VALUE, ...}
-
- For backwards compatibility, the following (deprecated) format is
- also supported for ``param_map``::
-
- PARAM_MAP = {TOOL_ID: PARAM_DICT, ...}
-
- in which case PARAM_DICT affects all steps with the given tool id.
- If both by-tool-id and by-step-id specifications are used, the
- latter takes precedence.
-
- Finally (again, for backwards compatibility), PARAM_DICT can also
- be specified as::
-
- PARAM_DICT = {'param': NAME, 'value': VALUE}
-
- Note that this format allows only one parameter to be set per step.
- """
- param_dict = param_map.get(step.tool_id, {}).copy()
- param_dict.update(param_map.get(str(step.id), {}))
+def _update_step_parameters(step, normalized_param_map):
+ param_dict = normalized_param_map.get(step.id, {})
if param_dict:
- if 'param' in param_dict and 'value' in param_dict:
- param_dict[param_dict['param']] = param_dict['value']
step.state.inputs.update(param_dict)
diff -r 84caa9526b5fe407718082dcdd7c8b65cb210175 -r 483ceff2d2b6f41432cd16f4dbf539355c3f4dde lib/galaxy/workflow/run_request.py
--- a/lib/galaxy/workflow/run_request.py
+++ b/lib/galaxy/workflow/run_request.py
@@ -4,12 +4,62 @@
from galaxy.workflow.run import WorkflowRunConfig
+def normalize_step_parameters(steps, param_map):
+ """ Take a complex param_map that can reference parameters by
+ step_id in the new flexible way or in the old one-parameter
+ per tep fashion or by tool id and normalize the parameters so
+ everything is referenced by a numeric step id.
+ """
+ normalized_param_map = {}
+ for step in steps:
+ param_dict = _step_parameters(step, param_map)
+ if param_dict:
+ normalized_param_map[step.id] = param_dict
+ return normalized_param_map
+
+
+def _step_parameters(step, param_map):
+ """
+ Update ``step`` parameters based on the user-provided ``param_map`` dict.
+
+ ``param_map`` should be structured as follows::
+
+ PARAM_MAP = {STEP_ID: PARAM_DICT, ...}
+ PARAM_DICT = {NAME: VALUE, ...}
+
+ For backwards compatibility, the following (deprecated) format is
+ also supported for ``param_map``::
+
+ PARAM_MAP = {TOOL_ID: PARAM_DICT, ...}
+
+ in which case PARAM_DICT affects all steps with the given tool id.
+ If both by-tool-id and by-step-id specifications are used, the
+ latter takes precedence.
+
+ Finally (again, for backwards compatibility), PARAM_DICT can also
+ be specified as::
+
+ PARAM_DICT = {'param': NAME, 'value': VALUE}
+
+ Note that this format allows only one parameter to be set per step.
+ """
+ param_dict = param_map.get(step.tool_id, {}).copy()
+ param_dict.update(param_map.get(str(step.id), {}))
+ if param_dict:
+ if 'param' in param_dict and 'value' in param_dict:
+ param_dict[param_dict['param']] = param_dict['value']
+ del param_dict[ 'param' ]
+ del param_dict[ 'value' ]
+ return param_dict
+
+
def build_workflow_run_config( trans, workflow, payload ):
app = trans.app
history_manager = histories.HistoryManager()
# Pull other parameters out of payload.
param_map = payload.get( 'parameters', {} )
+ param_map = normalize_step_parameters( workflow.steps, param_map )
inputs = payload.get( 'inputs', None )
inputs_by = payload.get( 'inputs_by', None )
if inputs is None:
diff -r 84caa9526b5fe407718082dcdd7c8b65cb210175 -r 483ceff2d2b6f41432cd16f4dbf539355c3f4dde test/unit/workflows/test_run_parameters.py
--- /dev/null
+++ b/test/unit/workflows/test_run_parameters.py
@@ -0,0 +1,84 @@
+from .workflow_support import MockTrans
+
+from galaxy import model
+from galaxy.workflow.run_request import normalize_step_parameters
+
+
+def test_normalize_parameters_empty():
+ normalized_params = __normalize_parameters_against_fixture( {} )
+ assert normalized_params == {}
+
+
+def test_normalize_parameters_by_tool():
+ normalized_params = __normalize_parameters_against_fixture( {
+ 'cat1': { 'foo': 'bar' }
+ } )
+ # Tool specified parameters are expanded out.
+ assert normalized_params[ 3 ] == { 'foo': 'bar' }
+ assert normalized_params[ 4 ] == { 'foo': 'bar' }
+ assert len( normalized_params.keys() ) == 2
+
+
+def test_step_parameters():
+ normalized_params = __normalize_parameters_against_fixture( {
+ '1': { 'foo': 'bar' }
+ } )
+ assert normalized_params[ 1 ] == { 'foo': 'bar' }
+ assert len( normalized_params.keys() ) == 1
+
+
+def test_step_parameters_legacy():
+ normalized_params = __normalize_parameters_against_fixture( {
+ '1': { 'param': 'foo', 'value': 'bar' }
+ } )
+ assert normalized_params[ 1 ] == { 'foo': 'bar' }, normalized_params
+ assert len( normalized_params.keys() ) == 1
+
+
+def __normalize_parameters_against_fixture( params ):
+ trans = MockTrans()
+ workflow = __workflow_fixure( trans )
+ normalized_params = normalize_step_parameters( workflow.steps, params )
+ return normalized_params
+
+
+def __workflow_fixure( trans ):
+ user = model.User(
+ email="testworkflow_params(a)bx.psu.edu",
+ password="pass"
+ )
+ stored_workflow = model.StoredWorkflow()
+ stored_workflow.user = user
+ workflow = model.Workflow()
+ workflow.stored_workflow = stored_workflow
+
+ def add_step( **kwds ):
+ workflow_step = model.WorkflowStep()
+ for key, value in kwds.iteritems():
+ setattr(workflow_step, key, value)
+ workflow.steps.append( workflow_step )
+
+ trans.app.model.context.add(
+ workflow,
+ )
+
+ add_step(
+ type="input",
+ order_index=0,
+ )
+ add_step(
+ type="input",
+ order_index=1,
+ )
+ add_step(
+ type="tool",
+ tool_id="cat1",
+ order_index=2,
+ )
+ add_step(
+ type="tool",
+ tool_id="cat1",
+ order_index=4,
+ )
+ trans.app.model.context.flush()
+ return workflow
diff -r 84caa9526b5fe407718082dcdd7c8b65cb210175 -r 483ceff2d2b6f41432cd16f4dbf539355c3f4dde test/unit/workflows/workflow_support.py
--- /dev/null
+++ b/test/unit/workflows/workflow_support.py
@@ -0,0 +1,19 @@
+from galaxy.util import bunch
+from galaxy.model import mapping
+
+
+class MockTrans( object ):
+
+ def __init__( self ):
+ self.app = TestApp()
+
+
+class TestApp( object ):
+
+ def __init__( self ):
+ self.config = bunch.Bunch( )
+ self.model = mapping.init(
+ "/tmp",
+ "sqlite:///:memory:",
+ create_tables=True
+ )
https://bitbucket.org/galaxy/galaxy-central/commits/9664ed5cbb9f/
Changeset: 9664ed5cbb9f
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Normalize workflow input dataset dict earlier...
... this will allow linking to actual steps (referential integrity) if/when we store workflow requests in the database and failing faster.
Also more unit tests.
Affected #: 3 files
diff -r 483ceff2d2b6f41432cd16f4dbf539355c3f4dde -r 9664ed5cbb9fa654da1972772b5a3065450d2a15 lib/galaxy/workflow/run.py
--- a/lib/galaxy/workflow/run.py
+++ b/lib/galaxy/workflow/run.py
@@ -46,12 +46,11 @@
:type param_map: dict
"""
- def __init__( self, target_history, replacement_dict, copy_inputs_to_history=False, inputs={}, inputs_by='step_id', param_map={} ):
+ def __init__( self, target_history, replacement_dict, copy_inputs_to_history=False, inputs={}, param_map={} ):
self.target_history = target_history
self.replacement_dict = replacement_dict
self.copy_inputs_to_history = copy_inputs_to_history
self.inputs = inputs
- self.inputs_by = inputs_by
self.param_map = param_map
@@ -73,9 +72,7 @@
self.target_history = workflow_run_config.target_history
self.replacement_dict = workflow_run_config.replacement_dict
self.copy_inputs_to_history = workflow_run_config.copy_inputs_to_history
- self.inputs = workflow_run_config.inputs
- self.inputs_by = workflow_run_config.inputs_by
- self.inputs_by_step_id = {}
+ self.inputs_by_step_id = workflow_run_config.inputs
self.param_map = workflow_run_config.param_map
self.outputs = odict()
@@ -223,8 +220,8 @@
outputs[ step.id ][ 'input_ds_copy' ] = new_hdca
else:
raise Exception("Unknown history content encountered")
- if self.inputs:
- outputs[ step.id ][ 'output' ] = self.inputs_by_step_id[ step.id ][ 'content' ]
+ if self.inputs_by_step_id:
+ outputs[ step.id ][ 'output' ] = self.inputs_by_step_id[ step.id ]
return job
@@ -289,20 +286,6 @@
step.module = modules.module_factory.from_workflow_step( self.trans, step )
step.state = step.module.get_runtime_state()
- # This is an input step. Make sure we have an available input.
- if step.type in [ 'data_input', 'data_collection_input' ]:
- if self.inputs_by == "step_id":
- key = str( step.id )
- elif self.inputs_by == "name":
- key = step.tool_inputs.get( 'name', None )
- else:
- key = str( step.order_index )
- if key not in self.inputs:
- message = "Workflow cannot be run because an expected input step '%s' has no input dataset." % step.id
- raise exceptions.MessageException( message )
- else:
- self.inputs_by_step_id[ step.id ] = self.inputs[ key ]
-
def _update_step_parameters(step, normalized_param_map):
param_dict = normalized_param_map.get(step.id, {})
diff -r 483ceff2d2b6f41432cd16f4dbf539355c3f4dde -r 9664ed5cbb9fa654da1972772b5a3065450d2a15 lib/galaxy/workflow/run_request.py
--- a/lib/galaxy/workflow/run_request.py
+++ b/lib/galaxy/workflow/run_request.py
@@ -3,6 +3,32 @@
from galaxy.managers import histories
from galaxy.workflow.run import WorkflowRunConfig
+INPUT_STEP_TYPES = [ 'data_input', 'data_collection_input' ]
+
+
+def normalize_inputs(steps, inputs, inputs_by):
+ normalized_inputs = {}
+ for step in steps:
+ if step.type not in INPUT_STEP_TYPES:
+ continue
+
+ if inputs_by == "step_id":
+ inputs_key = str( step.id )
+ elif inputs_by == "step_index":
+ inputs_key = str( step.order_index )
+ elif inputs_by == "name":
+ inputs_key = step.tool_inputs.get( 'name', None )
+ else:
+ message = "Workflow cannot be run because unexpected inputs_by value specified."
+ raise exceptions.MessageException( message )
+ if inputs_key not in inputs:
+ message = "Workflow cannot be run because an expected input step '%s' has no input dataset." % step.id
+ raise exceptions.MessageException( message )
+
+ normalized_inputs[ step.id ] = inputs[ inputs_key ][ 'content' ]
+
+ return normalized_inputs
+
def normalize_step_parameters(steps, param_map):
""" Take a complex param_map that can reference parameters by
@@ -74,13 +100,6 @@
# of Galaxy at the time of workflow import.
inputs_by = inputs_by or 'step_index'
- valid_inputs_by = [ 'step_id', 'step_index', 'name' ]
- if inputs_by not in valid_inputs_by:
- trans.response.status = 403
- error_message_template = "Invalid inputs_by specified '%s' must be one of %s"
- error_message = error_message_template % ( inputs_by, valid_inputs_by )
- raise ValueError( error_message )
-
add_to_history = 'no_add_to_history' not in payload
history_param = payload.get('history', '')
@@ -154,14 +173,15 @@
message = "Invalid workflow input '%s' specified" % input_id
raise exceptions.ItemAccessibilityException( message )
+ normalized_inputs = normalize_inputs( workflow.steps, inputs, inputs_by )
+
# Run each step, connecting outputs to inputs
replacement_dict = payload.get('replacement_params', {})
run_config = WorkflowRunConfig(
target_history=history,
replacement_dict=replacement_dict,
- inputs=inputs,
- inputs_by=inputs_by,
+ inputs=normalized_inputs,
param_map=param_map,
)
return run_config
diff -r 483ceff2d2b6f41432cd16f4dbf539355c3f4dde -r 9664ed5cbb9fa654da1972772b5a3065450d2a15 test/unit/workflows/test_run_parameters.py
--- a/test/unit/workflows/test_run_parameters.py
+++ b/test/unit/workflows/test_run_parameters.py
@@ -2,6 +2,9 @@
from galaxy import model
from galaxy.workflow.run_request import normalize_step_parameters
+from galaxy.workflow.run_request import normalize_inputs
+
+STEP_ID_OFFSET = 4 # Offset a little so ids and order index are different.
def test_normalize_parameters_empty():
@@ -14,34 +17,87 @@
'cat1': { 'foo': 'bar' }
} )
# Tool specified parameters are expanded out.
- assert normalized_params[ 3 ] == { 'foo': 'bar' }
- assert normalized_params[ 4 ] == { 'foo': 'bar' }
+ assert normalized_params[ STEP_ID_OFFSET + 3 ] == { 'foo': 'bar' }
+ assert normalized_params[ STEP_ID_OFFSET + 4 ] == { 'foo': 'bar' }
assert len( normalized_params.keys() ) == 2
def test_step_parameters():
normalized_params = __normalize_parameters_against_fixture( {
- '1': { 'foo': 'bar' }
+ str( STEP_ID_OFFSET + 1 ): { 'foo': 'bar' }
} )
- assert normalized_params[ 1 ] == { 'foo': 'bar' }
+ assert normalized_params[ STEP_ID_OFFSET + 1 ] == { 'foo': 'bar' }
assert len( normalized_params.keys() ) == 1
def test_step_parameters_legacy():
normalized_params = __normalize_parameters_against_fixture( {
- '1': { 'param': 'foo', 'value': 'bar' }
+ str( STEP_ID_OFFSET + 1 ): { 'param': 'foo', 'value': 'bar' }
} )
- assert normalized_params[ 1 ] == { 'foo': 'bar' }, normalized_params
+ assert normalized_params[ STEP_ID_OFFSET + 1 ] == { 'foo': 'bar' }, normalized_params
assert len( normalized_params.keys() ) == 1
+def test_inputs_by_step_id():
+ input1 = __new_input()
+ input2 = __new_input()
+ normalized_inputs = __normalize_inputs_against_fixture( {
+ str( STEP_ID_OFFSET + 1 ): input1,
+ str( STEP_ID_OFFSET + 2 ): input2
+ }, inputs_by="step_id" )
+ assert normalized_inputs[ STEP_ID_OFFSET + 1 ] == input1[ 'content' ]
+ assert normalized_inputs[ STEP_ID_OFFSET + 2 ] == input2[ 'content' ]
+
+
+def test_inputs_by_step_index():
+ input1 = __new_input()
+ input2 = __new_input()
+ normalized_inputs = __normalize_inputs_against_fixture( {
+ str( 0 ): input1,
+ str( 1 ): input2
+ }, inputs_by="step_index" )
+ assert normalized_inputs[ STEP_ID_OFFSET + 1 ] == input1[ 'content' ]
+ assert normalized_inputs[ STEP_ID_OFFSET + 2 ] == input2[ 'content' ]
+
+
+def test_inputs_by_name():
+ input1 = __new_input()
+ input2 = __new_input()
+ normalized_inputs = __normalize_inputs_against_fixture( {
+ "input1": input1,
+ "input2": input2
+ }, inputs_by="name" )
+ print normalized_inputs
+ assert normalized_inputs[ STEP_ID_OFFSET + 1 ] == input1[ 'content' ]
+ assert normalized_inputs[ STEP_ID_OFFSET + 2 ] == input2[ 'content' ]
+
+
def __normalize_parameters_against_fixture( params ):
trans = MockTrans()
+ # Create a throw away workflow so step ids and order_index
+ # are different for actual fixture.
+ __workflow_fixure( trans )
+
workflow = __workflow_fixure( trans )
normalized_params = normalize_step_parameters( workflow.steps, params )
return normalized_params
+def __normalize_inputs_against_fixture( inputs, inputs_by ):
+ trans = MockTrans()
+ # Create a throw away workflow so step ids and order_index
+ # are different for actual fixture.
+ __workflow_fixure( trans )
+
+ workflow = __workflow_fixure( trans )
+ normalized_inputs = normalize_inputs( workflow.steps, inputs, inputs_by )
+ return normalized_inputs
+
+
+def __new_input( ):
+ return dict( content=model.HistoryDatasetAssociation() )
+
+
def __workflow_fixure( trans ):
user = model.User(
email="testworkflow_params(a)bx.psu.edu",
@@ -63,12 +119,14 @@
)
add_step(
- type="input",
+ type="data_input",
order_index=0,
+ tool_inputs={"name": "input1"}
)
add_step(
- type="input",
+ type="data_input",
order_index=1,
+ tool_inputs={"name": "input2"}
)
add_step(
type="tool",
@@ -81,4 +139,8 @@
order_index=4,
)
trans.app.model.context.flush()
- return workflow
+ # Expunge and reload to ensure step state is as expected from database.
+ workflow_id = workflow.id
+ trans.app.model.context.expunge_all()
+
+ return trans.app.model.context.query( model.Workflow ).get( workflow_id )
https://bitbucket.org/galaxy/galaxy-central/commits/bdc4017c2e7e/
Changeset: bdc4017c2e7e
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Move WorkflowConfig so run_request doesn't need to import run.
This is a more logical organization of these modules.
Affected #: 2 files
diff -r 9664ed5cbb9fa654da1972772b5a3065450d2a15 -r bdc4017c2e7e9ecb5dfa3d36798f535402ec80aa lib/galaxy/workflow/run.py
--- a/lib/galaxy/workflow/run.py
+++ b/lib/galaxy/workflow/run.py
@@ -13,47 +13,12 @@
from galaxy.tools.execute import execute
from galaxy.util.odict import odict
from galaxy.workflow import modules
+from galaxy.workflow.run_request import WorkflowRunConfig
import logging
log = logging.getLogger( __name__ )
-class WorkflowRunConfig( object ):
- """ Wrapper around all the ways a workflow execution can be parameterized.
-
- :param target_history: History to execute workflow in.
- :type target_history: galaxy.model.History.
-
- :param replacement_dict: Workflow level parameters used for renaming post
- job actions.
- :type replacement_dict: dict
-
- :param copy_inputs_to_history: Should input data parameters be copied to
- target_history. (Defaults to False)
- :type copy_inputs_to_history: bool
-
- :param inputs: Map from step ids to dict's containing HDA for these steps.
- :type inputs: dict
-
- :param inputs_by: How inputs maps to inputs (datasets/collections) to workflows
- steps - by unencoded database id ('step_id'), index in workflow
- 'step_index' (independent of database), or by input name for
- that step ('name').
- :type inputs_by: str
-
- :param param_map: Override step parameters - should be dict with step id keys and
- tool param name-value dicts as values.
- :type param_map: dict
- """
-
- def __init__( self, target_history, replacement_dict, copy_inputs_to_history=False, inputs={}, param_map={} ):
- self.target_history = target_history
- self.replacement_dict = replacement_dict
- self.copy_inputs_to_history = copy_inputs_to_history
- self.inputs = inputs
- self.param_map = param_map
-
-
def invoke( trans, workflow, workflow_run_config ):
""" Run the supplied workflow in the supplied target_history.
"""
diff -r 9664ed5cbb9fa654da1972772b5a3065450d2a15 -r bdc4017c2e7e9ecb5dfa3d36798f535402ec80aa lib/galaxy/workflow/run_request.py
--- a/lib/galaxy/workflow/run_request.py
+++ b/lib/galaxy/workflow/run_request.py
@@ -1,11 +1,46 @@
from galaxy import exceptions
from galaxy.managers import histories
-from galaxy.workflow.run import WorkflowRunConfig
INPUT_STEP_TYPES = [ 'data_input', 'data_collection_input' ]
+class WorkflowRunConfig( object ):
+ """ Wrapper around all the ways a workflow execution can be parameterized.
+
+ :param target_history: History to execute workflow in.
+ :type target_history: galaxy.model.History.
+
+ :param replacement_dict: Workflow level parameters used for renaming post
+ job actions.
+ :type replacement_dict: dict
+
+ :param copy_inputs_to_history: Should input data parameters be copied to
+ target_history. (Defaults to False)
+ :type copy_inputs_to_history: bool
+
+ :param inputs: Map from step ids to dict's containing HDA for these steps.
+ :type inputs: dict
+
+ :param inputs_by: How inputs maps to inputs (datasets/collections) to workflows
+ steps - by unencoded database id ('step_id'), index in workflow
+ 'step_index' (independent of database), or by input name for
+ that step ('name').
+ :type inputs_by: str
+
+ :param param_map: Override step parameters - should be dict with step id keys and
+ tool param name-value dicts as values.
+ :type param_map: dict
+ """
+
+ def __init__( self, target_history, replacement_dict, copy_inputs_to_history=False, inputs={}, param_map={} ):
+ self.target_history = target_history
+ self.replacement_dict = replacement_dict
+ self.copy_inputs_to_history = copy_inputs_to_history
+ self.inputs = inputs
+ self.param_map = param_map
+
+
def normalize_inputs(steps, inputs, inputs_by):
normalized_inputs = {}
for step in steps:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Trackster: refine label track position calculation.
by commits-noreply@bitbucket.org 09 Aug '14
by commits-noreply@bitbucket.org 09 Aug '14
09 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d85ae37476a1/
Changeset: d85ae37476a1
Branch: next-stable
User: jgoecks
Date: 2014-08-09 21:38:33
Summary: Trackster: refine label track position calculation.
Affected #: 2 files
diff -r 990bc0688199410ab08d5e8a418770b516c6f4e2 -r d85ae37476a17205c9869d633f3aafd104b48a98 static/scripts/packed/viz/trackster/tracks.js
--- a/static/scripts/packed/viz/trackster/tracks.js
+++ b/static/scripts/packed/viz/trackster/tracks.js
@@ -1,1 +1,1 @@
-define(["libs/underscore","viz/visualization","viz/viz_views","viz/trackster/util","viz/trackster/slotting","viz/trackster/painters","viz/trackster/filters","mvc/data","mvc/tools","utils/config"],function(ab,w,V,j,s,J,h,X,P,R){var o=ab.extend;var l={};var i=function(ac,ad){l[ac.attr("id")]=ad};var k=function(ac,ad,af,ae){af=".group";l[ac.attr("id")]=ae;ac.bind("drag",{handle:"."+ad,relative:true},function(an,ao){var am=$(this),ar=$(this).parent(),aj=ar.children(".track,.group"),al=l[$(this).attr("id")],ai,ah,ap,ag,ak;ah=$(this).parents(af);if(ah.length!==0){ap=ah.position().top;ag=ap+ah.outerHeight();var aq=l[ah.attr("id")];if(ao.offsetY<ap){$(this).insertBefore(ah);aq.remove_drawable(al);aq.container.add_drawable_before(al,aq);return}else{if(ao.offsetY>ag){$(this).insertAfter(ah);aq.remove_drawable(al);aq.container.add_drawable(al);return}}}ah=null;for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));ap=ai.position().top;ag=ap+ai.outerHeight();if(ai.is(af)&&this!==ai.get(0)&&ao.offsetY>=ap&&ao.offsetY<=ag){if(ao.offsetY-ap<ag-ao.offsetY){ai.find(".content-div").prepend(this)}else{ai.find(".content-div").append(this)}if(al.container){al.container.remove_drawable(al)}l[ai.attr("id")].add_drawable(al);return}}for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));if(ao.offsetY<ai.position().top&&!(ai.hasClass("reference-track")||ai.hasClass("intro"))){break}}if(ak===aj.length){if(this!==aj.get(ak-1)){ar.append(this);l[ar.attr("id")].move_drawable(al,ak)}}else{if(this!==aj.get(ak)){$(this).insertBefore(aj.get(ak));l[ar.attr("id")].move_drawable(al,(ao.deltaY>0?ak-1:ak))}}}).bind("dragstart",function(){$(this).addClass("dragging")}).bind("dragend",function(){$(this).removeClass("dragging")})};var D=20,z=100,G=12000,Q=400,I=5000,v=100,m="Cannot display dataset due to an error. ",H="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",E="No data for this chrom/contig.",u="Preparing data. This can take a while for a large dataset. If the visualization is saved and closed, preparation will continue in the background.",x="Tool cannot be rerun: ",a="Loading data...",T="Ready for display",O=10,F=20,A=["Histogram","Line","Filled","Intensity"];function U(ad,ac){if(!ac){ac=0}var ae=Math.pow(10,ac);return Math.round(ad*ae)/ae}var p=function(ad,ac,ag){if(!p.id_counter){p.id_counter=0}this.id=p.id_counter++;this.view=ad;this.container=ac;this.drag_handle_class=ag.drag_handle_class;this.is_overview=false;this.action_icons={};this.config=R.ConfigSettingCollection.from_models_and_saved_values(this.config_params,ag.prefs);if(!this.config.get_value("name")){this.config.set_value("name",ag.name)}if(this.config_onchange){this.config.on("change",this.config_onchange,this)}this.container_div=this.build_container_div();this.header_div=null;if(ag.header!==false){var ae=new V.TrackHeaderView({model:this,id:this.id});this.header_div=ae.$el;this.container_div.append(this.header_div);var af=ae.icons_div;this.action_icons=ae.action_icons;this.container_div.hover(function(){af.show()},function(){af.hide()})}};p.prototype.action_icons_def=[{name:"toggle_icon",title:"Hide/show content",css_class:"toggle",on_click_fn:function(ac){if(ac.config.get_value("content_visible")){ac.action_icons.toggle_icon.addClass("toggle-expand").removeClass("toggle");ac.hide_contents();ac.config.set_value("content_visible",false)}else{ac.action_icons.toggle_icon.addClass("toggle").removeClass("toggle-expand");ac.config.set_value("content_visible",true);ac.show_contents()}}},{name:"settings_icon",title:"Edit settings",css_class:"gear",on_click_fn:function(ad){var ac=new R.ConfigSettingCollectionView({collection:ad.config});ac.render_in_modal("Configure Track")}},{name:"remove_icon",title:"Remove",css_class:"remove-icon",on_click_fn:function(ac){$(".tooltip").remove();ac.remove()}}];o(p.prototype,{config_params:[{key:"name",label:"Name",type:"text",default_value:""},{key:"content_visible",type:"bool",default_value:true,hidden:true}],config_onchange:function(){},init:function(){},changed:function(){this.view.changed()},can_draw:function(){if(this.enabled&&this.config.get_value("content_visible")){return true}return false},request_draw:function(){},_draw:function(ac){},to_dict:function(){},set_name:function(ac){this.old_name=this.config.get_value("name");this.config.set_value("name",ac)},revert_name:function(){if(this.old_name){this.config.set_value("name",this.old_name)}},remove:function(){this.changed();this.container.remove_drawable(this);var ac=this.view;this.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})},build_container_div:function(){},update_icons:function(){},hide_contents:function(){},show_contents:function(){},get_drawables:function(){}});var y=function(ad,ac,ae){p.call(this,ad,ac,ae);this.obj_type=ae.obj_type;this.drawables=[]};o(y.prototype,p.prototype,{unpack_drawables:function(ae){this.drawables=[];var ad;for(var ac=0;ac<ae.length;ac++){ad=n(ae[ac],this.view,this);this.add_drawable(ad)}},init:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].init()}},_draw:function(ac){for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad]._draw(ac)}},to_dict:function(){var ad=[];for(var ac=0;ac<this.drawables.length;ac++){ad.push(this.drawables[ac].to_dict())}return{prefs:this.config.to_key_value_dict(),obj_type:this.obj_type,drawables:ad}},add_drawable:function(ac){this.drawables.push(ac);ac.container=this;this.changed()},add_drawable_before:function(ae,ac){this.changed();var ad=this.drawables.indexOf(ac);if(ad!==-1){this.drawables.splice(ad,0,ae);return true}return false},replace_drawable:function(ae,ac,ad){var af=this.drawables.indexOf(ae);if(af!==-1){this.drawables[af]=ac;if(ad){ae.container_div.replaceWith(ac.container_div)}this.changed()}return af},remove_drawable:function(ad){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);ad.container=null;this.changed();return true}return false},move_drawable:function(ad,ae){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);this.drawables.splice(ae,0,ad);this.changed();return true}return false},get_drawables:function(){return this.drawables},get_tracks:function(af){var ac=this.drawables.slice(0),ad=[],ae;while(ac.length!==0){ae=ac.shift();if(ae instanceof af){ad.push(ae)}else{if(ae.drawables){ac=ac.concat(ae.drawables)}}}return ad}});var N=function(ad,ac,af){o(af,{obj_type:"DrawableGroup",drag_handle_class:"group-handle"});y.call(this,ad,ac,af);this.content_div=$("<div/>").addClass("content-div").attr("id","group_"+this.id+"_content_div").appendTo(this.container_div);i(this.container_div,this);i(this.content_div,this);k(this.container_div,this.drag_handle_class,".group",this);this.filters_manager=new h.FiltersManager(this);this.header_div.after(this.filters_manager.parent_div);this.filters_manager.parent_div.after($("<div style='clear: both'/>"));this.saved_filters_managers=[];if("drawables" in af){this.unpack_drawables(af.drawables)}if("filters" in af){var ae=this.filters_manager;this.filters_manager=new h.FiltersManager(this,af.filters);ae.parent_div.replaceWith(this.filters_manager.parent_div);if(af.filters.visible){this.setup_multitrack_filtering()}}};o(N.prototype,p.prototype,y.prototype,{action_icons_def:[p.prototype.action_icons_def[0],p.prototype.action_icons_def[1],{name:"composite_icon",title:"Show composite track",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_composite_track()}},{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters();ac._restore_filter_managers()}else{ac.setup_multitrack_filtering();ac.request_draw({clear_tile_cache:true})}ac.filters_manager.toggle()}},p.prototype.action_icons_def[2]],build_container_div:function(){var ac=$("<div/>").addClass("group").attr("id","group_"+this.id);if(this.container){this.container.content_div.append(ac)}return ac},hide_contents:function(){this.tiles_div.hide()},show_contents:function(){this.tiles_div.show();this.request_draw()},update_icons:function(){var ae=this.drawables.length;if(ae===0){this.action_icons.composite_icon.hide();this.action_icons.filters_icon.hide()}else{if(ae===1){this.action_icons.composite_icon.toggle(this.drawables[0] instanceof e);this.action_icons.filters_icon.hide()}else{var al,ak,ai,ao=true,ag=this.drawables[0].get_type(),ac=0;for(al=0;al<ae;al++){ai=this.drawables[al];if(ai.get_type()!==ag){can_composite=false;break}if(ai instanceof c){ac++}}if(ao&&this.drawables[0] instanceof g){this.action_icons.composite_icon.show()}else{this.action_icons.composite_icon.hide();$(".tooltip").remove()}if(ac>1&&ac===this.drawables.length){var ap={},ad;ai=this.drawables[0];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];ap[ad.name]=[ad]}for(al=1;al<this.drawables.length;al++){ai=this.drawables[al];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];if(ad.name in ap){ap[ad.name].push(ad)}}}this.filters_manager.remove_all();var af,ah,aj,am;for(var an in ap){af=ap[an];if(af.length===ac){ah=new h.NumberFilter({name:af[0].name,index:af[0].index});this.filters_manager.add_filter(ah)}}this.action_icons.filters_icon.toggle(this.filters_manager.filters.length>0)}else{this.action_icons.filters_icon.hide()}}}},_restore_filter_managers:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].filters_manager=this.saved_filters_managers[ac]}this.saved_filters_managers=[]},setup_multitrack_filtering:function(){if(this.filters_manager.filters.length>0){this.saved_filters_managers=[];for(var ac=0;ac<this.drawables.length;ac++){drawable=this.drawables[ac];this.saved_filters_managers.push(drawable.filters_manager);drawable.filters_manager=this.filters_manager}}this.filters_manager.init_filters()},show_composite_track:function(){var ad=new e(this.view,this.view,{name:this.config.get_value("name"),drawables:this.drawables});var ac=this.container.replace_drawable(this,ad,true);ad.request_draw()},add_drawable:function(ac){y.prototype.add_drawable.call(this,ac);this.update_icons()},remove_drawable:function(ac){y.prototype.remove_drawable.call(this,ac);this.update_icons()},to_dict:function(){if(this.filters_manager.visible()){this._restore_filter_managers()}var ac=o(y.prototype.to_dict.call(this),{filters:this.filters_manager.to_dict()});if(this.filters_manager.visible()){this.setup_multitrack_filtering()}return ac},request_draw:function(ac){ab.each(this.drawables,function(ad){ad.request_draw(ac)})}});var Y=Backbone.View.extend({initialize:function(ac){o(ac,{obj_type:"View"});y.call(this,"View",ac.container,ac);this.chrom=null;this.vis_id=ac.vis_id;this.dbkey=ac.dbkey;this.label_tracks=[];this.tracks_to_be_redrawn=[];this.max_low=0;this.max_high=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.load_chroms_deferred=null;this.render();this.canvas_manager=new w.CanvasManager(this.container.get(0).ownerDocument);this.reset();this.config=R.ConfigSettingCollection.from_models_and_saved_values([{key:"name",label:"Name",type:"text",default_value:""},{key:"a_color",label:"A Color",type:"color",default_value:"#FF0000"},{key:"c_color",label:"C Color",type:"color",default_value:"#00FF00"},{key:"g_color",label:"G Color",type:"color",default_value:"#0000FF"},{key:"t_color",label:"T Color",type:"color",default_value:"#FF00FF"},{key:"n_color",label:"N Color",type:"color",default_value:"#AAAAAA"}],{name:ac.name})},render:function(){this.requested_redraw=false;var ae=this.container,ac=this;this.top_container=$("<div/>").addClass("top-container").appendTo(ae);this.browser_content_div=$("<div/>").addClass("content").appendTo(ae);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(ae);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").attr("id","viewport-container").appendTo(this.browser_content_div);this.content_div=this.viewport_container;i(this.viewport_container,ac);this.intro_div=$("<div/>").addClass("intro").appendTo(this.viewport_container);var af=$("<div/>").text("Add Datasets to Visualization").addClass("action-button").appendTo(this.intro_div).click(function(){w.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",{"f-dbkey":ac.dbkey},function(ag){ab.each(ag,function(ah){ac.add_drawable(n(ah,ac,ac))})})});this.nav_container=$("<div/>").addClass("trackster-nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("trackster-nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a/>").attr("title","Close overview").addClass("icon-button overview-close tooltip").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_select=$("<select/>").attr({name:"chrom"}).addClass("chrom-nav").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var ad=function(ag){if(ag.type==="focusout"||(ag.keyCode||ag.which)===13||(ag.keyCode||ag.which)===27){if((ag.keyCode||ag.which)!==27){ac.go_to($(this).val())}$(this).hide();$(this).val("");ac.location_span.show();ac.chrom_select.show()}ag.stopPropagation()};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",ad).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").attr("title","Click to change location").tooltip({placement:"bottom"}).appendTo(this.nav_controls);this.location_span.click(function(){ac.location_span.hide();ac.chrom_select.hide();ac.nav_input.val(ac.chrom+":"+ac.low+"-"+ac.high);ac.nav_input.css("display","inline-block");ac.nav_input.select();ac.nav_input.focus();ac.nav_input.autocomplete({source:function(ai,ag){var aj=[],ah=$.map(ac.get_tracks(c),function(ak){return ak.data_manager.search_features(ai.term).success(function(al){aj=aj.concat(al)})});$.when.apply($,ah).done(function(){ag($.map(aj,function(ak){return{label:ak[0],value:ak[1]}}))})},minLength:2})});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a/>").attr("id","zoom-out").attr("title","Zoom out").tooltip({placement:"bottom"}).click(function(){ac.zoom_out()}).appendTo(this.nav_controls);this.zi_link=$("<a/>").attr("id","zoom-in").attr("title","Zoom in").tooltip({placement:"bottom"}).click(function(){ac.zoom_in()}).appendTo(this.nav_controls);this.load_chroms_deferred=this.load_chroms({low:0});this.chrom_select.bind("change",function(){ac.change_chrom(ac.chrom_select.val())});this.browser_content_div.click(function(ag){$(this).find("input").trigger("blur")});this.browser_content_div.bind("dblclick",function(ag){ac.zoom_in(ag.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(ag,ah){this.current_x=ah.offsetX}).bind("drag",function(ag,ai){var aj=ai.offsetX-this.current_x;this.current_x=ai.offsetX;var ah=Math.round(aj/ac.viewport_container.width()*(ac.max_high-ac.max_low));ac.move_delta(-ah)});this.overview_close.click(function(){ac.reset_overview()});this.viewport_container.bind("draginit",function(ag,ah){if(ag.clientX>ac.viewport_container.width()-16){return false}}).bind("dragstart",function(ag,ah){ah.original_low=ac.low;ah.current_height=ag.clientY;ah.current_x=ah.offsetX}).bind("drag",function(ai,ak){var ag=$(this);var al=ak.offsetX-ak.current_x;var ah=ag.scrollTop()-(ai.clientY-ak.current_height);ag.scrollTop(ah);ak.current_height=ai.clientY;ak.current_x=ak.offsetX;var aj=Math.round(al/ac.viewport_container.width()*(ac.high-ac.low));ac.move_delta(aj)});this.top_labeltrack.bind("dragstart",function(ag,ah){return $("<div/>").addClass("zoom-area").css("height",ac.browser_content_div.height()+ac.top_labeltrack.height()+1).appendTo($(this))}).bind("drag",function(ak,al){$(al.proxy).css({left:Math.min(ak.pageX,al.startX)-ac.container.offset().left,width:Math.abs(ak.pageX-al.startX)});var ah=Math.min(ak.pageX,al.startX)-ac.container.offset().left,ag=Math.max(ak.pageX,al.startX)-ac.container.offset().left,aj=(ac.high-ac.low),ai=ac.viewport_container.width();ac.update_location(Math.round(ah/ai*aj)+ac.low,Math.round(ag/ai*aj)+ac.low)}).bind("dragend",function(al,am){var ah=Math.min(al.pageX,am.startX),ag=Math.max(al.pageX,am.startX),aj=(ac.high-ac.low),ai=ac.viewport_container.width(),ak=ac.low;ac.low=Math.round(ah/ai*aj)+ak;ac.high=Math.round(ag/ai*aj)+ak;$(am.proxy).remove();ac.request_redraw()});this.add_label_track(new W(this,{content_div:this.top_labeltrack}));$(window).bind("resize",function(){if(this.resize_timer){clearTimeout(this.resize_timer)}this.resize_timer=setTimeout(function(){ac.resize_window()},500)});$(document).bind("redraw",function(){ac.redraw()});this.reset();$(window).trigger("resize")},get_base_color:function(ac){return this.config.get_value(ac.toLowerCase()+"_color")||this.config.get_value("n_color")}});o(Y.prototype,y.prototype,{changed:function(){this.has_changes=true},update_intro_div:function(){this.intro_div.toggle(this.drawables.length===0)},trigger_navigate:function(ad,af,ac,ag){if(this.timer){clearTimeout(this.timer)}if(ag){var ae=this;this.timer=setTimeout(function(){ae.trigger("navigate",ad+":"+af+"-"+ac)},500)}else{view.trigger("navigate",ad+":"+af+"-"+ac)}},update_location:function(ac,ae){this.location_span.text(commatize(ac)+" - "+commatize(ae));this.nav_input.val(this.chrom+":"+commatize(ac)+"-"+commatize(ae));var ad=view.chrom_select.val();if(ad!==""){this.trigger_navigate(ad,view.low,view.high,true)}},load_chroms:function(ae){ae.num=v;var ac=this,ad=$.Deferred();$.ajax({url:galaxy_config.root+"api/genomes/"+this.dbkey,data:ae,dataType:"json",success:function(ag){if(ag.chrom_info.length===0){return}if(ag.reference){var ah=new B(ac);ac.add_label_track(ah);ac.reference_track=ah}ac.chrom_data=ag.chrom_info;var ak='<option value="">Select Chrom/Contig</option>';for(var aj=0,af=ac.chrom_data.length;aj<af;aj++){var ai=ac.chrom_data[aj].chrom;ak+='<option value="'+ai+'">'+ai+"</option>"}if(ag.prev_chroms){ak+='<option value="previous">Previous '+v+"</option>"}if(ag.next_chroms){ak+='<option value="next">Next '+v+"</option>"}ac.chrom_select.html(ak);ac.chrom_start_index=ag.start_index;ad.resolve(ag.chrom_info)},error:function(){alert("Could not load chroms for this dbkey: "+ac.dbkey)}});return ad},change_chrom:function(ah,ad,aj){var ae=this;if(!ae.chrom_data){ae.load_chroms_deferred.then(function(){ae.change_chrom(ah,ad,aj)});return}if(!ah||ah==="None"){return}if(ah==="previous"){ae.load_chroms({low:this.chrom_start_index-v});return}if(ah==="next"){ae.load_chroms({low:this.chrom_start_index+v});return}var ai=$.grep(ae.chrom_data,function(ak,al){return ak.chrom===ah})[0];if(ai===undefined){ae.load_chroms({chrom:ah},function(){ae.change_chrom(ah,ad,aj)});return}else{if(ah!==ae.chrom){ae.chrom=ah;ae.chrom_select.val(ae.chrom);ae.max_high=ai.len-1;ae.reset();for(var ag=0,ac=ae.drawables.length;ag<ac;ag++){var af=ae.drawables[ag];if(af.init){af.init()}}if(ae.reference_track){ae.reference_track.init()}}if(ad===undefined&&aj===undefined){ae.low=0;ae.high=ae.max_high}else{ae.low=(ad!==undefined?Math.max(ad,0):0);if(aj===undefined){ae.low=Math.max(ae.low-15,0);ae.high=ae.low+30}else{ae.high=Math.min(aj,ae.max_high)}}ae.request_redraw()}},go_to:function(ag){ag=ag.replace(/,/g,"");ag=ag.replace(/:|\-/g," ");var ad=ag.split(/\s+/),af=ad[0],ae=(ad[1]?parseInt(ad[1],10):undefined),ac=(ad[2]?parseInt(ad[2],10):undefined);this.change_chrom(af,ae,ac)},move_fraction:function(ae){var ac=this;var ad=ac.high-ac.low;this.move_delta(ae*ad)},move_delta:function(af){var ac=this;var ae=ac.high-ac.low;if(ac.low-af<ac.max_low){ac.low=ac.max_low;ac.high=ac.max_low+ae}else{if(ac.high-af>ac.max_high){ac.high=ac.max_high;ac.low=ac.max_high-ae}else{ac.high-=af;ac.low-=af}}ac.request_redraw({data_fetch:false});if(this.redraw_on_move_fn){clearTimeout(this.redraw_on_move_fn)}this.redraw_on_move_fn=setTimeout(function(){ac.request_redraw()},200);var ad=ac.chrom_select.val();this.trigger_navigate(ad,ac.low,ac.high,true)},add_drawable:function(ad){y.prototype.add_drawable.call(this,ad);ad.init();this.changed();this.update_intro_div();var ac=this;ad.config.on("change",function(){ac.changed()})},add_label_track:function(ac){ac.view=this;ac.init();this.label_tracks.push(ac)},remove_drawable:function(ae,ad){y.prototype.remove_drawable.call(this,ae);if(ad){var ac=this;ae.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})}},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},request_redraw:function(ad,ae){var ac=this,af=(ae?[ae]:ac.drawables);ab.each(af,function(ag){var ah=ab.find(ac.tracks_to_be_redrawn,function(ai){return ai[0]===ag});if(ah){ah[1]=ad}else{ac.tracks_to_be_redrawn.push([ag,ad])}});if(!this.requested_redraw){requestAnimationFrame(function(){ac._redraw()});this.requested_redraw=true}},_redraw:function(){this.requested_redraw=false;var ac=this.low,ag=this.high;if(ac<this.max_low){ac=this.max_low}if(ag>this.max_high){ag=this.max_high}var ad=this.high-this.low;if(this.high!==0&&ad<this.min_separation){ag=ac+this.min_separation}this.low=Math.floor(ac);this.high=Math.ceil(ag);this.update_location(this.low,this.high);this.resolution_px_b=this.viewport_container.width()/(this.high-this.low);var af=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ah=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ae=13;this.overview_box.css({left:af,width:Math.max(ae,ah)}).show();if(ah<ae){this.overview_box.css("left",af-(ae-ah)/2)}if(this.overview_highlight){this.overview_highlight.css({left:af,width:ah})}ab.each(this.tracks_to_be_redrawn,function(ak){var ai=ak[0],aj=ak[1];if(ai){ai._draw(aj)}});this.tracks_to_be_redrawn=[];ab.each(this.label_tracks,function(ai){ai._draw()})},zoom_in:function(ad,ae){if(this.max_high===0||this.high-this.low<=this.min_separation){return}var af=this.high-this.low,ag=af/2+this.low,ac=(af/this.zoom_factor)/2;if(ad){ag=ad/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(ag-ac);this.high=Math.round(ag+ac);this.changed();this.request_redraw()},zoom_out:function(){if(this.max_high===0){return}var ad=this.high-this.low,ae=ad/2+this.low,ac=(ad*this.zoom_factor)/2;this.low=Math.round(ae-ac);this.high=Math.round(ae+ac);this.changed();this.request_redraw()},resize_viewport:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height())},resize_window:function(){this.resize_viewport();this.request_redraw()},set_overview:function(ae){if(this.overview_drawable){if(this.overview_drawable.dataset.id===ae.dataset.id){return}this.overview_viewport.find(".track").remove()}var ad=ae.copy({content_div:this.overview_viewport}),ac=this;ad.header_div.hide();ad.is_overview=true;ac.overview_drawable=ad;this.overview_drawable.postdraw_actions=function(){ac.overview_highlight.show().height(ac.overview_drawable.content_div.height());ac.overview_viewport.height(ac.overview_drawable.content_div.height()+ac.overview_box.outerHeight());ac.overview_close.show();ac.resize_window()};ac.overview_drawable.request_draw();this.changed()},reset_overview:function(){$(".tooltip").remove();this.overview_viewport.find(".track-tile").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide();view.resize_window();view.overview_drawable=null}});var q=P.Tool.extend({defaults:{track:null},initialize:function(ac){P.Tool.prototype.initialize.call(this,ac);var ad=true;if(ac.tool_state!==undefined&&ac.tool_state.hidden!==undefined){ad=ac.tool_state.hidden}this.set("hidden",ad);this.remove_inputs(["data","hidden_data","conditional"])},state_dict:function(ac){return ab.extend(this.get_inputs_dict(),{hidden:!this.is_visible()})}});var t=Backbone.View.extend({events:{"change :input":"update_value"},render:function(){var ae=this.$el.addClass("param-row"),af=this.model;var ac=$("<div>").addClass("param-label").text(af.get("label")).appendTo(ae);var ad=$("<div/>").addClass("param-input").html(af.get("html")).appendTo(ae);ad.find(":input").val(af.get("value"));$("<div style='clear: both;'/>").appendTo(ae)},update_value:function(ac){this.model.set_value($(ac.target).val())}});var aa=Backbone.View.extend({initialize:function(ac){this.model.on("change:hidden",this.set_visible,this)},render:function(){var ad=this;tool=this.model,parent_div=this.$el.addClass("dynamic-tool").hide();parent_div.bind("drag",function(ah){ah.stopPropagation()}).click(function(ah){ah.stopPropagation()}).bind("dblclick",function(ah){ah.stopPropagation()}).keydown(function(ah){ah.stopPropagation()});var ae=$("<div class='tool-name'>").appendTo(parent_div).text(tool.get("name"));tool.get("inputs").each(function(ai){var ah=new t({model:ai});ah.render();parent_div.append(ah.$el)});parent_div.find("input").click(function(){$(this).select()});var af=$("<div>").addClass("param-row").appendTo(parent_div);var ag=$("<input type='submit'>").attr("value","Run on complete dataset").appendTo(af);var ac=$("<input type='submit'>").attr("value","Run on visible region").appendTo(af);ac.click(function(){ad.run_on_region()});ag.click(function(){ad.run_on_dataset()});if(tool.is_visible()){this.$el.show()}},set_visible:function(){this.$el.toggle(this.model.is_visible())},update_params:function(){for(var ac=0;ac<this.params.length;ac++){this.params[ac].update_value()}},run_on_dataset:function(){var ac=this.model;this.run({target_dataset_id:this.model.get("track").dataset.id,action:"rerun",tool_id:ac.id},null,function(ad){Galaxy.modal.show({title:ac.get("name")+" is Running",body:ac.get("name")+" is running on the complete dataset. Tool outputs are in dataset's history.",buttons:{Close:function(){Galaxy.modal.hide()}}})})},run_on_region:function(){var ad=this.model.get("track"),ag=this.model,ai=new w.GenomeRegion({chrom:ad.view.chrom,start:ad.view.low,end:ad.view.high}),aj={target_dataset_id:ad.dataset.id,action:"rerun",tool_id:ag.id,regions:[ai.toJSON()]},ah=ad,al=ag.get("name")+ah.tool_region_and_parameters_str(ai),ac;if(ah.container===view){var ak=new N(view,view,{name:ad.config.get_value("name")});var af=ah.container.replace_drawable(ah,ak,false);ak.container_div.insertBefore(ah.view.content_div.children()[af]);ak.add_drawable(ah);ah.container_div.appendTo(ak.content_div);ac=ak}else{ac=ah.container}var ae=new ah.constructor(view,ac,{name:al,hda_ldda:"hda"});ae.init_for_tool_data();ae.change_mode(ah.mode);ae.set_filters_manager(ah.filters_manager.copy(ae));ae.update_icons();ac.add_drawable(ae);ae.tiles_div.text("Starting job.");this.run(aj,ae,function(am){ae.set_dataset(new X.Dataset(am));ae.tiles_div.text("Running job.");ae.init()})},run:function(ac,ae,af){ac.inputs=this.model.get_inputs_dict();var ad=new j.ServerStateDeferred({ajax_settings:{url:galaxy_config.root+"api/tools",data:JSON.stringify(ac),dataType:"json",contentType:"application/json",type:"POST"},interval:2000,success_fn:function(ag){return ag!=="pending"}});$.when(ad.go()).then(function(ag){if(ag==="no converter"){ae.container_div.addClass("error");ae.content_div.text(H)}else{if(ag.error){ae.container_div.addClass("error");ae.content_div.text(x+ag.message)}else{af(ag)}}})}});var C=function(ac,ad){J.Scaler.call(this,ad);this.filter=ac};C.prototype.gen_val=function(ac){if(this.filter.high===Number.MAX_VALUE||this.filter.low===-Number.MAX_VALUE||this.filter.low===this.filter.high){return this.default_val}return((parseFloat(ac[this.filter.index])-this.filter.low)/(this.filter.high-this.filter.low))};var b=function(ac,af,ag,ad,ae){this.track=ac;this.region=af;this.low=af.get("start");this.high=af.get("end");this.w_scale=ag;this.canvas=ad;this.html_elt=$("<div class='track-tile'/>").append(ad);this.data=ae;this.stale=false};b.prototype.predisplay_actions=function(){};var K=function(ac,af,ag,ad,ae){b.call(this,ac,af,ag,ad,ae)};K.prototype.predisplay_actions=function(){};var M=function(ae,aj,al,ad,ag,ah,am,ac,ai,af,ak){b.call(this,ae,aj,al,ad,ag);this.mode=ah;this.all_slotted=ac;this.feature_mapper=ai;this.has_icons=false;this.incomplete_features=af;this.other_tiles_features_drawn={};this.seq_data=ak};o(M.prototype,b.prototype);M.prototype.predisplay_actions=function(){};var f=function(ad,ac,ae){o(ae,{drag_handle_class:"draghandle"});p.call(this,ad,ac,ae);this.dataset=null;if(ae.dataset){this.dataset=(ae.dataset instanceof Backbone.Model?ae.dataset:new X.Dataset(ae.dataset))}this.dataset_check_type="converted_datasets_state";this.data_url_extra_params={};this.data_query_wait=("data_query_wait" in ae?ae.data_query_wait:I);this.data_manager=("data_manager" in ae?ae.data_manager:new w.GenomeDataManager({dataset:this.dataset,genome:new w.Genome({key:ad.dbkey,chroms_info:{chrom_info:ad.chrom_data}}),data_mode_compatible:this.data_and_mode_compatible,can_subset:this.can_subset}));this.min_height_px=16;this.max_height_px=800;this.visible_height_px=this.config.get_value("height");this.content_div=$("<div class='track-content'>").appendTo(this.container_div);if(this.container){this.container.content_div.append(this.container_div);if(!("resize" in ae)||ae.resize){this.add_resize_handle()}}};o(f.prototype,p.prototype,{action_icons_def:[{name:"mode_icon",title:"Set display mode",css_class:"chevron-expand",on_click_fn:function(){}},p.prototype.action_icons_def[0],{name:"overview_icon",title:"Set as overview",css_class:"application-dock-270",on_click_fn:function(ac){ac.view.set_overview(ac)}},p.prototype.action_icons_def[1],{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters()}else{ac.filters_manager.init_filters()}ac.filters_manager.toggle()}},{name:"tools_icon",title:"Tool",css_class:"hammer",on_click_fn:function(ac){ac.tool.toggle();if(ac.tool.is_visible()){ac.set_name(ac.config.get_value("name")+ac.tool_region_and_parameters_str())}else{ac.revert_name()}$(".tooltip").remove()}},{name:"param_space_viz_icon",title:"Tool parameter space visualization",css_class:"arrow-split",on_click_fn:function(ac){var af='<strong>Tool</strong>: <%= track.tool.get("name") %><br/><strong>Dataset</strong>: <%= track.config.get_value("name") %><br/><strong>Region(s)</strong>: <select name="regions"><option value="cur">current viewing area</option><option value="bookmarks">bookmarks</option><option value="both">current viewing area and bookmarks</option></select>',ae=ab.template(af,{track:ac});var ah=function(){Galaxy.modal.hide();$(window).unbind("keypress.check_enter_esc")},ad=function(){var aj=$('select[name="regions"] option:selected').val(),al,ai=new w.GenomeRegion({chrom:view.chrom,start:view.low,end:view.high}),ak=ab.map($(".bookmark"),function(am){return new w.GenomeRegion({from_str:$(am).children(".position").text()})});if(aj==="cur"){al=[ai]}else{if(aj==="bookmarks"){al=ak}else{al=[ai].concat(ak)}}Galaxy.modal.hide();window.location.href=galaxy_config.root+"visualization/sweepster?"+$.param({dataset_id:ac.dataset.id,hda_ldda:ac.dataset.get("hda_ldda"),regions:JSON.stringify(new Backbone.Collection(al).toJSON())})},ag=function(ai){if((ai.keyCode||ai.which)===27){ah()}else{if((ai.keyCode||ai.which)===13){ad()}}};Galaxy.modal.show({title:"Visualize tool parameter space and output from different parameter settings?",body:ae,buttons:{No:ah,Yes:ad}})}},p.prototype.action_icons_def[2]],can_draw:function(){return this.dataset&&p.prototype.can_draw.call(this)},build_container_div:function(){return $("<div/>").addClass("track").attr("id","track_"+this.id)},set_dataset:function(ac){this.dataset=ac;this.data_manager.set("dataset",ac)},on_resize:function(){this.request_draw({clear_tile_cache:true})},add_resize_handle:function(){var ac=this;var af=false;var ae=false;var ad=$("<div class='track-resize'>");$(ac.container_div).hover(function(){if(ac.config.get_value("content_visible")){af=true;ad.show()}},function(){af=false;if(!ae){ad.hide()}});ad.hide().bind("dragstart",function(ag,ah){ae=true;ah.original_height=$(ac.content_div).height()}).bind("drag",function(ah,ai){var ag=Math.min(Math.max(ai.original_height+ai.deltaY,ac.min_height_px),ac.max_height_px);$(ac.tiles_div).css("height",ag);ac.visible_height_px=(ac.max_height_px===ag?0:ag);ac.on_resize()}).bind("dragend",function(ag,ah){ac.tile_cache.clear();ae=false;if(!af){ad.hide()}ac.config.set_value("height",ac.visible_height_px);ac.changed()}).appendTo(ac.container_div)},hide_contents:function(){this.tiles_div.hide();this.container_div.find(".yaxislabel, .track-resize").hide()},show_contents:function(){this.tiles_div.show();this.container_div.find(".yaxislabel, .track-resize").show();this.request_draw()},get_type:function(){if(this instanceof W){return"LabelTrack"}else{if(this instanceof B){return"ReferenceTrack"}else{if(this instanceof g){return"LineTrack"}else{if(this instanceof S){return"ReadTrack"}else{if(this instanceof Z){return"VariantTrack"}else{if(this instanceof e){return"CompositeTrack"}else{if(this instanceof c){return"FeatureTrack"}}}}}}}return""},show_message:function(ac){this.tiles_div.remove();return $("<span/>").addClass("message").html(ac).appendTo(this.content_div)},init:function(ae){var ad=this;ad.enabled=false;ad.tile_cache.clear();ad.data_manager.clear();ad.content_div.children().remove();ad.container_div.removeClass("nodata error pending");ad.tiles_div=$("<div/>").addClass("tiles").appendTo(ad.content_div);if(!ad.dataset.id){return}var ac=$.Deferred(),af={hda_ldda:ad.dataset.get("hda_ldda"),data_type:this.dataset_check_type,chrom:ad.view.chrom,retry:ae};$.getJSON(this.dataset.url(),af,function(ag){if(!ag||ag==="error"||ag.kind==="error"){ad.container_div.addClass("error");var ah=ad.show_message(m);if(ag.message){ah.append($("<a href='javascript:void(0);'></a>").text("View error").click(function(){Galaxy.modal.show({title:"Trackster Error",body:"<pre>"+ag.message+"</pre>",buttons:{Close:function(){Galaxy.modal.hide()}}})}));ah.append($("<span/>").text(" "));ah.append($("<a href='javascript:void(0);'></a>").text("Try again").click(function(){ad.init(true)}))}}else{if(ag==="no converter"){ad.container_div.addClass("error");ad.show_message(H)}else{if(ag==="no data"||(ag.data!==undefined&&(ag.data===null||ag.data.length===0))){ad.container_div.addClass("nodata");ad.show_message(E)}else{if(ag==="pending"){ad.container_div.addClass("pending");ad.show_message(u);setTimeout(function(){ad.init()},ad.data_query_wait)}else{if(ag==="data"||ag.status==="data"){if(ag.valid_chroms){ad.valid_chroms=ag.valid_chroms;ad.update_icons()}ad.tiles_div.text(T);if(ad.view.chrom){ad.tiles_div.text("");ad.tiles_div.css("height",ad.visible_height_px+"px");ad.enabled=true;$.when.apply($,ad.predraw_init()).done(function(){ac.resolve();ad.container_div.removeClass("nodata error pending");ad.request_draw()})}else{ac.resolve()}}}}}}});this.update_icons();return ac},predraw_init:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(af&&af.min&&af.max){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_default_value("min_value",ae);ac.config.set_default_value("max_value",ag);ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},get_drawables:function(){return this}});var L=function(ae,ad,ag){f.call(this,ae,ad,ag);var ac=this;k(ac.container_div,ac.drag_handle_class,".group",ac);this.filters_manager=new h.FiltersManager(this,("filters" in ag?ag.filters:null));this.data_manager.set("filters_manager",this.filters_manager);this.filters_available=false;this.tool=(ag.tool?new q(ab.extend(ag.tool,{track:this,tool_state:ag.tool_state})):null);this.tile_cache=new w.Cache(O);this.left_offset=0;if(this.header_div){this.set_filters_manager(this.filters_manager);if(this.tool){var af=new aa({model:this.tool});af.render();this.dynamic_tool_div=af.$el;this.header_div.after(this.dynamic_tool_div)}}this.tiles_div=$("<div/>").addClass("tiles").appendTo(this.content_div);if(!this.config.get_value("content_visible")){this.tiles_div.hide()}this.overlay_div=$("<div/>").addClass("overlay").appendTo(this.content_div);if(ag.mode){this.change_mode(ag.mode)}};o(L.prototype,p.prototype,f.prototype,{action_icons_def:f.prototype.action_icons_def.concat([{name:"show_more_rows_icon",title:"To minimize track height, not all feature rows are displayed. Click to display more rows.",css_class:"exclamation",on_click_fn:function(ac){$(".tooltip").remove();ac.slotters[ac.view.resolution_px_b].max_rows*=2;ac.request_draw({clear_tile_cache:true})},hide:true}]),copy:function(ac){var ad=this.to_dict();o(ad,{data_manager:this.data_manager});var ae=new this.constructor(this.view,ac,ad);ae.change_mode(this.mode);ae.enabled=this.enabled;return ae},set_filters_manager:function(ac){this.filters_manager=ac;this.header_div.after(this.filters_manager.parent_div)},to_dict:function(){return{track_type:this.get_type(),dataset:{id:this.dataset.id,hda_ldda:this.dataset.get("hda_ldda")},prefs:this.config.to_key_value_dict(),mode:this.mode,filters:this.filters_manager.to_dict(),tool_state:(this.tool?this.tool.state_dict():{})}},set_min_max:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(isNaN(parseFloat(ac.config.get_value("min_value")))||isNaN(parseFloat(ac.config.get_value("max_value")))){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},change_mode:function(ad){var ac=this;ac.mode=ad;ac.config.set_value("mode",ad);if(ad==="Auto"){this.data_manager.clear()}ac.request_draw({clear_tile_cache:true});this.action_icons.mode_icon.attr("title","Set display mode (now: "+ac.mode+")");return ac},update_icons:function(){var ac=this;ac.action_icons.filters_icon.toggle(ac.filters_available);ac.action_icons.tools_icon.toggle(ac.tool!==null);ac.action_icons.param_space_viz_icon.toggle(ac.tool!==null)},_gen_tile_cache_key:function(ad,ac){return ad+"_"+ac},request_draw:function(ac){if(ac&&ac.clear_tile_cache){this.tile_cache.clear()}this.view.request_redraw(ac,this)},before_draw:function(){this.max_height_px=0},_draw:function(aq){if(!this.can_draw()){return}var an=aq&&aq.clear_after,al=this.view.low,ag=this.view.high,aj=ag-al,ad=this.view.container.width(),ap=this.view.resolution_px_b,af=1/ap;if(this.is_overview){al=this.view.max_low;ag=this.view.max_high;ap=ad/(view.max_high-view.max_low);af=1/ap}this.before_draw();this.tiles_div.children().addClass("remove");var ak=Math.floor(Q*af),ac=Math.floor(al/ak),am,ah,ai=[],ao=[];while((ac*ak)<ag){am=new w.GenomeRegion({chrom:this.view.chrom,start:ac*ak,end:Math.min((ac+1)*ak,this.view.max_high)});ah=this.draw_helper(am,ap,aq);ai.push(ah);$.when(ah).then(function(ar){ao.push(ar)});ac+=1}if(!an){this.tiles_div.children(".remove").removeClass("remove").remove()}var ae=this;$.when.apply($,ai).then(function(){ae.tiles_div.children(".remove").remove();ao=ab.filter(ao,function(ar){return ar!==null});if(ao.length!==0){ae.postdraw_actions(ao,ad,ap,an)}})},_add_yaxis_label:function(af,ah){var ad=this,ag=(af==="max"?"top":"bottom"),ai=(af==="max"?"max":"min"),ac=(af==="max"?"max_value":"min_value"),ae=this.container_div.find(".yaxislabel."+ag);ah=ah||function(){ad.request_draw({clear_tile_cache:true})};if(ae.length!==0){ae.text(ad.config.get_value(ac))}else{ae=$("<div/>").text(ad.config.get_value(ac)).make_text_editable({num_cols:12,on_finish:function(aj){$(".tooltip").remove();ad.config.set_value(ac,aj);ah()},help_text:"Set "+ai+" value"}).addClass("yaxislabel "+ag).css("color",this.config.get_value("label_color"));this.container_div.prepend(ae)}},postdraw_actions:function(af,ag,ai,ac){var ae=ab.filter(af,function(aj){return(aj instanceof K)});if(ae.length>0){this.max_height_px=0;var ad=this;ab.each(af,function(aj){if(!(aj instanceof K)){aj.html_elt.remove();ad.draw_helper(aj.region,ai,{force:true,mode:"Coverage"})}});ad._add_yaxis_label("max")}else{this.container_div.find(".yaxislabel").remove();var ah=ab.find(af,function(aj){return aj.has_icons});if(ah){ab.each(af,function(aj){if(!aj.has_icons){aj.html_elt.css("padding-top",D)}})}}},get_mode:function(ac){return this.mode},update_auto_mode:function(ac){},_get_drawables:function(){return[this]},draw_helper:function(al,an,ao){if(!ao){ao={}}var ad=ao.force,ai=ao.mode||this.mode,af=1/an,ae=this,ag=this._get_drawables(),am=this._gen_tile_cache_key(an,al),ah=function(ap){return(ap&&"track" in ap)};var aj=(ad?undefined:ae.tile_cache.get_elt(am));if(aj){if(ah(aj)){ae.show_tile(aj,an)}return aj}if(ao.data_fetch===false){return null}var ak=function(){var ap=(ab.find(A,function(ar){return ar===ai})?"Coverage":ai);var aq=ab.map(ag,function(ar){return ar.data_manager.get_data(al,ap,af,ae.data_url_extra_params)});if(view.reference_track){aq.push(view.reference_track.data_manager.get_data(al,ai,af,view.reference_track.data_url_extra_params))}return aq};var ac=$.Deferred();ae.tile_cache.set_elt(am,ac);$.when.apply($,ak()).then(function(){var ap=ak(),av=ap,aB;if(ab.find(ap,function(aD){return j.is_deferred(aD)})){ae.tile_cache.set_elt(am,undefined);$.when(ae.draw_helper(al,an,ao)).then(function(aD){ac.resolve(aD)});return}if(view.reference_track){aB=view.reference_track.data_manager.subset_entry(ap.pop(),al)}var aw=[],at=[];ab.each(ag,function(aG,aD){var aF=aG.mode,aE=av[aD];if(aF==="Auto"){aF=aG.get_mode(aE);aG.update_auto_mode(aF)}aw.push(aF);at.push(aG.get_canvas_height(aE,aF,an,aq))});var au=ae.view.canvas_manager.new_canvas(),ax=al.get("start"),aC=al.get("end"),ar=0,aq=Math.ceil((aC-ax)*an)+ae.left_offset,az=ab.max(at),ay;au.width=aq;au.height=(ao.height||az);var aA=au.getContext("2d");aA.translate(ae.left_offset,0);if(ag.length>1){aA.globalAlpha=0.5;aA.globalCompositeOperation="source-over"}ab.each(ag,function(aE,aD){ay=aE.draw_tile(av[aD],aA,aw[aD],al,an,aB)});if(ay!==undefined){ae.tile_cache.set_elt(am,ay);ae.show_tile(ay,an)}ac.resolve(ay)});return ac},get_canvas_height:function(ac,ae,af,ad){return this.visible_height_px},_draw_line_track_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.LinePainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new K(this,ag,ai,af,ac.data)},draw_tile:function(ac,ad,ag,af,ah,ae){},show_tile:function(ae,ah){var ad=this,ac=ae.html_elt;ae.predisplay_actions();var ag=Math.round((ae.low-(this.is_overview?this.view.max_low:this.view.low))*ah);if(this.left_offset){ag-=this.left_offset}ac.css("left",ag);if(ac.hasClass("remove")){ac.removeClass("remove")}else{this.tiles_div.append(ac)}ac.css("height","auto");this.max_height_px=Math.max(this.max_height_px,ac.height()-2);ac.parent().children().css("height",this.max_height_px+"px");var af=this.max_height_px;if(this.visible_height_px!==0){af=Math.min(this.max_height_px,this.visible_height_px)}this.tiles_div.css("height",af+"px")},tool_region_and_parameters_str:function(af){var ac=this,ae=(af!==undefined?af.toString():"all"),ad=ab.values(ac.tool.get_inputs_dict()).join(", ");return" - region=["+ae+"], parameters=["+ad+"]"},data_and_mode_compatible:function(ac,ad){if(ad==="Auto"){return true}else{if(ad==="Coverage"){return ac.dataset_type==="bigwig"}else{if(ac.dataset_type==="bigwig"||ac.extra_info==="no_detail"){return false}else{return true}}}},can_subset:function(ac){if(ac.message||ac.extra_info==="no_detail"){return false}else{if(ac.dataset_type==="bigwig"){return(ac.data[1][0]-ac.data[0][0]===1)}}return true},init_for_tool_data:function(){this.data_manager.set("data_type","raw_data");this.data_query_wait=1000;this.dataset_check_type="state"}});var W=function(ad,ac){f.call(this,ad,ac,{resize:false,header:false});this.container_div.addClass("label-track")};o(W.prototype,f.prototype,{init:function(){this.enabled=true},predraw_init:function(){},_draw:function(ag){var ae=this.view,af=ae.high-ae.low,aj=Math.floor(Math.pow(10,Math.floor(Math.log(af)/Math.log(10)))),ac=Math.floor(ae.low/aj)*aj,ah=this.view.container.width(),ad=$("<div/>").addClass("label-container");while(ac<ae.high){var ai=(ac-ae.low)/af*ah;ad.append($("<div/>").addClass("label").text(commatize(ac)).css({left:ai}));ac+=aj}this.content_div.children(":first").remove();this.content_div.append(ad)}});var e=function(ad,ac,ag){L.call(this,ad,ac,ag);this.drawables=[];if("drawables" in ag){var af;for(var ae=0;ae<ag.drawables.length;ae++){af=ag.drawables[ae];this.drawables[ae]=n(af,ad,null);if(af.left_offset>this.left_offset){this.left_offset=af.left_offset}}this.enabled=true}ab.each(this.drawables,function(ah){if(ah instanceof c||ah instanceof S){ah.change_mode("Coverage")}});this.update_icons();this.obj_type="CompositeTrack"};o(e.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),action_icons_def:[{name:"composite_icon",title:"Show individual tracks",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_group()}}].concat(L.prototype.action_icons_def),to_dict:y.prototype.to_dict,add_drawable:y.prototype.add_drawable,unpack_drawables:y.prototype.unpack_drawables,config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},on_resize:function(){var ac=this.visible_height_px;ab.each(this.drawables,function(ad){ad.visible_height_px=ac});f.prototype.on_resize.call(this)},change_mode:function(ac){L.prototype.change_mode.call(this,ac);for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad].change_mode(ac)}},init:function(){var ae=[];for(var ad=0;ad<this.drawables.length;ad++){ae.push(this.drawables[ad].init())}var ac=this;$.when.apply($,ae).then(function(){ac.enabled=true;ac.request_draw()})},update_icons:function(){this.action_icons.filters_icon.hide();this.action_icons.tools_icon.hide();this.action_icons.param_space_viz_icon.hide()},can_draw:p.prototype.can_draw,_get_drawables:function(){return this.drawables},show_group:function(){var af=new N(this.view,this.container,{name:this.config.get_value("name")}),ac;for(var ae=0;ae<this.drawables.length;ae++){ac=this.drawables[ae];ac.update_icons();af.add_drawable(ac);ac.container=af;af.content_div.append(ac.container_div)}var ad=this.container.replace_drawable(this,af,true);af.request_draw({clear_tile_cache:true})},before_draw:function(){var ad=ab.min(ab.map(this.drawables,function(ae){return ae.config.get_value("min_value")})),ac=ab.max(ab.map(this.drawables,function(ae){return ae.config.get_value("max_value")}));this.config.set_value("min_value",ad);this.config.set_value("max_value",ac);ab.each(this.drawables,function(ae){ae.config.set_value("min_value",ad);ae.config.set_value("max_value",ac)})},update_all_min_max:function(){var ad=this,ac=this.config.get_value("min_value"),ae=this.config.get_value("max_value");ab.each(this.drawables,function(af){af.config.set_value("min_value",ac);af.config.set_value("max_value",ae)});this.request_draw({clear_tile_cache:true})},postdraw_actions:function(ai,ac,al,ah){var ag=-1,ae;for(ae=0;ae<ai.length;ae++){var aj=ai[ae].html_elt.find("canvas").height();if(aj>ag){ag=aj}}for(ae=0;ae<ai.length;ae++){var af=ai[ae];if(af.html_elt.find("canvas").height()!==ag){this.draw_helper(af.region,al,{force:true,height:ag});af.html_elt.remove()}}var ad=this,ak=function(){ad.update_all_min_max()};this._add_yaxis_label("min",ak);this._add_yaxis_label("max",ak)}});var B=function(ac){L.call(this,ac,{content_div:ac.top_labeltrack},{resize:false,header:false});this.left_offset=ac.canvas_manager.char_width_px;this.container_div.addClass("reference-track");this.data_url=galaxy_config.root+"api/genomes/"+this.view.dbkey;this.data_url_extra_params={reference:true};this.data_manager=new w.GenomeReferenceDataManager({data_url:this.data_url,can_subset:this.can_subset});this.hide_contents()};o(B.prototype,p.prototype,L.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"height",type:"int",default_value:13,hidden:true}]),init:function(){this.data_manager.clear();this.enabled=true},predraw_init:function(){},can_draw:p.prototype.can_draw,draw_helper:function(af,ah,ad){var ac=this.tiles_div.is(":visible"),ag,ae=null;if(ah>this.view.canvas_manager.char_width_px){this.tiles_div.show();ag=true;ae=L.prototype.draw_helper.call(this,af,ah,ad)}else{ag=false;this.tiles_div.hide()}if(ac!==ag){this.view.resize_viewport()}return ae},can_subset:function(ac){return true},draw_tile:function(ae,ak,af,ah,al){var ad=this.data_manager.subset_entry(ae,ah),aj=ad.data;var ac=ak.canvas;ak.font=ak.canvas.manager.default_font;ak.textAlign="center";for(var ag=0,ai=aj.length;ag<ai;ag++){ak.fillStyle=this.view.get_base_color(aj[ag]);ak.fillText(aj[ag],Math.floor(ag*al),10)}return new b(this,ah,al,ac,ad)}});var g=function(ad,ac,ae){this.mode="Histogram";L.call(this,ad,ac,ae)};o(g.prototype,p.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Color",type:"color"},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},before_draw:function(){},draw_tile:function(ac,ad,af,ae,ag){return this._draw_line_track_tile(ac,ad,af,ae,ag)},can_subset:function(ac){return(ac.data[1][0]-ac.data[0][0]===1)},postdraw_actions:function(ad,ae,af,ac){this._add_yaxis_label("max");this._add_yaxis_label("min")}});var r=function(ad,ac,ae){this.mode="Heatmap";L.call(this,ad,ac,ae)};o(r.prototype,p.prototype,L.prototype,{display_modes:["Heatmap"],config_params:ab.union(p.prototype.config_params,[{key:"pos_color",label:"Positive Color",type:"color",default_value:"#FF8C00"},{key:"neg_color",label:"Negative Color",type:"color",default_value:"#4169E1"},{key:"min_value",label:"Min Value",type:"float",default_value:-1},{key:"max_value",label:"Max Value",type:"float",default_value:1},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:500,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.DiagonalHeatmapPainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new b(this,ag,ai,af,ac.data)}});var c=function(ad,ac,ae){L.call(this,ad,ac,ae);this.container_div.addClass("feature-track");this.summary_draw_height=30;this.slotters={};this.start_end_dct={};this.left_offset=200;this.set_painter_from_config()};o(c.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Block color",type:"color"},{key:"reverse_strand_color",label:"Antisense strand color",type:"color"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true,help:"Show the number of items in each bin when drawing summary histogram"},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"connector_style",label:"Connector style",type:"select",default_value:"fishbones",options:[{label:"Line with arrows",value:"fishbone"},{label:"Arcs",value:"arcs"}]},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.set_painter_from_config();this.request_draw({clear_tile_cache:true})},set_painter_from_config:function(){if(this.config.get_value("connector_style")==="arcs"){this.painter=J.ArcLinkedFeaturePainter}else{this.painter=J.LinkedFeaturePainter}},postdraw_actions:function(ao,af,aq,an){L.prototype.postdraw_actions.call(this,ao,af,aq,an);var ah=this,ai,am=ab.filter(ao,function(ar){return(ar instanceof K)});if(am.length===0){var ac={};ab.each(ab.pluck(ao,"incomplete_features"),function(ar){ab.each(ar,function(at){ac[at[0]]=at})});var ap=this;ab.each(ao,function(av){var aw=ab.omit(ac,ab.map(av.incomplete_features,function(ay){return ay[0]}));aw=ab.omit(aw,ab.keys(av.other_tiles_features_drawn));if(ab.size(aw)!==0){var at={data:ab.values(aw)},au=ap.view.canvas_manager.new_canvas(),ar=au.getContext("2d");au.height=Math.max(av.canvas.height,ap.get_canvas_height(at,av.mode,av.w_scale,100));au.width=av.canvas.width;ar.drawImage(av.canvas,0,0);ar.translate(ah.left_offset,0);var ax=ap.draw_tile(at,ar,av.mode,av.region,av.w_scale,av.seq_data);$(av.canvas).replaceWith($(ax.canvas));av.canvas=au;ab.extend(av.other_tiles_features_drawn,ac)}})}if(ah.filters_manager){var ag=ah.filters_manager.filters,ak;for(ak=0;ak<ag.length;ak++){ag[ak].update_ui_elt()}var aj=false,al,ae;for(ai=0;ai<ao.length;ai++){if(ao[ai].data.length){al=ao[ai].data[0];for(ak=0;ak<ag.length;ak++){ae=ag[ak];if(ae.applies_to(al)&&ae.min!==ae.max){aj=true;break}}}}if(ah.filters_available!==aj){ah.filters_available=aj;if(!ah.filters_available){ah.filters_manager.hide()}ah.update_icons()}}if(ao[0] instanceof M){var ad=true;for(ai=0;ai<ao.length;ai++){if(!ao[ai].all_slotted){ad=false;break}}this.action_icons.show_more_rows_icon.toggle(!ad)}else{this.action_icons.show_more_rows_icon.hide()}},update_auto_mode:function(ac){if(this.mode==="Auto"){if(ac==="no_detail"){ac="feature spans"}this.action_icons.mode_icon.attr("title","Set display mode (now: Auto/"+ac+")")}},incremental_slots:function(ag,ac,af){var ad=this.view.canvas_manager.dummy_context,ae=this.slotters[ag];if(!ae||(ae.mode!==af)){ae=new (s.FeatureSlotter)(ag,af,z,function(ah){return ad.measureText(ah)});this.slotters[ag]=ae}return ae.slot_features(ac)},get_mode:function(ac){if(ac.extra_info==="no_detail"||this.is_overview){mode="no_detail"}else{if(this.view.high-this.view.low>G){mode="Squish"}else{mode="Pack"}}return mode},get_canvas_height:function(ac,ag,ah,ad){if(ag==="Coverage"||ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var af=this.incremental_slots(ah,ac.data,ag);var ae=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return Math.max(this.min_height_px,ae.get_required_height(af,ad))}},draw_tile:function(an,at,aq,ag,ak,af,ao){var ar=this,ae=at.canvas,az=ag.get("start"),ad=ag.get("end"),ah=this.left_offset;if(an.dataset_type==="bigwig"){return this._draw_line_track_tile(an,at,aq,ag,ak)}var aj=[],ap=this.slotters[ak].slots;all_slotted=true;if(an.data){var al=this.filters_manager.filters;for(var au=0,aw=an.data.length;au<aw;au++){var ai=an.data[au];var av=false;var am;for(var ay=0,aD=al.length;ay<aD;ay++){am=al[ay];am.update_attrs(ai);if(!am.keep(ai)){av=true;break}}if(!av){aj.push(ai);if(!(ai[0] in ap)){all_slotted=false}}}}var aC=(this.filters_manager.alpha_filter?new C(this.filters_manager.alpha_filter):null),aA=(this.filters_manager.height_filter?new C(this.filters_manager.height_filter):null),aB=new (this.painter)(aj,az,ad,this.config.to_key_value_dict(),aq,aC,aA,af,function(aE){return ar.view.get_base_color(aE)});var ax=null;at.fillStyle=this.config.get_value("block_color");at.font=at.canvas.manager.default_font;at.textAlign="right";if(an.data){var ac=aB.draw(at,ae.width,ae.height,ak,ap);ax=ac.feature_mapper;incomplete_features=ac.incomplete_features;ax.translation=-ah}if(!ao){return new M(ar,ag,ak,ae,an.data,aq,an.message,all_slotted,ax,incomplete_features,af)}}});var Z=function(ad,ac,ae){L.call(this,ad,ac,ae);this.painter=J.VariantPainter;this.summary_draw_height=30;this.left_offset=30};o(Z.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Histogram color",type:"color"},{key:"show_sample_data",label:"Show sample data",type:"bool",default_value:true},{key:"show_labels",label:"Show summary and sample labels",type:"bool",default_value:true},{key:"summary_height",label:"Locus summary height",type:"float",default_value:20},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,af,ah,ag,ai){if(ac.dataset_type==="bigwig"){return this._draw_line_track_tile(ac,af,"Histogram",ag,ai)}else{var ae=this.view,ad=new (this.painter)(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah,function(aj){return ae.get_base_color(aj)});ad.draw(af,af.canvas.width,af.canvas.height,ai);return new b(this,ag,ai,af.canvas,ac.data)}},get_canvas_height:function(ac,ag,ah,ae){if(ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var ad=(this.dataset.get_metadata("sample_names")?this.dataset.get_metadata("sample_names").length:0);if(ad===0&&ac.data.length!==0){ad=ac.data[0][7].match(/,/g);if(ad===null){ad=1}else{ad=ad.length+1}}var af=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return af.get_required_height(ad)}},predraw_init:function(){var ac=[f.prototype.predraw_init.call(this)];if(!this.dataset.get_metadata("sample_names")){ac.push(this.dataset.fetch())}return ac},postdraw_actions:function(ag,ah,aj,ad){L.prototype.postdraw_actions.call(this,ag,ah,aj,ad);var af=ab.filter(ag,function(ak){return(ak instanceof K)});var ae=this.dataset.get_metadata("sample_names");if(af.length===0&&this.config.get_value("show_labels")&&ae&&ae.length>1){var ac;if(this.container_div.find(".yaxislabel.variant").length===0){ac=this.config.get_value("summary_height")/2;this.tiles_div.prepend($("<div/>").text("Summary").addClass("yaxislabel variant top").css({"font-size":ac+"px",top:(this.config.get_value("summary_height")-ac)/2+"px"}));if(this.config.get_value("show_sample_data")){var ai=ae.join("<br/>");this.tiles_div.prepend($("<div/>").html(ai).addClass("yaxislabel variant top sample").css({top:this.config.get_value("summary_height")}))}}ac=(this.mode==="Squish"?5:10)+"px";$(this.tiles_div).find(".sample").css({"font-size":ac,"line-height":ac});$(this.tiles_div).find(".yaxislabel").css("color",this.config.get_value("label_color"))}else{this.container_div.find(".yaxislabel.variant").remove()}}});var S=function(ad,ac,ae){c.call(this,ad,ac,ae);this.painter=J.ReadPainter;this.update_icons()};o(S.prototype,p.prototype,L.prototype,c.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Histogram color",type:"color"},{key:"detail_block_color",label:"Sense strand block color",type:"color",default_value:"#AAAAAA"},{key:"reverse_strand_color",label:"Antisense strand block color",type:"color",default_value:"#DDDDDD"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})}});var d={CompositeTrack:e,DrawableGroup:N,DiagonalHeatmapTrack:r,FeatureTrack:c,LineTrack:g,ReadTrack:S,VariantTrack:Z,VcfTrack:Z};var n=function(ae,ad,ac){if("copy" in ae){return ae.copy(ac)}else{var af=ae.obj_type;if(!af){af=ae.track_type}return new d[af](ad,ac,ae)}};return{TracksterView:Y,DrawableGroup:N,LineTrack:g,FeatureTrack:c,DiagonalHeatmapTrack:r,ReadTrack:S,VariantTrack:Z,CompositeTrack:e,object_from_template:n}});
\ No newline at end of file
+define(["libs/underscore","viz/visualization","viz/viz_views","viz/trackster/util","viz/trackster/slotting","viz/trackster/painters","viz/trackster/filters","mvc/data","mvc/tools","utils/config"],function(ab,w,V,j,s,J,h,X,P,R){var o=ab.extend;var l={};var i=function(ac,ad){l[ac.attr("id")]=ad};var k=function(ac,ad,af,ae){af=".group";l[ac.attr("id")]=ae;ac.bind("drag",{handle:"."+ad,relative:true},function(an,ao){var am=$(this),ar=$(this).parent(),aj=ar.children(".track,.group"),al=l[$(this).attr("id")],ai,ah,ap,ag,ak;ah=$(this).parents(af);if(ah.length!==0){ap=ah.position().top;ag=ap+ah.outerHeight();var aq=l[ah.attr("id")];if(ao.offsetY<ap){$(this).insertBefore(ah);aq.remove_drawable(al);aq.container.add_drawable_before(al,aq);return}else{if(ao.offsetY>ag){$(this).insertAfter(ah);aq.remove_drawable(al);aq.container.add_drawable(al);return}}}ah=null;for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));ap=ai.position().top;ag=ap+ai.outerHeight();if(ai.is(af)&&this!==ai.get(0)&&ao.offsetY>=ap&&ao.offsetY<=ag){if(ao.offsetY-ap<ag-ao.offsetY){ai.find(".content-div").prepend(this)}else{ai.find(".content-div").append(this)}if(al.container){al.container.remove_drawable(al)}l[ai.attr("id")].add_drawable(al);return}}for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));if(ao.offsetY<ai.position().top&&!(ai.hasClass("reference-track")||ai.hasClass("intro"))){break}}if(ak===aj.length){if(this!==aj.get(ak-1)){ar.append(this);l[ar.attr("id")].move_drawable(al,ak)}}else{if(this!==aj.get(ak)){$(this).insertBefore(aj.get(ak));l[ar.attr("id")].move_drawable(al,(ao.deltaY>0?ak-1:ak))}}}).bind("dragstart",function(){$(this).addClass("dragging")}).bind("dragend",function(){$(this).removeClass("dragging")})};var D=20,z=100,G=12000,Q=400,I=5000,v=100,m="Cannot display dataset due to an error. ",H="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",E="No data for this chrom/contig.",u="Preparing data. This can take a while for a large dataset. If the visualization is saved and closed, preparation will continue in the background.",x="Tool cannot be rerun: ",a="Loading data...",T="Ready for display",O=10,F=20,A=["Histogram","Line","Filled","Intensity"];function U(ad,ac){if(!ac){ac=0}var ae=Math.pow(10,ac);return Math.round(ad*ae)/ae}var p=function(ad,ac,ag){if(!p.id_counter){p.id_counter=0}this.id=p.id_counter++;this.view=ad;this.container=ac;this.drag_handle_class=ag.drag_handle_class;this.is_overview=false;this.action_icons={};this.config=R.ConfigSettingCollection.from_models_and_saved_values(this.config_params,ag.prefs);if(!this.config.get_value("name")){this.config.set_value("name",ag.name)}if(this.config_onchange){this.config.on("change",this.config_onchange,this)}this.container_div=this.build_container_div();this.header_div=null;if(ag.header!==false){var ae=new V.TrackHeaderView({model:this,id:this.id});this.header_div=ae.$el;this.container_div.append(this.header_div);var af=ae.icons_div;this.action_icons=ae.action_icons;this.container_div.hover(function(){af.show()},function(){af.hide()})}};p.prototype.action_icons_def=[{name:"toggle_icon",title:"Hide/show content",css_class:"toggle",on_click_fn:function(ac){if(ac.config.get_value("content_visible")){ac.action_icons.toggle_icon.addClass("toggle-expand").removeClass("toggle");ac.hide_contents();ac.config.set_value("content_visible",false)}else{ac.action_icons.toggle_icon.addClass("toggle").removeClass("toggle-expand");ac.config.set_value("content_visible",true);ac.show_contents()}}},{name:"settings_icon",title:"Edit settings",css_class:"gear",on_click_fn:function(ad){var ac=new R.ConfigSettingCollectionView({collection:ad.config});ac.render_in_modal("Configure Track")}},{name:"remove_icon",title:"Remove",css_class:"remove-icon",on_click_fn:function(ac){$(".tooltip").remove();ac.remove()}}];o(p.prototype,{config_params:[{key:"name",label:"Name",type:"text",default_value:""},{key:"content_visible",type:"bool",default_value:true,hidden:true}],config_onchange:function(){},init:function(){},changed:function(){this.view.changed()},can_draw:function(){if(this.enabled&&this.config.get_value("content_visible")){return true}return false},request_draw:function(){},_draw:function(ac){},to_dict:function(){},set_name:function(ac){this.old_name=this.config.get_value("name");this.config.set_value("name",ac)},revert_name:function(){if(this.old_name){this.config.set_value("name",this.old_name)}},remove:function(){this.changed();this.container.remove_drawable(this);var ac=this.view;this.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})},build_container_div:function(){},update_icons:function(){},hide_contents:function(){},show_contents:function(){},get_drawables:function(){}});var y=function(ad,ac,ae){p.call(this,ad,ac,ae);this.obj_type=ae.obj_type;this.drawables=[]};o(y.prototype,p.prototype,{unpack_drawables:function(ae){this.drawables=[];var ad;for(var ac=0;ac<ae.length;ac++){ad=n(ae[ac],this.view,this);this.add_drawable(ad)}},init:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].init()}},_draw:function(ac){for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad]._draw(ac)}},to_dict:function(){var ad=[];for(var ac=0;ac<this.drawables.length;ac++){ad.push(this.drawables[ac].to_dict())}return{prefs:this.config.to_key_value_dict(),obj_type:this.obj_type,drawables:ad}},add_drawable:function(ac){this.drawables.push(ac);ac.container=this;this.changed()},add_drawable_before:function(ae,ac){this.changed();var ad=this.drawables.indexOf(ac);if(ad!==-1){this.drawables.splice(ad,0,ae);return true}return false},replace_drawable:function(ae,ac,ad){var af=this.drawables.indexOf(ae);if(af!==-1){this.drawables[af]=ac;if(ad){ae.container_div.replaceWith(ac.container_div)}this.changed()}return af},remove_drawable:function(ad){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);ad.container=null;this.changed();return true}return false},move_drawable:function(ad,ae){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);this.drawables.splice(ae,0,ad);this.changed();return true}return false},get_drawables:function(){return this.drawables},get_tracks:function(af){var ac=this.drawables.slice(0),ad=[],ae;while(ac.length!==0){ae=ac.shift();if(ae instanceof af){ad.push(ae)}else{if(ae.drawables){ac=ac.concat(ae.drawables)}}}return ad}});var N=function(ad,ac,af){o(af,{obj_type:"DrawableGroup",drag_handle_class:"group-handle"});y.call(this,ad,ac,af);this.content_div=$("<div/>").addClass("content-div").attr("id","group_"+this.id+"_content_div").appendTo(this.container_div);i(this.container_div,this);i(this.content_div,this);k(this.container_div,this.drag_handle_class,".group",this);this.filters_manager=new h.FiltersManager(this);this.header_div.after(this.filters_manager.parent_div);this.filters_manager.parent_div.after($("<div style='clear: both'/>"));this.saved_filters_managers=[];if("drawables" in af){this.unpack_drawables(af.drawables)}if("filters" in af){var ae=this.filters_manager;this.filters_manager=new h.FiltersManager(this,af.filters);ae.parent_div.replaceWith(this.filters_manager.parent_div);if(af.filters.visible){this.setup_multitrack_filtering()}}};o(N.prototype,p.prototype,y.prototype,{action_icons_def:[p.prototype.action_icons_def[0],p.prototype.action_icons_def[1],{name:"composite_icon",title:"Show composite track",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_composite_track()}},{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters();ac._restore_filter_managers()}else{ac.setup_multitrack_filtering();ac.request_draw({clear_tile_cache:true})}ac.filters_manager.toggle()}},p.prototype.action_icons_def[2]],build_container_div:function(){var ac=$("<div/>").addClass("group").attr("id","group_"+this.id);if(this.container){this.container.content_div.append(ac)}return ac},hide_contents:function(){this.tiles_div.hide()},show_contents:function(){this.tiles_div.show();this.request_draw()},update_icons:function(){var ae=this.drawables.length;if(ae===0){this.action_icons.composite_icon.hide();this.action_icons.filters_icon.hide()}else{if(ae===1){this.action_icons.composite_icon.toggle(this.drawables[0] instanceof e);this.action_icons.filters_icon.hide()}else{var al,ak,ai,ao=true,ag=this.drawables[0].get_type(),ac=0;for(al=0;al<ae;al++){ai=this.drawables[al];if(ai.get_type()!==ag){can_composite=false;break}if(ai instanceof c){ac++}}if(ao&&this.drawables[0] instanceof g){this.action_icons.composite_icon.show()}else{this.action_icons.composite_icon.hide();$(".tooltip").remove()}if(ac>1&&ac===this.drawables.length){var ap={},ad;ai=this.drawables[0];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];ap[ad.name]=[ad]}for(al=1;al<this.drawables.length;al++){ai=this.drawables[al];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];if(ad.name in ap){ap[ad.name].push(ad)}}}this.filters_manager.remove_all();var af,ah,aj,am;for(var an in ap){af=ap[an];if(af.length===ac){ah=new h.NumberFilter({name:af[0].name,index:af[0].index});this.filters_manager.add_filter(ah)}}this.action_icons.filters_icon.toggle(this.filters_manager.filters.length>0)}else{this.action_icons.filters_icon.hide()}}}},_restore_filter_managers:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].filters_manager=this.saved_filters_managers[ac]}this.saved_filters_managers=[]},setup_multitrack_filtering:function(){if(this.filters_manager.filters.length>0){this.saved_filters_managers=[];for(var ac=0;ac<this.drawables.length;ac++){drawable=this.drawables[ac];this.saved_filters_managers.push(drawable.filters_manager);drawable.filters_manager=this.filters_manager}}this.filters_manager.init_filters()},show_composite_track:function(){var ad=new e(this.view,this.view,{name:this.config.get_value("name"),drawables:this.drawables});var ac=this.container.replace_drawable(this,ad,true);ad.request_draw()},add_drawable:function(ac){y.prototype.add_drawable.call(this,ac);this.update_icons()},remove_drawable:function(ac){y.prototype.remove_drawable.call(this,ac);this.update_icons()},to_dict:function(){if(this.filters_manager.visible()){this._restore_filter_managers()}var ac=o(y.prototype.to_dict.call(this),{filters:this.filters_manager.to_dict()});if(this.filters_manager.visible()){this.setup_multitrack_filtering()}return ac},request_draw:function(ac){ab.each(this.drawables,function(ad){ad.request_draw(ac)})}});var Y=Backbone.View.extend({initialize:function(ac){o(ac,{obj_type:"View"});y.call(this,"View",ac.container,ac);this.chrom=null;this.vis_id=ac.vis_id;this.dbkey=ac.dbkey;this.label_tracks=[];this.tracks_to_be_redrawn=[];this.max_low=0;this.max_high=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.load_chroms_deferred=null;this.render();this.canvas_manager=new w.CanvasManager(this.container.get(0).ownerDocument);this.reset();this.config=R.ConfigSettingCollection.from_models_and_saved_values([{key:"name",label:"Name",type:"text",default_value:""},{key:"a_color",label:"A Color",type:"color",default_value:"#FF0000"},{key:"c_color",label:"C Color",type:"color",default_value:"#00FF00"},{key:"g_color",label:"G Color",type:"color",default_value:"#0000FF"},{key:"t_color",label:"T Color",type:"color",default_value:"#FF00FF"},{key:"n_color",label:"N Color",type:"color",default_value:"#AAAAAA"}],{name:ac.name})},render:function(){this.requested_redraw=false;var ae=this.container,ac=this;this.top_container=$("<div/>").addClass("top-container").appendTo(ae);this.browser_content_div=$("<div/>").addClass("content").appendTo(ae);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(ae);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").attr("id","viewport-container").appendTo(this.browser_content_div);this.content_div=this.viewport_container;i(this.viewport_container,ac);this.intro_div=$("<div/>").addClass("intro").appendTo(this.viewport_container);var af=$("<div/>").text("Add Datasets to Visualization").addClass("action-button").appendTo(this.intro_div).click(function(){w.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",{"f-dbkey":ac.dbkey},function(ag){ab.each(ag,function(ah){ac.add_drawable(n(ah,ac,ac))})})});this.nav_container=$("<div/>").addClass("trackster-nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("trackster-nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a/>").attr("title","Close overview").addClass("icon-button overview-close tooltip").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_select=$("<select/>").attr({name:"chrom"}).addClass("chrom-nav").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var ad=function(ag){if(ag.type==="focusout"||(ag.keyCode||ag.which)===13||(ag.keyCode||ag.which)===27){if((ag.keyCode||ag.which)!==27){ac.go_to($(this).val())}$(this).hide();$(this).val("");ac.location_span.show();ac.chrom_select.show()}ag.stopPropagation()};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",ad).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").attr("title","Click to change location").tooltip({placement:"bottom"}).appendTo(this.nav_controls);this.location_span.click(function(){ac.location_span.hide();ac.chrom_select.hide();ac.nav_input.val(ac.chrom+":"+ac.low+"-"+ac.high);ac.nav_input.css("display","inline-block");ac.nav_input.select();ac.nav_input.focus();ac.nav_input.autocomplete({source:function(ai,ag){var aj=[],ah=$.map(ac.get_tracks(c),function(ak){return ak.data_manager.search_features(ai.term).success(function(al){aj=aj.concat(al)})});$.when.apply($,ah).done(function(){ag($.map(aj,function(ak){return{label:ak[0],value:ak[1]}}))})},minLength:2})});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a/>").attr("id","zoom-out").attr("title","Zoom out").tooltip({placement:"bottom"}).click(function(){ac.zoom_out()}).appendTo(this.nav_controls);this.zi_link=$("<a/>").attr("id","zoom-in").attr("title","Zoom in").tooltip({placement:"bottom"}).click(function(){ac.zoom_in()}).appendTo(this.nav_controls);this.load_chroms_deferred=this.load_chroms({low:0});this.chrom_select.bind("change",function(){ac.change_chrom(ac.chrom_select.val())});this.browser_content_div.click(function(ag){$(this).find("input").trigger("blur")});this.browser_content_div.bind("dblclick",function(ag){ac.zoom_in(ag.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(ag,ah){this.current_x=ah.offsetX}).bind("drag",function(ag,ai){var aj=ai.offsetX-this.current_x;this.current_x=ai.offsetX;var ah=Math.round(aj/ac.viewport_container.width()*(ac.max_high-ac.max_low));ac.move_delta(-ah)});this.overview_close.click(function(){ac.reset_overview()});this.viewport_container.bind("draginit",function(ag,ah){if(ag.clientX>ac.viewport_container.width()-16){return false}}).bind("dragstart",function(ag,ah){ah.original_low=ac.low;ah.current_height=ag.clientY;ah.current_x=ah.offsetX}).bind("drag",function(ai,ak){var ag=$(this);var al=ak.offsetX-ak.current_x;var ah=ag.scrollTop()-(ai.clientY-ak.current_height);ag.scrollTop(ah);ak.current_height=ai.clientY;ak.current_x=ak.offsetX;var aj=Math.round(al/ac.viewport_container.width()*(ac.high-ac.low));ac.move_delta(aj)});this.top_labeltrack.bind("dragstart",function(ag,ah){return $("<div/>").addClass("zoom-area").css("height",ac.browser_content_div.height()+ac.top_labeltrack.height()+1).appendTo($(this))}).bind("drag",function(ak,al){$(al.proxy).css({left:Math.min(ak.pageX,al.startX)-ac.container.offset().left,width:Math.abs(ak.pageX-al.startX)});var ah=Math.min(ak.pageX,al.startX)-ac.container.offset().left,ag=Math.max(ak.pageX,al.startX)-ac.container.offset().left,aj=(ac.high-ac.low),ai=ac.viewport_container.width();ac.update_location(Math.round(ah/ai*aj)+ac.low,Math.round(ag/ai*aj)+ac.low)}).bind("dragend",function(al,am){var ah=Math.min(al.pageX,am.startX),ag=Math.max(al.pageX,am.startX),aj=(ac.high-ac.low),ai=ac.viewport_container.width(),ak=ac.low;ac.low=Math.round(ah/ai*aj)+ak;ac.high=Math.round(ag/ai*aj)+ak;$(am.proxy).remove();ac.request_redraw()});this.add_label_track(new W(this,{content_div:this.top_labeltrack}));$(window).bind("resize",function(){if(this.resize_timer){clearTimeout(this.resize_timer)}this.resize_timer=setTimeout(function(){ac.resize_window()},500)});$(document).bind("redraw",function(){ac.redraw()});this.reset();$(window).trigger("resize")},get_base_color:function(ac){return this.config.get_value(ac.toLowerCase()+"_color")||this.config.get_value("n_color")}});o(Y.prototype,y.prototype,{changed:function(){this.has_changes=true},update_intro_div:function(){this.intro_div.toggle(this.drawables.length===0)},trigger_navigate:function(ad,af,ac,ag){if(this.timer){clearTimeout(this.timer)}if(ag){var ae=this;this.timer=setTimeout(function(){ae.trigger("navigate",ad+":"+af+"-"+ac)},500)}else{view.trigger("navigate",ad+":"+af+"-"+ac)}},update_location:function(ac,ae){this.location_span.text(commatize(ac)+" - "+commatize(ae));this.nav_input.val(this.chrom+":"+commatize(ac)+"-"+commatize(ae));var ad=view.chrom_select.val();if(ad!==""){this.trigger_navigate(ad,view.low,view.high,true)}},load_chroms:function(ae){ae.num=v;var ac=this,ad=$.Deferred();$.ajax({url:galaxy_config.root+"api/genomes/"+this.dbkey,data:ae,dataType:"json",success:function(ag){if(ag.chrom_info.length===0){return}if(ag.reference){var ah=new B(ac);ac.add_label_track(ah);ac.reference_track=ah}ac.chrom_data=ag.chrom_info;var ak='<option value="">Select Chrom/Contig</option>';for(var aj=0,af=ac.chrom_data.length;aj<af;aj++){var ai=ac.chrom_data[aj].chrom;ak+='<option value="'+ai+'">'+ai+"</option>"}if(ag.prev_chroms){ak+='<option value="previous">Previous '+v+"</option>"}if(ag.next_chroms){ak+='<option value="next">Next '+v+"</option>"}ac.chrom_select.html(ak);ac.chrom_start_index=ag.start_index;ad.resolve(ag.chrom_info)},error:function(){alert("Could not load chroms for this dbkey: "+ac.dbkey)}});return ad},change_chrom:function(ah,ad,aj){var ae=this;if(!ae.chrom_data){ae.load_chroms_deferred.then(function(){ae.change_chrom(ah,ad,aj)});return}if(!ah||ah==="None"){return}if(ah==="previous"){ae.load_chroms({low:this.chrom_start_index-v});return}if(ah==="next"){ae.load_chroms({low:this.chrom_start_index+v});return}var ai=$.grep(ae.chrom_data,function(ak,al){return ak.chrom===ah})[0];if(ai===undefined){ae.load_chroms({chrom:ah},function(){ae.change_chrom(ah,ad,aj)});return}else{if(ah!==ae.chrom){ae.chrom=ah;ae.chrom_select.val(ae.chrom);ae.max_high=ai.len-1;ae.reset();for(var ag=0,ac=ae.drawables.length;ag<ac;ag++){var af=ae.drawables[ag];if(af.init){af.init()}}if(ae.reference_track){ae.reference_track.init()}}if(ad===undefined&&aj===undefined){ae.low=0;ae.high=ae.max_high}else{ae.low=(ad!==undefined?Math.max(ad,0):0);if(aj===undefined){ae.low=Math.max(ae.low-15,0);ae.high=ae.low+30}else{ae.high=Math.min(aj,ae.max_high)}}ae.request_redraw()}},go_to:function(ag){ag=ag.replace(/,/g,"");ag=ag.replace(/:|\-/g," ");var ad=ag.split(/\s+/),af=ad[0],ae=(ad[1]?parseInt(ad[1],10):undefined),ac=(ad[2]?parseInt(ad[2],10):undefined);this.change_chrom(af,ae,ac)},move_fraction:function(ae){var ac=this;var ad=ac.high-ac.low;this.move_delta(ae*ad)},move_delta:function(af){var ac=this;var ae=ac.high-ac.low;if(ac.low-af<ac.max_low){ac.low=ac.max_low;ac.high=ac.max_low+ae}else{if(ac.high-af>ac.max_high){ac.high=ac.max_high;ac.low=ac.max_high-ae}else{ac.high-=af;ac.low-=af}}ac.request_redraw({data_fetch:false});if(this.redraw_on_move_fn){clearTimeout(this.redraw_on_move_fn)}this.redraw_on_move_fn=setTimeout(function(){ac.request_redraw()},200);var ad=ac.chrom_select.val();this.trigger_navigate(ad,ac.low,ac.high,true)},add_drawable:function(ad){y.prototype.add_drawable.call(this,ad);ad.init();this.changed();this.update_intro_div();var ac=this;ad.config.on("change",function(){ac.changed()})},add_label_track:function(ac){ac.view=this;ac.init();this.label_tracks.push(ac)},remove_drawable:function(ae,ad){y.prototype.remove_drawable.call(this,ae);if(ad){var ac=this;ae.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})}},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},request_redraw:function(ad,ae){var ac=this,af=(ae?[ae]:ac.drawables);ab.each(af,function(ag){var ah=ab.find(ac.tracks_to_be_redrawn,function(ai){return ai[0]===ag});if(ah){ah[1]=ad}else{ac.tracks_to_be_redrawn.push([ag,ad])}});if(!this.requested_redraw){requestAnimationFrame(function(){ac._redraw()});this.requested_redraw=true}},_redraw:function(){this.requested_redraw=false;var ac=this.low,ag=this.high;if(ac<this.max_low){ac=this.max_low}if(ag>this.max_high){ag=this.max_high}var ad=this.high-this.low;if(this.high!==0&&ad<this.min_separation){ag=ac+this.min_separation}this.low=Math.floor(ac);this.high=Math.ceil(ag);this.update_location(this.low,this.high);this.resolution_px_b=this.viewport_container.width()/(this.high-this.low);var af=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ah=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ae=13;this.overview_box.css({left:af,width:Math.max(ae,ah)}).show();if(ah<ae){this.overview_box.css("left",af-(ae-ah)/2)}if(this.overview_highlight){this.overview_highlight.css({left:af,width:ah})}ab.each(this.tracks_to_be_redrawn,function(ak){var ai=ak[0],aj=ak[1];if(ai){ai._draw(aj)}});this.tracks_to_be_redrawn=[];ab.each(this.label_tracks,function(ai){ai._draw()})},zoom_in:function(ad,ae){if(this.max_high===0||this.high-this.low<=this.min_separation){return}var af=this.high-this.low,ag=af/2+this.low,ac=(af/this.zoom_factor)/2;if(ad){ag=ad/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(ag-ac);this.high=Math.round(ag+ac);this.changed();this.request_redraw()},zoom_out:function(){if(this.max_high===0){return}var ad=this.high-this.low,ae=ad/2+this.low,ac=(ad*this.zoom_factor)/2;this.low=Math.round(ae-ac);this.high=Math.round(ae+ac);this.changed();this.request_redraw()},resize_viewport:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height())},resize_window:function(){this.resize_viewport();this.request_redraw()},set_overview:function(ae){if(this.overview_drawable){if(this.overview_drawable.dataset.id===ae.dataset.id){return}this.overview_viewport.find(".track").remove()}var ad=ae.copy({content_div:this.overview_viewport}),ac=this;ad.header_div.hide();ad.is_overview=true;ac.overview_drawable=ad;this.overview_drawable.postdraw_actions=function(){ac.overview_highlight.show().height(ac.overview_drawable.content_div.height());ac.overview_viewport.height(ac.overview_drawable.content_div.height()+ac.overview_box.outerHeight());ac.overview_close.show();ac.resize_window()};ac.overview_drawable.request_draw();this.changed()},reset_overview:function(){$(".tooltip").remove();this.overview_viewport.find(".track-tile").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide();view.resize_window();view.overview_drawable=null}});var q=P.Tool.extend({defaults:{track:null},initialize:function(ac){P.Tool.prototype.initialize.call(this,ac);var ad=true;if(ac.tool_state!==undefined&&ac.tool_state.hidden!==undefined){ad=ac.tool_state.hidden}this.set("hidden",ad);this.remove_inputs(["data","hidden_data","conditional"])},state_dict:function(ac){return ab.extend(this.get_inputs_dict(),{hidden:!this.is_visible()})}});var t=Backbone.View.extend({events:{"change :input":"update_value"},render:function(){var ae=this.$el.addClass("param-row"),af=this.model;var ac=$("<div>").addClass("param-label").text(af.get("label")).appendTo(ae);var ad=$("<div/>").addClass("param-input").html(af.get("html")).appendTo(ae);ad.find(":input").val(af.get("value"));$("<div style='clear: both;'/>").appendTo(ae)},update_value:function(ac){this.model.set_value($(ac.target).val())}});var aa=Backbone.View.extend({initialize:function(ac){this.model.on("change:hidden",this.set_visible,this)},render:function(){var ad=this;tool=this.model,parent_div=this.$el.addClass("dynamic-tool").hide();parent_div.bind("drag",function(ah){ah.stopPropagation()}).click(function(ah){ah.stopPropagation()}).bind("dblclick",function(ah){ah.stopPropagation()}).keydown(function(ah){ah.stopPropagation()});var ae=$("<div class='tool-name'>").appendTo(parent_div).text(tool.get("name"));tool.get("inputs").each(function(ai){var ah=new t({model:ai});ah.render();parent_div.append(ah.$el)});parent_div.find("input").click(function(){$(this).select()});var af=$("<div>").addClass("param-row").appendTo(parent_div);var ag=$("<input type='submit'>").attr("value","Run on complete dataset").appendTo(af);var ac=$("<input type='submit'>").attr("value","Run on visible region").appendTo(af);ac.click(function(){ad.run_on_region()});ag.click(function(){ad.run_on_dataset()});if(tool.is_visible()){this.$el.show()}},set_visible:function(){this.$el.toggle(this.model.is_visible())},update_params:function(){for(var ac=0;ac<this.params.length;ac++){this.params[ac].update_value()}},run_on_dataset:function(){var ac=this.model;this.run({target_dataset_id:this.model.get("track").dataset.id,action:"rerun",tool_id:ac.id},null,function(ad){Galaxy.modal.show({title:ac.get("name")+" is Running",body:ac.get("name")+" is running on the complete dataset. Tool outputs are in dataset's history.",buttons:{Close:function(){Galaxy.modal.hide()}}})})},run_on_region:function(){var ad=this.model.get("track"),ag=this.model,ai=new w.GenomeRegion({chrom:ad.view.chrom,start:ad.view.low,end:ad.view.high}),aj={target_dataset_id:ad.dataset.id,action:"rerun",tool_id:ag.id,regions:[ai.toJSON()]},ah=ad,al=ag.get("name")+ah.tool_region_and_parameters_str(ai),ac;if(ah.container===view){var ak=new N(view,view,{name:ad.config.get_value("name")});var af=ah.container.replace_drawable(ah,ak,false);ak.container_div.insertBefore(ah.view.content_div.children()[af]);ak.add_drawable(ah);ah.container_div.appendTo(ak.content_div);ac=ak}else{ac=ah.container}var ae=new ah.constructor(view,ac,{name:al,hda_ldda:"hda"});ae.init_for_tool_data();ae.change_mode(ah.mode);ae.set_filters_manager(ah.filters_manager.copy(ae));ae.update_icons();ac.add_drawable(ae);ae.tiles_div.text("Starting job.");this.run(aj,ae,function(am){ae.set_dataset(new X.Dataset(am));ae.tiles_div.text("Running job.");ae.init()})},run:function(ac,ae,af){ac.inputs=this.model.get_inputs_dict();var ad=new j.ServerStateDeferred({ajax_settings:{url:galaxy_config.root+"api/tools",data:JSON.stringify(ac),dataType:"json",contentType:"application/json",type:"POST"},interval:2000,success_fn:function(ag){return ag!=="pending"}});$.when(ad.go()).then(function(ag){if(ag==="no converter"){ae.container_div.addClass("error");ae.content_div.text(H)}else{if(ag.error){ae.container_div.addClass("error");ae.content_div.text(x+ag.message)}else{af(ag)}}})}});var C=function(ac,ad){J.Scaler.call(this,ad);this.filter=ac};C.prototype.gen_val=function(ac){if(this.filter.high===Number.MAX_VALUE||this.filter.low===-Number.MAX_VALUE||this.filter.low===this.filter.high){return this.default_val}return((parseFloat(ac[this.filter.index])-this.filter.low)/(this.filter.high-this.filter.low))};var b=function(ac,af,ag,ad,ae){this.track=ac;this.region=af;this.low=af.get("start");this.high=af.get("end");this.w_scale=ag;this.canvas=ad;this.html_elt=$("<div class='track-tile'/>").append(ad);this.data=ae;this.stale=false};b.prototype.predisplay_actions=function(){};var K=function(ac,af,ag,ad,ae){b.call(this,ac,af,ag,ad,ae)};K.prototype.predisplay_actions=function(){};var M=function(ae,aj,al,ad,ag,ah,am,ac,ai,af,ak){b.call(this,ae,aj,al,ad,ag);this.mode=ah;this.all_slotted=ac;this.feature_mapper=ai;this.has_icons=false;this.incomplete_features=af;this.other_tiles_features_drawn={};this.seq_data=ak};o(M.prototype,b.prototype);M.prototype.predisplay_actions=function(){};var f=function(ad,ac,ae){o(ae,{drag_handle_class:"draghandle"});p.call(this,ad,ac,ae);this.dataset=null;if(ae.dataset){this.dataset=(ae.dataset instanceof Backbone.Model?ae.dataset:new X.Dataset(ae.dataset))}this.dataset_check_type="converted_datasets_state";this.data_url_extra_params={};this.data_query_wait=("data_query_wait" in ae?ae.data_query_wait:I);this.data_manager=("data_manager" in ae?ae.data_manager:new w.GenomeDataManager({dataset:this.dataset,genome:new w.Genome({key:ad.dbkey,chroms_info:{chrom_info:ad.chrom_data}}),data_mode_compatible:this.data_and_mode_compatible,can_subset:this.can_subset}));this.min_height_px=16;this.max_height_px=800;this.visible_height_px=this.config.get_value("height");this.content_div=$("<div class='track-content'>").appendTo(this.container_div);if(this.container){this.container.content_div.append(this.container_div);if(!("resize" in ae)||ae.resize){this.add_resize_handle()}}};o(f.prototype,p.prototype,{action_icons_def:[{name:"mode_icon",title:"Set display mode",css_class:"chevron-expand",on_click_fn:function(){}},p.prototype.action_icons_def[0],{name:"overview_icon",title:"Set as overview",css_class:"application-dock-270",on_click_fn:function(ac){ac.view.set_overview(ac)}},p.prototype.action_icons_def[1],{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters()}else{ac.filters_manager.init_filters()}ac.filters_manager.toggle()}},{name:"tools_icon",title:"Tool",css_class:"hammer",on_click_fn:function(ac){ac.tool.toggle();if(ac.tool.is_visible()){ac.set_name(ac.config.get_value("name")+ac.tool_region_and_parameters_str())}else{ac.revert_name()}$(".tooltip").remove()}},{name:"param_space_viz_icon",title:"Tool parameter space visualization",css_class:"arrow-split",on_click_fn:function(ac){var af='<strong>Tool</strong>: <%= track.tool.get("name") %><br/><strong>Dataset</strong>: <%= track.config.get_value("name") %><br/><strong>Region(s)</strong>: <select name="regions"><option value="cur">current viewing area</option><option value="bookmarks">bookmarks</option><option value="both">current viewing area and bookmarks</option></select>',ae=ab.template(af,{track:ac});var ah=function(){Galaxy.modal.hide();$(window).unbind("keypress.check_enter_esc")},ad=function(){var aj=$('select[name="regions"] option:selected').val(),al,ai=new w.GenomeRegion({chrom:view.chrom,start:view.low,end:view.high}),ak=ab.map($(".bookmark"),function(am){return new w.GenomeRegion({from_str:$(am).children(".position").text()})});if(aj==="cur"){al=[ai]}else{if(aj==="bookmarks"){al=ak}else{al=[ai].concat(ak)}}Galaxy.modal.hide();window.location.href=galaxy_config.root+"visualization/sweepster?"+$.param({dataset_id:ac.dataset.id,hda_ldda:ac.dataset.get("hda_ldda"),regions:JSON.stringify(new Backbone.Collection(al).toJSON())})},ag=function(ai){if((ai.keyCode||ai.which)===27){ah()}else{if((ai.keyCode||ai.which)===13){ad()}}};Galaxy.modal.show({title:"Visualize tool parameter space and output from different parameter settings?",body:ae,buttons:{No:ah,Yes:ad}})}},p.prototype.action_icons_def[2]],can_draw:function(){return this.dataset&&p.prototype.can_draw.call(this)},build_container_div:function(){return $("<div/>").addClass("track").attr("id","track_"+this.id)},set_dataset:function(ac){this.dataset=ac;this.data_manager.set("dataset",ac)},on_resize:function(){this.request_draw({clear_tile_cache:true})},add_resize_handle:function(){var ac=this;var af=false;var ae=false;var ad=$("<div class='track-resize'>");$(ac.container_div).hover(function(){if(ac.config.get_value("content_visible")){af=true;ad.show()}},function(){af=false;if(!ae){ad.hide()}});ad.hide().bind("dragstart",function(ag,ah){ae=true;ah.original_height=$(ac.content_div).height()}).bind("drag",function(ah,ai){var ag=Math.min(Math.max(ai.original_height+ai.deltaY,ac.min_height_px),ac.max_height_px);$(ac.tiles_div).css("height",ag);ac.visible_height_px=(ac.max_height_px===ag?0:ag);ac.on_resize()}).bind("dragend",function(ag,ah){ac.tile_cache.clear();ae=false;if(!af){ad.hide()}ac.config.set_value("height",ac.visible_height_px);ac.changed()}).appendTo(ac.container_div)},hide_contents:function(){this.tiles_div.hide();this.container_div.find(".yaxislabel, .track-resize").hide()},show_contents:function(){this.tiles_div.show();this.container_div.find(".yaxislabel, .track-resize").show();this.request_draw()},get_type:function(){if(this instanceof W){return"LabelTrack"}else{if(this instanceof B){return"ReferenceTrack"}else{if(this instanceof g){return"LineTrack"}else{if(this instanceof S){return"ReadTrack"}else{if(this instanceof Z){return"VariantTrack"}else{if(this instanceof e){return"CompositeTrack"}else{if(this instanceof c){return"FeatureTrack"}}}}}}}return""},show_message:function(ac){this.tiles_div.remove();return $("<span/>").addClass("message").html(ac).appendTo(this.content_div)},init:function(ae){var ad=this;ad.enabled=false;ad.tile_cache.clear();ad.data_manager.clear();ad.content_div.children().remove();ad.container_div.removeClass("nodata error pending");ad.tiles_div=$("<div/>").addClass("tiles").appendTo(ad.content_div);if(!ad.dataset.id){return}var ac=$.Deferred(),af={hda_ldda:ad.dataset.get("hda_ldda"),data_type:this.dataset_check_type,chrom:ad.view.chrom,retry:ae};$.getJSON(this.dataset.url(),af,function(ag){if(!ag||ag==="error"||ag.kind==="error"){ad.container_div.addClass("error");var ah=ad.show_message(m);if(ag.message){ah.append($("<a href='javascript:void(0);'></a>").text("View error").click(function(){Galaxy.modal.show({title:"Trackster Error",body:"<pre>"+ag.message+"</pre>",buttons:{Close:function(){Galaxy.modal.hide()}}})}));ah.append($("<span/>").text(" "));ah.append($("<a href='javascript:void(0);'></a>").text("Try again").click(function(){ad.init(true)}))}}else{if(ag==="no converter"){ad.container_div.addClass("error");ad.show_message(H)}else{if(ag==="no data"||(ag.data!==undefined&&(ag.data===null||ag.data.length===0))){ad.container_div.addClass("nodata");ad.show_message(E)}else{if(ag==="pending"){ad.container_div.addClass("pending");ad.show_message(u);setTimeout(function(){ad.init()},ad.data_query_wait)}else{if(ag==="data"||ag.status==="data"){if(ag.valid_chroms){ad.valid_chroms=ag.valid_chroms;ad.update_icons()}ad.tiles_div.text(T);if(ad.view.chrom){ad.tiles_div.text("");ad.tiles_div.css("height",ad.visible_height_px+"px");ad.enabled=true;$.when.apply($,ad.predraw_init()).done(function(){ac.resolve();ad.container_div.removeClass("nodata error pending");ad.request_draw()})}else{ac.resolve()}}}}}}});this.update_icons();return ac},predraw_init:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(af&&af.min&&af.max){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_default_value("min_value",ae);ac.config.set_default_value("max_value",ag);ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},get_drawables:function(){return this}});var L=function(ae,ad,ag){f.call(this,ae,ad,ag);var ac=this;k(ac.container_div,ac.drag_handle_class,".group",ac);this.filters_manager=new h.FiltersManager(this,("filters" in ag?ag.filters:null));this.data_manager.set("filters_manager",this.filters_manager);this.filters_available=false;this.tool=(ag.tool?new q(ab.extend(ag.tool,{track:this,tool_state:ag.tool_state})):null);this.tile_cache=new w.Cache(O);this.left_offset=0;if(this.header_div){this.set_filters_manager(this.filters_manager);if(this.tool){var af=new aa({model:this.tool});af.render();this.dynamic_tool_div=af.$el;this.header_div.after(this.dynamic_tool_div)}}this.tiles_div=$("<div/>").addClass("tiles").appendTo(this.content_div);if(!this.config.get_value("content_visible")){this.tiles_div.hide()}this.overlay_div=$("<div/>").addClass("overlay").appendTo(this.content_div);if(ag.mode){this.change_mode(ag.mode)}};o(L.prototype,p.prototype,f.prototype,{action_icons_def:f.prototype.action_icons_def.concat([{name:"show_more_rows_icon",title:"To minimize track height, not all feature rows are displayed. Click to display more rows.",css_class:"exclamation",on_click_fn:function(ac){$(".tooltip").remove();ac.slotters[ac.view.resolution_px_b].max_rows*=2;ac.request_draw({clear_tile_cache:true})},hide:true}]),copy:function(ac){var ad=this.to_dict();o(ad,{data_manager:this.data_manager});var ae=new this.constructor(this.view,ac,ad);ae.change_mode(this.mode);ae.enabled=this.enabled;return ae},set_filters_manager:function(ac){this.filters_manager=ac;this.header_div.after(this.filters_manager.parent_div)},to_dict:function(){return{track_type:this.get_type(),dataset:{id:this.dataset.id,hda_ldda:this.dataset.get("hda_ldda")},prefs:this.config.to_key_value_dict(),mode:this.mode,filters:this.filters_manager.to_dict(),tool_state:(this.tool?this.tool.state_dict():{})}},set_min_max:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(isNaN(parseFloat(ac.config.get_value("min_value")))||isNaN(parseFloat(ac.config.get_value("max_value")))){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},change_mode:function(ad){var ac=this;ac.mode=ad;ac.config.set_value("mode",ad);if(ad==="Auto"){this.data_manager.clear()}ac.request_draw({clear_tile_cache:true});this.action_icons.mode_icon.attr("title","Set display mode (now: "+ac.mode+")");return ac},update_icons:function(){var ac=this;ac.action_icons.filters_icon.toggle(ac.filters_available);ac.action_icons.tools_icon.toggle(ac.tool!==null);ac.action_icons.param_space_viz_icon.toggle(ac.tool!==null)},_gen_tile_cache_key:function(ad,ac){return ad+"_"+ac},request_draw:function(ac){if(ac&&ac.clear_tile_cache){this.tile_cache.clear()}this.view.request_redraw(ac,this)},before_draw:function(){this.max_height_px=0},_draw:function(aq){if(!this.can_draw()){return}var an=aq&&aq.clear_after,al=this.view.low,ag=this.view.high,aj=ag-al,ad=this.view.container.width(),ap=this.view.resolution_px_b,af=1/ap;if(this.is_overview){al=this.view.max_low;ag=this.view.max_high;ap=ad/(view.max_high-view.max_low);af=1/ap}this.before_draw();this.tiles_div.children().addClass("remove");var ak=Math.floor(Q*af),ac=Math.floor(al/ak),am,ah,ai=[],ao=[];while((ac*ak)<ag){am=new w.GenomeRegion({chrom:this.view.chrom,start:ac*ak,end:Math.min((ac+1)*ak,this.view.max_high)});ah=this.draw_helper(am,ap,aq);ai.push(ah);$.when(ah).then(function(ar){ao.push(ar)});ac+=1}if(!an){this.tiles_div.children(".remove").removeClass("remove").remove()}var ae=this;$.when.apply($,ai).then(function(){ae.tiles_div.children(".remove").remove();ao=ab.filter(ao,function(ar){return ar!==null});if(ao.length!==0){ae.postdraw_actions(ao,ad,ap,an)}})},_add_yaxis_label:function(af,ah){var ad=this,ag=(af==="max"?"top":"bottom"),ai=(af==="max"?"max":"min"),ac=(af==="max"?"max_value":"min_value"),ae=this.container_div.find(".yaxislabel."+ag);ah=ah||function(){ad.request_draw({clear_tile_cache:true})};if(ae.length!==0){ae.text(ad.config.get_value(ac))}else{ae=$("<div/>").text(ad.config.get_value(ac)).make_text_editable({num_cols:12,on_finish:function(aj){$(".tooltip").remove();ad.config.set_value(ac,aj);ah()},help_text:"Set "+ai+" value"}).addClass("yaxislabel "+ag).css("color",this.config.get_value("label_color"));this.container_div.prepend(ae)}},postdraw_actions:function(af,ag,ai,ac){var ae=ab.filter(af,function(aj){return(aj instanceof K)});if(ae.length>0){this.max_height_px=0;var ad=this;ab.each(af,function(aj){if(!(aj instanceof K)){aj.html_elt.remove();ad.draw_helper(aj.region,ai,{force:true,mode:"Coverage"})}});ad._add_yaxis_label("max")}else{this.container_div.find(".yaxislabel").remove();var ah=ab.find(af,function(aj){return aj.has_icons});if(ah){ab.each(af,function(aj){if(!aj.has_icons){aj.html_elt.css("padding-top",D)}})}}},get_mode:function(ac){return this.mode},update_auto_mode:function(ac){},_get_drawables:function(){return[this]},draw_helper:function(al,an,ao){if(!ao){ao={}}var ad=ao.force,ai=ao.mode||this.mode,af=1/an,ae=this,ag=this._get_drawables(),am=this._gen_tile_cache_key(an,al),ah=function(ap){return(ap&&"track" in ap)};var aj=(ad?undefined:ae.tile_cache.get_elt(am));if(aj){if(ah(aj)){ae.show_tile(aj,an)}return aj}if(ao.data_fetch===false){return null}var ak=function(){var ap=(ab.find(A,function(ar){return ar===ai})?"Coverage":ai);var aq=ab.map(ag,function(ar){return ar.data_manager.get_data(al,ap,af,ae.data_url_extra_params)});if(view.reference_track){aq.push(view.reference_track.data_manager.get_data(al,ai,af,view.reference_track.data_url_extra_params))}return aq};var ac=$.Deferred();ae.tile_cache.set_elt(am,ac);$.when.apply($,ak()).then(function(){var ap=ak(),av=ap,aB;if(ab.find(ap,function(aD){return j.is_deferred(aD)})){ae.tile_cache.set_elt(am,undefined);$.when(ae.draw_helper(al,an,ao)).then(function(aD){ac.resolve(aD)});return}if(view.reference_track){aB=view.reference_track.data_manager.subset_entry(ap.pop(),al)}var aw=[],at=[];ab.each(ag,function(aG,aD){var aF=aG.mode,aE=av[aD];if(aF==="Auto"){aF=aG.get_mode(aE);aG.update_auto_mode(aF)}aw.push(aF);at.push(aG.get_canvas_height(aE,aF,an,aq))});var au=ae.view.canvas_manager.new_canvas(),ax=al.get("start"),aC=al.get("end"),ar=0,aq=Math.ceil((aC-ax)*an)+ae.left_offset,az=ab.max(at),ay;au.width=aq;au.height=(ao.height||az);var aA=au.getContext("2d");aA.translate(ae.left_offset,0);if(ag.length>1){aA.globalAlpha=0.5;aA.globalCompositeOperation="source-over"}ab.each(ag,function(aE,aD){ay=aE.draw_tile(av[aD],aA,aw[aD],al,an,aB)});if(ay!==undefined){ae.tile_cache.set_elt(am,ay);ae.show_tile(ay,an)}ac.resolve(ay)});return ac},get_canvas_height:function(ac,ae,af,ad){return this.visible_height_px},_draw_line_track_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.LinePainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new K(this,ag,ai,af,ac.data)},draw_tile:function(ac,ad,ag,af,ah,ae){},show_tile:function(ae,ah){var ad=this,ac=ae.html_elt;ae.predisplay_actions();var ag=Math.round((ae.low-(this.is_overview?this.view.max_low:this.view.low))*ah);if(this.left_offset){ag-=this.left_offset}ac.css("left",ag);if(ac.hasClass("remove")){ac.removeClass("remove")}else{this.tiles_div.append(ac)}ac.css("height","auto");this.max_height_px=Math.max(this.max_height_px,ac.height()-2);ac.parent().children().css("height",this.max_height_px+"px");var af=this.max_height_px;if(this.visible_height_px!==0){af=Math.min(this.max_height_px,this.visible_height_px)}this.tiles_div.css("height",af+"px")},tool_region_and_parameters_str:function(af){var ac=this,ae=(af!==undefined?af.toString():"all"),ad=ab.values(ac.tool.get_inputs_dict()).join(", ");return" - region=["+ae+"], parameters=["+ad+"]"},data_and_mode_compatible:function(ac,ad){if(ad==="Auto"){return true}else{if(ad==="Coverage"){return ac.dataset_type==="bigwig"}else{if(ac.dataset_type==="bigwig"||ac.extra_info==="no_detail"){return false}else{return true}}}},can_subset:function(ac){if(ac.message||ac.extra_info==="no_detail"){return false}else{if(ac.dataset_type==="bigwig"){return(ac.data[1][0]-ac.data[0][0]===1)}}return true},init_for_tool_data:function(){this.data_manager.set("data_type","raw_data");this.data_query_wait=1000;this.dataset_check_type="state"}});var W=function(ad,ac){f.call(this,ad,ac,{resize:false,header:false});this.container_div.addClass("label-track")};o(W.prototype,f.prototype,{init:function(){this.enabled=true},predraw_init:function(){},_draw:function(ag){var ae=this.view,af=ae.high-ae.low,aj=Math.floor(Math.pow(10,Math.floor(Math.log(af)/Math.log(10)))),ac=Math.floor(ae.low/aj)*aj,ah=this.view.container.width(),ad=$("<div/>").addClass("label-container");while(ac<ae.high){var ai=Math.floor((ac-ae.low)/af*ah);ad.append($("<div/>").addClass("label").text(commatize(ac)).css({left:ai}));ac+=aj}this.content_div.children(":first").remove();this.content_div.append(ad)}});var e=function(ad,ac,ag){L.call(this,ad,ac,ag);this.drawables=[];if("drawables" in ag){var af;for(var ae=0;ae<ag.drawables.length;ae++){af=ag.drawables[ae];this.drawables[ae]=n(af,ad,null);if(af.left_offset>this.left_offset){this.left_offset=af.left_offset}}this.enabled=true}ab.each(this.drawables,function(ah){if(ah instanceof c||ah instanceof S){ah.change_mode("Coverage")}});this.update_icons();this.obj_type="CompositeTrack"};o(e.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),action_icons_def:[{name:"composite_icon",title:"Show individual tracks",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_group()}}].concat(L.prototype.action_icons_def),to_dict:y.prototype.to_dict,add_drawable:y.prototype.add_drawable,unpack_drawables:y.prototype.unpack_drawables,config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},on_resize:function(){var ac=this.visible_height_px;ab.each(this.drawables,function(ad){ad.visible_height_px=ac});f.prototype.on_resize.call(this)},change_mode:function(ac){L.prototype.change_mode.call(this,ac);for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad].change_mode(ac)}},init:function(){var ae=[];for(var ad=0;ad<this.drawables.length;ad++){ae.push(this.drawables[ad].init())}var ac=this;$.when.apply($,ae).then(function(){ac.enabled=true;ac.request_draw()})},update_icons:function(){this.action_icons.filters_icon.hide();this.action_icons.tools_icon.hide();this.action_icons.param_space_viz_icon.hide()},can_draw:p.prototype.can_draw,_get_drawables:function(){return this.drawables},show_group:function(){var af=new N(this.view,this.container,{name:this.config.get_value("name")}),ac;for(var ae=0;ae<this.drawables.length;ae++){ac=this.drawables[ae];ac.update_icons();af.add_drawable(ac);ac.container=af;af.content_div.append(ac.container_div)}var ad=this.container.replace_drawable(this,af,true);af.request_draw({clear_tile_cache:true})},before_draw:function(){var ad=ab.min(ab.map(this.drawables,function(ae){return ae.config.get_value("min_value")})),ac=ab.max(ab.map(this.drawables,function(ae){return ae.config.get_value("max_value")}));this.config.set_value("min_value",ad);this.config.set_value("max_value",ac);ab.each(this.drawables,function(ae){ae.config.set_value("min_value",ad);ae.config.set_value("max_value",ac)})},update_all_min_max:function(){var ad=this,ac=this.config.get_value("min_value"),ae=this.config.get_value("max_value");ab.each(this.drawables,function(af){af.config.set_value("min_value",ac);af.config.set_value("max_value",ae)});this.request_draw({clear_tile_cache:true})},postdraw_actions:function(ai,ac,al,ah){var ag=-1,ae;for(ae=0;ae<ai.length;ae++){var aj=ai[ae].html_elt.find("canvas").height();if(aj>ag){ag=aj}}for(ae=0;ae<ai.length;ae++){var af=ai[ae];if(af.html_elt.find("canvas").height()!==ag){this.draw_helper(af.region,al,{force:true,height:ag});af.html_elt.remove()}}var ad=this,ak=function(){ad.update_all_min_max()};this._add_yaxis_label("min",ak);this._add_yaxis_label("max",ak)}});var B=function(ac){L.call(this,ac,{content_div:ac.top_labeltrack},{resize:false,header:false});this.left_offset=ac.canvas_manager.char_width_px;this.container_div.addClass("reference-track");this.data_url=galaxy_config.root+"api/genomes/"+this.view.dbkey;this.data_url_extra_params={reference:true};this.data_manager=new w.GenomeReferenceDataManager({data_url:this.data_url,can_subset:this.can_subset});this.hide_contents()};o(B.prototype,p.prototype,L.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"height",type:"int",default_value:13,hidden:true}]),init:function(){this.data_manager.clear();this.enabled=true},predraw_init:function(){},can_draw:p.prototype.can_draw,draw_helper:function(af,ah,ad){var ac=this.tiles_div.is(":visible"),ag,ae=null;if(ah>this.view.canvas_manager.char_width_px){this.tiles_div.show();ag=true;ae=L.prototype.draw_helper.call(this,af,ah,ad)}else{ag=false;this.tiles_div.hide()}if(ac!==ag){this.view.resize_viewport()}return ae},can_subset:function(ac){return true},draw_tile:function(ae,ak,af,ah,al){var ad=this.data_manager.subset_entry(ae,ah),aj=ad.data;var ac=ak.canvas;ak.font=ak.canvas.manager.default_font;ak.textAlign="center";for(var ag=0,ai=aj.length;ag<ai;ag++){ak.fillStyle=this.view.get_base_color(aj[ag]);ak.fillText(aj[ag],Math.floor(ag*al),10)}return new b(this,ah,al,ac,ad)}});var g=function(ad,ac,ae){this.mode="Histogram";L.call(this,ad,ac,ae)};o(g.prototype,p.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Color",type:"color"},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},before_draw:function(){},draw_tile:function(ac,ad,af,ae,ag){return this._draw_line_track_tile(ac,ad,af,ae,ag)},can_subset:function(ac){return(ac.data[1][0]-ac.data[0][0]===1)},postdraw_actions:function(ad,ae,af,ac){this._add_yaxis_label("max");this._add_yaxis_label("min")}});var r=function(ad,ac,ae){this.mode="Heatmap";L.call(this,ad,ac,ae)};o(r.prototype,p.prototype,L.prototype,{display_modes:["Heatmap"],config_params:ab.union(p.prototype.config_params,[{key:"pos_color",label:"Positive Color",type:"color",default_value:"#FF8C00"},{key:"neg_color",label:"Negative Color",type:"color",default_value:"#4169E1"},{key:"min_value",label:"Min Value",type:"float",default_value:-1},{key:"max_value",label:"Max Value",type:"float",default_value:1},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:500,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.DiagonalHeatmapPainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new b(this,ag,ai,af,ac.data)}});var c=function(ad,ac,ae){L.call(this,ad,ac,ae);this.container_div.addClass("feature-track");this.summary_draw_height=30;this.slotters={};this.start_end_dct={};this.left_offset=200;this.set_painter_from_config()};o(c.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Block color",type:"color"},{key:"reverse_strand_color",label:"Antisense strand color",type:"color"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true,help:"Show the number of items in each bin when drawing summary histogram"},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"connector_style",label:"Connector style",type:"select",default_value:"fishbones",options:[{label:"Line with arrows",value:"fishbone"},{label:"Arcs",value:"arcs"}]},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.set_painter_from_config();this.request_draw({clear_tile_cache:true})},set_painter_from_config:function(){if(this.config.get_value("connector_style")==="arcs"){this.painter=J.ArcLinkedFeaturePainter}else{this.painter=J.LinkedFeaturePainter}},postdraw_actions:function(ao,af,aq,an){L.prototype.postdraw_actions.call(this,ao,af,aq,an);var ah=this,ai,am=ab.filter(ao,function(ar){return(ar instanceof K)});if(am.length===0){var ac={};ab.each(ab.pluck(ao,"incomplete_features"),function(ar){ab.each(ar,function(at){ac[at[0]]=at})});var ap=this;ab.each(ao,function(av){var aw=ab.omit(ac,ab.map(av.incomplete_features,function(ay){return ay[0]}));aw=ab.omit(aw,ab.keys(av.other_tiles_features_drawn));if(ab.size(aw)!==0){var at={data:ab.values(aw)},au=ap.view.canvas_manager.new_canvas(),ar=au.getContext("2d");au.height=Math.max(av.canvas.height,ap.get_canvas_height(at,av.mode,av.w_scale,100));au.width=av.canvas.width;ar.drawImage(av.canvas,0,0);ar.translate(ah.left_offset,0);var ax=ap.draw_tile(at,ar,av.mode,av.region,av.w_scale,av.seq_data);$(av.canvas).replaceWith($(ax.canvas));av.canvas=au;ab.extend(av.other_tiles_features_drawn,ac)}})}if(ah.filters_manager){var ag=ah.filters_manager.filters,ak;for(ak=0;ak<ag.length;ak++){ag[ak].update_ui_elt()}var aj=false,al,ae;for(ai=0;ai<ao.length;ai++){if(ao[ai].data.length){al=ao[ai].data[0];for(ak=0;ak<ag.length;ak++){ae=ag[ak];if(ae.applies_to(al)&&ae.min!==ae.max){aj=true;break}}}}if(ah.filters_available!==aj){ah.filters_available=aj;if(!ah.filters_available){ah.filters_manager.hide()}ah.update_icons()}}if(ao[0] instanceof M){var ad=true;for(ai=0;ai<ao.length;ai++){if(!ao[ai].all_slotted){ad=false;break}}this.action_icons.show_more_rows_icon.toggle(!ad)}else{this.action_icons.show_more_rows_icon.hide()}},update_auto_mode:function(ac){if(this.mode==="Auto"){if(ac==="no_detail"){ac="feature spans"}this.action_icons.mode_icon.attr("title","Set display mode (now: Auto/"+ac+")")}},incremental_slots:function(ag,ac,af){var ad=this.view.canvas_manager.dummy_context,ae=this.slotters[ag];if(!ae||(ae.mode!==af)){ae=new (s.FeatureSlotter)(ag,af,z,function(ah){return ad.measureText(ah)});this.slotters[ag]=ae}return ae.slot_features(ac)},get_mode:function(ac){if(ac.extra_info==="no_detail"||this.is_overview){mode="no_detail"}else{if(this.view.high-this.view.low>G){mode="Squish"}else{mode="Pack"}}return mode},get_canvas_height:function(ac,ag,ah,ad){if(ag==="Coverage"||ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var af=this.incremental_slots(ah,ac.data,ag);var ae=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return Math.max(this.min_height_px,ae.get_required_height(af,ad))}},draw_tile:function(an,at,aq,ag,ak,af,ao){var ar=this,ae=at.canvas,az=ag.get("start"),ad=ag.get("end"),ah=this.left_offset;if(an.dataset_type==="bigwig"){return this._draw_line_track_tile(an,at,aq,ag,ak)}var aj=[],ap=this.slotters[ak].slots;all_slotted=true;if(an.data){var al=this.filters_manager.filters;for(var au=0,aw=an.data.length;au<aw;au++){var ai=an.data[au];var av=false;var am;for(var ay=0,aD=al.length;ay<aD;ay++){am=al[ay];am.update_attrs(ai);if(!am.keep(ai)){av=true;break}}if(!av){aj.push(ai);if(!(ai[0] in ap)){all_slotted=false}}}}var aC=(this.filters_manager.alpha_filter?new C(this.filters_manager.alpha_filter):null),aA=(this.filters_manager.height_filter?new C(this.filters_manager.height_filter):null),aB=new (this.painter)(aj,az,ad,this.config.to_key_value_dict(),aq,aC,aA,af,function(aE){return ar.view.get_base_color(aE)});var ax=null;at.fillStyle=this.config.get_value("block_color");at.font=at.canvas.manager.default_font;at.textAlign="right";if(an.data){var ac=aB.draw(at,ae.width,ae.height,ak,ap);ax=ac.feature_mapper;incomplete_features=ac.incomplete_features;ax.translation=-ah}if(!ao){return new M(ar,ag,ak,ae,an.data,aq,an.message,all_slotted,ax,incomplete_features,af)}}});var Z=function(ad,ac,ae){L.call(this,ad,ac,ae);this.painter=J.VariantPainter;this.summary_draw_height=30;this.left_offset=30};o(Z.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Histogram color",type:"color"},{key:"show_sample_data",label:"Show sample data",type:"bool",default_value:true},{key:"show_labels",label:"Show summary and sample labels",type:"bool",default_value:true},{key:"summary_height",label:"Locus summary height",type:"float",default_value:20},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,af,ah,ag,ai){if(ac.dataset_type==="bigwig"){return this._draw_line_track_tile(ac,af,"Histogram",ag,ai)}else{var ae=this.view,ad=new (this.painter)(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah,function(aj){return ae.get_base_color(aj)});ad.draw(af,af.canvas.width,af.canvas.height,ai);return new b(this,ag,ai,af.canvas,ac.data)}},get_canvas_height:function(ac,ag,ah,ae){if(ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var ad=(this.dataset.get_metadata("sample_names")?this.dataset.get_metadata("sample_names").length:0);if(ad===0&&ac.data.length!==0){ad=ac.data[0][7].match(/,/g);if(ad===null){ad=1}else{ad=ad.length+1}}var af=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return af.get_required_height(ad)}},predraw_init:function(){var ac=[f.prototype.predraw_init.call(this)];if(!this.dataset.get_metadata("sample_names")){ac.push(this.dataset.fetch())}return ac},postdraw_actions:function(ag,ah,aj,ad){L.prototype.postdraw_actions.call(this,ag,ah,aj,ad);var af=ab.filter(ag,function(ak){return(ak instanceof K)});var ae=this.dataset.get_metadata("sample_names");if(af.length===0&&this.config.get_value("show_labels")&&ae&&ae.length>1){var ac;if(this.container_div.find(".yaxislabel.variant").length===0){ac=this.config.get_value("summary_height")/2;this.tiles_div.prepend($("<div/>").text("Summary").addClass("yaxislabel variant top").css({"font-size":ac+"px",top:(this.config.get_value("summary_height")-ac)/2+"px"}));if(this.config.get_value("show_sample_data")){var ai=ae.join("<br/>");this.tiles_div.prepend($("<div/>").html(ai).addClass("yaxislabel variant top sample").css({top:this.config.get_value("summary_height")}))}}ac=(this.mode==="Squish"?5:10)+"px";$(this.tiles_div).find(".sample").css({"font-size":ac,"line-height":ac});$(this.tiles_div).find(".yaxislabel").css("color",this.config.get_value("label_color"))}else{this.container_div.find(".yaxislabel.variant").remove()}}});var S=function(ad,ac,ae){c.call(this,ad,ac,ae);this.painter=J.ReadPainter;this.update_icons()};o(S.prototype,p.prototype,L.prototype,c.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Histogram color",type:"color"},{key:"detail_block_color",label:"Sense strand block color",type:"color",default_value:"#AAAAAA"},{key:"reverse_strand_color",label:"Antisense strand block color",type:"color",default_value:"#DDDDDD"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})}});var d={CompositeTrack:e,DrawableGroup:N,DiagonalHeatmapTrack:r,FeatureTrack:c,LineTrack:g,ReadTrack:S,VariantTrack:Z,VcfTrack:Z};var n=function(ae,ad,ac){if("copy" in ae){return ae.copy(ac)}else{var af=ae.obj_type;if(!af){af=ae.track_type}return new d[af](ad,ac,ae)}};return{TracksterView:Y,DrawableGroup:N,LineTrack:g,FeatureTrack:c,DiagonalHeatmapTrack:r,ReadTrack:S,VariantTrack:Z,CompositeTrack:e,object_from_template:n}});
\ No newline at end of file
diff -r 990bc0688199410ab08d5e8a418770b516c6f4e2 -r d85ae37476a17205c9869d633f3aafd104b48a98 static/scripts/viz/trackster/tracks.js
--- a/static/scripts/viz/trackster/tracks.js
+++ b/static/scripts/viz/trackster/tracks.js
@@ -3242,7 +3242,7 @@
width = this.view.container.width(),
new_div = $("<div/>").addClass('label-container');
while ( position < view.high ) {
- var screenPosition = ( position - view.low ) / range * width;
+ var screenPosition = Math.floor( ( position - view.low ) / range * width );
new_div.append( $("<div/>").addClass('label').text(commatize( position )).css( {
left: screenPosition
}));
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jmchilton: Merged in jmchilton/galaxy-central-fork-1 (pull request #452)
by commits-noreply@bitbucket.org 09 Aug '14
by commits-noreply@bitbucket.org 09 Aug '14
09 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/de2e33813275/
Changeset: de2e33813275
User: jmchilton
Date: 2014-08-09 15:15:11
Summary: Merged in jmchilton/galaxy-central-fork-1 (pull request #452)
More RESTful workflow API (attempt 3)
Affected #: 4 files
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -1664,7 +1664,7 @@
session.flush()
return imported_stored
- def _workflow_from_dict( self, trans, data, source=None, add_to_menu=False ):
+ def _workflow_from_dict( self, trans, data, source=None, add_to_menu=False, publish=False ):
"""
Creates a workflow from a dict. Created workflow is stored in the database and returned.
"""
@@ -1752,6 +1752,7 @@
workflow.stored_workflow = stored
stored.latest_workflow = workflow
stored.user = trans.user
+ stored.published = publish
if data[ 'annotation' ]:
self.add_item_annotation( trans.sa_session, stored.user, stored, data[ 'annotation' ] )
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -6,11 +6,13 @@
import logging
from sqlalchemy import desc, or_
-from galaxy import exceptions, util, web
+from galaxy import exceptions, util
from galaxy.model.item_attrs import UsesAnnotations
+from galaxy.managers import histories
from galaxy.web import _future_expose_api as expose_api
from galaxy.web.base.controller import BaseAPIController, url_for, UsesStoredWorkflowMixin
from galaxy.web.base.controller import UsesHistoryMixin
+from galaxy.web.base.controller import SharableMixin
from galaxy.workflow.extract import extract_workflow
from galaxy.workflow.run import invoke
from galaxy.workflow.run import WorkflowRunConfig
@@ -18,9 +20,13 @@
log = logging.getLogger(__name__)
-class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesHistoryMixin, UsesAnnotations):
+class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesHistoryMixin, UsesAnnotations, SharableMixin):
- @web.expose_api
+ def __init__( self, app ):
+ super( BaseAPIController, self ).__init__( app )
+ self.history_manager = histories.HistoryManager()
+
+ @expose_api
def index(self, trans, **kwd):
"""
GET /api/workflows
@@ -54,30 +60,21 @@
rval.append(item)
return rval
- @web.expose_api
+ @expose_api
def show(self, trans, id, **kwd):
"""
GET /api/workflows/{encoded_workflow_id}
Displays information needed to run a workflow from the command line.
"""
- workflow_id = id
- try:
- decoded_workflow_id = trans.security.decode_id(workflow_id)
- except TypeError:
- trans.response.status = 400
- return "Malformed workflow id ( %s ) specified, unable to decode." % str(workflow_id)
- try:
- stored_workflow = trans.sa_session.query(trans.app.model.StoredWorkflow).get(decoded_workflow_id)
- if stored_workflow.importable is False and stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is neither importable, nor owned by or shared with current user")
- except:
- trans.response.status = 400
- return "That workflow does not exist."
+ stored_workflow = self.__get_stored_workflow( trans, id )
+ if stored_workflow.importable is False and stored_workflow.user != trans.user and not trans.user_is_admin():
+ if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
+ message = "Workflow is neither importable, nor owned by or shared with current user"
+ raise exceptions.ItemAccessibilityException( message )
+
item = stored_workflow.to_dict( view='element', value_mapper={ 'id': trans.security.encode_id } )
- item['url'] = url_for('workflow', id=workflow_id)
+ item['url'] = url_for('workflow', id=id)
item['owner'] = stored_workflow.user.username
latest_workflow = stored_workflow.latest_workflow
inputs = {}
@@ -114,7 +111,7 @@
item['steps'] = steps
return item
- @web.expose_api
+ @expose_api
def create(self, trans, payload, **kwd):
"""
POST /api/workflows
@@ -161,10 +158,20 @@
:param workflow_name: If from_history_id is set - name of the workflow to create when extracting a workflow from history
:type workflow_name: str
"""
+ ways_to_create = set( [
+ 'workflow_id',
+ 'installed_repository_file',
+ 'from_history_id',
+ 'shared_workflow_id',
+ 'workflow',
+ ] ).intersection( payload )
+ if len( ways_to_create ) == 0:
+ message = "One parameter among - %s - must be specified" % ", ".join( ways_to_create )
+ raise exceptions.RequestParameterMissingException( message )
- if len( set( ['workflow_id', 'installed_repository_file', 'from_history_id'] ).intersection( payload ) ) > 1:
- trans.response.status = 403
- return "Only one among 'workflow_id', 'installed_repository_file', 'from_history_id' must be specified"
+ if len( ways_to_create ) > 1:
+ message = "Only one parameter among - %s - must be specified" % ", ".join( ways_to_create )
+ raise exceptions.RequestParameterInvalidException( message )
if 'installed_repository_file' in payload:
workflow_controller = trans.webapp.controllers[ 'workflow' ]
@@ -193,10 +200,17 @@
item[ 'url' ] = url_for( 'workflow', id=item[ 'id' ] )
return item
+ if 'shared_workflow_id' in payload:
+ workflow_id = payload[ 'shared_workflow_id' ]
+ return self.__api_import_shared_workflow( trans, workflow_id, payload )
+
+ if 'workflow' in payload:
+ return self.__api_import_new_workflow( trans, payload, **kwd )
+
workflow_id = payload.get( 'workflow_id', None )
if not workflow_id:
- trans.response.status = 403
- return "Either workflow_id, installed_repository_file or from_history_id must be specified"
+ message = "Invalid workflow_id specified."
+ raise exceptions.RequestParameterInvalidException( message )
# Pull other parameters out of payload.
param_map = payload.get( 'parameters', {} )
@@ -225,34 +239,24 @@
history_param = payload.get('history', '')
# Get workflow + accessibility check.
- stored_workflow = trans.sa_session.query(self.app.model.StoredWorkflow).get(trans.security.decode_id(workflow_id))
- if stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is not owned by or shared with current user")
+ stored_workflow = self.__get_stored_accessible_workflow( trans, workflow_id )
workflow = stored_workflow.latest_workflow
# Sanity checks.
- if not workflow:
- trans.response.status = 400
- return "Workflow not found."
if len( workflow.steps ) == 0:
- trans.response.status = 400
- return "Workflow cannot be run because it does not have any steps"
+ raise exceptions.MessageException( "Workflow cannot be run because it does not have any steps" )
if workflow.has_cycles:
- trans.response.status = 400
- return "Workflow cannot be run because it contains cycles"
+ raise exceptions.MessageException( "Workflow cannot be run because it contains cycles" )
if workflow.has_errors:
- trans.response.status = 400
- return "Workflow cannot be run because of validation errors in some steps"
+ message = "Workflow cannot be run because of validation errors in some steps"
+ raise exceptions.MessageException( message )
# Get target history.
if history_param.startswith('hist_id='):
# Passing an existing history to use.
- history = trans.sa_session.query(self.app.model.History).get(trans.security.decode_id(history_param[8:]))
- if history.user != trans.user and not trans.user_is_admin():
- trans.response.status = 400
- return "Invalid History specified."
+ encoded_history_id = history_param[ 8: ]
+ history_id = self.__decode_id( trans, encoded_history_id, model_type="history" )
+ history = self.history_manager.get( trans, history_id, check_ownership=True )
else:
# Send workflow outputs to new history.
history = self.app.model.History(name=history_param, user=trans.user)
@@ -284,8 +288,8 @@
inputs[k]['id']
)
else:
- trans.response.status = 400
- return "Unknown dataset source '%s' specified." % inputs[k]['src']
+ message = "Unknown workflow input source '%s' specified." % inputs[k]['src']
+ raise exceptions.RequestParameterInvalidException( message )
if add_to_history and content.history != history:
content = content.copy()
if isinstance( content, self.app.model.HistoryDatasetAssociation ):
@@ -294,8 +298,8 @@
history.add_dataset_collection( content )
inputs[k]['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
except AssertionError:
- trans.response.status = 400
- return "Invalid Dataset '%s' Specified" % inputs[k]['id']
+ message = "Invalid workflow input '%s' specified" % inputs[k]['id']
+ raise exceptions.ItemAccessibilityException( message )
# Run each step, connecting outputs to inputs
replacement_dict = payload.get('replacement_params', {})
@@ -308,6 +312,8 @@
param_map=param_map,
)
+ # invoke may throw MessageExceptions on tool erors, failure
+ # to match up inputs, etc...
outputs = invoke(
trans=trans,
workflow=workflow,
@@ -327,30 +333,22 @@
return rval
- @web.expose_api
+ @expose_api
def workflow_dict( self, trans, workflow_id, **kwd ):
"""
GET /api/workflows/{encoded_workflow_id}/download
Returns a selected workflow as a json dictionary.
"""
- try:
- stored_workflow = trans.sa_session.query(self.app.model.StoredWorkflow).get(trans.security.decode_id(workflow_id))
- except Exception, e:
- return ("Workflow with ID='%s' can not be found\n Exception: %s") % (workflow_id, str( e ))
- # check to see if user has permissions to selected workflow
- if stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is not owned by or shared with current user")
+ stored_workflow = self.__get_stored_accessible_workflow( trans, workflow_id )
ret_dict = self._workflow_to_dict( trans, stored_workflow )
if not ret_dict:
# This workflow has a tool that's missing from the distribution
- trans.response.status = 400
- return "Workflow cannot be exported due to missing tools."
+ message = "Workflow cannot be exported due to missing tools."
+ raise exceptions.MessageException( message )
return ret_dict
- @web.expose_api
+ @expose_api
def delete( self, trans, id, **kwd ):
"""
DELETE /api/workflows/{encoded_workflow_id}
@@ -379,19 +377,39 @@
# TODO: Unsure of response message to let api know that a workflow was successfully deleted
return ( "Workflow '%s' successfully deleted" % stored_workflow.name )
- @web.expose_api
- def import_new_workflow(self, trans, payload, **kwd):
+ @expose_api
+ def import_new_workflow_deprecated(self, trans, payload, **kwd):
"""
POST /api/workflows/upload
Importing dynamic workflows from the api. Return newly generated workflow id.
Author: rpark
# currently assumes payload['workflow'] is a json representation of a workflow to be inserted into the database
+
+ Deprecated in favor to POST /api/workflows with encoded 'workflow' in
+ payload the same way.
"""
+ return self.__api_import_new_workflow( trans, payload, **kwd )
+ def __api_import_new_workflow( self, trans, payload, **kwd ):
data = payload['workflow']
- workflow, missing_tool_tups = self._workflow_from_dict( trans, data, source="API" )
+ publish = util.string_as_bool( payload.get( "publish", False ) )
+ # If 'publish' set, default to importable.
+ importable = util.string_as_bool( payload.get( "importable", publish ) )
+
+ if publish and not importable:
+ raise exceptions.RequestParameterInvalidException( "Published workflow must be importable." )
+
+ from_dict_kwds = dict(
+ source="API",
+ publish=publish,
+ )
+ workflow, missing_tool_tups = self._workflow_from_dict( trans, data, **from_dict_kwds )
+
+ if importable:
+ self._make_item_accessible( trans.sa_session, workflow )
+ trans.sa_session.flush()
# galaxy workflow newly created id
workflow_id = workflow.id
@@ -409,7 +427,7 @@
return item
@expose_api
- def import_shared_workflow(self, trans, payload, **kwd):
+ def import_shared_workflow_deprecated(self, trans, payload, **kwd):
"""
POST /api/workflows/import
Import a workflow shared by other users.
@@ -423,14 +441,17 @@
workflow_id = payload.get('workflow_id', None)
if workflow_id is None:
raise exceptions.ObjectAttributeMissingException( "Missing required parameter 'workflow_id'." )
+ self.__api_import_shared_workflow( trans, workflow_id, payload )
+
+ def __api_import_shared_workflow( self, trans, workflow_id, payload, **kwd ):
try:
stored_workflow = self.get_stored_workflow( trans, workflow_id, check_ownership=False )
except:
raise exceptions.ObjectNotFound( "Malformed workflow id ( %s ) specified." % workflow_id )
if stored_workflow.importable is False:
- raise exceptions.MessageException( 'The owner of this workflow has disabled imports via this link.' )
+ raise exceptions.ItemAccessibilityException( 'The owner of this workflow has disabled imports via this link.' )
elif stored_workflow.deleted:
- raise exceptions.MessageException( "You can't import this workflow because it has been deleted." )
+ raise exceptions.ItemDeletionException( "You can't import this workflow because it has been deleted." )
imported_workflow = self._import_shared_workflow( trans, stored_workflow )
item = imported_workflow.to_dict( value_mapper={ 'id': trans.security.encode_id } )
encoded_id = trans.security.encode_id(imported_workflow.id)
@@ -491,3 +512,32 @@
if out is not None:
return self.encode_all_ids( trans, out.to_dict('element'), True)
return None
+
+ def __get_stored_accessible_workflow( self, trans, workflow_id ):
+ stored_workflow = self.__get_stored_workflow( trans, workflow_id )
+
+ # check to see if user has permissions to selected workflow
+ if stored_workflow.user != trans.user and not trans.user_is_admin():
+ if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
+ message = "Workflow is not owned by or shared with current user"
+ raise exceptions.ItemAccessibilityException( message )
+
+ return stored_workflow
+
+ def __get_stored_workflow( self, trans, workflow_id ):
+ try:
+ workflow_id = self.__decode_id( trans, workflow_id )
+ query = trans.sa_session.query( trans.app.model.StoredWorkflow )
+ stored_workflow = query.get( workflow_id )
+ except Exception:
+ raise exceptions.ObjectNotFound( "No such workflow found - invalid workflow identifier." )
+ if stored_workflow is None:
+ raise exceptions.ObjectNotFound( "No such workflow found." )
+ return stored_workflow
+
+ def __decode_id( self, trans, workflow_id, model_type="workflow" ):
+ try:
+ return trans.security.decode_id( workflow_id )
+ except Exception:
+ message = "Malformed %s id ( %s ) specified, unable to decode" % ( model_type, workflow_id )
+ raise exceptions.MalformedId( message )
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -213,13 +213,13 @@
webapp.add_route( '/visualization/show/:visualization_name',
controller='visualization', action='render', visualization_name=None )
- # "POST /api/workflows/import" => ``workflows.import_workflow()``.
- # Defines a named route "import_workflow".
- webapp.mapper.connect( 'import_workflow', '/api/workflows/upload', controller='workflows', action='import_new_workflow', conditions=dict( method=['POST'] ) )
+ # Deprecated in favor of POST /api/workflows with 'workflow' in payload.
+ webapp.mapper.connect( 'import_workflow_deprecated', '/api/workflows/upload', controller='workflows', action='import_new_workflow_deprecated', conditions=dict( method=['POST'] ) )
webapp.mapper.connect( 'workflow_dict', '/api/workflows/{workflow_id}/download', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
# Preserve the following download route for now for dependent applications -- deprecate at some point
webapp.mapper.connect( 'workflow_dict', '/api/workflows/download/{workflow_id}', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
- webapp.mapper.connect( 'import_shared_workflow', '/api/workflows/import', controller='workflows', action='import_shared_workflow', conditions=dict( method=['POST'] ) )
+ # Deprecated in favor of POST /api/workflows with shared_workflow_id in payload.
+ webapp.mapper.connect( 'import_shared_workflow_deprecated', '/api/workflows/import', controller='workflows', action='import_shared_workflow_deprecated', conditions=dict( method=['POST'] ) )
webapp.mapper.connect( 'workflow_usage', '/api/workflows/{workflow_id}/usage', controller='workflows', action='workflow_usage', conditions=dict(method=['GET']))
webapp.mapper.connect( 'workflow_usage_contents', '/api/workflows/{workflow_id}/usage/{usage_id}', controller='workflows', action='workflow_usage_contents', conditions=dict(method=['GET']))
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e test/api/test_workflows.py
--- a/test/api/test_workflows.py
+++ b/test/api/test_workflows.py
@@ -9,6 +9,7 @@
from .helpers import skip_without_tool
from base.interactor import delete_request # requests like delete
+from galaxy.exceptions import error_codes
# Workflow API TODO:
@@ -24,6 +25,16 @@
self.dataset_populator = DatasetPopulator( self.galaxy_interactor )
self.dataset_collection_populator = DatasetCollectionPopulator( self.galaxy_interactor )
+ def test_show_invalid_is_404( self ):
+ show_response = self._get( "workflow/%s" % self._random_key() )
+ self._assert_status_code_is( show_response, 404 )
+
+ def test_cannot_show_private_workflow( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_not_importportable" )
+ with self._different_user():
+ show_response = self._get( "workflows/%s" % workflow_id )
+ self._assert_status_code_is( show_response, 403 )
+
def test_delete( self ):
workflow_id = self.workflow_populator.simple_workflow( "test_delete" )
workflow_name = "test_delete (imported from API)"
@@ -46,14 +57,44 @@
self._assert_status_code_is( index_response, 200 )
assert isinstance( index_response.json(), list )
- def test_import( self ):
+ def test_upload( self ):
+ self.__test_upload( use_deprecated_route=False )
+
+ def test_upload_deprecated( self ):
+ self.__test_upload( use_deprecated_route=True )
+
+ def __test_upload( self, use_deprecated_route ):
data = dict(
workflow=dumps( self.workflow_populator.load_workflow( name="test_import" ) ),
)
- upload_response = self._post( "workflows/upload", data=data )
+ if use_deprecated_route:
+ route = "workflows/upload"
+ else:
+ route = "workflows"
+ upload_response = self._post( route, data=data )
self._assert_status_code_is( upload_response, 200 )
self._assert_user_has_workflow_with_name( "test_import (imported from API)" )
+ def test_import_deprecated( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_import_published_deprecated", publish=True )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id )
+ self._assert_status_code_is( other_import_response, 200 )
+ self._assert_user_has_workflow_with_name( "imported: test_import_published_deprecated (imported from API)")
+
+ def test_not_importable_prevents_import( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_not_importportable" )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id )
+ self._assert_status_code_is( other_import_response, 403 )
+
+ def test_import_published( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_import_published", publish=True )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id, deprecated_route=True )
+ self._assert_status_code_is( other_import_response, 200 )
+ self._assert_user_has_workflow_with_name( "imported: test_import_published (imported from API)")
+
def test_export( self ):
uploaded_workflow_id = self.workflow_populator.simple_workflow( "test_for_export" )
download_response = self._get( "workflows/%s/download" % uploaded_workflow_id )
@@ -85,6 +126,29 @@
self._assert_status_code_is( run_workflow_response, 200 )
self.dataset_populator.wait_for_history( history_id, assert_ok=True )
+ def test_cannot_run_inaccessible_workflow( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_cannot_access" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ with self._different_user():
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 403 )
+
+ def test_404_on_invalid_workflow( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_does_not_exist" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ workflow_request[ "workflow_id" ] = self._random_key()
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 404 )
+
+ def test_cannot_run_against_other_users_history( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_does_not_exist" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ with self._different_user():
+ other_history_id = self.dataset_populator.new_history()
+ workflow_request[ "history" ] = "hist_id=%s" % other_history_id
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 403 )
+
@skip_without_tool( "cat1" )
@skip_without_tool( "collection_two_paired" )
def test_run_workflow_collection_params( self ):
@@ -233,6 +297,20 @@
collection_step_state = loads( collection_step[ "tool_state" ] )
self.assertEquals( collection_step_state[ "collection_type" ], u"paired" )
+ def test_empty_create( self ):
+ response = self._post( "workflows" )
+ self._assert_status_code_is( response, 400 )
+ self._assert_error_code_is( response, error_codes.USER_REQUEST_MISSING_PARAMETER )
+
+ def test_invalid_create_multiple_types( self ):
+ data = {
+ 'shared_workflow_id': '1234567890abcdef',
+ 'from_history_id': '1234567890abcdef'
+ }
+ response = self._post( "workflows", data )
+ self._assert_status_code_is( response, 400 )
+ self._assert_error_code_is( response, error_codes.USER_REQUEST_INVALID_PARAMETER )
+
@skip_without_tool( "random_lines1" )
def test_extract_mapping_workflow_from_history( self ):
history_id = self.dataset_populator.new_history()
@@ -551,3 +629,16 @@
self._assert_status_code_is( index_response, 200 )
names = map( lambda w: w[ "name" ], index_response.json() )
return names
+
+ def __import_workflow( self, workflow_id, deprecated_route=False ):
+ if deprecated_route:
+ route = "workflows/import"
+ import_data = dict(
+ workflow_id=workflow_id,
+ )
+ else:
+ route = "workflows"
+ import_data = dict(
+ shared_workflow_id=workflow_id,
+ )
+ return self._post( route, import_data )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
5 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d7ebdeca53d2/
Changeset: d7ebdeca53d2
User: jmchilton
Date: 2014-08-08 15:16:55
Summary: More RESTful shared workflow import.
Previous route was "POST /api/workflows/shared", this still works but should be condisdered deprecated in favor of POSTing to /api/workflows with shared_workflow_id in the payload.
Affected #: 2 files
diff -r 5f663734a26e8e2d1c462320741c86c9b5d9aef6 -r d7ebdeca53d28ac3d21e7e242629811a81f68082 lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -161,8 +161,13 @@
:param workflow_name: If from_history_id is set - name of the workflow to create when extracting a workflow from history
:type workflow_name: str
"""
-
- if len( set( ['workflow_id', 'installed_repository_file', 'from_history_id'] ).intersection( payload ) ) > 1:
+ ways_to_create = set( [
+ 'workflow_id',
+ 'installed_repository_file',
+ 'from_history_id',
+ 'shared_workflow_id',
+ ] )
+ if len( ways_to_create.intersection( payload ) ) > 1:
trans.response.status = 403
return "Only one among 'workflow_id', 'installed_repository_file', 'from_history_id' must be specified"
@@ -193,6 +198,10 @@
item[ 'url' ] = url_for( 'workflow', id=item[ 'id' ] )
return item
+ if 'shared_workflow_id' in payload:
+ workflow_id = payload[ 'shared_workflow_id' ]
+ return self.__api_import_shared_workflow( trans, workflow_id, payload )
+
workflow_id = payload.get( 'workflow_id', None )
if not workflow_id:
trans.response.status = 403
@@ -409,7 +418,7 @@
return item
@expose_api
- def import_shared_workflow(self, trans, payload, **kwd):
+ def import_shared_workflow_deprecated(self, trans, payload, **kwd):
"""
POST /api/workflows/import
Import a workflow shared by other users.
@@ -423,6 +432,9 @@
workflow_id = payload.get('workflow_id', None)
if workflow_id is None:
raise exceptions.ObjectAttributeMissingException( "Missing required parameter 'workflow_id'." )
+ self.__api_import_shared_workflow( trans, workflow_id, payload )
+
+ def __api_import_shared_workflow( self, trans, workflow_id, payload, **kwd ):
try:
stored_workflow = self.get_stored_workflow( trans, workflow_id, check_ownership=False )
except:
diff -r 5f663734a26e8e2d1c462320741c86c9b5d9aef6 -r d7ebdeca53d28ac3d21e7e242629811a81f68082 lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -219,7 +219,8 @@
webapp.mapper.connect( 'workflow_dict', '/api/workflows/{workflow_id}/download', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
# Preserve the following download route for now for dependent applications -- deprecate at some point
webapp.mapper.connect( 'workflow_dict', '/api/workflows/download/{workflow_id}', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
- webapp.mapper.connect( 'import_shared_workflow', '/api/workflows/import', controller='workflows', action='import_shared_workflow', conditions=dict( method=['POST'] ) )
+ # Deprecated in favor of POST /api/workflows with shared_workflow_id in payload.
+ webapp.mapper.connect( 'import_shared_workflow_deprecated', '/api/workflows/import', controller='workflows', action='import_shared_workflow_deprecated', conditions=dict( method=['POST'] ) )
webapp.mapper.connect( 'workflow_usage', '/api/workflows/{workflow_id}/usage', controller='workflows', action='workflow_usage', conditions=dict(method=['GET']))
webapp.mapper.connect( 'workflow_usage_contents', '/api/workflows/{workflow_id}/usage/{usage_id}', controller='workflows', action='workflow_usage_contents', conditions=dict(method=['GET']))
https://bitbucket.org/galaxy/galaxy-central/commits/479397aedd2b/
Changeset: 479397aedd2b
User: jmchilton
Date: 2014-08-08 15:16:55
Summary: More RESTful direct workflow creation from JSON.
Previous route was "POST /api/workflows/upload", this still works but should be condisdered deprecated in favor
of POSTing to /api/workflows with 'workflow' in the payload.
Affected #: 3 files
diff -r d7ebdeca53d28ac3d21e7e242629811a81f68082 -r 479397aedd2b4cb074ac978377f4d27fa92476a6 lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -166,6 +166,7 @@
'installed_repository_file',
'from_history_id',
'shared_workflow_id',
+ 'workflow',
] )
if len( ways_to_create.intersection( payload ) ) > 1:
trans.response.status = 403
@@ -202,6 +203,9 @@
workflow_id = payload[ 'shared_workflow_id' ]
return self.__api_import_shared_workflow( trans, workflow_id, payload )
+ if 'workflow' in payload:
+ return self.__api_import_new_workflow( trans, payload, **kwd )
+
workflow_id = payload.get( 'workflow_id', None )
if not workflow_id:
trans.response.status = 403
@@ -389,15 +393,20 @@
return ( "Workflow '%s' successfully deleted" % stored_workflow.name )
@web.expose_api
- def import_new_workflow(self, trans, payload, **kwd):
+ def import_new_workflow_deprecated(self, trans, payload, **kwd):
"""
POST /api/workflows/upload
Importing dynamic workflows from the api. Return newly generated workflow id.
Author: rpark
# currently assumes payload['workflow'] is a json representation of a workflow to be inserted into the database
+
+ Deprecated in favor to POST /api/workflows with encoded 'workflow' in
+ payload the same way.
"""
+ return self.__api_import_new_workflow( trans, payload, **kwd )
+ def __api_import_new_workflow( self, trans, payload, **kwd ):
data = payload['workflow']
workflow, missing_tool_tups = self._workflow_from_dict( trans, data, source="API" )
diff -r d7ebdeca53d28ac3d21e7e242629811a81f68082 -r 479397aedd2b4cb074ac978377f4d27fa92476a6 lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -213,9 +213,8 @@
webapp.add_route( '/visualization/show/:visualization_name',
controller='visualization', action='render', visualization_name=None )
- # "POST /api/workflows/import" => ``workflows.import_workflow()``.
- # Defines a named route "import_workflow".
- webapp.mapper.connect( 'import_workflow', '/api/workflows/upload', controller='workflows', action='import_new_workflow', conditions=dict( method=['POST'] ) )
+ # Deprecated in favor of POST /api/workflows with 'workflow' in payload.
+ webapp.mapper.connect( 'import_workflow_deprecated', '/api/workflows/upload', controller='workflows', action='import_new_workflow_deprecated', conditions=dict( method=['POST'] ) )
webapp.mapper.connect( 'workflow_dict', '/api/workflows/{workflow_id}/download', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
# Preserve the following download route for now for dependent applications -- deprecate at some point
webapp.mapper.connect( 'workflow_dict', '/api/workflows/download/{workflow_id}', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
diff -r d7ebdeca53d28ac3d21e7e242629811a81f68082 -r 479397aedd2b4cb074ac978377f4d27fa92476a6 test/api/test_workflows.py
--- a/test/api/test_workflows.py
+++ b/test/api/test_workflows.py
@@ -46,11 +46,21 @@
self._assert_status_code_is( index_response, 200 )
assert isinstance( index_response.json(), list )
- def test_import( self ):
+ def test_upload( self ):
+ self.__test_upload( use_deprecated_route=False )
+
+ def test_upload_deprecated( self ):
+ self.__test_upload( use_deprecated_route=True )
+
+ def __test_upload( self, use_deprecated_route ):
data = dict(
workflow=dumps( self.workflow_populator.load_workflow( name="test_import" ) ),
)
- upload_response = self._post( "workflows/upload", data=data )
+ if use_deprecated_route:
+ route = "workflows/upload"
+ else:
+ route = "workflows"
+ upload_response = self._post( route, data=data )
self._assert_status_code_is( upload_response, 200 )
self._assert_user_has_workflow_with_name( "test_import (imported from API)" )
https://bitbucket.org/galaxy/galaxy-central/commits/ecc4c38e0529/
Changeset: ecc4c38e0529
User: jmchilton
Date: 2014-08-08 15:16:55
Summary: Work toward making workflows API use newer standards.
Convert workflow API to use new-style API decorator throughout.
Improved workflow exception handling - now more explicit status code setting and returning of raw error strings in the API. Most obvious exceptional paths out of the API are now coming through MessageExceptions of things even more specific. Add API tests for many of these exceptional conditions.
Use more helper methods to reduce method length, duplication.
Affected #: 2 files
diff -r 479397aedd2b4cb074ac978377f4d27fa92476a6 -r ecc4c38e0529fb3352ad0534e71929f6f6b29e7f lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -6,8 +6,9 @@
import logging
from sqlalchemy import desc, or_
-from galaxy import exceptions, util, web
+from galaxy import exceptions, util
from galaxy.model.item_attrs import UsesAnnotations
+from galaxy.managers import histories
from galaxy.web import _future_expose_api as expose_api
from galaxy.web.base.controller import BaseAPIController, url_for, UsesStoredWorkflowMixin
from galaxy.web.base.controller import UsesHistoryMixin
@@ -20,7 +21,11 @@
class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesHistoryMixin, UsesAnnotations):
- @web.expose_api
+ def __init__( self, app ):
+ super( BaseAPIController, self ).__init__( app )
+ self.history_manager = histories.HistoryManager()
+
+ @expose_api
def index(self, trans, **kwd):
"""
GET /api/workflows
@@ -54,30 +59,21 @@
rval.append(item)
return rval
- @web.expose_api
+ @expose_api
def show(self, trans, id, **kwd):
"""
GET /api/workflows/{encoded_workflow_id}
Displays information needed to run a workflow from the command line.
"""
- workflow_id = id
- try:
- decoded_workflow_id = trans.security.decode_id(workflow_id)
- except TypeError:
- trans.response.status = 400
- return "Malformed workflow id ( %s ) specified, unable to decode." % str(workflow_id)
- try:
- stored_workflow = trans.sa_session.query(trans.app.model.StoredWorkflow).get(decoded_workflow_id)
- if stored_workflow.importable is False and stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is neither importable, nor owned by or shared with current user")
- except:
- trans.response.status = 400
- return "That workflow does not exist."
+ stored_workflow = self.__get_stored_workflow( trans, id )
+ if stored_workflow.importable is False and stored_workflow.user != trans.user and not trans.user_is_admin():
+ if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
+ message = "Workflow is neither importable, nor owned by or shared with current user"
+ raise exceptions.ItemAccessibilityException( message )
+
item = stored_workflow.to_dict( view='element', value_mapper={ 'id': trans.security.encode_id } )
- item['url'] = url_for('workflow', id=workflow_id)
+ item['url'] = url_for('workflow', id=id)
item['owner'] = stored_workflow.user.username
latest_workflow = stored_workflow.latest_workflow
inputs = {}
@@ -114,7 +110,7 @@
item['steps'] = steps
return item
- @web.expose_api
+ @expose_api
def create(self, trans, payload, **kwd):
"""
POST /api/workflows
@@ -167,10 +163,14 @@
'from_history_id',
'shared_workflow_id',
'workflow',
- ] )
- if len( ways_to_create.intersection( payload ) ) > 1:
- trans.response.status = 403
- return "Only one among 'workflow_id', 'installed_repository_file', 'from_history_id' must be specified"
+ ] ).intersection( payload )
+ if len( ways_to_create ) == 0:
+ message = "One parameter among - %s - must be specified" % ", ".join( ways_to_create )
+ raise exceptions.RequestParameterMissingException( message )
+
+ if len( ways_to_create ) > 1:
+ message = "Only one parameter among - %s - must be specified" % ", ".join( ways_to_create )
+ raise exceptions.RequestParameterInvalidException( message )
if 'installed_repository_file' in payload:
workflow_controller = trans.webapp.controllers[ 'workflow' ]
@@ -208,8 +208,8 @@
workflow_id = payload.get( 'workflow_id', None )
if not workflow_id:
- trans.response.status = 403
- return "Either workflow_id, installed_repository_file or from_history_id must be specified"
+ message = "Invalid workflow_id specified."
+ raise exceptions.RequestParameterInvalidException( message )
# Pull other parameters out of payload.
param_map = payload.get( 'parameters', {} )
@@ -238,34 +238,24 @@
history_param = payload.get('history', '')
# Get workflow + accessibility check.
- stored_workflow = trans.sa_session.query(self.app.model.StoredWorkflow).get(trans.security.decode_id(workflow_id))
- if stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is not owned by or shared with current user")
+ stored_workflow = self.__get_stored_accessible_workflow( trans, workflow_id )
workflow = stored_workflow.latest_workflow
# Sanity checks.
- if not workflow:
- trans.response.status = 400
- return "Workflow not found."
if len( workflow.steps ) == 0:
- trans.response.status = 400
- return "Workflow cannot be run because it does not have any steps"
+ raise exceptions.MessageException( "Workflow cannot be run because it does not have any steps" )
if workflow.has_cycles:
- trans.response.status = 400
- return "Workflow cannot be run because it contains cycles"
+ raise exceptions.MessageException( "Workflow cannot be run because it contains cycles" )
if workflow.has_errors:
- trans.response.status = 400
- return "Workflow cannot be run because of validation errors in some steps"
+ message = "Workflow cannot be run because of validation errors in some steps"
+ raise exceptions.MessageException( message )
# Get target history.
if history_param.startswith('hist_id='):
# Passing an existing history to use.
- history = trans.sa_session.query(self.app.model.History).get(trans.security.decode_id(history_param[8:]))
- if history.user != trans.user and not trans.user_is_admin():
- trans.response.status = 400
- return "Invalid History specified."
+ encoded_history_id = history_param[ 8: ]
+ history_id = self.__decode_id( trans, encoded_history_id, model_type="history" )
+ history = self.history_manager.get( trans, history_id, check_ownership=True )
else:
# Send workflow outputs to new history.
history = self.app.model.History(name=history_param, user=trans.user)
@@ -297,8 +287,8 @@
inputs[k]['id']
)
else:
- trans.response.status = 400
- return "Unknown dataset source '%s' specified." % inputs[k]['src']
+ message = "Unknown workflow input source '%s' specified." % inputs[k]['src']
+ raise exceptions.RequestParameterInvalidException( message )
if add_to_history and content.history != history:
content = content.copy()
if isinstance( content, self.app.model.HistoryDatasetAssociation ):
@@ -307,8 +297,8 @@
history.add_dataset_collection( content )
inputs[k]['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
except AssertionError:
- trans.response.status = 400
- return "Invalid Dataset '%s' Specified" % inputs[k]['id']
+ message = "Invalid workflow input '%s' specified" % inputs[k]['id']
+ raise exceptions.ItemAccessibilityException( message )
# Run each step, connecting outputs to inputs
replacement_dict = payload.get('replacement_params', {})
@@ -321,6 +311,8 @@
param_map=param_map,
)
+ # invoke may throw MessageExceptions on tool erors, failure
+ # to match up inputs, etc...
outputs = invoke(
trans=trans,
workflow=workflow,
@@ -340,30 +332,22 @@
return rval
- @web.expose_api
+ @expose_api
def workflow_dict( self, trans, workflow_id, **kwd ):
"""
GET /api/workflows/{encoded_workflow_id}/download
Returns a selected workflow as a json dictionary.
"""
- try:
- stored_workflow = trans.sa_session.query(self.app.model.StoredWorkflow).get(trans.security.decode_id(workflow_id))
- except Exception, e:
- return ("Workflow with ID='%s' can not be found\n Exception: %s") % (workflow_id, str( e ))
- # check to see if user has permissions to selected workflow
- if stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is not owned by or shared with current user")
+ stored_workflow = self.__get_stored_accessible_workflow( trans, workflow_id )
ret_dict = self._workflow_to_dict( trans, stored_workflow )
if not ret_dict:
# This workflow has a tool that's missing from the distribution
- trans.response.status = 400
- return "Workflow cannot be exported due to missing tools."
+ message = "Workflow cannot be exported due to missing tools."
+ raise exceptions.MessageException( message )
return ret_dict
- @web.expose_api
+ @expose_api
def delete( self, trans, id, **kwd ):
"""
DELETE /api/workflows/{encoded_workflow_id}
@@ -392,7 +376,7 @@
# TODO: Unsure of response message to let api know that a workflow was successfully deleted
return ( "Workflow '%s' successfully deleted" % stored_workflow.name )
- @web.expose_api
+ @expose_api
def import_new_workflow_deprecated(self, trans, payload, **kwd):
"""
POST /api/workflows/upload
@@ -512,3 +496,32 @@
if out is not None:
return self.encode_all_ids( trans, out.to_dict('element'), True)
return None
+
+ def __get_stored_accessible_workflow( self, trans, workflow_id ):
+ stored_workflow = self.__get_stored_workflow( trans, workflow_id )
+
+ # check to see if user has permissions to selected workflow
+ if stored_workflow.user != trans.user and not trans.user_is_admin():
+ if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
+ message = "Workflow is not owned by or shared with current user"
+ raise exceptions.ItemAccessibilityException( message )
+
+ return stored_workflow
+
+ def __get_stored_workflow( self, trans, workflow_id ):
+ try:
+ workflow_id = self.__decode_id( trans, workflow_id )
+ query = trans.sa_session.query( trans.app.model.StoredWorkflow )
+ stored_workflow = query.get( workflow_id )
+ except Exception:
+ raise exceptions.ObjectNotFound( "No such workflow found - invalid workflow identifier." )
+ if stored_workflow is None:
+ raise exceptions.ObjectNotFound( "No such workflow found." )
+ return stored_workflow
+
+ def __decode_id( self, trans, workflow_id, model_type="workflow" ):
+ try:
+ return trans.security.decode_id( workflow_id )
+ except Exception:
+ message = "Malformed %s id ( %s ) specified, unable to decode" % ( model_type, workflow_id )
+ raise exceptions.MalformedId( message )
diff -r 479397aedd2b4cb074ac978377f4d27fa92476a6 -r ecc4c38e0529fb3352ad0534e71929f6f6b29e7f test/api/test_workflows.py
--- a/test/api/test_workflows.py
+++ b/test/api/test_workflows.py
@@ -9,6 +9,7 @@
from .helpers import skip_without_tool
from base.interactor import delete_request # requests like delete
+from galaxy.exceptions import error_codes
# Workflow API TODO:
@@ -24,6 +25,16 @@
self.dataset_populator = DatasetPopulator( self.galaxy_interactor )
self.dataset_collection_populator = DatasetCollectionPopulator( self.galaxy_interactor )
+ def test_show_invalid_is_404( self ):
+ show_response = self._get( "workflow/%s" % self._random_key() )
+ self._assert_status_code_is( show_response, 404 )
+
+ def test_cannot_show_private_workflow( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_not_importportable" )
+ with self._different_user():
+ show_response = self._get( "workflows/%s" % workflow_id )
+ self._assert_status_code_is( show_response, 403 )
+
def test_delete( self ):
workflow_id = self.workflow_populator.simple_workflow( "test_delete" )
workflow_name = "test_delete (imported from API)"
@@ -95,6 +106,29 @@
self._assert_status_code_is( run_workflow_response, 200 )
self.dataset_populator.wait_for_history( history_id, assert_ok=True )
+ def test_cannot_run_inaccessible_workflow( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_cannot_access" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ with self._different_user():
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 403 )
+
+ def test_404_on_invalid_workflow( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_does_not_exist" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ workflow_request[ "workflow_id" ] = self._random_key()
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 404 )
+
+ def test_cannot_run_against_other_users_history( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_does_not_exist" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ with self._different_user():
+ other_history_id = self.dataset_populator.new_history()
+ workflow_request[ "history" ] = "hist_id=%s" % other_history_id
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 403 )
+
@skip_without_tool( "cat1" )
@skip_without_tool( "collection_two_paired" )
def test_run_workflow_collection_params( self ):
@@ -243,6 +277,20 @@
collection_step_state = loads( collection_step[ "tool_state" ] )
self.assertEquals( collection_step_state[ "collection_type" ], u"paired" )
+ def test_empty_create( self ):
+ response = self._post( "workflows" )
+ self._assert_status_code_is( response, 400 )
+ self._assert_error_code_is( response, error_codes.USER_REQUEST_MISSING_PARAMETER )
+
+ def test_invalid_create_multiple_types( self ):
+ data = {
+ 'shared_workflow_id': '1234567890abcdef',
+ 'from_history_id': '1234567890abcdef'
+ }
+ response = self._post( "workflows", data )
+ self._assert_status_code_is( response, 400 )
+ self._assert_error_code_is( response, error_codes.USER_REQUEST_INVALID_PARAMETER )
+
@skip_without_tool( "random_lines1" )
def test_extract_mapping_workflow_from_history( self ):
history_id = self.dataset_populator.new_history()
https://bitbucket.org/galaxy/galaxy-central/commits/a3ac64b85faa/
Changeset: a3ac64b85faa
User: jmchilton
Date: 2014-08-08 15:16:55
Summary: Allow workflow uploads to specify publishable/importable.
Use new capabilities to improve workflow testing.
Affected #: 3 files
diff -r ecc4c38e0529fb3352ad0534e71929f6f6b29e7f -r a3ac64b85faa4e59d331277a801a2b5570a8ca7e lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -1664,7 +1664,7 @@
session.flush()
return imported_stored
- def _workflow_from_dict( self, trans, data, source=None, add_to_menu=False ):
+ def _workflow_from_dict( self, trans, data, source=None, add_to_menu=False, publish=False ):
"""
Creates a workflow from a dict. Created workflow is stored in the database and returned.
"""
@@ -1752,6 +1752,7 @@
workflow.stored_workflow = stored
stored.latest_workflow = workflow
stored.user = trans.user
+ stored.published = publish
if data[ 'annotation' ]:
self.add_item_annotation( trans.sa_session, stored.user, stored, data[ 'annotation' ] )
diff -r ecc4c38e0529fb3352ad0534e71929f6f6b29e7f -r a3ac64b85faa4e59d331277a801a2b5570a8ca7e lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -12,6 +12,7 @@
from galaxy.web import _future_expose_api as expose_api
from galaxy.web.base.controller import BaseAPIController, url_for, UsesStoredWorkflowMixin
from galaxy.web.base.controller import UsesHistoryMixin
+from galaxy.web.base.controller import SharableMixin
from galaxy.workflow.extract import extract_workflow
from galaxy.workflow.run import invoke
from galaxy.workflow.run import WorkflowRunConfig
@@ -19,7 +20,7 @@
log = logging.getLogger(__name__)
-class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesHistoryMixin, UsesAnnotations):
+class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesHistoryMixin, UsesAnnotations, SharableMixin):
def __init__( self, app ):
super( BaseAPIController, self ).__init__( app )
@@ -393,7 +394,22 @@
def __api_import_new_workflow( self, trans, payload, **kwd ):
data = payload['workflow']
- workflow, missing_tool_tups = self._workflow_from_dict( trans, data, source="API" )
+ publish = util.string_as_bool( payload.get( "publish", False ) )
+ # If 'publish' set, default to importable.
+ importable = util.string_as_bool( payload.get( "importable", publish ) )
+
+ if publish and not importable:
+ raise exceptions.RequestParameterInvalidException( "Published workflow must be importable." )
+
+ from_dict_kwds = dict(
+ source="API",
+ publish=publish,
+ )
+ workflow, missing_tool_tups = self._workflow_from_dict( trans, data, **from_dict_kwds )
+
+ if importable:
+ self._make_item_accessible( trans.sa_session, workflow )
+ trans.sa_session.flush()
# galaxy workflow newly created id
workflow_id = workflow.id
@@ -433,9 +449,9 @@
except:
raise exceptions.ObjectNotFound( "Malformed workflow id ( %s ) specified." % workflow_id )
if stored_workflow.importable is False:
- raise exceptions.MessageException( 'The owner of this workflow has disabled imports via this link.' )
+ raise exceptions.ItemAccessibilityException( 'The owner of this workflow has disabled imports via this link.' )
elif stored_workflow.deleted:
- raise exceptions.MessageException( "You can't import this workflow because it has been deleted." )
+ raise exceptions.ItemDeletionException( "You can't import this workflow because it has been deleted." )
imported_workflow = self._import_shared_workflow( trans, stored_workflow )
item = imported_workflow.to_dict( value_mapper={ 'id': trans.security.encode_id } )
encoded_id = trans.security.encode_id(imported_workflow.id)
diff -r ecc4c38e0529fb3352ad0534e71929f6f6b29e7f -r a3ac64b85faa4e59d331277a801a2b5570a8ca7e test/api/test_workflows.py
--- a/test/api/test_workflows.py
+++ b/test/api/test_workflows.py
@@ -75,6 +75,26 @@
self._assert_status_code_is( upload_response, 200 )
self._assert_user_has_workflow_with_name( "test_import (imported from API)" )
+ def test_import_deprecated( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_import_published_deprecated", publish=True )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id )
+ self._assert_status_code_is( other_import_response, 200 )
+ self._assert_user_has_workflow_with_name( "imported: test_import_published_deprecated (imported from API)")
+
+ def test_not_importable_prevents_import( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_not_importportable" )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id )
+ self._assert_status_code_is( other_import_response, 403 )
+
+ def test_import_published( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_import_published", publish=True )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id, deprecated_route=True )
+ self._assert_status_code_is( other_import_response, 200 )
+ self._assert_user_has_workflow_with_name( "imported: test_import_published (imported from API)")
+
def test_export( self ):
uploaded_workflow_id = self.workflow_populator.simple_workflow( "test_for_export" )
download_response = self._get( "workflows/%s/download" % uploaded_workflow_id )
@@ -609,3 +629,16 @@
self._assert_status_code_is( index_response, 200 )
names = map( lambda w: w[ "name" ], index_response.json() )
return names
+
+ def __import_workflow( self, workflow_id, deprecated_route=False ):
+ if deprecated_route:
+ route = "workflows/import"
+ import_data = dict(
+ workflow_id=workflow_id,
+ )
+ else:
+ route = "workflows"
+ import_data = dict(
+ shared_workflow_id=workflow_id,
+ )
+ return self._post( route, import_data )
https://bitbucket.org/galaxy/galaxy-central/commits/de2e33813275/
Changeset: de2e33813275
User: jmchilton
Date: 2014-08-09 15:15:11
Summary: Merged in jmchilton/galaxy-central-fork-1 (pull request #452)
More RESTful workflow API (attempt 3)
Affected #: 4 files
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -1664,7 +1664,7 @@
session.flush()
return imported_stored
- def _workflow_from_dict( self, trans, data, source=None, add_to_menu=False ):
+ def _workflow_from_dict( self, trans, data, source=None, add_to_menu=False, publish=False ):
"""
Creates a workflow from a dict. Created workflow is stored in the database and returned.
"""
@@ -1752,6 +1752,7 @@
workflow.stored_workflow = stored
stored.latest_workflow = workflow
stored.user = trans.user
+ stored.published = publish
if data[ 'annotation' ]:
self.add_item_annotation( trans.sa_session, stored.user, stored, data[ 'annotation' ] )
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -6,11 +6,13 @@
import logging
from sqlalchemy import desc, or_
-from galaxy import exceptions, util, web
+from galaxy import exceptions, util
from galaxy.model.item_attrs import UsesAnnotations
+from galaxy.managers import histories
from galaxy.web import _future_expose_api as expose_api
from galaxy.web.base.controller import BaseAPIController, url_for, UsesStoredWorkflowMixin
from galaxy.web.base.controller import UsesHistoryMixin
+from galaxy.web.base.controller import SharableMixin
from galaxy.workflow.extract import extract_workflow
from galaxy.workflow.run import invoke
from galaxy.workflow.run import WorkflowRunConfig
@@ -18,9 +20,13 @@
log = logging.getLogger(__name__)
-class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesHistoryMixin, UsesAnnotations):
+class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesHistoryMixin, UsesAnnotations, SharableMixin):
- @web.expose_api
+ def __init__( self, app ):
+ super( BaseAPIController, self ).__init__( app )
+ self.history_manager = histories.HistoryManager()
+
+ @expose_api
def index(self, trans, **kwd):
"""
GET /api/workflows
@@ -54,30 +60,21 @@
rval.append(item)
return rval
- @web.expose_api
+ @expose_api
def show(self, trans, id, **kwd):
"""
GET /api/workflows/{encoded_workflow_id}
Displays information needed to run a workflow from the command line.
"""
- workflow_id = id
- try:
- decoded_workflow_id = trans.security.decode_id(workflow_id)
- except TypeError:
- trans.response.status = 400
- return "Malformed workflow id ( %s ) specified, unable to decode." % str(workflow_id)
- try:
- stored_workflow = trans.sa_session.query(trans.app.model.StoredWorkflow).get(decoded_workflow_id)
- if stored_workflow.importable is False and stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is neither importable, nor owned by or shared with current user")
- except:
- trans.response.status = 400
- return "That workflow does not exist."
+ stored_workflow = self.__get_stored_workflow( trans, id )
+ if stored_workflow.importable is False and stored_workflow.user != trans.user and not trans.user_is_admin():
+ if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
+ message = "Workflow is neither importable, nor owned by or shared with current user"
+ raise exceptions.ItemAccessibilityException( message )
+
item = stored_workflow.to_dict( view='element', value_mapper={ 'id': trans.security.encode_id } )
- item['url'] = url_for('workflow', id=workflow_id)
+ item['url'] = url_for('workflow', id=id)
item['owner'] = stored_workflow.user.username
latest_workflow = stored_workflow.latest_workflow
inputs = {}
@@ -114,7 +111,7 @@
item['steps'] = steps
return item
- @web.expose_api
+ @expose_api
def create(self, trans, payload, **kwd):
"""
POST /api/workflows
@@ -161,10 +158,20 @@
:param workflow_name: If from_history_id is set - name of the workflow to create when extracting a workflow from history
:type workflow_name: str
"""
+ ways_to_create = set( [
+ 'workflow_id',
+ 'installed_repository_file',
+ 'from_history_id',
+ 'shared_workflow_id',
+ 'workflow',
+ ] ).intersection( payload )
+ if len( ways_to_create ) == 0:
+ message = "One parameter among - %s - must be specified" % ", ".join( ways_to_create )
+ raise exceptions.RequestParameterMissingException( message )
- if len( set( ['workflow_id', 'installed_repository_file', 'from_history_id'] ).intersection( payload ) ) > 1:
- trans.response.status = 403
- return "Only one among 'workflow_id', 'installed_repository_file', 'from_history_id' must be specified"
+ if len( ways_to_create ) > 1:
+ message = "Only one parameter among - %s - must be specified" % ", ".join( ways_to_create )
+ raise exceptions.RequestParameterInvalidException( message )
if 'installed_repository_file' in payload:
workflow_controller = trans.webapp.controllers[ 'workflow' ]
@@ -193,10 +200,17 @@
item[ 'url' ] = url_for( 'workflow', id=item[ 'id' ] )
return item
+ if 'shared_workflow_id' in payload:
+ workflow_id = payload[ 'shared_workflow_id' ]
+ return self.__api_import_shared_workflow( trans, workflow_id, payload )
+
+ if 'workflow' in payload:
+ return self.__api_import_new_workflow( trans, payload, **kwd )
+
workflow_id = payload.get( 'workflow_id', None )
if not workflow_id:
- trans.response.status = 403
- return "Either workflow_id, installed_repository_file or from_history_id must be specified"
+ message = "Invalid workflow_id specified."
+ raise exceptions.RequestParameterInvalidException( message )
# Pull other parameters out of payload.
param_map = payload.get( 'parameters', {} )
@@ -225,34 +239,24 @@
history_param = payload.get('history', '')
# Get workflow + accessibility check.
- stored_workflow = trans.sa_session.query(self.app.model.StoredWorkflow).get(trans.security.decode_id(workflow_id))
- if stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is not owned by or shared with current user")
+ stored_workflow = self.__get_stored_accessible_workflow( trans, workflow_id )
workflow = stored_workflow.latest_workflow
# Sanity checks.
- if not workflow:
- trans.response.status = 400
- return "Workflow not found."
if len( workflow.steps ) == 0:
- trans.response.status = 400
- return "Workflow cannot be run because it does not have any steps"
+ raise exceptions.MessageException( "Workflow cannot be run because it does not have any steps" )
if workflow.has_cycles:
- trans.response.status = 400
- return "Workflow cannot be run because it contains cycles"
+ raise exceptions.MessageException( "Workflow cannot be run because it contains cycles" )
if workflow.has_errors:
- trans.response.status = 400
- return "Workflow cannot be run because of validation errors in some steps"
+ message = "Workflow cannot be run because of validation errors in some steps"
+ raise exceptions.MessageException( message )
# Get target history.
if history_param.startswith('hist_id='):
# Passing an existing history to use.
- history = trans.sa_session.query(self.app.model.History).get(trans.security.decode_id(history_param[8:]))
- if history.user != trans.user and not trans.user_is_admin():
- trans.response.status = 400
- return "Invalid History specified."
+ encoded_history_id = history_param[ 8: ]
+ history_id = self.__decode_id( trans, encoded_history_id, model_type="history" )
+ history = self.history_manager.get( trans, history_id, check_ownership=True )
else:
# Send workflow outputs to new history.
history = self.app.model.History(name=history_param, user=trans.user)
@@ -284,8 +288,8 @@
inputs[k]['id']
)
else:
- trans.response.status = 400
- return "Unknown dataset source '%s' specified." % inputs[k]['src']
+ message = "Unknown workflow input source '%s' specified." % inputs[k]['src']
+ raise exceptions.RequestParameterInvalidException( message )
if add_to_history and content.history != history:
content = content.copy()
if isinstance( content, self.app.model.HistoryDatasetAssociation ):
@@ -294,8 +298,8 @@
history.add_dataset_collection( content )
inputs[k]['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
except AssertionError:
- trans.response.status = 400
- return "Invalid Dataset '%s' Specified" % inputs[k]['id']
+ message = "Invalid workflow input '%s' specified" % inputs[k]['id']
+ raise exceptions.ItemAccessibilityException( message )
# Run each step, connecting outputs to inputs
replacement_dict = payload.get('replacement_params', {})
@@ -308,6 +312,8 @@
param_map=param_map,
)
+ # invoke may throw MessageExceptions on tool erors, failure
+ # to match up inputs, etc...
outputs = invoke(
trans=trans,
workflow=workflow,
@@ -327,30 +333,22 @@
return rval
- @web.expose_api
+ @expose_api
def workflow_dict( self, trans, workflow_id, **kwd ):
"""
GET /api/workflows/{encoded_workflow_id}/download
Returns a selected workflow as a json dictionary.
"""
- try:
- stored_workflow = trans.sa_session.query(self.app.model.StoredWorkflow).get(trans.security.decode_id(workflow_id))
- except Exception, e:
- return ("Workflow with ID='%s' can not be found\n Exception: %s") % (workflow_id, str( e ))
- # check to see if user has permissions to selected workflow
- if stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is not owned by or shared with current user")
+ stored_workflow = self.__get_stored_accessible_workflow( trans, workflow_id )
ret_dict = self._workflow_to_dict( trans, stored_workflow )
if not ret_dict:
# This workflow has a tool that's missing from the distribution
- trans.response.status = 400
- return "Workflow cannot be exported due to missing tools."
+ message = "Workflow cannot be exported due to missing tools."
+ raise exceptions.MessageException( message )
return ret_dict
- @web.expose_api
+ @expose_api
def delete( self, trans, id, **kwd ):
"""
DELETE /api/workflows/{encoded_workflow_id}
@@ -379,19 +377,39 @@
# TODO: Unsure of response message to let api know that a workflow was successfully deleted
return ( "Workflow '%s' successfully deleted" % stored_workflow.name )
- @web.expose_api
- def import_new_workflow(self, trans, payload, **kwd):
+ @expose_api
+ def import_new_workflow_deprecated(self, trans, payload, **kwd):
"""
POST /api/workflows/upload
Importing dynamic workflows from the api. Return newly generated workflow id.
Author: rpark
# currently assumes payload['workflow'] is a json representation of a workflow to be inserted into the database
+
+ Deprecated in favor to POST /api/workflows with encoded 'workflow' in
+ payload the same way.
"""
+ return self.__api_import_new_workflow( trans, payload, **kwd )
+ def __api_import_new_workflow( self, trans, payload, **kwd ):
data = payload['workflow']
- workflow, missing_tool_tups = self._workflow_from_dict( trans, data, source="API" )
+ publish = util.string_as_bool( payload.get( "publish", False ) )
+ # If 'publish' set, default to importable.
+ importable = util.string_as_bool( payload.get( "importable", publish ) )
+
+ if publish and not importable:
+ raise exceptions.RequestParameterInvalidException( "Published workflow must be importable." )
+
+ from_dict_kwds = dict(
+ source="API",
+ publish=publish,
+ )
+ workflow, missing_tool_tups = self._workflow_from_dict( trans, data, **from_dict_kwds )
+
+ if importable:
+ self._make_item_accessible( trans.sa_session, workflow )
+ trans.sa_session.flush()
# galaxy workflow newly created id
workflow_id = workflow.id
@@ -409,7 +427,7 @@
return item
@expose_api
- def import_shared_workflow(self, trans, payload, **kwd):
+ def import_shared_workflow_deprecated(self, trans, payload, **kwd):
"""
POST /api/workflows/import
Import a workflow shared by other users.
@@ -423,14 +441,17 @@
workflow_id = payload.get('workflow_id', None)
if workflow_id is None:
raise exceptions.ObjectAttributeMissingException( "Missing required parameter 'workflow_id'." )
+ self.__api_import_shared_workflow( trans, workflow_id, payload )
+
+ def __api_import_shared_workflow( self, trans, workflow_id, payload, **kwd ):
try:
stored_workflow = self.get_stored_workflow( trans, workflow_id, check_ownership=False )
except:
raise exceptions.ObjectNotFound( "Malformed workflow id ( %s ) specified." % workflow_id )
if stored_workflow.importable is False:
- raise exceptions.MessageException( 'The owner of this workflow has disabled imports via this link.' )
+ raise exceptions.ItemAccessibilityException( 'The owner of this workflow has disabled imports via this link.' )
elif stored_workflow.deleted:
- raise exceptions.MessageException( "You can't import this workflow because it has been deleted." )
+ raise exceptions.ItemDeletionException( "You can't import this workflow because it has been deleted." )
imported_workflow = self._import_shared_workflow( trans, stored_workflow )
item = imported_workflow.to_dict( value_mapper={ 'id': trans.security.encode_id } )
encoded_id = trans.security.encode_id(imported_workflow.id)
@@ -491,3 +512,32 @@
if out is not None:
return self.encode_all_ids( trans, out.to_dict('element'), True)
return None
+
+ def __get_stored_accessible_workflow( self, trans, workflow_id ):
+ stored_workflow = self.__get_stored_workflow( trans, workflow_id )
+
+ # check to see if user has permissions to selected workflow
+ if stored_workflow.user != trans.user and not trans.user_is_admin():
+ if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
+ message = "Workflow is not owned by or shared with current user"
+ raise exceptions.ItemAccessibilityException( message )
+
+ return stored_workflow
+
+ def __get_stored_workflow( self, trans, workflow_id ):
+ try:
+ workflow_id = self.__decode_id( trans, workflow_id )
+ query = trans.sa_session.query( trans.app.model.StoredWorkflow )
+ stored_workflow = query.get( workflow_id )
+ except Exception:
+ raise exceptions.ObjectNotFound( "No such workflow found - invalid workflow identifier." )
+ if stored_workflow is None:
+ raise exceptions.ObjectNotFound( "No such workflow found." )
+ return stored_workflow
+
+ def __decode_id( self, trans, workflow_id, model_type="workflow" ):
+ try:
+ return trans.security.decode_id( workflow_id )
+ except Exception:
+ message = "Malformed %s id ( %s ) specified, unable to decode" % ( model_type, workflow_id )
+ raise exceptions.MalformedId( message )
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -213,13 +213,13 @@
webapp.add_route( '/visualization/show/:visualization_name',
controller='visualization', action='render', visualization_name=None )
- # "POST /api/workflows/import" => ``workflows.import_workflow()``.
- # Defines a named route "import_workflow".
- webapp.mapper.connect( 'import_workflow', '/api/workflows/upload', controller='workflows', action='import_new_workflow', conditions=dict( method=['POST'] ) )
+ # Deprecated in favor of POST /api/workflows with 'workflow' in payload.
+ webapp.mapper.connect( 'import_workflow_deprecated', '/api/workflows/upload', controller='workflows', action='import_new_workflow_deprecated', conditions=dict( method=['POST'] ) )
webapp.mapper.connect( 'workflow_dict', '/api/workflows/{workflow_id}/download', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
# Preserve the following download route for now for dependent applications -- deprecate at some point
webapp.mapper.connect( 'workflow_dict', '/api/workflows/download/{workflow_id}', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
- webapp.mapper.connect( 'import_shared_workflow', '/api/workflows/import', controller='workflows', action='import_shared_workflow', conditions=dict( method=['POST'] ) )
+ # Deprecated in favor of POST /api/workflows with shared_workflow_id in payload.
+ webapp.mapper.connect( 'import_shared_workflow_deprecated', '/api/workflows/import', controller='workflows', action='import_shared_workflow_deprecated', conditions=dict( method=['POST'] ) )
webapp.mapper.connect( 'workflow_usage', '/api/workflows/{workflow_id}/usage', controller='workflows', action='workflow_usage', conditions=dict(method=['GET']))
webapp.mapper.connect( 'workflow_usage_contents', '/api/workflows/{workflow_id}/usage/{usage_id}', controller='workflows', action='workflow_usage_contents', conditions=dict(method=['GET']))
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e test/api/test_workflows.py
--- a/test/api/test_workflows.py
+++ b/test/api/test_workflows.py
@@ -9,6 +9,7 @@
from .helpers import skip_without_tool
from base.interactor import delete_request # requests like delete
+from galaxy.exceptions import error_codes
# Workflow API TODO:
@@ -24,6 +25,16 @@
self.dataset_populator = DatasetPopulator( self.galaxy_interactor )
self.dataset_collection_populator = DatasetCollectionPopulator( self.galaxy_interactor )
+ def test_show_invalid_is_404( self ):
+ show_response = self._get( "workflow/%s" % self._random_key() )
+ self._assert_status_code_is( show_response, 404 )
+
+ def test_cannot_show_private_workflow( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_not_importportable" )
+ with self._different_user():
+ show_response = self._get( "workflows/%s" % workflow_id )
+ self._assert_status_code_is( show_response, 403 )
+
def test_delete( self ):
workflow_id = self.workflow_populator.simple_workflow( "test_delete" )
workflow_name = "test_delete (imported from API)"
@@ -46,14 +57,44 @@
self._assert_status_code_is( index_response, 200 )
assert isinstance( index_response.json(), list )
- def test_import( self ):
+ def test_upload( self ):
+ self.__test_upload( use_deprecated_route=False )
+
+ def test_upload_deprecated( self ):
+ self.__test_upload( use_deprecated_route=True )
+
+ def __test_upload( self, use_deprecated_route ):
data = dict(
workflow=dumps( self.workflow_populator.load_workflow( name="test_import" ) ),
)
- upload_response = self._post( "workflows/upload", data=data )
+ if use_deprecated_route:
+ route = "workflows/upload"
+ else:
+ route = "workflows"
+ upload_response = self._post( route, data=data )
self._assert_status_code_is( upload_response, 200 )
self._assert_user_has_workflow_with_name( "test_import (imported from API)" )
+ def test_import_deprecated( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_import_published_deprecated", publish=True )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id )
+ self._assert_status_code_is( other_import_response, 200 )
+ self._assert_user_has_workflow_with_name( "imported: test_import_published_deprecated (imported from API)")
+
+ def test_not_importable_prevents_import( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_not_importportable" )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id )
+ self._assert_status_code_is( other_import_response, 403 )
+
+ def test_import_published( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_import_published", publish=True )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id, deprecated_route=True )
+ self._assert_status_code_is( other_import_response, 200 )
+ self._assert_user_has_workflow_with_name( "imported: test_import_published (imported from API)")
+
def test_export( self ):
uploaded_workflow_id = self.workflow_populator.simple_workflow( "test_for_export" )
download_response = self._get( "workflows/%s/download" % uploaded_workflow_id )
@@ -85,6 +126,29 @@
self._assert_status_code_is( run_workflow_response, 200 )
self.dataset_populator.wait_for_history( history_id, assert_ok=True )
+ def test_cannot_run_inaccessible_workflow( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_cannot_access" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ with self._different_user():
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 403 )
+
+ def test_404_on_invalid_workflow( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_does_not_exist" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ workflow_request[ "workflow_id" ] = self._random_key()
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 404 )
+
+ def test_cannot_run_against_other_users_history( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_does_not_exist" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ with self._different_user():
+ other_history_id = self.dataset_populator.new_history()
+ workflow_request[ "history" ] = "hist_id=%s" % other_history_id
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 403 )
+
@skip_without_tool( "cat1" )
@skip_without_tool( "collection_two_paired" )
def test_run_workflow_collection_params( self ):
@@ -233,6 +297,20 @@
collection_step_state = loads( collection_step[ "tool_state" ] )
self.assertEquals( collection_step_state[ "collection_type" ], u"paired" )
+ def test_empty_create( self ):
+ response = self._post( "workflows" )
+ self._assert_status_code_is( response, 400 )
+ self._assert_error_code_is( response, error_codes.USER_REQUEST_MISSING_PARAMETER )
+
+ def test_invalid_create_multiple_types( self ):
+ data = {
+ 'shared_workflow_id': '1234567890abcdef',
+ 'from_history_id': '1234567890abcdef'
+ }
+ response = self._post( "workflows", data )
+ self._assert_status_code_is( response, 400 )
+ self._assert_error_code_is( response, error_codes.USER_REQUEST_INVALID_PARAMETER )
+
@skip_without_tool( "random_lines1" )
def test_extract_mapping_workflow_from_history( self ):
history_id = self.dataset_populator.new_history()
@@ -551,3 +629,16 @@
self._assert_status_code_is( index_response, 200 )
names = map( lambda w: w[ "name" ], index_response.json() )
return names
+
+ def __import_workflow( self, workflow_id, deprecated_route=False ):
+ if deprecated_route:
+ route = "workflows/import"
+ import_data = dict(
+ workflow_id=workflow_id,
+ )
+ else:
+ route = "workflows"
+ import_data = dict(
+ shared_workflow_id=workflow_id,
+ )
+ return self._post( route, import_data )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d0133648ddb9/
Changeset: d0133648ddb9
User: jmchilton
Date: 2014-08-08 17:42:20
Summary: Cleanup unused parameter left over in workflow controller.
Affected #: 1 file
diff -r 5f663734a26e8e2d1c462320741c86c9b5d9aef6 -r d0133648ddb96fc3e0c030c86802e0b6186b7f92 lib/galaxy/webapps/galaxy/controllers/workflow.py
--- a/lib/galaxy/webapps/galaxy/controllers/workflow.py
+++ b/lib/galaxy/webapps/galaxy/controllers/workflow.py
@@ -1226,7 +1226,7 @@
url_for( controller='workflow', action='run', id=workflow_id ) ) )
@web.expose
- def run( self, trans, id, history_id=None, multiple_input_mode="product", hide_fixed_params=False, **kwargs ):
+ def run( self, trans, id, history_id=None, hide_fixed_params=False, **kwargs ):
stored = self.get_stored_workflow( trans, id, check_ownership=False )
user = trans.get_user()
if stored.user != user:
@@ -1269,7 +1269,7 @@
# been POSTed
# List to gather values for the template
invocations = []
- for (kwargs, multi_input_keys) in _expand_multiple_inputs(kwargs, mode=multiple_input_mode):
+ for (kwargs, multi_input_keys) in _expand_multiple_inputs(kwargs):
for step in workflow.steps:
step.upgrade_messages = {}
# Connections by input name
@@ -1653,9 +1653,9 @@
return " on %s and %s" % (", ".join(instance_ds_names[0:-1]), instance_ds_names[-1])
-def _expand_multiple_inputs(kwargs, mode):
+def _expand_multiple_inputs(kwargs):
(single_inputs, matched_multi_inputs, multiplied_multi_inputs) = \
- _split_inputs(kwargs, mode)
+ _split_inputs(kwargs)
# Build up every combination of inputs to be run together.
input_combos = _extend_with_matched_combos(single_inputs, matched_multi_inputs)
@@ -1714,7 +1714,7 @@
return new_inputs
-def _split_inputs(kwargs, mode):
+def _split_inputs(kwargs):
"""
"""
input_keys = filter(lambda a: a.endswith('|input'), kwargs)
https://bitbucket.org/galaxy/galaxy-central/commits/fcbd2849ebd1/
Changeset: fcbd2849ebd1
User: jmchilton
Date: 2014-08-08 17:42:20
Summary: Some PEP-8 fixes for lib/galaxy/webapps/galaxy/controllers/workflow.py.
Affected #: 1 file
diff -r d0133648ddb96fc3e0c030c86802e0b6186b7f92 -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 lib/galaxy/webapps/galaxy/controllers/workflow.py
--- a/lib/galaxy/webapps/galaxy/controllers/workflow.py
+++ b/lib/galaxy/webapps/galaxy/controllers/workflow.py
@@ -51,7 +51,7 @@
use_panels = True
title = "Saved Workflows"
model_class = model.StoredWorkflow
- default_filter = { "name" : "All", "tags": "All" }
+ default_filter = { "name": "All", "tags": "All" }
default_sort_key = "-update_time"
columns = [
grids.TextColumn( "Name", key="name", attach_popup=True, filterable="advanced" ),
@@ -62,10 +62,11 @@
]
columns.append(
grids.MulticolFilterColumn(
- "Search",
- cols_to_filter=[ columns[0], columns[1] ],
- key="free-text-search", visible=False, filterable="standard" )
- )
+ "Search",
+ cols_to_filter=[ columns[0], columns[1] ],
+ key="free-text-search", visible=False, filterable="standard"
+ )
+ )
operations = [
grids.GridOperation( "Edit", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ),
grids.GridOperation( "Run", condition=( lambda item: not item.deleted ), async_compatible=False ),
@@ -95,19 +96,24 @@
]
columns.append(
grids.MulticolFilterColumn(
- "Search name, annotation, owner, and tags",
- cols_to_filter=[ columns[0], columns[1], columns[2], columns[4] ],
- key="free-text-search", visible=False, filterable="standard" )
- )
+ "Search name, annotation, owner, and tags",
+ cols_to_filter=[ columns[0], columns[1], columns[2], columns[4] ],
+ key="free-text-search", visible=False, filterable="standard"
+ )
+ )
operations = [
- grids.GridOperation( "Import",
- condition=( lambda item: not item.deleted ),
- allow_multiple=False,
- url_args=dict( action="imp" ) ),
- grids.GridOperation( "Save as File",
- condition=( lambda item: not item.deleted ),
- allow_multiple=False,
- url_args=dict( action="export_to_file" ) ),
+ grids.GridOperation(
+ "Import",
+ condition=( lambda item: not item.deleted ),
+ allow_multiple=False,
+ url_args=dict( action="imp")
+ ),
+ grids.GridOperation(
+ "Save as File",
+ condition=( lambda item: not item.deleted ),
+ allow_multiple=False,
+ url_args=dict( action="export_to_file" )
+ ),
]
def build_initial_query( self, trans, **kwargs ):
@@ -275,7 +281,7 @@
user_item_rating = 0
ave_item_rating, num_ratings = self.get_ave_item_rating_data( trans.sa_session, stored_workflow )
return trans.fill_template_mako( "workflow/display.mako", item=stored_workflow, item_data=stored_workflow.latest_workflow.steps,
- user_item_rating=user_item_rating, ave_item_rating=ave_item_rating, num_ratings=num_ratings )
+ user_item_rating=user_item_rating, ave_item_rating=ave_item_rating, num_ratings=num_ratings )
@web.expose
def get_item_content_async( self, trans, id ):
@@ -390,7 +396,7 @@
# Do import.
stored = self.get_stored_workflow( trans, id, check_ownership=False )
- if stored.importable == False:
+ if stored.importable is False:
return trans.show_error_message( "The owner of this workflow has disabled imports via this link.<br>You can %s" % referer_message, use_panels=True )
elif stored.deleted:
return trans.show_error_message( "You can't import this workflow because it has been deleted.<br>You can %s" % referer_message, use_panels=True )
@@ -415,7 +421,7 @@
if 'annotation' in kwargs:
# Set workflow annotation; sanitize annotation before adding it.
annotation = sanitize_html( kwargs[ 'annotation' ], 'utf-8', 'text/html' )
- self.add_item_annotation( trans.sa_session, trans.get_user(), stored, annotation )
+ self.add_item_annotation( trans.sa_session, trans.get_user(), stored, annotation )
trans.sa_session.flush()
return trans.fill_template( 'workflow/edit_attributes.mako',
stored=stored,
@@ -511,7 +517,7 @@
""" Returns workflow's name and link. """
stored = self.get_stored_workflow( trans, id )
- return_dict = { "name" : stored.name, "link" : url_for(controller='workflow', action="display_by_username_and_slug", username=stored.user.username, slug=stored.slug ) }
+ return_dict = { "name": stored.name, "link": url_for(controller='workflow', action="display_by_username_and_slug", username=stored.user.username, slug=stored.slug ) }
return return_dict
@web.expose
@@ -583,8 +589,8 @@
return self.editor( trans, id=trans.security.encode_id(stored_workflow.id ))
else:
return form( url_for(controller="workflow", action="create"), "Create New Workflow", submit_text="Create", use_panels=True ) \
- .add_text( "workflow_name", "Workflow Name", value="Unnamed workflow" ) \
- .add_text( "workflow_annotation", "Workflow Annotation", value="", help="A description of the workflow; annotation is shown alongside shared or published workflows." )
+ .add_text( "workflow_name", "Workflow Name", value="Unnamed workflow" ) \
+ .add_text( "workflow_annotation", "Workflow Annotation", value="", help="A description of the workflow; annotation is shown alongside shared or published workflows." )
@web.expose
def delete( self, trans, id=None ):
@@ -665,7 +671,7 @@
module = module_factory.new( trans, type, **kwargs )
return {
'type': module.type,
- 'name': module.get_name(),
+ 'name': module.get_name(),
'tool_id': module.get_tool_id(),
'tool_state': module.get_state(),
'tooltip': module.get_tooltip( static_path=url_for( '/static' ) ),
@@ -750,9 +756,9 @@
'data_inputs': module.get_data_inputs(),
'data_outputs': module.get_data_outputs(),
'form_html': module.get_config_form(),
- 'annotation' : annotation_str,
- 'post_job_actions' : {},
- 'workflow_outputs' : []
+ 'annotation': annotation_str,
+ 'post_job_actions': {},
+ 'workflow_outputs': []
}
# Connections
input_connections = step.input_connections
@@ -838,8 +844,8 @@
errors.append("Step %s requires tool '%s'." % (step_dict['id'], step_dict['tool_id']))
if errors:
return dict( name=workflow.name,
- message="This workflow includes missing or invalid tools. It cannot be saved until the following steps are removed or the missing tools are enabled.",
- errors=errors)
+ message="This workflow includes missing or invalid tools. It cannot be saved until the following steps are removed or the missing tools are enabled.",
+ errors=errors )
# First pass to build step objects and populate basic values
for key, step_dict in data['steps'].iteritems():
# Create the model class for the step
@@ -932,18 +938,19 @@
workflow_content = json.dumps( workflow_dict, indent=4, sort_keys=True )
# Create myExperiment request.
- request_raw = trans.fill_template( "workflow/myexp_export.mako", \
- workflow_name=workflow_dict['name'], \
- workflow_description=workflow_dict['annotation'], \
- workflow_content=workflow_content, \
- workflow_svg=self._workflow_to_svg_canvas( trans, stored ).standalone_xml()
- )
+ request_raw = trans.fill_template(
+ "workflow/myexp_export.mako",
+ workflow_name=workflow_dict['name'],
+ workflow_description=workflow_dict['annotation'],
+ workflow_content=workflow_content,
+ workflow_svg=self._workflow_to_svg_canvas( trans, stored ).standalone_xml()
+ )
# strip() b/c myExperiment XML parser doesn't allow white space before XML; utf-8 handles unicode characters.
request = unicode( request_raw.strip(), 'utf-8' )
# Do request and get result.
auth_header = base64.b64encode( '%s:%s' % ( myexp_username, myexp_password ))
- headers = { "Content-type": "text/xml", "Accept": "text/xml", "Authorization" : "Basic %s" % auth_header }
+ headers = { "Content-type": "text/xml", "Accept": "text/xml", "Authorization": "Basic %s" % auth_header }
myexp_url = trans.app.config.get( "myexperiment_url", self.__myexp_url )
conn = httplib.HTTPConnection( myexp_url )
# NOTE: blocks web thread.
@@ -958,14 +965,14 @@
myexp_workflow_id = parser.tag_content
workflow_list_str = " <br>Return to <a href='%s'>workflow list." % url_for( controller='workflow', action='list' )
if myexp_workflow_id:
- return trans.show_message( \
+ return trans.show_message(
"""Workflow '%s' successfully exported to myExperiment. <br/><a href="http://%s/workflows/%s">Click here to view the workflow on myExperiment</a> %s
""" % ( stored.name, myexp_url, myexp_workflow_id, workflow_list_str ),
use_panels=True )
else:
- return trans.show_error_message( \
- "Workflow '%s' could not be exported to myExperiment. Error: %s %s" % \
+ return trans.show_error_message(
+ "Workflow '%s' could not be exported to myExperiment. Error: %s %s" %
( stored.name, response_data, workflow_list_str ), use_panels=True )
@web.json_pretty
@@ -1205,10 +1212,10 @@
jobs, warnings = summarize( trans )
# Render
return trans.fill_template(
- "workflow/build_from_current_history.mako",
- jobs=jobs,
- warnings=warnings,
- history=history
+ "workflow/build_from_current_history.mako",
+ jobs=jobs,
+ warnings=warnings,
+ history=history
)
else:
stored_workflow = extract_workflow(
@@ -1223,7 +1230,7 @@
workflow_id = trans.security.encode_id( stored_workflow.id )
return trans.show_message( 'Workflow "%s" created from current history. You can <a href="%s" target="_parent">edit</a> or <a href="%s">run</a> the workflow.' %
( workflow_name, url_for( controller='workflow', action='editor', id=workflow_id ),
- url_for( controller='workflow', action='run', id=workflow_id ) ) )
+ url_for( controller='workflow', action='run', id=workflow_id ) ) )
@web.expose
def run( self, trans, id, history_id=None, hide_fixed_params=False, **kwargs ):
@@ -1350,8 +1357,8 @@
trans.sa_session.flush()
if invocations:
return trans.fill_template( "workflow/run_complete.mako",
- workflow=stored,
- invocations=invocations )
+ workflow=stored,
+ invocations=invocations )
else:
# Prepare each step
missing_tools = []
@@ -1388,24 +1395,27 @@
step.input_connections_by_name = dict( ( conn.input_name, conn ) for conn in step.input_connections )
if missing_tools:
stored.annotation = self.get_item_annotation_str( trans.sa_session, trans.user, stored )
- return trans.fill_template("workflow/run.mako",
- steps=[],
- workflow=stored,
- hide_fixed_params=hide_fixed_params,
- missing_tools=missing_tools)
+ return trans.fill_template(
+ "workflow/run.mako",
+ steps=[],
+ workflow=stored,
+ hide_fixed_params=hide_fixed_params,
+ missing_tools=missing_tools
+ )
# Render the form
stored.annotation = self.get_item_annotation_str( trans.sa_session, trans.user, stored )
return trans.fill_template(
- "workflow/run.mako",
- steps=workflow.steps,
- workflow=stored,
- has_upgrade_messages=has_upgrade_messages,
- step_version_changes=step_version_changes,
- errors=errors,
- incoming=kwargs,
- history_id=history_id,
- hide_fixed_params=hide_fixed_params,
- enable_unique_defaults=trans.app.config.enable_unique_workflow_defaults)
+ "workflow/run.mako",
+ steps=workflow.steps,
+ workflow=stored,
+ has_upgrade_messages=has_upgrade_messages,
+ step_version_changes=step_version_changes,
+ errors=errors,
+ incoming=kwargs,
+ history_id=history_id,
+ hide_fixed_params=hide_fixed_params,
+ enable_unique_defaults=trans.app.config.enable_unique_workflow_defaults
+ )
finally:
# restore the active history
if saved_history is not None:
@@ -1484,12 +1494,12 @@
step.input_connections_by_name = dict( ( conn.input_name, conn ) for conn in step.input_connections )
# Render the form
return trans.fill_template(
- "workflow/tag_outputs.mako",
- steps=workflow.steps,
- workflow=stored,
- has_upgrade_messages=has_upgrade_messages,
- errors=errors,
- incoming=kwargs
+ "workflow/tag_outputs.mako",
+ steps=workflow.steps,
+ workflow=stored,
+ has_upgrade_messages=has_upgrade_messages,
+ errors=errors,
+ incoming=kwargs
)
@web.expose
@@ -1539,7 +1549,7 @@
shared_by_others=shared_by_others,
ids_in_menu=ids_in_menu,
message=message,
- refresh_frames=['tools'] )
+ refresh_frames=refresh_frames )
def _workflow_to_svg_canvas( self, trans, stored ):
workflow = stored.latest_workflow
@@ -1619,17 +1629,17 @@
if len(step_dict['data_inputs']) > 0:
box_height += 15
sep_y = y + len(step_dict['data_inputs']) * line_px + 40
- text.append( svgfig.Line(x-margin, sep_y, x+width-margin, sep_y).SVG() ) #
+ text.append( svgfig.Line(x - margin, sep_y, x + width - margin, sep_y).SVG() )
# input/output box
- boxes.append( svgfig.Rect(x-margin, y+30, x+width-margin, y+30+box_height, fill="#ffffff").SVG() )
+ boxes.append( svgfig.Rect(x - margin, y + 30, x + width - margin, y + 30 + box_height, fill="#ffffff").SVG() )
for conn, output_dict in step_dict['input_connections'].iteritems():
in_coords = in_pos[step_dict['id']][conn]
out_conn_pos = out_pos[output_dict['id']][output_dict['output_name']]
adjusted = (out_conn_pos[0] + widths[output_dict['id']], out_conn_pos[1])
- text.append( svgfig.SVG("circle", cx=out_conn_pos[0]+widths[output_dict['id']]-margin, cy=out_conn_pos[1]-margin, r=5, fill="#ffffff" ) )
- connectors.append( svgfig.Line(adjusted[0], adjusted[1]-margin, in_coords[0]-10, in_coords[1], arrow_end="true" ).SVG() )
+ text.append( svgfig.SVG("circle", cx=out_conn_pos[0] + widths[output_dict['id']] - margin, cy=out_conn_pos[1] - margin, r=5, fill="#ffffff" ) )
+ connectors.append( svgfig.Line(adjusted[0], adjusted[1] - margin, in_coords[0] - 10, in_coords[1], arrow_end="true" ).SVG() )
canvas.append(connectors)
canvas.append(boxes)
@@ -1654,16 +1664,14 @@
def _expand_multiple_inputs(kwargs):
- (single_inputs, matched_multi_inputs, multiplied_multi_inputs) = \
- _split_inputs(kwargs)
+ (single_inputs, matched_multi_inputs, multiplied_multi_inputs) = _split_inputs(kwargs)
# Build up every combination of inputs to be run together.
input_combos = _extend_with_matched_combos(single_inputs, matched_multi_inputs)
input_combos = _extend_with_multiplied_combos(input_combos, multiplied_multi_inputs)
# Input name that are multiply specified
- multi_input_keys = \
- matched_multi_inputs.keys() + multiplied_multi_inputs.keys()
+ multi_input_keys = matched_multi_inputs.keys() + multiplied_multi_inputs.keys()
for input_combo in input_combos:
for key, value in input_combo.iteritems():
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: natefoo: Bug fix for display site changes.
by commits-noreply@bitbucket.org 07 Aug '14
by commits-noreply@bitbucket.org 07 Aug '14
07 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/5f663734a26e/
Changeset: 5f663734a26e
User: natefoo
Date: 2014-08-07 17:35:20
Summary: Bug fix for display site changes.
Affected #: 3 files
diff -r 103697ebdd339377424063fba0459cb3cc2b707c -r 5f663734a26e8e2d1c462320741c86c9b5d9aef6 lib/galaxy/datatypes/genetics.py
--- a/lib/galaxy/datatypes/genetics.py
+++ b/lib/galaxy/datatypes/genetics.py
@@ -85,7 +85,7 @@
if not dataset.dbkey:
dataset.dbkey = 'hg18' # punt!
if dataset.has_data():
- for site_name, site_url in app.build_sites.get_ucsc_by_build(dataset.dbkey):
+ for site_name, site_url in app.build_sites.get_ucsc_sites_by_build(dataset.dbkey):
if site_name in app.config.ucsc_display_sites:
site_url = site_url.replace('/hgTracks?','/hgGenome?') # for genome graphs
internal_url = "%s" % url_for( controller='dataset',
diff -r 103697ebdd339377424063fba0459cb3cc2b707c -r 5f663734a26e8e2d1c462320741c86c9b5d9aef6 lib/galaxy/datatypes/interval.py
--- a/lib/galaxy/datatypes/interval.py
+++ b/lib/galaxy/datatypes/interval.py
@@ -234,7 +234,7 @@
# Filter UCSC sites to only those that are supported by this build and
# enabled.
valid_sites = [ ( name, url )
- for name, url in app.build_sites.get_ucsc_by_build( dataset.dbkey )
+ for name, url in app.build_sites.get_ucsc_sites_by_build( dataset.dbkey )
if name in app.config.ucsc_display_sites ]
if not valid_sites:
return []
@@ -750,7 +750,7 @@
ret_val = []
seqid, start, stop = self.get_estimated_display_viewport( dataset )
if seqid is not None:
- for site_name, site_url in app.build_sites.get_ucsc_by_build( dataset.dbkey ):
+ for site_name, site_url in app.build_sites.get_ucsc_sites_by_build( dataset.dbkey ):
if site_name in app.config.ucsc_display_sites:
redirect_url = urllib.quote_plus(
"%sdb=%s&position=%s:%s-%s&hgt.customText=%%s" %
@@ -1103,7 +1103,7 @@
ret_val = []
chrom, start, stop = self.get_estimated_display_viewport( dataset )
if chrom is not None:
- for site_name, site_url in app.build_sites.get_ucsc_by_build( dataset.dbkey ):
+ for site_name, site_url in app.build_sites.get_ucsc_sites_by_build( dataset.dbkey ):
if site_name in app.config.ucsc_display_sites:
redirect_url = urllib.quote_plus( "%sdb=%s&position=%s:%s-%s&hgt.customText=%%s" % ( site_url, dataset.dbkey, chrom, start, stop ) )
link = self._get_remote_call_url( redirect_url, site_name, dataset, type, app, base_url )
@@ -1285,7 +1285,7 @@
ret_val = []
chrom, start, stop = self.get_estimated_display_viewport(dataset)
if chrom is not None:
- for site_name, site_url in app.build_sites.get_ucsc_by_build(dataset.dbkey):
+ for site_name, site_url in app.build_sites.get_ucsc_sites_by_build(dataset.dbkey):
if site_name in app.config.ucsc_display_sites:
internal_url = "%s" % url_for( controller='dataset', dataset_id=dataset.id, action='display_at', filename='ucsc_' + site_name )
display_url = urllib.quote_plus( "%s%s/display_as?id=%i&display_app=%s&authz_method=display_at" % (base_url, url_for( controller='root' ), dataset.id, type) )
diff -r 103697ebdd339377424063fba0459cb3cc2b707c -r 5f663734a26e8e2d1c462320741c86c9b5d9aef6 lib/galaxy/util/build_sites.py
--- a/lib/galaxy/util/build_sites.py
+++ b/lib/galaxy/util/build_sites.py
@@ -38,7 +38,7 @@
self._build_sites['ucsc'] = self.read_build_sites( self._app.config.ucsc_build_sites )
self._build_sites['gbrowse'] = self.read_build_sites( self._app.config.gbrowse_build_sites )
- def get_site_by_build( self, site_type, build ):
+ def _get_site_by_build( self, site_type, build ):
sites = []
for site in self._build_sites[site_type]:
if build in site['builds']:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
4 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d7bf7ad5c578/
Changeset: d7bf7ad5c578
Branch: next-stable
User: jmchilton
Date: 2014-08-07 15:35:43
Summary: Bugfix: Deal with BibTeX fields in a case insensitive fashion.
Would have thought the parser would have done this already - oh well.
Affected #: 2 files
diff -r 3976f4d59bc0d7b65575e7573f13fb7470c9bf53 -r d7bf7ad5c578e7d27a4a94c559ef336b2eb3eab0 static/scripts/mvc/citation/citation-model.js
--- a/static/scripts/mvc/citation/citation-model.js
+++ b/static/scripts/mvc/citation/citation-model.js
@@ -18,12 +18,19 @@
var bibtex = this.attributes.content;
var entry = new BibtexParser(bibtex).entries[0];
this.entry = entry;
+ this._fields = {};
+ var rawFields = entry.Fields;
+ for(key in rawFields) {
+ var value = rawFields[ key ];
+ var lowerKey = key.toLowerCase();
+ this._fields[ lowerKey ] = value;
+ }
},
entryType: function() {
return this.entry.EntryType;
},
fields: function() {
- return this.entry.Fields;
+ return this._fields;
}
} );
diff -r 3976f4d59bc0d7b65575e7573f13fb7470c9bf53 -r d7bf7ad5c578e7d27a4a94c559ef336b2eb3eab0 static/scripts/mvc/citation/citation-view.js
--- a/static/scripts/mvc/citation/citation-view.js
+++ b/static/scripts/mvc/citation/citation-view.js
@@ -55,9 +55,9 @@
this._asSentence(fields.note);
}
var doiUrl = "";
- if( fields.DOI ) {
- doiUrl = 'http://dx.doi.org/' + fields.DOI;
- ref += '[<a href="' + doiUrl + '">doi:' + fields.DOI + "</a>]";
+ if( fields.doi ) {
+ doiUrl = 'http://dx.doi.org/' + fields.doi;
+ ref += '[<a href="' + doiUrl + '">doi:' + fields.doi + "</a>]";
}
var url = fields.url || doiUrl;
if( url ) {
https://bitbucket.org/galaxy/galaxy-central/commits/ee8efcfd787f/
Changeset: ee8efcfd787f
Branch: next-stable
User: jmchilton
Date: 2014-08-07 15:35:43
Summary: Relax BibTeX parsing and accept header to handle figshare DOIs.
For instance 10.6084/m9.figshare.979190 reported by Michael Crusoe. JavaScript parser didn't like @data entries produced by figshare and when requesting the entry dx.doi.org returns a 403 response for type accept type text/bibliography, also allowing application/x-bibtex fixes this. Interestingly dx.doi.org throws 500 exceptions if application/x-bibtex is the only acceptable type or appears first for some other DOIs.
Affected #: 2 files
diff -r d7bf7ad5c578e7d27a4a94c559ef336b2eb3eab0 -r ee8efcfd787f93c77eb4e451084d64ce4dc6b85e lib/galaxy/managers/citations.py
--- a/lib/galaxy/managers/citations.py
+++ b/lib/galaxy/managers/citations.py
@@ -49,7 +49,7 @@
def _raw_get_bibtex( self, doi ):
dx_url = "http://dx.doi.org/" + doi
- headers = {'Accept': "text/bibliography; style=bibtex" }
+ headers = {'Accept': 'text/bibliography; style=bibtex, application/x-bibtex'}
req = urllib2.Request(dx_url, data="", headers=headers)
response = urllib2.urlopen(req)
bibtex = response.read()
diff -r d7bf7ad5c578e7d27a4a94c559ef336b2eb3eab0 -r ee8efcfd787f93c77eb4e451084d64ce4dc6b85e static/scripts/libs/bibtex.js
--- a/static/scripts/libs/bibtex.js
+++ b/static/scripts/libs/bibtex.js
@@ -93,6 +93,7 @@
'booklet' : 14,
'masterthesis' : 15,
'conference' : 16
+ ,'data' : 999 // Galaxy MOD: Handle @data citations coming from figshare.
}
/** @private */ this.MACROS_ = {
'jan' : 'January',
https://bitbucket.org/galaxy/galaxy-central/commits/990bc0688199/
Changeset: 990bc0688199
Branch: next-stable
User: jmchilton
Date: 2014-08-07 15:36:18
Summary: Pack scripts.
Affected #: 3 files
diff -r ee8efcfd787f93c77eb4e451084d64ce4dc6b85e -r 990bc0688199410ab08d5e8a418770b516c6f4e2 static/scripts/packed/libs/bibtex.js
--- a/static/scripts/packed/libs/bibtex.js
+++ b/static/scripts/packed/libs/bibtex.js
@@ -1,1 +1,1 @@
-function BibtexParser(c){if(typeof c=="string"){var d={};var a=[];function b(f){a.push(f)}var e=BibtexParser.call(d,b);e.parse(c);return{entries:a,errors:e.getErrors()}}if(typeof c!="function"){throw"Invalid parser construction."}this.STATES_={ENTRY_OR_JUNK:0,OBJECT_TYPE:1,ENTRY_KEY:2,KV_KEY:3,EQUALS:4,KV_VALUE:5};this.DATA_={};this.CALLBACK_=c;this.CHAR_=0;this.LINE_=1;this.CHAR_IN_LINE_=0;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={};this.SKIPTILLEOL_=false;this.VALBRACES_=null;this.BRACETYPE_=null;this.BRACECOUNT_=0;this.STATE_=this.STATES_.ENTRY_OR_JUNK;this.ERRORS_=[];this.ENTRY_TYPES_={inproceedings:1,proceedings:2,article:3,techreport:4,misc:5,mastersthesis:6,book:7,phdthesis:8,incollection:9,unpublished:10,inbook:11,manual:12,periodical:13,booklet:14,masterthesis:15,conference:16};this.MACROS_={jan:"January",feb:"February",mar:"March",apr:"April",may:"May",jun:"June",jul:"July",aug:"August",sep:"September",oct:"October",nov:"November",dec:"December",Jan:"January",Feb:"February",Mar:"March",Apr:"April",May:"May",Jun:"June",Jul:"July",Aug:"August",Sep:"September",Oct:"October",Nov:"November",Dec:"December"};this.getErrors=function(){return this.ERRORS_};this.parse=function(f){for(var g=0;g<f.length;g++){this.processCharacter_(f[g])}};this.error_=function(f){this.ERRORS_.push([this.LINE_,this.CHAR_IN_LINE_,this.CHAR_,f])};this.processEntry_=function(){var h=this.DATA_;if(h.Fields){for(var k in h.Fields){var p=h.Fields[k];for(var j=0;j<this.CHARCONV_.length;j++){var q=this.CHARCONV_[j][0];var n=this.CHARCONV_[j][1];p=p.replace(q,n)}p=p.replace(/[\n\r\t]/g," ").replace(/\s\s+/g," ").replace(/^\s+|\s+$/g,"");var l=p.length;var g="";for(var j=0;j<l;j++){var m=p[j];var o=false;if(m=="\\"&&j<l-1){m=p[++j]}else{if(m=="{"||m=="}"){o=true}}if(!o){g+=m}}h.Fields[k]=g}}if(h.ObjectType=="string"){for(var k in h.Fields){this.MACROS_[k]=h.Fields[k]}}else{this.CALLBACK_(h)}};this.processCharacter_=function(l){this.CHAR_++;this.CHAR_IN_LINE_++;if(l=="\n"){this.LINE_++;this.CHAR_IN_LINE_=1}if(this.SKIPTILLEOL_){if(l=="\n"){this.SKIPTILLEOL_=false}return}if(this.SKIPCOMMENT_&&l=="%"){this.SKIPTILLEOL_=true;return}if(this.SKIPWS_&&/\s/.test(l)){return}this.SKIPWS_=false;this.SKIPCOMMENT_=false;this.SKIPTILLEOL_=false;var f=true;while(f){f=false;switch(this.STATE_){case this.STATES_.ENTRY_OR_JUNK:if(l=="@"){this.STATE_=this.STATES_.OBJECT_TYPE;this.DATA_={ObjectType:""}}this.BRACETYPE_=null;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break;case this.STATES_.OBJECT_TYPE:if(/[A-Za-z]/.test(l)){this.DATA_.ObjectType+=l.toLowerCase();this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{var i=this.DATA_.ObjectType;if(i=="comment"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i=="string"){this.DATA_.ObjectType=i;this.DATA_.Fields={};this.BRACETYPE_=l;this.BRACECOUNT_=1;this.STATE_=this.STATES_.KV_KEY;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={Key:""}}else{if(i=="preamble"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i in this.ENTRY_TYPES_){this.DATA_.ObjectType="entry";this.DATA_.EntryType=i;this.DATA_.EntryKey="";this.STATE_=this.STATES_.ENTRY_KEY;f=true}else{this.error_('Unrecognized object type: "'+this.DATA_.ObjectType+'"');this.STATE_=this.STATES_.ENTRY_OR_JUNK}}}}}break;case this.STATES_.ENTRY_KEY:if((l==="{"||l==="(")&&this.BRACETYPE_==null){this.BRACETYPE_=l;this.BRACECOUNT_=1;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break}if(/[,%\s]/.test(l)){if(this.DATA_.EntryKey.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{if(this.BRACETYPE_==null){this.error_("No opening brace for object.");this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;f=true;this.STATE_=this.STATES_.KV_KEY;this.PARSETMP_.Key="";this.DATA_.Fields={}}}}else{this.DATA_.EntryKey+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}break;case this.STATES_.KV_KEY:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(/[\-A-Za-z:]/.test(l)){this.PARSETMP_.Key+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{if(this.PARSETMP_.Key.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.EQUALS;f=true}}break;case this.STATES_.EQUALS:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.error_('Key-value pair has key "'+this.PARSETMP_.Key+'", but no value.');this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(l=="="){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_VALUE;this.PARSETMP_.Value="";this.VALBRACES_={'"':[],"{":[]}}break;case this.STATES_.KV_VALUE:var k=this.VALBRACES_;var j=this.PARSETMP_.Value;var h=false;if(l=='"'||l=="{"||l=="}"||l==","){if(l==","){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}h=true}}if(l=='"'){if(0===k['"'].length+k["{"].length){k['"'].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false;break}if(k['"'].length==1&&k["{"].length==0&&(j.length==0||j[j.length-1]!="\\")){h=true}else{}}if(l=="{"){if(j.length==0||j[j.length-1]!="\\"){k["{"].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{}}if(l=="}"){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}f=true;h=true}else{if(j.length==0||j[j.length-1]!="\\"){if(k["{"].length>0){k["{"].splice(k["{"].length-1,1);if(0==k["{"].length+k['"'].length){h=true}else{}}}else{}}}}if(h){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_KEY;this.DATA_.Fields[this.PARSETMP_.Key]=this.PARSETMP_.Value;this.PARSETMP_={Key:""};this.VALBRACES_=null}else{this.PARSETMP_.Value+=l}break}}};this.CHARCONV_=[[/\\space /g,"\u0020"],[/\\textdollar /g,"\u0024"],[/\\textquotesingle /g,"\u0027"],[/\\ast /g,"\u002A"],[/\\textbackslash /g,"\u005C"],[/\\\^\{\}/g,"\u005E"],[/\\textasciigrave /g,"\u0060"],[/\\lbrace /g,"\u007B"],[/\\vert /g,"\u007C"],[/\\rbrace /g,"\u007D"],[/\\textasciitilde /g,"\u007E"],[/\\textexclamdown /g,"\u00A1"],[/\\textcent /g,"\u00A2"],[/\\textsterling /g,"\u00A3"],[/\\textcurrency /g,"\u00A4"],[/\\textyen /g,"\u00A5"],[/\\textbrokenbar /g,"\u00A6"],[/\\textsection /g,"\u00A7"],[/\\textasciidieresis /g,"\u00A8"],[/\\textcopyright /g,"\u00A9"],[/\\textordfeminine /g,"\u00AA"],[/\\guillemotleft /g,"\u00AB"],[/\\lnot /g,"\u00AC"],[/\\textregistered /g,"\u00AE"],[/\\textasciimacron /g,"\u00AF"],[/\\textdegree /g,"\u00B0"],[/\\pm /g,"\u00B1"],[/\\textasciiacute /g,"\u00B4"],[/\\mathrm\{\\mu\}/g,"\u00B5"],[/\\textparagraph /g,"\u00B6"],[/\\cdot /g,"\u00B7"],[/\\c\{\}/g,"\u00B8"],[/\\textordmasculine /g,"\u00BA"],[/\\guillemotright /g,"\u00BB"],[/\\textonequarter /g,"\u00BC"],[/\\textonehalf /g,"\u00BD"],[/\\textthreequarters /g,"\u00BE"],[/\\textquestiondown /g,"\u00BF"],[/\\`\{A\}/g,"\u00C0"],[/\\'\{A\}/g,"\u00C1"],[/\\\^\{A\}/g,"\u00C2"],[/\\~\{A\}/g,"\u00C3"],[/\\"\{A\}/g,"\u00C4"],[/\\AA /g,"\u00C5"],[/\\AE /g,"\u00C6"],[/\\c\{C\}/g,"\u00C7"],[/\\`\{E\}/g,"\u00C8"],[/\\'\{E\}/g,"\u00C9"],[/\\\^\{E\}/g,"\u00CA"],[/\\"\{E\}/g,"\u00CB"],[/\\`\{I\}/g,"\u00CC"],[/\\'\{I\}/g,"\u00CD"],[/\\\^\{I\}/g,"\u00CE"],[/\\"\{I\}/g,"\u00CF"],[/\\DH /g,"\u00D0"],[/\\~\{N\}/g,"\u00D1"],[/\\`\{O\}/g,"\u00D2"],[/\\'\{O\}/g,"\u00D3"],[/\\\^\{O\}/g,"\u00D4"],[/\\~\{O\}/g,"\u00D5"],[/\\"\{O\}/g,"\u00D6"],[/\\texttimes /g,"\u00D7"],[/\\O /g,"\u00D8"],[/\\`\{U\}/g,"\u00D9"],[/\\'\{U\}/g,"\u00DA"],[/\\\^\{U\}/g,"\u00DB"],[/\\"\{U\}/g,"\u00DC"],[/\\'\{Y\}/g,"\u00DD"],[/\\TH /g,"\u00DE"],[/\\ss /g,"\u00DF"],[/\\`\{a\}/g,"\u00E0"],[/\\'\{a\}/g,"\u00E1"],[/\\\^\{a\}/g,"\u00E2"],[/\\~\{a\}/g,"\u00E3"],[/\\"\{a\}/g,"\u00E4"],[/\\aa /g,"\u00E5"],[/\\ae /g,"\u00E6"],[/\\c\{c\}/g,"\u00E7"],[/\\`\{e\}/g,"\u00E8"],[/\\'\{e\}/g,"\u00E9"],[/\\\^\{e\}/g,"\u00EA"],[/\\"\{e\}/g,"\u00EB"],[/\\`\{\\i\}/g,"\u00EC"],[/\\'\{\\i\}/g,"\u00ED"],[/\\\^\{\\i\}/g,"\u00EE"],[/\\"\{\\i\}/g,"\u00EF"],[/\\dh /g,"\u00F0"],[/\\~\{n\}/g,"\u00F1"],[/\\`\{o\}/g,"\u00F2"],[/\\'\{o\}/g,"\u00F3"],[/\\\^\{o\}/g,"\u00F4"],[/\\~\{o\}/g,"\u00F5"],[/\\"\{o\}/g,"\u00F6"],[/\\div /g,"\u00F7"],[/\\o /g,"\u00F8"],[/\\`\{u\}/g,"\u00F9"],[/\\'\{u\}/g,"\u00FA"],[/\\\^\{u\}/g,"\u00FB"],[/\\"\{u\}/g,"\u00FC"],[/\\'\{y\}/g,"\u00FD"],[/\\th /g,"\u00FE"],[/\\"\{y\}/g,"\u00FF"],[/\\=\{A\}/g,"\u0100"],[/\\=\{a\}/g,"\u0101"],[/\\u\{A\}/g,"\u0102"],[/\\u\{a\}/g,"\u0103"],[/\\k\{A\}/g,"\u0104"],[/\\k\{a\}/g,"\u0105"],[/\\'\{C\}/g,"\u0106"],[/\\'\{c\}/g,"\u0107"],[/\\\^\{C\}/g,"\u0108"],[/\\\^\{c\}/g,"\u0109"],[/\\.\{C\}/g,"\u010A"],[/\\.\{c\}/g,"\u010B"],[/\\v\{C\}/g,"\u010C"],[/\\v\{c\}/g,"\u010D"],[/\\v\{D\}/g,"\u010E"],[/\\v\{d\}/g,"\u010F"],[/\\DJ /g,"\u0110"],[/\\dj /g,"\u0111"],[/\\=\{E\}/g,"\u0112"],[/\\=\{e\}/g,"\u0113"],[/\\u\{E\}/g,"\u0114"],[/\\u\{e\}/g,"\u0115"],[/\\.\{E\}/g,"\u0116"],[/\\.\{e\}/g,"\u0117"],[/\\k\{E\}/g,"\u0118"],[/\\k\{e\}/g,"\u0119"],[/\\v\{E\}/g,"\u011A"],[/\\v\{e\}/g,"\u011B"],[/\\\^\{G\}/g,"\u011C"],[/\\\^\{g\}/g,"\u011D"],[/\\u\{G\}/g,"\u011E"],[/\\u\{g\}/g,"\u011F"],[/\\.\{G\}/g,"\u0120"],[/\\.\{g\}/g,"\u0121"],[/\\c\{G\}/g,"\u0122"],[/\\c\{g\}/g,"\u0123"],[/\\\^\{H\}/g,"\u0124"],[/\\\^\{h\}/g,"\u0125"],[/\\Elzxh /g,"\u0127"],[/\\~\{I\}/g,"\u0128"],[/\\~\{\\i\}/g,"\u0129"],[/\\=\{I\}/g,"\u012A"],[/\\=\{\\i\}/g,"\u012B"],[/\\u\{I\}/g,"\u012C"],[/\\u\{\\i\}/g,"\u012D"],[/\\k\{I\}/g,"\u012E"],[/\\k\{i\}/g,"\u012F"],[/\\.\{I\}/g,"\u0130"],[/\\i /g,"\u0131"],[/\\\^\{J\}/g,"\u0134"],[/\\\^\{\\j\}/g,"\u0135"],[/\\c\{K\}/g,"\u0136"],[/\\c\{k\}/g,"\u0137"],[/\\'\{L\}/g,"\u0139"],[/\\'\{l\}/g,"\u013A"],[/\\c\{L\}/g,"\u013B"],[/\\c\{l\}/g,"\u013C"],[/\\v\{L\}/g,"\u013D"],[/\\v\{l\}/g,"\u013E"],[/\\L /g,"\u0141"],[/\\l /g,"\u0142"],[/\\'\{N\}/g,"\u0143"],[/\\'\{n\}/g,"\u0144"],[/\\c\{N\}/g,"\u0145"],[/\\c\{n\}/g,"\u0146"],[/\\v\{N\}/g,"\u0147"],[/\\v\{n\}/g,"\u0148"],[/\\NG /g,"\u014A"],[/\\ng /g,"\u014B"],[/\\=\{O\}/g,"\u014C"],[/\\=\{o\}/g,"\u014D"],[/\\u\{O\}/g,"\u014E"],[/\\u\{o\}/g,"\u014F"],[/\\H\{O\}/g,"\u0150"],[/\\H\{o\}/g,"\u0151"],[/\\OE /g,"\u0152"],[/\\oe /g,"\u0153"],[/\\'\{R\}/g,"\u0154"],[/\\'\{r\}/g,"\u0155"],[/\\c\{R\}/g,"\u0156"],[/\\c\{r\}/g,"\u0157"],[/\\v\{R\}/g,"\u0158"],[/\\v\{r\}/g,"\u0159"],[/\\'\{S\}/g,"\u015A"],[/\\'\{s\}/g,"\u015B"],[/\\\^\{S\}/g,"\u015C"],[/\\\^\{s\}/g,"\u015D"],[/\\c\{S\}/g,"\u015E"],[/\\c\{s\}/g,"\u015F"],[/\\v\{S\}/g,"\u0160"],[/\\v\{s\}/g,"\u0161"],[/\\c\{T\}/g,"\u0162"],[/\\c\{t\}/g,"\u0163"],[/\\v\{T\}/g,"\u0164"],[/\\v\{t\}/g,"\u0165"],[/\\~\{U\}/g,"\u0168"],[/\\~\{u\}/g,"\u0169"],[/\\=\{U\}/g,"\u016A"],[/\\=\{u\}/g,"\u016B"],[/\\u\{U\}/g,"\u016C"],[/\\u\{u\}/g,"\u016D"],[/\\r\{U\}/g,"\u016E"],[/\\r\{u\}/g,"\u016F"],[/\\H\{U\}/g,"\u0170"],[/\\H\{u\}/g,"\u0171"],[/\\k\{U\}/g,"\u0172"],[/\\k\{u\}/g,"\u0173"],[/\\\^\{W\}/g,"\u0174"],[/\\\^\{w\}/g,"\u0175"],[/\\\^\{Y\}/g,"\u0176"],[/\\\^\{y\}/g,"\u0177"],[/\\"\{Y\}/g,"\u0178"],[/\\'\{Z\}/g,"\u0179"],[/\\'\{z\}/g,"\u017A"],[/\\.\{Z\}/g,"\u017B"],[/\\.\{z\}/g,"\u017C"],[/\\v\{Z\}/g,"\u017D"],[/\\v\{z\}/g,"\u017E"],[/\\texthvlig /g,"\u0195"],[/\\textnrleg /g,"\u019E"],[/\\eth /g,"\u01AA"],[/\\textdoublepipe /g,"\u01C2"],[/\\'\{g\}/g,"\u01F5"],[/\\Elztrna /g,"\u0250"],[/\\Elztrnsa /g,"\u0252"],[/\\Elzopeno /g,"\u0254"],[/\\Elzrtld /g,"\u0256"],[/\\Elzschwa /g,"\u0259"],[/\\varepsilon /g,"\u025B"],[/\\Elzpgamma /g,"\u0263"],[/\\Elzpbgam /g,"\u0264"],[/\\Elztrnh /g,"\u0265"],[/\\Elzbtdl /g,"\u026C"],[/\\Elzrtll /g,"\u026D"],[/\\Elztrnm /g,"\u026F"],[/\\Elztrnmlr /g,"\u0270"],[/\\Elzltlmr /g,"\u0271"],[/\\Elzltln /g,"\u0272"],[/\\Elzrtln /g,"\u0273"],[/\\Elzclomeg /g,"\u0277"],[/\\textphi /g,"\u0278"],[/\\Elztrnr /g,"\u0279"],[/\\Elztrnrl /g,"\u027A"],[/\\Elzrttrnr /g,"\u027B"],[/\\Elzrl /g,"\u027C"],[/\\Elzrtlr /g,"\u027D"],[/\\Elzfhr /g,"\u027E"],[/\\Elzrtls /g,"\u0282"],[/\\Elzesh /g,"\u0283"],[/\\Elztrnt /g,"\u0287"],[/\\Elzrtlt /g,"\u0288"],[/\\Elzpupsil /g,"\u028A"],[/\\Elzpscrv /g,"\u028B"],[/\\Elzinvv /g,"\u028C"],[/\\Elzinvw /g,"\u028D"],[/\\Elztrny /g,"\u028E"],[/\\Elzrtlz /g,"\u0290"],[/\\Elzyogh /g,"\u0292"],[/\\Elzglst /g,"\u0294"],[/\\Elzreglst /g,"\u0295"],[/\\Elzinglst /g,"\u0296"],[/\\textturnk /g,"\u029E"],[/\\Elzdyogh /g,"\u02A4"],[/\\Elztesh /g,"\u02A7"],[/\\textasciicaron /g,"\u02C7"],[/\\Elzverts /g,"\u02C8"],[/\\Elzverti /g,"\u02CC"],[/\\Elzlmrk /g,"\u02D0"],[/\\Elzhlmrk /g,"\u02D1"],[/\\Elzsbrhr /g,"\u02D2"],[/\\Elzsblhr /g,"\u02D3"],[/\\Elzrais /g,"\u02D4"],[/\\Elzlow /g,"\u02D5"],[/\\textasciibreve /g,"\u02D8"],[/\\textperiodcentered /g,"\u02D9"],[/\\r\{\}/g,"\u02DA"],[/\\k\{\}/g,"\u02DB"],[/\\texttildelow /g,"\u02DC"],[/\\H\{\}/g,"\u02DD"],[/\\tone\{55\}/g,"\u02E5"],[/\\tone\{44\}/g,"\u02E6"],[/\\tone\{33\}/g,"\u02E7"],[/\\tone\{22\}/g,"\u02E8"],[/\\tone\{11\}/g,"\u02E9"],[/\\cyrchar\\C/g,"\u030F"],[/\\Elzpalh /g,"\u0321"],[/\\Elzrh /g,"\u0322"],[/\\Elzsbbrg /g,"\u032A"],[/\\Elzxl /g,"\u0335"],[/\\Elzbar /g,"\u0336"],[/\\'\{A\}/g,"\u0386"],[/\\'\{E\}/g,"\u0388"],[/\\'\{H\}/g,"\u0389"],[/\\'\{\}\{I\}/g,"\u038A"],[/\\'\{\}O/g,"\u038C"],[/\\mathrm\{'Y\}/g,"\u038E"],[/\\mathrm\{'\\Omega\}/g,"\u038F"],[/\\acute\{\\ddot\{\\iota\}\}/g,"\u0390"],[/\\Alpha /g,"\u0391"],[/\\Beta /g,"\u0392"],[/\\Gamma /g,"\u0393"],[/\\Delta /g,"\u0394"],[/\\Epsilon /g,"\u0395"],[/\\Zeta /g,"\u0396"],[/\\Eta /g,"\u0397"],[/\\Theta /g,"\u0398"],[/\\Iota /g,"\u0399"],[/\\Kappa /g,"\u039A"],[/\\Lambda /g,"\u039B"],[/\\Xi /g,"\u039E"],[/\\Pi /g,"\u03A0"],[/\\Rho /g,"\u03A1"],[/\\Sigma /g,"\u03A3"],[/\\Tau /g,"\u03A4"],[/\\Upsilon /g,"\u03A5"],[/\\Phi /g,"\u03A6"],[/\\Chi /g,"\u03A7"],[/\\Psi /g,"\u03A8"],[/\\Omega /g,"\u03A9"],[/\\mathrm\{\\ddot\{I\}\}/g,"\u03AA"],[/\\mathrm\{\\ddot\{Y\}\}/g,"\u03AB"],[/\\'\{\$\\alpha\$\}/g,"\u03AC"],[/\\acute\{\\epsilon\}/g,"\u03AD"],[/\\acute\{\\eta\}/g,"\u03AE"],[/\\acute\{\\iota\}/g,"\u03AF"],[/\\acute\{\\ddot\{\\upsilon\}\}/g,"\u03B0"],[/\\alpha /g,"\u03B1"],[/\\beta /g,"\u03B2"],[/\\gamma /g,"\u03B3"],[/\\delta /g,"\u03B4"],[/\\epsilon /g,"\u03B5"],[/\\zeta /g,"\u03B6"],[/\\eta /g,"\u03B7"],[/\\texttheta /g,"\u03B8"],[/\\iota /g,"\u03B9"],[/\\kappa /g,"\u03BA"],[/\\lambda /g,"\u03BB"],[/\\mu /g,"\u03BC"],[/\\nu /g,"\u03BD"],[/\\xi /g,"\u03BE"],[/\\pi /g,"\u03C0"],[/\\rho /g,"\u03C1"],[/\\varsigma /g,"\u03C2"],[/\\sigma /g,"\u03C3"],[/\\tau /g,"\u03C4"],[/\\upsilon /g,"\u03C5"],[/\\varphi /g,"\u03C6"],[/\\chi /g,"\u03C7"],[/\\psi /g,"\u03C8"],[/\\omega /g,"\u03C9"],[/\\ddot\{\\iota\}/g,"\u03CA"],[/\\ddot\{\\upsilon\}/g,"\u03CB"],[/\\'\{o\}/g,"\u03CC"],[/\\acute\{\\upsilon\}/g,"\u03CD"],[/\\acute\{\\omega\}/g,"\u03CE"],[/\\Pisymbol\{ppi022\}\{87\}/g,"\u03D0"],[/\\textvartheta /g,"\u03D1"],[/\\Upsilon /g,"\u03D2"],[/\\phi /g,"\u03D5"],[/\\varpi /g,"\u03D6"],[/\\Stigma /g,"\u03DA"],[/\\Digamma /g,"\u03DC"],[/\\digamma /g,"\u03DD"],[/\\Koppa /g,"\u03DE"],[/\\Sampi /g,"\u03E0"],[/\\varkappa /g,"\u03F0"],[/\\varrho /g,"\u03F1"],[/\\textTheta /g,"\u03F4"],[/\\backepsilon /g,"\u03F6"],[/\\cyrchar\\CYRYO /g,"\u0401"],[/\\cyrchar\\CYRDJE /g,"\u0402"],[/\\cyrchar\{\\'\\CYRG\}/g,"\u0403"],[/\\cyrchar\\CYRIE /g,"\u0404"],[/\\cyrchar\\CYRDZE /g,"\u0405"],[/\\cyrchar\\CYRII /g,"\u0406"],[/\\cyrchar\\CYRYI /g,"\u0407"],[/\\cyrchar\\CYRJE /g,"\u0408"],[/\\cyrchar\\CYRLJE /g,"\u0409"],[/\\cyrchar\\CYRNJE /g,"\u040A"],[/\\cyrchar\\CYRTSHE /g,"\u040B"],[/\\cyrchar\{\\'\\CYRK\}/g,"\u040C"],[/\\cyrchar\\CYRUSHRT /g,"\u040E"],[/\\cyrchar\\CYRDZHE /g,"\u040F"],[/\\cyrchar\\CYRA /g,"\u0410"],[/\\cyrchar\\CYRB /g,"\u0411"],[/\\cyrchar\\CYRV /g,"\u0412"],[/\\cyrchar\\CYRG /g,"\u0413"],[/\\cyrchar\\CYRD /g,"\u0414"],[/\\cyrchar\\CYRE /g,"\u0415"],[/\\cyrchar\\CYRZH /g,"\u0416"],[/\\cyrchar\\CYRZ /g,"\u0417"],[/\\cyrchar\\CYRI /g,"\u0418"],[/\\cyrchar\\CYRISHRT /g,"\u0419"],[/\\cyrchar\\CYRK /g,"\u041A"],[/\\cyrchar\\CYRL /g,"\u041B"],[/\\cyrchar\\CYRM /g,"\u041C"],[/\\cyrchar\\CYRN /g,"\u041D"],[/\\cyrchar\\CYRO /g,"\u041E"],[/\\cyrchar\\CYRP /g,"\u041F"],[/\\cyrchar\\CYRR /g,"\u0420"],[/\\cyrchar\\CYRS /g,"\u0421"],[/\\cyrchar\\CYRT /g,"\u0422"],[/\\cyrchar\\CYRU /g,"\u0423"],[/\\cyrchar\\CYRF /g,"\u0424"],[/\\cyrchar\\CYRH /g,"\u0425"],[/\\cyrchar\\CYRC /g,"\u0426"],[/\\cyrchar\\CYRCH /g,"\u0427"],[/\\cyrchar\\CYRSH /g,"\u0428"],[/\\cyrchar\\CYRSHCH /g,"\u0429"],[/\\cyrchar\\CYRHRDSN /g,"\u042A"],[/\\cyrchar\\CYRERY /g,"\u042B"],[/\\cyrchar\\CYRSFTSN /g,"\u042C"],[/\\cyrchar\\CYREREV /g,"\u042D"],[/\\cyrchar\\CYRYU /g,"\u042E"],[/\\cyrchar\\CYRYA /g,"\u042F"],[/\\cyrchar\\cyra /g,"\u0430"],[/\\cyrchar\\cyrb /g,"\u0431"],[/\\cyrchar\\cyrv /g,"\u0432"],[/\\cyrchar\\cyrg /g,"\u0433"],[/\\cyrchar\\cyrd /g,"\u0434"],[/\\cyrchar\\cyre /g,"\u0435"],[/\\cyrchar\\cyrzh /g,"\u0436"],[/\\cyrchar\\cyrz /g,"\u0437"],[/\\cyrchar\\cyri /g,"\u0438"],[/\\cyrchar\\cyrishrt /g,"\u0439"],[/\\cyrchar\\cyrk /g,"\u043A"],[/\\cyrchar\\cyrl /g,"\u043B"],[/\\cyrchar\\cyrm /g,"\u043C"],[/\\cyrchar\\cyrn /g,"\u043D"],[/\\cyrchar\\cyro /g,"\u043E"],[/\\cyrchar\\cyrp /g,"\u043F"],[/\\cyrchar\\cyrr /g,"\u0440"],[/\\cyrchar\\cyrs /g,"\u0441"],[/\\cyrchar\\cyrt /g,"\u0442"],[/\\cyrchar\\cyru /g,"\u0443"],[/\\cyrchar\\cyrf /g,"\u0444"],[/\\cyrchar\\cyrh /g,"\u0445"],[/\\cyrchar\\cyrc /g,"\u0446"],[/\\cyrchar\\cyrch /g,"\u0447"],[/\\cyrchar\\cyrsh /g,"\u0448"],[/\\cyrchar\\cyrshch /g,"\u0449"],[/\\cyrchar\\cyrhrdsn /g,"\u044A"],[/\\cyrchar\\cyrery /g,"\u044B"],[/\\cyrchar\\cyrsftsn /g,"\u044C"],[/\\cyrchar\\cyrerev /g,"\u044D"],[/\\cyrchar\\cyryu /g,"\u044E"],[/\\cyrchar\\cyrya /g,"\u044F"],[/\\cyrchar\\cyryo /g,"\u0451"],[/\\cyrchar\\cyrdje /g,"\u0452"],[/\\cyrchar\{\\'\\cyrg\}/g,"\u0453"],[/\\cyrchar\\cyrie /g,"\u0454"],[/\\cyrchar\\cyrdze /g,"\u0455"],[/\\cyrchar\\cyrii /g,"\u0456"],[/\\cyrchar\\cyryi /g,"\u0457"],[/\\cyrchar\\cyrje /g,"\u0458"],[/\\cyrchar\\cyrlje /g,"\u0459"],[/\\cyrchar\\cyrnje /g,"\u045A"],[/\\cyrchar\\cyrtshe /g,"\u045B"],[/\\cyrchar\{\\'\\cyrk\}/g,"\u045C"],[/\\cyrchar\\cyrushrt /g,"\u045E"],[/\\cyrchar\\cyrdzhe /g,"\u045F"],[/\\cyrchar\\CYROMEGA /g,"\u0460"],[/\\cyrchar\\cyromega /g,"\u0461"],[/\\cyrchar\\CYRYAT /g,"\u0462"],[/\\cyrchar\\CYRIOTE /g,"\u0464"],[/\\cyrchar\\cyriote /g,"\u0465"],[/\\cyrchar\\CYRLYUS /g,"\u0466"],[/\\cyrchar\\cyrlyus /g,"\u0467"],[/\\cyrchar\\CYRIOTLYUS /g,"\u0468"],[/\\cyrchar\\cyriotlyus /g,"\u0469"],[/\\cyrchar\\CYRBYUS /g,"\u046A"],[/\\cyrchar\\CYRIOTBYUS /g,"\u046C"],[/\\cyrchar\\cyriotbyus /g,"\u046D"],[/\\cyrchar\\CYRKSI /g,"\u046E"],[/\\cyrchar\\cyrksi /g,"\u046F"],[/\\cyrchar\\CYRPSI /g,"\u0470"],[/\\cyrchar\\cyrpsi /g,"\u0471"],[/\\cyrchar\\CYRFITA /g,"\u0472"],[/\\cyrchar\\CYRIZH /g,"\u0474"],[/\\cyrchar\\CYRUK /g,"\u0478"],[/\\cyrchar\\cyruk /g,"\u0479"],[/\\cyrchar\\CYROMEGARND /g,"\u047A"],[/\\cyrchar\\cyromegarnd /g,"\u047B"],[/\\cyrchar\\CYROMEGATITLO /g,"\u047C"],[/\\cyrchar\\cyromegatitlo /g,"\u047D"],[/\\cyrchar\\CYROT /g,"\u047E"],[/\\cyrchar\\cyrot /g,"\u047F"],[/\\cyrchar\\CYRKOPPA /g,"\u0480"],[/\\cyrchar\\cyrkoppa /g,"\u0481"],[/\\cyrchar\\cyrthousands /g,"\u0482"],[/\\cyrchar\\cyrhundredthousands /g,"\u0488"],[/\\cyrchar\\cyrmillions /g,"\u0489"],[/\\cyrchar\\CYRSEMISFTSN /g,"\u048C"],[/\\cyrchar\\cyrsemisftsn /g,"\u048D"],[/\\cyrchar\\CYRRTICK /g,"\u048E"],[/\\cyrchar\\cyrrtick /g,"\u048F"],[/\\cyrchar\\CYRGUP /g,"\u0490"],[/\\cyrchar\\cyrgup /g,"\u0491"],[/\\cyrchar\\CYRGHCRS /g,"\u0492"],[/\\cyrchar\\cyrghcrs /g,"\u0493"],[/\\cyrchar\\CYRGHK /g,"\u0494"],[/\\cyrchar\\cyrghk /g,"\u0495"],[/\\cyrchar\\CYRZHDSC /g,"\u0496"],[/\\cyrchar\\cyrzhdsc /g,"\u0497"],[/\\cyrchar\\CYRZDSC /g,"\u0498"],[/\\cyrchar\\cyrzdsc /g,"\u0499"],[/\\cyrchar\\CYRKDSC /g,"\u049A"],[/\\cyrchar\\cyrkdsc /g,"\u049B"],[/\\cyrchar\\CYRKVCRS /g,"\u049C"],[/\\cyrchar\\cyrkvcrs /g,"\u049D"],[/\\cyrchar\\CYRKHCRS /g,"\u049E"],[/\\cyrchar\\cyrkhcrs /g,"\u049F"],[/\\cyrchar\\CYRKBEAK /g,"\u04A0"],[/\\cyrchar\\cyrkbeak /g,"\u04A1"],[/\\cyrchar\\CYRNDSC /g,"\u04A2"],[/\\cyrchar\\cyrndsc /g,"\u04A3"],[/\\cyrchar\\CYRNG /g,"\u04A4"],[/\\cyrchar\\cyrng /g,"\u04A5"],[/\\cyrchar\\CYRPHK /g,"\u04A6"],[/\\cyrchar\\cyrphk /g,"\u04A7"],[/\\cyrchar\\CYRABHHA /g,"\u04A8"],[/\\cyrchar\\cyrabhha /g,"\u04A9"],[/\\cyrchar\\CYRSDSC /g,"\u04AA"],[/\\cyrchar\\cyrsdsc /g,"\u04AB"],[/\\cyrchar\\CYRTDSC /g,"\u04AC"],[/\\cyrchar\\cyrtdsc /g,"\u04AD"],[/\\cyrchar\\CYRY /g,"\u04AE"],[/\\cyrchar\\cyry /g,"\u04AF"],[/\\cyrchar\\CYRYHCRS /g,"\u04B0"],[/\\cyrchar\\cyryhcrs /g,"\u04B1"],[/\\cyrchar\\CYRHDSC /g,"\u04B2"],[/\\cyrchar\\cyrhdsc /g,"\u04B3"],[/\\cyrchar\\CYRTETSE /g,"\u04B4"],[/\\cyrchar\\cyrtetse /g,"\u04B5"],[/\\cyrchar\\CYRCHRDSC /g,"\u04B6"],[/\\cyrchar\\cyrchrdsc /g,"\u04B7"],[/\\cyrchar\\CYRCHVCRS /g,"\u04B8"],[/\\cyrchar\\cyrchvcrs /g,"\u04B9"],[/\\cyrchar\\CYRSHHA /g,"\u04BA"],[/\\cyrchar\\cyrshha /g,"\u04BB"],[/\\cyrchar\\CYRABHCH /g,"\u04BC"],[/\\cyrchar\\cyrabhch /g,"\u04BD"],[/\\cyrchar\\CYRABHCHDSC /g,"\u04BE"],[/\\cyrchar\\cyrabhchdsc /g,"\u04BF"],[/\\cyrchar\\CYRpalochka /g,"\u04C0"],[/\\cyrchar\\CYRKHK /g,"\u04C3"],[/\\cyrchar\\cyrkhk /g,"\u04C4"],[/\\cyrchar\\CYRNHK /g,"\u04C7"],[/\\cyrchar\\cyrnhk /g,"\u04C8"],[/\\cyrchar\\CYRCHLDSC /g,"\u04CB"],[/\\cyrchar\\cyrchldsc /g,"\u04CC"],[/\\cyrchar\\CYRAE /g,"\u04D4"],[/\\cyrchar\\cyrae /g,"\u04D5"],[/\\cyrchar\\CYRSCHWA /g,"\u04D8"],[/\\cyrchar\\cyrschwa /g,"\u04D9"],[/\\cyrchar\\CYRABHDZE /g,"\u04E0"],[/\\cyrchar\\cyrabhdze /g,"\u04E1"],[/\\cyrchar\\CYROTLD /g,"\u04E8"],[/\\cyrchar\\cyrotld /g,"\u04E9"],[/\\hspace\{0.6em\}/g,"\u2002"],[/\\hspace\{1em\}/g,"\u2003"],[/\\hspace\{0.33em\}/g,"\u2004"],[/\\hspace\{0.25em\}/g,"\u2005"],[/\\hspace\{0.166em\}/g,"\u2006"],[/\\hphantom\{0\}/g,"\u2007"],[/\\hphantom\{,\}/g,"\u2008"],[/\\hspace\{0.167em\}/g,"\u2009"],[/\\mkern1mu /g,"\u200A"],[/\\textendash /g,"\u2013"],[/\\textemdash /g,"\u2014"],[/\\rule\{1em\}\{1pt\}/g,"\u2015"],[/\\Vert /g,"\u2016"],[/\\Elzreapos /g,"\u201B"],[/\\textquotedblleft /g,"\u201C"],[/\\textquotedblright /g,"\u201D"],[/\\textdagger /g,"\u2020"],[/\\textdaggerdbl /g,"\u2021"],[/\\textbullet /g,"\u2022"],[/\\ldots /g,"\u2026"],[/\\textperthousand /g,"\u2030"],[/\\textpertenthousand /g,"\u2031"],[/\\backprime /g,"\u2035"],[/\\guilsinglleft /g,"\u2039"],[/\\guilsinglright /g,"\u203A"],[/\\mkern4mu /g,"\u205F"],[/\\nolinebreak /g,"\u2060"],[/\\ensuremath\{\\Elzpes\}/g,"\u20A7"],[/\\mbox\{\\texteuro\} /g,"\u20AC"],[/\\dddot /g,"\u20DB"],[/\\ddddot /g,"\u20DC"],[/\\mathbb\{C\}/g,"\u2102"],[/\\mathscr\{g\}/g,"\u210A"],[/\\mathscr\{H\}/g,"\u210B"],[/\\mathfrak\{H\}/g,"\u210C"],[/\\mathbb\{H\}/g,"\u210D"],[/\\hslash /g,"\u210F"],[/\\mathscr\{I\}/g,"\u2110"],[/\\mathfrak\{I\}/g,"\u2111"],[/\\mathscr\{L\}/g,"\u2112"],[/\\mathscr\{l\}/g,"\u2113"],[/\\mathbb\{N\}/g,"\u2115"],[/\\cyrchar\\textnumero /g,"\u2116"],[/\\wp /g,"\u2118"],[/\\mathbb\{P\}/g,"\u2119"],[/\\mathbb\{Q\}/g,"\u211A"],[/\\mathscr\{R\}/g,"\u211B"],[/\\mathfrak\{R\}/g,"\u211C"],[/\\mathbb\{R\}/g,"\u211D"],[/\\Elzxrat /g,"\u211E"],[/\\texttrademark /g,"\u2122"],[/\\mathbb\{Z\}/g,"\u2124"],[/\\Omega /g,"\u2126"],[/\\mho /g,"\u2127"],[/\\mathfrak\{Z\}/g,"\u2128"],[/\\ElsevierGlyph\{2129\}/g,"\u2129"],[/\\AA /g,"\u212B"],[/\\mathscr\{B\}/g,"\u212C"],[/\\mathfrak\{C\}/g,"\u212D"],[/\\mathscr\{e\}/g,"\u212F"],[/\\mathscr\{E\}/g,"\u2130"],[/\\mathscr\{F\}/g,"\u2131"],[/\\mathscr\{M\}/g,"\u2133"],[/\\mathscr\{o\}/g,"\u2134"],[/\\aleph /g,"\u2135"],[/\\beth /g,"\u2136"],[/\\gimel /g,"\u2137"],[/\\daleth /g,"\u2138"],[/\\textfrac\{1\}\{3\}/g,"\u2153"],[/\\textfrac\{2\}\{3\}/g,"\u2154"],[/\\textfrac\{1\}\{5\}/g,"\u2155"],[/\\textfrac\{2\}\{5\}/g,"\u2156"],[/\\textfrac\{3\}\{5\}/g,"\u2157"],[/\\textfrac\{4\}\{5\}/g,"\u2158"],[/\\textfrac\{1\}\{6\}/g,"\u2159"],[/\\textfrac\{5\}\{6\}/g,"\u215A"],[/\\textfrac\{1\}\{8\}/g,"\u215B"],[/\\textfrac\{3\}\{8\}/g,"\u215C"],[/\\textfrac\{5\}\{8\}/g,"\u215D"],[/\\textfrac\{7\}\{8\}/g,"\u215E"],[/\\leftarrow /g,"\u2190"],[/\\uparrow /g,"\u2191"],[/\\rightarrow /g,"\u2192"],[/\\downarrow /g,"\u2193"],[/\\leftrightarrow /g,"\u2194"],[/\\updownarrow /g,"\u2195"],[/\\nwarrow /g,"\u2196"],[/\\nearrow /g,"\u2197"],[/\\searrow /g,"\u2198"],[/\\swarrow /g,"\u2199"],[/\\nleftarrow /g,"\u219A"],[/\\nrightarrow /g,"\u219B"],[/\\arrowwaveright /g,"\u219C"],[/\\arrowwaveright /g,"\u219D"],[/\\twoheadleftarrow /g,"\u219E"],[/\\twoheadrightarrow /g,"\u21A0"],[/\\leftarrowtail /g,"\u21A2"],[/\\rightarrowtail /g,"\u21A3"],[/\\mapsto /g,"\u21A6"],[/\\hookleftarrow /g,"\u21A9"],[/\\hookrightarrow /g,"\u21AA"],[/\\looparrowleft /g,"\u21AB"],[/\\looparrowright /g,"\u21AC"],[/\\leftrightsquigarrow /g,"\u21AD"],[/\\nleftrightarrow /g,"\u21AE"],[/\\Lsh /g,"\u21B0"],[/\\Rsh /g,"\u21B1"],[/\\ElsevierGlyph\{21B3\}/g,"\u21B3"],[/\\curvearrowleft /g,"\u21B6"],[/\\curvearrowright /g,"\u21B7"],[/\\circlearrowleft /g,"\u21BA"],[/\\circlearrowright /g,"\u21BB"],[/\\leftharpoonup /g,"\u21BC"],[/\\leftharpoondown /g,"\u21BD"],[/\\upharpoonright /g,"\u21BE"],[/\\upharpoonleft /g,"\u21BF"],[/\\rightharpoonup /g,"\u21C0"],[/\\rightharpoondown /g,"\u21C1"],[/\\downharpoonright /g,"\u21C2"],[/\\downharpoonleft /g,"\u21C3"],[/\\rightleftarrows /g,"\u21C4"],[/\\dblarrowupdown /g,"\u21C5"],[/\\leftrightarrows /g,"\u21C6"],[/\\leftleftarrows /g,"\u21C7"],[/\\upuparrows /g,"\u21C8"],[/\\rightrightarrows /g,"\u21C9"],[/\\downdownarrows /g,"\u21CA"],[/\\leftrightharpoons /g,"\u21CB"],[/\\rightleftharpoons /g,"\u21CC"],[/\\nLeftarrow /g,"\u21CD"],[/\\nLeftrightarrow /g,"\u21CE"],[/\\nRightarrow /g,"\u21CF"],[/\\Leftarrow /g,"\u21D0"],[/\\Uparrow /g,"\u21D1"],[/\\Rightarrow /g,"\u21D2"],[/\\Downarrow /g,"\u21D3"],[/\\Leftrightarrow /g,"\u21D4"],[/\\Updownarrow /g,"\u21D5"],[/\\Lleftarrow /g,"\u21DA"],[/\\Rrightarrow /g,"\u21DB"],[/\\rightsquigarrow /g,"\u21DD"],[/\\DownArrowUpArrow /g,"\u21F5"],[/\\forall /g,"\u2200"],[/\\complement /g,"\u2201"],[/\\partial /g,"\u2202"],[/\\exists /g,"\u2203"],[/\\nexists /g,"\u2204"],[/\\varnothing /g,"\u2205"],[/\\nabla /g,"\u2207"],[/\\in /g,"\u2208"],[/\\not\\in /g,"\u2209"],[/\\ni /g,"\u220B"],[/\\not\\ni /g,"\u220C"],[/\\prod /g,"\u220F"],[/\\coprod /g,"\u2210"],[/\\sum /g,"\u2211"],[/\\mp /g,"\u2213"],[/\\dotplus /g,"\u2214"],[/\\setminus /g,"\u2216"],[/\\circ /g,"\u2218"],[/\\bullet /g,"\u2219"],[/\\surd /g,"\u221A"],[/\\propto /g,"\u221D"],[/\\infty /g,"\u221E"],[/\\rightangle /g,"\u221F"],[/\\angle /g,"\u2220"],[/\\measuredangle /g,"\u2221"],[/\\sphericalangle /g,"\u2222"],[/\\mid /g,"\u2223"],[/\\nmid /g,"\u2224"],[/\\parallel /g,"\u2225"],[/\\nparallel /g,"\u2226"],[/\\wedge /g,"\u2227"],[/\\vee /g,"\u2228"],[/\\cap /g,"\u2229"],[/\\cup /g,"\u222A"],[/\\int /g,"\u222B"],[/\\int\\!\\int /g,"\u222C"],[/\\int\\!\\int\\!\\int /g,"\u222D"],[/\\oint /g,"\u222E"],[/\\surfintegral /g,"\u222F"],[/\\volintegral /g,"\u2230"],[/\\clwintegral /g,"\u2231"],[/\\ElsevierGlyph\{2232\}/g,"\u2232"],[/\\ElsevierGlyph\{2233\}/g,"\u2233"],[/\\therefore /g,"\u2234"],[/\\because /g,"\u2235"],[/\\Colon /g,"\u2237"],[/\\ElsevierGlyph\{2238\}/g,"\u2238"],[/\\mathbin\{\{:\}\\!\\!\{\-\}\\!\\!\{:\}\}/g,"\u223A"],[/\\homothetic /g,"\u223B"],[/\\sim /g,"\u223C"],[/\\backsim /g,"\u223D"],[/\\lazysinv /g,"\u223E"],[/\\wr /g,"\u2240"],[/\\not\\sim /g,"\u2241"],[/\\ElsevierGlyph\{2242\}/g,"\u2242"],[/\\NotEqualTilde /g,"\u2242-00338"],[/\\simeq /g,"\u2243"],[/\\not\\simeq /g,"\u2244"],[/\\cong /g,"\u2245"],[/\\approxnotequal /g,"\u2246"],[/\\not\\cong /g,"\u2247"],[/\\approx /g,"\u2248"],[/\\not\\approx /g,"\u2249"],[/\\approxeq /g,"\u224A"],[/\\tildetrpl /g,"\u224B"],[/\\not\\apid /g,"\u224B-00338"],[/\\allequal /g,"\u224C"],[/\\asymp /g,"\u224D"],[/\\Bumpeq /g,"\u224E"],[/\\NotHumpDownHump /g,"\u224E-00338"],[/\\bumpeq /g,"\u224F"],[/\\NotHumpEqual /g,"\u224F-00338"],[/\\doteq /g,"\u2250"],[/\\not\\doteq/g,"\u2250-00338"],[/\\doteqdot /g,"\u2251"],[/\\fallingdotseq /g,"\u2252"],[/\\risingdotseq /g,"\u2253"],[/\\eqcirc /g,"\u2256"],[/\\circeq /g,"\u2257"],[/\\estimates /g,"\u2259"],[/\\ElsevierGlyph\{225A\}/g,"\u225A"],[/\\starequal /g,"\u225B"],[/\\triangleq /g,"\u225C"],[/\\ElsevierGlyph\{225F\}/g,"\u225F"],[/\\not =/g,"\u2260"],[/\\equiv /g,"\u2261"],[/\\not\\equiv /g,"\u2262"],[/\\leq /g,"\u2264"],[/\\geq /g,"\u2265"],[/\\leqq /g,"\u2266"],[/\\geqq /g,"\u2267"],[/\\lneqq /g,"\u2268"],[/\\lvertneqq /g,"\u2268-0FE00"],[/\\gneqq /g,"\u2269"],[/\\gvertneqq /g,"\u2269-0FE00"],[/\\ll /g,"\u226A"],[/\\NotLessLess /g,"\u226A-00338"],[/\\gg /g,"\u226B"],[/\\NotGreaterGreater /g,"\u226B-00338"],[/\\between /g,"\u226C"],[/\\not\\kern\-0.3em\\times /g,"\u226D"],[/\\not</g,"\u226E"],[/\\not>/g,"\u226F"],[/\\not\\leq /g,"\u2270"],[/\\not\\geq /g,"\u2271"],[/\\lessequivlnt /g,"\u2272"],[/\\greaterequivlnt /g,"\u2273"],[/\\ElsevierGlyph\{2274\}/g,"\u2274"],[/\\ElsevierGlyph\{2275\}/g,"\u2275"],[/\\lessgtr /g,"\u2276"],[/\\gtrless /g,"\u2277"],[/\\notlessgreater /g,"\u2278"],[/\\notgreaterless /g,"\u2279"],[/\\prec /g,"\u227A"],[/\\succ /g,"\u227B"],[/\\preccurlyeq /g,"\u227C"],[/\\succcurlyeq /g,"\u227D"],[/\\precapprox /g,"\u227E"],[/\\NotPrecedesTilde /g,"\u227E-00338"],[/\\succapprox /g,"\u227F"],[/\\NotSucceedsTilde /g,"\u227F-00338"],[/\\not\\prec /g,"\u2280"],[/\\not\\succ /g,"\u2281"],[/\\subset /g,"\u2282"],[/\\supset /g,"\u2283"],[/\\not\\subset /g,"\u2284"],[/\\not\\supset /g,"\u2285"],[/\\subseteq /g,"\u2286"],[/\\supseteq /g,"\u2287"],[/\\not\\subseteq /g,"\u2288"],[/\\not\\supseteq /g,"\u2289"],[/\\subsetneq /g,"\u228A"],[/\\varsubsetneqq /g,"\u228A-0FE00"],[/\\supsetneq /g,"\u228B"],[/\\varsupsetneq /g,"\u228B-0FE00"],[/\\uplus /g,"\u228E"],[/\\sqsubset /g,"\u228F"],[/\\NotSquareSubset /g,"\u228F-00338"],[/\\sqsupset /g,"\u2290"],[/\\NotSquareSuperset /g,"\u2290-00338"],[/\\sqsubseteq /g,"\u2291"],[/\\sqsupseteq /g,"\u2292"],[/\\sqcap /g,"\u2293"],[/\\sqcup /g,"\u2294"],[/\\oplus /g,"\u2295"],[/\\ominus /g,"\u2296"],[/\\otimes /g,"\u2297"],[/\\oslash /g,"\u2298"],[/\\odot /g,"\u2299"],[/\\circledcirc /g,"\u229A"],[/\\circledast /g,"\u229B"],[/\\circleddash /g,"\u229D"],[/\\boxplus /g,"\u229E"],[/\\boxminus /g,"\u229F"],[/\\boxtimes /g,"\u22A0"],[/\\boxdot /g,"\u22A1"],[/\\vdash /g,"\u22A2"],[/\\dashv /g,"\u22A3"],[/\\top /g,"\u22A4"],[/\\perp /g,"\u22A5"],[/\\truestate /g,"\u22A7"],[/\\forcesextra /g,"\u22A8"],[/\\Vdash /g,"\u22A9"],[/\\Vvdash /g,"\u22AA"],[/\\VDash /g,"\u22AB"],[/\\nvdash /g,"\u22AC"],[/\\nvDash /g,"\u22AD"],[/\\nVdash /g,"\u22AE"],[/\\nVDash /g,"\u22AF"],[/\\vartriangleleft /g,"\u22B2"],[/\\vartriangleright /g,"\u22B3"],[/\\trianglelefteq /g,"\u22B4"],[/\\trianglerighteq /g,"\u22B5"],[/\\original /g,"\u22B6"],[/\\image /g,"\u22B7"],[/\\multimap /g,"\u22B8"],[/\\hermitconjmatrix /g,"\u22B9"],[/\\intercal /g,"\u22BA"],[/\\veebar /g,"\u22BB"],[/\\rightanglearc /g,"\u22BE"],[/\\ElsevierGlyph\{22C0\}/g,"\u22C0"],[/\\ElsevierGlyph\{22C1\}/g,"\u22C1"],[/\\bigcap /g,"\u22C2"],[/\\bigcup /g,"\u22C3"],[/\\diamond /g,"\u22C4"],[/\\cdot /g,"\u22C5"],[/\\star /g,"\u22C6"],[/\\divideontimes /g,"\u22C7"],[/\\bowtie /g,"\u22C8"],[/\\ltimes /g,"\u22C9"],[/\\rtimes /g,"\u22CA"],[/\\leftthreetimes /g,"\u22CB"],[/\\rightthreetimes /g,"\u22CC"],[/\\backsimeq /g,"\u22CD"],[/\\curlyvee /g,"\u22CE"],[/\\curlywedge /g,"\u22CF"],[/\\Subset /g,"\u22D0"],[/\\Supset /g,"\u22D1"],[/\\Cap /g,"\u22D2"],[/\\Cup /g,"\u22D3"],[/\\pitchfork /g,"\u22D4"],[/\\lessdot /g,"\u22D6"],[/\\gtrdot /g,"\u22D7"],[/\\verymuchless /g,"\u22D8"],[/\\verymuchgreater /g,"\u22D9"],[/\\lesseqgtr /g,"\u22DA"],[/\\gtreqless /g,"\u22DB"],[/\\curlyeqprec /g,"\u22DE"],[/\\curlyeqsucc /g,"\u22DF"],[/\\not\\sqsubseteq /g,"\u22E2"],[/\\not\\sqsupseteq /g,"\u22E3"],[/\\Elzsqspne /g,"\u22E5"],[/\\lnsim /g,"\u22E6"],[/\\gnsim /g,"\u22E7"],[/\\precedesnotsimilar /g,"\u22E8"],[/\\succnsim /g,"\u22E9"],[/\\ntriangleleft /g,"\u22EA"],[/\\ntriangleright /g,"\u22EB"],[/\\ntrianglelefteq /g,"\u22EC"],[/\\ntrianglerighteq /g,"\u22ED"],[/\\vdots /g,"\u22EE"],[/\\cdots /g,"\u22EF"],[/\\upslopeellipsis /g,"\u22F0"],[/\\downslopeellipsis /g,"\u22F1"],[/\\barwedge /g,"\u2305"],[/\\perspcorrespond /g,"\u2306"],[/\\lceil /g,"\u2308"],[/\\rceil /g,"\u2309"],[/\\lfloor /g,"\u230A"],[/\\rfloor /g,"\u230B"],[/\\recorder /g,"\u2315"],[/\\mathchar"2208/g,"\u2316"],[/\\ulcorner /g,"\u231C"],[/\\urcorner /g,"\u231D"],[/\\llcorner /g,"\u231E"],[/\\lrcorner /g,"\u231F"],[/\\frown /g,"\u2322"],[/\\smile /g,"\u2323"],[/\\langle /g,"\u2329"],[/\\rangle /g,"\u232A"],[/\\ElsevierGlyph\{E838\}/g,"\u233D"],[/\\Elzdlcorn /g,"\u23A3"],[/\\lmoustache /g,"\u23B0"],[/\\rmoustache /g,"\u23B1"],[/\\textvisiblespace /g,"\u2423"],[/\\ding\{172\}/g,"\u2460"],[/\\ding\{173\}/g,"\u2461"],[/\\ding\{174\}/g,"\u2462"],[/\\ding\{175\}/g,"\u2463"],[/\\ding\{176\}/g,"\u2464"],[/\\ding\{177\}/g,"\u2465"],[/\\ding\{178\}/g,"\u2466"],[/\\ding\{179\}/g,"\u2467"],[/\\ding\{180\}/g,"\u2468"],[/\\ding\{181\}/g,"\u2469"],[/\\circledS /g,"\u24C8"],[/\\Elzdshfnc /g,"\u2506"],[/\\Elzsqfnw /g,"\u2519"],[/\\diagup /g,"\u2571"],[/\\ding\{110\}/g,"\u25A0"],[/\\square /g,"\u25A1"],[/\\blacksquare /g,"\u25AA"],[/\\fbox\{~~\}/g,"\u25AD"],[/\\Elzvrecto /g,"\u25AF"],[/\\ElsevierGlyph\{E381\}/g,"\u25B1"],[/\\ding\{115\}/g,"\u25B2"],[/\\bigtriangleup /g,"\u25B3"],[/\\blacktriangle /g,"\u25B4"],[/\\vartriangle /g,"\u25B5"],[/\\blacktriangleright /g,"\u25B8"],[/\\triangleright /g,"\u25B9"],[/\\ding\{116\}/g,"\u25BC"],[/\\bigtriangledown /g,"\u25BD"],[/\\blacktriangledown /g,"\u25BE"],[/\\triangledown /g,"\u25BF"],[/\\blacktriangleleft /g,"\u25C2"],[/\\triangleleft /g,"\u25C3"],[/\\ding\{117\}/g,"\u25C6"],[/\\lozenge /g,"\u25CA"],[/\\bigcirc /g,"\u25CB"],[/\\ding\{108\}/g,"\u25CF"],[/\\Elzcirfl /g,"\u25D0"],[/\\Elzcirfr /g,"\u25D1"],[/\\Elzcirfb /g,"\u25D2"],[/\\ding\{119\}/g,"\u25D7"],[/\\Elzrvbull /g,"\u25D8"],[/\\Elzsqfl /g,"\u25E7"],[/\\Elzsqfr /g,"\u25E8"],[/\\Elzsqfse /g,"\u25EA"],[/\\bigcirc /g,"\u25EF"],[/\\ding\{72\}/g,"\u2605"],[/\\ding\{73\}/g,"\u2606"],[/\\ding\{37\}/g,"\u260E"],[/\\ding\{42\}/g,"\u261B"],[/\\ding\{43\}/g,"\u261E"],[/\\rightmoon /g,"\u263E"],[/\\mercury /g,"\u263F"],[/\\venus /g,"\u2640"],[/\\male /g,"\u2642"],[/\\jupiter /g,"\u2643"],[/\\saturn /g,"\u2644"],[/\\uranus /g,"\u2645"],[/\\neptune /g,"\u2646"],[/\\pluto /g,"\u2647"],[/\\aries /g,"\u2648"],[/\\taurus /g,"\u2649"],[/\\gemini /g,"\u264A"],[/\\cancer /g,"\u264B"],[/\\leo /g,"\u264C"],[/\\virgo /g,"\u264D"],[/\\libra /g,"\u264E"],[/\\scorpio /g,"\u264F"],[/\\sagittarius /g,"\u2650"],[/\\capricornus /g,"\u2651"],[/\\aquarius /g,"\u2652"],[/\\pisces /g,"\u2653"],[/\\ding\{171\}/g,"\u2660"],[/\\diamond /g,"\u2662"],[/\\ding\{168\}/g,"\u2663"],[/\\ding\{170\}/g,"\u2665"],[/\\ding\{169\}/g,"\u2666"],[/\\quarternote /g,"\u2669"],[/\\eighthnote /g,"\u266A"],[/\\flat /g,"\u266D"],[/\\natural /g,"\u266E"],[/\\sharp /g,"\u266F"],[/\\ding\{33\}/g,"\u2701"],[/\\ding\{34\}/g,"\u2702"],[/\\ding\{35\}/g,"\u2703"],[/\\ding\{36\}/g,"\u2704"],[/\\ding\{38\}/g,"\u2706"],[/\\ding\{39\}/g,"\u2707"],[/\\ding\{40\}/g,"\u2708"],[/\\ding\{41\}/g,"\u2709"],[/\\ding\{44\}/g,"\u270C"],[/\\ding\{45\}/g,"\u270D"],[/\\ding\{46\}/g,"\u270E"],[/\\ding\{47\}/g,"\u270F"],[/\\ding\{48\}/g,"\u2710"],[/\\ding\{49\}/g,"\u2711"],[/\\ding\{50\}/g,"\u2712"],[/\\ding\{51\}/g,"\u2713"],[/\\ding\{52\}/g,"\u2714"],[/\\ding\{53\}/g,"\u2715"],[/\\ding\{54\}/g,"\u2716"],[/\\ding\{55\}/g,"\u2717"],[/\\ding\{56\}/g,"\u2718"],[/\\ding\{57\}/g,"\u2719"],[/\\ding\{58\}/g,"\u271A"],[/\\ding\{59\}/g,"\u271B"],[/\\ding\{60\}/g,"\u271C"],[/\\ding\{61\}/g,"\u271D"],[/\\ding\{62\}/g,"\u271E"],[/\\ding\{63\}/g,"\u271F"],[/\\ding\{64\}/g,"\u2720"],[/\\ding\{65\}/g,"\u2721"],[/\\ding\{66\}/g,"\u2722"],[/\\ding\{67\}/g,"\u2723"],[/\\ding\{68\}/g,"\u2724"],[/\\ding\{69\}/g,"\u2725"],[/\\ding\{70\}/g,"\u2726"],[/\\ding\{71\}/g,"\u2727"],[/\\ding\{73\}/g,"\u2729"],[/\\ding\{74\}/g,"\u272A"],[/\\ding\{75\}/g,"\u272B"],[/\\ding\{76\}/g,"\u272C"],[/\\ding\{77\}/g,"\u272D"],[/\\ding\{78\}/g,"\u272E"],[/\\ding\{79\}/g,"\u272F"],[/\\ding\{80\}/g,"\u2730"],[/\\ding\{81\}/g,"\u2731"],[/\\ding\{82\}/g,"\u2732"],[/\\ding\{83\}/g,"\u2733"],[/\\ding\{84\}/g,"\u2734"],[/\\ding\{85\}/g,"\u2735"],[/\\ding\{86\}/g,"\u2736"],[/\\ding\{87\}/g,"\u2737"],[/\\ding\{88\}/g,"\u2738"],[/\\ding\{89\}/g,"\u2739"],[/\\ding\{90\}/g,"\u273A"],[/\\ding\{91\}/g,"\u273B"],[/\\ding\{92\}/g,"\u273C"],[/\\ding\{93\}/g,"\u273D"],[/\\ding\{94\}/g,"\u273E"],[/\\ding\{95\}/g,"\u273F"],[/\\ding\{96\}/g,"\u2740"],[/\\ding\{97\}/g,"\u2741"],[/\\ding\{98\}/g,"\u2742"],[/\\ding\{99\}/g,"\u2743"],[/\\ding\{100\}/g,"\u2744"],[/\\ding\{101\}/g,"\u2745"],[/\\ding\{102\}/g,"\u2746"],[/\\ding\{103\}/g,"\u2747"],[/\\ding\{104\}/g,"\u2748"],[/\\ding\{105\}/g,"\u2749"],[/\\ding\{106\}/g,"\u274A"],[/\\ding\{107\}/g,"\u274B"],[/\\ding\{109\}/g,"\u274D"],[/\\ding\{111\}/g,"\u274F"],[/\\ding\{112\}/g,"\u2750"],[/\\ding\{113\}/g,"\u2751"],[/\\ding\{114\}/g,"\u2752"],[/\\ding\{118\}/g,"\u2756"],[/\\ding\{120\}/g,"\u2758"],[/\\ding\{121\}/g,"\u2759"],[/\\ding\{122\}/g,"\u275A"],[/\\ding\{123\}/g,"\u275B"],[/\\ding\{124\}/g,"\u275C"],[/\\ding\{125\}/g,"\u275D"],[/\\ding\{126\}/g,"\u275E"],[/\\ding\{161\}/g,"\u2761"],[/\\ding\{162\}/g,"\u2762"],[/\\ding\{163\}/g,"\u2763"],[/\\ding\{164\}/g,"\u2764"],[/\\ding\{165\}/g,"\u2765"],[/\\ding\{166\}/g,"\u2766"],[/\\ding\{167\}/g,"\u2767"],[/\\ding\{182\}/g,"\u2776"],[/\\ding\{183\}/g,"\u2777"],[/\\ding\{184\}/g,"\u2778"],[/\\ding\{185\}/g,"\u2779"],[/\\ding\{186\}/g,"\u277A"],[/\\ding\{187\}/g,"\u277B"],[/\\ding\{188\}/g,"\u277C"],[/\\ding\{189\}/g,"\u277D"],[/\\ding\{190\}/g,"\u277E"],[/\\ding\{191\}/g,"\u277F"],[/\\ding\{192\}/g,"\u2780"],[/\\ding\{193\}/g,"\u2781"],[/\\ding\{194\}/g,"\u2782"],[/\\ding\{195\}/g,"\u2783"],[/\\ding\{196\}/g,"\u2784"],[/\\ding\{197\}/g,"\u2785"],[/\\ding\{198\}/g,"\u2786"],[/\\ding\{199\}/g,"\u2787"],[/\\ding\{200\}/g,"\u2788"],[/\\ding\{201\}/g,"\u2789"],[/\\ding\{202\}/g,"\u278A"],[/\\ding\{203\}/g,"\u278B"],[/\\ding\{204\}/g,"\u278C"],[/\\ding\{205\}/g,"\u278D"],[/\\ding\{206\}/g,"\u278E"],[/\\ding\{207\}/g,"\u278F"],[/\\ding\{208\}/g,"\u2790"],[/\\ding\{209\}/g,"\u2791"],[/\\ding\{210\}/g,"\u2792"],[/\\ding\{211\}/g,"\u2793"],[/\\ding\{212\}/g,"\u2794"],[/\\ding\{216\}/g,"\u2798"],[/\\ding\{217\}/g,"\u2799"],[/\\ding\{218\}/g,"\u279A"],[/\\ding\{219\}/g,"\u279B"],[/\\ding\{220\}/g,"\u279C"],[/\\ding\{221\}/g,"\u279D"],[/\\ding\{222\}/g,"\u279E"],[/\\ding\{223\}/g,"\u279F"],[/\\ding\{224\}/g,"\u27A0"],[/\\ding\{225\}/g,"\u27A1"],[/\\ding\{226\}/g,"\u27A2"],[/\\ding\{227\}/g,"\u27A3"],[/\\ding\{228\}/g,"\u27A4"],[/\\ding\{229\}/g,"\u27A5"],[/\\ding\{230\}/g,"\u27A6"],[/\\ding\{231\}/g,"\u27A7"],[/\\ding\{232\}/g,"\u27A8"],[/\\ding\{233\}/g,"\u27A9"],[/\\ding\{234\}/g,"\u27AA"],[/\\ding\{235\}/g,"\u27AB"],[/\\ding\{236\}/g,"\u27AC"],[/\\ding\{237\}/g,"\u27AD"],[/\\ding\{238\}/g,"\u27AE"],[/\\ding\{239\}/g,"\u27AF"],[/\\ding\{241\}/g,"\u27B1"],[/\\ding\{242\}/g,"\u27B2"],[/\\ding\{243\}/g,"\u27B3"],[/\\ding\{244\}/g,"\u27B4"],[/\\ding\{245\}/g,"\u27B5"],[/\\ding\{246\}/g,"\u27B6"],[/\\ding\{247\}/g,"\u27B7"],[/\\ding\{248\}/g,"\u27B8"],[/\\ding\{249\}/g,"\u27B9"],[/\\ding\{250\}/g,"\u27BA"],[/\\ding\{251\}/g,"\u27BB"],[/\\ding\{252\}/g,"\u27BC"],[/\\ding\{253\}/g,"\u27BD"],[/\\ding\{254\}/g,"\u27BE"],[/\\longleftarrow /g,"\u27F5"],[/\\longrightarrow /g,"\u27F6"],[/\\longleftrightarrow /g,"\u27F7"],[/\\Longleftarrow /g,"\u27F8"],[/\\Longrightarrow /g,"\u27F9"],[/\\Longleftrightarrow /g,"\u27FA"],[/\\longmapsto /g,"\u27FC"],[/\\sim\\joinrel\\leadsto/g,"\u27FF"],[/\\ElsevierGlyph\{E212\}/g,"\u2905"],[/\\UpArrowBar /g,"\u2912"],[/\\DownArrowBar /g,"\u2913"],[/\\ElsevierGlyph\{E20C\}/g,"\u2923"],[/\\ElsevierGlyph\{E20D\}/g,"\u2924"],[/\\ElsevierGlyph\{E20B\}/g,"\u2925"],[/\\ElsevierGlyph\{E20A\}/g,"\u2926"],[/\\ElsevierGlyph\{E211\}/g,"\u2927"],[/\\ElsevierGlyph\{E20E\}/g,"\u2928"],[/\\ElsevierGlyph\{E20F\}/g,"\u2929"],[/\\ElsevierGlyph\{E210\}/g,"\u292A"],[/\\ElsevierGlyph\{E21C\}/g,"\u2933"],[/\\ElsevierGlyph\{E21D\}/g,"\u2933-00338"],[/\\ElsevierGlyph\{E21A\}/g,"\u2936"],[/\\ElsevierGlyph\{E219\}/g,"\u2937"],[/\\Elolarr /g,"\u2940"],[/\\Elorarr /g,"\u2941"],[/\\ElzRlarr /g,"\u2942"],[/\\ElzrLarr /g,"\u2944"],[/\\Elzrarrx /g,"\u2947"],[/\\LeftRightVector /g,"\u294E"],[/\\RightUpDownVector /g,"\u294F"],[/\\DownLeftRightVector /g,"\u2950"],[/\\LeftUpDownVector /g,"\u2951"],[/\\LeftVectorBar /g,"\u2952"],[/\\RightVectorBar /g,"\u2953"],[/\\RightUpVectorBar /g,"\u2954"],[/\\RightDownVectorBar /g,"\u2955"],[/\\DownLeftVectorBar /g,"\u2956"],[/\\DownRightVectorBar /g,"\u2957"],[/\\LeftUpVectorBar /g,"\u2958"],[/\\LeftDownVectorBar /g,"\u2959"],[/\\LeftTeeVector /g,"\u295A"],[/\\RightTeeVector /g,"\u295B"],[/\\RightUpTeeVector /g,"\u295C"],[/\\RightDownTeeVector /g,"\u295D"],[/\\DownLeftTeeVector /g,"\u295E"],[/\\DownRightTeeVector /g,"\u295F"],[/\\LeftUpTeeVector /g,"\u2960"],[/\\LeftDownTeeVector /g,"\u2961"],[/\\UpEquilibrium /g,"\u296E"],[/\\ReverseUpEquilibrium /g,"\u296F"],[/\\RoundImplies /g,"\u2970"],[/\\ElsevierGlyph\{E214\}/g,"\u297C"],[/\\ElsevierGlyph\{E215\}/g,"\u297D"],[/\\Elztfnc /g,"\u2980"],[/\\ElsevierGlyph\{3018\}/g,"\u2985"],[/\\Elroang /g,"\u2986"],[/\\ElsevierGlyph\{E291\}/g,"\u2994"],[/\\Elzddfnc /g,"\u2999"],[/\\Angle /g,"\u299C"],[/\\Elzlpargt /g,"\u29A0"],[/\\ElsevierGlyph\{E260\}/g,"\u29B5"],[/\\ElsevierGlyph\{E61B\}/g,"\u29B6"],[/\\ElzLap /g,"\u29CA"],[/\\Elzdefas /g,"\u29CB"],[/\\LeftTriangleBar /g,"\u29CF"],[/\\NotLeftTriangleBar /g,"\u29CF-00338"],[/\\RightTriangleBar /g,"\u29D0"],[/\\NotRightTriangleBar /g,"\u29D0-00338"],[/\\ElsevierGlyph\{E372\}/g,"\u29DC"],[/\\blacklozenge /g,"\u29EB"],[/\\RuleDelayed /g,"\u29F4"],[/\\Elxuplus /g,"\u2A04"],[/\\ElzThr /g,"\u2A05"],[/\\Elxsqcup /g,"\u2A06"],[/\\ElzInf /g,"\u2A07"],[/\\ElzSup /g,"\u2A08"],[/\\ElzCint /g,"\u2A0D"],[/\\clockoint /g,"\u2A0F"],[/\\ElsevierGlyph\{E395\}/g,"\u2A10"],[/\\sqrint /g,"\u2A16"],[/\\ElsevierGlyph\{E25A\}/g,"\u2A25"],[/\\ElsevierGlyph\{E25B\}/g,"\u2A2A"],[/\\ElsevierGlyph\{E25C\}/g,"\u2A2D"],[/\\ElsevierGlyph\{E25D\}/g,"\u2A2E"],[/\\ElzTimes /g,"\u2A2F"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A34"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A35"],[/\\ElsevierGlyph\{E259\}/g,"\u2A3C"],[/\\amalg /g,"\u2A3F"],[/\\ElzAnd /g,"\u2A53"],[/\\ElzOr /g,"\u2A54"],[/\\ElsevierGlyph\{E36E\}/g,"\u2A55"],[/\\ElOr /g,"\u2A56"],[/\\perspcorrespond /g,"\u2A5E"],[/\\Elzminhat /g,"\u2A5F"],[/\\ElsevierGlyph\{225A\}/g,"\u2A63"],[/\\stackrel\{*\}\{=\}/g,"\u2A6E"],[/\\Equal /g,"\u2A75"],[/\\leqslant /g,"\u2A7D"],[/\\nleqslant /g,"\u2A7D-00338"],[/\\geqslant /g,"\u2A7E"],[/\\ngeqslant /g,"\u2A7E-00338"],[/\\lessapprox /g,"\u2A85"],[/\\gtrapprox /g,"\u2A86"],[/\\lneq /g,"\u2A87"],[/\\gneq /g,"\u2A88"],[/\\lnapprox /g,"\u2A89"],[/\\gnapprox /g,"\u2A8A"],[/\\lesseqqgtr /g,"\u2A8B"],[/\\gtreqqless /g,"\u2A8C"],[/\\eqslantless /g,"\u2A95"],[/\\eqslantgtr /g,"\u2A96"],[/\\Pisymbol\{ppi020\}\{117\}/g,"\u2A9D"],[/\\Pisymbol\{ppi020\}\{105\}/g,"\u2A9E"],[/\\NestedLessLess /g,"\u2AA1"],[/\\NotNestedLessLess /g,"\u2AA1-00338"],[/\\NestedGreaterGreater /g,"\u2AA2"],[/\\NotNestedGreaterGreater /g,"\u2AA2-00338"],[/\\preceq /g,"\u2AAF"],[/\\not\\preceq /g,"\u2AAF-00338"],[/\\succeq /g,"\u2AB0"],[/\\not\\succeq /g,"\u2AB0-00338"],[/\\precneqq /g,"\u2AB5"],[/\\succneqq /g,"\u2AB6"],[/\\precapprox /g,"\u2AB7"],[/\\succapprox /g,"\u2AB8"],[/\\precnapprox /g,"\u2AB9"],[/\\succnapprox /g,"\u2ABA"],[/\\subseteqq /g,"\u2AC5"],[/\\nsubseteqq /g,"\u2AC5-00338"],[/\\supseteqq /g,"\u2AC6"],[/\\nsupseteqq/g,"\u2AC6-00338"],[/\\subsetneqq /g,"\u2ACB"],[/\\supsetneqq /g,"\u2ACC"],[/\\ElsevierGlyph\{E30D\}/g,"\u2AEB"],[/\\Elztdcol /g,"\u2AF6"],[/\\ElsevierGlyph\{300A\}/g,"\u300A"],[/\\ElsevierGlyph\{300B\}/g,"\u300B"],[/\\ElsevierGlyph\{3018\}/g,"\u3018"],[/\\ElsevierGlyph\{3019\}/g,"\u3019"],[/\\openbracketleft /g,"\u301A"],[/\\openbracketright /g,"\u301B"]];return this}if(typeof module!=="undefined"&&module.exports){module.exports=BibtexParser};
\ No newline at end of file
+function BibtexParser(c){if(typeof c=="string"){var d={};var a=[];function b(f){a.push(f)}var e=BibtexParser.call(d,b);e.parse(c);return{entries:a,errors:e.getErrors()}}if(typeof c!="function"){throw"Invalid parser construction."}this.STATES_={ENTRY_OR_JUNK:0,OBJECT_TYPE:1,ENTRY_KEY:2,KV_KEY:3,EQUALS:4,KV_VALUE:5};this.DATA_={};this.CALLBACK_=c;this.CHAR_=0;this.LINE_=1;this.CHAR_IN_LINE_=0;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={};this.SKIPTILLEOL_=false;this.VALBRACES_=null;this.BRACETYPE_=null;this.BRACECOUNT_=0;this.STATE_=this.STATES_.ENTRY_OR_JUNK;this.ERRORS_=[];this.ENTRY_TYPES_={inproceedings:1,proceedings:2,article:3,techreport:4,misc:5,mastersthesis:6,book:7,phdthesis:8,incollection:9,unpublished:10,inbook:11,manual:12,periodical:13,booklet:14,masterthesis:15,conference:16,data:999};this.MACROS_={jan:"January",feb:"February",mar:"March",apr:"April",may:"May",jun:"June",jul:"July",aug:"August",sep:"September",oct:"October",nov:"November",dec:"December",Jan:"January",Feb:"February",Mar:"March",Apr:"April",May:"May",Jun:"June",Jul:"July",Aug:"August",Sep:"September",Oct:"October",Nov:"November",Dec:"December"};this.getErrors=function(){return this.ERRORS_};this.parse=function(f){for(var g=0;g<f.length;g++){this.processCharacter_(f[g])}};this.error_=function(f){this.ERRORS_.push([this.LINE_,this.CHAR_IN_LINE_,this.CHAR_,f])};this.processEntry_=function(){var h=this.DATA_;if(h.Fields){for(var k in h.Fields){var p=h.Fields[k];for(var j=0;j<this.CHARCONV_.length;j++){var q=this.CHARCONV_[j][0];var n=this.CHARCONV_[j][1];p=p.replace(q,n)}p=p.replace(/[\n\r\t]/g," ").replace(/\s\s+/g," ").replace(/^\s+|\s+$/g,"");var l=p.length;var g="";for(var j=0;j<l;j++){var m=p[j];var o=false;if(m=="\\"&&j<l-1){m=p[++j]}else{if(m=="{"||m=="}"){o=true}}if(!o){g+=m}}h.Fields[k]=g}}if(h.ObjectType=="string"){for(var k in h.Fields){this.MACROS_[k]=h.Fields[k]}}else{this.CALLBACK_(h)}};this.processCharacter_=function(l){this.CHAR_++;this.CHAR_IN_LINE_++;if(l=="\n"){this.LINE_++;this.CHAR_IN_LINE_=1}if(this.SKIPTILLEOL_){if(l=="\n"){this.SKIPTILLEOL_=false}return}if(this.SKIPCOMMENT_&&l=="%"){this.SKIPTILLEOL_=true;return}if(this.SKIPWS_&&/\s/.test(l)){return}this.SKIPWS_=false;this.SKIPCOMMENT_=false;this.SKIPTILLEOL_=false;var f=true;while(f){f=false;switch(this.STATE_){case this.STATES_.ENTRY_OR_JUNK:if(l=="@"){this.STATE_=this.STATES_.OBJECT_TYPE;this.DATA_={ObjectType:""}}this.BRACETYPE_=null;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break;case this.STATES_.OBJECT_TYPE:if(/[A-Za-z]/.test(l)){this.DATA_.ObjectType+=l.toLowerCase();this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{var i=this.DATA_.ObjectType;if(i=="comment"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i=="string"){this.DATA_.ObjectType=i;this.DATA_.Fields={};this.BRACETYPE_=l;this.BRACECOUNT_=1;this.STATE_=this.STATES_.KV_KEY;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={Key:""}}else{if(i=="preamble"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i in this.ENTRY_TYPES_){this.DATA_.ObjectType="entry";this.DATA_.EntryType=i;this.DATA_.EntryKey="";this.STATE_=this.STATES_.ENTRY_KEY;f=true}else{this.error_('Unrecognized object type: "'+this.DATA_.ObjectType+'"');this.STATE_=this.STATES_.ENTRY_OR_JUNK}}}}}break;case this.STATES_.ENTRY_KEY:if((l==="{"||l==="(")&&this.BRACETYPE_==null){this.BRACETYPE_=l;this.BRACECOUNT_=1;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break}if(/[,%\s]/.test(l)){if(this.DATA_.EntryKey.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{if(this.BRACETYPE_==null){this.error_("No opening brace for object.");this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;f=true;this.STATE_=this.STATES_.KV_KEY;this.PARSETMP_.Key="";this.DATA_.Fields={}}}}else{this.DATA_.EntryKey+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}break;case this.STATES_.KV_KEY:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(/[\-A-Za-z:]/.test(l)){this.PARSETMP_.Key+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{if(this.PARSETMP_.Key.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.EQUALS;f=true}}break;case this.STATES_.EQUALS:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.error_('Key-value pair has key "'+this.PARSETMP_.Key+'", but no value.');this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(l=="="){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_VALUE;this.PARSETMP_.Value="";this.VALBRACES_={'"':[],"{":[]}}break;case this.STATES_.KV_VALUE:var k=this.VALBRACES_;var j=this.PARSETMP_.Value;var h=false;if(l=='"'||l=="{"||l=="}"||l==","){if(l==","){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}h=true}}if(l=='"'){if(0===k['"'].length+k["{"].length){k['"'].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false;break}if(k['"'].length==1&&k["{"].length==0&&(j.length==0||j[j.length-1]!="\\")){h=true}else{}}if(l=="{"){if(j.length==0||j[j.length-1]!="\\"){k["{"].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{}}if(l=="}"){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}f=true;h=true}else{if(j.length==0||j[j.length-1]!="\\"){if(k["{"].length>0){k["{"].splice(k["{"].length-1,1);if(0==k["{"].length+k['"'].length){h=true}else{}}}else{}}}}if(h){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_KEY;this.DATA_.Fields[this.PARSETMP_.Key]=this.PARSETMP_.Value;this.PARSETMP_={Key:""};this.VALBRACES_=null}else{this.PARSETMP_.Value+=l}break}}};this.CHARCONV_=[[/\\space /g,"\u0020"],[/\\textdollar /g,"\u0024"],[/\\textquotesingle /g,"\u0027"],[/\\ast /g,"\u002A"],[/\\textbackslash /g,"\u005C"],[/\\\^\{\}/g,"\u005E"],[/\\textasciigrave /g,"\u0060"],[/\\lbrace /g,"\u007B"],[/\\vert /g,"\u007C"],[/\\rbrace /g,"\u007D"],[/\\textasciitilde /g,"\u007E"],[/\\textexclamdown /g,"\u00A1"],[/\\textcent /g,"\u00A2"],[/\\textsterling /g,"\u00A3"],[/\\textcurrency /g,"\u00A4"],[/\\textyen /g,"\u00A5"],[/\\textbrokenbar /g,"\u00A6"],[/\\textsection /g,"\u00A7"],[/\\textasciidieresis /g,"\u00A8"],[/\\textcopyright /g,"\u00A9"],[/\\textordfeminine /g,"\u00AA"],[/\\guillemotleft /g,"\u00AB"],[/\\lnot /g,"\u00AC"],[/\\textregistered /g,"\u00AE"],[/\\textasciimacron /g,"\u00AF"],[/\\textdegree /g,"\u00B0"],[/\\pm /g,"\u00B1"],[/\\textasciiacute /g,"\u00B4"],[/\\mathrm\{\\mu\}/g,"\u00B5"],[/\\textparagraph /g,"\u00B6"],[/\\cdot /g,"\u00B7"],[/\\c\{\}/g,"\u00B8"],[/\\textordmasculine /g,"\u00BA"],[/\\guillemotright /g,"\u00BB"],[/\\textonequarter /g,"\u00BC"],[/\\textonehalf /g,"\u00BD"],[/\\textthreequarters /g,"\u00BE"],[/\\textquestiondown /g,"\u00BF"],[/\\`\{A\}/g,"\u00C0"],[/\\'\{A\}/g,"\u00C1"],[/\\\^\{A\}/g,"\u00C2"],[/\\~\{A\}/g,"\u00C3"],[/\\"\{A\}/g,"\u00C4"],[/\\AA /g,"\u00C5"],[/\\AE /g,"\u00C6"],[/\\c\{C\}/g,"\u00C7"],[/\\`\{E\}/g,"\u00C8"],[/\\'\{E\}/g,"\u00C9"],[/\\\^\{E\}/g,"\u00CA"],[/\\"\{E\}/g,"\u00CB"],[/\\`\{I\}/g,"\u00CC"],[/\\'\{I\}/g,"\u00CD"],[/\\\^\{I\}/g,"\u00CE"],[/\\"\{I\}/g,"\u00CF"],[/\\DH /g,"\u00D0"],[/\\~\{N\}/g,"\u00D1"],[/\\`\{O\}/g,"\u00D2"],[/\\'\{O\}/g,"\u00D3"],[/\\\^\{O\}/g,"\u00D4"],[/\\~\{O\}/g,"\u00D5"],[/\\"\{O\}/g,"\u00D6"],[/\\texttimes /g,"\u00D7"],[/\\O /g,"\u00D8"],[/\\`\{U\}/g,"\u00D9"],[/\\'\{U\}/g,"\u00DA"],[/\\\^\{U\}/g,"\u00DB"],[/\\"\{U\}/g,"\u00DC"],[/\\'\{Y\}/g,"\u00DD"],[/\\TH /g,"\u00DE"],[/\\ss /g,"\u00DF"],[/\\`\{a\}/g,"\u00E0"],[/\\'\{a\}/g,"\u00E1"],[/\\\^\{a\}/g,"\u00E2"],[/\\~\{a\}/g,"\u00E3"],[/\\"\{a\}/g,"\u00E4"],[/\\aa /g,"\u00E5"],[/\\ae /g,"\u00E6"],[/\\c\{c\}/g,"\u00E7"],[/\\`\{e\}/g,"\u00E8"],[/\\'\{e\}/g,"\u00E9"],[/\\\^\{e\}/g,"\u00EA"],[/\\"\{e\}/g,"\u00EB"],[/\\`\{\\i\}/g,"\u00EC"],[/\\'\{\\i\}/g,"\u00ED"],[/\\\^\{\\i\}/g,"\u00EE"],[/\\"\{\\i\}/g,"\u00EF"],[/\\dh /g,"\u00F0"],[/\\~\{n\}/g,"\u00F1"],[/\\`\{o\}/g,"\u00F2"],[/\\'\{o\}/g,"\u00F3"],[/\\\^\{o\}/g,"\u00F4"],[/\\~\{o\}/g,"\u00F5"],[/\\"\{o\}/g,"\u00F6"],[/\\div /g,"\u00F7"],[/\\o /g,"\u00F8"],[/\\`\{u\}/g,"\u00F9"],[/\\'\{u\}/g,"\u00FA"],[/\\\^\{u\}/g,"\u00FB"],[/\\"\{u\}/g,"\u00FC"],[/\\'\{y\}/g,"\u00FD"],[/\\th /g,"\u00FE"],[/\\"\{y\}/g,"\u00FF"],[/\\=\{A\}/g,"\u0100"],[/\\=\{a\}/g,"\u0101"],[/\\u\{A\}/g,"\u0102"],[/\\u\{a\}/g,"\u0103"],[/\\k\{A\}/g,"\u0104"],[/\\k\{a\}/g,"\u0105"],[/\\'\{C\}/g,"\u0106"],[/\\'\{c\}/g,"\u0107"],[/\\\^\{C\}/g,"\u0108"],[/\\\^\{c\}/g,"\u0109"],[/\\.\{C\}/g,"\u010A"],[/\\.\{c\}/g,"\u010B"],[/\\v\{C\}/g,"\u010C"],[/\\v\{c\}/g,"\u010D"],[/\\v\{D\}/g,"\u010E"],[/\\v\{d\}/g,"\u010F"],[/\\DJ /g,"\u0110"],[/\\dj /g,"\u0111"],[/\\=\{E\}/g,"\u0112"],[/\\=\{e\}/g,"\u0113"],[/\\u\{E\}/g,"\u0114"],[/\\u\{e\}/g,"\u0115"],[/\\.\{E\}/g,"\u0116"],[/\\.\{e\}/g,"\u0117"],[/\\k\{E\}/g,"\u0118"],[/\\k\{e\}/g,"\u0119"],[/\\v\{E\}/g,"\u011A"],[/\\v\{e\}/g,"\u011B"],[/\\\^\{G\}/g,"\u011C"],[/\\\^\{g\}/g,"\u011D"],[/\\u\{G\}/g,"\u011E"],[/\\u\{g\}/g,"\u011F"],[/\\.\{G\}/g,"\u0120"],[/\\.\{g\}/g,"\u0121"],[/\\c\{G\}/g,"\u0122"],[/\\c\{g\}/g,"\u0123"],[/\\\^\{H\}/g,"\u0124"],[/\\\^\{h\}/g,"\u0125"],[/\\Elzxh /g,"\u0127"],[/\\~\{I\}/g,"\u0128"],[/\\~\{\\i\}/g,"\u0129"],[/\\=\{I\}/g,"\u012A"],[/\\=\{\\i\}/g,"\u012B"],[/\\u\{I\}/g,"\u012C"],[/\\u\{\\i\}/g,"\u012D"],[/\\k\{I\}/g,"\u012E"],[/\\k\{i\}/g,"\u012F"],[/\\.\{I\}/g,"\u0130"],[/\\i /g,"\u0131"],[/\\\^\{J\}/g,"\u0134"],[/\\\^\{\\j\}/g,"\u0135"],[/\\c\{K\}/g,"\u0136"],[/\\c\{k\}/g,"\u0137"],[/\\'\{L\}/g,"\u0139"],[/\\'\{l\}/g,"\u013A"],[/\\c\{L\}/g,"\u013B"],[/\\c\{l\}/g,"\u013C"],[/\\v\{L\}/g,"\u013D"],[/\\v\{l\}/g,"\u013E"],[/\\L /g,"\u0141"],[/\\l /g,"\u0142"],[/\\'\{N\}/g,"\u0143"],[/\\'\{n\}/g,"\u0144"],[/\\c\{N\}/g,"\u0145"],[/\\c\{n\}/g,"\u0146"],[/\\v\{N\}/g,"\u0147"],[/\\v\{n\}/g,"\u0148"],[/\\NG /g,"\u014A"],[/\\ng /g,"\u014B"],[/\\=\{O\}/g,"\u014C"],[/\\=\{o\}/g,"\u014D"],[/\\u\{O\}/g,"\u014E"],[/\\u\{o\}/g,"\u014F"],[/\\H\{O\}/g,"\u0150"],[/\\H\{o\}/g,"\u0151"],[/\\OE /g,"\u0152"],[/\\oe /g,"\u0153"],[/\\'\{R\}/g,"\u0154"],[/\\'\{r\}/g,"\u0155"],[/\\c\{R\}/g,"\u0156"],[/\\c\{r\}/g,"\u0157"],[/\\v\{R\}/g,"\u0158"],[/\\v\{r\}/g,"\u0159"],[/\\'\{S\}/g,"\u015A"],[/\\'\{s\}/g,"\u015B"],[/\\\^\{S\}/g,"\u015C"],[/\\\^\{s\}/g,"\u015D"],[/\\c\{S\}/g,"\u015E"],[/\\c\{s\}/g,"\u015F"],[/\\v\{S\}/g,"\u0160"],[/\\v\{s\}/g,"\u0161"],[/\\c\{T\}/g,"\u0162"],[/\\c\{t\}/g,"\u0163"],[/\\v\{T\}/g,"\u0164"],[/\\v\{t\}/g,"\u0165"],[/\\~\{U\}/g,"\u0168"],[/\\~\{u\}/g,"\u0169"],[/\\=\{U\}/g,"\u016A"],[/\\=\{u\}/g,"\u016B"],[/\\u\{U\}/g,"\u016C"],[/\\u\{u\}/g,"\u016D"],[/\\r\{U\}/g,"\u016E"],[/\\r\{u\}/g,"\u016F"],[/\\H\{U\}/g,"\u0170"],[/\\H\{u\}/g,"\u0171"],[/\\k\{U\}/g,"\u0172"],[/\\k\{u\}/g,"\u0173"],[/\\\^\{W\}/g,"\u0174"],[/\\\^\{w\}/g,"\u0175"],[/\\\^\{Y\}/g,"\u0176"],[/\\\^\{y\}/g,"\u0177"],[/\\"\{Y\}/g,"\u0178"],[/\\'\{Z\}/g,"\u0179"],[/\\'\{z\}/g,"\u017A"],[/\\.\{Z\}/g,"\u017B"],[/\\.\{z\}/g,"\u017C"],[/\\v\{Z\}/g,"\u017D"],[/\\v\{z\}/g,"\u017E"],[/\\texthvlig /g,"\u0195"],[/\\textnrleg /g,"\u019E"],[/\\eth /g,"\u01AA"],[/\\textdoublepipe /g,"\u01C2"],[/\\'\{g\}/g,"\u01F5"],[/\\Elztrna /g,"\u0250"],[/\\Elztrnsa /g,"\u0252"],[/\\Elzopeno /g,"\u0254"],[/\\Elzrtld /g,"\u0256"],[/\\Elzschwa /g,"\u0259"],[/\\varepsilon /g,"\u025B"],[/\\Elzpgamma /g,"\u0263"],[/\\Elzpbgam /g,"\u0264"],[/\\Elztrnh /g,"\u0265"],[/\\Elzbtdl /g,"\u026C"],[/\\Elzrtll /g,"\u026D"],[/\\Elztrnm /g,"\u026F"],[/\\Elztrnmlr /g,"\u0270"],[/\\Elzltlmr /g,"\u0271"],[/\\Elzltln /g,"\u0272"],[/\\Elzrtln /g,"\u0273"],[/\\Elzclomeg /g,"\u0277"],[/\\textphi /g,"\u0278"],[/\\Elztrnr /g,"\u0279"],[/\\Elztrnrl /g,"\u027A"],[/\\Elzrttrnr /g,"\u027B"],[/\\Elzrl /g,"\u027C"],[/\\Elzrtlr /g,"\u027D"],[/\\Elzfhr /g,"\u027E"],[/\\Elzrtls /g,"\u0282"],[/\\Elzesh /g,"\u0283"],[/\\Elztrnt /g,"\u0287"],[/\\Elzrtlt /g,"\u0288"],[/\\Elzpupsil /g,"\u028A"],[/\\Elzpscrv /g,"\u028B"],[/\\Elzinvv /g,"\u028C"],[/\\Elzinvw /g,"\u028D"],[/\\Elztrny /g,"\u028E"],[/\\Elzrtlz /g,"\u0290"],[/\\Elzyogh /g,"\u0292"],[/\\Elzglst /g,"\u0294"],[/\\Elzreglst /g,"\u0295"],[/\\Elzinglst /g,"\u0296"],[/\\textturnk /g,"\u029E"],[/\\Elzdyogh /g,"\u02A4"],[/\\Elztesh /g,"\u02A7"],[/\\textasciicaron /g,"\u02C7"],[/\\Elzverts /g,"\u02C8"],[/\\Elzverti /g,"\u02CC"],[/\\Elzlmrk /g,"\u02D0"],[/\\Elzhlmrk /g,"\u02D1"],[/\\Elzsbrhr /g,"\u02D2"],[/\\Elzsblhr /g,"\u02D3"],[/\\Elzrais /g,"\u02D4"],[/\\Elzlow /g,"\u02D5"],[/\\textasciibreve /g,"\u02D8"],[/\\textperiodcentered /g,"\u02D9"],[/\\r\{\}/g,"\u02DA"],[/\\k\{\}/g,"\u02DB"],[/\\texttildelow /g,"\u02DC"],[/\\H\{\}/g,"\u02DD"],[/\\tone\{55\}/g,"\u02E5"],[/\\tone\{44\}/g,"\u02E6"],[/\\tone\{33\}/g,"\u02E7"],[/\\tone\{22\}/g,"\u02E8"],[/\\tone\{11\}/g,"\u02E9"],[/\\cyrchar\\C/g,"\u030F"],[/\\Elzpalh /g,"\u0321"],[/\\Elzrh /g,"\u0322"],[/\\Elzsbbrg /g,"\u032A"],[/\\Elzxl /g,"\u0335"],[/\\Elzbar /g,"\u0336"],[/\\'\{A\}/g,"\u0386"],[/\\'\{E\}/g,"\u0388"],[/\\'\{H\}/g,"\u0389"],[/\\'\{\}\{I\}/g,"\u038A"],[/\\'\{\}O/g,"\u038C"],[/\\mathrm\{'Y\}/g,"\u038E"],[/\\mathrm\{'\\Omega\}/g,"\u038F"],[/\\acute\{\\ddot\{\\iota\}\}/g,"\u0390"],[/\\Alpha /g,"\u0391"],[/\\Beta /g,"\u0392"],[/\\Gamma /g,"\u0393"],[/\\Delta /g,"\u0394"],[/\\Epsilon /g,"\u0395"],[/\\Zeta /g,"\u0396"],[/\\Eta /g,"\u0397"],[/\\Theta /g,"\u0398"],[/\\Iota /g,"\u0399"],[/\\Kappa /g,"\u039A"],[/\\Lambda /g,"\u039B"],[/\\Xi /g,"\u039E"],[/\\Pi /g,"\u03A0"],[/\\Rho /g,"\u03A1"],[/\\Sigma /g,"\u03A3"],[/\\Tau /g,"\u03A4"],[/\\Upsilon /g,"\u03A5"],[/\\Phi /g,"\u03A6"],[/\\Chi /g,"\u03A7"],[/\\Psi /g,"\u03A8"],[/\\Omega /g,"\u03A9"],[/\\mathrm\{\\ddot\{I\}\}/g,"\u03AA"],[/\\mathrm\{\\ddot\{Y\}\}/g,"\u03AB"],[/\\'\{\$\\alpha\$\}/g,"\u03AC"],[/\\acute\{\\epsilon\}/g,"\u03AD"],[/\\acute\{\\eta\}/g,"\u03AE"],[/\\acute\{\\iota\}/g,"\u03AF"],[/\\acute\{\\ddot\{\\upsilon\}\}/g,"\u03B0"],[/\\alpha /g,"\u03B1"],[/\\beta /g,"\u03B2"],[/\\gamma /g,"\u03B3"],[/\\delta /g,"\u03B4"],[/\\epsilon /g,"\u03B5"],[/\\zeta /g,"\u03B6"],[/\\eta /g,"\u03B7"],[/\\texttheta /g,"\u03B8"],[/\\iota /g,"\u03B9"],[/\\kappa /g,"\u03BA"],[/\\lambda /g,"\u03BB"],[/\\mu /g,"\u03BC"],[/\\nu /g,"\u03BD"],[/\\xi /g,"\u03BE"],[/\\pi /g,"\u03C0"],[/\\rho /g,"\u03C1"],[/\\varsigma /g,"\u03C2"],[/\\sigma /g,"\u03C3"],[/\\tau /g,"\u03C4"],[/\\upsilon /g,"\u03C5"],[/\\varphi /g,"\u03C6"],[/\\chi /g,"\u03C7"],[/\\psi /g,"\u03C8"],[/\\omega /g,"\u03C9"],[/\\ddot\{\\iota\}/g,"\u03CA"],[/\\ddot\{\\upsilon\}/g,"\u03CB"],[/\\'\{o\}/g,"\u03CC"],[/\\acute\{\\upsilon\}/g,"\u03CD"],[/\\acute\{\\omega\}/g,"\u03CE"],[/\\Pisymbol\{ppi022\}\{87\}/g,"\u03D0"],[/\\textvartheta /g,"\u03D1"],[/\\Upsilon /g,"\u03D2"],[/\\phi /g,"\u03D5"],[/\\varpi /g,"\u03D6"],[/\\Stigma /g,"\u03DA"],[/\\Digamma /g,"\u03DC"],[/\\digamma /g,"\u03DD"],[/\\Koppa /g,"\u03DE"],[/\\Sampi /g,"\u03E0"],[/\\varkappa /g,"\u03F0"],[/\\varrho /g,"\u03F1"],[/\\textTheta /g,"\u03F4"],[/\\backepsilon /g,"\u03F6"],[/\\cyrchar\\CYRYO /g,"\u0401"],[/\\cyrchar\\CYRDJE /g,"\u0402"],[/\\cyrchar\{\\'\\CYRG\}/g,"\u0403"],[/\\cyrchar\\CYRIE /g,"\u0404"],[/\\cyrchar\\CYRDZE /g,"\u0405"],[/\\cyrchar\\CYRII /g,"\u0406"],[/\\cyrchar\\CYRYI /g,"\u0407"],[/\\cyrchar\\CYRJE /g,"\u0408"],[/\\cyrchar\\CYRLJE /g,"\u0409"],[/\\cyrchar\\CYRNJE /g,"\u040A"],[/\\cyrchar\\CYRTSHE /g,"\u040B"],[/\\cyrchar\{\\'\\CYRK\}/g,"\u040C"],[/\\cyrchar\\CYRUSHRT /g,"\u040E"],[/\\cyrchar\\CYRDZHE /g,"\u040F"],[/\\cyrchar\\CYRA /g,"\u0410"],[/\\cyrchar\\CYRB /g,"\u0411"],[/\\cyrchar\\CYRV /g,"\u0412"],[/\\cyrchar\\CYRG /g,"\u0413"],[/\\cyrchar\\CYRD /g,"\u0414"],[/\\cyrchar\\CYRE /g,"\u0415"],[/\\cyrchar\\CYRZH /g,"\u0416"],[/\\cyrchar\\CYRZ /g,"\u0417"],[/\\cyrchar\\CYRI /g,"\u0418"],[/\\cyrchar\\CYRISHRT /g,"\u0419"],[/\\cyrchar\\CYRK /g,"\u041A"],[/\\cyrchar\\CYRL /g,"\u041B"],[/\\cyrchar\\CYRM /g,"\u041C"],[/\\cyrchar\\CYRN /g,"\u041D"],[/\\cyrchar\\CYRO /g,"\u041E"],[/\\cyrchar\\CYRP /g,"\u041F"],[/\\cyrchar\\CYRR /g,"\u0420"],[/\\cyrchar\\CYRS /g,"\u0421"],[/\\cyrchar\\CYRT /g,"\u0422"],[/\\cyrchar\\CYRU /g,"\u0423"],[/\\cyrchar\\CYRF /g,"\u0424"],[/\\cyrchar\\CYRH /g,"\u0425"],[/\\cyrchar\\CYRC /g,"\u0426"],[/\\cyrchar\\CYRCH /g,"\u0427"],[/\\cyrchar\\CYRSH /g,"\u0428"],[/\\cyrchar\\CYRSHCH /g,"\u0429"],[/\\cyrchar\\CYRHRDSN /g,"\u042A"],[/\\cyrchar\\CYRERY /g,"\u042B"],[/\\cyrchar\\CYRSFTSN /g,"\u042C"],[/\\cyrchar\\CYREREV /g,"\u042D"],[/\\cyrchar\\CYRYU /g,"\u042E"],[/\\cyrchar\\CYRYA /g,"\u042F"],[/\\cyrchar\\cyra /g,"\u0430"],[/\\cyrchar\\cyrb /g,"\u0431"],[/\\cyrchar\\cyrv /g,"\u0432"],[/\\cyrchar\\cyrg /g,"\u0433"],[/\\cyrchar\\cyrd /g,"\u0434"],[/\\cyrchar\\cyre /g,"\u0435"],[/\\cyrchar\\cyrzh /g,"\u0436"],[/\\cyrchar\\cyrz /g,"\u0437"],[/\\cyrchar\\cyri /g,"\u0438"],[/\\cyrchar\\cyrishrt /g,"\u0439"],[/\\cyrchar\\cyrk /g,"\u043A"],[/\\cyrchar\\cyrl /g,"\u043B"],[/\\cyrchar\\cyrm /g,"\u043C"],[/\\cyrchar\\cyrn /g,"\u043D"],[/\\cyrchar\\cyro /g,"\u043E"],[/\\cyrchar\\cyrp /g,"\u043F"],[/\\cyrchar\\cyrr /g,"\u0440"],[/\\cyrchar\\cyrs /g,"\u0441"],[/\\cyrchar\\cyrt /g,"\u0442"],[/\\cyrchar\\cyru /g,"\u0443"],[/\\cyrchar\\cyrf /g,"\u0444"],[/\\cyrchar\\cyrh /g,"\u0445"],[/\\cyrchar\\cyrc /g,"\u0446"],[/\\cyrchar\\cyrch /g,"\u0447"],[/\\cyrchar\\cyrsh /g,"\u0448"],[/\\cyrchar\\cyrshch /g,"\u0449"],[/\\cyrchar\\cyrhrdsn /g,"\u044A"],[/\\cyrchar\\cyrery /g,"\u044B"],[/\\cyrchar\\cyrsftsn /g,"\u044C"],[/\\cyrchar\\cyrerev /g,"\u044D"],[/\\cyrchar\\cyryu /g,"\u044E"],[/\\cyrchar\\cyrya /g,"\u044F"],[/\\cyrchar\\cyryo /g,"\u0451"],[/\\cyrchar\\cyrdje /g,"\u0452"],[/\\cyrchar\{\\'\\cyrg\}/g,"\u0453"],[/\\cyrchar\\cyrie /g,"\u0454"],[/\\cyrchar\\cyrdze /g,"\u0455"],[/\\cyrchar\\cyrii /g,"\u0456"],[/\\cyrchar\\cyryi /g,"\u0457"],[/\\cyrchar\\cyrje /g,"\u0458"],[/\\cyrchar\\cyrlje /g,"\u0459"],[/\\cyrchar\\cyrnje /g,"\u045A"],[/\\cyrchar\\cyrtshe /g,"\u045B"],[/\\cyrchar\{\\'\\cyrk\}/g,"\u045C"],[/\\cyrchar\\cyrushrt /g,"\u045E"],[/\\cyrchar\\cyrdzhe /g,"\u045F"],[/\\cyrchar\\CYROMEGA /g,"\u0460"],[/\\cyrchar\\cyromega /g,"\u0461"],[/\\cyrchar\\CYRYAT /g,"\u0462"],[/\\cyrchar\\CYRIOTE /g,"\u0464"],[/\\cyrchar\\cyriote /g,"\u0465"],[/\\cyrchar\\CYRLYUS /g,"\u0466"],[/\\cyrchar\\cyrlyus /g,"\u0467"],[/\\cyrchar\\CYRIOTLYUS /g,"\u0468"],[/\\cyrchar\\cyriotlyus /g,"\u0469"],[/\\cyrchar\\CYRBYUS /g,"\u046A"],[/\\cyrchar\\CYRIOTBYUS /g,"\u046C"],[/\\cyrchar\\cyriotbyus /g,"\u046D"],[/\\cyrchar\\CYRKSI /g,"\u046E"],[/\\cyrchar\\cyrksi /g,"\u046F"],[/\\cyrchar\\CYRPSI /g,"\u0470"],[/\\cyrchar\\cyrpsi /g,"\u0471"],[/\\cyrchar\\CYRFITA /g,"\u0472"],[/\\cyrchar\\CYRIZH /g,"\u0474"],[/\\cyrchar\\CYRUK /g,"\u0478"],[/\\cyrchar\\cyruk /g,"\u0479"],[/\\cyrchar\\CYROMEGARND /g,"\u047A"],[/\\cyrchar\\cyromegarnd /g,"\u047B"],[/\\cyrchar\\CYROMEGATITLO /g,"\u047C"],[/\\cyrchar\\cyromegatitlo /g,"\u047D"],[/\\cyrchar\\CYROT /g,"\u047E"],[/\\cyrchar\\cyrot /g,"\u047F"],[/\\cyrchar\\CYRKOPPA /g,"\u0480"],[/\\cyrchar\\cyrkoppa /g,"\u0481"],[/\\cyrchar\\cyrthousands /g,"\u0482"],[/\\cyrchar\\cyrhundredthousands /g,"\u0488"],[/\\cyrchar\\cyrmillions /g,"\u0489"],[/\\cyrchar\\CYRSEMISFTSN /g,"\u048C"],[/\\cyrchar\\cyrsemisftsn /g,"\u048D"],[/\\cyrchar\\CYRRTICK /g,"\u048E"],[/\\cyrchar\\cyrrtick /g,"\u048F"],[/\\cyrchar\\CYRGUP /g,"\u0490"],[/\\cyrchar\\cyrgup /g,"\u0491"],[/\\cyrchar\\CYRGHCRS /g,"\u0492"],[/\\cyrchar\\cyrghcrs /g,"\u0493"],[/\\cyrchar\\CYRGHK /g,"\u0494"],[/\\cyrchar\\cyrghk /g,"\u0495"],[/\\cyrchar\\CYRZHDSC /g,"\u0496"],[/\\cyrchar\\cyrzhdsc /g,"\u0497"],[/\\cyrchar\\CYRZDSC /g,"\u0498"],[/\\cyrchar\\cyrzdsc /g,"\u0499"],[/\\cyrchar\\CYRKDSC /g,"\u049A"],[/\\cyrchar\\cyrkdsc /g,"\u049B"],[/\\cyrchar\\CYRKVCRS /g,"\u049C"],[/\\cyrchar\\cyrkvcrs /g,"\u049D"],[/\\cyrchar\\CYRKHCRS /g,"\u049E"],[/\\cyrchar\\cyrkhcrs /g,"\u049F"],[/\\cyrchar\\CYRKBEAK /g,"\u04A0"],[/\\cyrchar\\cyrkbeak /g,"\u04A1"],[/\\cyrchar\\CYRNDSC /g,"\u04A2"],[/\\cyrchar\\cyrndsc /g,"\u04A3"],[/\\cyrchar\\CYRNG /g,"\u04A4"],[/\\cyrchar\\cyrng /g,"\u04A5"],[/\\cyrchar\\CYRPHK /g,"\u04A6"],[/\\cyrchar\\cyrphk /g,"\u04A7"],[/\\cyrchar\\CYRABHHA /g,"\u04A8"],[/\\cyrchar\\cyrabhha /g,"\u04A9"],[/\\cyrchar\\CYRSDSC /g,"\u04AA"],[/\\cyrchar\\cyrsdsc /g,"\u04AB"],[/\\cyrchar\\CYRTDSC /g,"\u04AC"],[/\\cyrchar\\cyrtdsc /g,"\u04AD"],[/\\cyrchar\\CYRY /g,"\u04AE"],[/\\cyrchar\\cyry /g,"\u04AF"],[/\\cyrchar\\CYRYHCRS /g,"\u04B0"],[/\\cyrchar\\cyryhcrs /g,"\u04B1"],[/\\cyrchar\\CYRHDSC /g,"\u04B2"],[/\\cyrchar\\cyrhdsc /g,"\u04B3"],[/\\cyrchar\\CYRTETSE /g,"\u04B4"],[/\\cyrchar\\cyrtetse /g,"\u04B5"],[/\\cyrchar\\CYRCHRDSC /g,"\u04B6"],[/\\cyrchar\\cyrchrdsc /g,"\u04B7"],[/\\cyrchar\\CYRCHVCRS /g,"\u04B8"],[/\\cyrchar\\cyrchvcrs /g,"\u04B9"],[/\\cyrchar\\CYRSHHA /g,"\u04BA"],[/\\cyrchar\\cyrshha /g,"\u04BB"],[/\\cyrchar\\CYRABHCH /g,"\u04BC"],[/\\cyrchar\\cyrabhch /g,"\u04BD"],[/\\cyrchar\\CYRABHCHDSC /g,"\u04BE"],[/\\cyrchar\\cyrabhchdsc /g,"\u04BF"],[/\\cyrchar\\CYRpalochka /g,"\u04C0"],[/\\cyrchar\\CYRKHK /g,"\u04C3"],[/\\cyrchar\\cyrkhk /g,"\u04C4"],[/\\cyrchar\\CYRNHK /g,"\u04C7"],[/\\cyrchar\\cyrnhk /g,"\u04C8"],[/\\cyrchar\\CYRCHLDSC /g,"\u04CB"],[/\\cyrchar\\cyrchldsc /g,"\u04CC"],[/\\cyrchar\\CYRAE /g,"\u04D4"],[/\\cyrchar\\cyrae /g,"\u04D5"],[/\\cyrchar\\CYRSCHWA /g,"\u04D8"],[/\\cyrchar\\cyrschwa /g,"\u04D9"],[/\\cyrchar\\CYRABHDZE /g,"\u04E0"],[/\\cyrchar\\cyrabhdze /g,"\u04E1"],[/\\cyrchar\\CYROTLD /g,"\u04E8"],[/\\cyrchar\\cyrotld /g,"\u04E9"],[/\\hspace\{0.6em\}/g,"\u2002"],[/\\hspace\{1em\}/g,"\u2003"],[/\\hspace\{0.33em\}/g,"\u2004"],[/\\hspace\{0.25em\}/g,"\u2005"],[/\\hspace\{0.166em\}/g,"\u2006"],[/\\hphantom\{0\}/g,"\u2007"],[/\\hphantom\{,\}/g,"\u2008"],[/\\hspace\{0.167em\}/g,"\u2009"],[/\\mkern1mu /g,"\u200A"],[/\\textendash /g,"\u2013"],[/\\textemdash /g,"\u2014"],[/\\rule\{1em\}\{1pt\}/g,"\u2015"],[/\\Vert /g,"\u2016"],[/\\Elzreapos /g,"\u201B"],[/\\textquotedblleft /g,"\u201C"],[/\\textquotedblright /g,"\u201D"],[/\\textdagger /g,"\u2020"],[/\\textdaggerdbl /g,"\u2021"],[/\\textbullet /g,"\u2022"],[/\\ldots /g,"\u2026"],[/\\textperthousand /g,"\u2030"],[/\\textpertenthousand /g,"\u2031"],[/\\backprime /g,"\u2035"],[/\\guilsinglleft /g,"\u2039"],[/\\guilsinglright /g,"\u203A"],[/\\mkern4mu /g,"\u205F"],[/\\nolinebreak /g,"\u2060"],[/\\ensuremath\{\\Elzpes\}/g,"\u20A7"],[/\\mbox\{\\texteuro\} /g,"\u20AC"],[/\\dddot /g,"\u20DB"],[/\\ddddot /g,"\u20DC"],[/\\mathbb\{C\}/g,"\u2102"],[/\\mathscr\{g\}/g,"\u210A"],[/\\mathscr\{H\}/g,"\u210B"],[/\\mathfrak\{H\}/g,"\u210C"],[/\\mathbb\{H\}/g,"\u210D"],[/\\hslash /g,"\u210F"],[/\\mathscr\{I\}/g,"\u2110"],[/\\mathfrak\{I\}/g,"\u2111"],[/\\mathscr\{L\}/g,"\u2112"],[/\\mathscr\{l\}/g,"\u2113"],[/\\mathbb\{N\}/g,"\u2115"],[/\\cyrchar\\textnumero /g,"\u2116"],[/\\wp /g,"\u2118"],[/\\mathbb\{P\}/g,"\u2119"],[/\\mathbb\{Q\}/g,"\u211A"],[/\\mathscr\{R\}/g,"\u211B"],[/\\mathfrak\{R\}/g,"\u211C"],[/\\mathbb\{R\}/g,"\u211D"],[/\\Elzxrat /g,"\u211E"],[/\\texttrademark /g,"\u2122"],[/\\mathbb\{Z\}/g,"\u2124"],[/\\Omega /g,"\u2126"],[/\\mho /g,"\u2127"],[/\\mathfrak\{Z\}/g,"\u2128"],[/\\ElsevierGlyph\{2129\}/g,"\u2129"],[/\\AA /g,"\u212B"],[/\\mathscr\{B\}/g,"\u212C"],[/\\mathfrak\{C\}/g,"\u212D"],[/\\mathscr\{e\}/g,"\u212F"],[/\\mathscr\{E\}/g,"\u2130"],[/\\mathscr\{F\}/g,"\u2131"],[/\\mathscr\{M\}/g,"\u2133"],[/\\mathscr\{o\}/g,"\u2134"],[/\\aleph /g,"\u2135"],[/\\beth /g,"\u2136"],[/\\gimel /g,"\u2137"],[/\\daleth /g,"\u2138"],[/\\textfrac\{1\}\{3\}/g,"\u2153"],[/\\textfrac\{2\}\{3\}/g,"\u2154"],[/\\textfrac\{1\}\{5\}/g,"\u2155"],[/\\textfrac\{2\}\{5\}/g,"\u2156"],[/\\textfrac\{3\}\{5\}/g,"\u2157"],[/\\textfrac\{4\}\{5\}/g,"\u2158"],[/\\textfrac\{1\}\{6\}/g,"\u2159"],[/\\textfrac\{5\}\{6\}/g,"\u215A"],[/\\textfrac\{1\}\{8\}/g,"\u215B"],[/\\textfrac\{3\}\{8\}/g,"\u215C"],[/\\textfrac\{5\}\{8\}/g,"\u215D"],[/\\textfrac\{7\}\{8\}/g,"\u215E"],[/\\leftarrow /g,"\u2190"],[/\\uparrow /g,"\u2191"],[/\\rightarrow /g,"\u2192"],[/\\downarrow /g,"\u2193"],[/\\leftrightarrow /g,"\u2194"],[/\\updownarrow /g,"\u2195"],[/\\nwarrow /g,"\u2196"],[/\\nearrow /g,"\u2197"],[/\\searrow /g,"\u2198"],[/\\swarrow /g,"\u2199"],[/\\nleftarrow /g,"\u219A"],[/\\nrightarrow /g,"\u219B"],[/\\arrowwaveright /g,"\u219C"],[/\\arrowwaveright /g,"\u219D"],[/\\twoheadleftarrow /g,"\u219E"],[/\\twoheadrightarrow /g,"\u21A0"],[/\\leftarrowtail /g,"\u21A2"],[/\\rightarrowtail /g,"\u21A3"],[/\\mapsto /g,"\u21A6"],[/\\hookleftarrow /g,"\u21A9"],[/\\hookrightarrow /g,"\u21AA"],[/\\looparrowleft /g,"\u21AB"],[/\\looparrowright /g,"\u21AC"],[/\\leftrightsquigarrow /g,"\u21AD"],[/\\nleftrightarrow /g,"\u21AE"],[/\\Lsh /g,"\u21B0"],[/\\Rsh /g,"\u21B1"],[/\\ElsevierGlyph\{21B3\}/g,"\u21B3"],[/\\curvearrowleft /g,"\u21B6"],[/\\curvearrowright /g,"\u21B7"],[/\\circlearrowleft /g,"\u21BA"],[/\\circlearrowright /g,"\u21BB"],[/\\leftharpoonup /g,"\u21BC"],[/\\leftharpoondown /g,"\u21BD"],[/\\upharpoonright /g,"\u21BE"],[/\\upharpoonleft /g,"\u21BF"],[/\\rightharpoonup /g,"\u21C0"],[/\\rightharpoondown /g,"\u21C1"],[/\\downharpoonright /g,"\u21C2"],[/\\downharpoonleft /g,"\u21C3"],[/\\rightleftarrows /g,"\u21C4"],[/\\dblarrowupdown /g,"\u21C5"],[/\\leftrightarrows /g,"\u21C6"],[/\\leftleftarrows /g,"\u21C7"],[/\\upuparrows /g,"\u21C8"],[/\\rightrightarrows /g,"\u21C9"],[/\\downdownarrows /g,"\u21CA"],[/\\leftrightharpoons /g,"\u21CB"],[/\\rightleftharpoons /g,"\u21CC"],[/\\nLeftarrow /g,"\u21CD"],[/\\nLeftrightarrow /g,"\u21CE"],[/\\nRightarrow /g,"\u21CF"],[/\\Leftarrow /g,"\u21D0"],[/\\Uparrow /g,"\u21D1"],[/\\Rightarrow /g,"\u21D2"],[/\\Downarrow /g,"\u21D3"],[/\\Leftrightarrow /g,"\u21D4"],[/\\Updownarrow /g,"\u21D5"],[/\\Lleftarrow /g,"\u21DA"],[/\\Rrightarrow /g,"\u21DB"],[/\\rightsquigarrow /g,"\u21DD"],[/\\DownArrowUpArrow /g,"\u21F5"],[/\\forall /g,"\u2200"],[/\\complement /g,"\u2201"],[/\\partial /g,"\u2202"],[/\\exists /g,"\u2203"],[/\\nexists /g,"\u2204"],[/\\varnothing /g,"\u2205"],[/\\nabla /g,"\u2207"],[/\\in /g,"\u2208"],[/\\not\\in /g,"\u2209"],[/\\ni /g,"\u220B"],[/\\not\\ni /g,"\u220C"],[/\\prod /g,"\u220F"],[/\\coprod /g,"\u2210"],[/\\sum /g,"\u2211"],[/\\mp /g,"\u2213"],[/\\dotplus /g,"\u2214"],[/\\setminus /g,"\u2216"],[/\\circ /g,"\u2218"],[/\\bullet /g,"\u2219"],[/\\surd /g,"\u221A"],[/\\propto /g,"\u221D"],[/\\infty /g,"\u221E"],[/\\rightangle /g,"\u221F"],[/\\angle /g,"\u2220"],[/\\measuredangle /g,"\u2221"],[/\\sphericalangle /g,"\u2222"],[/\\mid /g,"\u2223"],[/\\nmid /g,"\u2224"],[/\\parallel /g,"\u2225"],[/\\nparallel /g,"\u2226"],[/\\wedge /g,"\u2227"],[/\\vee /g,"\u2228"],[/\\cap /g,"\u2229"],[/\\cup /g,"\u222A"],[/\\int /g,"\u222B"],[/\\int\\!\\int /g,"\u222C"],[/\\int\\!\\int\\!\\int /g,"\u222D"],[/\\oint /g,"\u222E"],[/\\surfintegral /g,"\u222F"],[/\\volintegral /g,"\u2230"],[/\\clwintegral /g,"\u2231"],[/\\ElsevierGlyph\{2232\}/g,"\u2232"],[/\\ElsevierGlyph\{2233\}/g,"\u2233"],[/\\therefore /g,"\u2234"],[/\\because /g,"\u2235"],[/\\Colon /g,"\u2237"],[/\\ElsevierGlyph\{2238\}/g,"\u2238"],[/\\mathbin\{\{:\}\\!\\!\{\-\}\\!\\!\{:\}\}/g,"\u223A"],[/\\homothetic /g,"\u223B"],[/\\sim /g,"\u223C"],[/\\backsim /g,"\u223D"],[/\\lazysinv /g,"\u223E"],[/\\wr /g,"\u2240"],[/\\not\\sim /g,"\u2241"],[/\\ElsevierGlyph\{2242\}/g,"\u2242"],[/\\NotEqualTilde /g,"\u2242-00338"],[/\\simeq /g,"\u2243"],[/\\not\\simeq /g,"\u2244"],[/\\cong /g,"\u2245"],[/\\approxnotequal /g,"\u2246"],[/\\not\\cong /g,"\u2247"],[/\\approx /g,"\u2248"],[/\\not\\approx /g,"\u2249"],[/\\approxeq /g,"\u224A"],[/\\tildetrpl /g,"\u224B"],[/\\not\\apid /g,"\u224B-00338"],[/\\allequal /g,"\u224C"],[/\\asymp /g,"\u224D"],[/\\Bumpeq /g,"\u224E"],[/\\NotHumpDownHump /g,"\u224E-00338"],[/\\bumpeq /g,"\u224F"],[/\\NotHumpEqual /g,"\u224F-00338"],[/\\doteq /g,"\u2250"],[/\\not\\doteq/g,"\u2250-00338"],[/\\doteqdot /g,"\u2251"],[/\\fallingdotseq /g,"\u2252"],[/\\risingdotseq /g,"\u2253"],[/\\eqcirc /g,"\u2256"],[/\\circeq /g,"\u2257"],[/\\estimates /g,"\u2259"],[/\\ElsevierGlyph\{225A\}/g,"\u225A"],[/\\starequal /g,"\u225B"],[/\\triangleq /g,"\u225C"],[/\\ElsevierGlyph\{225F\}/g,"\u225F"],[/\\not =/g,"\u2260"],[/\\equiv /g,"\u2261"],[/\\not\\equiv /g,"\u2262"],[/\\leq /g,"\u2264"],[/\\geq /g,"\u2265"],[/\\leqq /g,"\u2266"],[/\\geqq /g,"\u2267"],[/\\lneqq /g,"\u2268"],[/\\lvertneqq /g,"\u2268-0FE00"],[/\\gneqq /g,"\u2269"],[/\\gvertneqq /g,"\u2269-0FE00"],[/\\ll /g,"\u226A"],[/\\NotLessLess /g,"\u226A-00338"],[/\\gg /g,"\u226B"],[/\\NotGreaterGreater /g,"\u226B-00338"],[/\\between /g,"\u226C"],[/\\not\\kern\-0.3em\\times /g,"\u226D"],[/\\not</g,"\u226E"],[/\\not>/g,"\u226F"],[/\\not\\leq /g,"\u2270"],[/\\not\\geq /g,"\u2271"],[/\\lessequivlnt /g,"\u2272"],[/\\greaterequivlnt /g,"\u2273"],[/\\ElsevierGlyph\{2274\}/g,"\u2274"],[/\\ElsevierGlyph\{2275\}/g,"\u2275"],[/\\lessgtr /g,"\u2276"],[/\\gtrless /g,"\u2277"],[/\\notlessgreater /g,"\u2278"],[/\\notgreaterless /g,"\u2279"],[/\\prec /g,"\u227A"],[/\\succ /g,"\u227B"],[/\\preccurlyeq /g,"\u227C"],[/\\succcurlyeq /g,"\u227D"],[/\\precapprox /g,"\u227E"],[/\\NotPrecedesTilde /g,"\u227E-00338"],[/\\succapprox /g,"\u227F"],[/\\NotSucceedsTilde /g,"\u227F-00338"],[/\\not\\prec /g,"\u2280"],[/\\not\\succ /g,"\u2281"],[/\\subset /g,"\u2282"],[/\\supset /g,"\u2283"],[/\\not\\subset /g,"\u2284"],[/\\not\\supset /g,"\u2285"],[/\\subseteq /g,"\u2286"],[/\\supseteq /g,"\u2287"],[/\\not\\subseteq /g,"\u2288"],[/\\not\\supseteq /g,"\u2289"],[/\\subsetneq /g,"\u228A"],[/\\varsubsetneqq /g,"\u228A-0FE00"],[/\\supsetneq /g,"\u228B"],[/\\varsupsetneq /g,"\u228B-0FE00"],[/\\uplus /g,"\u228E"],[/\\sqsubset /g,"\u228F"],[/\\NotSquareSubset /g,"\u228F-00338"],[/\\sqsupset /g,"\u2290"],[/\\NotSquareSuperset /g,"\u2290-00338"],[/\\sqsubseteq /g,"\u2291"],[/\\sqsupseteq /g,"\u2292"],[/\\sqcap /g,"\u2293"],[/\\sqcup /g,"\u2294"],[/\\oplus /g,"\u2295"],[/\\ominus /g,"\u2296"],[/\\otimes /g,"\u2297"],[/\\oslash /g,"\u2298"],[/\\odot /g,"\u2299"],[/\\circledcirc /g,"\u229A"],[/\\circledast /g,"\u229B"],[/\\circleddash /g,"\u229D"],[/\\boxplus /g,"\u229E"],[/\\boxminus /g,"\u229F"],[/\\boxtimes /g,"\u22A0"],[/\\boxdot /g,"\u22A1"],[/\\vdash /g,"\u22A2"],[/\\dashv /g,"\u22A3"],[/\\top /g,"\u22A4"],[/\\perp /g,"\u22A5"],[/\\truestate /g,"\u22A7"],[/\\forcesextra /g,"\u22A8"],[/\\Vdash /g,"\u22A9"],[/\\Vvdash /g,"\u22AA"],[/\\VDash /g,"\u22AB"],[/\\nvdash /g,"\u22AC"],[/\\nvDash /g,"\u22AD"],[/\\nVdash /g,"\u22AE"],[/\\nVDash /g,"\u22AF"],[/\\vartriangleleft /g,"\u22B2"],[/\\vartriangleright /g,"\u22B3"],[/\\trianglelefteq /g,"\u22B4"],[/\\trianglerighteq /g,"\u22B5"],[/\\original /g,"\u22B6"],[/\\image /g,"\u22B7"],[/\\multimap /g,"\u22B8"],[/\\hermitconjmatrix /g,"\u22B9"],[/\\intercal /g,"\u22BA"],[/\\veebar /g,"\u22BB"],[/\\rightanglearc /g,"\u22BE"],[/\\ElsevierGlyph\{22C0\}/g,"\u22C0"],[/\\ElsevierGlyph\{22C1\}/g,"\u22C1"],[/\\bigcap /g,"\u22C2"],[/\\bigcup /g,"\u22C3"],[/\\diamond /g,"\u22C4"],[/\\cdot /g,"\u22C5"],[/\\star /g,"\u22C6"],[/\\divideontimes /g,"\u22C7"],[/\\bowtie /g,"\u22C8"],[/\\ltimes /g,"\u22C9"],[/\\rtimes /g,"\u22CA"],[/\\leftthreetimes /g,"\u22CB"],[/\\rightthreetimes /g,"\u22CC"],[/\\backsimeq /g,"\u22CD"],[/\\curlyvee /g,"\u22CE"],[/\\curlywedge /g,"\u22CF"],[/\\Subset /g,"\u22D0"],[/\\Supset /g,"\u22D1"],[/\\Cap /g,"\u22D2"],[/\\Cup /g,"\u22D3"],[/\\pitchfork /g,"\u22D4"],[/\\lessdot /g,"\u22D6"],[/\\gtrdot /g,"\u22D7"],[/\\verymuchless /g,"\u22D8"],[/\\verymuchgreater /g,"\u22D9"],[/\\lesseqgtr /g,"\u22DA"],[/\\gtreqless /g,"\u22DB"],[/\\curlyeqprec /g,"\u22DE"],[/\\curlyeqsucc /g,"\u22DF"],[/\\not\\sqsubseteq /g,"\u22E2"],[/\\not\\sqsupseteq /g,"\u22E3"],[/\\Elzsqspne /g,"\u22E5"],[/\\lnsim /g,"\u22E6"],[/\\gnsim /g,"\u22E7"],[/\\precedesnotsimilar /g,"\u22E8"],[/\\succnsim /g,"\u22E9"],[/\\ntriangleleft /g,"\u22EA"],[/\\ntriangleright /g,"\u22EB"],[/\\ntrianglelefteq /g,"\u22EC"],[/\\ntrianglerighteq /g,"\u22ED"],[/\\vdots /g,"\u22EE"],[/\\cdots /g,"\u22EF"],[/\\upslopeellipsis /g,"\u22F0"],[/\\downslopeellipsis /g,"\u22F1"],[/\\barwedge /g,"\u2305"],[/\\perspcorrespond /g,"\u2306"],[/\\lceil /g,"\u2308"],[/\\rceil /g,"\u2309"],[/\\lfloor /g,"\u230A"],[/\\rfloor /g,"\u230B"],[/\\recorder /g,"\u2315"],[/\\mathchar"2208/g,"\u2316"],[/\\ulcorner /g,"\u231C"],[/\\urcorner /g,"\u231D"],[/\\llcorner /g,"\u231E"],[/\\lrcorner /g,"\u231F"],[/\\frown /g,"\u2322"],[/\\smile /g,"\u2323"],[/\\langle /g,"\u2329"],[/\\rangle /g,"\u232A"],[/\\ElsevierGlyph\{E838\}/g,"\u233D"],[/\\Elzdlcorn /g,"\u23A3"],[/\\lmoustache /g,"\u23B0"],[/\\rmoustache /g,"\u23B1"],[/\\textvisiblespace /g,"\u2423"],[/\\ding\{172\}/g,"\u2460"],[/\\ding\{173\}/g,"\u2461"],[/\\ding\{174\}/g,"\u2462"],[/\\ding\{175\}/g,"\u2463"],[/\\ding\{176\}/g,"\u2464"],[/\\ding\{177\}/g,"\u2465"],[/\\ding\{178\}/g,"\u2466"],[/\\ding\{179\}/g,"\u2467"],[/\\ding\{180\}/g,"\u2468"],[/\\ding\{181\}/g,"\u2469"],[/\\circledS /g,"\u24C8"],[/\\Elzdshfnc /g,"\u2506"],[/\\Elzsqfnw /g,"\u2519"],[/\\diagup /g,"\u2571"],[/\\ding\{110\}/g,"\u25A0"],[/\\square /g,"\u25A1"],[/\\blacksquare /g,"\u25AA"],[/\\fbox\{~~\}/g,"\u25AD"],[/\\Elzvrecto /g,"\u25AF"],[/\\ElsevierGlyph\{E381\}/g,"\u25B1"],[/\\ding\{115\}/g,"\u25B2"],[/\\bigtriangleup /g,"\u25B3"],[/\\blacktriangle /g,"\u25B4"],[/\\vartriangle /g,"\u25B5"],[/\\blacktriangleright /g,"\u25B8"],[/\\triangleright /g,"\u25B9"],[/\\ding\{116\}/g,"\u25BC"],[/\\bigtriangledown /g,"\u25BD"],[/\\blacktriangledown /g,"\u25BE"],[/\\triangledown /g,"\u25BF"],[/\\blacktriangleleft /g,"\u25C2"],[/\\triangleleft /g,"\u25C3"],[/\\ding\{117\}/g,"\u25C6"],[/\\lozenge /g,"\u25CA"],[/\\bigcirc /g,"\u25CB"],[/\\ding\{108\}/g,"\u25CF"],[/\\Elzcirfl /g,"\u25D0"],[/\\Elzcirfr /g,"\u25D1"],[/\\Elzcirfb /g,"\u25D2"],[/\\ding\{119\}/g,"\u25D7"],[/\\Elzrvbull /g,"\u25D8"],[/\\Elzsqfl /g,"\u25E7"],[/\\Elzsqfr /g,"\u25E8"],[/\\Elzsqfse /g,"\u25EA"],[/\\bigcirc /g,"\u25EF"],[/\\ding\{72\}/g,"\u2605"],[/\\ding\{73\}/g,"\u2606"],[/\\ding\{37\}/g,"\u260E"],[/\\ding\{42\}/g,"\u261B"],[/\\ding\{43\}/g,"\u261E"],[/\\rightmoon /g,"\u263E"],[/\\mercury /g,"\u263F"],[/\\venus /g,"\u2640"],[/\\male /g,"\u2642"],[/\\jupiter /g,"\u2643"],[/\\saturn /g,"\u2644"],[/\\uranus /g,"\u2645"],[/\\neptune /g,"\u2646"],[/\\pluto /g,"\u2647"],[/\\aries /g,"\u2648"],[/\\taurus /g,"\u2649"],[/\\gemini /g,"\u264A"],[/\\cancer /g,"\u264B"],[/\\leo /g,"\u264C"],[/\\virgo /g,"\u264D"],[/\\libra /g,"\u264E"],[/\\scorpio /g,"\u264F"],[/\\sagittarius /g,"\u2650"],[/\\capricornus /g,"\u2651"],[/\\aquarius /g,"\u2652"],[/\\pisces /g,"\u2653"],[/\\ding\{171\}/g,"\u2660"],[/\\diamond /g,"\u2662"],[/\\ding\{168\}/g,"\u2663"],[/\\ding\{170\}/g,"\u2665"],[/\\ding\{169\}/g,"\u2666"],[/\\quarternote /g,"\u2669"],[/\\eighthnote /g,"\u266A"],[/\\flat /g,"\u266D"],[/\\natural /g,"\u266E"],[/\\sharp /g,"\u266F"],[/\\ding\{33\}/g,"\u2701"],[/\\ding\{34\}/g,"\u2702"],[/\\ding\{35\}/g,"\u2703"],[/\\ding\{36\}/g,"\u2704"],[/\\ding\{38\}/g,"\u2706"],[/\\ding\{39\}/g,"\u2707"],[/\\ding\{40\}/g,"\u2708"],[/\\ding\{41\}/g,"\u2709"],[/\\ding\{44\}/g,"\u270C"],[/\\ding\{45\}/g,"\u270D"],[/\\ding\{46\}/g,"\u270E"],[/\\ding\{47\}/g,"\u270F"],[/\\ding\{48\}/g,"\u2710"],[/\\ding\{49\}/g,"\u2711"],[/\\ding\{50\}/g,"\u2712"],[/\\ding\{51\}/g,"\u2713"],[/\\ding\{52\}/g,"\u2714"],[/\\ding\{53\}/g,"\u2715"],[/\\ding\{54\}/g,"\u2716"],[/\\ding\{55\}/g,"\u2717"],[/\\ding\{56\}/g,"\u2718"],[/\\ding\{57\}/g,"\u2719"],[/\\ding\{58\}/g,"\u271A"],[/\\ding\{59\}/g,"\u271B"],[/\\ding\{60\}/g,"\u271C"],[/\\ding\{61\}/g,"\u271D"],[/\\ding\{62\}/g,"\u271E"],[/\\ding\{63\}/g,"\u271F"],[/\\ding\{64\}/g,"\u2720"],[/\\ding\{65\}/g,"\u2721"],[/\\ding\{66\}/g,"\u2722"],[/\\ding\{67\}/g,"\u2723"],[/\\ding\{68\}/g,"\u2724"],[/\\ding\{69\}/g,"\u2725"],[/\\ding\{70\}/g,"\u2726"],[/\\ding\{71\}/g,"\u2727"],[/\\ding\{73\}/g,"\u2729"],[/\\ding\{74\}/g,"\u272A"],[/\\ding\{75\}/g,"\u272B"],[/\\ding\{76\}/g,"\u272C"],[/\\ding\{77\}/g,"\u272D"],[/\\ding\{78\}/g,"\u272E"],[/\\ding\{79\}/g,"\u272F"],[/\\ding\{80\}/g,"\u2730"],[/\\ding\{81\}/g,"\u2731"],[/\\ding\{82\}/g,"\u2732"],[/\\ding\{83\}/g,"\u2733"],[/\\ding\{84\}/g,"\u2734"],[/\\ding\{85\}/g,"\u2735"],[/\\ding\{86\}/g,"\u2736"],[/\\ding\{87\}/g,"\u2737"],[/\\ding\{88\}/g,"\u2738"],[/\\ding\{89\}/g,"\u2739"],[/\\ding\{90\}/g,"\u273A"],[/\\ding\{91\}/g,"\u273B"],[/\\ding\{92\}/g,"\u273C"],[/\\ding\{93\}/g,"\u273D"],[/\\ding\{94\}/g,"\u273E"],[/\\ding\{95\}/g,"\u273F"],[/\\ding\{96\}/g,"\u2740"],[/\\ding\{97\}/g,"\u2741"],[/\\ding\{98\}/g,"\u2742"],[/\\ding\{99\}/g,"\u2743"],[/\\ding\{100\}/g,"\u2744"],[/\\ding\{101\}/g,"\u2745"],[/\\ding\{102\}/g,"\u2746"],[/\\ding\{103\}/g,"\u2747"],[/\\ding\{104\}/g,"\u2748"],[/\\ding\{105\}/g,"\u2749"],[/\\ding\{106\}/g,"\u274A"],[/\\ding\{107\}/g,"\u274B"],[/\\ding\{109\}/g,"\u274D"],[/\\ding\{111\}/g,"\u274F"],[/\\ding\{112\}/g,"\u2750"],[/\\ding\{113\}/g,"\u2751"],[/\\ding\{114\}/g,"\u2752"],[/\\ding\{118\}/g,"\u2756"],[/\\ding\{120\}/g,"\u2758"],[/\\ding\{121\}/g,"\u2759"],[/\\ding\{122\}/g,"\u275A"],[/\\ding\{123\}/g,"\u275B"],[/\\ding\{124\}/g,"\u275C"],[/\\ding\{125\}/g,"\u275D"],[/\\ding\{126\}/g,"\u275E"],[/\\ding\{161\}/g,"\u2761"],[/\\ding\{162\}/g,"\u2762"],[/\\ding\{163\}/g,"\u2763"],[/\\ding\{164\}/g,"\u2764"],[/\\ding\{165\}/g,"\u2765"],[/\\ding\{166\}/g,"\u2766"],[/\\ding\{167\}/g,"\u2767"],[/\\ding\{182\}/g,"\u2776"],[/\\ding\{183\}/g,"\u2777"],[/\\ding\{184\}/g,"\u2778"],[/\\ding\{185\}/g,"\u2779"],[/\\ding\{186\}/g,"\u277A"],[/\\ding\{187\}/g,"\u277B"],[/\\ding\{188\}/g,"\u277C"],[/\\ding\{189\}/g,"\u277D"],[/\\ding\{190\}/g,"\u277E"],[/\\ding\{191\}/g,"\u277F"],[/\\ding\{192\}/g,"\u2780"],[/\\ding\{193\}/g,"\u2781"],[/\\ding\{194\}/g,"\u2782"],[/\\ding\{195\}/g,"\u2783"],[/\\ding\{196\}/g,"\u2784"],[/\\ding\{197\}/g,"\u2785"],[/\\ding\{198\}/g,"\u2786"],[/\\ding\{199\}/g,"\u2787"],[/\\ding\{200\}/g,"\u2788"],[/\\ding\{201\}/g,"\u2789"],[/\\ding\{202\}/g,"\u278A"],[/\\ding\{203\}/g,"\u278B"],[/\\ding\{204\}/g,"\u278C"],[/\\ding\{205\}/g,"\u278D"],[/\\ding\{206\}/g,"\u278E"],[/\\ding\{207\}/g,"\u278F"],[/\\ding\{208\}/g,"\u2790"],[/\\ding\{209\}/g,"\u2791"],[/\\ding\{210\}/g,"\u2792"],[/\\ding\{211\}/g,"\u2793"],[/\\ding\{212\}/g,"\u2794"],[/\\ding\{216\}/g,"\u2798"],[/\\ding\{217\}/g,"\u2799"],[/\\ding\{218\}/g,"\u279A"],[/\\ding\{219\}/g,"\u279B"],[/\\ding\{220\}/g,"\u279C"],[/\\ding\{221\}/g,"\u279D"],[/\\ding\{222\}/g,"\u279E"],[/\\ding\{223\}/g,"\u279F"],[/\\ding\{224\}/g,"\u27A0"],[/\\ding\{225\}/g,"\u27A1"],[/\\ding\{226\}/g,"\u27A2"],[/\\ding\{227\}/g,"\u27A3"],[/\\ding\{228\}/g,"\u27A4"],[/\\ding\{229\}/g,"\u27A5"],[/\\ding\{230\}/g,"\u27A6"],[/\\ding\{231\}/g,"\u27A7"],[/\\ding\{232\}/g,"\u27A8"],[/\\ding\{233\}/g,"\u27A9"],[/\\ding\{234\}/g,"\u27AA"],[/\\ding\{235\}/g,"\u27AB"],[/\\ding\{236\}/g,"\u27AC"],[/\\ding\{237\}/g,"\u27AD"],[/\\ding\{238\}/g,"\u27AE"],[/\\ding\{239\}/g,"\u27AF"],[/\\ding\{241\}/g,"\u27B1"],[/\\ding\{242\}/g,"\u27B2"],[/\\ding\{243\}/g,"\u27B3"],[/\\ding\{244\}/g,"\u27B4"],[/\\ding\{245\}/g,"\u27B5"],[/\\ding\{246\}/g,"\u27B6"],[/\\ding\{247\}/g,"\u27B7"],[/\\ding\{248\}/g,"\u27B8"],[/\\ding\{249\}/g,"\u27B9"],[/\\ding\{250\}/g,"\u27BA"],[/\\ding\{251\}/g,"\u27BB"],[/\\ding\{252\}/g,"\u27BC"],[/\\ding\{253\}/g,"\u27BD"],[/\\ding\{254\}/g,"\u27BE"],[/\\longleftarrow /g,"\u27F5"],[/\\longrightarrow /g,"\u27F6"],[/\\longleftrightarrow /g,"\u27F7"],[/\\Longleftarrow /g,"\u27F8"],[/\\Longrightarrow /g,"\u27F9"],[/\\Longleftrightarrow /g,"\u27FA"],[/\\longmapsto /g,"\u27FC"],[/\\sim\\joinrel\\leadsto/g,"\u27FF"],[/\\ElsevierGlyph\{E212\}/g,"\u2905"],[/\\UpArrowBar /g,"\u2912"],[/\\DownArrowBar /g,"\u2913"],[/\\ElsevierGlyph\{E20C\}/g,"\u2923"],[/\\ElsevierGlyph\{E20D\}/g,"\u2924"],[/\\ElsevierGlyph\{E20B\}/g,"\u2925"],[/\\ElsevierGlyph\{E20A\}/g,"\u2926"],[/\\ElsevierGlyph\{E211\}/g,"\u2927"],[/\\ElsevierGlyph\{E20E\}/g,"\u2928"],[/\\ElsevierGlyph\{E20F\}/g,"\u2929"],[/\\ElsevierGlyph\{E210\}/g,"\u292A"],[/\\ElsevierGlyph\{E21C\}/g,"\u2933"],[/\\ElsevierGlyph\{E21D\}/g,"\u2933-00338"],[/\\ElsevierGlyph\{E21A\}/g,"\u2936"],[/\\ElsevierGlyph\{E219\}/g,"\u2937"],[/\\Elolarr /g,"\u2940"],[/\\Elorarr /g,"\u2941"],[/\\ElzRlarr /g,"\u2942"],[/\\ElzrLarr /g,"\u2944"],[/\\Elzrarrx /g,"\u2947"],[/\\LeftRightVector /g,"\u294E"],[/\\RightUpDownVector /g,"\u294F"],[/\\DownLeftRightVector /g,"\u2950"],[/\\LeftUpDownVector /g,"\u2951"],[/\\LeftVectorBar /g,"\u2952"],[/\\RightVectorBar /g,"\u2953"],[/\\RightUpVectorBar /g,"\u2954"],[/\\RightDownVectorBar /g,"\u2955"],[/\\DownLeftVectorBar /g,"\u2956"],[/\\DownRightVectorBar /g,"\u2957"],[/\\LeftUpVectorBar /g,"\u2958"],[/\\LeftDownVectorBar /g,"\u2959"],[/\\LeftTeeVector /g,"\u295A"],[/\\RightTeeVector /g,"\u295B"],[/\\RightUpTeeVector /g,"\u295C"],[/\\RightDownTeeVector /g,"\u295D"],[/\\DownLeftTeeVector /g,"\u295E"],[/\\DownRightTeeVector /g,"\u295F"],[/\\LeftUpTeeVector /g,"\u2960"],[/\\LeftDownTeeVector /g,"\u2961"],[/\\UpEquilibrium /g,"\u296E"],[/\\ReverseUpEquilibrium /g,"\u296F"],[/\\RoundImplies /g,"\u2970"],[/\\ElsevierGlyph\{E214\}/g,"\u297C"],[/\\ElsevierGlyph\{E215\}/g,"\u297D"],[/\\Elztfnc /g,"\u2980"],[/\\ElsevierGlyph\{3018\}/g,"\u2985"],[/\\Elroang /g,"\u2986"],[/\\ElsevierGlyph\{E291\}/g,"\u2994"],[/\\Elzddfnc /g,"\u2999"],[/\\Angle /g,"\u299C"],[/\\Elzlpargt /g,"\u29A0"],[/\\ElsevierGlyph\{E260\}/g,"\u29B5"],[/\\ElsevierGlyph\{E61B\}/g,"\u29B6"],[/\\ElzLap /g,"\u29CA"],[/\\Elzdefas /g,"\u29CB"],[/\\LeftTriangleBar /g,"\u29CF"],[/\\NotLeftTriangleBar /g,"\u29CF-00338"],[/\\RightTriangleBar /g,"\u29D0"],[/\\NotRightTriangleBar /g,"\u29D0-00338"],[/\\ElsevierGlyph\{E372\}/g,"\u29DC"],[/\\blacklozenge /g,"\u29EB"],[/\\RuleDelayed /g,"\u29F4"],[/\\Elxuplus /g,"\u2A04"],[/\\ElzThr /g,"\u2A05"],[/\\Elxsqcup /g,"\u2A06"],[/\\ElzInf /g,"\u2A07"],[/\\ElzSup /g,"\u2A08"],[/\\ElzCint /g,"\u2A0D"],[/\\clockoint /g,"\u2A0F"],[/\\ElsevierGlyph\{E395\}/g,"\u2A10"],[/\\sqrint /g,"\u2A16"],[/\\ElsevierGlyph\{E25A\}/g,"\u2A25"],[/\\ElsevierGlyph\{E25B\}/g,"\u2A2A"],[/\\ElsevierGlyph\{E25C\}/g,"\u2A2D"],[/\\ElsevierGlyph\{E25D\}/g,"\u2A2E"],[/\\ElzTimes /g,"\u2A2F"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A34"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A35"],[/\\ElsevierGlyph\{E259\}/g,"\u2A3C"],[/\\amalg /g,"\u2A3F"],[/\\ElzAnd /g,"\u2A53"],[/\\ElzOr /g,"\u2A54"],[/\\ElsevierGlyph\{E36E\}/g,"\u2A55"],[/\\ElOr /g,"\u2A56"],[/\\perspcorrespond /g,"\u2A5E"],[/\\Elzminhat /g,"\u2A5F"],[/\\ElsevierGlyph\{225A\}/g,"\u2A63"],[/\\stackrel\{*\}\{=\}/g,"\u2A6E"],[/\\Equal /g,"\u2A75"],[/\\leqslant /g,"\u2A7D"],[/\\nleqslant /g,"\u2A7D-00338"],[/\\geqslant /g,"\u2A7E"],[/\\ngeqslant /g,"\u2A7E-00338"],[/\\lessapprox /g,"\u2A85"],[/\\gtrapprox /g,"\u2A86"],[/\\lneq /g,"\u2A87"],[/\\gneq /g,"\u2A88"],[/\\lnapprox /g,"\u2A89"],[/\\gnapprox /g,"\u2A8A"],[/\\lesseqqgtr /g,"\u2A8B"],[/\\gtreqqless /g,"\u2A8C"],[/\\eqslantless /g,"\u2A95"],[/\\eqslantgtr /g,"\u2A96"],[/\\Pisymbol\{ppi020\}\{117\}/g,"\u2A9D"],[/\\Pisymbol\{ppi020\}\{105\}/g,"\u2A9E"],[/\\NestedLessLess /g,"\u2AA1"],[/\\NotNestedLessLess /g,"\u2AA1-00338"],[/\\NestedGreaterGreater /g,"\u2AA2"],[/\\NotNestedGreaterGreater /g,"\u2AA2-00338"],[/\\preceq /g,"\u2AAF"],[/\\not\\preceq /g,"\u2AAF-00338"],[/\\succeq /g,"\u2AB0"],[/\\not\\succeq /g,"\u2AB0-00338"],[/\\precneqq /g,"\u2AB5"],[/\\succneqq /g,"\u2AB6"],[/\\precapprox /g,"\u2AB7"],[/\\succapprox /g,"\u2AB8"],[/\\precnapprox /g,"\u2AB9"],[/\\succnapprox /g,"\u2ABA"],[/\\subseteqq /g,"\u2AC5"],[/\\nsubseteqq /g,"\u2AC5-00338"],[/\\supseteqq /g,"\u2AC6"],[/\\nsupseteqq/g,"\u2AC6-00338"],[/\\subsetneqq /g,"\u2ACB"],[/\\supsetneqq /g,"\u2ACC"],[/\\ElsevierGlyph\{E30D\}/g,"\u2AEB"],[/\\Elztdcol /g,"\u2AF6"],[/\\ElsevierGlyph\{300A\}/g,"\u300A"],[/\\ElsevierGlyph\{300B\}/g,"\u300B"],[/\\ElsevierGlyph\{3018\}/g,"\u3018"],[/\\ElsevierGlyph\{3019\}/g,"\u3019"],[/\\openbracketleft /g,"\u301A"],[/\\openbracketright /g,"\u301B"]];return this}if(typeof module!=="undefined"&&module.exports){module.exports=BibtexParser};
\ No newline at end of file
diff -r ee8efcfd787f93c77eb4e451084d64ce4dc6b85e -r 990bc0688199410ab08d5e8a418770b516c6f4e2 static/scripts/packed/mvc/citation/citation-model.js
--- a/static/scripts/packed/mvc/citation/citation-model.js
+++ b/static/scripts/packed/mvc/citation/citation-model.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","utils/localization"],function(a,e){var f=Backbone.Model.extend(a.LoggableMixin).extend({initialize:function(){var g=this.attributes.content;var h=new BibtexParser(g).entries[0];this.entry=h},entryType:function(){return this.entry.EntryType},fields:function(){return this.entry.Fields}});var b=Backbone.Collection.extend(a.LoggableMixin).extend({urlRoot:galaxy_config.root+"api",partial:true,model:f,});var d=b.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}});var c=b.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"},partial:false,});return{Citation:f,HistoryCitationCollection:d,ToolCitationCollection:c}});
\ No newline at end of file
+define(["mvc/base-mvc","utils/localization"],function(a,e){var f=Backbone.Model.extend(a.LoggableMixin).extend({initialize:function(){var g=this.attributes.content;var i=new BibtexParser(g).entries[0];this.entry=i;this._fields={};var k=i.Fields;for(key in k){var j=k[key];var h=key.toLowerCase();this._fields[h]=j}},entryType:function(){return this.entry.EntryType},fields:function(){return this._fields}});var b=Backbone.Collection.extend(a.LoggableMixin).extend({urlRoot:galaxy_config.root+"api",partial:true,model:f,});var d=b.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}});var c=b.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"},partial:false,});return{Citation:f,HistoryCitationCollection:d,ToolCitationCollection:c}});
\ No newline at end of file
diff -r ee8efcfd787f93c77eb4e451084d64ce4dc6b85e -r 990bc0688199410ab08d5e8a418770b516c6f4e2 static/scripts/packed/mvc/citation/citation-view.js
--- a/static/scripts/packed/mvc/citation/citation-view.js
+++ b/static/scripts/packed/mvc/citation/citation-view.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return(f&&f.trim())?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
+define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.doi){l="http://dx.doi.org/"+k.doi;g+='[<a href="'+l+'">doi:'+k.doi+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return(f&&f.trim())?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
https://bitbucket.org/galaxy/galaxy-central/commits/103697ebdd33/
Changeset: 103697ebdd33
User: jmchilton
Date: 2014-08-07 15:36:41
Summary: Merge next-stable.
Affected #: 7 files
diff -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 -r 103697ebdd339377424063fba0459cb3cc2b707c lib/galaxy/managers/citations.py
--- a/lib/galaxy/managers/citations.py
+++ b/lib/galaxy/managers/citations.py
@@ -49,7 +49,7 @@
def _raw_get_bibtex( self, doi ):
dx_url = "http://dx.doi.org/" + doi
- headers = {'Accept': "text/bibliography; style=bibtex" }
+ headers = {'Accept': 'text/bibliography; style=bibtex, application/x-bibtex'}
req = urllib2.Request(dx_url, data="", headers=headers)
response = urllib2.urlopen(req)
bibtex = response.read()
diff -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 -r 103697ebdd339377424063fba0459cb3cc2b707c static/scripts/libs/bibtex.js
--- a/static/scripts/libs/bibtex.js
+++ b/static/scripts/libs/bibtex.js
@@ -93,6 +93,7 @@
'booklet' : 14,
'masterthesis' : 15,
'conference' : 16
+ ,'data' : 999 // Galaxy MOD: Handle @data citations coming from figshare.
}
/** @private */ this.MACROS_ = {
'jan' : 'January',
diff -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 -r 103697ebdd339377424063fba0459cb3cc2b707c static/scripts/mvc/citation/citation-model.js
--- a/static/scripts/mvc/citation/citation-model.js
+++ b/static/scripts/mvc/citation/citation-model.js
@@ -18,12 +18,19 @@
var bibtex = this.attributes.content;
var entry = new BibtexParser(bibtex).entries[0];
this.entry = entry;
+ this._fields = {};
+ var rawFields = entry.Fields;
+ for(key in rawFields) {
+ var value = rawFields[ key ];
+ var lowerKey = key.toLowerCase();
+ this._fields[ lowerKey ] = value;
+ }
},
entryType: function() {
return this.entry.EntryType;
},
fields: function() {
- return this.entry.Fields;
+ return this._fields;
}
} );
diff -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 -r 103697ebdd339377424063fba0459cb3cc2b707c static/scripts/mvc/citation/citation-view.js
--- a/static/scripts/mvc/citation/citation-view.js
+++ b/static/scripts/mvc/citation/citation-view.js
@@ -55,9 +55,9 @@
this._asSentence(fields.note);
}
var doiUrl = "";
- if( fields.DOI ) {
- doiUrl = 'http://dx.doi.org/' + fields.DOI;
- ref += '[<a href="' + doiUrl + '">doi:' + fields.DOI + "</a>]";
+ if( fields.doi ) {
+ doiUrl = 'http://dx.doi.org/' + fields.doi;
+ ref += '[<a href="' + doiUrl + '">doi:' + fields.doi + "</a>]";
}
var url = fields.url || doiUrl;
if( url ) {
diff -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 -r 103697ebdd339377424063fba0459cb3cc2b707c static/scripts/packed/libs/bibtex.js
--- a/static/scripts/packed/libs/bibtex.js
+++ b/static/scripts/packed/libs/bibtex.js
@@ -1,1 +1,1 @@
-function BibtexParser(c){if(typeof c=="string"){var d={};var a=[];function b(f){a.push(f)}var e=BibtexParser.call(d,b);e.parse(c);return{entries:a,errors:e.getErrors()}}if(typeof c!="function"){throw"Invalid parser construction."}this.STATES_={ENTRY_OR_JUNK:0,OBJECT_TYPE:1,ENTRY_KEY:2,KV_KEY:3,EQUALS:4,KV_VALUE:5};this.DATA_={};this.CALLBACK_=c;this.CHAR_=0;this.LINE_=1;this.CHAR_IN_LINE_=0;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={};this.SKIPTILLEOL_=false;this.VALBRACES_=null;this.BRACETYPE_=null;this.BRACECOUNT_=0;this.STATE_=this.STATES_.ENTRY_OR_JUNK;this.ERRORS_=[];this.ENTRY_TYPES_={inproceedings:1,proceedings:2,article:3,techreport:4,misc:5,mastersthesis:6,book:7,phdthesis:8,incollection:9,unpublished:10,inbook:11,manual:12,periodical:13,booklet:14,masterthesis:15,conference:16};this.MACROS_={jan:"January",feb:"February",mar:"March",apr:"April",may:"May",jun:"June",jul:"July",aug:"August",sep:"September",oct:"October",nov:"November",dec:"December",Jan:"January",Feb:"February",Mar:"March",Apr:"April",May:"May",Jun:"June",Jul:"July",Aug:"August",Sep:"September",Oct:"October",Nov:"November",Dec:"December"};this.getErrors=function(){return this.ERRORS_};this.parse=function(f){for(var g=0;g<f.length;g++){this.processCharacter_(f[g])}};this.error_=function(f){this.ERRORS_.push([this.LINE_,this.CHAR_IN_LINE_,this.CHAR_,f])};this.processEntry_=function(){var h=this.DATA_;if(h.Fields){for(var k in h.Fields){var p=h.Fields[k];for(var j=0;j<this.CHARCONV_.length;j++){var q=this.CHARCONV_[j][0];var n=this.CHARCONV_[j][1];p=p.replace(q,n)}p=p.replace(/[\n\r\t]/g," ").replace(/\s\s+/g," ").replace(/^\s+|\s+$/g,"");var l=p.length;var g="";for(var j=0;j<l;j++){var m=p[j];var o=false;if(m=="\\"&&j<l-1){m=p[++j]}else{if(m=="{"||m=="}"){o=true}}if(!o){g+=m}}h.Fields[k]=g}}if(h.ObjectType=="string"){for(var k in h.Fields){this.MACROS_[k]=h.Fields[k]}}else{this.CALLBACK_(h)}};this.processCharacter_=function(l){this.CHAR_++;this.CHAR_IN_LINE_++;if(l=="\n"){this.LINE_++;this.CHAR_IN_LINE_=1}if(this.SKIPTILLEOL_){if(l=="\n"){this.SKIPTILLEOL_=false}return}if(this.SKIPCOMMENT_&&l=="%"){this.SKIPTILLEOL_=true;return}if(this.SKIPWS_&&/\s/.test(l)){return}this.SKIPWS_=false;this.SKIPCOMMENT_=false;this.SKIPTILLEOL_=false;var f=true;while(f){f=false;switch(this.STATE_){case this.STATES_.ENTRY_OR_JUNK:if(l=="@"){this.STATE_=this.STATES_.OBJECT_TYPE;this.DATA_={ObjectType:""}}this.BRACETYPE_=null;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break;case this.STATES_.OBJECT_TYPE:if(/[A-Za-z]/.test(l)){this.DATA_.ObjectType+=l.toLowerCase();this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{var i=this.DATA_.ObjectType;if(i=="comment"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i=="string"){this.DATA_.ObjectType=i;this.DATA_.Fields={};this.BRACETYPE_=l;this.BRACECOUNT_=1;this.STATE_=this.STATES_.KV_KEY;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={Key:""}}else{if(i=="preamble"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i in this.ENTRY_TYPES_){this.DATA_.ObjectType="entry";this.DATA_.EntryType=i;this.DATA_.EntryKey="";this.STATE_=this.STATES_.ENTRY_KEY;f=true}else{this.error_('Unrecognized object type: "'+this.DATA_.ObjectType+'"');this.STATE_=this.STATES_.ENTRY_OR_JUNK}}}}}break;case this.STATES_.ENTRY_KEY:if((l==="{"||l==="(")&&this.BRACETYPE_==null){this.BRACETYPE_=l;this.BRACECOUNT_=1;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break}if(/[,%\s]/.test(l)){if(this.DATA_.EntryKey.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{if(this.BRACETYPE_==null){this.error_("No opening brace for object.");this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;f=true;this.STATE_=this.STATES_.KV_KEY;this.PARSETMP_.Key="";this.DATA_.Fields={}}}}else{this.DATA_.EntryKey+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}break;case this.STATES_.KV_KEY:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(/[\-A-Za-z:]/.test(l)){this.PARSETMP_.Key+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{if(this.PARSETMP_.Key.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.EQUALS;f=true}}break;case this.STATES_.EQUALS:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.error_('Key-value pair has key "'+this.PARSETMP_.Key+'", but no value.');this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(l=="="){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_VALUE;this.PARSETMP_.Value="";this.VALBRACES_={'"':[],"{":[]}}break;case this.STATES_.KV_VALUE:var k=this.VALBRACES_;var j=this.PARSETMP_.Value;var h=false;if(l=='"'||l=="{"||l=="}"||l==","){if(l==","){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}h=true}}if(l=='"'){if(0===k['"'].length+k["{"].length){k['"'].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false;break}if(k['"'].length==1&&k["{"].length==0&&(j.length==0||j[j.length-1]!="\\")){h=true}else{}}if(l=="{"){if(j.length==0||j[j.length-1]!="\\"){k["{"].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{}}if(l=="}"){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}f=true;h=true}else{if(j.length==0||j[j.length-1]!="\\"){if(k["{"].length>0){k["{"].splice(k["{"].length-1,1);if(0==k["{"].length+k['"'].length){h=true}else{}}}else{}}}}if(h){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_KEY;this.DATA_.Fields[this.PARSETMP_.Key]=this.PARSETMP_.Value;this.PARSETMP_={Key:""};this.VALBRACES_=null}else{this.PARSETMP_.Value+=l}break}}};this.CHARCONV_=[[/\\space /g,"\u0020"],[/\\textdollar /g,"\u0024"],[/\\textquotesingle /g,"\u0027"],[/\\ast /g,"\u002A"],[/\\textbackslash /g,"\u005C"],[/\\\^\{\}/g,"\u005E"],[/\\textasciigrave /g,"\u0060"],[/\\lbrace /g,"\u007B"],[/\\vert /g,"\u007C"],[/\\rbrace /g,"\u007D"],[/\\textasciitilde /g,"\u007E"],[/\\textexclamdown /g,"\u00A1"],[/\\textcent /g,"\u00A2"],[/\\textsterling /g,"\u00A3"],[/\\textcurrency /g,"\u00A4"],[/\\textyen /g,"\u00A5"],[/\\textbrokenbar /g,"\u00A6"],[/\\textsection /g,"\u00A7"],[/\\textasciidieresis /g,"\u00A8"],[/\\textcopyright /g,"\u00A9"],[/\\textordfeminine /g,"\u00AA"],[/\\guillemotleft /g,"\u00AB"],[/\\lnot /g,"\u00AC"],[/\\textregistered /g,"\u00AE"],[/\\textasciimacron /g,"\u00AF"],[/\\textdegree /g,"\u00B0"],[/\\pm /g,"\u00B1"],[/\\textasciiacute /g,"\u00B4"],[/\\mathrm\{\\mu\}/g,"\u00B5"],[/\\textparagraph /g,"\u00B6"],[/\\cdot /g,"\u00B7"],[/\\c\{\}/g,"\u00B8"],[/\\textordmasculine /g,"\u00BA"],[/\\guillemotright /g,"\u00BB"],[/\\textonequarter /g,"\u00BC"],[/\\textonehalf /g,"\u00BD"],[/\\textthreequarters /g,"\u00BE"],[/\\textquestiondown /g,"\u00BF"],[/\\`\{A\}/g,"\u00C0"],[/\\'\{A\}/g,"\u00C1"],[/\\\^\{A\}/g,"\u00C2"],[/\\~\{A\}/g,"\u00C3"],[/\\"\{A\}/g,"\u00C4"],[/\\AA /g,"\u00C5"],[/\\AE /g,"\u00C6"],[/\\c\{C\}/g,"\u00C7"],[/\\`\{E\}/g,"\u00C8"],[/\\'\{E\}/g,"\u00C9"],[/\\\^\{E\}/g,"\u00CA"],[/\\"\{E\}/g,"\u00CB"],[/\\`\{I\}/g,"\u00CC"],[/\\'\{I\}/g,"\u00CD"],[/\\\^\{I\}/g,"\u00CE"],[/\\"\{I\}/g,"\u00CF"],[/\\DH /g,"\u00D0"],[/\\~\{N\}/g,"\u00D1"],[/\\`\{O\}/g,"\u00D2"],[/\\'\{O\}/g,"\u00D3"],[/\\\^\{O\}/g,"\u00D4"],[/\\~\{O\}/g,"\u00D5"],[/\\"\{O\}/g,"\u00D6"],[/\\texttimes /g,"\u00D7"],[/\\O /g,"\u00D8"],[/\\`\{U\}/g,"\u00D9"],[/\\'\{U\}/g,"\u00DA"],[/\\\^\{U\}/g,"\u00DB"],[/\\"\{U\}/g,"\u00DC"],[/\\'\{Y\}/g,"\u00DD"],[/\\TH /g,"\u00DE"],[/\\ss /g,"\u00DF"],[/\\`\{a\}/g,"\u00E0"],[/\\'\{a\}/g,"\u00E1"],[/\\\^\{a\}/g,"\u00E2"],[/\\~\{a\}/g,"\u00E3"],[/\\"\{a\}/g,"\u00E4"],[/\\aa /g,"\u00E5"],[/\\ae /g,"\u00E6"],[/\\c\{c\}/g,"\u00E7"],[/\\`\{e\}/g,"\u00E8"],[/\\'\{e\}/g,"\u00E9"],[/\\\^\{e\}/g,"\u00EA"],[/\\"\{e\}/g,"\u00EB"],[/\\`\{\\i\}/g,"\u00EC"],[/\\'\{\\i\}/g,"\u00ED"],[/\\\^\{\\i\}/g,"\u00EE"],[/\\"\{\\i\}/g,"\u00EF"],[/\\dh /g,"\u00F0"],[/\\~\{n\}/g,"\u00F1"],[/\\`\{o\}/g,"\u00F2"],[/\\'\{o\}/g,"\u00F3"],[/\\\^\{o\}/g,"\u00F4"],[/\\~\{o\}/g,"\u00F5"],[/\\"\{o\}/g,"\u00F6"],[/\\div /g,"\u00F7"],[/\\o /g,"\u00F8"],[/\\`\{u\}/g,"\u00F9"],[/\\'\{u\}/g,"\u00FA"],[/\\\^\{u\}/g,"\u00FB"],[/\\"\{u\}/g,"\u00FC"],[/\\'\{y\}/g,"\u00FD"],[/\\th /g,"\u00FE"],[/\\"\{y\}/g,"\u00FF"],[/\\=\{A\}/g,"\u0100"],[/\\=\{a\}/g,"\u0101"],[/\\u\{A\}/g,"\u0102"],[/\\u\{a\}/g,"\u0103"],[/\\k\{A\}/g,"\u0104"],[/\\k\{a\}/g,"\u0105"],[/\\'\{C\}/g,"\u0106"],[/\\'\{c\}/g,"\u0107"],[/\\\^\{C\}/g,"\u0108"],[/\\\^\{c\}/g,"\u0109"],[/\\.\{C\}/g,"\u010A"],[/\\.\{c\}/g,"\u010B"],[/\\v\{C\}/g,"\u010C"],[/\\v\{c\}/g,"\u010D"],[/\\v\{D\}/g,"\u010E"],[/\\v\{d\}/g,"\u010F"],[/\\DJ /g,"\u0110"],[/\\dj /g,"\u0111"],[/\\=\{E\}/g,"\u0112"],[/\\=\{e\}/g,"\u0113"],[/\\u\{E\}/g,"\u0114"],[/\\u\{e\}/g,"\u0115"],[/\\.\{E\}/g,"\u0116"],[/\\.\{e\}/g,"\u0117"],[/\\k\{E\}/g,"\u0118"],[/\\k\{e\}/g,"\u0119"],[/\\v\{E\}/g,"\u011A"],[/\\v\{e\}/g,"\u011B"],[/\\\^\{G\}/g,"\u011C"],[/\\\^\{g\}/g,"\u011D"],[/\\u\{G\}/g,"\u011E"],[/\\u\{g\}/g,"\u011F"],[/\\.\{G\}/g,"\u0120"],[/\\.\{g\}/g,"\u0121"],[/\\c\{G\}/g,"\u0122"],[/\\c\{g\}/g,"\u0123"],[/\\\^\{H\}/g,"\u0124"],[/\\\^\{h\}/g,"\u0125"],[/\\Elzxh /g,"\u0127"],[/\\~\{I\}/g,"\u0128"],[/\\~\{\\i\}/g,"\u0129"],[/\\=\{I\}/g,"\u012A"],[/\\=\{\\i\}/g,"\u012B"],[/\\u\{I\}/g,"\u012C"],[/\\u\{\\i\}/g,"\u012D"],[/\\k\{I\}/g,"\u012E"],[/\\k\{i\}/g,"\u012F"],[/\\.\{I\}/g,"\u0130"],[/\\i /g,"\u0131"],[/\\\^\{J\}/g,"\u0134"],[/\\\^\{\\j\}/g,"\u0135"],[/\\c\{K\}/g,"\u0136"],[/\\c\{k\}/g,"\u0137"],[/\\'\{L\}/g,"\u0139"],[/\\'\{l\}/g,"\u013A"],[/\\c\{L\}/g,"\u013B"],[/\\c\{l\}/g,"\u013C"],[/\\v\{L\}/g,"\u013D"],[/\\v\{l\}/g,"\u013E"],[/\\L /g,"\u0141"],[/\\l /g,"\u0142"],[/\\'\{N\}/g,"\u0143"],[/\\'\{n\}/g,"\u0144"],[/\\c\{N\}/g,"\u0145"],[/\\c\{n\}/g,"\u0146"],[/\\v\{N\}/g,"\u0147"],[/\\v\{n\}/g,"\u0148"],[/\\NG /g,"\u014A"],[/\\ng /g,"\u014B"],[/\\=\{O\}/g,"\u014C"],[/\\=\{o\}/g,"\u014D"],[/\\u\{O\}/g,"\u014E"],[/\\u\{o\}/g,"\u014F"],[/\\H\{O\}/g,"\u0150"],[/\\H\{o\}/g,"\u0151"],[/\\OE /g,"\u0152"],[/\\oe /g,"\u0153"],[/\\'\{R\}/g,"\u0154"],[/\\'\{r\}/g,"\u0155"],[/\\c\{R\}/g,"\u0156"],[/\\c\{r\}/g,"\u0157"],[/\\v\{R\}/g,"\u0158"],[/\\v\{r\}/g,"\u0159"],[/\\'\{S\}/g,"\u015A"],[/\\'\{s\}/g,"\u015B"],[/\\\^\{S\}/g,"\u015C"],[/\\\^\{s\}/g,"\u015D"],[/\\c\{S\}/g,"\u015E"],[/\\c\{s\}/g,"\u015F"],[/\\v\{S\}/g,"\u0160"],[/\\v\{s\}/g,"\u0161"],[/\\c\{T\}/g,"\u0162"],[/\\c\{t\}/g,"\u0163"],[/\\v\{T\}/g,"\u0164"],[/\\v\{t\}/g,"\u0165"],[/\\~\{U\}/g,"\u0168"],[/\\~\{u\}/g,"\u0169"],[/\\=\{U\}/g,"\u016A"],[/\\=\{u\}/g,"\u016B"],[/\\u\{U\}/g,"\u016C"],[/\\u\{u\}/g,"\u016D"],[/\\r\{U\}/g,"\u016E"],[/\\r\{u\}/g,"\u016F"],[/\\H\{U\}/g,"\u0170"],[/\\H\{u\}/g,"\u0171"],[/\\k\{U\}/g,"\u0172"],[/\\k\{u\}/g,"\u0173"],[/\\\^\{W\}/g,"\u0174"],[/\\\^\{w\}/g,"\u0175"],[/\\\^\{Y\}/g,"\u0176"],[/\\\^\{y\}/g,"\u0177"],[/\\"\{Y\}/g,"\u0178"],[/\\'\{Z\}/g,"\u0179"],[/\\'\{z\}/g,"\u017A"],[/\\.\{Z\}/g,"\u017B"],[/\\.\{z\}/g,"\u017C"],[/\\v\{Z\}/g,"\u017D"],[/\\v\{z\}/g,"\u017E"],[/\\texthvlig /g,"\u0195"],[/\\textnrleg /g,"\u019E"],[/\\eth /g,"\u01AA"],[/\\textdoublepipe /g,"\u01C2"],[/\\'\{g\}/g,"\u01F5"],[/\\Elztrna /g,"\u0250"],[/\\Elztrnsa /g,"\u0252"],[/\\Elzopeno /g,"\u0254"],[/\\Elzrtld /g,"\u0256"],[/\\Elzschwa /g,"\u0259"],[/\\varepsilon /g,"\u025B"],[/\\Elzpgamma /g,"\u0263"],[/\\Elzpbgam /g,"\u0264"],[/\\Elztrnh /g,"\u0265"],[/\\Elzbtdl /g,"\u026C"],[/\\Elzrtll /g,"\u026D"],[/\\Elztrnm /g,"\u026F"],[/\\Elztrnmlr /g,"\u0270"],[/\\Elzltlmr /g,"\u0271"],[/\\Elzltln /g,"\u0272"],[/\\Elzrtln /g,"\u0273"],[/\\Elzclomeg /g,"\u0277"],[/\\textphi /g,"\u0278"],[/\\Elztrnr /g,"\u0279"],[/\\Elztrnrl /g,"\u027A"],[/\\Elzrttrnr /g,"\u027B"],[/\\Elzrl /g,"\u027C"],[/\\Elzrtlr /g,"\u027D"],[/\\Elzfhr /g,"\u027E"],[/\\Elzrtls /g,"\u0282"],[/\\Elzesh /g,"\u0283"],[/\\Elztrnt /g,"\u0287"],[/\\Elzrtlt /g,"\u0288"],[/\\Elzpupsil /g,"\u028A"],[/\\Elzpscrv /g,"\u028B"],[/\\Elzinvv /g,"\u028C"],[/\\Elzinvw /g,"\u028D"],[/\\Elztrny /g,"\u028E"],[/\\Elzrtlz /g,"\u0290"],[/\\Elzyogh /g,"\u0292"],[/\\Elzglst /g,"\u0294"],[/\\Elzreglst /g,"\u0295"],[/\\Elzinglst /g,"\u0296"],[/\\textturnk /g,"\u029E"],[/\\Elzdyogh /g,"\u02A4"],[/\\Elztesh /g,"\u02A7"],[/\\textasciicaron /g,"\u02C7"],[/\\Elzverts /g,"\u02C8"],[/\\Elzverti /g,"\u02CC"],[/\\Elzlmrk /g,"\u02D0"],[/\\Elzhlmrk /g,"\u02D1"],[/\\Elzsbrhr /g,"\u02D2"],[/\\Elzsblhr /g,"\u02D3"],[/\\Elzrais /g,"\u02D4"],[/\\Elzlow /g,"\u02D5"],[/\\textasciibreve /g,"\u02D8"],[/\\textperiodcentered /g,"\u02D9"],[/\\r\{\}/g,"\u02DA"],[/\\k\{\}/g,"\u02DB"],[/\\texttildelow /g,"\u02DC"],[/\\H\{\}/g,"\u02DD"],[/\\tone\{55\}/g,"\u02E5"],[/\\tone\{44\}/g,"\u02E6"],[/\\tone\{33\}/g,"\u02E7"],[/\\tone\{22\}/g,"\u02E8"],[/\\tone\{11\}/g,"\u02E9"],[/\\cyrchar\\C/g,"\u030F"],[/\\Elzpalh /g,"\u0321"],[/\\Elzrh /g,"\u0322"],[/\\Elzsbbrg /g,"\u032A"],[/\\Elzxl /g,"\u0335"],[/\\Elzbar /g,"\u0336"],[/\\'\{A\}/g,"\u0386"],[/\\'\{E\}/g,"\u0388"],[/\\'\{H\}/g,"\u0389"],[/\\'\{\}\{I\}/g,"\u038A"],[/\\'\{\}O/g,"\u038C"],[/\\mathrm\{'Y\}/g,"\u038E"],[/\\mathrm\{'\\Omega\}/g,"\u038F"],[/\\acute\{\\ddot\{\\iota\}\}/g,"\u0390"],[/\\Alpha /g,"\u0391"],[/\\Beta /g,"\u0392"],[/\\Gamma /g,"\u0393"],[/\\Delta /g,"\u0394"],[/\\Epsilon /g,"\u0395"],[/\\Zeta /g,"\u0396"],[/\\Eta /g,"\u0397"],[/\\Theta /g,"\u0398"],[/\\Iota /g,"\u0399"],[/\\Kappa /g,"\u039A"],[/\\Lambda /g,"\u039B"],[/\\Xi /g,"\u039E"],[/\\Pi /g,"\u03A0"],[/\\Rho /g,"\u03A1"],[/\\Sigma /g,"\u03A3"],[/\\Tau /g,"\u03A4"],[/\\Upsilon /g,"\u03A5"],[/\\Phi /g,"\u03A6"],[/\\Chi /g,"\u03A7"],[/\\Psi /g,"\u03A8"],[/\\Omega /g,"\u03A9"],[/\\mathrm\{\\ddot\{I\}\}/g,"\u03AA"],[/\\mathrm\{\\ddot\{Y\}\}/g,"\u03AB"],[/\\'\{\$\\alpha\$\}/g,"\u03AC"],[/\\acute\{\\epsilon\}/g,"\u03AD"],[/\\acute\{\\eta\}/g,"\u03AE"],[/\\acute\{\\iota\}/g,"\u03AF"],[/\\acute\{\\ddot\{\\upsilon\}\}/g,"\u03B0"],[/\\alpha /g,"\u03B1"],[/\\beta /g,"\u03B2"],[/\\gamma /g,"\u03B3"],[/\\delta /g,"\u03B4"],[/\\epsilon /g,"\u03B5"],[/\\zeta /g,"\u03B6"],[/\\eta /g,"\u03B7"],[/\\texttheta /g,"\u03B8"],[/\\iota /g,"\u03B9"],[/\\kappa /g,"\u03BA"],[/\\lambda /g,"\u03BB"],[/\\mu /g,"\u03BC"],[/\\nu /g,"\u03BD"],[/\\xi /g,"\u03BE"],[/\\pi /g,"\u03C0"],[/\\rho /g,"\u03C1"],[/\\varsigma /g,"\u03C2"],[/\\sigma /g,"\u03C3"],[/\\tau /g,"\u03C4"],[/\\upsilon /g,"\u03C5"],[/\\varphi /g,"\u03C6"],[/\\chi /g,"\u03C7"],[/\\psi /g,"\u03C8"],[/\\omega /g,"\u03C9"],[/\\ddot\{\\iota\}/g,"\u03CA"],[/\\ddot\{\\upsilon\}/g,"\u03CB"],[/\\'\{o\}/g,"\u03CC"],[/\\acute\{\\upsilon\}/g,"\u03CD"],[/\\acute\{\\omega\}/g,"\u03CE"],[/\\Pisymbol\{ppi022\}\{87\}/g,"\u03D0"],[/\\textvartheta /g,"\u03D1"],[/\\Upsilon /g,"\u03D2"],[/\\phi /g,"\u03D5"],[/\\varpi /g,"\u03D6"],[/\\Stigma /g,"\u03DA"],[/\\Digamma /g,"\u03DC"],[/\\digamma /g,"\u03DD"],[/\\Koppa /g,"\u03DE"],[/\\Sampi /g,"\u03E0"],[/\\varkappa /g,"\u03F0"],[/\\varrho /g,"\u03F1"],[/\\textTheta /g,"\u03F4"],[/\\backepsilon /g,"\u03F6"],[/\\cyrchar\\CYRYO /g,"\u0401"],[/\\cyrchar\\CYRDJE /g,"\u0402"],[/\\cyrchar\{\\'\\CYRG\}/g,"\u0403"],[/\\cyrchar\\CYRIE /g,"\u0404"],[/\\cyrchar\\CYRDZE /g,"\u0405"],[/\\cyrchar\\CYRII /g,"\u0406"],[/\\cyrchar\\CYRYI /g,"\u0407"],[/\\cyrchar\\CYRJE /g,"\u0408"],[/\\cyrchar\\CYRLJE /g,"\u0409"],[/\\cyrchar\\CYRNJE /g,"\u040A"],[/\\cyrchar\\CYRTSHE /g,"\u040B"],[/\\cyrchar\{\\'\\CYRK\}/g,"\u040C"],[/\\cyrchar\\CYRUSHRT /g,"\u040E"],[/\\cyrchar\\CYRDZHE /g,"\u040F"],[/\\cyrchar\\CYRA /g,"\u0410"],[/\\cyrchar\\CYRB /g,"\u0411"],[/\\cyrchar\\CYRV /g,"\u0412"],[/\\cyrchar\\CYRG /g,"\u0413"],[/\\cyrchar\\CYRD /g,"\u0414"],[/\\cyrchar\\CYRE /g,"\u0415"],[/\\cyrchar\\CYRZH /g,"\u0416"],[/\\cyrchar\\CYRZ /g,"\u0417"],[/\\cyrchar\\CYRI /g,"\u0418"],[/\\cyrchar\\CYRISHRT /g,"\u0419"],[/\\cyrchar\\CYRK /g,"\u041A"],[/\\cyrchar\\CYRL /g,"\u041B"],[/\\cyrchar\\CYRM /g,"\u041C"],[/\\cyrchar\\CYRN /g,"\u041D"],[/\\cyrchar\\CYRO /g,"\u041E"],[/\\cyrchar\\CYRP /g,"\u041F"],[/\\cyrchar\\CYRR /g,"\u0420"],[/\\cyrchar\\CYRS /g,"\u0421"],[/\\cyrchar\\CYRT /g,"\u0422"],[/\\cyrchar\\CYRU /g,"\u0423"],[/\\cyrchar\\CYRF /g,"\u0424"],[/\\cyrchar\\CYRH /g,"\u0425"],[/\\cyrchar\\CYRC /g,"\u0426"],[/\\cyrchar\\CYRCH /g,"\u0427"],[/\\cyrchar\\CYRSH /g,"\u0428"],[/\\cyrchar\\CYRSHCH /g,"\u0429"],[/\\cyrchar\\CYRHRDSN /g,"\u042A"],[/\\cyrchar\\CYRERY /g,"\u042B"],[/\\cyrchar\\CYRSFTSN /g,"\u042C"],[/\\cyrchar\\CYREREV /g,"\u042D"],[/\\cyrchar\\CYRYU /g,"\u042E"],[/\\cyrchar\\CYRYA /g,"\u042F"],[/\\cyrchar\\cyra /g,"\u0430"],[/\\cyrchar\\cyrb /g,"\u0431"],[/\\cyrchar\\cyrv /g,"\u0432"],[/\\cyrchar\\cyrg /g,"\u0433"],[/\\cyrchar\\cyrd /g,"\u0434"],[/\\cyrchar\\cyre /g,"\u0435"],[/\\cyrchar\\cyrzh /g,"\u0436"],[/\\cyrchar\\cyrz /g,"\u0437"],[/\\cyrchar\\cyri /g,"\u0438"],[/\\cyrchar\\cyrishrt /g,"\u0439"],[/\\cyrchar\\cyrk /g,"\u043A"],[/\\cyrchar\\cyrl /g,"\u043B"],[/\\cyrchar\\cyrm /g,"\u043C"],[/\\cyrchar\\cyrn /g,"\u043D"],[/\\cyrchar\\cyro /g,"\u043E"],[/\\cyrchar\\cyrp /g,"\u043F"],[/\\cyrchar\\cyrr /g,"\u0440"],[/\\cyrchar\\cyrs /g,"\u0441"],[/\\cyrchar\\cyrt /g,"\u0442"],[/\\cyrchar\\cyru /g,"\u0443"],[/\\cyrchar\\cyrf /g,"\u0444"],[/\\cyrchar\\cyrh /g,"\u0445"],[/\\cyrchar\\cyrc /g,"\u0446"],[/\\cyrchar\\cyrch /g,"\u0447"],[/\\cyrchar\\cyrsh /g,"\u0448"],[/\\cyrchar\\cyrshch /g,"\u0449"],[/\\cyrchar\\cyrhrdsn /g,"\u044A"],[/\\cyrchar\\cyrery /g,"\u044B"],[/\\cyrchar\\cyrsftsn /g,"\u044C"],[/\\cyrchar\\cyrerev /g,"\u044D"],[/\\cyrchar\\cyryu /g,"\u044E"],[/\\cyrchar\\cyrya /g,"\u044F"],[/\\cyrchar\\cyryo /g,"\u0451"],[/\\cyrchar\\cyrdje /g,"\u0452"],[/\\cyrchar\{\\'\\cyrg\}/g,"\u0453"],[/\\cyrchar\\cyrie /g,"\u0454"],[/\\cyrchar\\cyrdze /g,"\u0455"],[/\\cyrchar\\cyrii /g,"\u0456"],[/\\cyrchar\\cyryi /g,"\u0457"],[/\\cyrchar\\cyrje /g,"\u0458"],[/\\cyrchar\\cyrlje /g,"\u0459"],[/\\cyrchar\\cyrnje /g,"\u045A"],[/\\cyrchar\\cyrtshe /g,"\u045B"],[/\\cyrchar\{\\'\\cyrk\}/g,"\u045C"],[/\\cyrchar\\cyrushrt /g,"\u045E"],[/\\cyrchar\\cyrdzhe /g,"\u045F"],[/\\cyrchar\\CYROMEGA /g,"\u0460"],[/\\cyrchar\\cyromega /g,"\u0461"],[/\\cyrchar\\CYRYAT /g,"\u0462"],[/\\cyrchar\\CYRIOTE /g,"\u0464"],[/\\cyrchar\\cyriote /g,"\u0465"],[/\\cyrchar\\CYRLYUS /g,"\u0466"],[/\\cyrchar\\cyrlyus /g,"\u0467"],[/\\cyrchar\\CYRIOTLYUS /g,"\u0468"],[/\\cyrchar\\cyriotlyus /g,"\u0469"],[/\\cyrchar\\CYRBYUS /g,"\u046A"],[/\\cyrchar\\CYRIOTBYUS /g,"\u046C"],[/\\cyrchar\\cyriotbyus /g,"\u046D"],[/\\cyrchar\\CYRKSI /g,"\u046E"],[/\\cyrchar\\cyrksi /g,"\u046F"],[/\\cyrchar\\CYRPSI /g,"\u0470"],[/\\cyrchar\\cyrpsi /g,"\u0471"],[/\\cyrchar\\CYRFITA /g,"\u0472"],[/\\cyrchar\\CYRIZH /g,"\u0474"],[/\\cyrchar\\CYRUK /g,"\u0478"],[/\\cyrchar\\cyruk /g,"\u0479"],[/\\cyrchar\\CYROMEGARND /g,"\u047A"],[/\\cyrchar\\cyromegarnd /g,"\u047B"],[/\\cyrchar\\CYROMEGATITLO /g,"\u047C"],[/\\cyrchar\\cyromegatitlo /g,"\u047D"],[/\\cyrchar\\CYROT /g,"\u047E"],[/\\cyrchar\\cyrot /g,"\u047F"],[/\\cyrchar\\CYRKOPPA /g,"\u0480"],[/\\cyrchar\\cyrkoppa /g,"\u0481"],[/\\cyrchar\\cyrthousands /g,"\u0482"],[/\\cyrchar\\cyrhundredthousands /g,"\u0488"],[/\\cyrchar\\cyrmillions /g,"\u0489"],[/\\cyrchar\\CYRSEMISFTSN /g,"\u048C"],[/\\cyrchar\\cyrsemisftsn /g,"\u048D"],[/\\cyrchar\\CYRRTICK /g,"\u048E"],[/\\cyrchar\\cyrrtick /g,"\u048F"],[/\\cyrchar\\CYRGUP /g,"\u0490"],[/\\cyrchar\\cyrgup /g,"\u0491"],[/\\cyrchar\\CYRGHCRS /g,"\u0492"],[/\\cyrchar\\cyrghcrs /g,"\u0493"],[/\\cyrchar\\CYRGHK /g,"\u0494"],[/\\cyrchar\\cyrghk /g,"\u0495"],[/\\cyrchar\\CYRZHDSC /g,"\u0496"],[/\\cyrchar\\cyrzhdsc /g,"\u0497"],[/\\cyrchar\\CYRZDSC /g,"\u0498"],[/\\cyrchar\\cyrzdsc /g,"\u0499"],[/\\cyrchar\\CYRKDSC /g,"\u049A"],[/\\cyrchar\\cyrkdsc /g,"\u049B"],[/\\cyrchar\\CYRKVCRS /g,"\u049C"],[/\\cyrchar\\cyrkvcrs /g,"\u049D"],[/\\cyrchar\\CYRKHCRS /g,"\u049E"],[/\\cyrchar\\cyrkhcrs /g,"\u049F"],[/\\cyrchar\\CYRKBEAK /g,"\u04A0"],[/\\cyrchar\\cyrkbeak /g,"\u04A1"],[/\\cyrchar\\CYRNDSC /g,"\u04A2"],[/\\cyrchar\\cyrndsc /g,"\u04A3"],[/\\cyrchar\\CYRNG /g,"\u04A4"],[/\\cyrchar\\cyrng /g,"\u04A5"],[/\\cyrchar\\CYRPHK /g,"\u04A6"],[/\\cyrchar\\cyrphk /g,"\u04A7"],[/\\cyrchar\\CYRABHHA /g,"\u04A8"],[/\\cyrchar\\cyrabhha /g,"\u04A9"],[/\\cyrchar\\CYRSDSC /g,"\u04AA"],[/\\cyrchar\\cyrsdsc /g,"\u04AB"],[/\\cyrchar\\CYRTDSC /g,"\u04AC"],[/\\cyrchar\\cyrtdsc /g,"\u04AD"],[/\\cyrchar\\CYRY /g,"\u04AE"],[/\\cyrchar\\cyry /g,"\u04AF"],[/\\cyrchar\\CYRYHCRS /g,"\u04B0"],[/\\cyrchar\\cyryhcrs /g,"\u04B1"],[/\\cyrchar\\CYRHDSC /g,"\u04B2"],[/\\cyrchar\\cyrhdsc /g,"\u04B3"],[/\\cyrchar\\CYRTETSE /g,"\u04B4"],[/\\cyrchar\\cyrtetse /g,"\u04B5"],[/\\cyrchar\\CYRCHRDSC /g,"\u04B6"],[/\\cyrchar\\cyrchrdsc /g,"\u04B7"],[/\\cyrchar\\CYRCHVCRS /g,"\u04B8"],[/\\cyrchar\\cyrchvcrs /g,"\u04B9"],[/\\cyrchar\\CYRSHHA /g,"\u04BA"],[/\\cyrchar\\cyrshha /g,"\u04BB"],[/\\cyrchar\\CYRABHCH /g,"\u04BC"],[/\\cyrchar\\cyrabhch /g,"\u04BD"],[/\\cyrchar\\CYRABHCHDSC /g,"\u04BE"],[/\\cyrchar\\cyrabhchdsc /g,"\u04BF"],[/\\cyrchar\\CYRpalochka /g,"\u04C0"],[/\\cyrchar\\CYRKHK /g,"\u04C3"],[/\\cyrchar\\cyrkhk /g,"\u04C4"],[/\\cyrchar\\CYRNHK /g,"\u04C7"],[/\\cyrchar\\cyrnhk /g,"\u04C8"],[/\\cyrchar\\CYRCHLDSC /g,"\u04CB"],[/\\cyrchar\\cyrchldsc /g,"\u04CC"],[/\\cyrchar\\CYRAE /g,"\u04D4"],[/\\cyrchar\\cyrae /g,"\u04D5"],[/\\cyrchar\\CYRSCHWA /g,"\u04D8"],[/\\cyrchar\\cyrschwa /g,"\u04D9"],[/\\cyrchar\\CYRABHDZE /g,"\u04E0"],[/\\cyrchar\\cyrabhdze /g,"\u04E1"],[/\\cyrchar\\CYROTLD /g,"\u04E8"],[/\\cyrchar\\cyrotld /g,"\u04E9"],[/\\hspace\{0.6em\}/g,"\u2002"],[/\\hspace\{1em\}/g,"\u2003"],[/\\hspace\{0.33em\}/g,"\u2004"],[/\\hspace\{0.25em\}/g,"\u2005"],[/\\hspace\{0.166em\}/g,"\u2006"],[/\\hphantom\{0\}/g,"\u2007"],[/\\hphantom\{,\}/g,"\u2008"],[/\\hspace\{0.167em\}/g,"\u2009"],[/\\mkern1mu /g,"\u200A"],[/\\textendash /g,"\u2013"],[/\\textemdash /g,"\u2014"],[/\\rule\{1em\}\{1pt\}/g,"\u2015"],[/\\Vert /g,"\u2016"],[/\\Elzreapos /g,"\u201B"],[/\\textquotedblleft /g,"\u201C"],[/\\textquotedblright /g,"\u201D"],[/\\textdagger /g,"\u2020"],[/\\textdaggerdbl /g,"\u2021"],[/\\textbullet /g,"\u2022"],[/\\ldots /g,"\u2026"],[/\\textperthousand /g,"\u2030"],[/\\textpertenthousand /g,"\u2031"],[/\\backprime /g,"\u2035"],[/\\guilsinglleft /g,"\u2039"],[/\\guilsinglright /g,"\u203A"],[/\\mkern4mu /g,"\u205F"],[/\\nolinebreak /g,"\u2060"],[/\\ensuremath\{\\Elzpes\}/g,"\u20A7"],[/\\mbox\{\\texteuro\} /g,"\u20AC"],[/\\dddot /g,"\u20DB"],[/\\ddddot /g,"\u20DC"],[/\\mathbb\{C\}/g,"\u2102"],[/\\mathscr\{g\}/g,"\u210A"],[/\\mathscr\{H\}/g,"\u210B"],[/\\mathfrak\{H\}/g,"\u210C"],[/\\mathbb\{H\}/g,"\u210D"],[/\\hslash /g,"\u210F"],[/\\mathscr\{I\}/g,"\u2110"],[/\\mathfrak\{I\}/g,"\u2111"],[/\\mathscr\{L\}/g,"\u2112"],[/\\mathscr\{l\}/g,"\u2113"],[/\\mathbb\{N\}/g,"\u2115"],[/\\cyrchar\\textnumero /g,"\u2116"],[/\\wp /g,"\u2118"],[/\\mathbb\{P\}/g,"\u2119"],[/\\mathbb\{Q\}/g,"\u211A"],[/\\mathscr\{R\}/g,"\u211B"],[/\\mathfrak\{R\}/g,"\u211C"],[/\\mathbb\{R\}/g,"\u211D"],[/\\Elzxrat /g,"\u211E"],[/\\texttrademark /g,"\u2122"],[/\\mathbb\{Z\}/g,"\u2124"],[/\\Omega /g,"\u2126"],[/\\mho /g,"\u2127"],[/\\mathfrak\{Z\}/g,"\u2128"],[/\\ElsevierGlyph\{2129\}/g,"\u2129"],[/\\AA /g,"\u212B"],[/\\mathscr\{B\}/g,"\u212C"],[/\\mathfrak\{C\}/g,"\u212D"],[/\\mathscr\{e\}/g,"\u212F"],[/\\mathscr\{E\}/g,"\u2130"],[/\\mathscr\{F\}/g,"\u2131"],[/\\mathscr\{M\}/g,"\u2133"],[/\\mathscr\{o\}/g,"\u2134"],[/\\aleph /g,"\u2135"],[/\\beth /g,"\u2136"],[/\\gimel /g,"\u2137"],[/\\daleth /g,"\u2138"],[/\\textfrac\{1\}\{3\}/g,"\u2153"],[/\\textfrac\{2\}\{3\}/g,"\u2154"],[/\\textfrac\{1\}\{5\}/g,"\u2155"],[/\\textfrac\{2\}\{5\}/g,"\u2156"],[/\\textfrac\{3\}\{5\}/g,"\u2157"],[/\\textfrac\{4\}\{5\}/g,"\u2158"],[/\\textfrac\{1\}\{6\}/g,"\u2159"],[/\\textfrac\{5\}\{6\}/g,"\u215A"],[/\\textfrac\{1\}\{8\}/g,"\u215B"],[/\\textfrac\{3\}\{8\}/g,"\u215C"],[/\\textfrac\{5\}\{8\}/g,"\u215D"],[/\\textfrac\{7\}\{8\}/g,"\u215E"],[/\\leftarrow /g,"\u2190"],[/\\uparrow /g,"\u2191"],[/\\rightarrow /g,"\u2192"],[/\\downarrow /g,"\u2193"],[/\\leftrightarrow /g,"\u2194"],[/\\updownarrow /g,"\u2195"],[/\\nwarrow /g,"\u2196"],[/\\nearrow /g,"\u2197"],[/\\searrow /g,"\u2198"],[/\\swarrow /g,"\u2199"],[/\\nleftarrow /g,"\u219A"],[/\\nrightarrow /g,"\u219B"],[/\\arrowwaveright /g,"\u219C"],[/\\arrowwaveright /g,"\u219D"],[/\\twoheadleftarrow /g,"\u219E"],[/\\twoheadrightarrow /g,"\u21A0"],[/\\leftarrowtail /g,"\u21A2"],[/\\rightarrowtail /g,"\u21A3"],[/\\mapsto /g,"\u21A6"],[/\\hookleftarrow /g,"\u21A9"],[/\\hookrightarrow /g,"\u21AA"],[/\\looparrowleft /g,"\u21AB"],[/\\looparrowright /g,"\u21AC"],[/\\leftrightsquigarrow /g,"\u21AD"],[/\\nleftrightarrow /g,"\u21AE"],[/\\Lsh /g,"\u21B0"],[/\\Rsh /g,"\u21B1"],[/\\ElsevierGlyph\{21B3\}/g,"\u21B3"],[/\\curvearrowleft /g,"\u21B6"],[/\\curvearrowright /g,"\u21B7"],[/\\circlearrowleft /g,"\u21BA"],[/\\circlearrowright /g,"\u21BB"],[/\\leftharpoonup /g,"\u21BC"],[/\\leftharpoondown /g,"\u21BD"],[/\\upharpoonright /g,"\u21BE"],[/\\upharpoonleft /g,"\u21BF"],[/\\rightharpoonup /g,"\u21C0"],[/\\rightharpoondown /g,"\u21C1"],[/\\downharpoonright /g,"\u21C2"],[/\\downharpoonleft /g,"\u21C3"],[/\\rightleftarrows /g,"\u21C4"],[/\\dblarrowupdown /g,"\u21C5"],[/\\leftrightarrows /g,"\u21C6"],[/\\leftleftarrows /g,"\u21C7"],[/\\upuparrows /g,"\u21C8"],[/\\rightrightarrows /g,"\u21C9"],[/\\downdownarrows /g,"\u21CA"],[/\\leftrightharpoons /g,"\u21CB"],[/\\rightleftharpoons /g,"\u21CC"],[/\\nLeftarrow /g,"\u21CD"],[/\\nLeftrightarrow /g,"\u21CE"],[/\\nRightarrow /g,"\u21CF"],[/\\Leftarrow /g,"\u21D0"],[/\\Uparrow /g,"\u21D1"],[/\\Rightarrow /g,"\u21D2"],[/\\Downarrow /g,"\u21D3"],[/\\Leftrightarrow /g,"\u21D4"],[/\\Updownarrow /g,"\u21D5"],[/\\Lleftarrow /g,"\u21DA"],[/\\Rrightarrow /g,"\u21DB"],[/\\rightsquigarrow /g,"\u21DD"],[/\\DownArrowUpArrow /g,"\u21F5"],[/\\forall /g,"\u2200"],[/\\complement /g,"\u2201"],[/\\partial /g,"\u2202"],[/\\exists /g,"\u2203"],[/\\nexists /g,"\u2204"],[/\\varnothing /g,"\u2205"],[/\\nabla /g,"\u2207"],[/\\in /g,"\u2208"],[/\\not\\in /g,"\u2209"],[/\\ni /g,"\u220B"],[/\\not\\ni /g,"\u220C"],[/\\prod /g,"\u220F"],[/\\coprod /g,"\u2210"],[/\\sum /g,"\u2211"],[/\\mp /g,"\u2213"],[/\\dotplus /g,"\u2214"],[/\\setminus /g,"\u2216"],[/\\circ /g,"\u2218"],[/\\bullet /g,"\u2219"],[/\\surd /g,"\u221A"],[/\\propto /g,"\u221D"],[/\\infty /g,"\u221E"],[/\\rightangle /g,"\u221F"],[/\\angle /g,"\u2220"],[/\\measuredangle /g,"\u2221"],[/\\sphericalangle /g,"\u2222"],[/\\mid /g,"\u2223"],[/\\nmid /g,"\u2224"],[/\\parallel /g,"\u2225"],[/\\nparallel /g,"\u2226"],[/\\wedge /g,"\u2227"],[/\\vee /g,"\u2228"],[/\\cap /g,"\u2229"],[/\\cup /g,"\u222A"],[/\\int /g,"\u222B"],[/\\int\\!\\int /g,"\u222C"],[/\\int\\!\\int\\!\\int /g,"\u222D"],[/\\oint /g,"\u222E"],[/\\surfintegral /g,"\u222F"],[/\\volintegral /g,"\u2230"],[/\\clwintegral /g,"\u2231"],[/\\ElsevierGlyph\{2232\}/g,"\u2232"],[/\\ElsevierGlyph\{2233\}/g,"\u2233"],[/\\therefore /g,"\u2234"],[/\\because /g,"\u2235"],[/\\Colon /g,"\u2237"],[/\\ElsevierGlyph\{2238\}/g,"\u2238"],[/\\mathbin\{\{:\}\\!\\!\{\-\}\\!\\!\{:\}\}/g,"\u223A"],[/\\homothetic /g,"\u223B"],[/\\sim /g,"\u223C"],[/\\backsim /g,"\u223D"],[/\\lazysinv /g,"\u223E"],[/\\wr /g,"\u2240"],[/\\not\\sim /g,"\u2241"],[/\\ElsevierGlyph\{2242\}/g,"\u2242"],[/\\NotEqualTilde /g,"\u2242-00338"],[/\\simeq /g,"\u2243"],[/\\not\\simeq /g,"\u2244"],[/\\cong /g,"\u2245"],[/\\approxnotequal /g,"\u2246"],[/\\not\\cong /g,"\u2247"],[/\\approx /g,"\u2248"],[/\\not\\approx /g,"\u2249"],[/\\approxeq /g,"\u224A"],[/\\tildetrpl /g,"\u224B"],[/\\not\\apid /g,"\u224B-00338"],[/\\allequal /g,"\u224C"],[/\\asymp /g,"\u224D"],[/\\Bumpeq /g,"\u224E"],[/\\NotHumpDownHump /g,"\u224E-00338"],[/\\bumpeq /g,"\u224F"],[/\\NotHumpEqual /g,"\u224F-00338"],[/\\doteq /g,"\u2250"],[/\\not\\doteq/g,"\u2250-00338"],[/\\doteqdot /g,"\u2251"],[/\\fallingdotseq /g,"\u2252"],[/\\risingdotseq /g,"\u2253"],[/\\eqcirc /g,"\u2256"],[/\\circeq /g,"\u2257"],[/\\estimates /g,"\u2259"],[/\\ElsevierGlyph\{225A\}/g,"\u225A"],[/\\starequal /g,"\u225B"],[/\\triangleq /g,"\u225C"],[/\\ElsevierGlyph\{225F\}/g,"\u225F"],[/\\not =/g,"\u2260"],[/\\equiv /g,"\u2261"],[/\\not\\equiv /g,"\u2262"],[/\\leq /g,"\u2264"],[/\\geq /g,"\u2265"],[/\\leqq /g,"\u2266"],[/\\geqq /g,"\u2267"],[/\\lneqq /g,"\u2268"],[/\\lvertneqq /g,"\u2268-0FE00"],[/\\gneqq /g,"\u2269"],[/\\gvertneqq /g,"\u2269-0FE00"],[/\\ll /g,"\u226A"],[/\\NotLessLess /g,"\u226A-00338"],[/\\gg /g,"\u226B"],[/\\NotGreaterGreater /g,"\u226B-00338"],[/\\between /g,"\u226C"],[/\\not\\kern\-0.3em\\times /g,"\u226D"],[/\\not</g,"\u226E"],[/\\not>/g,"\u226F"],[/\\not\\leq /g,"\u2270"],[/\\not\\geq /g,"\u2271"],[/\\lessequivlnt /g,"\u2272"],[/\\greaterequivlnt /g,"\u2273"],[/\\ElsevierGlyph\{2274\}/g,"\u2274"],[/\\ElsevierGlyph\{2275\}/g,"\u2275"],[/\\lessgtr /g,"\u2276"],[/\\gtrless /g,"\u2277"],[/\\notlessgreater /g,"\u2278"],[/\\notgreaterless /g,"\u2279"],[/\\prec /g,"\u227A"],[/\\succ /g,"\u227B"],[/\\preccurlyeq /g,"\u227C"],[/\\succcurlyeq /g,"\u227D"],[/\\precapprox /g,"\u227E"],[/\\NotPrecedesTilde /g,"\u227E-00338"],[/\\succapprox /g,"\u227F"],[/\\NotSucceedsTilde /g,"\u227F-00338"],[/\\not\\prec /g,"\u2280"],[/\\not\\succ /g,"\u2281"],[/\\subset /g,"\u2282"],[/\\supset /g,"\u2283"],[/\\not\\subset /g,"\u2284"],[/\\not\\supset /g,"\u2285"],[/\\subseteq /g,"\u2286"],[/\\supseteq /g,"\u2287"],[/\\not\\subseteq /g,"\u2288"],[/\\not\\supseteq /g,"\u2289"],[/\\subsetneq /g,"\u228A"],[/\\varsubsetneqq /g,"\u228A-0FE00"],[/\\supsetneq /g,"\u228B"],[/\\varsupsetneq /g,"\u228B-0FE00"],[/\\uplus /g,"\u228E"],[/\\sqsubset /g,"\u228F"],[/\\NotSquareSubset /g,"\u228F-00338"],[/\\sqsupset /g,"\u2290"],[/\\NotSquareSuperset /g,"\u2290-00338"],[/\\sqsubseteq /g,"\u2291"],[/\\sqsupseteq /g,"\u2292"],[/\\sqcap /g,"\u2293"],[/\\sqcup /g,"\u2294"],[/\\oplus /g,"\u2295"],[/\\ominus /g,"\u2296"],[/\\otimes /g,"\u2297"],[/\\oslash /g,"\u2298"],[/\\odot /g,"\u2299"],[/\\circledcirc /g,"\u229A"],[/\\circledast /g,"\u229B"],[/\\circleddash /g,"\u229D"],[/\\boxplus /g,"\u229E"],[/\\boxminus /g,"\u229F"],[/\\boxtimes /g,"\u22A0"],[/\\boxdot /g,"\u22A1"],[/\\vdash /g,"\u22A2"],[/\\dashv /g,"\u22A3"],[/\\top /g,"\u22A4"],[/\\perp /g,"\u22A5"],[/\\truestate /g,"\u22A7"],[/\\forcesextra /g,"\u22A8"],[/\\Vdash /g,"\u22A9"],[/\\Vvdash /g,"\u22AA"],[/\\VDash /g,"\u22AB"],[/\\nvdash /g,"\u22AC"],[/\\nvDash /g,"\u22AD"],[/\\nVdash /g,"\u22AE"],[/\\nVDash /g,"\u22AF"],[/\\vartriangleleft /g,"\u22B2"],[/\\vartriangleright /g,"\u22B3"],[/\\trianglelefteq /g,"\u22B4"],[/\\trianglerighteq /g,"\u22B5"],[/\\original /g,"\u22B6"],[/\\image /g,"\u22B7"],[/\\multimap /g,"\u22B8"],[/\\hermitconjmatrix /g,"\u22B9"],[/\\intercal /g,"\u22BA"],[/\\veebar /g,"\u22BB"],[/\\rightanglearc /g,"\u22BE"],[/\\ElsevierGlyph\{22C0\}/g,"\u22C0"],[/\\ElsevierGlyph\{22C1\}/g,"\u22C1"],[/\\bigcap /g,"\u22C2"],[/\\bigcup /g,"\u22C3"],[/\\diamond /g,"\u22C4"],[/\\cdot /g,"\u22C5"],[/\\star /g,"\u22C6"],[/\\divideontimes /g,"\u22C7"],[/\\bowtie /g,"\u22C8"],[/\\ltimes /g,"\u22C9"],[/\\rtimes /g,"\u22CA"],[/\\leftthreetimes /g,"\u22CB"],[/\\rightthreetimes /g,"\u22CC"],[/\\backsimeq /g,"\u22CD"],[/\\curlyvee /g,"\u22CE"],[/\\curlywedge /g,"\u22CF"],[/\\Subset /g,"\u22D0"],[/\\Supset /g,"\u22D1"],[/\\Cap /g,"\u22D2"],[/\\Cup /g,"\u22D3"],[/\\pitchfork /g,"\u22D4"],[/\\lessdot /g,"\u22D6"],[/\\gtrdot /g,"\u22D7"],[/\\verymuchless /g,"\u22D8"],[/\\verymuchgreater /g,"\u22D9"],[/\\lesseqgtr /g,"\u22DA"],[/\\gtreqless /g,"\u22DB"],[/\\curlyeqprec /g,"\u22DE"],[/\\curlyeqsucc /g,"\u22DF"],[/\\not\\sqsubseteq /g,"\u22E2"],[/\\not\\sqsupseteq /g,"\u22E3"],[/\\Elzsqspne /g,"\u22E5"],[/\\lnsim /g,"\u22E6"],[/\\gnsim /g,"\u22E7"],[/\\precedesnotsimilar /g,"\u22E8"],[/\\succnsim /g,"\u22E9"],[/\\ntriangleleft /g,"\u22EA"],[/\\ntriangleright /g,"\u22EB"],[/\\ntrianglelefteq /g,"\u22EC"],[/\\ntrianglerighteq /g,"\u22ED"],[/\\vdots /g,"\u22EE"],[/\\cdots /g,"\u22EF"],[/\\upslopeellipsis /g,"\u22F0"],[/\\downslopeellipsis /g,"\u22F1"],[/\\barwedge /g,"\u2305"],[/\\perspcorrespond /g,"\u2306"],[/\\lceil /g,"\u2308"],[/\\rceil /g,"\u2309"],[/\\lfloor /g,"\u230A"],[/\\rfloor /g,"\u230B"],[/\\recorder /g,"\u2315"],[/\\mathchar"2208/g,"\u2316"],[/\\ulcorner /g,"\u231C"],[/\\urcorner /g,"\u231D"],[/\\llcorner /g,"\u231E"],[/\\lrcorner /g,"\u231F"],[/\\frown /g,"\u2322"],[/\\smile /g,"\u2323"],[/\\langle /g,"\u2329"],[/\\rangle /g,"\u232A"],[/\\ElsevierGlyph\{E838\}/g,"\u233D"],[/\\Elzdlcorn /g,"\u23A3"],[/\\lmoustache /g,"\u23B0"],[/\\rmoustache /g,"\u23B1"],[/\\textvisiblespace /g,"\u2423"],[/\\ding\{172\}/g,"\u2460"],[/\\ding\{173\}/g,"\u2461"],[/\\ding\{174\}/g,"\u2462"],[/\\ding\{175\}/g,"\u2463"],[/\\ding\{176\}/g,"\u2464"],[/\\ding\{177\}/g,"\u2465"],[/\\ding\{178\}/g,"\u2466"],[/\\ding\{179\}/g,"\u2467"],[/\\ding\{180\}/g,"\u2468"],[/\\ding\{181\}/g,"\u2469"],[/\\circledS /g,"\u24C8"],[/\\Elzdshfnc /g,"\u2506"],[/\\Elzsqfnw /g,"\u2519"],[/\\diagup /g,"\u2571"],[/\\ding\{110\}/g,"\u25A0"],[/\\square /g,"\u25A1"],[/\\blacksquare /g,"\u25AA"],[/\\fbox\{~~\}/g,"\u25AD"],[/\\Elzvrecto /g,"\u25AF"],[/\\ElsevierGlyph\{E381\}/g,"\u25B1"],[/\\ding\{115\}/g,"\u25B2"],[/\\bigtriangleup /g,"\u25B3"],[/\\blacktriangle /g,"\u25B4"],[/\\vartriangle /g,"\u25B5"],[/\\blacktriangleright /g,"\u25B8"],[/\\triangleright /g,"\u25B9"],[/\\ding\{116\}/g,"\u25BC"],[/\\bigtriangledown /g,"\u25BD"],[/\\blacktriangledown /g,"\u25BE"],[/\\triangledown /g,"\u25BF"],[/\\blacktriangleleft /g,"\u25C2"],[/\\triangleleft /g,"\u25C3"],[/\\ding\{117\}/g,"\u25C6"],[/\\lozenge /g,"\u25CA"],[/\\bigcirc /g,"\u25CB"],[/\\ding\{108\}/g,"\u25CF"],[/\\Elzcirfl /g,"\u25D0"],[/\\Elzcirfr /g,"\u25D1"],[/\\Elzcirfb /g,"\u25D2"],[/\\ding\{119\}/g,"\u25D7"],[/\\Elzrvbull /g,"\u25D8"],[/\\Elzsqfl /g,"\u25E7"],[/\\Elzsqfr /g,"\u25E8"],[/\\Elzsqfse /g,"\u25EA"],[/\\bigcirc /g,"\u25EF"],[/\\ding\{72\}/g,"\u2605"],[/\\ding\{73\}/g,"\u2606"],[/\\ding\{37\}/g,"\u260E"],[/\\ding\{42\}/g,"\u261B"],[/\\ding\{43\}/g,"\u261E"],[/\\rightmoon /g,"\u263E"],[/\\mercury /g,"\u263F"],[/\\venus /g,"\u2640"],[/\\male /g,"\u2642"],[/\\jupiter /g,"\u2643"],[/\\saturn /g,"\u2644"],[/\\uranus /g,"\u2645"],[/\\neptune /g,"\u2646"],[/\\pluto /g,"\u2647"],[/\\aries /g,"\u2648"],[/\\taurus /g,"\u2649"],[/\\gemini /g,"\u264A"],[/\\cancer /g,"\u264B"],[/\\leo /g,"\u264C"],[/\\virgo /g,"\u264D"],[/\\libra /g,"\u264E"],[/\\scorpio /g,"\u264F"],[/\\sagittarius /g,"\u2650"],[/\\capricornus /g,"\u2651"],[/\\aquarius /g,"\u2652"],[/\\pisces /g,"\u2653"],[/\\ding\{171\}/g,"\u2660"],[/\\diamond /g,"\u2662"],[/\\ding\{168\}/g,"\u2663"],[/\\ding\{170\}/g,"\u2665"],[/\\ding\{169\}/g,"\u2666"],[/\\quarternote /g,"\u2669"],[/\\eighthnote /g,"\u266A"],[/\\flat /g,"\u266D"],[/\\natural /g,"\u266E"],[/\\sharp /g,"\u266F"],[/\\ding\{33\}/g,"\u2701"],[/\\ding\{34\}/g,"\u2702"],[/\\ding\{35\}/g,"\u2703"],[/\\ding\{36\}/g,"\u2704"],[/\\ding\{38\}/g,"\u2706"],[/\\ding\{39\}/g,"\u2707"],[/\\ding\{40\}/g,"\u2708"],[/\\ding\{41\}/g,"\u2709"],[/\\ding\{44\}/g,"\u270C"],[/\\ding\{45\}/g,"\u270D"],[/\\ding\{46\}/g,"\u270E"],[/\\ding\{47\}/g,"\u270F"],[/\\ding\{48\}/g,"\u2710"],[/\\ding\{49\}/g,"\u2711"],[/\\ding\{50\}/g,"\u2712"],[/\\ding\{51\}/g,"\u2713"],[/\\ding\{52\}/g,"\u2714"],[/\\ding\{53\}/g,"\u2715"],[/\\ding\{54\}/g,"\u2716"],[/\\ding\{55\}/g,"\u2717"],[/\\ding\{56\}/g,"\u2718"],[/\\ding\{57\}/g,"\u2719"],[/\\ding\{58\}/g,"\u271A"],[/\\ding\{59\}/g,"\u271B"],[/\\ding\{60\}/g,"\u271C"],[/\\ding\{61\}/g,"\u271D"],[/\\ding\{62\}/g,"\u271E"],[/\\ding\{63\}/g,"\u271F"],[/\\ding\{64\}/g,"\u2720"],[/\\ding\{65\}/g,"\u2721"],[/\\ding\{66\}/g,"\u2722"],[/\\ding\{67\}/g,"\u2723"],[/\\ding\{68\}/g,"\u2724"],[/\\ding\{69\}/g,"\u2725"],[/\\ding\{70\}/g,"\u2726"],[/\\ding\{71\}/g,"\u2727"],[/\\ding\{73\}/g,"\u2729"],[/\\ding\{74\}/g,"\u272A"],[/\\ding\{75\}/g,"\u272B"],[/\\ding\{76\}/g,"\u272C"],[/\\ding\{77\}/g,"\u272D"],[/\\ding\{78\}/g,"\u272E"],[/\\ding\{79\}/g,"\u272F"],[/\\ding\{80\}/g,"\u2730"],[/\\ding\{81\}/g,"\u2731"],[/\\ding\{82\}/g,"\u2732"],[/\\ding\{83\}/g,"\u2733"],[/\\ding\{84\}/g,"\u2734"],[/\\ding\{85\}/g,"\u2735"],[/\\ding\{86\}/g,"\u2736"],[/\\ding\{87\}/g,"\u2737"],[/\\ding\{88\}/g,"\u2738"],[/\\ding\{89\}/g,"\u2739"],[/\\ding\{90\}/g,"\u273A"],[/\\ding\{91\}/g,"\u273B"],[/\\ding\{92\}/g,"\u273C"],[/\\ding\{93\}/g,"\u273D"],[/\\ding\{94\}/g,"\u273E"],[/\\ding\{95\}/g,"\u273F"],[/\\ding\{96\}/g,"\u2740"],[/\\ding\{97\}/g,"\u2741"],[/\\ding\{98\}/g,"\u2742"],[/\\ding\{99\}/g,"\u2743"],[/\\ding\{100\}/g,"\u2744"],[/\\ding\{101\}/g,"\u2745"],[/\\ding\{102\}/g,"\u2746"],[/\\ding\{103\}/g,"\u2747"],[/\\ding\{104\}/g,"\u2748"],[/\\ding\{105\}/g,"\u2749"],[/\\ding\{106\}/g,"\u274A"],[/\\ding\{107\}/g,"\u274B"],[/\\ding\{109\}/g,"\u274D"],[/\\ding\{111\}/g,"\u274F"],[/\\ding\{112\}/g,"\u2750"],[/\\ding\{113\}/g,"\u2751"],[/\\ding\{114\}/g,"\u2752"],[/\\ding\{118\}/g,"\u2756"],[/\\ding\{120\}/g,"\u2758"],[/\\ding\{121\}/g,"\u2759"],[/\\ding\{122\}/g,"\u275A"],[/\\ding\{123\}/g,"\u275B"],[/\\ding\{124\}/g,"\u275C"],[/\\ding\{125\}/g,"\u275D"],[/\\ding\{126\}/g,"\u275E"],[/\\ding\{161\}/g,"\u2761"],[/\\ding\{162\}/g,"\u2762"],[/\\ding\{163\}/g,"\u2763"],[/\\ding\{164\}/g,"\u2764"],[/\\ding\{165\}/g,"\u2765"],[/\\ding\{166\}/g,"\u2766"],[/\\ding\{167\}/g,"\u2767"],[/\\ding\{182\}/g,"\u2776"],[/\\ding\{183\}/g,"\u2777"],[/\\ding\{184\}/g,"\u2778"],[/\\ding\{185\}/g,"\u2779"],[/\\ding\{186\}/g,"\u277A"],[/\\ding\{187\}/g,"\u277B"],[/\\ding\{188\}/g,"\u277C"],[/\\ding\{189\}/g,"\u277D"],[/\\ding\{190\}/g,"\u277E"],[/\\ding\{191\}/g,"\u277F"],[/\\ding\{192\}/g,"\u2780"],[/\\ding\{193\}/g,"\u2781"],[/\\ding\{194\}/g,"\u2782"],[/\\ding\{195\}/g,"\u2783"],[/\\ding\{196\}/g,"\u2784"],[/\\ding\{197\}/g,"\u2785"],[/\\ding\{198\}/g,"\u2786"],[/\\ding\{199\}/g,"\u2787"],[/\\ding\{200\}/g,"\u2788"],[/\\ding\{201\}/g,"\u2789"],[/\\ding\{202\}/g,"\u278A"],[/\\ding\{203\}/g,"\u278B"],[/\\ding\{204\}/g,"\u278C"],[/\\ding\{205\}/g,"\u278D"],[/\\ding\{206\}/g,"\u278E"],[/\\ding\{207\}/g,"\u278F"],[/\\ding\{208\}/g,"\u2790"],[/\\ding\{209\}/g,"\u2791"],[/\\ding\{210\}/g,"\u2792"],[/\\ding\{211\}/g,"\u2793"],[/\\ding\{212\}/g,"\u2794"],[/\\ding\{216\}/g,"\u2798"],[/\\ding\{217\}/g,"\u2799"],[/\\ding\{218\}/g,"\u279A"],[/\\ding\{219\}/g,"\u279B"],[/\\ding\{220\}/g,"\u279C"],[/\\ding\{221\}/g,"\u279D"],[/\\ding\{222\}/g,"\u279E"],[/\\ding\{223\}/g,"\u279F"],[/\\ding\{224\}/g,"\u27A0"],[/\\ding\{225\}/g,"\u27A1"],[/\\ding\{226\}/g,"\u27A2"],[/\\ding\{227\}/g,"\u27A3"],[/\\ding\{228\}/g,"\u27A4"],[/\\ding\{229\}/g,"\u27A5"],[/\\ding\{230\}/g,"\u27A6"],[/\\ding\{231\}/g,"\u27A7"],[/\\ding\{232\}/g,"\u27A8"],[/\\ding\{233\}/g,"\u27A9"],[/\\ding\{234\}/g,"\u27AA"],[/\\ding\{235\}/g,"\u27AB"],[/\\ding\{236\}/g,"\u27AC"],[/\\ding\{237\}/g,"\u27AD"],[/\\ding\{238\}/g,"\u27AE"],[/\\ding\{239\}/g,"\u27AF"],[/\\ding\{241\}/g,"\u27B1"],[/\\ding\{242\}/g,"\u27B2"],[/\\ding\{243\}/g,"\u27B3"],[/\\ding\{244\}/g,"\u27B4"],[/\\ding\{245\}/g,"\u27B5"],[/\\ding\{246\}/g,"\u27B6"],[/\\ding\{247\}/g,"\u27B7"],[/\\ding\{248\}/g,"\u27B8"],[/\\ding\{249\}/g,"\u27B9"],[/\\ding\{250\}/g,"\u27BA"],[/\\ding\{251\}/g,"\u27BB"],[/\\ding\{252\}/g,"\u27BC"],[/\\ding\{253\}/g,"\u27BD"],[/\\ding\{254\}/g,"\u27BE"],[/\\longleftarrow /g,"\u27F5"],[/\\longrightarrow /g,"\u27F6"],[/\\longleftrightarrow /g,"\u27F7"],[/\\Longleftarrow /g,"\u27F8"],[/\\Longrightarrow /g,"\u27F9"],[/\\Longleftrightarrow /g,"\u27FA"],[/\\longmapsto /g,"\u27FC"],[/\\sim\\joinrel\\leadsto/g,"\u27FF"],[/\\ElsevierGlyph\{E212\}/g,"\u2905"],[/\\UpArrowBar /g,"\u2912"],[/\\DownArrowBar /g,"\u2913"],[/\\ElsevierGlyph\{E20C\}/g,"\u2923"],[/\\ElsevierGlyph\{E20D\}/g,"\u2924"],[/\\ElsevierGlyph\{E20B\}/g,"\u2925"],[/\\ElsevierGlyph\{E20A\}/g,"\u2926"],[/\\ElsevierGlyph\{E211\}/g,"\u2927"],[/\\ElsevierGlyph\{E20E\}/g,"\u2928"],[/\\ElsevierGlyph\{E20F\}/g,"\u2929"],[/\\ElsevierGlyph\{E210\}/g,"\u292A"],[/\\ElsevierGlyph\{E21C\}/g,"\u2933"],[/\\ElsevierGlyph\{E21D\}/g,"\u2933-00338"],[/\\ElsevierGlyph\{E21A\}/g,"\u2936"],[/\\ElsevierGlyph\{E219\}/g,"\u2937"],[/\\Elolarr /g,"\u2940"],[/\\Elorarr /g,"\u2941"],[/\\ElzRlarr /g,"\u2942"],[/\\ElzrLarr /g,"\u2944"],[/\\Elzrarrx /g,"\u2947"],[/\\LeftRightVector /g,"\u294E"],[/\\RightUpDownVector /g,"\u294F"],[/\\DownLeftRightVector /g,"\u2950"],[/\\LeftUpDownVector /g,"\u2951"],[/\\LeftVectorBar /g,"\u2952"],[/\\RightVectorBar /g,"\u2953"],[/\\RightUpVectorBar /g,"\u2954"],[/\\RightDownVectorBar /g,"\u2955"],[/\\DownLeftVectorBar /g,"\u2956"],[/\\DownRightVectorBar /g,"\u2957"],[/\\LeftUpVectorBar /g,"\u2958"],[/\\LeftDownVectorBar /g,"\u2959"],[/\\LeftTeeVector /g,"\u295A"],[/\\RightTeeVector /g,"\u295B"],[/\\RightUpTeeVector /g,"\u295C"],[/\\RightDownTeeVector /g,"\u295D"],[/\\DownLeftTeeVector /g,"\u295E"],[/\\DownRightTeeVector /g,"\u295F"],[/\\LeftUpTeeVector /g,"\u2960"],[/\\LeftDownTeeVector /g,"\u2961"],[/\\UpEquilibrium /g,"\u296E"],[/\\ReverseUpEquilibrium /g,"\u296F"],[/\\RoundImplies /g,"\u2970"],[/\\ElsevierGlyph\{E214\}/g,"\u297C"],[/\\ElsevierGlyph\{E215\}/g,"\u297D"],[/\\Elztfnc /g,"\u2980"],[/\\ElsevierGlyph\{3018\}/g,"\u2985"],[/\\Elroang /g,"\u2986"],[/\\ElsevierGlyph\{E291\}/g,"\u2994"],[/\\Elzddfnc /g,"\u2999"],[/\\Angle /g,"\u299C"],[/\\Elzlpargt /g,"\u29A0"],[/\\ElsevierGlyph\{E260\}/g,"\u29B5"],[/\\ElsevierGlyph\{E61B\}/g,"\u29B6"],[/\\ElzLap /g,"\u29CA"],[/\\Elzdefas /g,"\u29CB"],[/\\LeftTriangleBar /g,"\u29CF"],[/\\NotLeftTriangleBar /g,"\u29CF-00338"],[/\\RightTriangleBar /g,"\u29D0"],[/\\NotRightTriangleBar /g,"\u29D0-00338"],[/\\ElsevierGlyph\{E372\}/g,"\u29DC"],[/\\blacklozenge /g,"\u29EB"],[/\\RuleDelayed /g,"\u29F4"],[/\\Elxuplus /g,"\u2A04"],[/\\ElzThr /g,"\u2A05"],[/\\Elxsqcup /g,"\u2A06"],[/\\ElzInf /g,"\u2A07"],[/\\ElzSup /g,"\u2A08"],[/\\ElzCint /g,"\u2A0D"],[/\\clockoint /g,"\u2A0F"],[/\\ElsevierGlyph\{E395\}/g,"\u2A10"],[/\\sqrint /g,"\u2A16"],[/\\ElsevierGlyph\{E25A\}/g,"\u2A25"],[/\\ElsevierGlyph\{E25B\}/g,"\u2A2A"],[/\\ElsevierGlyph\{E25C\}/g,"\u2A2D"],[/\\ElsevierGlyph\{E25D\}/g,"\u2A2E"],[/\\ElzTimes /g,"\u2A2F"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A34"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A35"],[/\\ElsevierGlyph\{E259\}/g,"\u2A3C"],[/\\amalg /g,"\u2A3F"],[/\\ElzAnd /g,"\u2A53"],[/\\ElzOr /g,"\u2A54"],[/\\ElsevierGlyph\{E36E\}/g,"\u2A55"],[/\\ElOr /g,"\u2A56"],[/\\perspcorrespond /g,"\u2A5E"],[/\\Elzminhat /g,"\u2A5F"],[/\\ElsevierGlyph\{225A\}/g,"\u2A63"],[/\\stackrel\{*\}\{=\}/g,"\u2A6E"],[/\\Equal /g,"\u2A75"],[/\\leqslant /g,"\u2A7D"],[/\\nleqslant /g,"\u2A7D-00338"],[/\\geqslant /g,"\u2A7E"],[/\\ngeqslant /g,"\u2A7E-00338"],[/\\lessapprox /g,"\u2A85"],[/\\gtrapprox /g,"\u2A86"],[/\\lneq /g,"\u2A87"],[/\\gneq /g,"\u2A88"],[/\\lnapprox /g,"\u2A89"],[/\\gnapprox /g,"\u2A8A"],[/\\lesseqqgtr /g,"\u2A8B"],[/\\gtreqqless /g,"\u2A8C"],[/\\eqslantless /g,"\u2A95"],[/\\eqslantgtr /g,"\u2A96"],[/\\Pisymbol\{ppi020\}\{117\}/g,"\u2A9D"],[/\\Pisymbol\{ppi020\}\{105\}/g,"\u2A9E"],[/\\NestedLessLess /g,"\u2AA1"],[/\\NotNestedLessLess /g,"\u2AA1-00338"],[/\\NestedGreaterGreater /g,"\u2AA2"],[/\\NotNestedGreaterGreater /g,"\u2AA2-00338"],[/\\preceq /g,"\u2AAF"],[/\\not\\preceq /g,"\u2AAF-00338"],[/\\succeq /g,"\u2AB0"],[/\\not\\succeq /g,"\u2AB0-00338"],[/\\precneqq /g,"\u2AB5"],[/\\succneqq /g,"\u2AB6"],[/\\precapprox /g,"\u2AB7"],[/\\succapprox /g,"\u2AB8"],[/\\precnapprox /g,"\u2AB9"],[/\\succnapprox /g,"\u2ABA"],[/\\subseteqq /g,"\u2AC5"],[/\\nsubseteqq /g,"\u2AC5-00338"],[/\\supseteqq /g,"\u2AC6"],[/\\nsupseteqq/g,"\u2AC6-00338"],[/\\subsetneqq /g,"\u2ACB"],[/\\supsetneqq /g,"\u2ACC"],[/\\ElsevierGlyph\{E30D\}/g,"\u2AEB"],[/\\Elztdcol /g,"\u2AF6"],[/\\ElsevierGlyph\{300A\}/g,"\u300A"],[/\\ElsevierGlyph\{300B\}/g,"\u300B"],[/\\ElsevierGlyph\{3018\}/g,"\u3018"],[/\\ElsevierGlyph\{3019\}/g,"\u3019"],[/\\openbracketleft /g,"\u301A"],[/\\openbracketright /g,"\u301B"]];return this}if(typeof module!=="undefined"&&module.exports){module.exports=BibtexParser};
\ No newline at end of file
+function BibtexParser(c){if(typeof c=="string"){var d={};var a=[];function b(f){a.push(f)}var e=BibtexParser.call(d,b);e.parse(c);return{entries:a,errors:e.getErrors()}}if(typeof c!="function"){throw"Invalid parser construction."}this.STATES_={ENTRY_OR_JUNK:0,OBJECT_TYPE:1,ENTRY_KEY:2,KV_KEY:3,EQUALS:4,KV_VALUE:5};this.DATA_={};this.CALLBACK_=c;this.CHAR_=0;this.LINE_=1;this.CHAR_IN_LINE_=0;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={};this.SKIPTILLEOL_=false;this.VALBRACES_=null;this.BRACETYPE_=null;this.BRACECOUNT_=0;this.STATE_=this.STATES_.ENTRY_OR_JUNK;this.ERRORS_=[];this.ENTRY_TYPES_={inproceedings:1,proceedings:2,article:3,techreport:4,misc:5,mastersthesis:6,book:7,phdthesis:8,incollection:9,unpublished:10,inbook:11,manual:12,periodical:13,booklet:14,masterthesis:15,conference:16,data:999};this.MACROS_={jan:"January",feb:"February",mar:"March",apr:"April",may:"May",jun:"June",jul:"July",aug:"August",sep:"September",oct:"October",nov:"November",dec:"December",Jan:"January",Feb:"February",Mar:"March",Apr:"April",May:"May",Jun:"June",Jul:"July",Aug:"August",Sep:"September",Oct:"October",Nov:"November",Dec:"December"};this.getErrors=function(){return this.ERRORS_};this.parse=function(f){for(var g=0;g<f.length;g++){this.processCharacter_(f[g])}};this.error_=function(f){this.ERRORS_.push([this.LINE_,this.CHAR_IN_LINE_,this.CHAR_,f])};this.processEntry_=function(){var h=this.DATA_;if(h.Fields){for(var k in h.Fields){var p=h.Fields[k];for(var j=0;j<this.CHARCONV_.length;j++){var q=this.CHARCONV_[j][0];var n=this.CHARCONV_[j][1];p=p.replace(q,n)}p=p.replace(/[\n\r\t]/g," ").replace(/\s\s+/g," ").replace(/^\s+|\s+$/g,"");var l=p.length;var g="";for(var j=0;j<l;j++){var m=p[j];var o=false;if(m=="\\"&&j<l-1){m=p[++j]}else{if(m=="{"||m=="}"){o=true}}if(!o){g+=m}}h.Fields[k]=g}}if(h.ObjectType=="string"){for(var k in h.Fields){this.MACROS_[k]=h.Fields[k]}}else{this.CALLBACK_(h)}};this.processCharacter_=function(l){this.CHAR_++;this.CHAR_IN_LINE_++;if(l=="\n"){this.LINE_++;this.CHAR_IN_LINE_=1}if(this.SKIPTILLEOL_){if(l=="\n"){this.SKIPTILLEOL_=false}return}if(this.SKIPCOMMENT_&&l=="%"){this.SKIPTILLEOL_=true;return}if(this.SKIPWS_&&/\s/.test(l)){return}this.SKIPWS_=false;this.SKIPCOMMENT_=false;this.SKIPTILLEOL_=false;var f=true;while(f){f=false;switch(this.STATE_){case this.STATES_.ENTRY_OR_JUNK:if(l=="@"){this.STATE_=this.STATES_.OBJECT_TYPE;this.DATA_={ObjectType:""}}this.BRACETYPE_=null;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break;case this.STATES_.OBJECT_TYPE:if(/[A-Za-z]/.test(l)){this.DATA_.ObjectType+=l.toLowerCase();this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{var i=this.DATA_.ObjectType;if(i=="comment"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i=="string"){this.DATA_.ObjectType=i;this.DATA_.Fields={};this.BRACETYPE_=l;this.BRACECOUNT_=1;this.STATE_=this.STATES_.KV_KEY;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={Key:""}}else{if(i=="preamble"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i in this.ENTRY_TYPES_){this.DATA_.ObjectType="entry";this.DATA_.EntryType=i;this.DATA_.EntryKey="";this.STATE_=this.STATES_.ENTRY_KEY;f=true}else{this.error_('Unrecognized object type: "'+this.DATA_.ObjectType+'"');this.STATE_=this.STATES_.ENTRY_OR_JUNK}}}}}break;case this.STATES_.ENTRY_KEY:if((l==="{"||l==="(")&&this.BRACETYPE_==null){this.BRACETYPE_=l;this.BRACECOUNT_=1;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break}if(/[,%\s]/.test(l)){if(this.DATA_.EntryKey.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{if(this.BRACETYPE_==null){this.error_("No opening brace for object.");this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;f=true;this.STATE_=this.STATES_.KV_KEY;this.PARSETMP_.Key="";this.DATA_.Fields={}}}}else{this.DATA_.EntryKey+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}break;case this.STATES_.KV_KEY:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(/[\-A-Za-z:]/.test(l)){this.PARSETMP_.Key+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{if(this.PARSETMP_.Key.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.EQUALS;f=true}}break;case this.STATES_.EQUALS:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.error_('Key-value pair has key "'+this.PARSETMP_.Key+'", but no value.');this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(l=="="){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_VALUE;this.PARSETMP_.Value="";this.VALBRACES_={'"':[],"{":[]}}break;case this.STATES_.KV_VALUE:var k=this.VALBRACES_;var j=this.PARSETMP_.Value;var h=false;if(l=='"'||l=="{"||l=="}"||l==","){if(l==","){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}h=true}}if(l=='"'){if(0===k['"'].length+k["{"].length){k['"'].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false;break}if(k['"'].length==1&&k["{"].length==0&&(j.length==0||j[j.length-1]!="\\")){h=true}else{}}if(l=="{"){if(j.length==0||j[j.length-1]!="\\"){k["{"].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{}}if(l=="}"){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}f=true;h=true}else{if(j.length==0||j[j.length-1]!="\\"){if(k["{"].length>0){k["{"].splice(k["{"].length-1,1);if(0==k["{"].length+k['"'].length){h=true}else{}}}else{}}}}if(h){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_KEY;this.DATA_.Fields[this.PARSETMP_.Key]=this.PARSETMP_.Value;this.PARSETMP_={Key:""};this.VALBRACES_=null}else{this.PARSETMP_.Value+=l}break}}};this.CHARCONV_=[[/\\space /g,"\u0020"],[/\\textdollar /g,"\u0024"],[/\\textquotesingle /g,"\u0027"],[/\\ast /g,"\u002A"],[/\\textbackslash /g,"\u005C"],[/\\\^\{\}/g,"\u005E"],[/\\textasciigrave /g,"\u0060"],[/\\lbrace /g,"\u007B"],[/\\vert /g,"\u007C"],[/\\rbrace /g,"\u007D"],[/\\textasciitilde /g,"\u007E"],[/\\textexclamdown /g,"\u00A1"],[/\\textcent /g,"\u00A2"],[/\\textsterling /g,"\u00A3"],[/\\textcurrency /g,"\u00A4"],[/\\textyen /g,"\u00A5"],[/\\textbrokenbar /g,"\u00A6"],[/\\textsection /g,"\u00A7"],[/\\textasciidieresis /g,"\u00A8"],[/\\textcopyright /g,"\u00A9"],[/\\textordfeminine /g,"\u00AA"],[/\\guillemotleft /g,"\u00AB"],[/\\lnot /g,"\u00AC"],[/\\textregistered /g,"\u00AE"],[/\\textasciimacron /g,"\u00AF"],[/\\textdegree /g,"\u00B0"],[/\\pm /g,"\u00B1"],[/\\textasciiacute /g,"\u00B4"],[/\\mathrm\{\\mu\}/g,"\u00B5"],[/\\textparagraph /g,"\u00B6"],[/\\cdot /g,"\u00B7"],[/\\c\{\}/g,"\u00B8"],[/\\textordmasculine /g,"\u00BA"],[/\\guillemotright /g,"\u00BB"],[/\\textonequarter /g,"\u00BC"],[/\\textonehalf /g,"\u00BD"],[/\\textthreequarters /g,"\u00BE"],[/\\textquestiondown /g,"\u00BF"],[/\\`\{A\}/g,"\u00C0"],[/\\'\{A\}/g,"\u00C1"],[/\\\^\{A\}/g,"\u00C2"],[/\\~\{A\}/g,"\u00C3"],[/\\"\{A\}/g,"\u00C4"],[/\\AA /g,"\u00C5"],[/\\AE /g,"\u00C6"],[/\\c\{C\}/g,"\u00C7"],[/\\`\{E\}/g,"\u00C8"],[/\\'\{E\}/g,"\u00C9"],[/\\\^\{E\}/g,"\u00CA"],[/\\"\{E\}/g,"\u00CB"],[/\\`\{I\}/g,"\u00CC"],[/\\'\{I\}/g,"\u00CD"],[/\\\^\{I\}/g,"\u00CE"],[/\\"\{I\}/g,"\u00CF"],[/\\DH /g,"\u00D0"],[/\\~\{N\}/g,"\u00D1"],[/\\`\{O\}/g,"\u00D2"],[/\\'\{O\}/g,"\u00D3"],[/\\\^\{O\}/g,"\u00D4"],[/\\~\{O\}/g,"\u00D5"],[/\\"\{O\}/g,"\u00D6"],[/\\texttimes /g,"\u00D7"],[/\\O /g,"\u00D8"],[/\\`\{U\}/g,"\u00D9"],[/\\'\{U\}/g,"\u00DA"],[/\\\^\{U\}/g,"\u00DB"],[/\\"\{U\}/g,"\u00DC"],[/\\'\{Y\}/g,"\u00DD"],[/\\TH /g,"\u00DE"],[/\\ss /g,"\u00DF"],[/\\`\{a\}/g,"\u00E0"],[/\\'\{a\}/g,"\u00E1"],[/\\\^\{a\}/g,"\u00E2"],[/\\~\{a\}/g,"\u00E3"],[/\\"\{a\}/g,"\u00E4"],[/\\aa /g,"\u00E5"],[/\\ae /g,"\u00E6"],[/\\c\{c\}/g,"\u00E7"],[/\\`\{e\}/g,"\u00E8"],[/\\'\{e\}/g,"\u00E9"],[/\\\^\{e\}/g,"\u00EA"],[/\\"\{e\}/g,"\u00EB"],[/\\`\{\\i\}/g,"\u00EC"],[/\\'\{\\i\}/g,"\u00ED"],[/\\\^\{\\i\}/g,"\u00EE"],[/\\"\{\\i\}/g,"\u00EF"],[/\\dh /g,"\u00F0"],[/\\~\{n\}/g,"\u00F1"],[/\\`\{o\}/g,"\u00F2"],[/\\'\{o\}/g,"\u00F3"],[/\\\^\{o\}/g,"\u00F4"],[/\\~\{o\}/g,"\u00F5"],[/\\"\{o\}/g,"\u00F6"],[/\\div /g,"\u00F7"],[/\\o /g,"\u00F8"],[/\\`\{u\}/g,"\u00F9"],[/\\'\{u\}/g,"\u00FA"],[/\\\^\{u\}/g,"\u00FB"],[/\\"\{u\}/g,"\u00FC"],[/\\'\{y\}/g,"\u00FD"],[/\\th /g,"\u00FE"],[/\\"\{y\}/g,"\u00FF"],[/\\=\{A\}/g,"\u0100"],[/\\=\{a\}/g,"\u0101"],[/\\u\{A\}/g,"\u0102"],[/\\u\{a\}/g,"\u0103"],[/\\k\{A\}/g,"\u0104"],[/\\k\{a\}/g,"\u0105"],[/\\'\{C\}/g,"\u0106"],[/\\'\{c\}/g,"\u0107"],[/\\\^\{C\}/g,"\u0108"],[/\\\^\{c\}/g,"\u0109"],[/\\.\{C\}/g,"\u010A"],[/\\.\{c\}/g,"\u010B"],[/\\v\{C\}/g,"\u010C"],[/\\v\{c\}/g,"\u010D"],[/\\v\{D\}/g,"\u010E"],[/\\v\{d\}/g,"\u010F"],[/\\DJ /g,"\u0110"],[/\\dj /g,"\u0111"],[/\\=\{E\}/g,"\u0112"],[/\\=\{e\}/g,"\u0113"],[/\\u\{E\}/g,"\u0114"],[/\\u\{e\}/g,"\u0115"],[/\\.\{E\}/g,"\u0116"],[/\\.\{e\}/g,"\u0117"],[/\\k\{E\}/g,"\u0118"],[/\\k\{e\}/g,"\u0119"],[/\\v\{E\}/g,"\u011A"],[/\\v\{e\}/g,"\u011B"],[/\\\^\{G\}/g,"\u011C"],[/\\\^\{g\}/g,"\u011D"],[/\\u\{G\}/g,"\u011E"],[/\\u\{g\}/g,"\u011F"],[/\\.\{G\}/g,"\u0120"],[/\\.\{g\}/g,"\u0121"],[/\\c\{G\}/g,"\u0122"],[/\\c\{g\}/g,"\u0123"],[/\\\^\{H\}/g,"\u0124"],[/\\\^\{h\}/g,"\u0125"],[/\\Elzxh /g,"\u0127"],[/\\~\{I\}/g,"\u0128"],[/\\~\{\\i\}/g,"\u0129"],[/\\=\{I\}/g,"\u012A"],[/\\=\{\\i\}/g,"\u012B"],[/\\u\{I\}/g,"\u012C"],[/\\u\{\\i\}/g,"\u012D"],[/\\k\{I\}/g,"\u012E"],[/\\k\{i\}/g,"\u012F"],[/\\.\{I\}/g,"\u0130"],[/\\i /g,"\u0131"],[/\\\^\{J\}/g,"\u0134"],[/\\\^\{\\j\}/g,"\u0135"],[/\\c\{K\}/g,"\u0136"],[/\\c\{k\}/g,"\u0137"],[/\\'\{L\}/g,"\u0139"],[/\\'\{l\}/g,"\u013A"],[/\\c\{L\}/g,"\u013B"],[/\\c\{l\}/g,"\u013C"],[/\\v\{L\}/g,"\u013D"],[/\\v\{l\}/g,"\u013E"],[/\\L /g,"\u0141"],[/\\l /g,"\u0142"],[/\\'\{N\}/g,"\u0143"],[/\\'\{n\}/g,"\u0144"],[/\\c\{N\}/g,"\u0145"],[/\\c\{n\}/g,"\u0146"],[/\\v\{N\}/g,"\u0147"],[/\\v\{n\}/g,"\u0148"],[/\\NG /g,"\u014A"],[/\\ng /g,"\u014B"],[/\\=\{O\}/g,"\u014C"],[/\\=\{o\}/g,"\u014D"],[/\\u\{O\}/g,"\u014E"],[/\\u\{o\}/g,"\u014F"],[/\\H\{O\}/g,"\u0150"],[/\\H\{o\}/g,"\u0151"],[/\\OE /g,"\u0152"],[/\\oe /g,"\u0153"],[/\\'\{R\}/g,"\u0154"],[/\\'\{r\}/g,"\u0155"],[/\\c\{R\}/g,"\u0156"],[/\\c\{r\}/g,"\u0157"],[/\\v\{R\}/g,"\u0158"],[/\\v\{r\}/g,"\u0159"],[/\\'\{S\}/g,"\u015A"],[/\\'\{s\}/g,"\u015B"],[/\\\^\{S\}/g,"\u015C"],[/\\\^\{s\}/g,"\u015D"],[/\\c\{S\}/g,"\u015E"],[/\\c\{s\}/g,"\u015F"],[/\\v\{S\}/g,"\u0160"],[/\\v\{s\}/g,"\u0161"],[/\\c\{T\}/g,"\u0162"],[/\\c\{t\}/g,"\u0163"],[/\\v\{T\}/g,"\u0164"],[/\\v\{t\}/g,"\u0165"],[/\\~\{U\}/g,"\u0168"],[/\\~\{u\}/g,"\u0169"],[/\\=\{U\}/g,"\u016A"],[/\\=\{u\}/g,"\u016B"],[/\\u\{U\}/g,"\u016C"],[/\\u\{u\}/g,"\u016D"],[/\\r\{U\}/g,"\u016E"],[/\\r\{u\}/g,"\u016F"],[/\\H\{U\}/g,"\u0170"],[/\\H\{u\}/g,"\u0171"],[/\\k\{U\}/g,"\u0172"],[/\\k\{u\}/g,"\u0173"],[/\\\^\{W\}/g,"\u0174"],[/\\\^\{w\}/g,"\u0175"],[/\\\^\{Y\}/g,"\u0176"],[/\\\^\{y\}/g,"\u0177"],[/\\"\{Y\}/g,"\u0178"],[/\\'\{Z\}/g,"\u0179"],[/\\'\{z\}/g,"\u017A"],[/\\.\{Z\}/g,"\u017B"],[/\\.\{z\}/g,"\u017C"],[/\\v\{Z\}/g,"\u017D"],[/\\v\{z\}/g,"\u017E"],[/\\texthvlig /g,"\u0195"],[/\\textnrleg /g,"\u019E"],[/\\eth /g,"\u01AA"],[/\\textdoublepipe /g,"\u01C2"],[/\\'\{g\}/g,"\u01F5"],[/\\Elztrna /g,"\u0250"],[/\\Elztrnsa /g,"\u0252"],[/\\Elzopeno /g,"\u0254"],[/\\Elzrtld /g,"\u0256"],[/\\Elzschwa /g,"\u0259"],[/\\varepsilon /g,"\u025B"],[/\\Elzpgamma /g,"\u0263"],[/\\Elzpbgam /g,"\u0264"],[/\\Elztrnh /g,"\u0265"],[/\\Elzbtdl /g,"\u026C"],[/\\Elzrtll /g,"\u026D"],[/\\Elztrnm /g,"\u026F"],[/\\Elztrnmlr /g,"\u0270"],[/\\Elzltlmr /g,"\u0271"],[/\\Elzltln /g,"\u0272"],[/\\Elzrtln /g,"\u0273"],[/\\Elzclomeg /g,"\u0277"],[/\\textphi /g,"\u0278"],[/\\Elztrnr /g,"\u0279"],[/\\Elztrnrl /g,"\u027A"],[/\\Elzrttrnr /g,"\u027B"],[/\\Elzrl /g,"\u027C"],[/\\Elzrtlr /g,"\u027D"],[/\\Elzfhr /g,"\u027E"],[/\\Elzrtls /g,"\u0282"],[/\\Elzesh /g,"\u0283"],[/\\Elztrnt /g,"\u0287"],[/\\Elzrtlt /g,"\u0288"],[/\\Elzpupsil /g,"\u028A"],[/\\Elzpscrv /g,"\u028B"],[/\\Elzinvv /g,"\u028C"],[/\\Elzinvw /g,"\u028D"],[/\\Elztrny /g,"\u028E"],[/\\Elzrtlz /g,"\u0290"],[/\\Elzyogh /g,"\u0292"],[/\\Elzglst /g,"\u0294"],[/\\Elzreglst /g,"\u0295"],[/\\Elzinglst /g,"\u0296"],[/\\textturnk /g,"\u029E"],[/\\Elzdyogh /g,"\u02A4"],[/\\Elztesh /g,"\u02A7"],[/\\textasciicaron /g,"\u02C7"],[/\\Elzverts /g,"\u02C8"],[/\\Elzverti /g,"\u02CC"],[/\\Elzlmrk /g,"\u02D0"],[/\\Elzhlmrk /g,"\u02D1"],[/\\Elzsbrhr /g,"\u02D2"],[/\\Elzsblhr /g,"\u02D3"],[/\\Elzrais /g,"\u02D4"],[/\\Elzlow /g,"\u02D5"],[/\\textasciibreve /g,"\u02D8"],[/\\textperiodcentered /g,"\u02D9"],[/\\r\{\}/g,"\u02DA"],[/\\k\{\}/g,"\u02DB"],[/\\texttildelow /g,"\u02DC"],[/\\H\{\}/g,"\u02DD"],[/\\tone\{55\}/g,"\u02E5"],[/\\tone\{44\}/g,"\u02E6"],[/\\tone\{33\}/g,"\u02E7"],[/\\tone\{22\}/g,"\u02E8"],[/\\tone\{11\}/g,"\u02E9"],[/\\cyrchar\\C/g,"\u030F"],[/\\Elzpalh /g,"\u0321"],[/\\Elzrh /g,"\u0322"],[/\\Elzsbbrg /g,"\u032A"],[/\\Elzxl /g,"\u0335"],[/\\Elzbar /g,"\u0336"],[/\\'\{A\}/g,"\u0386"],[/\\'\{E\}/g,"\u0388"],[/\\'\{H\}/g,"\u0389"],[/\\'\{\}\{I\}/g,"\u038A"],[/\\'\{\}O/g,"\u038C"],[/\\mathrm\{'Y\}/g,"\u038E"],[/\\mathrm\{'\\Omega\}/g,"\u038F"],[/\\acute\{\\ddot\{\\iota\}\}/g,"\u0390"],[/\\Alpha /g,"\u0391"],[/\\Beta /g,"\u0392"],[/\\Gamma /g,"\u0393"],[/\\Delta /g,"\u0394"],[/\\Epsilon /g,"\u0395"],[/\\Zeta /g,"\u0396"],[/\\Eta /g,"\u0397"],[/\\Theta /g,"\u0398"],[/\\Iota /g,"\u0399"],[/\\Kappa /g,"\u039A"],[/\\Lambda /g,"\u039B"],[/\\Xi /g,"\u039E"],[/\\Pi /g,"\u03A0"],[/\\Rho /g,"\u03A1"],[/\\Sigma /g,"\u03A3"],[/\\Tau /g,"\u03A4"],[/\\Upsilon /g,"\u03A5"],[/\\Phi /g,"\u03A6"],[/\\Chi /g,"\u03A7"],[/\\Psi /g,"\u03A8"],[/\\Omega /g,"\u03A9"],[/\\mathrm\{\\ddot\{I\}\}/g,"\u03AA"],[/\\mathrm\{\\ddot\{Y\}\}/g,"\u03AB"],[/\\'\{\$\\alpha\$\}/g,"\u03AC"],[/\\acute\{\\epsilon\}/g,"\u03AD"],[/\\acute\{\\eta\}/g,"\u03AE"],[/\\acute\{\\iota\}/g,"\u03AF"],[/\\acute\{\\ddot\{\\upsilon\}\}/g,"\u03B0"],[/\\alpha /g,"\u03B1"],[/\\beta /g,"\u03B2"],[/\\gamma /g,"\u03B3"],[/\\delta /g,"\u03B4"],[/\\epsilon /g,"\u03B5"],[/\\zeta /g,"\u03B6"],[/\\eta /g,"\u03B7"],[/\\texttheta /g,"\u03B8"],[/\\iota /g,"\u03B9"],[/\\kappa /g,"\u03BA"],[/\\lambda /g,"\u03BB"],[/\\mu /g,"\u03BC"],[/\\nu /g,"\u03BD"],[/\\xi /g,"\u03BE"],[/\\pi /g,"\u03C0"],[/\\rho /g,"\u03C1"],[/\\varsigma /g,"\u03C2"],[/\\sigma /g,"\u03C3"],[/\\tau /g,"\u03C4"],[/\\upsilon /g,"\u03C5"],[/\\varphi /g,"\u03C6"],[/\\chi /g,"\u03C7"],[/\\psi /g,"\u03C8"],[/\\omega /g,"\u03C9"],[/\\ddot\{\\iota\}/g,"\u03CA"],[/\\ddot\{\\upsilon\}/g,"\u03CB"],[/\\'\{o\}/g,"\u03CC"],[/\\acute\{\\upsilon\}/g,"\u03CD"],[/\\acute\{\\omega\}/g,"\u03CE"],[/\\Pisymbol\{ppi022\}\{87\}/g,"\u03D0"],[/\\textvartheta /g,"\u03D1"],[/\\Upsilon /g,"\u03D2"],[/\\phi /g,"\u03D5"],[/\\varpi /g,"\u03D6"],[/\\Stigma /g,"\u03DA"],[/\\Digamma /g,"\u03DC"],[/\\digamma /g,"\u03DD"],[/\\Koppa /g,"\u03DE"],[/\\Sampi /g,"\u03E0"],[/\\varkappa /g,"\u03F0"],[/\\varrho /g,"\u03F1"],[/\\textTheta /g,"\u03F4"],[/\\backepsilon /g,"\u03F6"],[/\\cyrchar\\CYRYO /g,"\u0401"],[/\\cyrchar\\CYRDJE /g,"\u0402"],[/\\cyrchar\{\\'\\CYRG\}/g,"\u0403"],[/\\cyrchar\\CYRIE /g,"\u0404"],[/\\cyrchar\\CYRDZE /g,"\u0405"],[/\\cyrchar\\CYRII /g,"\u0406"],[/\\cyrchar\\CYRYI /g,"\u0407"],[/\\cyrchar\\CYRJE /g,"\u0408"],[/\\cyrchar\\CYRLJE /g,"\u0409"],[/\\cyrchar\\CYRNJE /g,"\u040A"],[/\\cyrchar\\CYRTSHE /g,"\u040B"],[/\\cyrchar\{\\'\\CYRK\}/g,"\u040C"],[/\\cyrchar\\CYRUSHRT /g,"\u040E"],[/\\cyrchar\\CYRDZHE /g,"\u040F"],[/\\cyrchar\\CYRA /g,"\u0410"],[/\\cyrchar\\CYRB /g,"\u0411"],[/\\cyrchar\\CYRV /g,"\u0412"],[/\\cyrchar\\CYRG /g,"\u0413"],[/\\cyrchar\\CYRD /g,"\u0414"],[/\\cyrchar\\CYRE /g,"\u0415"],[/\\cyrchar\\CYRZH /g,"\u0416"],[/\\cyrchar\\CYRZ /g,"\u0417"],[/\\cyrchar\\CYRI /g,"\u0418"],[/\\cyrchar\\CYRISHRT /g,"\u0419"],[/\\cyrchar\\CYRK /g,"\u041A"],[/\\cyrchar\\CYRL /g,"\u041B"],[/\\cyrchar\\CYRM /g,"\u041C"],[/\\cyrchar\\CYRN /g,"\u041D"],[/\\cyrchar\\CYRO /g,"\u041E"],[/\\cyrchar\\CYRP /g,"\u041F"],[/\\cyrchar\\CYRR /g,"\u0420"],[/\\cyrchar\\CYRS /g,"\u0421"],[/\\cyrchar\\CYRT /g,"\u0422"],[/\\cyrchar\\CYRU /g,"\u0423"],[/\\cyrchar\\CYRF /g,"\u0424"],[/\\cyrchar\\CYRH /g,"\u0425"],[/\\cyrchar\\CYRC /g,"\u0426"],[/\\cyrchar\\CYRCH /g,"\u0427"],[/\\cyrchar\\CYRSH /g,"\u0428"],[/\\cyrchar\\CYRSHCH /g,"\u0429"],[/\\cyrchar\\CYRHRDSN /g,"\u042A"],[/\\cyrchar\\CYRERY /g,"\u042B"],[/\\cyrchar\\CYRSFTSN /g,"\u042C"],[/\\cyrchar\\CYREREV /g,"\u042D"],[/\\cyrchar\\CYRYU /g,"\u042E"],[/\\cyrchar\\CYRYA /g,"\u042F"],[/\\cyrchar\\cyra /g,"\u0430"],[/\\cyrchar\\cyrb /g,"\u0431"],[/\\cyrchar\\cyrv /g,"\u0432"],[/\\cyrchar\\cyrg /g,"\u0433"],[/\\cyrchar\\cyrd /g,"\u0434"],[/\\cyrchar\\cyre /g,"\u0435"],[/\\cyrchar\\cyrzh /g,"\u0436"],[/\\cyrchar\\cyrz /g,"\u0437"],[/\\cyrchar\\cyri /g,"\u0438"],[/\\cyrchar\\cyrishrt /g,"\u0439"],[/\\cyrchar\\cyrk /g,"\u043A"],[/\\cyrchar\\cyrl /g,"\u043B"],[/\\cyrchar\\cyrm /g,"\u043C"],[/\\cyrchar\\cyrn /g,"\u043D"],[/\\cyrchar\\cyro /g,"\u043E"],[/\\cyrchar\\cyrp /g,"\u043F"],[/\\cyrchar\\cyrr /g,"\u0440"],[/\\cyrchar\\cyrs /g,"\u0441"],[/\\cyrchar\\cyrt /g,"\u0442"],[/\\cyrchar\\cyru /g,"\u0443"],[/\\cyrchar\\cyrf /g,"\u0444"],[/\\cyrchar\\cyrh /g,"\u0445"],[/\\cyrchar\\cyrc /g,"\u0446"],[/\\cyrchar\\cyrch /g,"\u0447"],[/\\cyrchar\\cyrsh /g,"\u0448"],[/\\cyrchar\\cyrshch /g,"\u0449"],[/\\cyrchar\\cyrhrdsn /g,"\u044A"],[/\\cyrchar\\cyrery /g,"\u044B"],[/\\cyrchar\\cyrsftsn /g,"\u044C"],[/\\cyrchar\\cyrerev /g,"\u044D"],[/\\cyrchar\\cyryu /g,"\u044E"],[/\\cyrchar\\cyrya /g,"\u044F"],[/\\cyrchar\\cyryo /g,"\u0451"],[/\\cyrchar\\cyrdje /g,"\u0452"],[/\\cyrchar\{\\'\\cyrg\}/g,"\u0453"],[/\\cyrchar\\cyrie /g,"\u0454"],[/\\cyrchar\\cyrdze /g,"\u0455"],[/\\cyrchar\\cyrii /g,"\u0456"],[/\\cyrchar\\cyryi /g,"\u0457"],[/\\cyrchar\\cyrje /g,"\u0458"],[/\\cyrchar\\cyrlje /g,"\u0459"],[/\\cyrchar\\cyrnje /g,"\u045A"],[/\\cyrchar\\cyrtshe /g,"\u045B"],[/\\cyrchar\{\\'\\cyrk\}/g,"\u045C"],[/\\cyrchar\\cyrushrt /g,"\u045E"],[/\\cyrchar\\cyrdzhe /g,"\u045F"],[/\\cyrchar\\CYROMEGA /g,"\u0460"],[/\\cyrchar\\cyromega /g,"\u0461"],[/\\cyrchar\\CYRYAT /g,"\u0462"],[/\\cyrchar\\CYRIOTE /g,"\u0464"],[/\\cyrchar\\cyriote /g,"\u0465"],[/\\cyrchar\\CYRLYUS /g,"\u0466"],[/\\cyrchar\\cyrlyus /g,"\u0467"],[/\\cyrchar\\CYRIOTLYUS /g,"\u0468"],[/\\cyrchar\\cyriotlyus /g,"\u0469"],[/\\cyrchar\\CYRBYUS /g,"\u046A"],[/\\cyrchar\\CYRIOTBYUS /g,"\u046C"],[/\\cyrchar\\cyriotbyus /g,"\u046D"],[/\\cyrchar\\CYRKSI /g,"\u046E"],[/\\cyrchar\\cyrksi /g,"\u046F"],[/\\cyrchar\\CYRPSI /g,"\u0470"],[/\\cyrchar\\cyrpsi /g,"\u0471"],[/\\cyrchar\\CYRFITA /g,"\u0472"],[/\\cyrchar\\CYRIZH /g,"\u0474"],[/\\cyrchar\\CYRUK /g,"\u0478"],[/\\cyrchar\\cyruk /g,"\u0479"],[/\\cyrchar\\CYROMEGARND /g,"\u047A"],[/\\cyrchar\\cyromegarnd /g,"\u047B"],[/\\cyrchar\\CYROMEGATITLO /g,"\u047C"],[/\\cyrchar\\cyromegatitlo /g,"\u047D"],[/\\cyrchar\\CYROT /g,"\u047E"],[/\\cyrchar\\cyrot /g,"\u047F"],[/\\cyrchar\\CYRKOPPA /g,"\u0480"],[/\\cyrchar\\cyrkoppa /g,"\u0481"],[/\\cyrchar\\cyrthousands /g,"\u0482"],[/\\cyrchar\\cyrhundredthousands /g,"\u0488"],[/\\cyrchar\\cyrmillions /g,"\u0489"],[/\\cyrchar\\CYRSEMISFTSN /g,"\u048C"],[/\\cyrchar\\cyrsemisftsn /g,"\u048D"],[/\\cyrchar\\CYRRTICK /g,"\u048E"],[/\\cyrchar\\cyrrtick /g,"\u048F"],[/\\cyrchar\\CYRGUP /g,"\u0490"],[/\\cyrchar\\cyrgup /g,"\u0491"],[/\\cyrchar\\CYRGHCRS /g,"\u0492"],[/\\cyrchar\\cyrghcrs /g,"\u0493"],[/\\cyrchar\\CYRGHK /g,"\u0494"],[/\\cyrchar\\cyrghk /g,"\u0495"],[/\\cyrchar\\CYRZHDSC /g,"\u0496"],[/\\cyrchar\\cyrzhdsc /g,"\u0497"],[/\\cyrchar\\CYRZDSC /g,"\u0498"],[/\\cyrchar\\cyrzdsc /g,"\u0499"],[/\\cyrchar\\CYRKDSC /g,"\u049A"],[/\\cyrchar\\cyrkdsc /g,"\u049B"],[/\\cyrchar\\CYRKVCRS /g,"\u049C"],[/\\cyrchar\\cyrkvcrs /g,"\u049D"],[/\\cyrchar\\CYRKHCRS /g,"\u049E"],[/\\cyrchar\\cyrkhcrs /g,"\u049F"],[/\\cyrchar\\CYRKBEAK /g,"\u04A0"],[/\\cyrchar\\cyrkbeak /g,"\u04A1"],[/\\cyrchar\\CYRNDSC /g,"\u04A2"],[/\\cyrchar\\cyrndsc /g,"\u04A3"],[/\\cyrchar\\CYRNG /g,"\u04A4"],[/\\cyrchar\\cyrng /g,"\u04A5"],[/\\cyrchar\\CYRPHK /g,"\u04A6"],[/\\cyrchar\\cyrphk /g,"\u04A7"],[/\\cyrchar\\CYRABHHA /g,"\u04A8"],[/\\cyrchar\\cyrabhha /g,"\u04A9"],[/\\cyrchar\\CYRSDSC /g,"\u04AA"],[/\\cyrchar\\cyrsdsc /g,"\u04AB"],[/\\cyrchar\\CYRTDSC /g,"\u04AC"],[/\\cyrchar\\cyrtdsc /g,"\u04AD"],[/\\cyrchar\\CYRY /g,"\u04AE"],[/\\cyrchar\\cyry /g,"\u04AF"],[/\\cyrchar\\CYRYHCRS /g,"\u04B0"],[/\\cyrchar\\cyryhcrs /g,"\u04B1"],[/\\cyrchar\\CYRHDSC /g,"\u04B2"],[/\\cyrchar\\cyrhdsc /g,"\u04B3"],[/\\cyrchar\\CYRTETSE /g,"\u04B4"],[/\\cyrchar\\cyrtetse /g,"\u04B5"],[/\\cyrchar\\CYRCHRDSC /g,"\u04B6"],[/\\cyrchar\\cyrchrdsc /g,"\u04B7"],[/\\cyrchar\\CYRCHVCRS /g,"\u04B8"],[/\\cyrchar\\cyrchvcrs /g,"\u04B9"],[/\\cyrchar\\CYRSHHA /g,"\u04BA"],[/\\cyrchar\\cyrshha /g,"\u04BB"],[/\\cyrchar\\CYRABHCH /g,"\u04BC"],[/\\cyrchar\\cyrabhch /g,"\u04BD"],[/\\cyrchar\\CYRABHCHDSC /g,"\u04BE"],[/\\cyrchar\\cyrabhchdsc /g,"\u04BF"],[/\\cyrchar\\CYRpalochka /g,"\u04C0"],[/\\cyrchar\\CYRKHK /g,"\u04C3"],[/\\cyrchar\\cyrkhk /g,"\u04C4"],[/\\cyrchar\\CYRNHK /g,"\u04C7"],[/\\cyrchar\\cyrnhk /g,"\u04C8"],[/\\cyrchar\\CYRCHLDSC /g,"\u04CB"],[/\\cyrchar\\cyrchldsc /g,"\u04CC"],[/\\cyrchar\\CYRAE /g,"\u04D4"],[/\\cyrchar\\cyrae /g,"\u04D5"],[/\\cyrchar\\CYRSCHWA /g,"\u04D8"],[/\\cyrchar\\cyrschwa /g,"\u04D9"],[/\\cyrchar\\CYRABHDZE /g,"\u04E0"],[/\\cyrchar\\cyrabhdze /g,"\u04E1"],[/\\cyrchar\\CYROTLD /g,"\u04E8"],[/\\cyrchar\\cyrotld /g,"\u04E9"],[/\\hspace\{0.6em\}/g,"\u2002"],[/\\hspace\{1em\}/g,"\u2003"],[/\\hspace\{0.33em\}/g,"\u2004"],[/\\hspace\{0.25em\}/g,"\u2005"],[/\\hspace\{0.166em\}/g,"\u2006"],[/\\hphantom\{0\}/g,"\u2007"],[/\\hphantom\{,\}/g,"\u2008"],[/\\hspace\{0.167em\}/g,"\u2009"],[/\\mkern1mu /g,"\u200A"],[/\\textendash /g,"\u2013"],[/\\textemdash /g,"\u2014"],[/\\rule\{1em\}\{1pt\}/g,"\u2015"],[/\\Vert /g,"\u2016"],[/\\Elzreapos /g,"\u201B"],[/\\textquotedblleft /g,"\u201C"],[/\\textquotedblright /g,"\u201D"],[/\\textdagger /g,"\u2020"],[/\\textdaggerdbl /g,"\u2021"],[/\\textbullet /g,"\u2022"],[/\\ldots /g,"\u2026"],[/\\textperthousand /g,"\u2030"],[/\\textpertenthousand /g,"\u2031"],[/\\backprime /g,"\u2035"],[/\\guilsinglleft /g,"\u2039"],[/\\guilsinglright /g,"\u203A"],[/\\mkern4mu /g,"\u205F"],[/\\nolinebreak /g,"\u2060"],[/\\ensuremath\{\\Elzpes\}/g,"\u20A7"],[/\\mbox\{\\texteuro\} /g,"\u20AC"],[/\\dddot /g,"\u20DB"],[/\\ddddot /g,"\u20DC"],[/\\mathbb\{C\}/g,"\u2102"],[/\\mathscr\{g\}/g,"\u210A"],[/\\mathscr\{H\}/g,"\u210B"],[/\\mathfrak\{H\}/g,"\u210C"],[/\\mathbb\{H\}/g,"\u210D"],[/\\hslash /g,"\u210F"],[/\\mathscr\{I\}/g,"\u2110"],[/\\mathfrak\{I\}/g,"\u2111"],[/\\mathscr\{L\}/g,"\u2112"],[/\\mathscr\{l\}/g,"\u2113"],[/\\mathbb\{N\}/g,"\u2115"],[/\\cyrchar\\textnumero /g,"\u2116"],[/\\wp /g,"\u2118"],[/\\mathbb\{P\}/g,"\u2119"],[/\\mathbb\{Q\}/g,"\u211A"],[/\\mathscr\{R\}/g,"\u211B"],[/\\mathfrak\{R\}/g,"\u211C"],[/\\mathbb\{R\}/g,"\u211D"],[/\\Elzxrat /g,"\u211E"],[/\\texttrademark /g,"\u2122"],[/\\mathbb\{Z\}/g,"\u2124"],[/\\Omega /g,"\u2126"],[/\\mho /g,"\u2127"],[/\\mathfrak\{Z\}/g,"\u2128"],[/\\ElsevierGlyph\{2129\}/g,"\u2129"],[/\\AA /g,"\u212B"],[/\\mathscr\{B\}/g,"\u212C"],[/\\mathfrak\{C\}/g,"\u212D"],[/\\mathscr\{e\}/g,"\u212F"],[/\\mathscr\{E\}/g,"\u2130"],[/\\mathscr\{F\}/g,"\u2131"],[/\\mathscr\{M\}/g,"\u2133"],[/\\mathscr\{o\}/g,"\u2134"],[/\\aleph /g,"\u2135"],[/\\beth /g,"\u2136"],[/\\gimel /g,"\u2137"],[/\\daleth /g,"\u2138"],[/\\textfrac\{1\}\{3\}/g,"\u2153"],[/\\textfrac\{2\}\{3\}/g,"\u2154"],[/\\textfrac\{1\}\{5\}/g,"\u2155"],[/\\textfrac\{2\}\{5\}/g,"\u2156"],[/\\textfrac\{3\}\{5\}/g,"\u2157"],[/\\textfrac\{4\}\{5\}/g,"\u2158"],[/\\textfrac\{1\}\{6\}/g,"\u2159"],[/\\textfrac\{5\}\{6\}/g,"\u215A"],[/\\textfrac\{1\}\{8\}/g,"\u215B"],[/\\textfrac\{3\}\{8\}/g,"\u215C"],[/\\textfrac\{5\}\{8\}/g,"\u215D"],[/\\textfrac\{7\}\{8\}/g,"\u215E"],[/\\leftarrow /g,"\u2190"],[/\\uparrow /g,"\u2191"],[/\\rightarrow /g,"\u2192"],[/\\downarrow /g,"\u2193"],[/\\leftrightarrow /g,"\u2194"],[/\\updownarrow /g,"\u2195"],[/\\nwarrow /g,"\u2196"],[/\\nearrow /g,"\u2197"],[/\\searrow /g,"\u2198"],[/\\swarrow /g,"\u2199"],[/\\nleftarrow /g,"\u219A"],[/\\nrightarrow /g,"\u219B"],[/\\arrowwaveright /g,"\u219C"],[/\\arrowwaveright /g,"\u219D"],[/\\twoheadleftarrow /g,"\u219E"],[/\\twoheadrightarrow /g,"\u21A0"],[/\\leftarrowtail /g,"\u21A2"],[/\\rightarrowtail /g,"\u21A3"],[/\\mapsto /g,"\u21A6"],[/\\hookleftarrow /g,"\u21A9"],[/\\hookrightarrow /g,"\u21AA"],[/\\looparrowleft /g,"\u21AB"],[/\\looparrowright /g,"\u21AC"],[/\\leftrightsquigarrow /g,"\u21AD"],[/\\nleftrightarrow /g,"\u21AE"],[/\\Lsh /g,"\u21B0"],[/\\Rsh /g,"\u21B1"],[/\\ElsevierGlyph\{21B3\}/g,"\u21B3"],[/\\curvearrowleft /g,"\u21B6"],[/\\curvearrowright /g,"\u21B7"],[/\\circlearrowleft /g,"\u21BA"],[/\\circlearrowright /g,"\u21BB"],[/\\leftharpoonup /g,"\u21BC"],[/\\leftharpoondown /g,"\u21BD"],[/\\upharpoonright /g,"\u21BE"],[/\\upharpoonleft /g,"\u21BF"],[/\\rightharpoonup /g,"\u21C0"],[/\\rightharpoondown /g,"\u21C1"],[/\\downharpoonright /g,"\u21C2"],[/\\downharpoonleft /g,"\u21C3"],[/\\rightleftarrows /g,"\u21C4"],[/\\dblarrowupdown /g,"\u21C5"],[/\\leftrightarrows /g,"\u21C6"],[/\\leftleftarrows /g,"\u21C7"],[/\\upuparrows /g,"\u21C8"],[/\\rightrightarrows /g,"\u21C9"],[/\\downdownarrows /g,"\u21CA"],[/\\leftrightharpoons /g,"\u21CB"],[/\\rightleftharpoons /g,"\u21CC"],[/\\nLeftarrow /g,"\u21CD"],[/\\nLeftrightarrow /g,"\u21CE"],[/\\nRightarrow /g,"\u21CF"],[/\\Leftarrow /g,"\u21D0"],[/\\Uparrow /g,"\u21D1"],[/\\Rightarrow /g,"\u21D2"],[/\\Downarrow /g,"\u21D3"],[/\\Leftrightarrow /g,"\u21D4"],[/\\Updownarrow /g,"\u21D5"],[/\\Lleftarrow /g,"\u21DA"],[/\\Rrightarrow /g,"\u21DB"],[/\\rightsquigarrow /g,"\u21DD"],[/\\DownArrowUpArrow /g,"\u21F5"],[/\\forall /g,"\u2200"],[/\\complement /g,"\u2201"],[/\\partial /g,"\u2202"],[/\\exists /g,"\u2203"],[/\\nexists /g,"\u2204"],[/\\varnothing /g,"\u2205"],[/\\nabla /g,"\u2207"],[/\\in /g,"\u2208"],[/\\not\\in /g,"\u2209"],[/\\ni /g,"\u220B"],[/\\not\\ni /g,"\u220C"],[/\\prod /g,"\u220F"],[/\\coprod /g,"\u2210"],[/\\sum /g,"\u2211"],[/\\mp /g,"\u2213"],[/\\dotplus /g,"\u2214"],[/\\setminus /g,"\u2216"],[/\\circ /g,"\u2218"],[/\\bullet /g,"\u2219"],[/\\surd /g,"\u221A"],[/\\propto /g,"\u221D"],[/\\infty /g,"\u221E"],[/\\rightangle /g,"\u221F"],[/\\angle /g,"\u2220"],[/\\measuredangle /g,"\u2221"],[/\\sphericalangle /g,"\u2222"],[/\\mid /g,"\u2223"],[/\\nmid /g,"\u2224"],[/\\parallel /g,"\u2225"],[/\\nparallel /g,"\u2226"],[/\\wedge /g,"\u2227"],[/\\vee /g,"\u2228"],[/\\cap /g,"\u2229"],[/\\cup /g,"\u222A"],[/\\int /g,"\u222B"],[/\\int\\!\\int /g,"\u222C"],[/\\int\\!\\int\\!\\int /g,"\u222D"],[/\\oint /g,"\u222E"],[/\\surfintegral /g,"\u222F"],[/\\volintegral /g,"\u2230"],[/\\clwintegral /g,"\u2231"],[/\\ElsevierGlyph\{2232\}/g,"\u2232"],[/\\ElsevierGlyph\{2233\}/g,"\u2233"],[/\\therefore /g,"\u2234"],[/\\because /g,"\u2235"],[/\\Colon /g,"\u2237"],[/\\ElsevierGlyph\{2238\}/g,"\u2238"],[/\\mathbin\{\{:\}\\!\\!\{\-\}\\!\\!\{:\}\}/g,"\u223A"],[/\\homothetic /g,"\u223B"],[/\\sim /g,"\u223C"],[/\\backsim /g,"\u223D"],[/\\lazysinv /g,"\u223E"],[/\\wr /g,"\u2240"],[/\\not\\sim /g,"\u2241"],[/\\ElsevierGlyph\{2242\}/g,"\u2242"],[/\\NotEqualTilde /g,"\u2242-00338"],[/\\simeq /g,"\u2243"],[/\\not\\simeq /g,"\u2244"],[/\\cong /g,"\u2245"],[/\\approxnotequal /g,"\u2246"],[/\\not\\cong /g,"\u2247"],[/\\approx /g,"\u2248"],[/\\not\\approx /g,"\u2249"],[/\\approxeq /g,"\u224A"],[/\\tildetrpl /g,"\u224B"],[/\\not\\apid /g,"\u224B-00338"],[/\\allequal /g,"\u224C"],[/\\asymp /g,"\u224D"],[/\\Bumpeq /g,"\u224E"],[/\\NotHumpDownHump /g,"\u224E-00338"],[/\\bumpeq /g,"\u224F"],[/\\NotHumpEqual /g,"\u224F-00338"],[/\\doteq /g,"\u2250"],[/\\not\\doteq/g,"\u2250-00338"],[/\\doteqdot /g,"\u2251"],[/\\fallingdotseq /g,"\u2252"],[/\\risingdotseq /g,"\u2253"],[/\\eqcirc /g,"\u2256"],[/\\circeq /g,"\u2257"],[/\\estimates /g,"\u2259"],[/\\ElsevierGlyph\{225A\}/g,"\u225A"],[/\\starequal /g,"\u225B"],[/\\triangleq /g,"\u225C"],[/\\ElsevierGlyph\{225F\}/g,"\u225F"],[/\\not =/g,"\u2260"],[/\\equiv /g,"\u2261"],[/\\not\\equiv /g,"\u2262"],[/\\leq /g,"\u2264"],[/\\geq /g,"\u2265"],[/\\leqq /g,"\u2266"],[/\\geqq /g,"\u2267"],[/\\lneqq /g,"\u2268"],[/\\lvertneqq /g,"\u2268-0FE00"],[/\\gneqq /g,"\u2269"],[/\\gvertneqq /g,"\u2269-0FE00"],[/\\ll /g,"\u226A"],[/\\NotLessLess /g,"\u226A-00338"],[/\\gg /g,"\u226B"],[/\\NotGreaterGreater /g,"\u226B-00338"],[/\\between /g,"\u226C"],[/\\not\\kern\-0.3em\\times /g,"\u226D"],[/\\not</g,"\u226E"],[/\\not>/g,"\u226F"],[/\\not\\leq /g,"\u2270"],[/\\not\\geq /g,"\u2271"],[/\\lessequivlnt /g,"\u2272"],[/\\greaterequivlnt /g,"\u2273"],[/\\ElsevierGlyph\{2274\}/g,"\u2274"],[/\\ElsevierGlyph\{2275\}/g,"\u2275"],[/\\lessgtr /g,"\u2276"],[/\\gtrless /g,"\u2277"],[/\\notlessgreater /g,"\u2278"],[/\\notgreaterless /g,"\u2279"],[/\\prec /g,"\u227A"],[/\\succ /g,"\u227B"],[/\\preccurlyeq /g,"\u227C"],[/\\succcurlyeq /g,"\u227D"],[/\\precapprox /g,"\u227E"],[/\\NotPrecedesTilde /g,"\u227E-00338"],[/\\succapprox /g,"\u227F"],[/\\NotSucceedsTilde /g,"\u227F-00338"],[/\\not\\prec /g,"\u2280"],[/\\not\\succ /g,"\u2281"],[/\\subset /g,"\u2282"],[/\\supset /g,"\u2283"],[/\\not\\subset /g,"\u2284"],[/\\not\\supset /g,"\u2285"],[/\\subseteq /g,"\u2286"],[/\\supseteq /g,"\u2287"],[/\\not\\subseteq /g,"\u2288"],[/\\not\\supseteq /g,"\u2289"],[/\\subsetneq /g,"\u228A"],[/\\varsubsetneqq /g,"\u228A-0FE00"],[/\\supsetneq /g,"\u228B"],[/\\varsupsetneq /g,"\u228B-0FE00"],[/\\uplus /g,"\u228E"],[/\\sqsubset /g,"\u228F"],[/\\NotSquareSubset /g,"\u228F-00338"],[/\\sqsupset /g,"\u2290"],[/\\NotSquareSuperset /g,"\u2290-00338"],[/\\sqsubseteq /g,"\u2291"],[/\\sqsupseteq /g,"\u2292"],[/\\sqcap /g,"\u2293"],[/\\sqcup /g,"\u2294"],[/\\oplus /g,"\u2295"],[/\\ominus /g,"\u2296"],[/\\otimes /g,"\u2297"],[/\\oslash /g,"\u2298"],[/\\odot /g,"\u2299"],[/\\circledcirc /g,"\u229A"],[/\\circledast /g,"\u229B"],[/\\circleddash /g,"\u229D"],[/\\boxplus /g,"\u229E"],[/\\boxminus /g,"\u229F"],[/\\boxtimes /g,"\u22A0"],[/\\boxdot /g,"\u22A1"],[/\\vdash /g,"\u22A2"],[/\\dashv /g,"\u22A3"],[/\\top /g,"\u22A4"],[/\\perp /g,"\u22A5"],[/\\truestate /g,"\u22A7"],[/\\forcesextra /g,"\u22A8"],[/\\Vdash /g,"\u22A9"],[/\\Vvdash /g,"\u22AA"],[/\\VDash /g,"\u22AB"],[/\\nvdash /g,"\u22AC"],[/\\nvDash /g,"\u22AD"],[/\\nVdash /g,"\u22AE"],[/\\nVDash /g,"\u22AF"],[/\\vartriangleleft /g,"\u22B2"],[/\\vartriangleright /g,"\u22B3"],[/\\trianglelefteq /g,"\u22B4"],[/\\trianglerighteq /g,"\u22B5"],[/\\original /g,"\u22B6"],[/\\image /g,"\u22B7"],[/\\multimap /g,"\u22B8"],[/\\hermitconjmatrix /g,"\u22B9"],[/\\intercal /g,"\u22BA"],[/\\veebar /g,"\u22BB"],[/\\rightanglearc /g,"\u22BE"],[/\\ElsevierGlyph\{22C0\}/g,"\u22C0"],[/\\ElsevierGlyph\{22C1\}/g,"\u22C1"],[/\\bigcap /g,"\u22C2"],[/\\bigcup /g,"\u22C3"],[/\\diamond /g,"\u22C4"],[/\\cdot /g,"\u22C5"],[/\\star /g,"\u22C6"],[/\\divideontimes /g,"\u22C7"],[/\\bowtie /g,"\u22C8"],[/\\ltimes /g,"\u22C9"],[/\\rtimes /g,"\u22CA"],[/\\leftthreetimes /g,"\u22CB"],[/\\rightthreetimes /g,"\u22CC"],[/\\backsimeq /g,"\u22CD"],[/\\curlyvee /g,"\u22CE"],[/\\curlywedge /g,"\u22CF"],[/\\Subset /g,"\u22D0"],[/\\Supset /g,"\u22D1"],[/\\Cap /g,"\u22D2"],[/\\Cup /g,"\u22D3"],[/\\pitchfork /g,"\u22D4"],[/\\lessdot /g,"\u22D6"],[/\\gtrdot /g,"\u22D7"],[/\\verymuchless /g,"\u22D8"],[/\\verymuchgreater /g,"\u22D9"],[/\\lesseqgtr /g,"\u22DA"],[/\\gtreqless /g,"\u22DB"],[/\\curlyeqprec /g,"\u22DE"],[/\\curlyeqsucc /g,"\u22DF"],[/\\not\\sqsubseteq /g,"\u22E2"],[/\\not\\sqsupseteq /g,"\u22E3"],[/\\Elzsqspne /g,"\u22E5"],[/\\lnsim /g,"\u22E6"],[/\\gnsim /g,"\u22E7"],[/\\precedesnotsimilar /g,"\u22E8"],[/\\succnsim /g,"\u22E9"],[/\\ntriangleleft /g,"\u22EA"],[/\\ntriangleright /g,"\u22EB"],[/\\ntrianglelefteq /g,"\u22EC"],[/\\ntrianglerighteq /g,"\u22ED"],[/\\vdots /g,"\u22EE"],[/\\cdots /g,"\u22EF"],[/\\upslopeellipsis /g,"\u22F0"],[/\\downslopeellipsis /g,"\u22F1"],[/\\barwedge /g,"\u2305"],[/\\perspcorrespond /g,"\u2306"],[/\\lceil /g,"\u2308"],[/\\rceil /g,"\u2309"],[/\\lfloor /g,"\u230A"],[/\\rfloor /g,"\u230B"],[/\\recorder /g,"\u2315"],[/\\mathchar"2208/g,"\u2316"],[/\\ulcorner /g,"\u231C"],[/\\urcorner /g,"\u231D"],[/\\llcorner /g,"\u231E"],[/\\lrcorner /g,"\u231F"],[/\\frown /g,"\u2322"],[/\\smile /g,"\u2323"],[/\\langle /g,"\u2329"],[/\\rangle /g,"\u232A"],[/\\ElsevierGlyph\{E838\}/g,"\u233D"],[/\\Elzdlcorn /g,"\u23A3"],[/\\lmoustache /g,"\u23B0"],[/\\rmoustache /g,"\u23B1"],[/\\textvisiblespace /g,"\u2423"],[/\\ding\{172\}/g,"\u2460"],[/\\ding\{173\}/g,"\u2461"],[/\\ding\{174\}/g,"\u2462"],[/\\ding\{175\}/g,"\u2463"],[/\\ding\{176\}/g,"\u2464"],[/\\ding\{177\}/g,"\u2465"],[/\\ding\{178\}/g,"\u2466"],[/\\ding\{179\}/g,"\u2467"],[/\\ding\{180\}/g,"\u2468"],[/\\ding\{181\}/g,"\u2469"],[/\\circledS /g,"\u24C8"],[/\\Elzdshfnc /g,"\u2506"],[/\\Elzsqfnw /g,"\u2519"],[/\\diagup /g,"\u2571"],[/\\ding\{110\}/g,"\u25A0"],[/\\square /g,"\u25A1"],[/\\blacksquare /g,"\u25AA"],[/\\fbox\{~~\}/g,"\u25AD"],[/\\Elzvrecto /g,"\u25AF"],[/\\ElsevierGlyph\{E381\}/g,"\u25B1"],[/\\ding\{115\}/g,"\u25B2"],[/\\bigtriangleup /g,"\u25B3"],[/\\blacktriangle /g,"\u25B4"],[/\\vartriangle /g,"\u25B5"],[/\\blacktriangleright /g,"\u25B8"],[/\\triangleright /g,"\u25B9"],[/\\ding\{116\}/g,"\u25BC"],[/\\bigtriangledown /g,"\u25BD"],[/\\blacktriangledown /g,"\u25BE"],[/\\triangledown /g,"\u25BF"],[/\\blacktriangleleft /g,"\u25C2"],[/\\triangleleft /g,"\u25C3"],[/\\ding\{117\}/g,"\u25C6"],[/\\lozenge /g,"\u25CA"],[/\\bigcirc /g,"\u25CB"],[/\\ding\{108\}/g,"\u25CF"],[/\\Elzcirfl /g,"\u25D0"],[/\\Elzcirfr /g,"\u25D1"],[/\\Elzcirfb /g,"\u25D2"],[/\\ding\{119\}/g,"\u25D7"],[/\\Elzrvbull /g,"\u25D8"],[/\\Elzsqfl /g,"\u25E7"],[/\\Elzsqfr /g,"\u25E8"],[/\\Elzsqfse /g,"\u25EA"],[/\\bigcirc /g,"\u25EF"],[/\\ding\{72\}/g,"\u2605"],[/\\ding\{73\}/g,"\u2606"],[/\\ding\{37\}/g,"\u260E"],[/\\ding\{42\}/g,"\u261B"],[/\\ding\{43\}/g,"\u261E"],[/\\rightmoon /g,"\u263E"],[/\\mercury /g,"\u263F"],[/\\venus /g,"\u2640"],[/\\male /g,"\u2642"],[/\\jupiter /g,"\u2643"],[/\\saturn /g,"\u2644"],[/\\uranus /g,"\u2645"],[/\\neptune /g,"\u2646"],[/\\pluto /g,"\u2647"],[/\\aries /g,"\u2648"],[/\\taurus /g,"\u2649"],[/\\gemini /g,"\u264A"],[/\\cancer /g,"\u264B"],[/\\leo /g,"\u264C"],[/\\virgo /g,"\u264D"],[/\\libra /g,"\u264E"],[/\\scorpio /g,"\u264F"],[/\\sagittarius /g,"\u2650"],[/\\capricornus /g,"\u2651"],[/\\aquarius /g,"\u2652"],[/\\pisces /g,"\u2653"],[/\\ding\{171\}/g,"\u2660"],[/\\diamond /g,"\u2662"],[/\\ding\{168\}/g,"\u2663"],[/\\ding\{170\}/g,"\u2665"],[/\\ding\{169\}/g,"\u2666"],[/\\quarternote /g,"\u2669"],[/\\eighthnote /g,"\u266A"],[/\\flat /g,"\u266D"],[/\\natural /g,"\u266E"],[/\\sharp /g,"\u266F"],[/\\ding\{33\}/g,"\u2701"],[/\\ding\{34\}/g,"\u2702"],[/\\ding\{35\}/g,"\u2703"],[/\\ding\{36\}/g,"\u2704"],[/\\ding\{38\}/g,"\u2706"],[/\\ding\{39\}/g,"\u2707"],[/\\ding\{40\}/g,"\u2708"],[/\\ding\{41\}/g,"\u2709"],[/\\ding\{44\}/g,"\u270C"],[/\\ding\{45\}/g,"\u270D"],[/\\ding\{46\}/g,"\u270E"],[/\\ding\{47\}/g,"\u270F"],[/\\ding\{48\}/g,"\u2710"],[/\\ding\{49\}/g,"\u2711"],[/\\ding\{50\}/g,"\u2712"],[/\\ding\{51\}/g,"\u2713"],[/\\ding\{52\}/g,"\u2714"],[/\\ding\{53\}/g,"\u2715"],[/\\ding\{54\}/g,"\u2716"],[/\\ding\{55\}/g,"\u2717"],[/\\ding\{56\}/g,"\u2718"],[/\\ding\{57\}/g,"\u2719"],[/\\ding\{58\}/g,"\u271A"],[/\\ding\{59\}/g,"\u271B"],[/\\ding\{60\}/g,"\u271C"],[/\\ding\{61\}/g,"\u271D"],[/\\ding\{62\}/g,"\u271E"],[/\\ding\{63\}/g,"\u271F"],[/\\ding\{64\}/g,"\u2720"],[/\\ding\{65\}/g,"\u2721"],[/\\ding\{66\}/g,"\u2722"],[/\\ding\{67\}/g,"\u2723"],[/\\ding\{68\}/g,"\u2724"],[/\\ding\{69\}/g,"\u2725"],[/\\ding\{70\}/g,"\u2726"],[/\\ding\{71\}/g,"\u2727"],[/\\ding\{73\}/g,"\u2729"],[/\\ding\{74\}/g,"\u272A"],[/\\ding\{75\}/g,"\u272B"],[/\\ding\{76\}/g,"\u272C"],[/\\ding\{77\}/g,"\u272D"],[/\\ding\{78\}/g,"\u272E"],[/\\ding\{79\}/g,"\u272F"],[/\\ding\{80\}/g,"\u2730"],[/\\ding\{81\}/g,"\u2731"],[/\\ding\{82\}/g,"\u2732"],[/\\ding\{83\}/g,"\u2733"],[/\\ding\{84\}/g,"\u2734"],[/\\ding\{85\}/g,"\u2735"],[/\\ding\{86\}/g,"\u2736"],[/\\ding\{87\}/g,"\u2737"],[/\\ding\{88\}/g,"\u2738"],[/\\ding\{89\}/g,"\u2739"],[/\\ding\{90\}/g,"\u273A"],[/\\ding\{91\}/g,"\u273B"],[/\\ding\{92\}/g,"\u273C"],[/\\ding\{93\}/g,"\u273D"],[/\\ding\{94\}/g,"\u273E"],[/\\ding\{95\}/g,"\u273F"],[/\\ding\{96\}/g,"\u2740"],[/\\ding\{97\}/g,"\u2741"],[/\\ding\{98\}/g,"\u2742"],[/\\ding\{99\}/g,"\u2743"],[/\\ding\{100\}/g,"\u2744"],[/\\ding\{101\}/g,"\u2745"],[/\\ding\{102\}/g,"\u2746"],[/\\ding\{103\}/g,"\u2747"],[/\\ding\{104\}/g,"\u2748"],[/\\ding\{105\}/g,"\u2749"],[/\\ding\{106\}/g,"\u274A"],[/\\ding\{107\}/g,"\u274B"],[/\\ding\{109\}/g,"\u274D"],[/\\ding\{111\}/g,"\u274F"],[/\\ding\{112\}/g,"\u2750"],[/\\ding\{113\}/g,"\u2751"],[/\\ding\{114\}/g,"\u2752"],[/\\ding\{118\}/g,"\u2756"],[/\\ding\{120\}/g,"\u2758"],[/\\ding\{121\}/g,"\u2759"],[/\\ding\{122\}/g,"\u275A"],[/\\ding\{123\}/g,"\u275B"],[/\\ding\{124\}/g,"\u275C"],[/\\ding\{125\}/g,"\u275D"],[/\\ding\{126\}/g,"\u275E"],[/\\ding\{161\}/g,"\u2761"],[/\\ding\{162\}/g,"\u2762"],[/\\ding\{163\}/g,"\u2763"],[/\\ding\{164\}/g,"\u2764"],[/\\ding\{165\}/g,"\u2765"],[/\\ding\{166\}/g,"\u2766"],[/\\ding\{167\}/g,"\u2767"],[/\\ding\{182\}/g,"\u2776"],[/\\ding\{183\}/g,"\u2777"],[/\\ding\{184\}/g,"\u2778"],[/\\ding\{185\}/g,"\u2779"],[/\\ding\{186\}/g,"\u277A"],[/\\ding\{187\}/g,"\u277B"],[/\\ding\{188\}/g,"\u277C"],[/\\ding\{189\}/g,"\u277D"],[/\\ding\{190\}/g,"\u277E"],[/\\ding\{191\}/g,"\u277F"],[/\\ding\{192\}/g,"\u2780"],[/\\ding\{193\}/g,"\u2781"],[/\\ding\{194\}/g,"\u2782"],[/\\ding\{195\}/g,"\u2783"],[/\\ding\{196\}/g,"\u2784"],[/\\ding\{197\}/g,"\u2785"],[/\\ding\{198\}/g,"\u2786"],[/\\ding\{199\}/g,"\u2787"],[/\\ding\{200\}/g,"\u2788"],[/\\ding\{201\}/g,"\u2789"],[/\\ding\{202\}/g,"\u278A"],[/\\ding\{203\}/g,"\u278B"],[/\\ding\{204\}/g,"\u278C"],[/\\ding\{205\}/g,"\u278D"],[/\\ding\{206\}/g,"\u278E"],[/\\ding\{207\}/g,"\u278F"],[/\\ding\{208\}/g,"\u2790"],[/\\ding\{209\}/g,"\u2791"],[/\\ding\{210\}/g,"\u2792"],[/\\ding\{211\}/g,"\u2793"],[/\\ding\{212\}/g,"\u2794"],[/\\ding\{216\}/g,"\u2798"],[/\\ding\{217\}/g,"\u2799"],[/\\ding\{218\}/g,"\u279A"],[/\\ding\{219\}/g,"\u279B"],[/\\ding\{220\}/g,"\u279C"],[/\\ding\{221\}/g,"\u279D"],[/\\ding\{222\}/g,"\u279E"],[/\\ding\{223\}/g,"\u279F"],[/\\ding\{224\}/g,"\u27A0"],[/\\ding\{225\}/g,"\u27A1"],[/\\ding\{226\}/g,"\u27A2"],[/\\ding\{227\}/g,"\u27A3"],[/\\ding\{228\}/g,"\u27A4"],[/\\ding\{229\}/g,"\u27A5"],[/\\ding\{230\}/g,"\u27A6"],[/\\ding\{231\}/g,"\u27A7"],[/\\ding\{232\}/g,"\u27A8"],[/\\ding\{233\}/g,"\u27A9"],[/\\ding\{234\}/g,"\u27AA"],[/\\ding\{235\}/g,"\u27AB"],[/\\ding\{236\}/g,"\u27AC"],[/\\ding\{237\}/g,"\u27AD"],[/\\ding\{238\}/g,"\u27AE"],[/\\ding\{239\}/g,"\u27AF"],[/\\ding\{241\}/g,"\u27B1"],[/\\ding\{242\}/g,"\u27B2"],[/\\ding\{243\}/g,"\u27B3"],[/\\ding\{244\}/g,"\u27B4"],[/\\ding\{245\}/g,"\u27B5"],[/\\ding\{246\}/g,"\u27B6"],[/\\ding\{247\}/g,"\u27B7"],[/\\ding\{248\}/g,"\u27B8"],[/\\ding\{249\}/g,"\u27B9"],[/\\ding\{250\}/g,"\u27BA"],[/\\ding\{251\}/g,"\u27BB"],[/\\ding\{252\}/g,"\u27BC"],[/\\ding\{253\}/g,"\u27BD"],[/\\ding\{254\}/g,"\u27BE"],[/\\longleftarrow /g,"\u27F5"],[/\\longrightarrow /g,"\u27F6"],[/\\longleftrightarrow /g,"\u27F7"],[/\\Longleftarrow /g,"\u27F8"],[/\\Longrightarrow /g,"\u27F9"],[/\\Longleftrightarrow /g,"\u27FA"],[/\\longmapsto /g,"\u27FC"],[/\\sim\\joinrel\\leadsto/g,"\u27FF"],[/\\ElsevierGlyph\{E212\}/g,"\u2905"],[/\\UpArrowBar /g,"\u2912"],[/\\DownArrowBar /g,"\u2913"],[/\\ElsevierGlyph\{E20C\}/g,"\u2923"],[/\\ElsevierGlyph\{E20D\}/g,"\u2924"],[/\\ElsevierGlyph\{E20B\}/g,"\u2925"],[/\\ElsevierGlyph\{E20A\}/g,"\u2926"],[/\\ElsevierGlyph\{E211\}/g,"\u2927"],[/\\ElsevierGlyph\{E20E\}/g,"\u2928"],[/\\ElsevierGlyph\{E20F\}/g,"\u2929"],[/\\ElsevierGlyph\{E210\}/g,"\u292A"],[/\\ElsevierGlyph\{E21C\}/g,"\u2933"],[/\\ElsevierGlyph\{E21D\}/g,"\u2933-00338"],[/\\ElsevierGlyph\{E21A\}/g,"\u2936"],[/\\ElsevierGlyph\{E219\}/g,"\u2937"],[/\\Elolarr /g,"\u2940"],[/\\Elorarr /g,"\u2941"],[/\\ElzRlarr /g,"\u2942"],[/\\ElzrLarr /g,"\u2944"],[/\\Elzrarrx /g,"\u2947"],[/\\LeftRightVector /g,"\u294E"],[/\\RightUpDownVector /g,"\u294F"],[/\\DownLeftRightVector /g,"\u2950"],[/\\LeftUpDownVector /g,"\u2951"],[/\\LeftVectorBar /g,"\u2952"],[/\\RightVectorBar /g,"\u2953"],[/\\RightUpVectorBar /g,"\u2954"],[/\\RightDownVectorBar /g,"\u2955"],[/\\DownLeftVectorBar /g,"\u2956"],[/\\DownRightVectorBar /g,"\u2957"],[/\\LeftUpVectorBar /g,"\u2958"],[/\\LeftDownVectorBar /g,"\u2959"],[/\\LeftTeeVector /g,"\u295A"],[/\\RightTeeVector /g,"\u295B"],[/\\RightUpTeeVector /g,"\u295C"],[/\\RightDownTeeVector /g,"\u295D"],[/\\DownLeftTeeVector /g,"\u295E"],[/\\DownRightTeeVector /g,"\u295F"],[/\\LeftUpTeeVector /g,"\u2960"],[/\\LeftDownTeeVector /g,"\u2961"],[/\\UpEquilibrium /g,"\u296E"],[/\\ReverseUpEquilibrium /g,"\u296F"],[/\\RoundImplies /g,"\u2970"],[/\\ElsevierGlyph\{E214\}/g,"\u297C"],[/\\ElsevierGlyph\{E215\}/g,"\u297D"],[/\\Elztfnc /g,"\u2980"],[/\\ElsevierGlyph\{3018\}/g,"\u2985"],[/\\Elroang /g,"\u2986"],[/\\ElsevierGlyph\{E291\}/g,"\u2994"],[/\\Elzddfnc /g,"\u2999"],[/\\Angle /g,"\u299C"],[/\\Elzlpargt /g,"\u29A0"],[/\\ElsevierGlyph\{E260\}/g,"\u29B5"],[/\\ElsevierGlyph\{E61B\}/g,"\u29B6"],[/\\ElzLap /g,"\u29CA"],[/\\Elzdefas /g,"\u29CB"],[/\\LeftTriangleBar /g,"\u29CF"],[/\\NotLeftTriangleBar /g,"\u29CF-00338"],[/\\RightTriangleBar /g,"\u29D0"],[/\\NotRightTriangleBar /g,"\u29D0-00338"],[/\\ElsevierGlyph\{E372\}/g,"\u29DC"],[/\\blacklozenge /g,"\u29EB"],[/\\RuleDelayed /g,"\u29F4"],[/\\Elxuplus /g,"\u2A04"],[/\\ElzThr /g,"\u2A05"],[/\\Elxsqcup /g,"\u2A06"],[/\\ElzInf /g,"\u2A07"],[/\\ElzSup /g,"\u2A08"],[/\\ElzCint /g,"\u2A0D"],[/\\clockoint /g,"\u2A0F"],[/\\ElsevierGlyph\{E395\}/g,"\u2A10"],[/\\sqrint /g,"\u2A16"],[/\\ElsevierGlyph\{E25A\}/g,"\u2A25"],[/\\ElsevierGlyph\{E25B\}/g,"\u2A2A"],[/\\ElsevierGlyph\{E25C\}/g,"\u2A2D"],[/\\ElsevierGlyph\{E25D\}/g,"\u2A2E"],[/\\ElzTimes /g,"\u2A2F"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A34"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A35"],[/\\ElsevierGlyph\{E259\}/g,"\u2A3C"],[/\\amalg /g,"\u2A3F"],[/\\ElzAnd /g,"\u2A53"],[/\\ElzOr /g,"\u2A54"],[/\\ElsevierGlyph\{E36E\}/g,"\u2A55"],[/\\ElOr /g,"\u2A56"],[/\\perspcorrespond /g,"\u2A5E"],[/\\Elzminhat /g,"\u2A5F"],[/\\ElsevierGlyph\{225A\}/g,"\u2A63"],[/\\stackrel\{*\}\{=\}/g,"\u2A6E"],[/\\Equal /g,"\u2A75"],[/\\leqslant /g,"\u2A7D"],[/\\nleqslant /g,"\u2A7D-00338"],[/\\geqslant /g,"\u2A7E"],[/\\ngeqslant /g,"\u2A7E-00338"],[/\\lessapprox /g,"\u2A85"],[/\\gtrapprox /g,"\u2A86"],[/\\lneq /g,"\u2A87"],[/\\gneq /g,"\u2A88"],[/\\lnapprox /g,"\u2A89"],[/\\gnapprox /g,"\u2A8A"],[/\\lesseqqgtr /g,"\u2A8B"],[/\\gtreqqless /g,"\u2A8C"],[/\\eqslantless /g,"\u2A95"],[/\\eqslantgtr /g,"\u2A96"],[/\\Pisymbol\{ppi020\}\{117\}/g,"\u2A9D"],[/\\Pisymbol\{ppi020\}\{105\}/g,"\u2A9E"],[/\\NestedLessLess /g,"\u2AA1"],[/\\NotNestedLessLess /g,"\u2AA1-00338"],[/\\NestedGreaterGreater /g,"\u2AA2"],[/\\NotNestedGreaterGreater /g,"\u2AA2-00338"],[/\\preceq /g,"\u2AAF"],[/\\not\\preceq /g,"\u2AAF-00338"],[/\\succeq /g,"\u2AB0"],[/\\not\\succeq /g,"\u2AB0-00338"],[/\\precneqq /g,"\u2AB5"],[/\\succneqq /g,"\u2AB6"],[/\\precapprox /g,"\u2AB7"],[/\\succapprox /g,"\u2AB8"],[/\\precnapprox /g,"\u2AB9"],[/\\succnapprox /g,"\u2ABA"],[/\\subseteqq /g,"\u2AC5"],[/\\nsubseteqq /g,"\u2AC5-00338"],[/\\supseteqq /g,"\u2AC6"],[/\\nsupseteqq/g,"\u2AC6-00338"],[/\\subsetneqq /g,"\u2ACB"],[/\\supsetneqq /g,"\u2ACC"],[/\\ElsevierGlyph\{E30D\}/g,"\u2AEB"],[/\\Elztdcol /g,"\u2AF6"],[/\\ElsevierGlyph\{300A\}/g,"\u300A"],[/\\ElsevierGlyph\{300B\}/g,"\u300B"],[/\\ElsevierGlyph\{3018\}/g,"\u3018"],[/\\ElsevierGlyph\{3019\}/g,"\u3019"],[/\\openbracketleft /g,"\u301A"],[/\\openbracketright /g,"\u301B"]];return this}if(typeof module!=="undefined"&&module.exports){module.exports=BibtexParser};
\ No newline at end of file
diff -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 -r 103697ebdd339377424063fba0459cb3cc2b707c static/scripts/packed/mvc/citation/citation-model.js
--- a/static/scripts/packed/mvc/citation/citation-model.js
+++ b/static/scripts/packed/mvc/citation/citation-model.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","utils/localization"],function(a,e){var f=Backbone.Model.extend(a.LoggableMixin).extend({initialize:function(){var g=this.attributes.content;var h=new BibtexParser(g).entries[0];this.entry=h},entryType:function(){return this.entry.EntryType},fields:function(){return this.entry.Fields}});var b=Backbone.Collection.extend(a.LoggableMixin).extend({urlRoot:galaxy_config.root+"api",partial:true,model:f,});var d=b.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}});var c=b.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"},partial:false,});return{Citation:f,HistoryCitationCollection:d,ToolCitationCollection:c}});
\ No newline at end of file
+define(["mvc/base-mvc","utils/localization"],function(a,e){var f=Backbone.Model.extend(a.LoggableMixin).extend({initialize:function(){var g=this.attributes.content;var i=new BibtexParser(g).entries[0];this.entry=i;this._fields={};var k=i.Fields;for(key in k){var j=k[key];var h=key.toLowerCase();this._fields[h]=j}},entryType:function(){return this.entry.EntryType},fields:function(){return this._fields}});var b=Backbone.Collection.extend(a.LoggableMixin).extend({urlRoot:galaxy_config.root+"api",partial:true,model:f,});var d=b.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}});var c=b.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"},partial:false,});return{Citation:f,HistoryCitationCollection:d,ToolCitationCollection:c}});
\ No newline at end of file
diff -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 -r 103697ebdd339377424063fba0459cb3cc2b707c static/scripts/packed/mvc/citation/citation-view.js
--- a/static/scripts/packed/mvc/citation/citation-view.js
+++ b/static/scripts/packed/mvc/citation/citation-view.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return(f&&f.trim())?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
+define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.doi){l="http://dx.doi.org/"+k.doi;g+='[<a href="'+l+'">doi:'+k.doi+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return(f&&f.trim())?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jmchilton: Fix more BibTeX problems caught by @peterjc.
by commits-noreply@bitbucket.org 06 Aug '14
by commits-noreply@bitbucket.org 06 Aug '14
06 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/6ebb0a47a2a3/
Changeset: 6ebb0a47a2a3
User: jmchilton
Date: 2014-08-06 18:36:27
Summary: Fix more BibTeX problems caught by @peterjc.
See https://bitbucket.org/galaxy/galaxy-central/commits/3e8dfd372918c90ee4b3726….
Thanks Peter!
Affected #: 1 file
diff -r 3e8dfd372918c90ee4b37267f0b7c03a291acb54 -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 tools/phenotype_association/lps.xml
--- a/tools/phenotype_association/lps.xml
+++ b/tools/phenotype_association/lps.xml
@@ -308,12 +308,16 @@
journal = {Journal of Machine Learning Research},
year = {2007},
volume = {8},
- pages = {1519-1555},
+ pages = {1519--1555},
}</citation>
- <citation type="bibtex">@MISC{Shi08lasso-patternsearchalgorithm,
+ <citation type="bibtex">@ARTICLE{Shi08lasso-patternsearchalgorithm,
author = {Weiliang Shi and Grace Wahba and Stephen Wright and Kristine Lee and Ronald Klein and Barbara Klein},
- title = { LASSO-Patternsearch Algorithm with Application to Ophthalmology and Genomic Data},
- year = {2008}
+ title = {LASSO-Patternsearch Algorithm with Application to Ophthalmology and Genomic Data},
+ journal= {Stat Interface},
+ year = {2008},
+ volume = {1},
+ number = {1},
+ pages = {137--153}
}</citation></citations></tool>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jmchilton: Fix citation problem in 39c9831 caught by @peterjc.
by commits-noreply@bitbucket.org 06 Aug '14
by commits-noreply@bitbucket.org 06 Aug '14
06 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/3e8dfd372918/
Changeset: 3e8dfd372918
User: jmchilton
Date: 2014-08-06 18:31:50
Summary: Fix citation problem in 39c9831 caught by @peterjc.
Affected #: 1 file
diff -r 0e9c220ff8cd619c902aca574a07f208a2a30a21 -r 3e8dfd372918c90ee4b37267f0b7c03a291acb54 tools/phenotype_association/lps.xml
--- a/tools/phenotype_association/lps.xml
+++ b/tools/phenotype_association/lps.xml
@@ -307,7 +307,8 @@
title = {An interior-point method for large-scale l1-regularized logistic regression},
journal = {Journal of Machine Learning Research},
year = {2007},
- volume = {2007}
+ volume = {8},
+ pages = {1519-1555},
}</citation><citation type="bibtex">@MISC{Shi08lasso-patternsearchalgorithm,
author = {Weiliang Shi and Grace Wahba and Stephen Wright and Kristine Lee and Ronald Klein and Barbara Klein},
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a57767f4ae8f/
Changeset: a57767f4ae8f
Branch: next-stable
User: dannon
Date: 2014-08-06 16:16:22
Summary: Fix for conditionally using bucket_default in cloudlaunch.
Affected #: 1 file
diff -r 283f3be266eab2951f04cda8204fc24af22983ca -r a57767f4ae8f5e45ed04a123aae5be53c69ebe91 lib/galaxy/webapps/galaxy/controllers/cloudlaunch.py
--- a/lib/galaxy/webapps/galaxy/controllers/cloudlaunch.py
+++ b/lib/galaxy/webapps/galaxy/controllers/cloudlaunch.py
@@ -70,10 +70,18 @@
cfg = cloudman.CloudManConfig(key_id, secret, cluster_name, ami,
instance_type, password, placement=zone)
cml = cloudman.launch.CloudManLauncher(key_id, secret)
- result = cml.launch(cluster_name, ami, instance_type, password,
- cfg.kernel_id, cfg.ramdisk_id, cfg.key_name,
- cfg.security_groups, cfg.placement,
- bucket_default=bucket_default)
+ # This should probably be handled better on the bioblend side, but until
+ # an egg update can be made, this needs to conditionally include the
+ # parameter or not, even if the value is None.
+ if bucket_default:
+ result = cml.launch(cluster_name, ami, instance_type, password,
+ cfg.kernel_id, cfg.ramdisk_id, cfg.key_name,
+ cfg.security_groups, cfg.placement,
+ bucket_default=bucket_default)
+ else:
+ result = cml.launch(cluster_name, ami, instance_type, password,
+ cfg.kernel_id, cfg.ramdisk_id, cfg.key_name,
+ cfg.security_groups, cfg.placement)
# result is a dict with sg_names, kp_name, kp_material, rs, and instance_id
if not result['rs']:
trans.response.status = 400
https://bitbucket.org/galaxy/galaxy-central/commits/3976f4d59bc0/
Changeset: 3976f4d59bc0
Branch: next-stable
User: dannon
Date: 2014-08-06 17:25:12
Summary: Merge.
Affected #: 3 files
diff -r a57767f4ae8f5e45ed04a123aae5be53c69ebe91 -r 3976f4d59bc0d7b65575e7573f13fb7470c9bf53 lib/galaxy/managers/citations.py
--- a/lib/galaxy/managers/citations.py
+++ b/lib/galaxy/managers/citations.py
@@ -157,8 +157,8 @@
if self.raw_bibtex is DoiCitation.BIBTEX_UNSET:
return """@MISC{%s,
- DOI = '%s',
- note = 'Failed to fetch BibTeX for DOI.'
+ DOI = {%s},
+ note = {Failed to fetch BibTeX for DOI.}
}""" % (self.__doi, self.__doi)
else:
return self.raw_bibtex
diff -r a57767f4ae8f5e45ed04a123aae5be53c69ebe91 -r 3976f4d59bc0d7b65575e7573f13fb7470c9bf53 static/scripts/mvc/citation/citation-view.js
--- a/static/scripts/mvc/citation/citation-view.js
+++ b/static/scripts/mvc/citation/citation-view.js
@@ -94,7 +94,7 @@
return info + ".";
},
_asSentence: function(str) {
- return str ? str + ". " : "";
+ return (str && str.trim()) ? str + ". " : "";
}
});
diff -r a57767f4ae8f5e45ed04a123aae5be53c69ebe91 -r 3976f4d59bc0d7b65575e7573f13fb7470c9bf53 static/scripts/packed/mvc/citation/citation-view.js
--- a/static/scripts/packed/mvc/citation/citation-view.js
+++ b/static/scripts/packed/mvc/citation/citation-view.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return f?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
+define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return(f&&f.trim())?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
3 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/0b05baffad26/
Changeset: 0b05baffad26
Branch: next-stable
User: jmchilton
Date: 2014-08-06 17:19:48
Summary: Fixup citation rendering for DOI resolution failures.
Affected #: 2 files
diff -r 283f3be266eab2951f04cda8204fc24af22983ca -r 0b05baffad269a2597d06f5e1ebc4d86295f7a1a lib/galaxy/managers/citations.py
--- a/lib/galaxy/managers/citations.py
+++ b/lib/galaxy/managers/citations.py
@@ -157,8 +157,8 @@
if self.raw_bibtex is DoiCitation.BIBTEX_UNSET:
return """@MISC{%s,
- DOI = '%s',
- note = 'Failed to fetch BibTeX for DOI.'
+ DOI = {%s},
+ note = {Failed to fetch BibTeX for DOI.}
}""" % (self.__doi, self.__doi)
else:
return self.raw_bibtex
diff -r 283f3be266eab2951f04cda8204fc24af22983ca -r 0b05baffad269a2597d06f5e1ebc4d86295f7a1a static/scripts/mvc/citation/citation-view.js
--- a/static/scripts/mvc/citation/citation-view.js
+++ b/static/scripts/mvc/citation/citation-view.js
@@ -94,7 +94,7 @@
return info + ".";
},
_asSentence: function(str) {
- return str ? str + ". " : "";
+ return (str && str.trim()) ? str + ". " : "";
}
});
https://bitbucket.org/galaxy/galaxy-central/commits/cd370e0bbe1e/
Changeset: cd370e0bbe1e
Branch: next-stable
User: jmchilton
Date: 2014-08-06 17:20:14
Summary: Pack scripts.
Affected #: 1 file
diff -r 0b05baffad269a2597d06f5e1ebc4d86295f7a1a -r cd370e0bbe1efb80c10a1fba4732bc1e4fb251a4 static/scripts/packed/mvc/citation/citation-view.js
--- a/static/scripts/packed/mvc/citation/citation-view.js
+++ b/static/scripts/packed/mvc/citation/citation-view.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return f?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
+define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return(f&&f.trim())?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
https://bitbucket.org/galaxy/galaxy-central/commits/0e9c220ff8cd/
Changeset: 0e9c220ff8cd
User: jmchilton
Date: 2014-08-06 17:20:43
Summary: Merge next-stable.
Affected #: 5 files
diff -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a -r 0e9c220ff8cd619c902aca574a07f208a2a30a21 lib/galaxy/managers/citations.py
--- a/lib/galaxy/managers/citations.py
+++ b/lib/galaxy/managers/citations.py
@@ -157,8 +157,8 @@
if self.raw_bibtex is DoiCitation.BIBTEX_UNSET:
return """@MISC{%s,
- DOI = '%s',
- note = 'Failed to fetch BibTeX for DOI.'
+ DOI = {%s},
+ note = {Failed to fetch BibTeX for DOI.}
}""" % (self.__doi, self.__doi)
else:
return self.raw_bibtex
diff -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a -r 0e9c220ff8cd619c902aca574a07f208a2a30a21 static/scripts/mvc/citation/citation-view.js
--- a/static/scripts/mvc/citation/citation-view.js
+++ b/static/scripts/mvc/citation/citation-view.js
@@ -94,7 +94,7 @@
return info + ".";
},
_asSentence: function(str) {
- return str ? str + ". " : "";
+ return (str && str.trim()) ? str + ". " : "";
}
});
diff -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a -r 0e9c220ff8cd619c902aca574a07f208a2a30a21 static/scripts/packed/mvc/citation/citation-view.js
--- a/static/scripts/packed/mvc/citation/citation-view.js
+++ b/static/scripts/packed/mvc/citation/citation-view.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return f?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
+define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return(f&&f.trim())?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
diff -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a -r 0e9c220ff8cd619c902aca574a07f208a2a30a21 static/scripts/packed/viz/trackster/tracks.js
--- a/static/scripts/packed/viz/trackster/tracks.js
+++ b/static/scripts/packed/viz/trackster/tracks.js
@@ -1,1 +1,1 @@
-define(["libs/underscore","viz/visualization","viz/viz_views","viz/trackster/util","viz/trackster/slotting","viz/trackster/painters","viz/trackster/filters","mvc/data","mvc/tools","utils/config"],function(ab,w,V,j,s,J,h,X,P,R){var o=ab.extend;var l={};var i=function(ac,ad){l[ac.attr("id")]=ad};var k=function(ac,ad,af,ae){af=".group";l[ac.attr("id")]=ae;ac.bind("drag",{handle:"."+ad,relative:true},function(an,ao){var am=$(this),ar=$(this).parent(),aj=ar.children(".track,.group"),al=l[$(this).attr("id")],ai,ah,ap,ag,ak;ah=$(this).parents(af);if(ah.length!==0){ap=ah.position().top;ag=ap+ah.outerHeight();var aq=l[ah.attr("id")];if(ao.offsetY<ap){$(this).insertBefore(ah);aq.remove_drawable(al);aq.container.add_drawable_before(al,aq);return}else{if(ao.offsetY>ag){$(this).insertAfter(ah);aq.remove_drawable(al);aq.container.add_drawable(al);return}}}ah=null;for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));ap=ai.position().top;ag=ap+ai.outerHeight();if(ai.is(af)&&this!==ai.get(0)&&ao.offsetY>=ap&&ao.offsetY<=ag){if(ao.offsetY-ap<ag-ao.offsetY){ai.find(".content-div").prepend(this)}else{ai.find(".content-div").append(this)}if(al.container){al.container.remove_drawable(al)}l[ai.attr("id")].add_drawable(al);return}}for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));if(ao.offsetY<ai.position().top&&!(ai.hasClass("reference-track")||ai.hasClass("intro"))){break}}if(ak===aj.length){if(this!==aj.get(ak-1)){ar.append(this);l[ar.attr("id")].move_drawable(al,ak)}}else{if(this!==aj.get(ak)){$(this).insertBefore(aj.get(ak));l[ar.attr("id")].move_drawable(al,(ao.deltaY>0?ak-1:ak))}}}).bind("dragstart",function(){$(this).addClass("dragging")}).bind("dragend",function(){$(this).removeClass("dragging")})};var D=20,z=100,G=12000,Q=400,I=5000,v=100,m="Cannot display dataset due to an error. ",H="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",E="No data for this chrom/contig.",u="Preparing data. This can take a while for a large dataset. If the visualization is saved and closed, preparation will continue in the background.",x="Tool cannot be rerun: ",a="Loading data...",T="Ready for display",O=10,F=20,A=["Histogram","Line","Filled","Intensity"];function U(ad,ac){if(!ac){ac=0}var ae=Math.pow(10,ac);return Math.round(ad*ae)/ae}var p=function(ad,ac,ag){if(!p.id_counter){p.id_counter=0}this.id=p.id_counter++;this.view=ad;this.container=ac;this.drag_handle_class=ag.drag_handle_class;this.is_overview=false;this.action_icons={};this.config=R.ConfigSettingCollection.from_models_and_saved_values(this.config_params,ag.prefs);if(!this.config.get_value("name")){this.config.set_value("name",ag.name)}if(this.config_onchange){this.config.on("change",this.config_onchange,this)}this.container_div=this.build_container_div();this.header_div=null;if(ag.header!==false){var ae=new V.TrackHeaderView({model:this,id:this.id});this.header_div=ae.$el;this.container_div.append(this.header_div);var af=ae.icons_div;this.action_icons=ae.action_icons;this.container_div.hover(function(){af.show()},function(){af.hide()})}};p.prototype.action_icons_def=[{name:"toggle_icon",title:"Hide/show content",css_class:"toggle",on_click_fn:function(ac){if(ac.config.get_value("content_visible")){ac.action_icons.toggle_icon.addClass("toggle-expand").removeClass("toggle");ac.hide_contents();ac.config.set_value("content_visible",false)}else{ac.action_icons.toggle_icon.addClass("toggle").removeClass("toggle-expand");ac.config.set_value("content_visible",true);ac.show_contents()}}},{name:"settings_icon",title:"Edit settings",css_class:"gear",on_click_fn:function(ad){var ac=new R.ConfigSettingCollectionView({collection:ad.config});ac.render_in_modal("Configure Track")}},{name:"remove_icon",title:"Remove",css_class:"remove-icon",on_click_fn:function(ac){$(".tooltip").remove();ac.remove()}}];o(p.prototype,{config_params:[{key:"name",label:"Name",type:"text",default_value:""},{key:"content_visible",type:"bool",default_value:true,hidden:true}],config_onchange:function(){},init:function(){},changed:function(){this.view.changed()},can_draw:function(){if(this.enabled&&this.config.get_value("content_visible")){return true}return false},request_draw:function(){},_draw:function(ac){},to_dict:function(){},set_name:function(ac){this.old_name=this.config.get_value("name");this.config.set_value("name",ac)},revert_name:function(){if(this.old_name){this.config.set_value("name",this.old_name)}},remove:function(){this.changed();this.container.remove_drawable(this);var ac=this.view;this.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})},build_container_div:function(){},update_icons:function(){},hide_contents:function(){},show_contents:function(){},get_drawables:function(){}});var y=function(ad,ac,ae){p.call(this,ad,ac,ae);this.obj_type=ae.obj_type;this.drawables=[]};o(y.prototype,p.prototype,{unpack_drawables:function(ae){this.drawables=[];var ad;for(var ac=0;ac<ae.length;ac++){ad=n(ae[ac],this.view,this);this.add_drawable(ad)}},init:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].init()}},_draw:function(ac){for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad]._draw(ac)}},to_dict:function(){var ad=[];for(var ac=0;ac<this.drawables.length;ac++){ad.push(this.drawables[ac].to_dict())}return{prefs:this.config.to_key_value_dict(),obj_type:this.obj_type,drawables:ad}},add_drawable:function(ac){this.drawables.push(ac);ac.container=this;this.changed()},add_drawable_before:function(ae,ac){this.changed();var ad=this.drawables.indexOf(ac);if(ad!==-1){this.drawables.splice(ad,0,ae);return true}return false},replace_drawable:function(ae,ac,ad){var af=this.drawables.indexOf(ae);if(af!==-1){this.drawables[af]=ac;if(ad){ae.container_div.replaceWith(ac.container_div)}this.changed()}return af},remove_drawable:function(ad){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);ad.container=null;this.changed();return true}return false},move_drawable:function(ad,ae){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);this.drawables.splice(ae,0,ad);this.changed();return true}return false},get_drawables:function(){return this.drawables},get_tracks:function(af){var ac=this.drawables.slice(0),ad=[],ae;while(ac.length!==0){ae=ac.shift();if(ae instanceof af){ad.push(ae)}else{if(ae.drawables){ac=ac.concat(ae.drawables)}}}return ad}});var N=function(ad,ac,af){o(af,{obj_type:"DrawableGroup",drag_handle_class:"group-handle"});y.call(this,ad,ac,af);this.content_div=$("<div/>").addClass("content-div").attr("id","group_"+this.id+"_content_div").appendTo(this.container_div);i(this.container_div,this);i(this.content_div,this);k(this.container_div,this.drag_handle_class,".group",this);this.filters_manager=new h.FiltersManager(this);this.header_div.after(this.filters_manager.parent_div);this.filters_manager.parent_div.after($("<div style='clear: both'/>"));this.saved_filters_managers=[];if("drawables" in af){this.unpack_drawables(af.drawables)}if("filters" in af){var ae=this.filters_manager;this.filters_manager=new h.FiltersManager(this,af.filters);ae.parent_div.replaceWith(this.filters_manager.parent_div);if(af.filters.visible){this.setup_multitrack_filtering()}}};o(N.prototype,p.prototype,y.prototype,{action_icons_def:[p.prototype.action_icons_def[0],p.prototype.action_icons_def[1],{name:"composite_icon",title:"Show composite track",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_composite_track()}},{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters();ac._restore_filter_managers()}else{ac.setup_multitrack_filtering();ac.request_draw({clear_tile_cache:true})}ac.filters_manager.toggle()}},p.prototype.action_icons_def[2]],build_container_div:function(){var ac=$("<div/>").addClass("group").attr("id","group_"+this.id);if(this.container){this.container.content_div.append(ac)}return ac},hide_contents:function(){this.tiles_div.hide()},show_contents:function(){this.tiles_div.show();this.request_draw()},update_icons:function(){var ae=this.drawables.length;if(ae===0){this.action_icons.composite_icon.hide();this.action_icons.filters_icon.hide()}else{if(ae===1){this.action_icons.composite_icon.toggle(this.drawables[0] instanceof e);this.action_icons.filters_icon.hide()}else{var al,ak,ai,ao=true,ag=this.drawables[0].get_type(),ac=0;for(al=0;al<ae;al++){ai=this.drawables[al];if(ai.get_type()!==ag){can_composite=false;break}if(ai instanceof c){ac++}}if(ao&&this.drawables[0] instanceof g){this.action_icons.composite_icon.show()}else{this.action_icons.composite_icon.hide();$(".tooltip").remove()}if(ac>1&&ac===this.drawables.length){var ap={},ad;ai=this.drawables[0];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];ap[ad.name]=[ad]}for(al=1;al<this.drawables.length;al++){ai=this.drawables[al];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];if(ad.name in ap){ap[ad.name].push(ad)}}}this.filters_manager.remove_all();var af,ah,aj,am;for(var an in ap){af=ap[an];if(af.length===ac){ah=new h.NumberFilter({name:af[0].name,index:af[0].index});this.filters_manager.add_filter(ah)}}this.action_icons.filters_icon.toggle(this.filters_manager.filters.length>0)}else{this.action_icons.filters_icon.hide()}}}},_restore_filter_managers:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].filters_manager=this.saved_filters_managers[ac]}this.saved_filters_managers=[]},setup_multitrack_filtering:function(){if(this.filters_manager.filters.length>0){this.saved_filters_managers=[];for(var ac=0;ac<this.drawables.length;ac++){drawable=this.drawables[ac];this.saved_filters_managers.push(drawable.filters_manager);drawable.filters_manager=this.filters_manager}}this.filters_manager.init_filters()},show_composite_track:function(){var ad=new e(this.view,this.view,{name:this.config.get_value("name"),drawables:this.drawables});var ac=this.container.replace_drawable(this,ad,true);ad.request_draw()},add_drawable:function(ac){y.prototype.add_drawable.call(this,ac);this.update_icons()},remove_drawable:function(ac){y.prototype.remove_drawable.call(this,ac);this.update_icons()},to_dict:function(){if(this.filters_manager.visible()){this._restore_filter_managers()}var ac=o(y.prototype.to_dict.call(this),{filters:this.filters_manager.to_dict()});if(this.filters_manager.visible()){this.setup_multitrack_filtering()}return ac},request_draw:function(ac){ab.each(this.drawables,function(ad){ad.request_draw(ac)})}});var Y=Backbone.View.extend({initialize:function(ac){o(ac,{obj_type:"View"});y.call(this,"View",ac.container,ac);this.chrom=null;this.vis_id=ac.vis_id;this.dbkey=ac.dbkey;this.label_tracks=[];this.tracks_to_be_redrawn=[];this.max_low=0;this.max_high=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.load_chroms_deferred=null;this.render();this.canvas_manager=new w.CanvasManager(this.container.get(0).ownerDocument);this.reset();this.config=R.ConfigSettingCollection.from_models_and_saved_values([{key:"name",label:"Name",type:"text",default_value:""},{key:"a_color",label:"A Color",type:"color",default_value:"#FF0000"},{key:"c_color",label:"C Color",type:"color",default_value:"#00FF00"},{key:"g_color",label:"G Color",type:"color",default_value:"#0000FF"},{key:"t_color",label:"T Color",type:"color",default_value:"#FF00FF"},{key:"n_color",label:"N Color",type:"color",default_value:"#AAAAAA"}],{name:ac.name})},render:function(){this.requested_redraw=false;var ae=this.container,ac=this;this.top_container=$("<div/>").addClass("top-container").appendTo(ae);this.browser_content_div=$("<div/>").addClass("content").appendTo(ae);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(ae);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").attr("id","viewport-container").appendTo(this.browser_content_div);this.content_div=this.viewport_container;i(this.viewport_container,ac);this.intro_div=$("<div/>").addClass("intro").appendTo(this.viewport_container);var af=$("<div/>").text("Add Datasets to Visualization").addClass("action-button").appendTo(this.intro_div).click(function(){w.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",{"f-dbkey":ac.dbkey},function(ag){ab.each(ag,function(ah){ac.add_drawable(n(ah,ac,ac))})})});this.nav_container=$("<div/>").addClass("trackster-nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("trackster-nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a/>").attr("title","Close overview").addClass("icon-button overview-close tooltip").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_select=$("<select/>").attr({name:"chrom"}).addClass("chrom-nav").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var ad=function(ag){if(ag.type==="focusout"||(ag.keyCode||ag.which)===13||(ag.keyCode||ag.which)===27){if((ag.keyCode||ag.which)!==27){ac.go_to($(this).val())}$(this).hide();$(this).val("");ac.location_span.show();ac.chrom_select.show()}ag.stopPropagation()};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",ad).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").attr("title","Click to change location").tooltip({placement:"bottom"}).appendTo(this.nav_controls);this.location_span.click(function(){ac.location_span.hide();ac.chrom_select.hide();ac.nav_input.val(ac.chrom+":"+ac.low+"-"+ac.high);ac.nav_input.css("display","inline-block");ac.nav_input.select();ac.nav_input.focus();ac.nav_input.autocomplete({source:function(ai,ag){var aj=[],ah=$.map(ac.get_tracks(c),function(ak){return ak.data_manager.search_features(ai.term).success(function(al){aj=aj.concat(al)})});$.when.apply($,ah).done(function(){ag($.map(aj,function(ak){return{label:ak[0],value:ak[1]}}))})},minLength:2})});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a/>").attr("id","zoom-out").attr("title","Zoom out").tooltip({placement:"bottom"}).click(function(){ac.zoom_out()}).appendTo(this.nav_controls);this.zi_link=$("<a/>").attr("id","zoom-in").attr("title","Zoom in").tooltip({placement:"bottom"}).click(function(){ac.zoom_in()}).appendTo(this.nav_controls);this.load_chroms_deferred=this.load_chroms({low:0});this.chrom_select.bind("change",function(){ac.change_chrom(ac.chrom_select.val())});this.browser_content_div.click(function(ag){$(this).find("input").trigger("blur")});this.browser_content_div.bind("dblclick",function(ag){ac.zoom_in(ag.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(ag,ah){this.current_x=ah.offsetX}).bind("drag",function(ag,ai){var aj=ai.offsetX-this.current_x;this.current_x=ai.offsetX;var ah=Math.round(aj/ac.viewport_container.width()*(ac.max_high-ac.max_low));ac.move_delta(-ah)});this.overview_close.click(function(){ac.reset_overview()});this.viewport_container.bind("draginit",function(ag,ah){if(ag.clientX>ac.viewport_container.width()-16){return false}}).bind("dragstart",function(ag,ah){ah.original_low=ac.low;ah.current_height=ag.clientY;ah.current_x=ah.offsetX}).bind("drag",function(ai,ak){var ag=$(this);var al=ak.offsetX-ak.current_x;var ah=ag.scrollTop()-(ai.clientY-ak.current_height);ag.scrollTop(ah);ak.current_height=ai.clientY;ak.current_x=ak.offsetX;var aj=Math.round(al/ac.viewport_container.width()*(ac.high-ac.low));ac.move_delta(aj)});this.top_labeltrack.bind("dragstart",function(ag,ah){return $("<div/>").addClass("zoom-area").css("height",ac.browser_content_div.height()+ac.top_labeltrack.height()+1).appendTo($(this))}).bind("drag",function(ak,al){$(al.proxy).css({left:Math.min(ak.pageX,al.startX)-ac.container.offset().left,width:Math.abs(ak.pageX-al.startX)});var ah=Math.min(ak.pageX,al.startX)-ac.container.offset().left,ag=Math.max(ak.pageX,al.startX)-ac.container.offset().left,aj=(ac.high-ac.low),ai=ac.viewport_container.width();ac.update_location(Math.round(ah/ai*aj)+ac.low,Math.round(ag/ai*aj)+ac.low)}).bind("dragend",function(al,am){var ah=Math.min(al.pageX,am.startX),ag=Math.max(al.pageX,am.startX),aj=(ac.high-ac.low),ai=ac.viewport_container.width(),ak=ac.low;ac.low=Math.round(ah/ai*aj)+ak;ac.high=Math.round(ag/ai*aj)+ak;$(am.proxy).remove();ac.request_redraw()});this.add_label_track(new W(this,{content_div:this.top_labeltrack}));$(window).bind("resize",function(){if(this.resize_timer){clearTimeout(this.resize_timer)}this.resize_timer=setTimeout(function(){ac.resize_window()},500)});$(document).bind("redraw",function(){ac.redraw()});this.reset();$(window).trigger("resize")},get_base_color:function(ac){return this.config.get_value(ac.toLowerCase()+"_color")||this.config.get_value("n_color")}});o(Y.prototype,y.prototype,{changed:function(){this.has_changes=true},update_intro_div:function(){this.intro_div.toggle(this.drawables.length===0)},trigger_navigate:function(ad,af,ac,ag){if(this.timer){clearTimeout(this.timer)}if(ag){var ae=this;this.timer=setTimeout(function(){ae.trigger("navigate",ad+":"+af+"-"+ac)},500)}else{view.trigger("navigate",ad+":"+af+"-"+ac)}},update_location:function(ac,ae){this.location_span.text(commatize(ac)+" - "+commatize(ae));this.nav_input.val(this.chrom+":"+commatize(ac)+"-"+commatize(ae));var ad=view.chrom_select.val();if(ad!==""){this.trigger_navigate(ad,view.low,view.high,true)}},load_chroms:function(ae){ae.num=v;var ac=this,ad=$.Deferred();$.ajax({url:galaxy_config.root+"api/genomes/"+this.dbkey,data:ae,dataType:"json",success:function(ag){if(ag.chrom_info.length===0){return}if(ag.reference){var ah=new B(ac);ac.add_label_track(ah);ac.reference_track=ah}ac.chrom_data=ag.chrom_info;var ak='<option value="">Select Chrom/Contig</option>';for(var aj=0,af=ac.chrom_data.length;aj<af;aj++){var ai=ac.chrom_data[aj].chrom;ak+='<option value="'+ai+'">'+ai+"</option>"}if(ag.prev_chroms){ak+='<option value="previous">Previous '+v+"</option>"}if(ag.next_chroms){ak+='<option value="next">Next '+v+"</option>"}ac.chrom_select.html(ak);ac.chrom_start_index=ag.start_index;ad.resolve(ag.chrom_info)},error:function(){alert("Could not load chroms for this dbkey: "+ac.dbkey)}});return ad},change_chrom:function(ah,ad,aj){var ae=this;if(!ae.chrom_data){ae.load_chroms_deferred.then(function(){ae.change_chrom(ah,ad,aj)});return}if(!ah||ah==="None"){return}if(ah==="previous"){ae.load_chroms({low:this.chrom_start_index-v});return}if(ah==="next"){ae.load_chroms({low:this.chrom_start_index+v});return}var ai=$.grep(ae.chrom_data,function(ak,al){return ak.chrom===ah})[0];if(ai===undefined){ae.load_chroms({chrom:ah},function(){ae.change_chrom(ah,ad,aj)});return}else{if(ah!==ae.chrom){ae.chrom=ah;ae.chrom_select.val(ae.chrom);ae.max_high=ai.len-1;ae.reset();for(var ag=0,ac=ae.drawables.length;ag<ac;ag++){var af=ae.drawables[ag];if(af.init){af.init()}}if(ae.reference_track){ae.reference_track.init()}}if(ad===undefined&&aj===undefined){ae.low=0;ae.high=ae.max_high}else{ae.low=(ad!==undefined?Math.max(ad,0):0);if(aj===undefined){ae.low=Math.max(ae.low-15,0);ae.high=ae.low+30}else{ae.high=Math.min(aj,ae.max_high)}}ae.request_redraw()}},go_to:function(ag){ag=ag.replace(/,/g,"");ag=ag.replace(/:|\-/g," ");var ad=ag.split(/\s+/),af=ad[0],ae=(ad[1]?parseInt(ad[1],10):undefined),ac=(ad[2]?parseInt(ad[2],10):undefined);this.change_chrom(af,ae,ac)},move_fraction:function(ae){var ac=this;var ad=ac.high-ac.low;this.move_delta(ae*ad)},move_delta:function(af){var ac=this;var ae=ac.high-ac.low;if(ac.low-af<ac.max_low){ac.low=ac.max_low;ac.high=ac.max_low+ae}else{if(ac.high-af>ac.max_high){ac.high=ac.max_high;ac.low=ac.max_high-ae}else{ac.high-=af;ac.low-=af}}ac.request_redraw({data_fetch:false});if(this.redraw_on_move_fn){clearTimeout(this.redraw_on_move_fn)}this.redraw_on_move_fn=setTimeout(function(){ac.request_redraw()},200);var ad=ac.chrom_select.val();this.trigger_navigate(ad,ac.low,ac.high,true)},add_drawable:function(ad){y.prototype.add_drawable.call(this,ad);ad.init();this.changed();this.update_intro_div();var ac=this;ad.config.on("change",function(){ac.changed()})},add_label_track:function(ac){ac.view=this;ac.init();this.label_tracks.push(ac)},remove_drawable:function(ae,ad){y.prototype.remove_drawable.call(this,ae);if(ad){var ac=this;ae.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})}},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},request_redraw:function(ad,ae){var ac=this,af=(ae?[ae]:ac.drawables);ab.each(af,function(ag){var ah=ab.find(ac.tracks_to_be_redrawn,function(ai){return ai[0]===ag});if(ah){ah[1]=ad}else{ac.tracks_to_be_redrawn.push([ag,ad])}});if(!this.requested_redraw){requestAnimationFrame(function(){ac._redraw()});this.requested_redraw=true}},_redraw:function(){this.requested_redraw=false;var ac=this.low,ag=this.high;if(ac<this.max_low){ac=this.max_low}if(ag>this.max_high){ag=this.max_high}var ad=this.high-this.low;if(this.high!==0&&ad<this.min_separation){ag=ac+this.min_separation}this.low=Math.floor(ac);this.high=Math.ceil(ag);this.update_location(this.low,this.high);this.resolution_px_b=this.viewport_container.width()/(this.high-this.low);var af=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ah=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ae=13;this.overview_box.css({left:af,width:Math.max(ae,ah)}).show();if(ah<ae){this.overview_box.css("left",af-(ae-ah)/2)}if(this.overview_highlight){this.overview_highlight.css({left:af,width:ah})}ab.each(this.tracks_to_be_redrawn,function(ak){var ai=ak[0],aj=ak[1];if(ai){ai._draw(aj)}});this.tracks_to_be_redrawn=[];ab.each(this.label_tracks,function(ai){ai._draw()})},zoom_in:function(ad,ae){if(this.max_high===0||this.high-this.low<=this.min_separation){return}var af=this.high-this.low,ag=af/2+this.low,ac=(af/this.zoom_factor)/2;if(ad){ag=ad/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(ag-ac);this.high=Math.round(ag+ac);this.changed();this.request_redraw()},zoom_out:function(){if(this.max_high===0){return}var ad=this.high-this.low,ae=ad/2+this.low,ac=(ad*this.zoom_factor)/2;this.low=Math.round(ae-ac);this.high=Math.round(ae+ac);this.changed();this.request_redraw()},resize_viewport:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height())},resize_window:function(){this.resize_viewport();this.request_redraw()},set_overview:function(ae){if(this.overview_drawable){if(this.overview_drawable.dataset.id===ae.dataset.id){return}this.overview_viewport.find(".track").remove()}var ad=ae.copy({content_div:this.overview_viewport}),ac=this;ad.header_div.hide();ad.is_overview=true;ac.overview_drawable=ad;this.overview_drawable.postdraw_actions=function(){ac.overview_highlight.show().height(ac.overview_drawable.content_div.height());ac.overview_viewport.height(ac.overview_drawable.content_div.height()+ac.overview_box.outerHeight());ac.overview_close.show();ac.resize_window()};ac.overview_drawable.request_draw();this.changed()},reset_overview:function(){$(".tooltip").remove();this.overview_viewport.find(".track-tile").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide();view.resize_window();view.overview_drawable=null}});var q=P.Tool.extend({defaults:{track:null},initialize:function(ac){P.Tool.prototype.initialize.call(this,ac);var ad=true;if(ac.tool_state!==undefined&&ac.tool_state.hidden!==undefined){ad=ac.tool_state.hidden}this.set("hidden",ad);this.remove_inputs(["data","hidden_data","conditional"])},state_dict:function(ac){return ab.extend(this.get_inputs_dict(),{hidden:!this.is_visible()})}});var t=Backbone.View.extend({events:{"change :input":"update_value"},render:function(){var ae=this.$el.addClass("param-row"),af=this.model;var ac=$("<div>").addClass("param-label").text(af.get("label")).appendTo(ae);var ad=$("<div/>").addClass("param-input").html(af.get("html")).appendTo(ae);ad.find(":input").val(af.get("value"));$("<div style='clear: both;'/>").appendTo(ae)},update_value:function(ac){this.model.set_value($(ac.target).val())}});var aa=Backbone.View.extend({initialize:function(ac){this.model.on("change:hidden",this.set_visible,this)},render:function(){var ad=this;tool=this.model,parent_div=this.$el.addClass("dynamic-tool").hide();parent_div.bind("drag",function(ah){ah.stopPropagation()}).click(function(ah){ah.stopPropagation()}).bind("dblclick",function(ah){ah.stopPropagation()}).keydown(function(ah){ah.stopPropagation()});var ae=$("<div class='tool-name'>").appendTo(parent_div).text(tool.get("name"));tool.get("inputs").each(function(ai){var ah=new t({model:ai});ah.render();parent_div.append(ah.$el)});parent_div.find("input").click(function(){$(this).select()});var af=$("<div>").addClass("param-row").appendTo(parent_div);var ag=$("<input type='submit'>").attr("value","Run on complete dataset").appendTo(af);var ac=$("<input type='submit'>").attr("value","Run on visible region").appendTo(af);ac.click(function(){ad.run_on_region()});ag.click(function(){ad.run_on_dataset()});if(tool.is_visible()){this.$el.show()}},set_visible:function(){this.$el.toggle(this.model.is_visible())},update_params:function(){for(var ac=0;ac<this.params.length;ac++){this.params[ac].update_value()}},run_on_dataset:function(){var ac=this.model;this.run({target_dataset_id:this.model.get("track").dataset.id,action:"rerun",tool_id:ac.id},null,function(ad){Galaxy.modal.show({title:ac.get("name")+" is Running",body:ac.get("name")+" is running on the complete dataset. Tool outputs are in dataset's history.",buttons:{Close:function(){Galaxy.modal.hide()}}})})},run_on_region:function(){var ad=this.model.get("track"),ag=this.model,ai=new w.GenomeRegion({chrom:ad.view.chrom,start:ad.view.low,end:ad.view.high}),aj={target_dataset_id:ad.dataset.id,action:"rerun",tool_id:ag.id,regions:[ai.toJSON()]},ah=ad,al=ag.get("name")+ah.tool_region_and_parameters_str(ai),ac;if(ah.container===view){var ak=new N(view,view,{name:ad.config.get_value("name")});var af=ah.container.replace_drawable(ah,ak,false);ak.container_div.insertBefore(ah.view.content_div.children()[af]);ak.add_drawable(ah);ah.container_div.appendTo(ak.content_div);ac=ak}else{ac=ah.container}var ae=new ah.constructor(view,ac,{name:al,hda_ldda:"hda"});ae.init_for_tool_data();ae.change_mode(ah.mode);ae.set_filters_manager(ah.filters_manager.copy(ae));ae.update_icons();ac.add_drawable(ae);ae.tiles_div.text("Starting job.");this.run(aj,ae,function(am){ae.set_dataset(new X.Dataset(am));ae.tiles_div.text("Running job.");ae.init()})},run:function(ac,ae,af){ac.inputs=this.model.get_inputs_dict();var ad=new j.ServerStateDeferred({ajax_settings:{url:galaxy_config.root+"api/tools",data:JSON.stringify(ac),dataType:"json",contentType:"application/json",type:"POST"},interval:2000,success_fn:function(ag){return ag!=="pending"}});$.when(ad.go()).then(function(ag){if(ag==="no converter"){ae.container_div.addClass("error");ae.content_div.text(H)}else{if(ag.error){ae.container_div.addClass("error");ae.content_div.text(x+ag.message)}else{af(ag)}}})}});var C=function(ac,ad){J.Scaler.call(this,ad);this.filter=ac};C.prototype.gen_val=function(ac){if(this.filter.high===Number.MAX_VALUE||this.filter.low===-Number.MAX_VALUE||this.filter.low===this.filter.high){return this.default_val}return((parseFloat(ac[this.filter.index])-this.filter.low)/(this.filter.high-this.filter.low))};var b=function(ac,af,ag,ad,ae){this.track=ac;this.region=af;this.low=af.get("start");this.high=af.get("end");this.w_scale=ag;this.canvas=ad;this.html_elt=$("<div class='track-tile'/>").append(ad);this.data=ae;this.stale=false};b.prototype.predisplay_actions=function(){};var K=function(ac,af,ag,ad,ae){b.call(this,ac,af,ag,ad,ae)};K.prototype.predisplay_actions=function(){};var M=function(ae,aj,al,ad,ag,ah,am,ac,ai,af,ak){b.call(this,ae,aj,al,ad,ag);this.mode=ah;this.all_slotted=ac;this.feature_mapper=ai;this.has_icons=false;this.incomplete_features=af;this.other_tiles_features_drawn={};this.seq_data=ak};o(M.prototype,b.prototype);M.prototype.predisplay_actions=function(){};var f=function(ad,ac,ae){o(ae,{drag_handle_class:"draghandle"});p.call(this,ad,ac,ae);this.dataset=null;if(ae.dataset){this.dataset=(ae.dataset instanceof Backbone.Model?ae.dataset:new X.Dataset(ae.dataset))}this.dataset_check_type="converted_datasets_state";this.data_url_extra_params={};this.data_query_wait=("data_query_wait" in ae?ae.data_query_wait:I);this.data_manager=("data_manager" in ae?ae.data_manager:new w.GenomeDataManager({dataset:this.dataset,genome:new w.Genome({key:ad.dbkey,chroms_info:{chrom_info:ad.chrom_data}}),data_mode_compatible:this.data_and_mode_compatible,can_subset:this.can_subset}));this.min_height_px=16;this.max_height_px=800;this.visible_height_px=this.config.get_value("height");this.content_div=$("<div class='track-content'>").appendTo(this.container_div);if(this.container){this.container.content_div.append(this.container_div);if(!("resize" in ae)||ae.resize){this.add_resize_handle()}}};o(f.prototype,p.prototype,{action_icons_def:[{name:"mode_icon",title:"Set display mode",css_class:"chevron-expand",on_click_fn:function(){}},p.prototype.action_icons_def[0],{name:"overview_icon",title:"Set as overview",css_class:"application-dock-270",on_click_fn:function(ac){ac.view.set_overview(ac)}},p.prototype.action_icons_def[1],{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters()}else{ac.filters_manager.init_filters()}ac.filters_manager.toggle()}},{name:"tools_icon",title:"Tool",css_class:"hammer",on_click_fn:function(ac){ac.tool.toggle();if(ac.tool.is_visible()){ac.set_name(ac.config.get_value("name")+ac.tool_region_and_parameters_str())}else{ac.revert_name()}$(".tooltip").remove()}},{name:"param_space_viz_icon",title:"Tool parameter space visualization",css_class:"arrow-split",on_click_fn:function(ac){var af='<strong>Tool</strong>: <%= track.tool.get("name") %><br/><strong>Dataset</strong>: <%= track.config.get_value("name") %><br/><strong>Region(s)</strong>: <select name="regions"><option value="cur">current viewing area</option><option value="bookmarks">bookmarks</option><option value="both">current viewing area and bookmarks</option></select>',ae=ab.template(af,{track:ac});var ah=function(){Galaxy.modal.hide();$(window).unbind("keypress.check_enter_esc")},ad=function(){var aj=$('select[name="regions"] option:selected').val(),al,ai=new w.GenomeRegion({chrom:view.chrom,start:view.low,end:view.high}),ak=ab.map($(".bookmark"),function(am){return new w.GenomeRegion({from_str:$(am).children(".position").text()})});if(aj==="cur"){al=[ai]}else{if(aj==="bookmarks"){al=ak}else{al=[ai].concat(ak)}}Galaxy.modal.hide();window.location.href=galaxy_config.root+"visualization/sweepster?"+$.param({dataset_id:ac.dataset.id,hda_ldda:ac.dataset.get("hda_ldda"),regions:JSON.stringify(new Backbone.Collection(al).toJSON())})},ag=function(ai){if((ai.keyCode||ai.which)===27){ah()}else{if((ai.keyCode||ai.which)===13){ad()}}};Galaxy.modal.show({title:"Visualize tool parameter space and output from different parameter settings?",body:ae,buttons:{No:ah,Yes:ad}})}},p.prototype.action_icons_def[2]],can_draw:function(){return this.dataset&&p.prototype.can_draw.call(this)},build_container_div:function(){return $("<div/>").addClass("track").attr("id","track_"+this.id)},set_dataset:function(ac){this.dataset=ac;this.data_manager.set("dataset",ac)},on_resize:function(){this.request_draw({clear_tile_cache:true})},add_resize_handle:function(){var ac=this;var af=false;var ae=false;var ad=$("<div class='track-resize'>");$(ac.container_div).hover(function(){if(ac.config.get_value("content_visible")){af=true;ad.show()}},function(){af=false;if(!ae){ad.hide()}});ad.hide().bind("dragstart",function(ag,ah){ae=true;ah.original_height=$(ac.content_div).height()}).bind("drag",function(ah,ai){var ag=Math.min(Math.max(ai.original_height+ai.deltaY,ac.min_height_px),ac.max_height_px);$(ac.tiles_div).css("height",ag);ac.visible_height_px=(ac.max_height_px===ag?0:ag);ac.on_resize()}).bind("dragend",function(ag,ah){ac.tile_cache.clear();ae=false;if(!af){ad.hide()}ac.config.set_value("height",ac.visible_height_px);ac.changed()}).appendTo(ac.container_div)},hide_contents:function(){this.tiles_div.hide();this.container_div.find(".yaxislabel, .track-resize").hide()},show_contents:function(){this.tiles_div.show();this.container_div.find(".yaxislabel, .track-resize").show();this.request_draw()},get_type:function(){if(this instanceof W){return"LabelTrack"}else{if(this instanceof B){return"ReferenceTrack"}else{if(this instanceof g){return"LineTrack"}else{if(this instanceof S){return"ReadTrack"}else{if(this instanceof Z){return"VariantTrack"}else{if(this instanceof e){return"CompositeTrack"}else{if(this instanceof c){return"FeatureTrack"}}}}}}}return""},show_message:function(ac){this.tiles_div.remove();return $("<span/>").addClass("message").html(ac).appendTo(this.content_div)},init:function(ae){var ad=this;ad.enabled=false;ad.tile_cache.clear();ad.data_manager.clear();ad.content_div.children().remove();ad.container_div.removeClass("nodata error pending");ad.tiles_div=$("<div/>").addClass("tiles").appendTo(ad.content_div);if(!ad.dataset.id){return}var ac=$.Deferred(),af={hda_ldda:ad.dataset.get("hda_ldda"),data_type:this.dataset_check_type,chrom:ad.view.chrom,retry:ae};$.getJSON(this.dataset.url(),af,function(ag){if(!ag||ag==="error"||ag.kind==="error"){ad.container_div.addClass("error");var ah=ad.show_message(m);if(ag.message){ah.append($("<a href='javascript:void(0);'></a>").text("View error").click(function(){Galaxy.modal.show({title:"Trackster Error",body:"<pre>"+ag.message+"</pre>",buttons:{Close:function(){Galaxy.modal.hide()}}})}));ah.append($("<span/>").text(" "));ah.append($("<a href='javascript:void(0);'></a>").text("Try again").click(function(){ad.init(true)}))}}else{if(ag==="no converter"){ad.container_div.addClass("error");ad.show_message(H)}else{if(ag==="no data"||(ag.data!==undefined&&(ag.data===null||ag.data.length===0))){ad.container_div.addClass("nodata");ad.show_message(E)}else{if(ag==="pending"){ad.container_div.addClass("pending");ad.show_message(u);setTimeout(function(){ad.init()},ad.data_query_wait)}else{if(ag==="data"||ag.status==="data"){if(ag.valid_chroms){ad.valid_chroms=ag.valid_chroms;ad.update_icons()}ad.tiles_div.text(T);if(ad.view.chrom){ad.tiles_div.text("");ad.tiles_div.css("height",ad.visible_height_px+"px");ad.enabled=true;$.when.apply($,ad.predraw_init()).done(function(){ac.resolve();ad.container_div.removeClass("nodata error pending");ad.request_draw()})}else{ac.resolve()}}}}}}});this.update_icons();return ac},predraw_init:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(af&&af.min&&af.max){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_default_value("min_value",ae);ac.config.set_default_value("max_value",ag);ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},get_drawables:function(){return this}});var L=function(ae,ad,ag){f.call(this,ae,ad,ag);var ac=this;k(ac.container_div,ac.drag_handle_class,".group",ac);this.filters_manager=new h.FiltersManager(this,("filters" in ag?ag.filters:null));this.data_manager.set("filters_manager",this.filters_manager);this.filters_available=false;this.tool=(ag.tool?new q(ab.extend(ag.tool,{track:this,tool_state:ag.tool_state})):null);this.tile_cache=new w.Cache(O);this.left_offset=0;if(this.header_div){this.set_filters_manager(this.filters_manager);if(this.tool){var af=new aa({model:this.tool});af.render();this.dynamic_tool_div=af.$el;this.header_div.after(this.dynamic_tool_div)}}this.tiles_div=$("<div/>").addClass("tiles").appendTo(this.content_div);if(!this.config.get_value("content_visible")){this.tiles_div.hide()}this.overlay_div=$("<div/>").addClass("overlay").appendTo(this.content_div);if(ag.mode){this.change_mode(ag.mode)}};o(L.prototype,p.prototype,f.prototype,{action_icons_def:f.prototype.action_icons_def.concat([{name:"show_more_rows_icon",title:"To minimize track height, not all feature rows are displayed. Click to display more rows.",css_class:"exclamation",on_click_fn:function(ac){$(".tooltip").remove();ac.slotters[ac.view.resolution_px_b].max_rows*=2;ac.request_draw({clear_tile_cache:true})},hide:true}]),copy:function(ac){var ad=this.to_dict();o(ad,{data_manager:this.data_manager});var ae=new this.constructor(this.view,ac,ad);ae.change_mode(this.mode);ae.enabled=this.enabled;return ae},set_filters_manager:function(ac){this.filters_manager=ac;this.header_div.after(this.filters_manager.parent_div)},to_dict:function(){return{track_type:this.get_type(),dataset:{id:this.dataset.id,hda_ldda:this.dataset.get("hda_ldda")},prefs:this.config.to_key_value_dict(),mode:this.mode,filters:this.filters_manager.to_dict(),tool_state:(this.tool?this.tool.state_dict():{})}},set_min_max:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(isNaN(parseFloat(ac.config.get_value("min_value")))||isNaN(parseFloat(ac.config.get_value("max_value")))){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},change_mode:function(ad){var ac=this;ac.mode=ad;ac.config.set_value("mode",ad);if(ad==="Auto"){this.data_manager.clear()}ac.request_draw({clear_tile_cache:true});this.action_icons.mode_icon.attr("title","Set display mode (now: "+ac.mode+")");return ac},update_icons:function(){var ac=this;ac.action_icons.filters_icon.toggle(ac.filters_available);ac.action_icons.tools_icon.toggle(ac.tool!==null);ac.action_icons.param_space_viz_icon.toggle(ac.tool!==null)},_gen_tile_cache_key:function(ad,ac){return ad+"_"+ac},request_draw:function(ac){if(ac&&ac.clear_tile_cache){this.tile_cache.clear()}this.view.request_redraw(ac,this)},before_draw:function(){this.max_height_px=0},_draw:function(aq){if(!this.can_draw()){return}var an=aq&&aq.clear_after,al=this.view.low,ag=this.view.high,aj=ag-al,ad=this.view.container.width(),ap=this.view.resolution_px_b,af=1/ap;if(this.is_overview){al=this.view.max_low;ag=this.view.max_high;ap=ad/(view.max_high-view.max_low);af=1/ap}this.before_draw();this.tiles_div.children().addClass("remove");var ac=Math.floor(al/(af*Q)),ak=Math.floor(ac*Q*af),am,ah,ai=[],ao=[];while((ac*Q*af)<ag){am=new w.GenomeRegion({chrom:this.view.chrom,start:ak,end:Math.min(ak+Math.ceil(Q*af),this.view.max_high)});ah=this.draw_helper(am,ap,aq);ai.push(ah);$.when(ah).then(function(ar){ao.push(ar)});ac+=1;ak=am.get("end")}if(!an){this.tiles_div.children(".remove").removeClass("remove").remove()}var ae=this;$.when.apply($,ai).then(function(){ae.tiles_div.children(".remove").remove();ao=ab.filter(ao,function(ar){return ar!==null});if(ao.length!==0){ae.postdraw_actions(ao,ad,ap,an)}})},_add_yaxis_label:function(af,ah){var ad=this,ag=(af==="max"?"top":"bottom"),ai=(af==="max"?"max":"min"),ac=(af==="max"?"max_value":"min_value"),ae=this.container_div.find(".yaxislabel."+ag);ah=ah||function(){ad.request_draw({clear_tile_cache:true})};if(ae.length!==0){ae.text(ad.config.get_value(ac))}else{ae=$("<div/>").text(ad.config.get_value(ac)).make_text_editable({num_cols:12,on_finish:function(aj){$(".tooltip").remove();ad.config.set_value(ac,aj);ah()},help_text:"Set "+ai+" value"}).addClass("yaxislabel "+ag).css("color",this.config.get_value("label_color"));this.container_div.prepend(ae)}},postdraw_actions:function(af,ag,ai,ac){var ae=ab.filter(af,function(aj){return(aj instanceof K)});if(ae.length>0){this.max_height_px=0;var ad=this;ab.each(af,function(aj){if(!(aj instanceof K)){aj.html_elt.remove();ad.draw_helper(aj.region,ai,{force:true,mode:"Coverage"})}});ad._add_yaxis_label("max")}else{this.container_div.find(".yaxislabel").remove();var ah=ab.find(af,function(aj){return aj.has_icons});if(ah){ab.each(af,function(aj){if(!aj.has_icons){aj.html_elt.css("padding-top",D)}})}}},get_mode:function(ac){return this.mode},update_auto_mode:function(ac){},_get_drawables:function(){return[this]},draw_helper:function(al,an,ao){if(!ao){ao={}}var ad=ao.force,ai=ao.mode||this.mode,af=1/an,ae=this,ag=this._get_drawables(),am=this._gen_tile_cache_key(an,al),ah=function(ap){return(ap&&"track" in ap)};var aj=(ad?undefined:ae.tile_cache.get_elt(am));if(aj){if(ah(aj)){ae.show_tile(aj,an)}return aj}if(ao.data_fetch===false){return null}var ak=function(){var ap=(ab.find(A,function(ar){return ar===ai})?"Coverage":ai);var aq=ab.map(ag,function(ar){return ar.data_manager.get_data(al,ap,af,ae.data_url_extra_params)});if(view.reference_track){aq.push(view.reference_track.data_manager.get_data(al,ai,af,view.reference_track.data_url_extra_params))}return aq};var ac=$.Deferred();ae.tile_cache.set_elt(am,ac);$.when.apply($,ak()).then(function(){var ap=ak(),av=ap,aB;if(ab.find(ap,function(aD){return j.is_deferred(aD)})){ae.tile_cache.set_elt(am,undefined);$.when(ae.draw_helper(al,an,ao)).then(function(aD){ac.resolve(aD)});return}if(view.reference_track){aB=view.reference_track.data_manager.subset_entry(ap.pop(),al)}var aw=[],at=[];ab.each(ag,function(aG,aD){var aF=aG.mode,aE=av[aD];if(aF==="Auto"){aF=aG.get_mode(aE);aG.update_auto_mode(aF)}aw.push(aF);at.push(aG.get_canvas_height(aE,aF,an,aq))});var au=ae.view.canvas_manager.new_canvas(),ax=al.get("start"),aC=al.get("end"),ar=0,aq=Math.ceil((aC-ax)*an)+ae.left_offset,az=ab.max(at),ay;au.width=aq;au.height=(ao.height||az);var aA=au.getContext("2d");aA.translate(ae.left_offset,0);if(ag.length>1){aA.globalAlpha=0.5;aA.globalCompositeOperation="source-over"}ab.each(ag,function(aE,aD){ay=aE.draw_tile(av[aD],aA,aw[aD],al,an,aB)});if(ay!==undefined){ae.tile_cache.set_elt(am,ay);ae.show_tile(ay,an)}ac.resolve(ay)});return ac},get_canvas_height:function(ac,ae,af,ad){return this.visible_height_px},_draw_line_track_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.LinePainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new K(this,ag,ai,af,ac.data)},draw_tile:function(ac,ad,ag,af,ah,ae){},show_tile:function(ae,ah){var ad=this,ac=ae.html_elt;ae.predisplay_actions();var ag=Math.round((ae.low-(this.is_overview?this.view.max_low:this.view.low))*ah);if(this.left_offset){ag-=this.left_offset}ac.css("left",ag);if(ac.hasClass("remove")){ac.removeClass("remove")}else{this.tiles_div.append(ac)}ac.css("height","auto");this.max_height_px=Math.max(this.max_height_px,ac.height()-2);ac.parent().children().css("height",this.max_height_px+"px");var af=this.max_height_px;if(this.visible_height_px!==0){af=Math.min(this.max_height_px,this.visible_height_px)}this.tiles_div.css("height",af+"px")},tool_region_and_parameters_str:function(af){var ac=this,ae=(af!==undefined?af.toString():"all"),ad=ab.values(ac.tool.get_inputs_dict()).join(", ");return" - region=["+ae+"], parameters=["+ad+"]"},data_and_mode_compatible:function(ac,ad){if(ad==="Auto"){return true}else{if(ad==="Coverage"){return ac.dataset_type==="bigwig"}else{if(ac.dataset_type==="bigwig"||ac.extra_info==="no_detail"){return false}else{return true}}}},can_subset:function(ac){if(ac.message||ac.extra_info==="no_detail"){return false}else{if(ac.dataset_type==="bigwig"){return(ac.data[1][0]-ac.data[0][0]===1)}}return true},init_for_tool_data:function(){this.data_manager.set("data_type","raw_data");this.data_query_wait=1000;this.dataset_check_type="state"}});var W=function(ad,ac){f.call(this,ad,ac,{resize:false,header:false});this.container_div.addClass("label-track")};o(W.prototype,f.prototype,{init:function(){this.enabled=true},predraw_init:function(){},_draw:function(ag){var ae=this.view,af=ae.high-ae.low,aj=Math.floor(Math.pow(10,Math.floor(Math.log(af)/Math.log(10)))),ac=Math.floor(ae.low/aj)*aj,ah=this.view.container.width(),ad=$("<div/>").addClass("label-container");while(ac<ae.high){var ai=(ac-ae.low)/af*ah;ad.append($("<div/>").addClass("label").text(commatize(ac)).css({left:ai}));ac+=aj}this.content_div.children(":first").remove();this.content_div.append(ad)}});var e=function(ad,ac,ag){L.call(this,ad,ac,ag);this.drawables=[];if("drawables" in ag){var af;for(var ae=0;ae<ag.drawables.length;ae++){af=ag.drawables[ae];this.drawables[ae]=n(af,ad,null);if(af.left_offset>this.left_offset){this.left_offset=af.left_offset}}this.enabled=true}ab.each(this.drawables,function(ah){if(ah instanceof c||ah instanceof S){ah.change_mode("Coverage")}});this.update_icons();this.obj_type="CompositeTrack"};o(e.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),action_icons_def:[{name:"composite_icon",title:"Show individual tracks",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_group()}}].concat(L.prototype.action_icons_def),to_dict:y.prototype.to_dict,add_drawable:y.prototype.add_drawable,unpack_drawables:y.prototype.unpack_drawables,config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},on_resize:function(){var ac=this.visible_height_px;ab.each(this.drawables,function(ad){ad.visible_height_px=ac});f.prototype.on_resize.call(this)},change_mode:function(ac){L.prototype.change_mode.call(this,ac);for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad].change_mode(ac)}},init:function(){var ae=[];for(var ad=0;ad<this.drawables.length;ad++){ae.push(this.drawables[ad].init())}var ac=this;$.when.apply($,ae).then(function(){ac.enabled=true;ac.request_draw()})},update_icons:function(){this.action_icons.filters_icon.hide();this.action_icons.tools_icon.hide();this.action_icons.param_space_viz_icon.hide()},can_draw:p.prototype.can_draw,_get_drawables:function(){return this.drawables},show_group:function(){var af=new N(this.view,this.container,{name:this.config.get_value("name")}),ac;for(var ae=0;ae<this.drawables.length;ae++){ac=this.drawables[ae];ac.update_icons();af.add_drawable(ac);ac.container=af;af.content_div.append(ac.container_div)}var ad=this.container.replace_drawable(this,af,true);af.request_draw({clear_tile_cache:true})},before_draw:function(){var ad=ab.min(ab.map(this.drawables,function(ae){return ae.config.get_value("min_value")})),ac=ab.max(ab.map(this.drawables,function(ae){return ae.config.get_value("max_value")}));this.config.set_value("min_value",ad);this.config.set_value("max_value",ac);ab.each(this.drawables,function(ae){ae.config.set_value("min_value",ad);ae.config.set_value("max_value",ac)})},update_all_min_max:function(){var ad=this,ac=this.config.get_value("min_value"),ae=this.config.get_value("max_value");ab.each(this.drawables,function(af){af.config.set_value("min_value",ac);af.config.set_value("max_value",ae)});this.request_draw({clear_tile_cache:true})},postdraw_actions:function(ai,ac,al,ah){var ag=-1,ae;for(ae=0;ae<ai.length;ae++){var aj=ai[ae].html_elt.find("canvas").height();if(aj>ag){ag=aj}}for(ae=0;ae<ai.length;ae++){var af=ai[ae];if(af.html_elt.find("canvas").height()!==ag){this.draw_helper(af.region,al,{force:true,height:ag});af.html_elt.remove()}}var ad=this,ak=function(){ad.update_all_min_max()};this._add_yaxis_label("min",ak);this._add_yaxis_label("max",ak)}});var B=function(ac){L.call(this,ac,{content_div:ac.top_labeltrack},{resize:false,header:false});this.left_offset=ac.canvas_manager.char_width_px;this.container_div.addClass("reference-track");this.data_url=galaxy_config.root+"api/genomes/"+this.view.dbkey;this.data_url_extra_params={reference:true};this.data_manager=new w.GenomeReferenceDataManager({data_url:this.data_url,can_subset:this.can_subset});this.hide_contents()};o(B.prototype,p.prototype,L.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"height",type:"int",default_value:13,hidden:true}]),init:function(){this.data_manager.clear();this.enabled=true},predraw_init:function(){},can_draw:p.prototype.can_draw,draw_helper:function(af,ah,ad){var ac=this.tiles_div.is(":visible"),ag,ae=null;if(ah>this.view.canvas_manager.char_width_px){this.tiles_div.show();ag=true;ae=L.prototype.draw_helper.call(this,af,ah,ad)}else{ag=false;this.tiles_div.hide()}if(ac!==ag){this.view.resize_viewport()}return ae},can_subset:function(ac){return true},draw_tile:function(ae,ak,af,ah,al){var ad=this.data_manager.subset_entry(ae,ah),aj=ad.data;var ac=ak.canvas;ak.font=ak.canvas.manager.default_font;ak.textAlign="center";for(var ag=0,ai=aj.length;ag<ai;ag++){ak.fillStyle=this.view.get_base_color(aj[ag]);ak.fillText(aj[ag],Math.floor(ag*al),10)}return new b(this,ah,al,ac,ad)}});var g=function(ad,ac,ae){this.mode="Histogram";L.call(this,ad,ac,ae)};o(g.prototype,p.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Color",type:"color"},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},before_draw:function(){},draw_tile:function(ac,ad,af,ae,ag){return this._draw_line_track_tile(ac,ad,af,ae,ag)},can_subset:function(ac){return(ac.data[1][0]-ac.data[0][0]===1)},postdraw_actions:function(ad,ae,af,ac){this._add_yaxis_label("max");this._add_yaxis_label("min")}});var r=function(ad,ac,ae){this.mode="Heatmap";L.call(this,ad,ac,ae)};o(r.prototype,p.prototype,L.prototype,{display_modes:["Heatmap"],config_params:ab.union(p.prototype.config_params,[{key:"pos_color",label:"Positive Color",type:"color",default_value:"#FF8C00"},{key:"neg_color",label:"Negative Color",type:"color",default_value:"#4169E1"},{key:"min_value",label:"Min Value",type:"float",default_value:-1},{key:"max_value",label:"Max Value",type:"float",default_value:1},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:500,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.DiagonalHeatmapPainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new b(this,ag,ai,af,ac.data)}});var c=function(ad,ac,ae){L.call(this,ad,ac,ae);this.container_div.addClass("feature-track");this.summary_draw_height=30;this.slotters={};this.start_end_dct={};this.left_offset=200;this.set_painter_from_config()};o(c.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Block color",type:"color"},{key:"reverse_strand_color",label:"Antisense strand color",type:"color"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true,help:"Show the number of items in each bin when drawing summary histogram"},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"connector_style",label:"Connector style",type:"select",default_value:"fishbones",options:[{label:"Line with arrows",value:"fishbone"},{label:"Arcs",value:"arcs"}]},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.set_painter_from_config();this.request_draw({clear_tile_cache:true})},set_painter_from_config:function(){if(this.config.get_value("connector_style")==="arcs"){this.painter=J.ArcLinkedFeaturePainter}else{this.painter=J.LinkedFeaturePainter}},postdraw_actions:function(ao,af,aq,an){L.prototype.postdraw_actions.call(this,ao,af,aq,an);var ah=this,ai,am=ab.filter(ao,function(ar){return(ar instanceof K)});if(am.length===0){var ac={};ab.each(ab.pluck(ao,"incomplete_features"),function(ar){ab.each(ar,function(at){ac[at[0]]=at})});var ap=this;ab.each(ao,function(av){var aw=ab.omit(ac,ab.map(av.incomplete_features,function(ay){return ay[0]}));aw=ab.omit(aw,ab.keys(av.other_tiles_features_drawn));if(ab.size(aw)!==0){var at={data:ab.values(aw)},au=ap.view.canvas_manager.new_canvas(),ar=au.getContext("2d");au.height=Math.max(av.canvas.height,ap.get_canvas_height(at,av.mode,av.w_scale,100));au.width=av.canvas.width;ar.drawImage(av.canvas,0,0);ar.translate(ah.left_offset,0);var ax=ap.draw_tile(at,ar,av.mode,av.region,av.w_scale,av.seq_data);$(av.canvas).replaceWith($(ax.canvas));av.canvas=au;ab.extend(av.other_tiles_features_drawn,ac)}})}if(ah.filters_manager){var ag=ah.filters_manager.filters,ak;for(ak=0;ak<ag.length;ak++){ag[ak].update_ui_elt()}var aj=false,al,ae;for(ai=0;ai<ao.length;ai++){if(ao[ai].data.length){al=ao[ai].data[0];for(ak=0;ak<ag.length;ak++){ae=ag[ak];if(ae.applies_to(al)&&ae.min!==ae.max){aj=true;break}}}}if(ah.filters_available!==aj){ah.filters_available=aj;if(!ah.filters_available){ah.filters_manager.hide()}ah.update_icons()}}if(ao[0] instanceof M){var ad=true;for(ai=0;ai<ao.length;ai++){if(!ao[ai].all_slotted){ad=false;break}}this.action_icons.show_more_rows_icon.toggle(!ad)}else{this.action_icons.show_more_rows_icon.hide()}},update_auto_mode:function(ac){if(this.mode==="Auto"){if(ac==="no_detail"){ac="feature spans"}this.action_icons.mode_icon.attr("title","Set display mode (now: Auto/"+ac+")")}},incremental_slots:function(ag,ac,af){var ad=this.view.canvas_manager.dummy_context,ae=this.slotters[ag];if(!ae||(ae.mode!==af)){ae=new (s.FeatureSlotter)(ag,af,z,function(ah){return ad.measureText(ah)});this.slotters[ag]=ae}return ae.slot_features(ac)},get_mode:function(ac){if(ac.extra_info==="no_detail"||this.is_overview){mode="no_detail"}else{if(this.view.high-this.view.low>G){mode="Squish"}else{mode="Pack"}}return mode},get_canvas_height:function(ac,ag,ah,ad){if(ag==="Coverage"||ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var af=this.incremental_slots(ah,ac.data,ag);var ae=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return Math.max(this.min_height_px,ae.get_required_height(af,ad))}},draw_tile:function(an,at,aq,ag,ak,af,ao){var ar=this,ae=at.canvas,az=ag.get("start"),ad=ag.get("end"),ah=this.left_offset;if(an.dataset_type==="bigwig"){return this._draw_line_track_tile(an,at,aq,ag,ak)}var aj=[],ap=this.slotters[ak].slots;all_slotted=true;if(an.data){var al=this.filters_manager.filters;for(var au=0,aw=an.data.length;au<aw;au++){var ai=an.data[au];var av=false;var am;for(var ay=0,aD=al.length;ay<aD;ay++){am=al[ay];am.update_attrs(ai);if(!am.keep(ai)){av=true;break}}if(!av){aj.push(ai);if(!(ai[0] in ap)){all_slotted=false}}}}var aC=(this.filters_manager.alpha_filter?new C(this.filters_manager.alpha_filter):null),aA=(this.filters_manager.height_filter?new C(this.filters_manager.height_filter):null),aB=new (this.painter)(aj,az,ad,this.config.to_key_value_dict(),aq,aC,aA,af,function(aE){return ar.view.get_base_color(aE)});var ax=null;at.fillStyle=this.config.get_value("block_color");at.font=at.canvas.manager.default_font;at.textAlign="right";if(an.data){var ac=aB.draw(at,ae.width,ae.height,ak,ap);ax=ac.feature_mapper;incomplete_features=ac.incomplete_features;ax.translation=-ah}if(!ao){return new M(ar,ag,ak,ae,an.data,aq,an.message,all_slotted,ax,incomplete_features,af)}}});var Z=function(ad,ac,ae){L.call(this,ad,ac,ae);this.painter=J.VariantPainter;this.summary_draw_height=30;this.left_offset=30};o(Z.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Histogram color",type:"color"},{key:"show_sample_data",label:"Show sample data",type:"bool",default_value:true},{key:"show_labels",label:"Show summary and sample labels",type:"bool",default_value:true},{key:"summary_height",label:"Locus summary height",type:"float",default_value:20},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,af,ah,ag,ai){if(ac.dataset_type==="bigwig"){return this._draw_line_track_tile(ac,af,"Histogram",ag,ai)}else{var ae=this.view,ad=new (this.painter)(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah,function(aj){return ae.get_base_color(aj)});ad.draw(af,af.canvas.width,af.canvas.height,ai);return new b(this,ag,ai,af.canvas,ac.data)}},get_canvas_height:function(ac,ag,ah,ae){if(ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var ad=(this.dataset.get_metadata("sample_names")?this.dataset.get_metadata("sample_names").length:0);if(ad===0&&ac.data.length!==0){ad=ac.data[0][7].match(/,/g);if(ad===null){ad=1}else{ad=ad.length+1}}var af=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return af.get_required_height(ad)}},predraw_init:function(){var ac=[f.prototype.predraw_init.call(this)];if(!this.dataset.get_metadata("sample_names")){ac.push(this.dataset.fetch())}return ac},postdraw_actions:function(ag,ah,aj,ad){L.prototype.postdraw_actions.call(this,ag,ah,aj,ad);var af=ab.filter(ag,function(ak){return(ak instanceof K)});var ae=this.dataset.get_metadata("sample_names");if(af.length===0&&this.config.get_value("show_labels")&&ae&&ae.length>1){var ac;if(this.container_div.find(".yaxislabel.variant").length===0){ac=this.config.get_value("summary_height")/2;this.tiles_div.prepend($("<div/>").text("Summary").addClass("yaxislabel variant top").css({"font-size":ac+"px",top:(this.config.get_value("summary_height")-ac)/2+"px"}));if(this.config.get_value("show_sample_data")){var ai=ae.join("<br/>");this.tiles_div.prepend($("<div/>").html(ai).addClass("yaxislabel variant top sample").css({top:this.config.get_value("summary_height")}))}}ac=(this.mode==="Squish"?5:10)+"px";$(this.tiles_div).find(".sample").css({"font-size":ac,"line-height":ac});$(this.tiles_div).find(".yaxislabel").css("color",this.config.get_value("label_color"))}else{this.container_div.find(".yaxislabel.variant").remove()}}});var S=function(ad,ac,ae){c.call(this,ad,ac,ae);this.painter=J.ReadPainter;this.update_icons()};o(S.prototype,p.prototype,L.prototype,c.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Histogram color",type:"color"},{key:"detail_block_color",label:"Sense strand block color",type:"color",default_value:"#AAAAAA"},{key:"reverse_strand_color",label:"Antisense strand block color",type:"color",default_value:"#DDDDDD"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})}});var d={CompositeTrack:e,DrawableGroup:N,DiagonalHeatmapTrack:r,FeatureTrack:c,LineTrack:g,ReadTrack:S,VariantTrack:Z,VcfTrack:Z};var n=function(ae,ad,ac){if("copy" in ae){return ae.copy(ac)}else{var af=ae.obj_type;if(!af){af=ae.track_type}return new d[af](ad,ac,ae)}};return{TracksterView:Y,DrawableGroup:N,LineTrack:g,FeatureTrack:c,DiagonalHeatmapTrack:r,ReadTrack:S,VariantTrack:Z,CompositeTrack:e,object_from_template:n}});
\ No newline at end of file
+define(["libs/underscore","viz/visualization","viz/viz_views","viz/trackster/util","viz/trackster/slotting","viz/trackster/painters","viz/trackster/filters","mvc/data","mvc/tools","utils/config"],function(ab,w,V,j,s,J,h,X,P,R){var o=ab.extend;var l={};var i=function(ac,ad){l[ac.attr("id")]=ad};var k=function(ac,ad,af,ae){af=".group";l[ac.attr("id")]=ae;ac.bind("drag",{handle:"."+ad,relative:true},function(an,ao){var am=$(this),ar=$(this).parent(),aj=ar.children(".track,.group"),al=l[$(this).attr("id")],ai,ah,ap,ag,ak;ah=$(this).parents(af);if(ah.length!==0){ap=ah.position().top;ag=ap+ah.outerHeight();var aq=l[ah.attr("id")];if(ao.offsetY<ap){$(this).insertBefore(ah);aq.remove_drawable(al);aq.container.add_drawable_before(al,aq);return}else{if(ao.offsetY>ag){$(this).insertAfter(ah);aq.remove_drawable(al);aq.container.add_drawable(al);return}}}ah=null;for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));ap=ai.position().top;ag=ap+ai.outerHeight();if(ai.is(af)&&this!==ai.get(0)&&ao.offsetY>=ap&&ao.offsetY<=ag){if(ao.offsetY-ap<ag-ao.offsetY){ai.find(".content-div").prepend(this)}else{ai.find(".content-div").append(this)}if(al.container){al.container.remove_drawable(al)}l[ai.attr("id")].add_drawable(al);return}}for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));if(ao.offsetY<ai.position().top&&!(ai.hasClass("reference-track")||ai.hasClass("intro"))){break}}if(ak===aj.length){if(this!==aj.get(ak-1)){ar.append(this);l[ar.attr("id")].move_drawable(al,ak)}}else{if(this!==aj.get(ak)){$(this).insertBefore(aj.get(ak));l[ar.attr("id")].move_drawable(al,(ao.deltaY>0?ak-1:ak))}}}).bind("dragstart",function(){$(this).addClass("dragging")}).bind("dragend",function(){$(this).removeClass("dragging")})};var D=20,z=100,G=12000,Q=400,I=5000,v=100,m="Cannot display dataset due to an error. ",H="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",E="No data for this chrom/contig.",u="Preparing data. This can take a while for a large dataset. If the visualization is saved and closed, preparation will continue in the background.",x="Tool cannot be rerun: ",a="Loading data...",T="Ready for display",O=10,F=20,A=["Histogram","Line","Filled","Intensity"];function U(ad,ac){if(!ac){ac=0}var ae=Math.pow(10,ac);return Math.round(ad*ae)/ae}var p=function(ad,ac,ag){if(!p.id_counter){p.id_counter=0}this.id=p.id_counter++;this.view=ad;this.container=ac;this.drag_handle_class=ag.drag_handle_class;this.is_overview=false;this.action_icons={};this.config=R.ConfigSettingCollection.from_models_and_saved_values(this.config_params,ag.prefs);if(!this.config.get_value("name")){this.config.set_value("name",ag.name)}if(this.config_onchange){this.config.on("change",this.config_onchange,this)}this.container_div=this.build_container_div();this.header_div=null;if(ag.header!==false){var ae=new V.TrackHeaderView({model:this,id:this.id});this.header_div=ae.$el;this.container_div.append(this.header_div);var af=ae.icons_div;this.action_icons=ae.action_icons;this.container_div.hover(function(){af.show()},function(){af.hide()})}};p.prototype.action_icons_def=[{name:"toggle_icon",title:"Hide/show content",css_class:"toggle",on_click_fn:function(ac){if(ac.config.get_value("content_visible")){ac.action_icons.toggle_icon.addClass("toggle-expand").removeClass("toggle");ac.hide_contents();ac.config.set_value("content_visible",false)}else{ac.action_icons.toggle_icon.addClass("toggle").removeClass("toggle-expand");ac.config.set_value("content_visible",true);ac.show_contents()}}},{name:"settings_icon",title:"Edit settings",css_class:"gear",on_click_fn:function(ad){var ac=new R.ConfigSettingCollectionView({collection:ad.config});ac.render_in_modal("Configure Track")}},{name:"remove_icon",title:"Remove",css_class:"remove-icon",on_click_fn:function(ac){$(".tooltip").remove();ac.remove()}}];o(p.prototype,{config_params:[{key:"name",label:"Name",type:"text",default_value:""},{key:"content_visible",type:"bool",default_value:true,hidden:true}],config_onchange:function(){},init:function(){},changed:function(){this.view.changed()},can_draw:function(){if(this.enabled&&this.config.get_value("content_visible")){return true}return false},request_draw:function(){},_draw:function(ac){},to_dict:function(){},set_name:function(ac){this.old_name=this.config.get_value("name");this.config.set_value("name",ac)},revert_name:function(){if(this.old_name){this.config.set_value("name",this.old_name)}},remove:function(){this.changed();this.container.remove_drawable(this);var ac=this.view;this.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})},build_container_div:function(){},update_icons:function(){},hide_contents:function(){},show_contents:function(){},get_drawables:function(){}});var y=function(ad,ac,ae){p.call(this,ad,ac,ae);this.obj_type=ae.obj_type;this.drawables=[]};o(y.prototype,p.prototype,{unpack_drawables:function(ae){this.drawables=[];var ad;for(var ac=0;ac<ae.length;ac++){ad=n(ae[ac],this.view,this);this.add_drawable(ad)}},init:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].init()}},_draw:function(ac){for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad]._draw(ac)}},to_dict:function(){var ad=[];for(var ac=0;ac<this.drawables.length;ac++){ad.push(this.drawables[ac].to_dict())}return{prefs:this.config.to_key_value_dict(),obj_type:this.obj_type,drawables:ad}},add_drawable:function(ac){this.drawables.push(ac);ac.container=this;this.changed()},add_drawable_before:function(ae,ac){this.changed();var ad=this.drawables.indexOf(ac);if(ad!==-1){this.drawables.splice(ad,0,ae);return true}return false},replace_drawable:function(ae,ac,ad){var af=this.drawables.indexOf(ae);if(af!==-1){this.drawables[af]=ac;if(ad){ae.container_div.replaceWith(ac.container_div)}this.changed()}return af},remove_drawable:function(ad){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);ad.container=null;this.changed();return true}return false},move_drawable:function(ad,ae){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);this.drawables.splice(ae,0,ad);this.changed();return true}return false},get_drawables:function(){return this.drawables},get_tracks:function(af){var ac=this.drawables.slice(0),ad=[],ae;while(ac.length!==0){ae=ac.shift();if(ae instanceof af){ad.push(ae)}else{if(ae.drawables){ac=ac.concat(ae.drawables)}}}return ad}});var N=function(ad,ac,af){o(af,{obj_type:"DrawableGroup",drag_handle_class:"group-handle"});y.call(this,ad,ac,af);this.content_div=$("<div/>").addClass("content-div").attr("id","group_"+this.id+"_content_div").appendTo(this.container_div);i(this.container_div,this);i(this.content_div,this);k(this.container_div,this.drag_handle_class,".group",this);this.filters_manager=new h.FiltersManager(this);this.header_div.after(this.filters_manager.parent_div);this.filters_manager.parent_div.after($("<div style='clear: both'/>"));this.saved_filters_managers=[];if("drawables" in af){this.unpack_drawables(af.drawables)}if("filters" in af){var ae=this.filters_manager;this.filters_manager=new h.FiltersManager(this,af.filters);ae.parent_div.replaceWith(this.filters_manager.parent_div);if(af.filters.visible){this.setup_multitrack_filtering()}}};o(N.prototype,p.prototype,y.prototype,{action_icons_def:[p.prototype.action_icons_def[0],p.prototype.action_icons_def[1],{name:"composite_icon",title:"Show composite track",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_composite_track()}},{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters();ac._restore_filter_managers()}else{ac.setup_multitrack_filtering();ac.request_draw({clear_tile_cache:true})}ac.filters_manager.toggle()}},p.prototype.action_icons_def[2]],build_container_div:function(){var ac=$("<div/>").addClass("group").attr("id","group_"+this.id);if(this.container){this.container.content_div.append(ac)}return ac},hide_contents:function(){this.tiles_div.hide()},show_contents:function(){this.tiles_div.show();this.request_draw()},update_icons:function(){var ae=this.drawables.length;if(ae===0){this.action_icons.composite_icon.hide();this.action_icons.filters_icon.hide()}else{if(ae===1){this.action_icons.composite_icon.toggle(this.drawables[0] instanceof e);this.action_icons.filters_icon.hide()}else{var al,ak,ai,ao=true,ag=this.drawables[0].get_type(),ac=0;for(al=0;al<ae;al++){ai=this.drawables[al];if(ai.get_type()!==ag){can_composite=false;break}if(ai instanceof c){ac++}}if(ao&&this.drawables[0] instanceof g){this.action_icons.composite_icon.show()}else{this.action_icons.composite_icon.hide();$(".tooltip").remove()}if(ac>1&&ac===this.drawables.length){var ap={},ad;ai=this.drawables[0];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];ap[ad.name]=[ad]}for(al=1;al<this.drawables.length;al++){ai=this.drawables[al];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];if(ad.name in ap){ap[ad.name].push(ad)}}}this.filters_manager.remove_all();var af,ah,aj,am;for(var an in ap){af=ap[an];if(af.length===ac){ah=new h.NumberFilter({name:af[0].name,index:af[0].index});this.filters_manager.add_filter(ah)}}this.action_icons.filters_icon.toggle(this.filters_manager.filters.length>0)}else{this.action_icons.filters_icon.hide()}}}},_restore_filter_managers:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].filters_manager=this.saved_filters_managers[ac]}this.saved_filters_managers=[]},setup_multitrack_filtering:function(){if(this.filters_manager.filters.length>0){this.saved_filters_managers=[];for(var ac=0;ac<this.drawables.length;ac++){drawable=this.drawables[ac];this.saved_filters_managers.push(drawable.filters_manager);drawable.filters_manager=this.filters_manager}}this.filters_manager.init_filters()},show_composite_track:function(){var ad=new e(this.view,this.view,{name:this.config.get_value("name"),drawables:this.drawables});var ac=this.container.replace_drawable(this,ad,true);ad.request_draw()},add_drawable:function(ac){y.prototype.add_drawable.call(this,ac);this.update_icons()},remove_drawable:function(ac){y.prototype.remove_drawable.call(this,ac);this.update_icons()},to_dict:function(){if(this.filters_manager.visible()){this._restore_filter_managers()}var ac=o(y.prototype.to_dict.call(this),{filters:this.filters_manager.to_dict()});if(this.filters_manager.visible()){this.setup_multitrack_filtering()}return ac},request_draw:function(ac){ab.each(this.drawables,function(ad){ad.request_draw(ac)})}});var Y=Backbone.View.extend({initialize:function(ac){o(ac,{obj_type:"View"});y.call(this,"View",ac.container,ac);this.chrom=null;this.vis_id=ac.vis_id;this.dbkey=ac.dbkey;this.label_tracks=[];this.tracks_to_be_redrawn=[];this.max_low=0;this.max_high=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.load_chroms_deferred=null;this.render();this.canvas_manager=new w.CanvasManager(this.container.get(0).ownerDocument);this.reset();this.config=R.ConfigSettingCollection.from_models_and_saved_values([{key:"name",label:"Name",type:"text",default_value:""},{key:"a_color",label:"A Color",type:"color",default_value:"#FF0000"},{key:"c_color",label:"C Color",type:"color",default_value:"#00FF00"},{key:"g_color",label:"G Color",type:"color",default_value:"#0000FF"},{key:"t_color",label:"T Color",type:"color",default_value:"#FF00FF"},{key:"n_color",label:"N Color",type:"color",default_value:"#AAAAAA"}],{name:ac.name})},render:function(){this.requested_redraw=false;var ae=this.container,ac=this;this.top_container=$("<div/>").addClass("top-container").appendTo(ae);this.browser_content_div=$("<div/>").addClass("content").appendTo(ae);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(ae);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").attr("id","viewport-container").appendTo(this.browser_content_div);this.content_div=this.viewport_container;i(this.viewport_container,ac);this.intro_div=$("<div/>").addClass("intro").appendTo(this.viewport_container);var af=$("<div/>").text("Add Datasets to Visualization").addClass("action-button").appendTo(this.intro_div).click(function(){w.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",{"f-dbkey":ac.dbkey},function(ag){ab.each(ag,function(ah){ac.add_drawable(n(ah,ac,ac))})})});this.nav_container=$("<div/>").addClass("trackster-nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("trackster-nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a/>").attr("title","Close overview").addClass("icon-button overview-close tooltip").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_select=$("<select/>").attr({name:"chrom"}).addClass("chrom-nav").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var ad=function(ag){if(ag.type==="focusout"||(ag.keyCode||ag.which)===13||(ag.keyCode||ag.which)===27){if((ag.keyCode||ag.which)!==27){ac.go_to($(this).val())}$(this).hide();$(this).val("");ac.location_span.show();ac.chrom_select.show()}ag.stopPropagation()};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",ad).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").attr("title","Click to change location").tooltip({placement:"bottom"}).appendTo(this.nav_controls);this.location_span.click(function(){ac.location_span.hide();ac.chrom_select.hide();ac.nav_input.val(ac.chrom+":"+ac.low+"-"+ac.high);ac.nav_input.css("display","inline-block");ac.nav_input.select();ac.nav_input.focus();ac.nav_input.autocomplete({source:function(ai,ag){var aj=[],ah=$.map(ac.get_tracks(c),function(ak){return ak.data_manager.search_features(ai.term).success(function(al){aj=aj.concat(al)})});$.when.apply($,ah).done(function(){ag($.map(aj,function(ak){return{label:ak[0],value:ak[1]}}))})},minLength:2})});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a/>").attr("id","zoom-out").attr("title","Zoom out").tooltip({placement:"bottom"}).click(function(){ac.zoom_out()}).appendTo(this.nav_controls);this.zi_link=$("<a/>").attr("id","zoom-in").attr("title","Zoom in").tooltip({placement:"bottom"}).click(function(){ac.zoom_in()}).appendTo(this.nav_controls);this.load_chroms_deferred=this.load_chroms({low:0});this.chrom_select.bind("change",function(){ac.change_chrom(ac.chrom_select.val())});this.browser_content_div.click(function(ag){$(this).find("input").trigger("blur")});this.browser_content_div.bind("dblclick",function(ag){ac.zoom_in(ag.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(ag,ah){this.current_x=ah.offsetX}).bind("drag",function(ag,ai){var aj=ai.offsetX-this.current_x;this.current_x=ai.offsetX;var ah=Math.round(aj/ac.viewport_container.width()*(ac.max_high-ac.max_low));ac.move_delta(-ah)});this.overview_close.click(function(){ac.reset_overview()});this.viewport_container.bind("draginit",function(ag,ah){if(ag.clientX>ac.viewport_container.width()-16){return false}}).bind("dragstart",function(ag,ah){ah.original_low=ac.low;ah.current_height=ag.clientY;ah.current_x=ah.offsetX}).bind("drag",function(ai,ak){var ag=$(this);var al=ak.offsetX-ak.current_x;var ah=ag.scrollTop()-(ai.clientY-ak.current_height);ag.scrollTop(ah);ak.current_height=ai.clientY;ak.current_x=ak.offsetX;var aj=Math.round(al/ac.viewport_container.width()*(ac.high-ac.low));ac.move_delta(aj)});this.top_labeltrack.bind("dragstart",function(ag,ah){return $("<div/>").addClass("zoom-area").css("height",ac.browser_content_div.height()+ac.top_labeltrack.height()+1).appendTo($(this))}).bind("drag",function(ak,al){$(al.proxy).css({left:Math.min(ak.pageX,al.startX)-ac.container.offset().left,width:Math.abs(ak.pageX-al.startX)});var ah=Math.min(ak.pageX,al.startX)-ac.container.offset().left,ag=Math.max(ak.pageX,al.startX)-ac.container.offset().left,aj=(ac.high-ac.low),ai=ac.viewport_container.width();ac.update_location(Math.round(ah/ai*aj)+ac.low,Math.round(ag/ai*aj)+ac.low)}).bind("dragend",function(al,am){var ah=Math.min(al.pageX,am.startX),ag=Math.max(al.pageX,am.startX),aj=(ac.high-ac.low),ai=ac.viewport_container.width(),ak=ac.low;ac.low=Math.round(ah/ai*aj)+ak;ac.high=Math.round(ag/ai*aj)+ak;$(am.proxy).remove();ac.request_redraw()});this.add_label_track(new W(this,{content_div:this.top_labeltrack}));$(window).bind("resize",function(){if(this.resize_timer){clearTimeout(this.resize_timer)}this.resize_timer=setTimeout(function(){ac.resize_window()},500)});$(document).bind("redraw",function(){ac.redraw()});this.reset();$(window).trigger("resize")},get_base_color:function(ac){return this.config.get_value(ac.toLowerCase()+"_color")||this.config.get_value("n_color")}});o(Y.prototype,y.prototype,{changed:function(){this.has_changes=true},update_intro_div:function(){this.intro_div.toggle(this.drawables.length===0)},trigger_navigate:function(ad,af,ac,ag){if(this.timer){clearTimeout(this.timer)}if(ag){var ae=this;this.timer=setTimeout(function(){ae.trigger("navigate",ad+":"+af+"-"+ac)},500)}else{view.trigger("navigate",ad+":"+af+"-"+ac)}},update_location:function(ac,ae){this.location_span.text(commatize(ac)+" - "+commatize(ae));this.nav_input.val(this.chrom+":"+commatize(ac)+"-"+commatize(ae));var ad=view.chrom_select.val();if(ad!==""){this.trigger_navigate(ad,view.low,view.high,true)}},load_chroms:function(ae){ae.num=v;var ac=this,ad=$.Deferred();$.ajax({url:galaxy_config.root+"api/genomes/"+this.dbkey,data:ae,dataType:"json",success:function(ag){if(ag.chrom_info.length===0){return}if(ag.reference){var ah=new B(ac);ac.add_label_track(ah);ac.reference_track=ah}ac.chrom_data=ag.chrom_info;var ak='<option value="">Select Chrom/Contig</option>';for(var aj=0,af=ac.chrom_data.length;aj<af;aj++){var ai=ac.chrom_data[aj].chrom;ak+='<option value="'+ai+'">'+ai+"</option>"}if(ag.prev_chroms){ak+='<option value="previous">Previous '+v+"</option>"}if(ag.next_chroms){ak+='<option value="next">Next '+v+"</option>"}ac.chrom_select.html(ak);ac.chrom_start_index=ag.start_index;ad.resolve(ag.chrom_info)},error:function(){alert("Could not load chroms for this dbkey: "+ac.dbkey)}});return ad},change_chrom:function(ah,ad,aj){var ae=this;if(!ae.chrom_data){ae.load_chroms_deferred.then(function(){ae.change_chrom(ah,ad,aj)});return}if(!ah||ah==="None"){return}if(ah==="previous"){ae.load_chroms({low:this.chrom_start_index-v});return}if(ah==="next"){ae.load_chroms({low:this.chrom_start_index+v});return}var ai=$.grep(ae.chrom_data,function(ak,al){return ak.chrom===ah})[0];if(ai===undefined){ae.load_chroms({chrom:ah},function(){ae.change_chrom(ah,ad,aj)});return}else{if(ah!==ae.chrom){ae.chrom=ah;ae.chrom_select.val(ae.chrom);ae.max_high=ai.len-1;ae.reset();for(var ag=0,ac=ae.drawables.length;ag<ac;ag++){var af=ae.drawables[ag];if(af.init){af.init()}}if(ae.reference_track){ae.reference_track.init()}}if(ad===undefined&&aj===undefined){ae.low=0;ae.high=ae.max_high}else{ae.low=(ad!==undefined?Math.max(ad,0):0);if(aj===undefined){ae.low=Math.max(ae.low-15,0);ae.high=ae.low+30}else{ae.high=Math.min(aj,ae.max_high)}}ae.request_redraw()}},go_to:function(ag){ag=ag.replace(/,/g,"");ag=ag.replace(/:|\-/g," ");var ad=ag.split(/\s+/),af=ad[0],ae=(ad[1]?parseInt(ad[1],10):undefined),ac=(ad[2]?parseInt(ad[2],10):undefined);this.change_chrom(af,ae,ac)},move_fraction:function(ae){var ac=this;var ad=ac.high-ac.low;this.move_delta(ae*ad)},move_delta:function(af){var ac=this;var ae=ac.high-ac.low;if(ac.low-af<ac.max_low){ac.low=ac.max_low;ac.high=ac.max_low+ae}else{if(ac.high-af>ac.max_high){ac.high=ac.max_high;ac.low=ac.max_high-ae}else{ac.high-=af;ac.low-=af}}ac.request_redraw({data_fetch:false});if(this.redraw_on_move_fn){clearTimeout(this.redraw_on_move_fn)}this.redraw_on_move_fn=setTimeout(function(){ac.request_redraw()},200);var ad=ac.chrom_select.val();this.trigger_navigate(ad,ac.low,ac.high,true)},add_drawable:function(ad){y.prototype.add_drawable.call(this,ad);ad.init();this.changed();this.update_intro_div();var ac=this;ad.config.on("change",function(){ac.changed()})},add_label_track:function(ac){ac.view=this;ac.init();this.label_tracks.push(ac)},remove_drawable:function(ae,ad){y.prototype.remove_drawable.call(this,ae);if(ad){var ac=this;ae.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})}},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},request_redraw:function(ad,ae){var ac=this,af=(ae?[ae]:ac.drawables);ab.each(af,function(ag){var ah=ab.find(ac.tracks_to_be_redrawn,function(ai){return ai[0]===ag});if(ah){ah[1]=ad}else{ac.tracks_to_be_redrawn.push([ag,ad])}});if(!this.requested_redraw){requestAnimationFrame(function(){ac._redraw()});this.requested_redraw=true}},_redraw:function(){this.requested_redraw=false;var ac=this.low,ag=this.high;if(ac<this.max_low){ac=this.max_low}if(ag>this.max_high){ag=this.max_high}var ad=this.high-this.low;if(this.high!==0&&ad<this.min_separation){ag=ac+this.min_separation}this.low=Math.floor(ac);this.high=Math.ceil(ag);this.update_location(this.low,this.high);this.resolution_px_b=this.viewport_container.width()/(this.high-this.low);var af=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ah=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ae=13;this.overview_box.css({left:af,width:Math.max(ae,ah)}).show();if(ah<ae){this.overview_box.css("left",af-(ae-ah)/2)}if(this.overview_highlight){this.overview_highlight.css({left:af,width:ah})}ab.each(this.tracks_to_be_redrawn,function(ak){var ai=ak[0],aj=ak[1];if(ai){ai._draw(aj)}});this.tracks_to_be_redrawn=[];ab.each(this.label_tracks,function(ai){ai._draw()})},zoom_in:function(ad,ae){if(this.max_high===0||this.high-this.low<=this.min_separation){return}var af=this.high-this.low,ag=af/2+this.low,ac=(af/this.zoom_factor)/2;if(ad){ag=ad/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(ag-ac);this.high=Math.round(ag+ac);this.changed();this.request_redraw()},zoom_out:function(){if(this.max_high===0){return}var ad=this.high-this.low,ae=ad/2+this.low,ac=(ad*this.zoom_factor)/2;this.low=Math.round(ae-ac);this.high=Math.round(ae+ac);this.changed();this.request_redraw()},resize_viewport:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height())},resize_window:function(){this.resize_viewport();this.request_redraw()},set_overview:function(ae){if(this.overview_drawable){if(this.overview_drawable.dataset.id===ae.dataset.id){return}this.overview_viewport.find(".track").remove()}var ad=ae.copy({content_div:this.overview_viewport}),ac=this;ad.header_div.hide();ad.is_overview=true;ac.overview_drawable=ad;this.overview_drawable.postdraw_actions=function(){ac.overview_highlight.show().height(ac.overview_drawable.content_div.height());ac.overview_viewport.height(ac.overview_drawable.content_div.height()+ac.overview_box.outerHeight());ac.overview_close.show();ac.resize_window()};ac.overview_drawable.request_draw();this.changed()},reset_overview:function(){$(".tooltip").remove();this.overview_viewport.find(".track-tile").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide();view.resize_window();view.overview_drawable=null}});var q=P.Tool.extend({defaults:{track:null},initialize:function(ac){P.Tool.prototype.initialize.call(this,ac);var ad=true;if(ac.tool_state!==undefined&&ac.tool_state.hidden!==undefined){ad=ac.tool_state.hidden}this.set("hidden",ad);this.remove_inputs(["data","hidden_data","conditional"])},state_dict:function(ac){return ab.extend(this.get_inputs_dict(),{hidden:!this.is_visible()})}});var t=Backbone.View.extend({events:{"change :input":"update_value"},render:function(){var ae=this.$el.addClass("param-row"),af=this.model;var ac=$("<div>").addClass("param-label").text(af.get("label")).appendTo(ae);var ad=$("<div/>").addClass("param-input").html(af.get("html")).appendTo(ae);ad.find(":input").val(af.get("value"));$("<div style='clear: both;'/>").appendTo(ae)},update_value:function(ac){this.model.set_value($(ac.target).val())}});var aa=Backbone.View.extend({initialize:function(ac){this.model.on("change:hidden",this.set_visible,this)},render:function(){var ad=this;tool=this.model,parent_div=this.$el.addClass("dynamic-tool").hide();parent_div.bind("drag",function(ah){ah.stopPropagation()}).click(function(ah){ah.stopPropagation()}).bind("dblclick",function(ah){ah.stopPropagation()}).keydown(function(ah){ah.stopPropagation()});var ae=$("<div class='tool-name'>").appendTo(parent_div).text(tool.get("name"));tool.get("inputs").each(function(ai){var ah=new t({model:ai});ah.render();parent_div.append(ah.$el)});parent_div.find("input").click(function(){$(this).select()});var af=$("<div>").addClass("param-row").appendTo(parent_div);var ag=$("<input type='submit'>").attr("value","Run on complete dataset").appendTo(af);var ac=$("<input type='submit'>").attr("value","Run on visible region").appendTo(af);ac.click(function(){ad.run_on_region()});ag.click(function(){ad.run_on_dataset()});if(tool.is_visible()){this.$el.show()}},set_visible:function(){this.$el.toggle(this.model.is_visible())},update_params:function(){for(var ac=0;ac<this.params.length;ac++){this.params[ac].update_value()}},run_on_dataset:function(){var ac=this.model;this.run({target_dataset_id:this.model.get("track").dataset.id,action:"rerun",tool_id:ac.id},null,function(ad){Galaxy.modal.show({title:ac.get("name")+" is Running",body:ac.get("name")+" is running on the complete dataset. Tool outputs are in dataset's history.",buttons:{Close:function(){Galaxy.modal.hide()}}})})},run_on_region:function(){var ad=this.model.get("track"),ag=this.model,ai=new w.GenomeRegion({chrom:ad.view.chrom,start:ad.view.low,end:ad.view.high}),aj={target_dataset_id:ad.dataset.id,action:"rerun",tool_id:ag.id,regions:[ai.toJSON()]},ah=ad,al=ag.get("name")+ah.tool_region_and_parameters_str(ai),ac;if(ah.container===view){var ak=new N(view,view,{name:ad.config.get_value("name")});var af=ah.container.replace_drawable(ah,ak,false);ak.container_div.insertBefore(ah.view.content_div.children()[af]);ak.add_drawable(ah);ah.container_div.appendTo(ak.content_div);ac=ak}else{ac=ah.container}var ae=new ah.constructor(view,ac,{name:al,hda_ldda:"hda"});ae.init_for_tool_data();ae.change_mode(ah.mode);ae.set_filters_manager(ah.filters_manager.copy(ae));ae.update_icons();ac.add_drawable(ae);ae.tiles_div.text("Starting job.");this.run(aj,ae,function(am){ae.set_dataset(new X.Dataset(am));ae.tiles_div.text("Running job.");ae.init()})},run:function(ac,ae,af){ac.inputs=this.model.get_inputs_dict();var ad=new j.ServerStateDeferred({ajax_settings:{url:galaxy_config.root+"api/tools",data:JSON.stringify(ac),dataType:"json",contentType:"application/json",type:"POST"},interval:2000,success_fn:function(ag){return ag!=="pending"}});$.when(ad.go()).then(function(ag){if(ag==="no converter"){ae.container_div.addClass("error");ae.content_div.text(H)}else{if(ag.error){ae.container_div.addClass("error");ae.content_div.text(x+ag.message)}else{af(ag)}}})}});var C=function(ac,ad){J.Scaler.call(this,ad);this.filter=ac};C.prototype.gen_val=function(ac){if(this.filter.high===Number.MAX_VALUE||this.filter.low===-Number.MAX_VALUE||this.filter.low===this.filter.high){return this.default_val}return((parseFloat(ac[this.filter.index])-this.filter.low)/(this.filter.high-this.filter.low))};var b=function(ac,af,ag,ad,ae){this.track=ac;this.region=af;this.low=af.get("start");this.high=af.get("end");this.w_scale=ag;this.canvas=ad;this.html_elt=$("<div class='track-tile'/>").append(ad);this.data=ae;this.stale=false};b.prototype.predisplay_actions=function(){};var K=function(ac,af,ag,ad,ae){b.call(this,ac,af,ag,ad,ae)};K.prototype.predisplay_actions=function(){};var M=function(ae,aj,al,ad,ag,ah,am,ac,ai,af,ak){b.call(this,ae,aj,al,ad,ag);this.mode=ah;this.all_slotted=ac;this.feature_mapper=ai;this.has_icons=false;this.incomplete_features=af;this.other_tiles_features_drawn={};this.seq_data=ak};o(M.prototype,b.prototype);M.prototype.predisplay_actions=function(){};var f=function(ad,ac,ae){o(ae,{drag_handle_class:"draghandle"});p.call(this,ad,ac,ae);this.dataset=null;if(ae.dataset){this.dataset=(ae.dataset instanceof Backbone.Model?ae.dataset:new X.Dataset(ae.dataset))}this.dataset_check_type="converted_datasets_state";this.data_url_extra_params={};this.data_query_wait=("data_query_wait" in ae?ae.data_query_wait:I);this.data_manager=("data_manager" in ae?ae.data_manager:new w.GenomeDataManager({dataset:this.dataset,genome:new w.Genome({key:ad.dbkey,chroms_info:{chrom_info:ad.chrom_data}}),data_mode_compatible:this.data_and_mode_compatible,can_subset:this.can_subset}));this.min_height_px=16;this.max_height_px=800;this.visible_height_px=this.config.get_value("height");this.content_div=$("<div class='track-content'>").appendTo(this.container_div);if(this.container){this.container.content_div.append(this.container_div);if(!("resize" in ae)||ae.resize){this.add_resize_handle()}}};o(f.prototype,p.prototype,{action_icons_def:[{name:"mode_icon",title:"Set display mode",css_class:"chevron-expand",on_click_fn:function(){}},p.prototype.action_icons_def[0],{name:"overview_icon",title:"Set as overview",css_class:"application-dock-270",on_click_fn:function(ac){ac.view.set_overview(ac)}},p.prototype.action_icons_def[1],{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters()}else{ac.filters_manager.init_filters()}ac.filters_manager.toggle()}},{name:"tools_icon",title:"Tool",css_class:"hammer",on_click_fn:function(ac){ac.tool.toggle();if(ac.tool.is_visible()){ac.set_name(ac.config.get_value("name")+ac.tool_region_and_parameters_str())}else{ac.revert_name()}$(".tooltip").remove()}},{name:"param_space_viz_icon",title:"Tool parameter space visualization",css_class:"arrow-split",on_click_fn:function(ac){var af='<strong>Tool</strong>: <%= track.tool.get("name") %><br/><strong>Dataset</strong>: <%= track.config.get_value("name") %><br/><strong>Region(s)</strong>: <select name="regions"><option value="cur">current viewing area</option><option value="bookmarks">bookmarks</option><option value="both">current viewing area and bookmarks</option></select>',ae=ab.template(af,{track:ac});var ah=function(){Galaxy.modal.hide();$(window).unbind("keypress.check_enter_esc")},ad=function(){var aj=$('select[name="regions"] option:selected').val(),al,ai=new w.GenomeRegion({chrom:view.chrom,start:view.low,end:view.high}),ak=ab.map($(".bookmark"),function(am){return new w.GenomeRegion({from_str:$(am).children(".position").text()})});if(aj==="cur"){al=[ai]}else{if(aj==="bookmarks"){al=ak}else{al=[ai].concat(ak)}}Galaxy.modal.hide();window.location.href=galaxy_config.root+"visualization/sweepster?"+$.param({dataset_id:ac.dataset.id,hda_ldda:ac.dataset.get("hda_ldda"),regions:JSON.stringify(new Backbone.Collection(al).toJSON())})},ag=function(ai){if((ai.keyCode||ai.which)===27){ah()}else{if((ai.keyCode||ai.which)===13){ad()}}};Galaxy.modal.show({title:"Visualize tool parameter space and output from different parameter settings?",body:ae,buttons:{No:ah,Yes:ad}})}},p.prototype.action_icons_def[2]],can_draw:function(){return this.dataset&&p.prototype.can_draw.call(this)},build_container_div:function(){return $("<div/>").addClass("track").attr("id","track_"+this.id)},set_dataset:function(ac){this.dataset=ac;this.data_manager.set("dataset",ac)},on_resize:function(){this.request_draw({clear_tile_cache:true})},add_resize_handle:function(){var ac=this;var af=false;var ae=false;var ad=$("<div class='track-resize'>");$(ac.container_div).hover(function(){if(ac.config.get_value("content_visible")){af=true;ad.show()}},function(){af=false;if(!ae){ad.hide()}});ad.hide().bind("dragstart",function(ag,ah){ae=true;ah.original_height=$(ac.content_div).height()}).bind("drag",function(ah,ai){var ag=Math.min(Math.max(ai.original_height+ai.deltaY,ac.min_height_px),ac.max_height_px);$(ac.tiles_div).css("height",ag);ac.visible_height_px=(ac.max_height_px===ag?0:ag);ac.on_resize()}).bind("dragend",function(ag,ah){ac.tile_cache.clear();ae=false;if(!af){ad.hide()}ac.config.set_value("height",ac.visible_height_px);ac.changed()}).appendTo(ac.container_div)},hide_contents:function(){this.tiles_div.hide();this.container_div.find(".yaxislabel, .track-resize").hide()},show_contents:function(){this.tiles_div.show();this.container_div.find(".yaxislabel, .track-resize").show();this.request_draw()},get_type:function(){if(this instanceof W){return"LabelTrack"}else{if(this instanceof B){return"ReferenceTrack"}else{if(this instanceof g){return"LineTrack"}else{if(this instanceof S){return"ReadTrack"}else{if(this instanceof Z){return"VariantTrack"}else{if(this instanceof e){return"CompositeTrack"}else{if(this instanceof c){return"FeatureTrack"}}}}}}}return""},show_message:function(ac){this.tiles_div.remove();return $("<span/>").addClass("message").html(ac).appendTo(this.content_div)},init:function(ae){var ad=this;ad.enabled=false;ad.tile_cache.clear();ad.data_manager.clear();ad.content_div.children().remove();ad.container_div.removeClass("nodata error pending");ad.tiles_div=$("<div/>").addClass("tiles").appendTo(ad.content_div);if(!ad.dataset.id){return}var ac=$.Deferred(),af={hda_ldda:ad.dataset.get("hda_ldda"),data_type:this.dataset_check_type,chrom:ad.view.chrom,retry:ae};$.getJSON(this.dataset.url(),af,function(ag){if(!ag||ag==="error"||ag.kind==="error"){ad.container_div.addClass("error");var ah=ad.show_message(m);if(ag.message){ah.append($("<a href='javascript:void(0);'></a>").text("View error").click(function(){Galaxy.modal.show({title:"Trackster Error",body:"<pre>"+ag.message+"</pre>",buttons:{Close:function(){Galaxy.modal.hide()}}})}));ah.append($("<span/>").text(" "));ah.append($("<a href='javascript:void(0);'></a>").text("Try again").click(function(){ad.init(true)}))}}else{if(ag==="no converter"){ad.container_div.addClass("error");ad.show_message(H)}else{if(ag==="no data"||(ag.data!==undefined&&(ag.data===null||ag.data.length===0))){ad.container_div.addClass("nodata");ad.show_message(E)}else{if(ag==="pending"){ad.container_div.addClass("pending");ad.show_message(u);setTimeout(function(){ad.init()},ad.data_query_wait)}else{if(ag==="data"||ag.status==="data"){if(ag.valid_chroms){ad.valid_chroms=ag.valid_chroms;ad.update_icons()}ad.tiles_div.text(T);if(ad.view.chrom){ad.tiles_div.text("");ad.tiles_div.css("height",ad.visible_height_px+"px");ad.enabled=true;$.when.apply($,ad.predraw_init()).done(function(){ac.resolve();ad.container_div.removeClass("nodata error pending");ad.request_draw()})}else{ac.resolve()}}}}}}});this.update_icons();return ac},predraw_init:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(af&&af.min&&af.max){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_default_value("min_value",ae);ac.config.set_default_value("max_value",ag);ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},get_drawables:function(){return this}});var L=function(ae,ad,ag){f.call(this,ae,ad,ag);var ac=this;k(ac.container_div,ac.drag_handle_class,".group",ac);this.filters_manager=new h.FiltersManager(this,("filters" in ag?ag.filters:null));this.data_manager.set("filters_manager",this.filters_manager);this.filters_available=false;this.tool=(ag.tool?new q(ab.extend(ag.tool,{track:this,tool_state:ag.tool_state})):null);this.tile_cache=new w.Cache(O);this.left_offset=0;if(this.header_div){this.set_filters_manager(this.filters_manager);if(this.tool){var af=new aa({model:this.tool});af.render();this.dynamic_tool_div=af.$el;this.header_div.after(this.dynamic_tool_div)}}this.tiles_div=$("<div/>").addClass("tiles").appendTo(this.content_div);if(!this.config.get_value("content_visible")){this.tiles_div.hide()}this.overlay_div=$("<div/>").addClass("overlay").appendTo(this.content_div);if(ag.mode){this.change_mode(ag.mode)}};o(L.prototype,p.prototype,f.prototype,{action_icons_def:f.prototype.action_icons_def.concat([{name:"show_more_rows_icon",title:"To minimize track height, not all feature rows are displayed. Click to display more rows.",css_class:"exclamation",on_click_fn:function(ac){$(".tooltip").remove();ac.slotters[ac.view.resolution_px_b].max_rows*=2;ac.request_draw({clear_tile_cache:true})},hide:true}]),copy:function(ac){var ad=this.to_dict();o(ad,{data_manager:this.data_manager});var ae=new this.constructor(this.view,ac,ad);ae.change_mode(this.mode);ae.enabled=this.enabled;return ae},set_filters_manager:function(ac){this.filters_manager=ac;this.header_div.after(this.filters_manager.parent_div)},to_dict:function(){return{track_type:this.get_type(),dataset:{id:this.dataset.id,hda_ldda:this.dataset.get("hda_ldda")},prefs:this.config.to_key_value_dict(),mode:this.mode,filters:this.filters_manager.to_dict(),tool_state:(this.tool?this.tool.state_dict():{})}},set_min_max:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(isNaN(parseFloat(ac.config.get_value("min_value")))||isNaN(parseFloat(ac.config.get_value("max_value")))){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},change_mode:function(ad){var ac=this;ac.mode=ad;ac.config.set_value("mode",ad);if(ad==="Auto"){this.data_manager.clear()}ac.request_draw({clear_tile_cache:true});this.action_icons.mode_icon.attr("title","Set display mode (now: "+ac.mode+")");return ac},update_icons:function(){var ac=this;ac.action_icons.filters_icon.toggle(ac.filters_available);ac.action_icons.tools_icon.toggle(ac.tool!==null);ac.action_icons.param_space_viz_icon.toggle(ac.tool!==null)},_gen_tile_cache_key:function(ad,ac){return ad+"_"+ac},request_draw:function(ac){if(ac&&ac.clear_tile_cache){this.tile_cache.clear()}this.view.request_redraw(ac,this)},before_draw:function(){this.max_height_px=0},_draw:function(aq){if(!this.can_draw()){return}var an=aq&&aq.clear_after,al=this.view.low,ag=this.view.high,aj=ag-al,ad=this.view.container.width(),ap=this.view.resolution_px_b,af=1/ap;if(this.is_overview){al=this.view.max_low;ag=this.view.max_high;ap=ad/(view.max_high-view.max_low);af=1/ap}this.before_draw();this.tiles_div.children().addClass("remove");var ak=Math.floor(Q*af),ac=Math.floor(al/ak),am,ah,ai=[],ao=[];while((ac*ak)<ag){am=new w.GenomeRegion({chrom:this.view.chrom,start:ac*ak,end:Math.min((ac+1)*ak,this.view.max_high)});ah=this.draw_helper(am,ap,aq);ai.push(ah);$.when(ah).then(function(ar){ao.push(ar)});ac+=1}if(!an){this.tiles_div.children(".remove").removeClass("remove").remove()}var ae=this;$.when.apply($,ai).then(function(){ae.tiles_div.children(".remove").remove();ao=ab.filter(ao,function(ar){return ar!==null});if(ao.length!==0){ae.postdraw_actions(ao,ad,ap,an)}})},_add_yaxis_label:function(af,ah){var ad=this,ag=(af==="max"?"top":"bottom"),ai=(af==="max"?"max":"min"),ac=(af==="max"?"max_value":"min_value"),ae=this.container_div.find(".yaxislabel."+ag);ah=ah||function(){ad.request_draw({clear_tile_cache:true})};if(ae.length!==0){ae.text(ad.config.get_value(ac))}else{ae=$("<div/>").text(ad.config.get_value(ac)).make_text_editable({num_cols:12,on_finish:function(aj){$(".tooltip").remove();ad.config.set_value(ac,aj);ah()},help_text:"Set "+ai+" value"}).addClass("yaxislabel "+ag).css("color",this.config.get_value("label_color"));this.container_div.prepend(ae)}},postdraw_actions:function(af,ag,ai,ac){var ae=ab.filter(af,function(aj){return(aj instanceof K)});if(ae.length>0){this.max_height_px=0;var ad=this;ab.each(af,function(aj){if(!(aj instanceof K)){aj.html_elt.remove();ad.draw_helper(aj.region,ai,{force:true,mode:"Coverage"})}});ad._add_yaxis_label("max")}else{this.container_div.find(".yaxislabel").remove();var ah=ab.find(af,function(aj){return aj.has_icons});if(ah){ab.each(af,function(aj){if(!aj.has_icons){aj.html_elt.css("padding-top",D)}})}}},get_mode:function(ac){return this.mode},update_auto_mode:function(ac){},_get_drawables:function(){return[this]},draw_helper:function(al,an,ao){if(!ao){ao={}}var ad=ao.force,ai=ao.mode||this.mode,af=1/an,ae=this,ag=this._get_drawables(),am=this._gen_tile_cache_key(an,al),ah=function(ap){return(ap&&"track" in ap)};var aj=(ad?undefined:ae.tile_cache.get_elt(am));if(aj){if(ah(aj)){ae.show_tile(aj,an)}return aj}if(ao.data_fetch===false){return null}var ak=function(){var ap=(ab.find(A,function(ar){return ar===ai})?"Coverage":ai);var aq=ab.map(ag,function(ar){return ar.data_manager.get_data(al,ap,af,ae.data_url_extra_params)});if(view.reference_track){aq.push(view.reference_track.data_manager.get_data(al,ai,af,view.reference_track.data_url_extra_params))}return aq};var ac=$.Deferred();ae.tile_cache.set_elt(am,ac);$.when.apply($,ak()).then(function(){var ap=ak(),av=ap,aB;if(ab.find(ap,function(aD){return j.is_deferred(aD)})){ae.tile_cache.set_elt(am,undefined);$.when(ae.draw_helper(al,an,ao)).then(function(aD){ac.resolve(aD)});return}if(view.reference_track){aB=view.reference_track.data_manager.subset_entry(ap.pop(),al)}var aw=[],at=[];ab.each(ag,function(aG,aD){var aF=aG.mode,aE=av[aD];if(aF==="Auto"){aF=aG.get_mode(aE);aG.update_auto_mode(aF)}aw.push(aF);at.push(aG.get_canvas_height(aE,aF,an,aq))});var au=ae.view.canvas_manager.new_canvas(),ax=al.get("start"),aC=al.get("end"),ar=0,aq=Math.ceil((aC-ax)*an)+ae.left_offset,az=ab.max(at),ay;au.width=aq;au.height=(ao.height||az);var aA=au.getContext("2d");aA.translate(ae.left_offset,0);if(ag.length>1){aA.globalAlpha=0.5;aA.globalCompositeOperation="source-over"}ab.each(ag,function(aE,aD){ay=aE.draw_tile(av[aD],aA,aw[aD],al,an,aB)});if(ay!==undefined){ae.tile_cache.set_elt(am,ay);ae.show_tile(ay,an)}ac.resolve(ay)});return ac},get_canvas_height:function(ac,ae,af,ad){return this.visible_height_px},_draw_line_track_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.LinePainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new K(this,ag,ai,af,ac.data)},draw_tile:function(ac,ad,ag,af,ah,ae){},show_tile:function(ae,ah){var ad=this,ac=ae.html_elt;ae.predisplay_actions();var ag=Math.round((ae.low-(this.is_overview?this.view.max_low:this.view.low))*ah);if(this.left_offset){ag-=this.left_offset}ac.css("left",ag);if(ac.hasClass("remove")){ac.removeClass("remove")}else{this.tiles_div.append(ac)}ac.css("height","auto");this.max_height_px=Math.max(this.max_height_px,ac.height()-2);ac.parent().children().css("height",this.max_height_px+"px");var af=this.max_height_px;if(this.visible_height_px!==0){af=Math.min(this.max_height_px,this.visible_height_px)}this.tiles_div.css("height",af+"px")},tool_region_and_parameters_str:function(af){var ac=this,ae=(af!==undefined?af.toString():"all"),ad=ab.values(ac.tool.get_inputs_dict()).join(", ");return" - region=["+ae+"], parameters=["+ad+"]"},data_and_mode_compatible:function(ac,ad){if(ad==="Auto"){return true}else{if(ad==="Coverage"){return ac.dataset_type==="bigwig"}else{if(ac.dataset_type==="bigwig"||ac.extra_info==="no_detail"){return false}else{return true}}}},can_subset:function(ac){if(ac.message||ac.extra_info==="no_detail"){return false}else{if(ac.dataset_type==="bigwig"){return(ac.data[1][0]-ac.data[0][0]===1)}}return true},init_for_tool_data:function(){this.data_manager.set("data_type","raw_data");this.data_query_wait=1000;this.dataset_check_type="state"}});var W=function(ad,ac){f.call(this,ad,ac,{resize:false,header:false});this.container_div.addClass("label-track")};o(W.prototype,f.prototype,{init:function(){this.enabled=true},predraw_init:function(){},_draw:function(ag){var ae=this.view,af=ae.high-ae.low,aj=Math.floor(Math.pow(10,Math.floor(Math.log(af)/Math.log(10)))),ac=Math.floor(ae.low/aj)*aj,ah=this.view.container.width(),ad=$("<div/>").addClass("label-container");while(ac<ae.high){var ai=(ac-ae.low)/af*ah;ad.append($("<div/>").addClass("label").text(commatize(ac)).css({left:ai}));ac+=aj}this.content_div.children(":first").remove();this.content_div.append(ad)}});var e=function(ad,ac,ag){L.call(this,ad,ac,ag);this.drawables=[];if("drawables" in ag){var af;for(var ae=0;ae<ag.drawables.length;ae++){af=ag.drawables[ae];this.drawables[ae]=n(af,ad,null);if(af.left_offset>this.left_offset){this.left_offset=af.left_offset}}this.enabled=true}ab.each(this.drawables,function(ah){if(ah instanceof c||ah instanceof S){ah.change_mode("Coverage")}});this.update_icons();this.obj_type="CompositeTrack"};o(e.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),action_icons_def:[{name:"composite_icon",title:"Show individual tracks",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_group()}}].concat(L.prototype.action_icons_def),to_dict:y.prototype.to_dict,add_drawable:y.prototype.add_drawable,unpack_drawables:y.prototype.unpack_drawables,config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},on_resize:function(){var ac=this.visible_height_px;ab.each(this.drawables,function(ad){ad.visible_height_px=ac});f.prototype.on_resize.call(this)},change_mode:function(ac){L.prototype.change_mode.call(this,ac);for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad].change_mode(ac)}},init:function(){var ae=[];for(var ad=0;ad<this.drawables.length;ad++){ae.push(this.drawables[ad].init())}var ac=this;$.when.apply($,ae).then(function(){ac.enabled=true;ac.request_draw()})},update_icons:function(){this.action_icons.filters_icon.hide();this.action_icons.tools_icon.hide();this.action_icons.param_space_viz_icon.hide()},can_draw:p.prototype.can_draw,_get_drawables:function(){return this.drawables},show_group:function(){var af=new N(this.view,this.container,{name:this.config.get_value("name")}),ac;for(var ae=0;ae<this.drawables.length;ae++){ac=this.drawables[ae];ac.update_icons();af.add_drawable(ac);ac.container=af;af.content_div.append(ac.container_div)}var ad=this.container.replace_drawable(this,af,true);af.request_draw({clear_tile_cache:true})},before_draw:function(){var ad=ab.min(ab.map(this.drawables,function(ae){return ae.config.get_value("min_value")})),ac=ab.max(ab.map(this.drawables,function(ae){return ae.config.get_value("max_value")}));this.config.set_value("min_value",ad);this.config.set_value("max_value",ac);ab.each(this.drawables,function(ae){ae.config.set_value("min_value",ad);ae.config.set_value("max_value",ac)})},update_all_min_max:function(){var ad=this,ac=this.config.get_value("min_value"),ae=this.config.get_value("max_value");ab.each(this.drawables,function(af){af.config.set_value("min_value",ac);af.config.set_value("max_value",ae)});this.request_draw({clear_tile_cache:true})},postdraw_actions:function(ai,ac,al,ah){var ag=-1,ae;for(ae=0;ae<ai.length;ae++){var aj=ai[ae].html_elt.find("canvas").height();if(aj>ag){ag=aj}}for(ae=0;ae<ai.length;ae++){var af=ai[ae];if(af.html_elt.find("canvas").height()!==ag){this.draw_helper(af.region,al,{force:true,height:ag});af.html_elt.remove()}}var ad=this,ak=function(){ad.update_all_min_max()};this._add_yaxis_label("min",ak);this._add_yaxis_label("max",ak)}});var B=function(ac){L.call(this,ac,{content_div:ac.top_labeltrack},{resize:false,header:false});this.left_offset=ac.canvas_manager.char_width_px;this.container_div.addClass("reference-track");this.data_url=galaxy_config.root+"api/genomes/"+this.view.dbkey;this.data_url_extra_params={reference:true};this.data_manager=new w.GenomeReferenceDataManager({data_url:this.data_url,can_subset:this.can_subset});this.hide_contents()};o(B.prototype,p.prototype,L.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"height",type:"int",default_value:13,hidden:true}]),init:function(){this.data_manager.clear();this.enabled=true},predraw_init:function(){},can_draw:p.prototype.can_draw,draw_helper:function(af,ah,ad){var ac=this.tiles_div.is(":visible"),ag,ae=null;if(ah>this.view.canvas_manager.char_width_px){this.tiles_div.show();ag=true;ae=L.prototype.draw_helper.call(this,af,ah,ad)}else{ag=false;this.tiles_div.hide()}if(ac!==ag){this.view.resize_viewport()}return ae},can_subset:function(ac){return true},draw_tile:function(ae,ak,af,ah,al){var ad=this.data_manager.subset_entry(ae,ah),aj=ad.data;var ac=ak.canvas;ak.font=ak.canvas.manager.default_font;ak.textAlign="center";for(var ag=0,ai=aj.length;ag<ai;ag++){ak.fillStyle=this.view.get_base_color(aj[ag]);ak.fillText(aj[ag],Math.floor(ag*al),10)}return new b(this,ah,al,ac,ad)}});var g=function(ad,ac,ae){this.mode="Histogram";L.call(this,ad,ac,ae)};o(g.prototype,p.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Color",type:"color"},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},before_draw:function(){},draw_tile:function(ac,ad,af,ae,ag){return this._draw_line_track_tile(ac,ad,af,ae,ag)},can_subset:function(ac){return(ac.data[1][0]-ac.data[0][0]===1)},postdraw_actions:function(ad,ae,af,ac){this._add_yaxis_label("max");this._add_yaxis_label("min")}});var r=function(ad,ac,ae){this.mode="Heatmap";L.call(this,ad,ac,ae)};o(r.prototype,p.prototype,L.prototype,{display_modes:["Heatmap"],config_params:ab.union(p.prototype.config_params,[{key:"pos_color",label:"Positive Color",type:"color",default_value:"#FF8C00"},{key:"neg_color",label:"Negative Color",type:"color",default_value:"#4169E1"},{key:"min_value",label:"Min Value",type:"float",default_value:-1},{key:"max_value",label:"Max Value",type:"float",default_value:1},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:500,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.DiagonalHeatmapPainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new b(this,ag,ai,af,ac.data)}});var c=function(ad,ac,ae){L.call(this,ad,ac,ae);this.container_div.addClass("feature-track");this.summary_draw_height=30;this.slotters={};this.start_end_dct={};this.left_offset=200;this.set_painter_from_config()};o(c.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Block color",type:"color"},{key:"reverse_strand_color",label:"Antisense strand color",type:"color"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true,help:"Show the number of items in each bin when drawing summary histogram"},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"connector_style",label:"Connector style",type:"select",default_value:"fishbones",options:[{label:"Line with arrows",value:"fishbone"},{label:"Arcs",value:"arcs"}]},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.set_painter_from_config();this.request_draw({clear_tile_cache:true})},set_painter_from_config:function(){if(this.config.get_value("connector_style")==="arcs"){this.painter=J.ArcLinkedFeaturePainter}else{this.painter=J.LinkedFeaturePainter}},postdraw_actions:function(ao,af,aq,an){L.prototype.postdraw_actions.call(this,ao,af,aq,an);var ah=this,ai,am=ab.filter(ao,function(ar){return(ar instanceof K)});if(am.length===0){var ac={};ab.each(ab.pluck(ao,"incomplete_features"),function(ar){ab.each(ar,function(at){ac[at[0]]=at})});var ap=this;ab.each(ao,function(av){var aw=ab.omit(ac,ab.map(av.incomplete_features,function(ay){return ay[0]}));aw=ab.omit(aw,ab.keys(av.other_tiles_features_drawn));if(ab.size(aw)!==0){var at={data:ab.values(aw)},au=ap.view.canvas_manager.new_canvas(),ar=au.getContext("2d");au.height=Math.max(av.canvas.height,ap.get_canvas_height(at,av.mode,av.w_scale,100));au.width=av.canvas.width;ar.drawImage(av.canvas,0,0);ar.translate(ah.left_offset,0);var ax=ap.draw_tile(at,ar,av.mode,av.region,av.w_scale,av.seq_data);$(av.canvas).replaceWith($(ax.canvas));av.canvas=au;ab.extend(av.other_tiles_features_drawn,ac)}})}if(ah.filters_manager){var ag=ah.filters_manager.filters,ak;for(ak=0;ak<ag.length;ak++){ag[ak].update_ui_elt()}var aj=false,al,ae;for(ai=0;ai<ao.length;ai++){if(ao[ai].data.length){al=ao[ai].data[0];for(ak=0;ak<ag.length;ak++){ae=ag[ak];if(ae.applies_to(al)&&ae.min!==ae.max){aj=true;break}}}}if(ah.filters_available!==aj){ah.filters_available=aj;if(!ah.filters_available){ah.filters_manager.hide()}ah.update_icons()}}if(ao[0] instanceof M){var ad=true;for(ai=0;ai<ao.length;ai++){if(!ao[ai].all_slotted){ad=false;break}}this.action_icons.show_more_rows_icon.toggle(!ad)}else{this.action_icons.show_more_rows_icon.hide()}},update_auto_mode:function(ac){if(this.mode==="Auto"){if(ac==="no_detail"){ac="feature spans"}this.action_icons.mode_icon.attr("title","Set display mode (now: Auto/"+ac+")")}},incremental_slots:function(ag,ac,af){var ad=this.view.canvas_manager.dummy_context,ae=this.slotters[ag];if(!ae||(ae.mode!==af)){ae=new (s.FeatureSlotter)(ag,af,z,function(ah){return ad.measureText(ah)});this.slotters[ag]=ae}return ae.slot_features(ac)},get_mode:function(ac){if(ac.extra_info==="no_detail"||this.is_overview){mode="no_detail"}else{if(this.view.high-this.view.low>G){mode="Squish"}else{mode="Pack"}}return mode},get_canvas_height:function(ac,ag,ah,ad){if(ag==="Coverage"||ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var af=this.incremental_slots(ah,ac.data,ag);var ae=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return Math.max(this.min_height_px,ae.get_required_height(af,ad))}},draw_tile:function(an,at,aq,ag,ak,af,ao){var ar=this,ae=at.canvas,az=ag.get("start"),ad=ag.get("end"),ah=this.left_offset;if(an.dataset_type==="bigwig"){return this._draw_line_track_tile(an,at,aq,ag,ak)}var aj=[],ap=this.slotters[ak].slots;all_slotted=true;if(an.data){var al=this.filters_manager.filters;for(var au=0,aw=an.data.length;au<aw;au++){var ai=an.data[au];var av=false;var am;for(var ay=0,aD=al.length;ay<aD;ay++){am=al[ay];am.update_attrs(ai);if(!am.keep(ai)){av=true;break}}if(!av){aj.push(ai);if(!(ai[0] in ap)){all_slotted=false}}}}var aC=(this.filters_manager.alpha_filter?new C(this.filters_manager.alpha_filter):null),aA=(this.filters_manager.height_filter?new C(this.filters_manager.height_filter):null),aB=new (this.painter)(aj,az,ad,this.config.to_key_value_dict(),aq,aC,aA,af,function(aE){return ar.view.get_base_color(aE)});var ax=null;at.fillStyle=this.config.get_value("block_color");at.font=at.canvas.manager.default_font;at.textAlign="right";if(an.data){var ac=aB.draw(at,ae.width,ae.height,ak,ap);ax=ac.feature_mapper;incomplete_features=ac.incomplete_features;ax.translation=-ah}if(!ao){return new M(ar,ag,ak,ae,an.data,aq,an.message,all_slotted,ax,incomplete_features,af)}}});var Z=function(ad,ac,ae){L.call(this,ad,ac,ae);this.painter=J.VariantPainter;this.summary_draw_height=30;this.left_offset=30};o(Z.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Histogram color",type:"color"},{key:"show_sample_data",label:"Show sample data",type:"bool",default_value:true},{key:"show_labels",label:"Show summary and sample labels",type:"bool",default_value:true},{key:"summary_height",label:"Locus summary height",type:"float",default_value:20},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,af,ah,ag,ai){if(ac.dataset_type==="bigwig"){return this._draw_line_track_tile(ac,af,"Histogram",ag,ai)}else{var ae=this.view,ad=new (this.painter)(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah,function(aj){return ae.get_base_color(aj)});ad.draw(af,af.canvas.width,af.canvas.height,ai);return new b(this,ag,ai,af.canvas,ac.data)}},get_canvas_height:function(ac,ag,ah,ae){if(ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var ad=(this.dataset.get_metadata("sample_names")?this.dataset.get_metadata("sample_names").length:0);if(ad===0&&ac.data.length!==0){ad=ac.data[0][7].match(/,/g);if(ad===null){ad=1}else{ad=ad.length+1}}var af=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return af.get_required_height(ad)}},predraw_init:function(){var ac=[f.prototype.predraw_init.call(this)];if(!this.dataset.get_metadata("sample_names")){ac.push(this.dataset.fetch())}return ac},postdraw_actions:function(ag,ah,aj,ad){L.prototype.postdraw_actions.call(this,ag,ah,aj,ad);var af=ab.filter(ag,function(ak){return(ak instanceof K)});var ae=this.dataset.get_metadata("sample_names");if(af.length===0&&this.config.get_value("show_labels")&&ae&&ae.length>1){var ac;if(this.container_div.find(".yaxislabel.variant").length===0){ac=this.config.get_value("summary_height")/2;this.tiles_div.prepend($("<div/>").text("Summary").addClass("yaxislabel variant top").css({"font-size":ac+"px",top:(this.config.get_value("summary_height")-ac)/2+"px"}));if(this.config.get_value("show_sample_data")){var ai=ae.join("<br/>");this.tiles_div.prepend($("<div/>").html(ai).addClass("yaxislabel variant top sample").css({top:this.config.get_value("summary_height")}))}}ac=(this.mode==="Squish"?5:10)+"px";$(this.tiles_div).find(".sample").css({"font-size":ac,"line-height":ac});$(this.tiles_div).find(".yaxislabel").css("color",this.config.get_value("label_color"))}else{this.container_div.find(".yaxislabel.variant").remove()}}});var S=function(ad,ac,ae){c.call(this,ad,ac,ae);this.painter=J.ReadPainter;this.update_icons()};o(S.prototype,p.prototype,L.prototype,c.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Histogram color",type:"color"},{key:"detail_block_color",label:"Sense strand block color",type:"color",default_value:"#AAAAAA"},{key:"reverse_strand_color",label:"Antisense strand block color",type:"color",default_value:"#DDDDDD"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})}});var d={CompositeTrack:e,DrawableGroup:N,DiagonalHeatmapTrack:r,FeatureTrack:c,LineTrack:g,ReadTrack:S,VariantTrack:Z,VcfTrack:Z};var n=function(ae,ad,ac){if("copy" in ae){return ae.copy(ac)}else{var af=ae.obj_type;if(!af){af=ae.track_type}return new d[af](ad,ac,ae)}};return{TracksterView:Y,DrawableGroup:N,LineTrack:g,FeatureTrack:c,DiagonalHeatmapTrack:r,ReadTrack:S,VariantTrack:Z,CompositeTrack:e,object_from_template:n}});
\ No newline at end of file
diff -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a -r 0e9c220ff8cd619c902aca574a07f208a2a30a21 static/scripts/viz/trackster/tracks.js
--- a/static/scripts/viz/trackster/tracks.js
+++ b/static/scripts/viz/trackster/tracks.js
@@ -1021,7 +1021,7 @@
d.current_x = d.offsetX;
var delta_chrom = Math.round(delta / view.viewport_container.width() * (view.high - view.low));
view.move_delta(delta_chrom);
- })
+ });
/*
FIXME: Do not do this for now because it's too jittery. Some kind of gravity approach is
needed here because moving left/right should be difficult.
@@ -1600,7 +1600,7 @@
// Restore tool visibility from state; default to hidden.
var hidden = true;
if (options.tool_state !== undefined && options.tool_state.hidden !== undefined) {
- hidden = options.tool_state.hidden
+ hidden = options.tool_state.hidden;
}
this.set('hidden', hidden);
@@ -2756,22 +2756,22 @@
this.tiles_div.children().addClass("remove");
var
+ // Tile width in bases.
+ tile_width = Math.floor(TILE_SIZE * resolution),
// Index of first tile that overlaps visible region.
- tile_index = Math.floor( low / (resolution * TILE_SIZE) ),
- // Base that first tile starts with.
- tile_low = Math.floor(tile_index * TILE_SIZE * resolution),
+ tile_index = Math.floor(low / tile_width),
tile_region,
tile_promise,
tile_promises = [],
tiles = [];
// Draw tiles.
- while ( ( tile_index * TILE_SIZE * resolution ) < high ) {
+ while ( (tile_index * tile_width) < high ) {
// Get tile region.
tile_region = new visualization.GenomeRegion({
chrom: this.view.chrom,
- start: tile_low,
+ start: tile_index * tile_width,
// Tile high cannot be larger than view.max_high, which the chromosome length.
- end: Math.min( tile_low + Math.ceil( TILE_SIZE * resolution ), this.view.max_high )
+ end: Math.min( (tile_index + 1) * tile_width, this.view.max_high)
});
tile_promise = this.draw_helper(tile_region, w_scale, options);
tile_promises.push(tile_promise);
@@ -2781,7 +2781,6 @@
// Go to next tile.
tile_index += 1;
- tile_low = tile_region.get('end');
}
// Step (c) for (re)moving tiles when clear_after is false.
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Trackster: stabilize tile boundary calculations so that tiles do not overlap or yield visual artifacts.
by commits-noreply@bitbucket.org 06 Aug '14
by commits-noreply@bitbucket.org 06 Aug '14
06 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/283f3be266ea/
Changeset: 283f3be266ea
Branch: next-stable
User: jgoecks
Date: 2014-08-06 16:28:01
Summary: Trackster: stabilize tile boundary calculations so that tiles do not overlap or yield visual artifacts.
Affected #: 2 files
diff -r 8a80483f4a571ea66c0c397bcc367b2e8e4d52df -r 283f3be266eab2951f04cda8204fc24af22983ca static/scripts/packed/viz/trackster/tracks.js
--- a/static/scripts/packed/viz/trackster/tracks.js
+++ b/static/scripts/packed/viz/trackster/tracks.js
@@ -1,1 +1,1 @@
-define(["libs/underscore","viz/visualization","viz/viz_views","viz/trackster/util","viz/trackster/slotting","viz/trackster/painters","viz/trackster/filters","mvc/data","mvc/tools","utils/config"],function(ab,w,V,j,s,J,h,X,P,R){var o=ab.extend;var l={};var i=function(ac,ad){l[ac.attr("id")]=ad};var k=function(ac,ad,af,ae){af=".group";l[ac.attr("id")]=ae;ac.bind("drag",{handle:"."+ad,relative:true},function(an,ao){var am=$(this),ar=$(this).parent(),aj=ar.children(".track,.group"),al=l[$(this).attr("id")],ai,ah,ap,ag,ak;ah=$(this).parents(af);if(ah.length!==0){ap=ah.position().top;ag=ap+ah.outerHeight();var aq=l[ah.attr("id")];if(ao.offsetY<ap){$(this).insertBefore(ah);aq.remove_drawable(al);aq.container.add_drawable_before(al,aq);return}else{if(ao.offsetY>ag){$(this).insertAfter(ah);aq.remove_drawable(al);aq.container.add_drawable(al);return}}}ah=null;for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));ap=ai.position().top;ag=ap+ai.outerHeight();if(ai.is(af)&&this!==ai.get(0)&&ao.offsetY>=ap&&ao.offsetY<=ag){if(ao.offsetY-ap<ag-ao.offsetY){ai.find(".content-div").prepend(this)}else{ai.find(".content-div").append(this)}if(al.container){al.container.remove_drawable(al)}l[ai.attr("id")].add_drawable(al);return}}for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));if(ao.offsetY<ai.position().top&&!(ai.hasClass("reference-track")||ai.hasClass("intro"))){break}}if(ak===aj.length){if(this!==aj.get(ak-1)){ar.append(this);l[ar.attr("id")].move_drawable(al,ak)}}else{if(this!==aj.get(ak)){$(this).insertBefore(aj.get(ak));l[ar.attr("id")].move_drawable(al,(ao.deltaY>0?ak-1:ak))}}}).bind("dragstart",function(){$(this).addClass("dragging")}).bind("dragend",function(){$(this).removeClass("dragging")})};var D=20,z=100,G=12000,Q=400,I=5000,v=100,m="Cannot display dataset due to an error. ",H="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",E="No data for this chrom/contig.",u="Preparing data. This can take a while for a large dataset. If the visualization is saved and closed, preparation will continue in the background.",x="Tool cannot be rerun: ",a="Loading data...",T="Ready for display",O=10,F=20,A=["Histogram","Line","Filled","Intensity"];function U(ad,ac){if(!ac){ac=0}var ae=Math.pow(10,ac);return Math.round(ad*ae)/ae}var p=function(ad,ac,ag){if(!p.id_counter){p.id_counter=0}this.id=p.id_counter++;this.view=ad;this.container=ac;this.drag_handle_class=ag.drag_handle_class;this.is_overview=false;this.action_icons={};this.config=R.ConfigSettingCollection.from_models_and_saved_values(this.config_params,ag.prefs);if(!this.config.get_value("name")){this.config.set_value("name",ag.name)}if(this.config_onchange){this.config.on("change",this.config_onchange,this)}this.container_div=this.build_container_div();this.header_div=null;if(ag.header!==false){var ae=new V.TrackHeaderView({model:this,id:this.id});this.header_div=ae.$el;this.container_div.append(this.header_div);var af=ae.icons_div;this.action_icons=ae.action_icons;this.container_div.hover(function(){af.show()},function(){af.hide()})}};p.prototype.action_icons_def=[{name:"toggle_icon",title:"Hide/show content",css_class:"toggle",on_click_fn:function(ac){if(ac.config.get_value("content_visible")){ac.action_icons.toggle_icon.addClass("toggle-expand").removeClass("toggle");ac.hide_contents();ac.config.set_value("content_visible",false)}else{ac.action_icons.toggle_icon.addClass("toggle").removeClass("toggle-expand");ac.config.set_value("content_visible",true);ac.show_contents()}}},{name:"settings_icon",title:"Edit settings",css_class:"gear",on_click_fn:function(ad){var ac=new R.ConfigSettingCollectionView({collection:ad.config});ac.render_in_modal("Configure Track")}},{name:"remove_icon",title:"Remove",css_class:"remove-icon",on_click_fn:function(ac){$(".tooltip").remove();ac.remove()}}];o(p.prototype,{config_params:[{key:"name",label:"Name",type:"text",default_value:""},{key:"content_visible",type:"bool",default_value:true,hidden:true}],config_onchange:function(){},init:function(){},changed:function(){this.view.changed()},can_draw:function(){if(this.enabled&&this.config.get_value("content_visible")){return true}return false},request_draw:function(){},_draw:function(ac){},to_dict:function(){},set_name:function(ac){this.old_name=this.config.get_value("name");this.config.set_value("name",ac)},revert_name:function(){if(this.old_name){this.config.set_value("name",this.old_name)}},remove:function(){this.changed();this.container.remove_drawable(this);var ac=this.view;this.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})},build_container_div:function(){},update_icons:function(){},hide_contents:function(){},show_contents:function(){},get_drawables:function(){}});var y=function(ad,ac,ae){p.call(this,ad,ac,ae);this.obj_type=ae.obj_type;this.drawables=[]};o(y.prototype,p.prototype,{unpack_drawables:function(ae){this.drawables=[];var ad;for(var ac=0;ac<ae.length;ac++){ad=n(ae[ac],this.view,this);this.add_drawable(ad)}},init:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].init()}},_draw:function(ac){for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad]._draw(ac)}},to_dict:function(){var ad=[];for(var ac=0;ac<this.drawables.length;ac++){ad.push(this.drawables[ac].to_dict())}return{prefs:this.config.to_key_value_dict(),obj_type:this.obj_type,drawables:ad}},add_drawable:function(ac){this.drawables.push(ac);ac.container=this;this.changed()},add_drawable_before:function(ae,ac){this.changed();var ad=this.drawables.indexOf(ac);if(ad!==-1){this.drawables.splice(ad,0,ae);return true}return false},replace_drawable:function(ae,ac,ad){var af=this.drawables.indexOf(ae);if(af!==-1){this.drawables[af]=ac;if(ad){ae.container_div.replaceWith(ac.container_div)}this.changed()}return af},remove_drawable:function(ad){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);ad.container=null;this.changed();return true}return false},move_drawable:function(ad,ae){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);this.drawables.splice(ae,0,ad);this.changed();return true}return false},get_drawables:function(){return this.drawables},get_tracks:function(af){var ac=this.drawables.slice(0),ad=[],ae;while(ac.length!==0){ae=ac.shift();if(ae instanceof af){ad.push(ae)}else{if(ae.drawables){ac=ac.concat(ae.drawables)}}}return ad}});var N=function(ad,ac,af){o(af,{obj_type:"DrawableGroup",drag_handle_class:"group-handle"});y.call(this,ad,ac,af);this.content_div=$("<div/>").addClass("content-div").attr("id","group_"+this.id+"_content_div").appendTo(this.container_div);i(this.container_div,this);i(this.content_div,this);k(this.container_div,this.drag_handle_class,".group",this);this.filters_manager=new h.FiltersManager(this);this.header_div.after(this.filters_manager.parent_div);this.filters_manager.parent_div.after($("<div style='clear: both'/>"));this.saved_filters_managers=[];if("drawables" in af){this.unpack_drawables(af.drawables)}if("filters" in af){var ae=this.filters_manager;this.filters_manager=new h.FiltersManager(this,af.filters);ae.parent_div.replaceWith(this.filters_manager.parent_div);if(af.filters.visible){this.setup_multitrack_filtering()}}};o(N.prototype,p.prototype,y.prototype,{action_icons_def:[p.prototype.action_icons_def[0],p.prototype.action_icons_def[1],{name:"composite_icon",title:"Show composite track",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_composite_track()}},{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters();ac._restore_filter_managers()}else{ac.setup_multitrack_filtering();ac.request_draw({clear_tile_cache:true})}ac.filters_manager.toggle()}},p.prototype.action_icons_def[2]],build_container_div:function(){var ac=$("<div/>").addClass("group").attr("id","group_"+this.id);if(this.container){this.container.content_div.append(ac)}return ac},hide_contents:function(){this.tiles_div.hide()},show_contents:function(){this.tiles_div.show();this.request_draw()},update_icons:function(){var ae=this.drawables.length;if(ae===0){this.action_icons.composite_icon.hide();this.action_icons.filters_icon.hide()}else{if(ae===1){this.action_icons.composite_icon.toggle(this.drawables[0] instanceof e);this.action_icons.filters_icon.hide()}else{var al,ak,ai,ao=true,ag=this.drawables[0].get_type(),ac=0;for(al=0;al<ae;al++){ai=this.drawables[al];if(ai.get_type()!==ag){can_composite=false;break}if(ai instanceof c){ac++}}if(ao&&this.drawables[0] instanceof g){this.action_icons.composite_icon.show()}else{this.action_icons.composite_icon.hide();$(".tooltip").remove()}if(ac>1&&ac===this.drawables.length){var ap={},ad;ai=this.drawables[0];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];ap[ad.name]=[ad]}for(al=1;al<this.drawables.length;al++){ai=this.drawables[al];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];if(ad.name in ap){ap[ad.name].push(ad)}}}this.filters_manager.remove_all();var af,ah,aj,am;for(var an in ap){af=ap[an];if(af.length===ac){ah=new h.NumberFilter({name:af[0].name,index:af[0].index});this.filters_manager.add_filter(ah)}}this.action_icons.filters_icon.toggle(this.filters_manager.filters.length>0)}else{this.action_icons.filters_icon.hide()}}}},_restore_filter_managers:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].filters_manager=this.saved_filters_managers[ac]}this.saved_filters_managers=[]},setup_multitrack_filtering:function(){if(this.filters_manager.filters.length>0){this.saved_filters_managers=[];for(var ac=0;ac<this.drawables.length;ac++){drawable=this.drawables[ac];this.saved_filters_managers.push(drawable.filters_manager);drawable.filters_manager=this.filters_manager}}this.filters_manager.init_filters()},show_composite_track:function(){var ad=new e(this.view,this.view,{name:this.config.get_value("name"),drawables:this.drawables});var ac=this.container.replace_drawable(this,ad,true);ad.request_draw()},add_drawable:function(ac){y.prototype.add_drawable.call(this,ac);this.update_icons()},remove_drawable:function(ac){y.prototype.remove_drawable.call(this,ac);this.update_icons()},to_dict:function(){if(this.filters_manager.visible()){this._restore_filter_managers()}var ac=o(y.prototype.to_dict.call(this),{filters:this.filters_manager.to_dict()});if(this.filters_manager.visible()){this.setup_multitrack_filtering()}return ac},request_draw:function(ac){ab.each(this.drawables,function(ad){ad.request_draw(ac)})}});var Y=Backbone.View.extend({initialize:function(ac){o(ac,{obj_type:"View"});y.call(this,"View",ac.container,ac);this.chrom=null;this.vis_id=ac.vis_id;this.dbkey=ac.dbkey;this.label_tracks=[];this.tracks_to_be_redrawn=[];this.max_low=0;this.max_high=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.load_chroms_deferred=null;this.render();this.canvas_manager=new w.CanvasManager(this.container.get(0).ownerDocument);this.reset();this.config=R.ConfigSettingCollection.from_models_and_saved_values([{key:"name",label:"Name",type:"text",default_value:""},{key:"a_color",label:"A Color",type:"color",default_value:"#FF0000"},{key:"c_color",label:"C Color",type:"color",default_value:"#00FF00"},{key:"g_color",label:"G Color",type:"color",default_value:"#0000FF"},{key:"t_color",label:"T Color",type:"color",default_value:"#FF00FF"},{key:"n_color",label:"N Color",type:"color",default_value:"#AAAAAA"}],{name:ac.name})},render:function(){this.requested_redraw=false;var ae=this.container,ac=this;this.top_container=$("<div/>").addClass("top-container").appendTo(ae);this.browser_content_div=$("<div/>").addClass("content").appendTo(ae);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(ae);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").attr("id","viewport-container").appendTo(this.browser_content_div);this.content_div=this.viewport_container;i(this.viewport_container,ac);this.intro_div=$("<div/>").addClass("intro").appendTo(this.viewport_container);var af=$("<div/>").text("Add Datasets to Visualization").addClass("action-button").appendTo(this.intro_div).click(function(){w.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",{"f-dbkey":ac.dbkey},function(ag){ab.each(ag,function(ah){ac.add_drawable(n(ah,ac,ac))})})});this.nav_container=$("<div/>").addClass("trackster-nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("trackster-nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a/>").attr("title","Close overview").addClass("icon-button overview-close tooltip").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_select=$("<select/>").attr({name:"chrom"}).addClass("chrom-nav").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var ad=function(ag){if(ag.type==="focusout"||(ag.keyCode||ag.which)===13||(ag.keyCode||ag.which)===27){if((ag.keyCode||ag.which)!==27){ac.go_to($(this).val())}$(this).hide();$(this).val("");ac.location_span.show();ac.chrom_select.show()}ag.stopPropagation()};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",ad).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").attr("title","Click to change location").tooltip({placement:"bottom"}).appendTo(this.nav_controls);this.location_span.click(function(){ac.location_span.hide();ac.chrom_select.hide();ac.nav_input.val(ac.chrom+":"+ac.low+"-"+ac.high);ac.nav_input.css("display","inline-block");ac.nav_input.select();ac.nav_input.focus();ac.nav_input.autocomplete({source:function(ai,ag){var aj=[],ah=$.map(ac.get_tracks(c),function(ak){return ak.data_manager.search_features(ai.term).success(function(al){aj=aj.concat(al)})});$.when.apply($,ah).done(function(){ag($.map(aj,function(ak){return{label:ak[0],value:ak[1]}}))})},minLength:2})});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a/>").attr("id","zoom-out").attr("title","Zoom out").tooltip({placement:"bottom"}).click(function(){ac.zoom_out()}).appendTo(this.nav_controls);this.zi_link=$("<a/>").attr("id","zoom-in").attr("title","Zoom in").tooltip({placement:"bottom"}).click(function(){ac.zoom_in()}).appendTo(this.nav_controls);this.load_chroms_deferred=this.load_chroms({low:0});this.chrom_select.bind("change",function(){ac.change_chrom(ac.chrom_select.val())});this.browser_content_div.click(function(ag){$(this).find("input").trigger("blur")});this.browser_content_div.bind("dblclick",function(ag){ac.zoom_in(ag.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(ag,ah){this.current_x=ah.offsetX}).bind("drag",function(ag,ai){var aj=ai.offsetX-this.current_x;this.current_x=ai.offsetX;var ah=Math.round(aj/ac.viewport_container.width()*(ac.max_high-ac.max_low));ac.move_delta(-ah)});this.overview_close.click(function(){ac.reset_overview()});this.viewport_container.bind("draginit",function(ag,ah){if(ag.clientX>ac.viewport_container.width()-16){return false}}).bind("dragstart",function(ag,ah){ah.original_low=ac.low;ah.current_height=ag.clientY;ah.current_x=ah.offsetX}).bind("drag",function(ai,ak){var ag=$(this);var al=ak.offsetX-ak.current_x;var ah=ag.scrollTop()-(ai.clientY-ak.current_height);ag.scrollTop(ah);ak.current_height=ai.clientY;ak.current_x=ak.offsetX;var aj=Math.round(al/ac.viewport_container.width()*(ac.high-ac.low));ac.move_delta(aj)});this.top_labeltrack.bind("dragstart",function(ag,ah){return $("<div/>").addClass("zoom-area").css("height",ac.browser_content_div.height()+ac.top_labeltrack.height()+1).appendTo($(this))}).bind("drag",function(ak,al){$(al.proxy).css({left:Math.min(ak.pageX,al.startX)-ac.container.offset().left,width:Math.abs(ak.pageX-al.startX)});var ah=Math.min(ak.pageX,al.startX)-ac.container.offset().left,ag=Math.max(ak.pageX,al.startX)-ac.container.offset().left,aj=(ac.high-ac.low),ai=ac.viewport_container.width();ac.update_location(Math.round(ah/ai*aj)+ac.low,Math.round(ag/ai*aj)+ac.low)}).bind("dragend",function(al,am){var ah=Math.min(al.pageX,am.startX),ag=Math.max(al.pageX,am.startX),aj=(ac.high-ac.low),ai=ac.viewport_container.width(),ak=ac.low;ac.low=Math.round(ah/ai*aj)+ak;ac.high=Math.round(ag/ai*aj)+ak;$(am.proxy).remove();ac.request_redraw()});this.add_label_track(new W(this,{content_div:this.top_labeltrack}));$(window).bind("resize",function(){if(this.resize_timer){clearTimeout(this.resize_timer)}this.resize_timer=setTimeout(function(){ac.resize_window()},500)});$(document).bind("redraw",function(){ac.redraw()});this.reset();$(window).trigger("resize")},get_base_color:function(ac){return this.config.get_value(ac.toLowerCase()+"_color")||this.config.get_value("n_color")}});o(Y.prototype,y.prototype,{changed:function(){this.has_changes=true},update_intro_div:function(){this.intro_div.toggle(this.drawables.length===0)},trigger_navigate:function(ad,af,ac,ag){if(this.timer){clearTimeout(this.timer)}if(ag){var ae=this;this.timer=setTimeout(function(){ae.trigger("navigate",ad+":"+af+"-"+ac)},500)}else{view.trigger("navigate",ad+":"+af+"-"+ac)}},update_location:function(ac,ae){this.location_span.text(commatize(ac)+" - "+commatize(ae));this.nav_input.val(this.chrom+":"+commatize(ac)+"-"+commatize(ae));var ad=view.chrom_select.val();if(ad!==""){this.trigger_navigate(ad,view.low,view.high,true)}},load_chroms:function(ae){ae.num=v;var ac=this,ad=$.Deferred();$.ajax({url:galaxy_config.root+"api/genomes/"+this.dbkey,data:ae,dataType:"json",success:function(ag){if(ag.chrom_info.length===0){return}if(ag.reference){var ah=new B(ac);ac.add_label_track(ah);ac.reference_track=ah}ac.chrom_data=ag.chrom_info;var ak='<option value="">Select Chrom/Contig</option>';for(var aj=0,af=ac.chrom_data.length;aj<af;aj++){var ai=ac.chrom_data[aj].chrom;ak+='<option value="'+ai+'">'+ai+"</option>"}if(ag.prev_chroms){ak+='<option value="previous">Previous '+v+"</option>"}if(ag.next_chroms){ak+='<option value="next">Next '+v+"</option>"}ac.chrom_select.html(ak);ac.chrom_start_index=ag.start_index;ad.resolve(ag.chrom_info)},error:function(){alert("Could not load chroms for this dbkey: "+ac.dbkey)}});return ad},change_chrom:function(ah,ad,aj){var ae=this;if(!ae.chrom_data){ae.load_chroms_deferred.then(function(){ae.change_chrom(ah,ad,aj)});return}if(!ah||ah==="None"){return}if(ah==="previous"){ae.load_chroms({low:this.chrom_start_index-v});return}if(ah==="next"){ae.load_chroms({low:this.chrom_start_index+v});return}var ai=$.grep(ae.chrom_data,function(ak,al){return ak.chrom===ah})[0];if(ai===undefined){ae.load_chroms({chrom:ah},function(){ae.change_chrom(ah,ad,aj)});return}else{if(ah!==ae.chrom){ae.chrom=ah;ae.chrom_select.val(ae.chrom);ae.max_high=ai.len-1;ae.reset();for(var ag=0,ac=ae.drawables.length;ag<ac;ag++){var af=ae.drawables[ag];if(af.init){af.init()}}if(ae.reference_track){ae.reference_track.init()}}if(ad===undefined&&aj===undefined){ae.low=0;ae.high=ae.max_high}else{ae.low=(ad!==undefined?Math.max(ad,0):0);if(aj===undefined){ae.low=Math.max(ae.low-15,0);ae.high=ae.low+30}else{ae.high=Math.min(aj,ae.max_high)}}ae.request_redraw()}},go_to:function(ag){ag=ag.replace(/,/g,"");ag=ag.replace(/:|\-/g," ");var ad=ag.split(/\s+/),af=ad[0],ae=(ad[1]?parseInt(ad[1],10):undefined),ac=(ad[2]?parseInt(ad[2],10):undefined);this.change_chrom(af,ae,ac)},move_fraction:function(ae){var ac=this;var ad=ac.high-ac.low;this.move_delta(ae*ad)},move_delta:function(af){var ac=this;var ae=ac.high-ac.low;if(ac.low-af<ac.max_low){ac.low=ac.max_low;ac.high=ac.max_low+ae}else{if(ac.high-af>ac.max_high){ac.high=ac.max_high;ac.low=ac.max_high-ae}else{ac.high-=af;ac.low-=af}}ac.request_redraw({data_fetch:false});if(this.redraw_on_move_fn){clearTimeout(this.redraw_on_move_fn)}this.redraw_on_move_fn=setTimeout(function(){ac.request_redraw()},200);var ad=ac.chrom_select.val();this.trigger_navigate(ad,ac.low,ac.high,true)},add_drawable:function(ad){y.prototype.add_drawable.call(this,ad);ad.init();this.changed();this.update_intro_div();var ac=this;ad.config.on("change",function(){ac.changed()})},add_label_track:function(ac){ac.view=this;ac.init();this.label_tracks.push(ac)},remove_drawable:function(ae,ad){y.prototype.remove_drawable.call(this,ae);if(ad){var ac=this;ae.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})}},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},request_redraw:function(ad,ae){var ac=this,af=(ae?[ae]:ac.drawables);ab.each(af,function(ag){var ah=ab.find(ac.tracks_to_be_redrawn,function(ai){return ai[0]===ag});if(ah){ah[1]=ad}else{ac.tracks_to_be_redrawn.push([ag,ad])}});if(!this.requested_redraw){requestAnimationFrame(function(){ac._redraw()});this.requested_redraw=true}},_redraw:function(){this.requested_redraw=false;var ac=this.low,ag=this.high;if(ac<this.max_low){ac=this.max_low}if(ag>this.max_high){ag=this.max_high}var ad=this.high-this.low;if(this.high!==0&&ad<this.min_separation){ag=ac+this.min_separation}this.low=Math.floor(ac);this.high=Math.ceil(ag);this.update_location(this.low,this.high);this.resolution_px_b=this.viewport_container.width()/(this.high-this.low);var af=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ah=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ae=13;this.overview_box.css({left:af,width:Math.max(ae,ah)}).show();if(ah<ae){this.overview_box.css("left",af-(ae-ah)/2)}if(this.overview_highlight){this.overview_highlight.css({left:af,width:ah})}ab.each(this.tracks_to_be_redrawn,function(ak){var ai=ak[0],aj=ak[1];if(ai){ai._draw(aj)}});this.tracks_to_be_redrawn=[];ab.each(this.label_tracks,function(ai){ai._draw()})},zoom_in:function(ad,ae){if(this.max_high===0||this.high-this.low<=this.min_separation){return}var af=this.high-this.low,ag=af/2+this.low,ac=(af/this.zoom_factor)/2;if(ad){ag=ad/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(ag-ac);this.high=Math.round(ag+ac);this.changed();this.request_redraw()},zoom_out:function(){if(this.max_high===0){return}var ad=this.high-this.low,ae=ad/2+this.low,ac=(ad*this.zoom_factor)/2;this.low=Math.round(ae-ac);this.high=Math.round(ae+ac);this.changed();this.request_redraw()},resize_viewport:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height())},resize_window:function(){this.resize_viewport();this.request_redraw()},set_overview:function(ae){if(this.overview_drawable){if(this.overview_drawable.dataset.id===ae.dataset.id){return}this.overview_viewport.find(".track").remove()}var ad=ae.copy({content_div:this.overview_viewport}),ac=this;ad.header_div.hide();ad.is_overview=true;ac.overview_drawable=ad;this.overview_drawable.postdraw_actions=function(){ac.overview_highlight.show().height(ac.overview_drawable.content_div.height());ac.overview_viewport.height(ac.overview_drawable.content_div.height()+ac.overview_box.outerHeight());ac.overview_close.show();ac.resize_window()};ac.overview_drawable.request_draw();this.changed()},reset_overview:function(){$(".tooltip").remove();this.overview_viewport.find(".track-tile").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide();view.resize_window();view.overview_drawable=null}});var q=P.Tool.extend({defaults:{track:null},initialize:function(ac){P.Tool.prototype.initialize.call(this,ac);var ad=true;if(ac.tool_state!==undefined&&ac.tool_state.hidden!==undefined){ad=ac.tool_state.hidden}this.set("hidden",ad);this.remove_inputs(["data","hidden_data","conditional"])},state_dict:function(ac){return ab.extend(this.get_inputs_dict(),{hidden:!this.is_visible()})}});var t=Backbone.View.extend({events:{"change :input":"update_value"},render:function(){var ae=this.$el.addClass("param-row"),af=this.model;var ac=$("<div>").addClass("param-label").text(af.get("label")).appendTo(ae);var ad=$("<div/>").addClass("param-input").html(af.get("html")).appendTo(ae);ad.find(":input").val(af.get("value"));$("<div style='clear: both;'/>").appendTo(ae)},update_value:function(ac){this.model.set_value($(ac.target).val())}});var aa=Backbone.View.extend({initialize:function(ac){this.model.on("change:hidden",this.set_visible,this)},render:function(){var ad=this;tool=this.model,parent_div=this.$el.addClass("dynamic-tool").hide();parent_div.bind("drag",function(ah){ah.stopPropagation()}).click(function(ah){ah.stopPropagation()}).bind("dblclick",function(ah){ah.stopPropagation()}).keydown(function(ah){ah.stopPropagation()});var ae=$("<div class='tool-name'>").appendTo(parent_div).text(tool.get("name"));tool.get("inputs").each(function(ai){var ah=new t({model:ai});ah.render();parent_div.append(ah.$el)});parent_div.find("input").click(function(){$(this).select()});var af=$("<div>").addClass("param-row").appendTo(parent_div);var ag=$("<input type='submit'>").attr("value","Run on complete dataset").appendTo(af);var ac=$("<input type='submit'>").attr("value","Run on visible region").appendTo(af);ac.click(function(){ad.run_on_region()});ag.click(function(){ad.run_on_dataset()});if(tool.is_visible()){this.$el.show()}},set_visible:function(){this.$el.toggle(this.model.is_visible())},update_params:function(){for(var ac=0;ac<this.params.length;ac++){this.params[ac].update_value()}},run_on_dataset:function(){var ac=this.model;this.run({target_dataset_id:this.model.get("track").dataset.id,action:"rerun",tool_id:ac.id},null,function(ad){Galaxy.modal.show({title:ac.get("name")+" is Running",body:ac.get("name")+" is running on the complete dataset. Tool outputs are in dataset's history.",buttons:{Close:function(){Galaxy.modal.hide()}}})})},run_on_region:function(){var ad=this.model.get("track"),ag=this.model,ai=new w.GenomeRegion({chrom:ad.view.chrom,start:ad.view.low,end:ad.view.high}),aj={target_dataset_id:ad.dataset.id,action:"rerun",tool_id:ag.id,regions:[ai.toJSON()]},ah=ad,al=ag.get("name")+ah.tool_region_and_parameters_str(ai),ac;if(ah.container===view){var ak=new N(view,view,{name:ad.config.get_value("name")});var af=ah.container.replace_drawable(ah,ak,false);ak.container_div.insertBefore(ah.view.content_div.children()[af]);ak.add_drawable(ah);ah.container_div.appendTo(ak.content_div);ac=ak}else{ac=ah.container}var ae=new ah.constructor(view,ac,{name:al,hda_ldda:"hda"});ae.init_for_tool_data();ae.change_mode(ah.mode);ae.set_filters_manager(ah.filters_manager.copy(ae));ae.update_icons();ac.add_drawable(ae);ae.tiles_div.text("Starting job.");this.run(aj,ae,function(am){ae.set_dataset(new X.Dataset(am));ae.tiles_div.text("Running job.");ae.init()})},run:function(ac,ae,af){ac.inputs=this.model.get_inputs_dict();var ad=new j.ServerStateDeferred({ajax_settings:{url:galaxy_config.root+"api/tools",data:JSON.stringify(ac),dataType:"json",contentType:"application/json",type:"POST"},interval:2000,success_fn:function(ag){return ag!=="pending"}});$.when(ad.go()).then(function(ag){if(ag==="no converter"){ae.container_div.addClass("error");ae.content_div.text(H)}else{if(ag.error){ae.container_div.addClass("error");ae.content_div.text(x+ag.message)}else{af(ag)}}})}});var C=function(ac,ad){J.Scaler.call(this,ad);this.filter=ac};C.prototype.gen_val=function(ac){if(this.filter.high===Number.MAX_VALUE||this.filter.low===-Number.MAX_VALUE||this.filter.low===this.filter.high){return this.default_val}return((parseFloat(ac[this.filter.index])-this.filter.low)/(this.filter.high-this.filter.low))};var b=function(ac,af,ag,ad,ae){this.track=ac;this.region=af;this.low=af.get("start");this.high=af.get("end");this.w_scale=ag;this.canvas=ad;this.html_elt=$("<div class='track-tile'/>").append(ad);this.data=ae;this.stale=false};b.prototype.predisplay_actions=function(){};var K=function(ac,af,ag,ad,ae){b.call(this,ac,af,ag,ad,ae)};K.prototype.predisplay_actions=function(){};var M=function(ae,aj,al,ad,ag,ah,am,ac,ai,af,ak){b.call(this,ae,aj,al,ad,ag);this.mode=ah;this.all_slotted=ac;this.feature_mapper=ai;this.has_icons=false;this.incomplete_features=af;this.other_tiles_features_drawn={};this.seq_data=ak};o(M.prototype,b.prototype);M.prototype.predisplay_actions=function(){};var f=function(ad,ac,ae){o(ae,{drag_handle_class:"draghandle"});p.call(this,ad,ac,ae);this.dataset=null;if(ae.dataset){this.dataset=(ae.dataset instanceof Backbone.Model?ae.dataset:new X.Dataset(ae.dataset))}this.dataset_check_type="converted_datasets_state";this.data_url_extra_params={};this.data_query_wait=("data_query_wait" in ae?ae.data_query_wait:I);this.data_manager=("data_manager" in ae?ae.data_manager:new w.GenomeDataManager({dataset:this.dataset,genome:new w.Genome({key:ad.dbkey,chroms_info:{chrom_info:ad.chrom_data}}),data_mode_compatible:this.data_and_mode_compatible,can_subset:this.can_subset}));this.min_height_px=16;this.max_height_px=800;this.visible_height_px=this.config.get_value("height");this.content_div=$("<div class='track-content'>").appendTo(this.container_div);if(this.container){this.container.content_div.append(this.container_div);if(!("resize" in ae)||ae.resize){this.add_resize_handle()}}};o(f.prototype,p.prototype,{action_icons_def:[{name:"mode_icon",title:"Set display mode",css_class:"chevron-expand",on_click_fn:function(){}},p.prototype.action_icons_def[0],{name:"overview_icon",title:"Set as overview",css_class:"application-dock-270",on_click_fn:function(ac){ac.view.set_overview(ac)}},p.prototype.action_icons_def[1],{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters()}else{ac.filters_manager.init_filters()}ac.filters_manager.toggle()}},{name:"tools_icon",title:"Tool",css_class:"hammer",on_click_fn:function(ac){ac.tool.toggle();if(ac.tool.is_visible()){ac.set_name(ac.config.get_value("name")+ac.tool_region_and_parameters_str())}else{ac.revert_name()}$(".tooltip").remove()}},{name:"param_space_viz_icon",title:"Tool parameter space visualization",css_class:"arrow-split",on_click_fn:function(ac){var af='<strong>Tool</strong>: <%= track.tool.get("name") %><br/><strong>Dataset</strong>: <%= track.config.get_value("name") %><br/><strong>Region(s)</strong>: <select name="regions"><option value="cur">current viewing area</option><option value="bookmarks">bookmarks</option><option value="both">current viewing area and bookmarks</option></select>',ae=ab.template(af,{track:ac});var ah=function(){Galaxy.modal.hide();$(window).unbind("keypress.check_enter_esc")},ad=function(){var aj=$('select[name="regions"] option:selected').val(),al,ai=new w.GenomeRegion({chrom:view.chrom,start:view.low,end:view.high}),ak=ab.map($(".bookmark"),function(am){return new w.GenomeRegion({from_str:$(am).children(".position").text()})});if(aj==="cur"){al=[ai]}else{if(aj==="bookmarks"){al=ak}else{al=[ai].concat(ak)}}Galaxy.modal.hide();window.location.href=galaxy_config.root+"visualization/sweepster?"+$.param({dataset_id:ac.dataset.id,hda_ldda:ac.dataset.get("hda_ldda"),regions:JSON.stringify(new Backbone.Collection(al).toJSON())})},ag=function(ai){if((ai.keyCode||ai.which)===27){ah()}else{if((ai.keyCode||ai.which)===13){ad()}}};Galaxy.modal.show({title:"Visualize tool parameter space and output from different parameter settings?",body:ae,buttons:{No:ah,Yes:ad}})}},p.prototype.action_icons_def[2]],can_draw:function(){return this.dataset&&p.prototype.can_draw.call(this)},build_container_div:function(){return $("<div/>").addClass("track").attr("id","track_"+this.id)},set_dataset:function(ac){this.dataset=ac;this.data_manager.set("dataset",ac)},on_resize:function(){this.request_draw({clear_tile_cache:true})},add_resize_handle:function(){var ac=this;var af=false;var ae=false;var ad=$("<div class='track-resize'>");$(ac.container_div).hover(function(){if(ac.config.get_value("content_visible")){af=true;ad.show()}},function(){af=false;if(!ae){ad.hide()}});ad.hide().bind("dragstart",function(ag,ah){ae=true;ah.original_height=$(ac.content_div).height()}).bind("drag",function(ah,ai){var ag=Math.min(Math.max(ai.original_height+ai.deltaY,ac.min_height_px),ac.max_height_px);$(ac.tiles_div).css("height",ag);ac.visible_height_px=(ac.max_height_px===ag?0:ag);ac.on_resize()}).bind("dragend",function(ag,ah){ac.tile_cache.clear();ae=false;if(!af){ad.hide()}ac.config.set_value("height",ac.visible_height_px);ac.changed()}).appendTo(ac.container_div)},hide_contents:function(){this.tiles_div.hide();this.container_div.find(".yaxislabel, .track-resize").hide()},show_contents:function(){this.tiles_div.show();this.container_div.find(".yaxislabel, .track-resize").show();this.request_draw()},get_type:function(){if(this instanceof W){return"LabelTrack"}else{if(this instanceof B){return"ReferenceTrack"}else{if(this instanceof g){return"LineTrack"}else{if(this instanceof S){return"ReadTrack"}else{if(this instanceof Z){return"VariantTrack"}else{if(this instanceof e){return"CompositeTrack"}else{if(this instanceof c){return"FeatureTrack"}}}}}}}return""},show_message:function(ac){this.tiles_div.remove();return $("<span/>").addClass("message").html(ac).appendTo(this.content_div)},init:function(ae){var ad=this;ad.enabled=false;ad.tile_cache.clear();ad.data_manager.clear();ad.content_div.children().remove();ad.container_div.removeClass("nodata error pending");ad.tiles_div=$("<div/>").addClass("tiles").appendTo(ad.content_div);if(!ad.dataset.id){return}var ac=$.Deferred(),af={hda_ldda:ad.dataset.get("hda_ldda"),data_type:this.dataset_check_type,chrom:ad.view.chrom,retry:ae};$.getJSON(this.dataset.url(),af,function(ag){if(!ag||ag==="error"||ag.kind==="error"){ad.container_div.addClass("error");var ah=ad.show_message(m);if(ag.message){ah.append($("<a href='javascript:void(0);'></a>").text("View error").click(function(){Galaxy.modal.show({title:"Trackster Error",body:"<pre>"+ag.message+"</pre>",buttons:{Close:function(){Galaxy.modal.hide()}}})}));ah.append($("<span/>").text(" "));ah.append($("<a href='javascript:void(0);'></a>").text("Try again").click(function(){ad.init(true)}))}}else{if(ag==="no converter"){ad.container_div.addClass("error");ad.show_message(H)}else{if(ag==="no data"||(ag.data!==undefined&&(ag.data===null||ag.data.length===0))){ad.container_div.addClass("nodata");ad.show_message(E)}else{if(ag==="pending"){ad.container_div.addClass("pending");ad.show_message(u);setTimeout(function(){ad.init()},ad.data_query_wait)}else{if(ag==="data"||ag.status==="data"){if(ag.valid_chroms){ad.valid_chroms=ag.valid_chroms;ad.update_icons()}ad.tiles_div.text(T);if(ad.view.chrom){ad.tiles_div.text("");ad.tiles_div.css("height",ad.visible_height_px+"px");ad.enabled=true;$.when.apply($,ad.predraw_init()).done(function(){ac.resolve();ad.container_div.removeClass("nodata error pending");ad.request_draw()})}else{ac.resolve()}}}}}}});this.update_icons();return ac},predraw_init:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(af&&af.min&&af.max){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_default_value("min_value",ae);ac.config.set_default_value("max_value",ag);ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},get_drawables:function(){return this}});var L=function(ae,ad,ag){f.call(this,ae,ad,ag);var ac=this;k(ac.container_div,ac.drag_handle_class,".group",ac);this.filters_manager=new h.FiltersManager(this,("filters" in ag?ag.filters:null));this.data_manager.set("filters_manager",this.filters_manager);this.filters_available=false;this.tool=(ag.tool?new q(ab.extend(ag.tool,{track:this,tool_state:ag.tool_state})):null);this.tile_cache=new w.Cache(O);this.left_offset=0;if(this.header_div){this.set_filters_manager(this.filters_manager);if(this.tool){var af=new aa({model:this.tool});af.render();this.dynamic_tool_div=af.$el;this.header_div.after(this.dynamic_tool_div)}}this.tiles_div=$("<div/>").addClass("tiles").appendTo(this.content_div);if(!this.config.get_value("content_visible")){this.tiles_div.hide()}this.overlay_div=$("<div/>").addClass("overlay").appendTo(this.content_div);if(ag.mode){this.change_mode(ag.mode)}};o(L.prototype,p.prototype,f.prototype,{action_icons_def:f.prototype.action_icons_def.concat([{name:"show_more_rows_icon",title:"To minimize track height, not all feature rows are displayed. Click to display more rows.",css_class:"exclamation",on_click_fn:function(ac){$(".tooltip").remove();ac.slotters[ac.view.resolution_px_b].max_rows*=2;ac.request_draw({clear_tile_cache:true})},hide:true}]),copy:function(ac){var ad=this.to_dict();o(ad,{data_manager:this.data_manager});var ae=new this.constructor(this.view,ac,ad);ae.change_mode(this.mode);ae.enabled=this.enabled;return ae},set_filters_manager:function(ac){this.filters_manager=ac;this.header_div.after(this.filters_manager.parent_div)},to_dict:function(){return{track_type:this.get_type(),dataset:{id:this.dataset.id,hda_ldda:this.dataset.get("hda_ldda")},prefs:this.config.to_key_value_dict(),mode:this.mode,filters:this.filters_manager.to_dict(),tool_state:(this.tool?this.tool.state_dict():{})}},set_min_max:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(isNaN(parseFloat(ac.config.get_value("min_value")))||isNaN(parseFloat(ac.config.get_value("max_value")))){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},change_mode:function(ad){var ac=this;ac.mode=ad;ac.config.set_value("mode",ad);if(ad==="Auto"){this.data_manager.clear()}ac.request_draw({clear_tile_cache:true});this.action_icons.mode_icon.attr("title","Set display mode (now: "+ac.mode+")");return ac},update_icons:function(){var ac=this;ac.action_icons.filters_icon.toggle(ac.filters_available);ac.action_icons.tools_icon.toggle(ac.tool!==null);ac.action_icons.param_space_viz_icon.toggle(ac.tool!==null)},_gen_tile_cache_key:function(ad,ac){return ad+"_"+ac},request_draw:function(ac){if(ac&&ac.clear_tile_cache){this.tile_cache.clear()}this.view.request_redraw(ac,this)},before_draw:function(){this.max_height_px=0},_draw:function(aq){if(!this.can_draw()){return}var an=aq&&aq.clear_after,al=this.view.low,ag=this.view.high,aj=ag-al,ad=this.view.container.width(),ap=this.view.resolution_px_b,af=1/ap;if(this.is_overview){al=this.view.max_low;ag=this.view.max_high;ap=ad/(view.max_high-view.max_low);af=1/ap}this.before_draw();this.tiles_div.children().addClass("remove");var ac=Math.floor(al/(af*Q)),ak=Math.floor(ac*Q*af),am,ah,ai=[],ao=[];while((ac*Q*af)<ag){am=new w.GenomeRegion({chrom:this.view.chrom,start:ak,end:Math.min(ak+Math.ceil(Q*af),this.view.max_high)});ah=this.draw_helper(am,ap,aq);ai.push(ah);$.when(ah).then(function(ar){ao.push(ar)});ac+=1;ak=am.get("end")}if(!an){this.tiles_div.children(".remove").removeClass("remove").remove()}var ae=this;$.when.apply($,ai).then(function(){ae.tiles_div.children(".remove").remove();ao=ab.filter(ao,function(ar){return ar!==null});if(ao.length!==0){ae.postdraw_actions(ao,ad,ap,an)}})},_add_yaxis_label:function(af,ah){var ad=this,ag=(af==="max"?"top":"bottom"),ai=(af==="max"?"max":"min"),ac=(af==="max"?"max_value":"min_value"),ae=this.container_div.find(".yaxislabel."+ag);ah=ah||function(){ad.request_draw({clear_tile_cache:true})};if(ae.length!==0){ae.text(ad.config.get_value(ac))}else{ae=$("<div/>").text(ad.config.get_value(ac)).make_text_editable({num_cols:12,on_finish:function(aj){$(".tooltip").remove();ad.config.set_value(ac,aj);ah()},help_text:"Set "+ai+" value"}).addClass("yaxislabel "+ag).css("color",this.config.get_value("label_color"));this.container_div.prepend(ae)}},postdraw_actions:function(af,ag,ai,ac){var ae=ab.filter(af,function(aj){return(aj instanceof K)});if(ae.length>0){this.max_height_px=0;var ad=this;ab.each(af,function(aj){if(!(aj instanceof K)){aj.html_elt.remove();ad.draw_helper(aj.region,ai,{force:true,mode:"Coverage"})}});ad._add_yaxis_label("max")}else{this.container_div.find(".yaxislabel").remove();var ah=ab.find(af,function(aj){return aj.has_icons});if(ah){ab.each(af,function(aj){if(!aj.has_icons){aj.html_elt.css("padding-top",D)}})}}},get_mode:function(ac){return this.mode},update_auto_mode:function(ac){},_get_drawables:function(){return[this]},draw_helper:function(al,an,ao){if(!ao){ao={}}var ad=ao.force,ai=ao.mode||this.mode,af=1/an,ae=this,ag=this._get_drawables(),am=this._gen_tile_cache_key(an,al),ah=function(ap){return(ap&&"track" in ap)};var aj=(ad?undefined:ae.tile_cache.get_elt(am));if(aj){if(ah(aj)){ae.show_tile(aj,an)}return aj}if(ao.data_fetch===false){return null}var ak=function(){var ap=(ab.find(A,function(ar){return ar===ai})?"Coverage":ai);var aq=ab.map(ag,function(ar){return ar.data_manager.get_data(al,ap,af,ae.data_url_extra_params)});if(view.reference_track){aq.push(view.reference_track.data_manager.get_data(al,ai,af,view.reference_track.data_url_extra_params))}return aq};var ac=$.Deferred();ae.tile_cache.set_elt(am,ac);$.when.apply($,ak()).then(function(){var ap=ak(),av=ap,aB;if(ab.find(ap,function(aD){return j.is_deferred(aD)})){ae.tile_cache.set_elt(am,undefined);$.when(ae.draw_helper(al,an,ao)).then(function(aD){ac.resolve(aD)});return}if(view.reference_track){aB=view.reference_track.data_manager.subset_entry(ap.pop(),al)}var aw=[],at=[];ab.each(ag,function(aG,aD){var aF=aG.mode,aE=av[aD];if(aF==="Auto"){aF=aG.get_mode(aE);aG.update_auto_mode(aF)}aw.push(aF);at.push(aG.get_canvas_height(aE,aF,an,aq))});var au=ae.view.canvas_manager.new_canvas(),ax=al.get("start"),aC=al.get("end"),ar=0,aq=Math.ceil((aC-ax)*an)+ae.left_offset,az=ab.max(at),ay;au.width=aq;au.height=(ao.height||az);var aA=au.getContext("2d");aA.translate(ae.left_offset,0);if(ag.length>1){aA.globalAlpha=0.5;aA.globalCompositeOperation="source-over"}ab.each(ag,function(aE,aD){ay=aE.draw_tile(av[aD],aA,aw[aD],al,an,aB)});if(ay!==undefined){ae.tile_cache.set_elt(am,ay);ae.show_tile(ay,an)}ac.resolve(ay)});return ac},get_canvas_height:function(ac,ae,af,ad){return this.visible_height_px},_draw_line_track_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.LinePainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new K(this,ag,ai,af,ac.data)},draw_tile:function(ac,ad,ag,af,ah,ae){},show_tile:function(ae,ah){var ad=this,ac=ae.html_elt;ae.predisplay_actions();var ag=Math.round((ae.low-(this.is_overview?this.view.max_low:this.view.low))*ah);if(this.left_offset){ag-=this.left_offset}ac.css("left",ag);if(ac.hasClass("remove")){ac.removeClass("remove")}else{this.tiles_div.append(ac)}ac.css("height","auto");this.max_height_px=Math.max(this.max_height_px,ac.height()-2);ac.parent().children().css("height",this.max_height_px+"px");var af=this.max_height_px;if(this.visible_height_px!==0){af=Math.min(this.max_height_px,this.visible_height_px)}this.tiles_div.css("height",af+"px")},tool_region_and_parameters_str:function(af){var ac=this,ae=(af!==undefined?af.toString():"all"),ad=ab.values(ac.tool.get_inputs_dict()).join(", ");return" - region=["+ae+"], parameters=["+ad+"]"},data_and_mode_compatible:function(ac,ad){if(ad==="Auto"){return true}else{if(ad==="Coverage"){return ac.dataset_type==="bigwig"}else{if(ac.dataset_type==="bigwig"||ac.extra_info==="no_detail"){return false}else{return true}}}},can_subset:function(ac){if(ac.message||ac.extra_info==="no_detail"){return false}else{if(ac.dataset_type==="bigwig"){return(ac.data[1][0]-ac.data[0][0]===1)}}return true},init_for_tool_data:function(){this.data_manager.set("data_type","raw_data");this.data_query_wait=1000;this.dataset_check_type="state"}});var W=function(ad,ac){f.call(this,ad,ac,{resize:false,header:false});this.container_div.addClass("label-track")};o(W.prototype,f.prototype,{init:function(){this.enabled=true},predraw_init:function(){},_draw:function(ag){var ae=this.view,af=ae.high-ae.low,aj=Math.floor(Math.pow(10,Math.floor(Math.log(af)/Math.log(10)))),ac=Math.floor(ae.low/aj)*aj,ah=this.view.container.width(),ad=$("<div/>").addClass("label-container");while(ac<ae.high){var ai=(ac-ae.low)/af*ah;ad.append($("<div/>").addClass("label").text(commatize(ac)).css({left:ai}));ac+=aj}this.content_div.children(":first").remove();this.content_div.append(ad)}});var e=function(ad,ac,ag){L.call(this,ad,ac,ag);this.drawables=[];if("drawables" in ag){var af;for(var ae=0;ae<ag.drawables.length;ae++){af=ag.drawables[ae];this.drawables[ae]=n(af,ad,null);if(af.left_offset>this.left_offset){this.left_offset=af.left_offset}}this.enabled=true}ab.each(this.drawables,function(ah){if(ah instanceof c||ah instanceof S){ah.change_mode("Coverage")}});this.update_icons();this.obj_type="CompositeTrack"};o(e.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),action_icons_def:[{name:"composite_icon",title:"Show individual tracks",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_group()}}].concat(L.prototype.action_icons_def),to_dict:y.prototype.to_dict,add_drawable:y.prototype.add_drawable,unpack_drawables:y.prototype.unpack_drawables,config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},on_resize:function(){var ac=this.visible_height_px;ab.each(this.drawables,function(ad){ad.visible_height_px=ac});f.prototype.on_resize.call(this)},change_mode:function(ac){L.prototype.change_mode.call(this,ac);for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad].change_mode(ac)}},init:function(){var ae=[];for(var ad=0;ad<this.drawables.length;ad++){ae.push(this.drawables[ad].init())}var ac=this;$.when.apply($,ae).then(function(){ac.enabled=true;ac.request_draw()})},update_icons:function(){this.action_icons.filters_icon.hide();this.action_icons.tools_icon.hide();this.action_icons.param_space_viz_icon.hide()},can_draw:p.prototype.can_draw,_get_drawables:function(){return this.drawables},show_group:function(){var af=new N(this.view,this.container,{name:this.config.get_value("name")}),ac;for(var ae=0;ae<this.drawables.length;ae++){ac=this.drawables[ae];ac.update_icons();af.add_drawable(ac);ac.container=af;af.content_div.append(ac.container_div)}var ad=this.container.replace_drawable(this,af,true);af.request_draw({clear_tile_cache:true})},before_draw:function(){var ad=ab.min(ab.map(this.drawables,function(ae){return ae.config.get_value("min_value")})),ac=ab.max(ab.map(this.drawables,function(ae){return ae.config.get_value("max_value")}));this.config.set_value("min_value",ad);this.config.set_value("max_value",ac);ab.each(this.drawables,function(ae){ae.config.set_value("min_value",ad);ae.config.set_value("max_value",ac)})},update_all_min_max:function(){var ad=this,ac=this.config.get_value("min_value"),ae=this.config.get_value("max_value");ab.each(this.drawables,function(af){af.config.set_value("min_value",ac);af.config.set_value("max_value",ae)});this.request_draw({clear_tile_cache:true})},postdraw_actions:function(ai,ac,al,ah){var ag=-1,ae;for(ae=0;ae<ai.length;ae++){var aj=ai[ae].html_elt.find("canvas").height();if(aj>ag){ag=aj}}for(ae=0;ae<ai.length;ae++){var af=ai[ae];if(af.html_elt.find("canvas").height()!==ag){this.draw_helper(af.region,al,{force:true,height:ag});af.html_elt.remove()}}var ad=this,ak=function(){ad.update_all_min_max()};this._add_yaxis_label("min",ak);this._add_yaxis_label("max",ak)}});var B=function(ac){L.call(this,ac,{content_div:ac.top_labeltrack},{resize:false,header:false});this.left_offset=ac.canvas_manager.char_width_px;this.container_div.addClass("reference-track");this.data_url=galaxy_config.root+"api/genomes/"+this.view.dbkey;this.data_url_extra_params={reference:true};this.data_manager=new w.GenomeReferenceDataManager({data_url:this.data_url,can_subset:this.can_subset});this.hide_contents()};o(B.prototype,p.prototype,L.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"height",type:"int",default_value:13,hidden:true}]),init:function(){this.data_manager.clear();this.enabled=true},predraw_init:function(){},can_draw:p.prototype.can_draw,draw_helper:function(af,ah,ad){var ac=this.tiles_div.is(":visible"),ag,ae=null;if(ah>this.view.canvas_manager.char_width_px){this.tiles_div.show();ag=true;ae=L.prototype.draw_helper.call(this,af,ah,ad)}else{ag=false;this.tiles_div.hide()}if(ac!==ag){this.view.resize_viewport()}return ae},can_subset:function(ac){return true},draw_tile:function(ae,ak,af,ah,al){var ad=this.data_manager.subset_entry(ae,ah),aj=ad.data;var ac=ak.canvas;ak.font=ak.canvas.manager.default_font;ak.textAlign="center";for(var ag=0,ai=aj.length;ag<ai;ag++){ak.fillStyle=this.view.get_base_color(aj[ag]);ak.fillText(aj[ag],Math.floor(ag*al),10)}return new b(this,ah,al,ac,ad)}});var g=function(ad,ac,ae){this.mode="Histogram";L.call(this,ad,ac,ae)};o(g.prototype,p.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Color",type:"color"},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},before_draw:function(){},draw_tile:function(ac,ad,af,ae,ag){return this._draw_line_track_tile(ac,ad,af,ae,ag)},can_subset:function(ac){return(ac.data[1][0]-ac.data[0][0]===1)},postdraw_actions:function(ad,ae,af,ac){this._add_yaxis_label("max");this._add_yaxis_label("min")}});var r=function(ad,ac,ae){this.mode="Heatmap";L.call(this,ad,ac,ae)};o(r.prototype,p.prototype,L.prototype,{display_modes:["Heatmap"],config_params:ab.union(p.prototype.config_params,[{key:"pos_color",label:"Positive Color",type:"color",default_value:"#FF8C00"},{key:"neg_color",label:"Negative Color",type:"color",default_value:"#4169E1"},{key:"min_value",label:"Min Value",type:"float",default_value:-1},{key:"max_value",label:"Max Value",type:"float",default_value:1},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:500,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.DiagonalHeatmapPainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new b(this,ag,ai,af,ac.data)}});var c=function(ad,ac,ae){L.call(this,ad,ac,ae);this.container_div.addClass("feature-track");this.summary_draw_height=30;this.slotters={};this.start_end_dct={};this.left_offset=200;this.set_painter_from_config()};o(c.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Block color",type:"color"},{key:"reverse_strand_color",label:"Antisense strand color",type:"color"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true,help:"Show the number of items in each bin when drawing summary histogram"},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"connector_style",label:"Connector style",type:"select",default_value:"fishbones",options:[{label:"Line with arrows",value:"fishbone"},{label:"Arcs",value:"arcs"}]},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.set_painter_from_config();this.request_draw({clear_tile_cache:true})},set_painter_from_config:function(){if(this.config.get_value("connector_style")==="arcs"){this.painter=J.ArcLinkedFeaturePainter}else{this.painter=J.LinkedFeaturePainter}},postdraw_actions:function(ao,af,aq,an){L.prototype.postdraw_actions.call(this,ao,af,aq,an);var ah=this,ai,am=ab.filter(ao,function(ar){return(ar instanceof K)});if(am.length===0){var ac={};ab.each(ab.pluck(ao,"incomplete_features"),function(ar){ab.each(ar,function(at){ac[at[0]]=at})});var ap=this;ab.each(ao,function(av){var aw=ab.omit(ac,ab.map(av.incomplete_features,function(ay){return ay[0]}));aw=ab.omit(aw,ab.keys(av.other_tiles_features_drawn));if(ab.size(aw)!==0){var at={data:ab.values(aw)},au=ap.view.canvas_manager.new_canvas(),ar=au.getContext("2d");au.height=Math.max(av.canvas.height,ap.get_canvas_height(at,av.mode,av.w_scale,100));au.width=av.canvas.width;ar.drawImage(av.canvas,0,0);ar.translate(ah.left_offset,0);var ax=ap.draw_tile(at,ar,av.mode,av.region,av.w_scale,av.seq_data);$(av.canvas).replaceWith($(ax.canvas));av.canvas=au;ab.extend(av.other_tiles_features_drawn,ac)}})}if(ah.filters_manager){var ag=ah.filters_manager.filters,ak;for(ak=0;ak<ag.length;ak++){ag[ak].update_ui_elt()}var aj=false,al,ae;for(ai=0;ai<ao.length;ai++){if(ao[ai].data.length){al=ao[ai].data[0];for(ak=0;ak<ag.length;ak++){ae=ag[ak];if(ae.applies_to(al)&&ae.min!==ae.max){aj=true;break}}}}if(ah.filters_available!==aj){ah.filters_available=aj;if(!ah.filters_available){ah.filters_manager.hide()}ah.update_icons()}}if(ao[0] instanceof M){var ad=true;for(ai=0;ai<ao.length;ai++){if(!ao[ai].all_slotted){ad=false;break}}this.action_icons.show_more_rows_icon.toggle(!ad)}else{this.action_icons.show_more_rows_icon.hide()}},update_auto_mode:function(ac){if(this.mode==="Auto"){if(ac==="no_detail"){ac="feature spans"}this.action_icons.mode_icon.attr("title","Set display mode (now: Auto/"+ac+")")}},incremental_slots:function(ag,ac,af){var ad=this.view.canvas_manager.dummy_context,ae=this.slotters[ag];if(!ae||(ae.mode!==af)){ae=new (s.FeatureSlotter)(ag,af,z,function(ah){return ad.measureText(ah)});this.slotters[ag]=ae}return ae.slot_features(ac)},get_mode:function(ac){if(ac.extra_info==="no_detail"||this.is_overview){mode="no_detail"}else{if(this.view.high-this.view.low>G){mode="Squish"}else{mode="Pack"}}return mode},get_canvas_height:function(ac,ag,ah,ad){if(ag==="Coverage"||ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var af=this.incremental_slots(ah,ac.data,ag);var ae=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return Math.max(this.min_height_px,ae.get_required_height(af,ad))}},draw_tile:function(an,at,aq,ag,ak,af,ao){var ar=this,ae=at.canvas,az=ag.get("start"),ad=ag.get("end"),ah=this.left_offset;if(an.dataset_type==="bigwig"){return this._draw_line_track_tile(an,at,aq,ag,ak)}var aj=[],ap=this.slotters[ak].slots;all_slotted=true;if(an.data){var al=this.filters_manager.filters;for(var au=0,aw=an.data.length;au<aw;au++){var ai=an.data[au];var av=false;var am;for(var ay=0,aD=al.length;ay<aD;ay++){am=al[ay];am.update_attrs(ai);if(!am.keep(ai)){av=true;break}}if(!av){aj.push(ai);if(!(ai[0] in ap)){all_slotted=false}}}}var aC=(this.filters_manager.alpha_filter?new C(this.filters_manager.alpha_filter):null),aA=(this.filters_manager.height_filter?new C(this.filters_manager.height_filter):null),aB=new (this.painter)(aj,az,ad,this.config.to_key_value_dict(),aq,aC,aA,af,function(aE){return ar.view.get_base_color(aE)});var ax=null;at.fillStyle=this.config.get_value("block_color");at.font=at.canvas.manager.default_font;at.textAlign="right";if(an.data){var ac=aB.draw(at,ae.width,ae.height,ak,ap);ax=ac.feature_mapper;incomplete_features=ac.incomplete_features;ax.translation=-ah}if(!ao){return new M(ar,ag,ak,ae,an.data,aq,an.message,all_slotted,ax,incomplete_features,af)}}});var Z=function(ad,ac,ae){L.call(this,ad,ac,ae);this.painter=J.VariantPainter;this.summary_draw_height=30;this.left_offset=30};o(Z.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Histogram color",type:"color"},{key:"show_sample_data",label:"Show sample data",type:"bool",default_value:true},{key:"show_labels",label:"Show summary and sample labels",type:"bool",default_value:true},{key:"summary_height",label:"Locus summary height",type:"float",default_value:20},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,af,ah,ag,ai){if(ac.dataset_type==="bigwig"){return this._draw_line_track_tile(ac,af,"Histogram",ag,ai)}else{var ae=this.view,ad=new (this.painter)(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah,function(aj){return ae.get_base_color(aj)});ad.draw(af,af.canvas.width,af.canvas.height,ai);return new b(this,ag,ai,af.canvas,ac.data)}},get_canvas_height:function(ac,ag,ah,ae){if(ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var ad=(this.dataset.get_metadata("sample_names")?this.dataset.get_metadata("sample_names").length:0);if(ad===0&&ac.data.length!==0){ad=ac.data[0][7].match(/,/g);if(ad===null){ad=1}else{ad=ad.length+1}}var af=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return af.get_required_height(ad)}},predraw_init:function(){var ac=[f.prototype.predraw_init.call(this)];if(!this.dataset.get_metadata("sample_names")){ac.push(this.dataset.fetch())}return ac},postdraw_actions:function(ag,ah,aj,ad){L.prototype.postdraw_actions.call(this,ag,ah,aj,ad);var af=ab.filter(ag,function(ak){return(ak instanceof K)});var ae=this.dataset.get_metadata("sample_names");if(af.length===0&&this.config.get_value("show_labels")&&ae&&ae.length>1){var ac;if(this.container_div.find(".yaxislabel.variant").length===0){ac=this.config.get_value("summary_height")/2;this.tiles_div.prepend($("<div/>").text("Summary").addClass("yaxislabel variant top").css({"font-size":ac+"px",top:(this.config.get_value("summary_height")-ac)/2+"px"}));if(this.config.get_value("show_sample_data")){var ai=ae.join("<br/>");this.tiles_div.prepend($("<div/>").html(ai).addClass("yaxislabel variant top sample").css({top:this.config.get_value("summary_height")}))}}ac=(this.mode==="Squish"?5:10)+"px";$(this.tiles_div).find(".sample").css({"font-size":ac,"line-height":ac});$(this.tiles_div).find(".yaxislabel").css("color",this.config.get_value("label_color"))}else{this.container_div.find(".yaxislabel.variant").remove()}}});var S=function(ad,ac,ae){c.call(this,ad,ac,ae);this.painter=J.ReadPainter;this.update_icons()};o(S.prototype,p.prototype,L.prototype,c.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Histogram color",type:"color"},{key:"detail_block_color",label:"Sense strand block color",type:"color",default_value:"#AAAAAA"},{key:"reverse_strand_color",label:"Antisense strand block color",type:"color",default_value:"#DDDDDD"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})}});var d={CompositeTrack:e,DrawableGroup:N,DiagonalHeatmapTrack:r,FeatureTrack:c,LineTrack:g,ReadTrack:S,VariantTrack:Z,VcfTrack:Z};var n=function(ae,ad,ac){if("copy" in ae){return ae.copy(ac)}else{var af=ae.obj_type;if(!af){af=ae.track_type}return new d[af](ad,ac,ae)}};return{TracksterView:Y,DrawableGroup:N,LineTrack:g,FeatureTrack:c,DiagonalHeatmapTrack:r,ReadTrack:S,VariantTrack:Z,CompositeTrack:e,object_from_template:n}});
\ No newline at end of file
+define(["libs/underscore","viz/visualization","viz/viz_views","viz/trackster/util","viz/trackster/slotting","viz/trackster/painters","viz/trackster/filters","mvc/data","mvc/tools","utils/config"],function(ab,w,V,j,s,J,h,X,P,R){var o=ab.extend;var l={};var i=function(ac,ad){l[ac.attr("id")]=ad};var k=function(ac,ad,af,ae){af=".group";l[ac.attr("id")]=ae;ac.bind("drag",{handle:"."+ad,relative:true},function(an,ao){var am=$(this),ar=$(this).parent(),aj=ar.children(".track,.group"),al=l[$(this).attr("id")],ai,ah,ap,ag,ak;ah=$(this).parents(af);if(ah.length!==0){ap=ah.position().top;ag=ap+ah.outerHeight();var aq=l[ah.attr("id")];if(ao.offsetY<ap){$(this).insertBefore(ah);aq.remove_drawable(al);aq.container.add_drawable_before(al,aq);return}else{if(ao.offsetY>ag){$(this).insertAfter(ah);aq.remove_drawable(al);aq.container.add_drawable(al);return}}}ah=null;for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));ap=ai.position().top;ag=ap+ai.outerHeight();if(ai.is(af)&&this!==ai.get(0)&&ao.offsetY>=ap&&ao.offsetY<=ag){if(ao.offsetY-ap<ag-ao.offsetY){ai.find(".content-div").prepend(this)}else{ai.find(".content-div").append(this)}if(al.container){al.container.remove_drawable(al)}l[ai.attr("id")].add_drawable(al);return}}for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));if(ao.offsetY<ai.position().top&&!(ai.hasClass("reference-track")||ai.hasClass("intro"))){break}}if(ak===aj.length){if(this!==aj.get(ak-1)){ar.append(this);l[ar.attr("id")].move_drawable(al,ak)}}else{if(this!==aj.get(ak)){$(this).insertBefore(aj.get(ak));l[ar.attr("id")].move_drawable(al,(ao.deltaY>0?ak-1:ak))}}}).bind("dragstart",function(){$(this).addClass("dragging")}).bind("dragend",function(){$(this).removeClass("dragging")})};var D=20,z=100,G=12000,Q=400,I=5000,v=100,m="Cannot display dataset due to an error. ",H="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",E="No data for this chrom/contig.",u="Preparing data. This can take a while for a large dataset. If the visualization is saved and closed, preparation will continue in the background.",x="Tool cannot be rerun: ",a="Loading data...",T="Ready for display",O=10,F=20,A=["Histogram","Line","Filled","Intensity"];function U(ad,ac){if(!ac){ac=0}var ae=Math.pow(10,ac);return Math.round(ad*ae)/ae}var p=function(ad,ac,ag){if(!p.id_counter){p.id_counter=0}this.id=p.id_counter++;this.view=ad;this.container=ac;this.drag_handle_class=ag.drag_handle_class;this.is_overview=false;this.action_icons={};this.config=R.ConfigSettingCollection.from_models_and_saved_values(this.config_params,ag.prefs);if(!this.config.get_value("name")){this.config.set_value("name",ag.name)}if(this.config_onchange){this.config.on("change",this.config_onchange,this)}this.container_div=this.build_container_div();this.header_div=null;if(ag.header!==false){var ae=new V.TrackHeaderView({model:this,id:this.id});this.header_div=ae.$el;this.container_div.append(this.header_div);var af=ae.icons_div;this.action_icons=ae.action_icons;this.container_div.hover(function(){af.show()},function(){af.hide()})}};p.prototype.action_icons_def=[{name:"toggle_icon",title:"Hide/show content",css_class:"toggle",on_click_fn:function(ac){if(ac.config.get_value("content_visible")){ac.action_icons.toggle_icon.addClass("toggle-expand").removeClass("toggle");ac.hide_contents();ac.config.set_value("content_visible",false)}else{ac.action_icons.toggle_icon.addClass("toggle").removeClass("toggle-expand");ac.config.set_value("content_visible",true);ac.show_contents()}}},{name:"settings_icon",title:"Edit settings",css_class:"gear",on_click_fn:function(ad){var ac=new R.ConfigSettingCollectionView({collection:ad.config});ac.render_in_modal("Configure Track")}},{name:"remove_icon",title:"Remove",css_class:"remove-icon",on_click_fn:function(ac){$(".tooltip").remove();ac.remove()}}];o(p.prototype,{config_params:[{key:"name",label:"Name",type:"text",default_value:""},{key:"content_visible",type:"bool",default_value:true,hidden:true}],config_onchange:function(){},init:function(){},changed:function(){this.view.changed()},can_draw:function(){if(this.enabled&&this.config.get_value("content_visible")){return true}return false},request_draw:function(){},_draw:function(ac){},to_dict:function(){},set_name:function(ac){this.old_name=this.config.get_value("name");this.config.set_value("name",ac)},revert_name:function(){if(this.old_name){this.config.set_value("name",this.old_name)}},remove:function(){this.changed();this.container.remove_drawable(this);var ac=this.view;this.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})},build_container_div:function(){},update_icons:function(){},hide_contents:function(){},show_contents:function(){},get_drawables:function(){}});var y=function(ad,ac,ae){p.call(this,ad,ac,ae);this.obj_type=ae.obj_type;this.drawables=[]};o(y.prototype,p.prototype,{unpack_drawables:function(ae){this.drawables=[];var ad;for(var ac=0;ac<ae.length;ac++){ad=n(ae[ac],this.view,this);this.add_drawable(ad)}},init:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].init()}},_draw:function(ac){for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad]._draw(ac)}},to_dict:function(){var ad=[];for(var ac=0;ac<this.drawables.length;ac++){ad.push(this.drawables[ac].to_dict())}return{prefs:this.config.to_key_value_dict(),obj_type:this.obj_type,drawables:ad}},add_drawable:function(ac){this.drawables.push(ac);ac.container=this;this.changed()},add_drawable_before:function(ae,ac){this.changed();var ad=this.drawables.indexOf(ac);if(ad!==-1){this.drawables.splice(ad,0,ae);return true}return false},replace_drawable:function(ae,ac,ad){var af=this.drawables.indexOf(ae);if(af!==-1){this.drawables[af]=ac;if(ad){ae.container_div.replaceWith(ac.container_div)}this.changed()}return af},remove_drawable:function(ad){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);ad.container=null;this.changed();return true}return false},move_drawable:function(ad,ae){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);this.drawables.splice(ae,0,ad);this.changed();return true}return false},get_drawables:function(){return this.drawables},get_tracks:function(af){var ac=this.drawables.slice(0),ad=[],ae;while(ac.length!==0){ae=ac.shift();if(ae instanceof af){ad.push(ae)}else{if(ae.drawables){ac=ac.concat(ae.drawables)}}}return ad}});var N=function(ad,ac,af){o(af,{obj_type:"DrawableGroup",drag_handle_class:"group-handle"});y.call(this,ad,ac,af);this.content_div=$("<div/>").addClass("content-div").attr("id","group_"+this.id+"_content_div").appendTo(this.container_div);i(this.container_div,this);i(this.content_div,this);k(this.container_div,this.drag_handle_class,".group",this);this.filters_manager=new h.FiltersManager(this);this.header_div.after(this.filters_manager.parent_div);this.filters_manager.parent_div.after($("<div style='clear: both'/>"));this.saved_filters_managers=[];if("drawables" in af){this.unpack_drawables(af.drawables)}if("filters" in af){var ae=this.filters_manager;this.filters_manager=new h.FiltersManager(this,af.filters);ae.parent_div.replaceWith(this.filters_manager.parent_div);if(af.filters.visible){this.setup_multitrack_filtering()}}};o(N.prototype,p.prototype,y.prototype,{action_icons_def:[p.prototype.action_icons_def[0],p.prototype.action_icons_def[1],{name:"composite_icon",title:"Show composite track",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_composite_track()}},{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters();ac._restore_filter_managers()}else{ac.setup_multitrack_filtering();ac.request_draw({clear_tile_cache:true})}ac.filters_manager.toggle()}},p.prototype.action_icons_def[2]],build_container_div:function(){var ac=$("<div/>").addClass("group").attr("id","group_"+this.id);if(this.container){this.container.content_div.append(ac)}return ac},hide_contents:function(){this.tiles_div.hide()},show_contents:function(){this.tiles_div.show();this.request_draw()},update_icons:function(){var ae=this.drawables.length;if(ae===0){this.action_icons.composite_icon.hide();this.action_icons.filters_icon.hide()}else{if(ae===1){this.action_icons.composite_icon.toggle(this.drawables[0] instanceof e);this.action_icons.filters_icon.hide()}else{var al,ak,ai,ao=true,ag=this.drawables[0].get_type(),ac=0;for(al=0;al<ae;al++){ai=this.drawables[al];if(ai.get_type()!==ag){can_composite=false;break}if(ai instanceof c){ac++}}if(ao&&this.drawables[0] instanceof g){this.action_icons.composite_icon.show()}else{this.action_icons.composite_icon.hide();$(".tooltip").remove()}if(ac>1&&ac===this.drawables.length){var ap={},ad;ai=this.drawables[0];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];ap[ad.name]=[ad]}for(al=1;al<this.drawables.length;al++){ai=this.drawables[al];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];if(ad.name in ap){ap[ad.name].push(ad)}}}this.filters_manager.remove_all();var af,ah,aj,am;for(var an in ap){af=ap[an];if(af.length===ac){ah=new h.NumberFilter({name:af[0].name,index:af[0].index});this.filters_manager.add_filter(ah)}}this.action_icons.filters_icon.toggle(this.filters_manager.filters.length>0)}else{this.action_icons.filters_icon.hide()}}}},_restore_filter_managers:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].filters_manager=this.saved_filters_managers[ac]}this.saved_filters_managers=[]},setup_multitrack_filtering:function(){if(this.filters_manager.filters.length>0){this.saved_filters_managers=[];for(var ac=0;ac<this.drawables.length;ac++){drawable=this.drawables[ac];this.saved_filters_managers.push(drawable.filters_manager);drawable.filters_manager=this.filters_manager}}this.filters_manager.init_filters()},show_composite_track:function(){var ad=new e(this.view,this.view,{name:this.config.get_value("name"),drawables:this.drawables});var ac=this.container.replace_drawable(this,ad,true);ad.request_draw()},add_drawable:function(ac){y.prototype.add_drawable.call(this,ac);this.update_icons()},remove_drawable:function(ac){y.prototype.remove_drawable.call(this,ac);this.update_icons()},to_dict:function(){if(this.filters_manager.visible()){this._restore_filter_managers()}var ac=o(y.prototype.to_dict.call(this),{filters:this.filters_manager.to_dict()});if(this.filters_manager.visible()){this.setup_multitrack_filtering()}return ac},request_draw:function(ac){ab.each(this.drawables,function(ad){ad.request_draw(ac)})}});var Y=Backbone.View.extend({initialize:function(ac){o(ac,{obj_type:"View"});y.call(this,"View",ac.container,ac);this.chrom=null;this.vis_id=ac.vis_id;this.dbkey=ac.dbkey;this.label_tracks=[];this.tracks_to_be_redrawn=[];this.max_low=0;this.max_high=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.load_chroms_deferred=null;this.render();this.canvas_manager=new w.CanvasManager(this.container.get(0).ownerDocument);this.reset();this.config=R.ConfigSettingCollection.from_models_and_saved_values([{key:"name",label:"Name",type:"text",default_value:""},{key:"a_color",label:"A Color",type:"color",default_value:"#FF0000"},{key:"c_color",label:"C Color",type:"color",default_value:"#00FF00"},{key:"g_color",label:"G Color",type:"color",default_value:"#0000FF"},{key:"t_color",label:"T Color",type:"color",default_value:"#FF00FF"},{key:"n_color",label:"N Color",type:"color",default_value:"#AAAAAA"}],{name:ac.name})},render:function(){this.requested_redraw=false;var ae=this.container,ac=this;this.top_container=$("<div/>").addClass("top-container").appendTo(ae);this.browser_content_div=$("<div/>").addClass("content").appendTo(ae);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(ae);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").attr("id","viewport-container").appendTo(this.browser_content_div);this.content_div=this.viewport_container;i(this.viewport_container,ac);this.intro_div=$("<div/>").addClass("intro").appendTo(this.viewport_container);var af=$("<div/>").text("Add Datasets to Visualization").addClass("action-button").appendTo(this.intro_div).click(function(){w.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",{"f-dbkey":ac.dbkey},function(ag){ab.each(ag,function(ah){ac.add_drawable(n(ah,ac,ac))})})});this.nav_container=$("<div/>").addClass("trackster-nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("trackster-nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a/>").attr("title","Close overview").addClass("icon-button overview-close tooltip").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_select=$("<select/>").attr({name:"chrom"}).addClass("chrom-nav").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var ad=function(ag){if(ag.type==="focusout"||(ag.keyCode||ag.which)===13||(ag.keyCode||ag.which)===27){if((ag.keyCode||ag.which)!==27){ac.go_to($(this).val())}$(this).hide();$(this).val("");ac.location_span.show();ac.chrom_select.show()}ag.stopPropagation()};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",ad).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").attr("title","Click to change location").tooltip({placement:"bottom"}).appendTo(this.nav_controls);this.location_span.click(function(){ac.location_span.hide();ac.chrom_select.hide();ac.nav_input.val(ac.chrom+":"+ac.low+"-"+ac.high);ac.nav_input.css("display","inline-block");ac.nav_input.select();ac.nav_input.focus();ac.nav_input.autocomplete({source:function(ai,ag){var aj=[],ah=$.map(ac.get_tracks(c),function(ak){return ak.data_manager.search_features(ai.term).success(function(al){aj=aj.concat(al)})});$.when.apply($,ah).done(function(){ag($.map(aj,function(ak){return{label:ak[0],value:ak[1]}}))})},minLength:2})});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a/>").attr("id","zoom-out").attr("title","Zoom out").tooltip({placement:"bottom"}).click(function(){ac.zoom_out()}).appendTo(this.nav_controls);this.zi_link=$("<a/>").attr("id","zoom-in").attr("title","Zoom in").tooltip({placement:"bottom"}).click(function(){ac.zoom_in()}).appendTo(this.nav_controls);this.load_chroms_deferred=this.load_chroms({low:0});this.chrom_select.bind("change",function(){ac.change_chrom(ac.chrom_select.val())});this.browser_content_div.click(function(ag){$(this).find("input").trigger("blur")});this.browser_content_div.bind("dblclick",function(ag){ac.zoom_in(ag.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(ag,ah){this.current_x=ah.offsetX}).bind("drag",function(ag,ai){var aj=ai.offsetX-this.current_x;this.current_x=ai.offsetX;var ah=Math.round(aj/ac.viewport_container.width()*(ac.max_high-ac.max_low));ac.move_delta(-ah)});this.overview_close.click(function(){ac.reset_overview()});this.viewport_container.bind("draginit",function(ag,ah){if(ag.clientX>ac.viewport_container.width()-16){return false}}).bind("dragstart",function(ag,ah){ah.original_low=ac.low;ah.current_height=ag.clientY;ah.current_x=ah.offsetX}).bind("drag",function(ai,ak){var ag=$(this);var al=ak.offsetX-ak.current_x;var ah=ag.scrollTop()-(ai.clientY-ak.current_height);ag.scrollTop(ah);ak.current_height=ai.clientY;ak.current_x=ak.offsetX;var aj=Math.round(al/ac.viewport_container.width()*(ac.high-ac.low));ac.move_delta(aj)});this.top_labeltrack.bind("dragstart",function(ag,ah){return $("<div/>").addClass("zoom-area").css("height",ac.browser_content_div.height()+ac.top_labeltrack.height()+1).appendTo($(this))}).bind("drag",function(ak,al){$(al.proxy).css({left:Math.min(ak.pageX,al.startX)-ac.container.offset().left,width:Math.abs(ak.pageX-al.startX)});var ah=Math.min(ak.pageX,al.startX)-ac.container.offset().left,ag=Math.max(ak.pageX,al.startX)-ac.container.offset().left,aj=(ac.high-ac.low),ai=ac.viewport_container.width();ac.update_location(Math.round(ah/ai*aj)+ac.low,Math.round(ag/ai*aj)+ac.low)}).bind("dragend",function(al,am){var ah=Math.min(al.pageX,am.startX),ag=Math.max(al.pageX,am.startX),aj=(ac.high-ac.low),ai=ac.viewport_container.width(),ak=ac.low;ac.low=Math.round(ah/ai*aj)+ak;ac.high=Math.round(ag/ai*aj)+ak;$(am.proxy).remove();ac.request_redraw()});this.add_label_track(new W(this,{content_div:this.top_labeltrack}));$(window).bind("resize",function(){if(this.resize_timer){clearTimeout(this.resize_timer)}this.resize_timer=setTimeout(function(){ac.resize_window()},500)});$(document).bind("redraw",function(){ac.redraw()});this.reset();$(window).trigger("resize")},get_base_color:function(ac){return this.config.get_value(ac.toLowerCase()+"_color")||this.config.get_value("n_color")}});o(Y.prototype,y.prototype,{changed:function(){this.has_changes=true},update_intro_div:function(){this.intro_div.toggle(this.drawables.length===0)},trigger_navigate:function(ad,af,ac,ag){if(this.timer){clearTimeout(this.timer)}if(ag){var ae=this;this.timer=setTimeout(function(){ae.trigger("navigate",ad+":"+af+"-"+ac)},500)}else{view.trigger("navigate",ad+":"+af+"-"+ac)}},update_location:function(ac,ae){this.location_span.text(commatize(ac)+" - "+commatize(ae));this.nav_input.val(this.chrom+":"+commatize(ac)+"-"+commatize(ae));var ad=view.chrom_select.val();if(ad!==""){this.trigger_navigate(ad,view.low,view.high,true)}},load_chroms:function(ae){ae.num=v;var ac=this,ad=$.Deferred();$.ajax({url:galaxy_config.root+"api/genomes/"+this.dbkey,data:ae,dataType:"json",success:function(ag){if(ag.chrom_info.length===0){return}if(ag.reference){var ah=new B(ac);ac.add_label_track(ah);ac.reference_track=ah}ac.chrom_data=ag.chrom_info;var ak='<option value="">Select Chrom/Contig</option>';for(var aj=0,af=ac.chrom_data.length;aj<af;aj++){var ai=ac.chrom_data[aj].chrom;ak+='<option value="'+ai+'">'+ai+"</option>"}if(ag.prev_chroms){ak+='<option value="previous">Previous '+v+"</option>"}if(ag.next_chroms){ak+='<option value="next">Next '+v+"</option>"}ac.chrom_select.html(ak);ac.chrom_start_index=ag.start_index;ad.resolve(ag.chrom_info)},error:function(){alert("Could not load chroms for this dbkey: "+ac.dbkey)}});return ad},change_chrom:function(ah,ad,aj){var ae=this;if(!ae.chrom_data){ae.load_chroms_deferred.then(function(){ae.change_chrom(ah,ad,aj)});return}if(!ah||ah==="None"){return}if(ah==="previous"){ae.load_chroms({low:this.chrom_start_index-v});return}if(ah==="next"){ae.load_chroms({low:this.chrom_start_index+v});return}var ai=$.grep(ae.chrom_data,function(ak,al){return ak.chrom===ah})[0];if(ai===undefined){ae.load_chroms({chrom:ah},function(){ae.change_chrom(ah,ad,aj)});return}else{if(ah!==ae.chrom){ae.chrom=ah;ae.chrom_select.val(ae.chrom);ae.max_high=ai.len-1;ae.reset();for(var ag=0,ac=ae.drawables.length;ag<ac;ag++){var af=ae.drawables[ag];if(af.init){af.init()}}if(ae.reference_track){ae.reference_track.init()}}if(ad===undefined&&aj===undefined){ae.low=0;ae.high=ae.max_high}else{ae.low=(ad!==undefined?Math.max(ad,0):0);if(aj===undefined){ae.low=Math.max(ae.low-15,0);ae.high=ae.low+30}else{ae.high=Math.min(aj,ae.max_high)}}ae.request_redraw()}},go_to:function(ag){ag=ag.replace(/,/g,"");ag=ag.replace(/:|\-/g," ");var ad=ag.split(/\s+/),af=ad[0],ae=(ad[1]?parseInt(ad[1],10):undefined),ac=(ad[2]?parseInt(ad[2],10):undefined);this.change_chrom(af,ae,ac)},move_fraction:function(ae){var ac=this;var ad=ac.high-ac.low;this.move_delta(ae*ad)},move_delta:function(af){var ac=this;var ae=ac.high-ac.low;if(ac.low-af<ac.max_low){ac.low=ac.max_low;ac.high=ac.max_low+ae}else{if(ac.high-af>ac.max_high){ac.high=ac.max_high;ac.low=ac.max_high-ae}else{ac.high-=af;ac.low-=af}}ac.request_redraw({data_fetch:false});if(this.redraw_on_move_fn){clearTimeout(this.redraw_on_move_fn)}this.redraw_on_move_fn=setTimeout(function(){ac.request_redraw()},200);var ad=ac.chrom_select.val();this.trigger_navigate(ad,ac.low,ac.high,true)},add_drawable:function(ad){y.prototype.add_drawable.call(this,ad);ad.init();this.changed();this.update_intro_div();var ac=this;ad.config.on("change",function(){ac.changed()})},add_label_track:function(ac){ac.view=this;ac.init();this.label_tracks.push(ac)},remove_drawable:function(ae,ad){y.prototype.remove_drawable.call(this,ae);if(ad){var ac=this;ae.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})}},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},request_redraw:function(ad,ae){var ac=this,af=(ae?[ae]:ac.drawables);ab.each(af,function(ag){var ah=ab.find(ac.tracks_to_be_redrawn,function(ai){return ai[0]===ag});if(ah){ah[1]=ad}else{ac.tracks_to_be_redrawn.push([ag,ad])}});if(!this.requested_redraw){requestAnimationFrame(function(){ac._redraw()});this.requested_redraw=true}},_redraw:function(){this.requested_redraw=false;var ac=this.low,ag=this.high;if(ac<this.max_low){ac=this.max_low}if(ag>this.max_high){ag=this.max_high}var ad=this.high-this.low;if(this.high!==0&&ad<this.min_separation){ag=ac+this.min_separation}this.low=Math.floor(ac);this.high=Math.ceil(ag);this.update_location(this.low,this.high);this.resolution_px_b=this.viewport_container.width()/(this.high-this.low);var af=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ah=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ae=13;this.overview_box.css({left:af,width:Math.max(ae,ah)}).show();if(ah<ae){this.overview_box.css("left",af-(ae-ah)/2)}if(this.overview_highlight){this.overview_highlight.css({left:af,width:ah})}ab.each(this.tracks_to_be_redrawn,function(ak){var ai=ak[0],aj=ak[1];if(ai){ai._draw(aj)}});this.tracks_to_be_redrawn=[];ab.each(this.label_tracks,function(ai){ai._draw()})},zoom_in:function(ad,ae){if(this.max_high===0||this.high-this.low<=this.min_separation){return}var af=this.high-this.low,ag=af/2+this.low,ac=(af/this.zoom_factor)/2;if(ad){ag=ad/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(ag-ac);this.high=Math.round(ag+ac);this.changed();this.request_redraw()},zoom_out:function(){if(this.max_high===0){return}var ad=this.high-this.low,ae=ad/2+this.low,ac=(ad*this.zoom_factor)/2;this.low=Math.round(ae-ac);this.high=Math.round(ae+ac);this.changed();this.request_redraw()},resize_viewport:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height())},resize_window:function(){this.resize_viewport();this.request_redraw()},set_overview:function(ae){if(this.overview_drawable){if(this.overview_drawable.dataset.id===ae.dataset.id){return}this.overview_viewport.find(".track").remove()}var ad=ae.copy({content_div:this.overview_viewport}),ac=this;ad.header_div.hide();ad.is_overview=true;ac.overview_drawable=ad;this.overview_drawable.postdraw_actions=function(){ac.overview_highlight.show().height(ac.overview_drawable.content_div.height());ac.overview_viewport.height(ac.overview_drawable.content_div.height()+ac.overview_box.outerHeight());ac.overview_close.show();ac.resize_window()};ac.overview_drawable.request_draw();this.changed()},reset_overview:function(){$(".tooltip").remove();this.overview_viewport.find(".track-tile").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide();view.resize_window();view.overview_drawable=null}});var q=P.Tool.extend({defaults:{track:null},initialize:function(ac){P.Tool.prototype.initialize.call(this,ac);var ad=true;if(ac.tool_state!==undefined&&ac.tool_state.hidden!==undefined){ad=ac.tool_state.hidden}this.set("hidden",ad);this.remove_inputs(["data","hidden_data","conditional"])},state_dict:function(ac){return ab.extend(this.get_inputs_dict(),{hidden:!this.is_visible()})}});var t=Backbone.View.extend({events:{"change :input":"update_value"},render:function(){var ae=this.$el.addClass("param-row"),af=this.model;var ac=$("<div>").addClass("param-label").text(af.get("label")).appendTo(ae);var ad=$("<div/>").addClass("param-input").html(af.get("html")).appendTo(ae);ad.find(":input").val(af.get("value"));$("<div style='clear: both;'/>").appendTo(ae)},update_value:function(ac){this.model.set_value($(ac.target).val())}});var aa=Backbone.View.extend({initialize:function(ac){this.model.on("change:hidden",this.set_visible,this)},render:function(){var ad=this;tool=this.model,parent_div=this.$el.addClass("dynamic-tool").hide();parent_div.bind("drag",function(ah){ah.stopPropagation()}).click(function(ah){ah.stopPropagation()}).bind("dblclick",function(ah){ah.stopPropagation()}).keydown(function(ah){ah.stopPropagation()});var ae=$("<div class='tool-name'>").appendTo(parent_div).text(tool.get("name"));tool.get("inputs").each(function(ai){var ah=new t({model:ai});ah.render();parent_div.append(ah.$el)});parent_div.find("input").click(function(){$(this).select()});var af=$("<div>").addClass("param-row").appendTo(parent_div);var ag=$("<input type='submit'>").attr("value","Run on complete dataset").appendTo(af);var ac=$("<input type='submit'>").attr("value","Run on visible region").appendTo(af);ac.click(function(){ad.run_on_region()});ag.click(function(){ad.run_on_dataset()});if(tool.is_visible()){this.$el.show()}},set_visible:function(){this.$el.toggle(this.model.is_visible())},update_params:function(){for(var ac=0;ac<this.params.length;ac++){this.params[ac].update_value()}},run_on_dataset:function(){var ac=this.model;this.run({target_dataset_id:this.model.get("track").dataset.id,action:"rerun",tool_id:ac.id},null,function(ad){Galaxy.modal.show({title:ac.get("name")+" is Running",body:ac.get("name")+" is running on the complete dataset. Tool outputs are in dataset's history.",buttons:{Close:function(){Galaxy.modal.hide()}}})})},run_on_region:function(){var ad=this.model.get("track"),ag=this.model,ai=new w.GenomeRegion({chrom:ad.view.chrom,start:ad.view.low,end:ad.view.high}),aj={target_dataset_id:ad.dataset.id,action:"rerun",tool_id:ag.id,regions:[ai.toJSON()]},ah=ad,al=ag.get("name")+ah.tool_region_and_parameters_str(ai),ac;if(ah.container===view){var ak=new N(view,view,{name:ad.config.get_value("name")});var af=ah.container.replace_drawable(ah,ak,false);ak.container_div.insertBefore(ah.view.content_div.children()[af]);ak.add_drawable(ah);ah.container_div.appendTo(ak.content_div);ac=ak}else{ac=ah.container}var ae=new ah.constructor(view,ac,{name:al,hda_ldda:"hda"});ae.init_for_tool_data();ae.change_mode(ah.mode);ae.set_filters_manager(ah.filters_manager.copy(ae));ae.update_icons();ac.add_drawable(ae);ae.tiles_div.text("Starting job.");this.run(aj,ae,function(am){ae.set_dataset(new X.Dataset(am));ae.tiles_div.text("Running job.");ae.init()})},run:function(ac,ae,af){ac.inputs=this.model.get_inputs_dict();var ad=new j.ServerStateDeferred({ajax_settings:{url:galaxy_config.root+"api/tools",data:JSON.stringify(ac),dataType:"json",contentType:"application/json",type:"POST"},interval:2000,success_fn:function(ag){return ag!=="pending"}});$.when(ad.go()).then(function(ag){if(ag==="no converter"){ae.container_div.addClass("error");ae.content_div.text(H)}else{if(ag.error){ae.container_div.addClass("error");ae.content_div.text(x+ag.message)}else{af(ag)}}})}});var C=function(ac,ad){J.Scaler.call(this,ad);this.filter=ac};C.prototype.gen_val=function(ac){if(this.filter.high===Number.MAX_VALUE||this.filter.low===-Number.MAX_VALUE||this.filter.low===this.filter.high){return this.default_val}return((parseFloat(ac[this.filter.index])-this.filter.low)/(this.filter.high-this.filter.low))};var b=function(ac,af,ag,ad,ae){this.track=ac;this.region=af;this.low=af.get("start");this.high=af.get("end");this.w_scale=ag;this.canvas=ad;this.html_elt=$("<div class='track-tile'/>").append(ad);this.data=ae;this.stale=false};b.prototype.predisplay_actions=function(){};var K=function(ac,af,ag,ad,ae){b.call(this,ac,af,ag,ad,ae)};K.prototype.predisplay_actions=function(){};var M=function(ae,aj,al,ad,ag,ah,am,ac,ai,af,ak){b.call(this,ae,aj,al,ad,ag);this.mode=ah;this.all_slotted=ac;this.feature_mapper=ai;this.has_icons=false;this.incomplete_features=af;this.other_tiles_features_drawn={};this.seq_data=ak};o(M.prototype,b.prototype);M.prototype.predisplay_actions=function(){};var f=function(ad,ac,ae){o(ae,{drag_handle_class:"draghandle"});p.call(this,ad,ac,ae);this.dataset=null;if(ae.dataset){this.dataset=(ae.dataset instanceof Backbone.Model?ae.dataset:new X.Dataset(ae.dataset))}this.dataset_check_type="converted_datasets_state";this.data_url_extra_params={};this.data_query_wait=("data_query_wait" in ae?ae.data_query_wait:I);this.data_manager=("data_manager" in ae?ae.data_manager:new w.GenomeDataManager({dataset:this.dataset,genome:new w.Genome({key:ad.dbkey,chroms_info:{chrom_info:ad.chrom_data}}),data_mode_compatible:this.data_and_mode_compatible,can_subset:this.can_subset}));this.min_height_px=16;this.max_height_px=800;this.visible_height_px=this.config.get_value("height");this.content_div=$("<div class='track-content'>").appendTo(this.container_div);if(this.container){this.container.content_div.append(this.container_div);if(!("resize" in ae)||ae.resize){this.add_resize_handle()}}};o(f.prototype,p.prototype,{action_icons_def:[{name:"mode_icon",title:"Set display mode",css_class:"chevron-expand",on_click_fn:function(){}},p.prototype.action_icons_def[0],{name:"overview_icon",title:"Set as overview",css_class:"application-dock-270",on_click_fn:function(ac){ac.view.set_overview(ac)}},p.prototype.action_icons_def[1],{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters()}else{ac.filters_manager.init_filters()}ac.filters_manager.toggle()}},{name:"tools_icon",title:"Tool",css_class:"hammer",on_click_fn:function(ac){ac.tool.toggle();if(ac.tool.is_visible()){ac.set_name(ac.config.get_value("name")+ac.tool_region_and_parameters_str())}else{ac.revert_name()}$(".tooltip").remove()}},{name:"param_space_viz_icon",title:"Tool parameter space visualization",css_class:"arrow-split",on_click_fn:function(ac){var af='<strong>Tool</strong>: <%= track.tool.get("name") %><br/><strong>Dataset</strong>: <%= track.config.get_value("name") %><br/><strong>Region(s)</strong>: <select name="regions"><option value="cur">current viewing area</option><option value="bookmarks">bookmarks</option><option value="both">current viewing area and bookmarks</option></select>',ae=ab.template(af,{track:ac});var ah=function(){Galaxy.modal.hide();$(window).unbind("keypress.check_enter_esc")},ad=function(){var aj=$('select[name="regions"] option:selected').val(),al,ai=new w.GenomeRegion({chrom:view.chrom,start:view.low,end:view.high}),ak=ab.map($(".bookmark"),function(am){return new w.GenomeRegion({from_str:$(am).children(".position").text()})});if(aj==="cur"){al=[ai]}else{if(aj==="bookmarks"){al=ak}else{al=[ai].concat(ak)}}Galaxy.modal.hide();window.location.href=galaxy_config.root+"visualization/sweepster?"+$.param({dataset_id:ac.dataset.id,hda_ldda:ac.dataset.get("hda_ldda"),regions:JSON.stringify(new Backbone.Collection(al).toJSON())})},ag=function(ai){if((ai.keyCode||ai.which)===27){ah()}else{if((ai.keyCode||ai.which)===13){ad()}}};Galaxy.modal.show({title:"Visualize tool parameter space and output from different parameter settings?",body:ae,buttons:{No:ah,Yes:ad}})}},p.prototype.action_icons_def[2]],can_draw:function(){return this.dataset&&p.prototype.can_draw.call(this)},build_container_div:function(){return $("<div/>").addClass("track").attr("id","track_"+this.id)},set_dataset:function(ac){this.dataset=ac;this.data_manager.set("dataset",ac)},on_resize:function(){this.request_draw({clear_tile_cache:true})},add_resize_handle:function(){var ac=this;var af=false;var ae=false;var ad=$("<div class='track-resize'>");$(ac.container_div).hover(function(){if(ac.config.get_value("content_visible")){af=true;ad.show()}},function(){af=false;if(!ae){ad.hide()}});ad.hide().bind("dragstart",function(ag,ah){ae=true;ah.original_height=$(ac.content_div).height()}).bind("drag",function(ah,ai){var ag=Math.min(Math.max(ai.original_height+ai.deltaY,ac.min_height_px),ac.max_height_px);$(ac.tiles_div).css("height",ag);ac.visible_height_px=(ac.max_height_px===ag?0:ag);ac.on_resize()}).bind("dragend",function(ag,ah){ac.tile_cache.clear();ae=false;if(!af){ad.hide()}ac.config.set_value("height",ac.visible_height_px);ac.changed()}).appendTo(ac.container_div)},hide_contents:function(){this.tiles_div.hide();this.container_div.find(".yaxislabel, .track-resize").hide()},show_contents:function(){this.tiles_div.show();this.container_div.find(".yaxislabel, .track-resize").show();this.request_draw()},get_type:function(){if(this instanceof W){return"LabelTrack"}else{if(this instanceof B){return"ReferenceTrack"}else{if(this instanceof g){return"LineTrack"}else{if(this instanceof S){return"ReadTrack"}else{if(this instanceof Z){return"VariantTrack"}else{if(this instanceof e){return"CompositeTrack"}else{if(this instanceof c){return"FeatureTrack"}}}}}}}return""},show_message:function(ac){this.tiles_div.remove();return $("<span/>").addClass("message").html(ac).appendTo(this.content_div)},init:function(ae){var ad=this;ad.enabled=false;ad.tile_cache.clear();ad.data_manager.clear();ad.content_div.children().remove();ad.container_div.removeClass("nodata error pending");ad.tiles_div=$("<div/>").addClass("tiles").appendTo(ad.content_div);if(!ad.dataset.id){return}var ac=$.Deferred(),af={hda_ldda:ad.dataset.get("hda_ldda"),data_type:this.dataset_check_type,chrom:ad.view.chrom,retry:ae};$.getJSON(this.dataset.url(),af,function(ag){if(!ag||ag==="error"||ag.kind==="error"){ad.container_div.addClass("error");var ah=ad.show_message(m);if(ag.message){ah.append($("<a href='javascript:void(0);'></a>").text("View error").click(function(){Galaxy.modal.show({title:"Trackster Error",body:"<pre>"+ag.message+"</pre>",buttons:{Close:function(){Galaxy.modal.hide()}}})}));ah.append($("<span/>").text(" "));ah.append($("<a href='javascript:void(0);'></a>").text("Try again").click(function(){ad.init(true)}))}}else{if(ag==="no converter"){ad.container_div.addClass("error");ad.show_message(H)}else{if(ag==="no data"||(ag.data!==undefined&&(ag.data===null||ag.data.length===0))){ad.container_div.addClass("nodata");ad.show_message(E)}else{if(ag==="pending"){ad.container_div.addClass("pending");ad.show_message(u);setTimeout(function(){ad.init()},ad.data_query_wait)}else{if(ag==="data"||ag.status==="data"){if(ag.valid_chroms){ad.valid_chroms=ag.valid_chroms;ad.update_icons()}ad.tiles_div.text(T);if(ad.view.chrom){ad.tiles_div.text("");ad.tiles_div.css("height",ad.visible_height_px+"px");ad.enabled=true;$.when.apply($,ad.predraw_init()).done(function(){ac.resolve();ad.container_div.removeClass("nodata error pending");ad.request_draw()})}else{ac.resolve()}}}}}}});this.update_icons();return ac},predraw_init:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(af&&af.min&&af.max){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_default_value("min_value",ae);ac.config.set_default_value("max_value",ag);ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},get_drawables:function(){return this}});var L=function(ae,ad,ag){f.call(this,ae,ad,ag);var ac=this;k(ac.container_div,ac.drag_handle_class,".group",ac);this.filters_manager=new h.FiltersManager(this,("filters" in ag?ag.filters:null));this.data_manager.set("filters_manager",this.filters_manager);this.filters_available=false;this.tool=(ag.tool?new q(ab.extend(ag.tool,{track:this,tool_state:ag.tool_state})):null);this.tile_cache=new w.Cache(O);this.left_offset=0;if(this.header_div){this.set_filters_manager(this.filters_manager);if(this.tool){var af=new aa({model:this.tool});af.render();this.dynamic_tool_div=af.$el;this.header_div.after(this.dynamic_tool_div)}}this.tiles_div=$("<div/>").addClass("tiles").appendTo(this.content_div);if(!this.config.get_value("content_visible")){this.tiles_div.hide()}this.overlay_div=$("<div/>").addClass("overlay").appendTo(this.content_div);if(ag.mode){this.change_mode(ag.mode)}};o(L.prototype,p.prototype,f.prototype,{action_icons_def:f.prototype.action_icons_def.concat([{name:"show_more_rows_icon",title:"To minimize track height, not all feature rows are displayed. Click to display more rows.",css_class:"exclamation",on_click_fn:function(ac){$(".tooltip").remove();ac.slotters[ac.view.resolution_px_b].max_rows*=2;ac.request_draw({clear_tile_cache:true})},hide:true}]),copy:function(ac){var ad=this.to_dict();o(ad,{data_manager:this.data_manager});var ae=new this.constructor(this.view,ac,ad);ae.change_mode(this.mode);ae.enabled=this.enabled;return ae},set_filters_manager:function(ac){this.filters_manager=ac;this.header_div.after(this.filters_manager.parent_div)},to_dict:function(){return{track_type:this.get_type(),dataset:{id:this.dataset.id,hda_ldda:this.dataset.get("hda_ldda")},prefs:this.config.to_key_value_dict(),mode:this.mode,filters:this.filters_manager.to_dict(),tool_state:(this.tool?this.tool.state_dict():{})}},set_min_max:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(isNaN(parseFloat(ac.config.get_value("min_value")))||isNaN(parseFloat(ac.config.get_value("max_value")))){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},change_mode:function(ad){var ac=this;ac.mode=ad;ac.config.set_value("mode",ad);if(ad==="Auto"){this.data_manager.clear()}ac.request_draw({clear_tile_cache:true});this.action_icons.mode_icon.attr("title","Set display mode (now: "+ac.mode+")");return ac},update_icons:function(){var ac=this;ac.action_icons.filters_icon.toggle(ac.filters_available);ac.action_icons.tools_icon.toggle(ac.tool!==null);ac.action_icons.param_space_viz_icon.toggle(ac.tool!==null)},_gen_tile_cache_key:function(ad,ac){return ad+"_"+ac},request_draw:function(ac){if(ac&&ac.clear_tile_cache){this.tile_cache.clear()}this.view.request_redraw(ac,this)},before_draw:function(){this.max_height_px=0},_draw:function(aq){if(!this.can_draw()){return}var an=aq&&aq.clear_after,al=this.view.low,ag=this.view.high,aj=ag-al,ad=this.view.container.width(),ap=this.view.resolution_px_b,af=1/ap;if(this.is_overview){al=this.view.max_low;ag=this.view.max_high;ap=ad/(view.max_high-view.max_low);af=1/ap}this.before_draw();this.tiles_div.children().addClass("remove");var ak=Math.floor(Q*af),ac=Math.floor(al/ak),am,ah,ai=[],ao=[];while((ac*ak)<ag){am=new w.GenomeRegion({chrom:this.view.chrom,start:ac*ak,end:Math.min((ac+1)*ak,this.view.max_high)});ah=this.draw_helper(am,ap,aq);ai.push(ah);$.when(ah).then(function(ar){ao.push(ar)});ac+=1}if(!an){this.tiles_div.children(".remove").removeClass("remove").remove()}var ae=this;$.when.apply($,ai).then(function(){ae.tiles_div.children(".remove").remove();ao=ab.filter(ao,function(ar){return ar!==null});if(ao.length!==0){ae.postdraw_actions(ao,ad,ap,an)}})},_add_yaxis_label:function(af,ah){var ad=this,ag=(af==="max"?"top":"bottom"),ai=(af==="max"?"max":"min"),ac=(af==="max"?"max_value":"min_value"),ae=this.container_div.find(".yaxislabel."+ag);ah=ah||function(){ad.request_draw({clear_tile_cache:true})};if(ae.length!==0){ae.text(ad.config.get_value(ac))}else{ae=$("<div/>").text(ad.config.get_value(ac)).make_text_editable({num_cols:12,on_finish:function(aj){$(".tooltip").remove();ad.config.set_value(ac,aj);ah()},help_text:"Set "+ai+" value"}).addClass("yaxislabel "+ag).css("color",this.config.get_value("label_color"));this.container_div.prepend(ae)}},postdraw_actions:function(af,ag,ai,ac){var ae=ab.filter(af,function(aj){return(aj instanceof K)});if(ae.length>0){this.max_height_px=0;var ad=this;ab.each(af,function(aj){if(!(aj instanceof K)){aj.html_elt.remove();ad.draw_helper(aj.region,ai,{force:true,mode:"Coverage"})}});ad._add_yaxis_label("max")}else{this.container_div.find(".yaxislabel").remove();var ah=ab.find(af,function(aj){return aj.has_icons});if(ah){ab.each(af,function(aj){if(!aj.has_icons){aj.html_elt.css("padding-top",D)}})}}},get_mode:function(ac){return this.mode},update_auto_mode:function(ac){},_get_drawables:function(){return[this]},draw_helper:function(al,an,ao){if(!ao){ao={}}var ad=ao.force,ai=ao.mode||this.mode,af=1/an,ae=this,ag=this._get_drawables(),am=this._gen_tile_cache_key(an,al),ah=function(ap){return(ap&&"track" in ap)};var aj=(ad?undefined:ae.tile_cache.get_elt(am));if(aj){if(ah(aj)){ae.show_tile(aj,an)}return aj}if(ao.data_fetch===false){return null}var ak=function(){var ap=(ab.find(A,function(ar){return ar===ai})?"Coverage":ai);var aq=ab.map(ag,function(ar){return ar.data_manager.get_data(al,ap,af,ae.data_url_extra_params)});if(view.reference_track){aq.push(view.reference_track.data_manager.get_data(al,ai,af,view.reference_track.data_url_extra_params))}return aq};var ac=$.Deferred();ae.tile_cache.set_elt(am,ac);$.when.apply($,ak()).then(function(){var ap=ak(),av=ap,aB;if(ab.find(ap,function(aD){return j.is_deferred(aD)})){ae.tile_cache.set_elt(am,undefined);$.when(ae.draw_helper(al,an,ao)).then(function(aD){ac.resolve(aD)});return}if(view.reference_track){aB=view.reference_track.data_manager.subset_entry(ap.pop(),al)}var aw=[],at=[];ab.each(ag,function(aG,aD){var aF=aG.mode,aE=av[aD];if(aF==="Auto"){aF=aG.get_mode(aE);aG.update_auto_mode(aF)}aw.push(aF);at.push(aG.get_canvas_height(aE,aF,an,aq))});var au=ae.view.canvas_manager.new_canvas(),ax=al.get("start"),aC=al.get("end"),ar=0,aq=Math.ceil((aC-ax)*an)+ae.left_offset,az=ab.max(at),ay;au.width=aq;au.height=(ao.height||az);var aA=au.getContext("2d");aA.translate(ae.left_offset,0);if(ag.length>1){aA.globalAlpha=0.5;aA.globalCompositeOperation="source-over"}ab.each(ag,function(aE,aD){ay=aE.draw_tile(av[aD],aA,aw[aD],al,an,aB)});if(ay!==undefined){ae.tile_cache.set_elt(am,ay);ae.show_tile(ay,an)}ac.resolve(ay)});return ac},get_canvas_height:function(ac,ae,af,ad){return this.visible_height_px},_draw_line_track_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.LinePainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new K(this,ag,ai,af,ac.data)},draw_tile:function(ac,ad,ag,af,ah,ae){},show_tile:function(ae,ah){var ad=this,ac=ae.html_elt;ae.predisplay_actions();var ag=Math.round((ae.low-(this.is_overview?this.view.max_low:this.view.low))*ah);if(this.left_offset){ag-=this.left_offset}ac.css("left",ag);if(ac.hasClass("remove")){ac.removeClass("remove")}else{this.tiles_div.append(ac)}ac.css("height","auto");this.max_height_px=Math.max(this.max_height_px,ac.height()-2);ac.parent().children().css("height",this.max_height_px+"px");var af=this.max_height_px;if(this.visible_height_px!==0){af=Math.min(this.max_height_px,this.visible_height_px)}this.tiles_div.css("height",af+"px")},tool_region_and_parameters_str:function(af){var ac=this,ae=(af!==undefined?af.toString():"all"),ad=ab.values(ac.tool.get_inputs_dict()).join(", ");return" - region=["+ae+"], parameters=["+ad+"]"},data_and_mode_compatible:function(ac,ad){if(ad==="Auto"){return true}else{if(ad==="Coverage"){return ac.dataset_type==="bigwig"}else{if(ac.dataset_type==="bigwig"||ac.extra_info==="no_detail"){return false}else{return true}}}},can_subset:function(ac){if(ac.message||ac.extra_info==="no_detail"){return false}else{if(ac.dataset_type==="bigwig"){return(ac.data[1][0]-ac.data[0][0]===1)}}return true},init_for_tool_data:function(){this.data_manager.set("data_type","raw_data");this.data_query_wait=1000;this.dataset_check_type="state"}});var W=function(ad,ac){f.call(this,ad,ac,{resize:false,header:false});this.container_div.addClass("label-track")};o(W.prototype,f.prototype,{init:function(){this.enabled=true},predraw_init:function(){},_draw:function(ag){var ae=this.view,af=ae.high-ae.low,aj=Math.floor(Math.pow(10,Math.floor(Math.log(af)/Math.log(10)))),ac=Math.floor(ae.low/aj)*aj,ah=this.view.container.width(),ad=$("<div/>").addClass("label-container");while(ac<ae.high){var ai=(ac-ae.low)/af*ah;ad.append($("<div/>").addClass("label").text(commatize(ac)).css({left:ai}));ac+=aj}this.content_div.children(":first").remove();this.content_div.append(ad)}});var e=function(ad,ac,ag){L.call(this,ad,ac,ag);this.drawables=[];if("drawables" in ag){var af;for(var ae=0;ae<ag.drawables.length;ae++){af=ag.drawables[ae];this.drawables[ae]=n(af,ad,null);if(af.left_offset>this.left_offset){this.left_offset=af.left_offset}}this.enabled=true}ab.each(this.drawables,function(ah){if(ah instanceof c||ah instanceof S){ah.change_mode("Coverage")}});this.update_icons();this.obj_type="CompositeTrack"};o(e.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),action_icons_def:[{name:"composite_icon",title:"Show individual tracks",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_group()}}].concat(L.prototype.action_icons_def),to_dict:y.prototype.to_dict,add_drawable:y.prototype.add_drawable,unpack_drawables:y.prototype.unpack_drawables,config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},on_resize:function(){var ac=this.visible_height_px;ab.each(this.drawables,function(ad){ad.visible_height_px=ac});f.prototype.on_resize.call(this)},change_mode:function(ac){L.prototype.change_mode.call(this,ac);for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad].change_mode(ac)}},init:function(){var ae=[];for(var ad=0;ad<this.drawables.length;ad++){ae.push(this.drawables[ad].init())}var ac=this;$.when.apply($,ae).then(function(){ac.enabled=true;ac.request_draw()})},update_icons:function(){this.action_icons.filters_icon.hide();this.action_icons.tools_icon.hide();this.action_icons.param_space_viz_icon.hide()},can_draw:p.prototype.can_draw,_get_drawables:function(){return this.drawables},show_group:function(){var af=new N(this.view,this.container,{name:this.config.get_value("name")}),ac;for(var ae=0;ae<this.drawables.length;ae++){ac=this.drawables[ae];ac.update_icons();af.add_drawable(ac);ac.container=af;af.content_div.append(ac.container_div)}var ad=this.container.replace_drawable(this,af,true);af.request_draw({clear_tile_cache:true})},before_draw:function(){var ad=ab.min(ab.map(this.drawables,function(ae){return ae.config.get_value("min_value")})),ac=ab.max(ab.map(this.drawables,function(ae){return ae.config.get_value("max_value")}));this.config.set_value("min_value",ad);this.config.set_value("max_value",ac);ab.each(this.drawables,function(ae){ae.config.set_value("min_value",ad);ae.config.set_value("max_value",ac)})},update_all_min_max:function(){var ad=this,ac=this.config.get_value("min_value"),ae=this.config.get_value("max_value");ab.each(this.drawables,function(af){af.config.set_value("min_value",ac);af.config.set_value("max_value",ae)});this.request_draw({clear_tile_cache:true})},postdraw_actions:function(ai,ac,al,ah){var ag=-1,ae;for(ae=0;ae<ai.length;ae++){var aj=ai[ae].html_elt.find("canvas").height();if(aj>ag){ag=aj}}for(ae=0;ae<ai.length;ae++){var af=ai[ae];if(af.html_elt.find("canvas").height()!==ag){this.draw_helper(af.region,al,{force:true,height:ag});af.html_elt.remove()}}var ad=this,ak=function(){ad.update_all_min_max()};this._add_yaxis_label("min",ak);this._add_yaxis_label("max",ak)}});var B=function(ac){L.call(this,ac,{content_div:ac.top_labeltrack},{resize:false,header:false});this.left_offset=ac.canvas_manager.char_width_px;this.container_div.addClass("reference-track");this.data_url=galaxy_config.root+"api/genomes/"+this.view.dbkey;this.data_url_extra_params={reference:true};this.data_manager=new w.GenomeReferenceDataManager({data_url:this.data_url,can_subset:this.can_subset});this.hide_contents()};o(B.prototype,p.prototype,L.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"height",type:"int",default_value:13,hidden:true}]),init:function(){this.data_manager.clear();this.enabled=true},predraw_init:function(){},can_draw:p.prototype.can_draw,draw_helper:function(af,ah,ad){var ac=this.tiles_div.is(":visible"),ag,ae=null;if(ah>this.view.canvas_manager.char_width_px){this.tiles_div.show();ag=true;ae=L.prototype.draw_helper.call(this,af,ah,ad)}else{ag=false;this.tiles_div.hide()}if(ac!==ag){this.view.resize_viewport()}return ae},can_subset:function(ac){return true},draw_tile:function(ae,ak,af,ah,al){var ad=this.data_manager.subset_entry(ae,ah),aj=ad.data;var ac=ak.canvas;ak.font=ak.canvas.manager.default_font;ak.textAlign="center";for(var ag=0,ai=aj.length;ag<ai;ag++){ak.fillStyle=this.view.get_base_color(aj[ag]);ak.fillText(aj[ag],Math.floor(ag*al),10)}return new b(this,ah,al,ac,ad)}});var g=function(ad,ac,ae){this.mode="Histogram";L.call(this,ad,ac,ae)};o(g.prototype,p.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Color",type:"color"},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},before_draw:function(){},draw_tile:function(ac,ad,af,ae,ag){return this._draw_line_track_tile(ac,ad,af,ae,ag)},can_subset:function(ac){return(ac.data[1][0]-ac.data[0][0]===1)},postdraw_actions:function(ad,ae,af,ac){this._add_yaxis_label("max");this._add_yaxis_label("min")}});var r=function(ad,ac,ae){this.mode="Heatmap";L.call(this,ad,ac,ae)};o(r.prototype,p.prototype,L.prototype,{display_modes:["Heatmap"],config_params:ab.union(p.prototype.config_params,[{key:"pos_color",label:"Positive Color",type:"color",default_value:"#FF8C00"},{key:"neg_color",label:"Negative Color",type:"color",default_value:"#4169E1"},{key:"min_value",label:"Min Value",type:"float",default_value:-1},{key:"max_value",label:"Max Value",type:"float",default_value:1},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:500,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.DiagonalHeatmapPainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new b(this,ag,ai,af,ac.data)}});var c=function(ad,ac,ae){L.call(this,ad,ac,ae);this.container_div.addClass("feature-track");this.summary_draw_height=30;this.slotters={};this.start_end_dct={};this.left_offset=200;this.set_painter_from_config()};o(c.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Block color",type:"color"},{key:"reverse_strand_color",label:"Antisense strand color",type:"color"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true,help:"Show the number of items in each bin when drawing summary histogram"},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"connector_style",label:"Connector style",type:"select",default_value:"fishbones",options:[{label:"Line with arrows",value:"fishbone"},{label:"Arcs",value:"arcs"}]},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.set_painter_from_config();this.request_draw({clear_tile_cache:true})},set_painter_from_config:function(){if(this.config.get_value("connector_style")==="arcs"){this.painter=J.ArcLinkedFeaturePainter}else{this.painter=J.LinkedFeaturePainter}},postdraw_actions:function(ao,af,aq,an){L.prototype.postdraw_actions.call(this,ao,af,aq,an);var ah=this,ai,am=ab.filter(ao,function(ar){return(ar instanceof K)});if(am.length===0){var ac={};ab.each(ab.pluck(ao,"incomplete_features"),function(ar){ab.each(ar,function(at){ac[at[0]]=at})});var ap=this;ab.each(ao,function(av){var aw=ab.omit(ac,ab.map(av.incomplete_features,function(ay){return ay[0]}));aw=ab.omit(aw,ab.keys(av.other_tiles_features_drawn));if(ab.size(aw)!==0){var at={data:ab.values(aw)},au=ap.view.canvas_manager.new_canvas(),ar=au.getContext("2d");au.height=Math.max(av.canvas.height,ap.get_canvas_height(at,av.mode,av.w_scale,100));au.width=av.canvas.width;ar.drawImage(av.canvas,0,0);ar.translate(ah.left_offset,0);var ax=ap.draw_tile(at,ar,av.mode,av.region,av.w_scale,av.seq_data);$(av.canvas).replaceWith($(ax.canvas));av.canvas=au;ab.extend(av.other_tiles_features_drawn,ac)}})}if(ah.filters_manager){var ag=ah.filters_manager.filters,ak;for(ak=0;ak<ag.length;ak++){ag[ak].update_ui_elt()}var aj=false,al,ae;for(ai=0;ai<ao.length;ai++){if(ao[ai].data.length){al=ao[ai].data[0];for(ak=0;ak<ag.length;ak++){ae=ag[ak];if(ae.applies_to(al)&&ae.min!==ae.max){aj=true;break}}}}if(ah.filters_available!==aj){ah.filters_available=aj;if(!ah.filters_available){ah.filters_manager.hide()}ah.update_icons()}}if(ao[0] instanceof M){var ad=true;for(ai=0;ai<ao.length;ai++){if(!ao[ai].all_slotted){ad=false;break}}this.action_icons.show_more_rows_icon.toggle(!ad)}else{this.action_icons.show_more_rows_icon.hide()}},update_auto_mode:function(ac){if(this.mode==="Auto"){if(ac==="no_detail"){ac="feature spans"}this.action_icons.mode_icon.attr("title","Set display mode (now: Auto/"+ac+")")}},incremental_slots:function(ag,ac,af){var ad=this.view.canvas_manager.dummy_context,ae=this.slotters[ag];if(!ae||(ae.mode!==af)){ae=new (s.FeatureSlotter)(ag,af,z,function(ah){return ad.measureText(ah)});this.slotters[ag]=ae}return ae.slot_features(ac)},get_mode:function(ac){if(ac.extra_info==="no_detail"||this.is_overview){mode="no_detail"}else{if(this.view.high-this.view.low>G){mode="Squish"}else{mode="Pack"}}return mode},get_canvas_height:function(ac,ag,ah,ad){if(ag==="Coverage"||ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var af=this.incremental_slots(ah,ac.data,ag);var ae=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return Math.max(this.min_height_px,ae.get_required_height(af,ad))}},draw_tile:function(an,at,aq,ag,ak,af,ao){var ar=this,ae=at.canvas,az=ag.get("start"),ad=ag.get("end"),ah=this.left_offset;if(an.dataset_type==="bigwig"){return this._draw_line_track_tile(an,at,aq,ag,ak)}var aj=[],ap=this.slotters[ak].slots;all_slotted=true;if(an.data){var al=this.filters_manager.filters;for(var au=0,aw=an.data.length;au<aw;au++){var ai=an.data[au];var av=false;var am;for(var ay=0,aD=al.length;ay<aD;ay++){am=al[ay];am.update_attrs(ai);if(!am.keep(ai)){av=true;break}}if(!av){aj.push(ai);if(!(ai[0] in ap)){all_slotted=false}}}}var aC=(this.filters_manager.alpha_filter?new C(this.filters_manager.alpha_filter):null),aA=(this.filters_manager.height_filter?new C(this.filters_manager.height_filter):null),aB=new (this.painter)(aj,az,ad,this.config.to_key_value_dict(),aq,aC,aA,af,function(aE){return ar.view.get_base_color(aE)});var ax=null;at.fillStyle=this.config.get_value("block_color");at.font=at.canvas.manager.default_font;at.textAlign="right";if(an.data){var ac=aB.draw(at,ae.width,ae.height,ak,ap);ax=ac.feature_mapper;incomplete_features=ac.incomplete_features;ax.translation=-ah}if(!ao){return new M(ar,ag,ak,ae,an.data,aq,an.message,all_slotted,ax,incomplete_features,af)}}});var Z=function(ad,ac,ae){L.call(this,ad,ac,ae);this.painter=J.VariantPainter;this.summary_draw_height=30;this.left_offset=30};o(Z.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Histogram color",type:"color"},{key:"show_sample_data",label:"Show sample data",type:"bool",default_value:true},{key:"show_labels",label:"Show summary and sample labels",type:"bool",default_value:true},{key:"summary_height",label:"Locus summary height",type:"float",default_value:20},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,af,ah,ag,ai){if(ac.dataset_type==="bigwig"){return this._draw_line_track_tile(ac,af,"Histogram",ag,ai)}else{var ae=this.view,ad=new (this.painter)(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah,function(aj){return ae.get_base_color(aj)});ad.draw(af,af.canvas.width,af.canvas.height,ai);return new b(this,ag,ai,af.canvas,ac.data)}},get_canvas_height:function(ac,ag,ah,ae){if(ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var ad=(this.dataset.get_metadata("sample_names")?this.dataset.get_metadata("sample_names").length:0);if(ad===0&&ac.data.length!==0){ad=ac.data[0][7].match(/,/g);if(ad===null){ad=1}else{ad=ad.length+1}}var af=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return af.get_required_height(ad)}},predraw_init:function(){var ac=[f.prototype.predraw_init.call(this)];if(!this.dataset.get_metadata("sample_names")){ac.push(this.dataset.fetch())}return ac},postdraw_actions:function(ag,ah,aj,ad){L.prototype.postdraw_actions.call(this,ag,ah,aj,ad);var af=ab.filter(ag,function(ak){return(ak instanceof K)});var ae=this.dataset.get_metadata("sample_names");if(af.length===0&&this.config.get_value("show_labels")&&ae&&ae.length>1){var ac;if(this.container_div.find(".yaxislabel.variant").length===0){ac=this.config.get_value("summary_height")/2;this.tiles_div.prepend($("<div/>").text("Summary").addClass("yaxislabel variant top").css({"font-size":ac+"px",top:(this.config.get_value("summary_height")-ac)/2+"px"}));if(this.config.get_value("show_sample_data")){var ai=ae.join("<br/>");this.tiles_div.prepend($("<div/>").html(ai).addClass("yaxislabel variant top sample").css({top:this.config.get_value("summary_height")}))}}ac=(this.mode==="Squish"?5:10)+"px";$(this.tiles_div).find(".sample").css({"font-size":ac,"line-height":ac});$(this.tiles_div).find(".yaxislabel").css("color",this.config.get_value("label_color"))}else{this.container_div.find(".yaxislabel.variant").remove()}}});var S=function(ad,ac,ae){c.call(this,ad,ac,ae);this.painter=J.ReadPainter;this.update_icons()};o(S.prototype,p.prototype,L.prototype,c.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Histogram color",type:"color"},{key:"detail_block_color",label:"Sense strand block color",type:"color",default_value:"#AAAAAA"},{key:"reverse_strand_color",label:"Antisense strand block color",type:"color",default_value:"#DDDDDD"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})}});var d={CompositeTrack:e,DrawableGroup:N,DiagonalHeatmapTrack:r,FeatureTrack:c,LineTrack:g,ReadTrack:S,VariantTrack:Z,VcfTrack:Z};var n=function(ae,ad,ac){if("copy" in ae){return ae.copy(ac)}else{var af=ae.obj_type;if(!af){af=ae.track_type}return new d[af](ad,ac,ae)}};return{TracksterView:Y,DrawableGroup:N,LineTrack:g,FeatureTrack:c,DiagonalHeatmapTrack:r,ReadTrack:S,VariantTrack:Z,CompositeTrack:e,object_from_template:n}});
\ No newline at end of file
diff -r 8a80483f4a571ea66c0c397bcc367b2e8e4d52df -r 283f3be266eab2951f04cda8204fc24af22983ca static/scripts/viz/trackster/tracks.js
--- a/static/scripts/viz/trackster/tracks.js
+++ b/static/scripts/viz/trackster/tracks.js
@@ -1021,7 +1021,7 @@
d.current_x = d.offsetX;
var delta_chrom = Math.round(delta / view.viewport_container.width() * (view.high - view.low));
view.move_delta(delta_chrom);
- })
+ });
/*
FIXME: Do not do this for now because it's too jittery. Some kind of gravity approach is
needed here because moving left/right should be difficult.
@@ -1600,7 +1600,7 @@
// Restore tool visibility from state; default to hidden.
var hidden = true;
if (options.tool_state !== undefined && options.tool_state.hidden !== undefined) {
- hidden = options.tool_state.hidden
+ hidden = options.tool_state.hidden;
}
this.set('hidden', hidden);
@@ -2756,22 +2756,22 @@
this.tiles_div.children().addClass("remove");
var
+ // Tile width in bases.
+ tile_width = Math.floor(TILE_SIZE * resolution),
// Index of first tile that overlaps visible region.
- tile_index = Math.floor( low / (resolution * TILE_SIZE) ),
- // Base that first tile starts with.
- tile_low = Math.floor(tile_index * TILE_SIZE * resolution),
+ tile_index = Math.floor(low / tile_width),
tile_region,
tile_promise,
tile_promises = [],
tiles = [];
// Draw tiles.
- while ( ( tile_index * TILE_SIZE * resolution ) < high ) {
+ while ( (tile_index * tile_width) < high ) {
// Get tile region.
tile_region = new visualization.GenomeRegion({
chrom: this.view.chrom,
- start: tile_low,
+ start: tile_index * tile_width,
// Tile high cannot be larger than view.max_high, which the chromosome length.
- end: Math.min( tile_low + Math.ceil( TILE_SIZE * resolution ), this.view.max_high )
+ end: Math.min( (tile_index + 1) * tile_width, this.view.max_high)
});
tile_promise = this.draw_helper(tile_region, w_scale, options);
tile_promises.push(tile_promise);
@@ -2781,7 +2781,6 @@
// Go to next tile.
tile_index += 1;
- tile_low = tile_region.get('end');
}
// Step (c) for (re)moving tiles when clear_after is false.
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/3ba68bb089e1/
Changeset: 3ba68bb089e1
User: dannon
Date: 2014-08-06 16:16:22
Summary: Fix for conditionally using bucket_default in cloudlaunch.
Affected #: 1 file
diff -r 33c032a19f9af4549a5dfa7a55df7883117b4ea8 -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 lib/galaxy/webapps/galaxy/controllers/cloudlaunch.py
--- a/lib/galaxy/webapps/galaxy/controllers/cloudlaunch.py
+++ b/lib/galaxy/webapps/galaxy/controllers/cloudlaunch.py
@@ -70,10 +70,18 @@
cfg = cloudman.CloudManConfig(key_id, secret, cluster_name, ami,
instance_type, password, placement=zone)
cml = cloudman.launch.CloudManLauncher(key_id, secret)
- result = cml.launch(cluster_name, ami, instance_type, password,
- cfg.kernel_id, cfg.ramdisk_id, cfg.key_name,
- cfg.security_groups, cfg.placement,
- bucket_default=bucket_default)
+ # This should probably be handled better on the bioblend side, but until
+ # an egg update can be made, this needs to conditionally include the
+ # parameter or not, even if the value is None.
+ if bucket_default:
+ result = cml.launch(cluster_name, ami, instance_type, password,
+ cfg.kernel_id, cfg.ramdisk_id, cfg.key_name,
+ cfg.security_groups, cfg.placement,
+ bucket_default=bucket_default)
+ else:
+ result = cml.launch(cluster_name, ami, instance_type, password,
+ cfg.kernel_id, cfg.ramdisk_id, cfg.key_name,
+ cfg.security_groups, cfg.placement)
# result is a dict with sg_names, kp_name, kp_material, rs, and instance_id
if not result['rs']:
trans.response.status = 400
https://bitbucket.org/galaxy/galaxy-central/commits/08d1eb86cd6f/
Changeset: 08d1eb86cd6f
User: dannon
Date: 2014-08-06 16:16:55
Summary: Merge.
Affected #: 30 files
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a static/scripts/mvc/citation/citation-model.js
--- a/static/scripts/mvc/citation/citation-model.js
+++ b/static/scripts/mvc/citation/citation-model.js
@@ -37,7 +37,8 @@
var BaseCitationCollection = Backbone.Collection.extend( baseMVC.LoggableMixin ).extend( {
/** root api url */
urlRoot : galaxy_config.root + 'api',
- model : Citation
+ partial : true, // Assume some tools in history/workflow may not be properly annotated yet.
+ model : Citation,
} );
var HistoryCitationCollection = BaseCitationCollection.extend( {
@@ -51,7 +52,8 @@
/** complete api url */
url : function() {
return this.urlRoot + '/tools/' + this.tool_id + '/citations';
- }
+ },
+ partial : false, // If a tool has citations, assume they are complete.
} );
//==============================================================================
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a static/scripts/mvc/citation/citation-view.js
--- a/static/scripts/mvc/citation/citation-view.js
+++ b/static/scripts/mvc/citation/citation-view.js
@@ -120,7 +120,7 @@
},
render: function() {
- this.$el.html(this.citationsElement);
+ this.$el.html(this.citationsElement());
this.collection.each(function( item ){
this.renderCitation( item );
}, this);
@@ -142,29 +142,40 @@
this.$(".citations-formatted").show();
},
- citationsElement: [
- '<div class="toolForm">',
- '<div class="toolFormTitle">',
- _l("Citations"),
- ' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',
- ' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',
- '</div>',
- '<div class="toolFormBody" style="padding:5px 10px">',
- '<div style="padding:5px 10px">',
- '<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate',
- ' citations explicitly at this time. When writing up your analysis, please manually',
- ' review your histories and find all references',
- ' that should be cited in order to completely describe your work. Also, please remember to',
- ' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',
- '</div>',
- '<span class="citations-formatted"></span>',
- '</div>',
- '<div class="citations-bibtex toolFormBody" style="padding:5px 10px">',
- '<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',
- '</div>',
- '</div>'
- ].join( '' )
+ partialWarningElement: function() {
+ if( this.collection.partial ) {
+ return [
+ '<div style="padding:5px 10px">',
+ '<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate',
+ ' citations explicitly at this time. When writing up your analysis, please manually',
+ ' review your histories and find all references',
+ ' that should be cited in order to completely describe your work. Also, please remember to',
+ ' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',
+ '</div>',
+ ].join('');
+ } else {
+ return '';
+ }
+ },
+ citationsElement: function() {
+ return [
+ '<div class="toolForm">',
+ '<div class="toolFormTitle">',
+ _l("Citations"),
+ ' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',
+ ' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',
+ '</div>',
+ '<div class="toolFormBody" style="padding:5px 10px">',
+ this.partialWarningElement(),
+ '<span class="citations-formatted"></span>',
+ '</div>',
+ '<div class="citations-bibtex toolFormBody" style="padding:5px 10px">',
+ '<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',
+ '</div>',
+ '</div>'
+ ].join( '' );
+ }
});
//==============================================================================
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a static/scripts/packed/mvc/citation/citation-model.js
--- a/static/scripts/packed/mvc/citation/citation-model.js
+++ b/static/scripts/packed/mvc/citation/citation-model.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","utils/localization"],function(a,e){var f=Backbone.Model.extend(a.LoggableMixin).extend({initialize:function(){var g=this.attributes.content;var h=new BibtexParser(g).entries[0];this.entry=h},entryType:function(){return this.entry.EntryType},fields:function(){return this.entry.Fields}});var b=Backbone.Collection.extend(a.LoggableMixin).extend({urlRoot:galaxy_config.root+"api",model:f});var d=b.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}});var c=b.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"}});return{Citation:f,HistoryCitationCollection:d,ToolCitationCollection:c}});
\ No newline at end of file
+define(["mvc/base-mvc","utils/localization"],function(a,e){var f=Backbone.Model.extend(a.LoggableMixin).extend({initialize:function(){var g=this.attributes.content;var h=new BibtexParser(g).entries[0];this.entry=h},entryType:function(){return this.entry.EntryType},fields:function(){return this.entry.Fields}});var b=Backbone.Collection.extend(a.LoggableMixin).extend({urlRoot:galaxy_config.root+"api",partial:true,model:f,});var d=b.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}});var c=b.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"},partial:false,});return{Citation:f,HistoryCitationCollection:d,ToolCitationCollection:c}});
\ No newline at end of file
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a static/scripts/packed/mvc/citation/citation-view.js
--- a/static/scripts/packed/mvc/citation/citation-view.js
+++ b/static/scripts/packed/mvc/citation/citation-view.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return f?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement);this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},citationsElement:['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">','<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
+define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return f?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/genebed_maf_to_fasta.xml
--- a/tools/maf/genebed_maf_to_fasta.xml
+++ b/tools/maf/genebed_maf_to_fasta.xml
@@ -1,5 +1,8 @@
<tool id="GeneBed_Maf_Fasta2" name="Stitch Gene blocks" version="1.0.1"><description>given a set of coding exon intervals</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">
#if $maf_source_type.maf_source == "user" #interval_maf_to_merged_fasta.py --dbkey=$dbkey --species=$maf_source_type.species --mafSource=$maf_source_type.maf_file --mafIndex=$maf_source_type.maf_file.metadata.maf_index --interval_file=$input1 --output_file=$out_file1 --mafSourceType=$maf_source_type.maf_source --geneBED --mafIndexFileDir=${GALAXY_DATA_INDEX_DIR}
#else #interval_maf_to_merged_fasta.py --dbkey=$dbkey --species=$maf_source_type.species --mafSource=$maf_source_type.maf_identifier --interval_file=$input1 --output_file=$out_file1 --mafSourceType=$maf_source_type.maf_source --geneBED --mafIndexFileDir=${GALAXY_DATA_INDEX_DIR}
@@ -87,12 +90,7 @@
* stitches blocks together and resolves overlaps based on alignment score;
* outputs alignments in FASTA format.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/interval2maf.xml
--- a/tools/maf/interval2maf.xml
+++ b/tools/maf/interval2maf.xml
@@ -1,5 +1,8 @@
<tool id="Interval2Maf1" name="Extract MAF blocks" version="1.0.1"><description>given a set of genomic intervals</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">
#if $maf_source_type.maf_source == "user" #interval2maf.py --dbkey=${input1.dbkey} --chromCol=${input1.metadata.chromCol} --startCol=${input1.metadata.startCol} --endCol=${input1.metadata.endCol} --strandCol=${input1.metadata.strandCol} --mafFile=$maf_source_type.mafFile --mafIndex=$maf_source_type.mafFile.metadata.maf_index --interval_file=$input1 --output_file=$out_file1 --mafIndexFile=${GALAXY_DATA_INDEX_DIR}/maf_index.loc --species=$maf_source_type.species
#else #interval2maf.py --dbkey=${input1.dbkey} --chromCol=${input1.metadata.chromCol} --startCol=${input1.metadata.startCol} --endCol=${input1.metadata.endCol} --strandCol=${input1.metadata.strandCol} --mafType=$maf_source_type.mafType --interval_file=$input1 --output_file=$out_file1 --mafIndexFile=${GALAXY_DATA_INDEX_DIR}/maf_index.loc --species=$maf_source_type.species
@@ -283,12 +286,7 @@
s species2.chr1 129723925 79 + 229575298 ATGGCGTCGGCCTCCTCCGGGCCGTCGTCTTCGGTCGGTTTTTCATCCTTTGATCCCGCGGTCCCTTCCTGTACCTC------AG
s species3.chr3 68255714 76 - 258222147 ATGGCGTCCGCCTCCTCAGGGCCAGCGGC---GGCGGGGTTTTCACCCCTTGATTCCGGGGTCCCTGCCGGTACCGC------AG
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/interval2maf_pairwise.xml
--- a/tools/maf/interval2maf_pairwise.xml
+++ b/tools/maf/interval2maf_pairwise.xml
@@ -1,5 +1,8 @@
<tool id="Interval2Maf_pairwise1" name="Extract Pairwise MAF blocks" version="1.0.1"><description>given a set of genomic intervals</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">interval2maf.py --dbkey=${input1.dbkey} --chromCol=${input1.metadata.chromCol} --startCol=${input1.metadata.startCol} --endCol=${input1.metadata.endCol} --strandCol=${input1.metadata.strandCol} --mafType=$mafType --interval_file=$input1 --output_file=$out_file1 --indexLocation=${GALAXY_DATA_INDEX_DIR}/maf_pairwise.loc</command><inputs><param name="input1" type="data" format="interval" label="Interval File">
@@ -39,12 +42,7 @@
.. image:: ${static_path}/images/maf_icons/interval2maf.png
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/interval_maf_to_merged_fasta.xml
--- a/tools/maf/interval_maf_to_merged_fasta.xml
+++ b/tools/maf/interval_maf_to_merged_fasta.xml
@@ -1,5 +1,8 @@
<tool id="Interval_Maf_Merged_Fasta2" name="Stitch MAF blocks" version="1.0.1"><description>given a set of genomic intervals</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">
#if $maf_source_type.maf_source == "user" #interval_maf_to_merged_fasta.py --dbkey=$dbkey --species=$maf_source_type.species --mafSource=$maf_source_type.maf_file --mafIndex=$maf_source_type.maf_file.metadata.maf_index --interval_file=$input1 --output_file=$out_file1 --chromCol=${input1.metadata.chromCol} --startCol=${input1.metadata.startCol} --endCol=${input1.metadata.endCol} --strandCol=${input1.metadata.strandCol} --mafSourceType=$maf_source_type.maf_source --mafIndexFileDir=${GALAXY_DATA_INDEX_DIR}
#else #interval_maf_to_merged_fasta.py --dbkey=$dbkey --species=$maf_source_type.species --mafSource=$maf_source_type.maf_identifier --interval_file=$input1 --output_file=$out_file1 --chromCol=${input1.metadata.chromCol} --startCol=${input1.metadata.startCol} --endCol=${input1.metadata.endCol} --strandCol=${input1.metadata.strandCol} --mafSourceType=$maf_source_type.maf_source --mafIndexFileDir=${GALAXY_DATA_INDEX_DIR}
@@ -103,12 +106,7 @@
.. image:: ${static_path}/images/maf_icons/stitchMaf.png
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/macros.xml
--- /dev/null
+++ b/tools/maf/macros.xml
@@ -0,0 +1,16 @@
+<macros>
+ <token name="@HELP_CITATIONS@">
+------
+
+**Citation**
+
+If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
+
+
+ </token>
+ <xml name="citations">
+ <citations>
+ <citation type="doi">10.1093/bioinformatics/btr398</citation>
+ </citations>
+ </xml>
+</macros>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/maf_by_block_number.xml
--- a/tools/maf/maf_by_block_number.xml
+++ b/tools/maf/maf_by_block_number.xml
@@ -1,5 +1,8 @@
<tool id="maf_by_block_number1" name="Extract MAF by block number" version="1.0.1"><description>given a set of block numbers and a MAF file</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_by_block_number.py $input1 $input2 $out_file1 $block_col $species</command><inputs><param format="txt" name="input1" type="data" label="Block Numbers"/>
@@ -29,12 +32,7 @@
This tool takes a list of block numbers, one per line, and extracts the corresponding MAF blocks from the provided file. Block numbers start at 0.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/maf_filter.xml
--- a/tools/maf/maf_filter.xml
+++ b/tools/maf/maf_filter.xml
@@ -1,5 +1,8 @@
<tool id="MAF_filter" name="Filter MAF" version="1.0.1"><description>by specified attributes</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_filter.py $maf_filter_file $input1 $out_file1 $out_file1.files_path $species $min_size $max_size $min_species_per_block $exclude_incomplete_blocks ${input1.metadata.species}</command><inputs><page>
@@ -191,12 +194,7 @@
You can also provide a size range and limit your output to the MAF blocks which fall within the specified range.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
-</help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/maf_limit_size.xml
--- a/tools/maf/maf_limit_size.xml
+++ b/tools/maf/maf_limit_size.xml
@@ -1,5 +1,8 @@
<tool id="maf_limit_size1" name="Filter MAF blocks" version="1.0.1"><description>by Size</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_limit_size.py $input1 $out_file1 $min_size $max_size</command><inputs><page>
@@ -25,12 +28,7 @@
This tool takes a MAF file and a size range and extracts the MAF blocks which fall within the specified range.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/maf_limit_to_species.xml
--- a/tools/maf/maf_limit_to_species.xml
+++ b/tools/maf/maf_limit_to_species.xml
@@ -1,5 +1,8 @@
<tool id="MAF_Limit_To_Species1" name="Filter MAF blocks"><description>by Species</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_limit_to_species.py $species $input1 $out_file1 $allow_partial $min_species</command><inputs><param name="input1" type="data" format="maf" label="MAF file"/>
@@ -39,13 +42,8 @@
* **Exclude blocks with have only one species** - if this option is set to **YES** all single sequence alignment blocks WILL NOT be returned.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/maf_reverse_complement.xml
--- a/tools/maf/maf_reverse_complement.xml
+++ b/tools/maf/maf_reverse_complement.xml
@@ -1,5 +1,8 @@
<tool id="MAF_Reverse_Complement_1" name="Reverse Complement" version="1.0.1"><description>a MAF file</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_reverse_complement.py $input1 $out_file1 $species</command><inputs><page>
@@ -42,12 +45,7 @@
s panTro1.chr6 31691510 58 - 161576975 CCTCTTCCACTATAGACCTCCTTAAACAAAATAATGAAAAACGAATAAACCACAAATT
s mm5.chr6 120816549 54 - 149721531 CCTCTTCCACTGAGGAATTTCTTTTTTTAAATGATGAGCAATCAATGAAACG----TT
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/maf_split_by_species.xml
--- a/tools/maf/maf_split_by_species.xml
+++ b/tools/maf/maf_split_by_species.xml
@@ -1,5 +1,8 @@
<tool id="MAF_split_blocks_by_species1" name="Split MAF blocks" version="1.0.0"><description>by Species</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_split_by_species.py $input1 $out_file1 $collapse_columns</command><inputs><param format="maf" name="input1" type="data" label="MAF file to split"/>
@@ -211,13 +214,8 @@
- An "i" line containing information about what is in the aligned species DNA before and after the immediately preceding "s" line;
- An "e" line containing information about the size of the gap between the alignments that span the current block.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
+@HELP_CITATIONS@
</help>
+ <expand macro="citations" /></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/maf_stats.xml
--- a/tools/maf/maf_stats.xml
+++ b/tools/maf/maf_stats.xml
@@ -1,5 +1,8 @@
<tool id="maf_stats1" name="MAF Coverage Stats" version="1.0.1"><description>Alignment coverage information</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">
maf_stats.py
#if $maf_source_type.maf_source == "user":
@@ -109,12 +112,7 @@
where **coverage** is the number of nucleotides divided by the total length of the provided intervals.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/maf_thread_for_species.xml
--- a/tools/maf/maf_thread_for_species.xml
+++ b/tools/maf/maf_thread_for_species.xml
@@ -1,5 +1,8 @@
<tool id="MAF_Thread_For_Species1" name="Join MAF blocks"><description>by Species</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_thread_for_species.py $input1 $out_file1 $species</command><inputs><param format="maf" name="input1" type="data" label="MAF file"/>
@@ -48,13 +51,9 @@
s hg17.chr7 127471195 389 + 158628139 gtttgccatcttttgctgctctagggaatccagcagctgtcaccatgtaaacaagcccaggctagaccaGTTACCCTCATCATCTTAGCTGATAGCCAGCCAGCCACCACAGGCAtgagtcaggccatattgctggacccacagaattatgagctaaataaatagtcttgggttaagccactaagttttaggcatagtgtgttatgtaTCTCACAAACATATAAGACTGTGTGTTTGTTGACTGGAGGAAGAGATGCTATAAAGACCACCTTTTAAAACTTCCCAAATACTGCCACTGATGTCCTGATGGAGGTATGAAAACATCCACTAAAATTTGTGGTTTATTCATTTTTCATTATTTTGTTTAAGGAGGTCTATAGTGGAAGAGG
s panTro1.chr6 129885076 389 + 161576975 gtttgccatcttttgctgctcttgggaatccagcagctgtcaccatgtaaacaagcccaggctagaccaGTTACCCTCATCATCTTAGCTGATAGCCAGCCAGCCACCACAGGCAtgagtcaggccatattgctggacccacagaattatgagctaaataaatagtcttgggttaagccactaagttttaggcatagtgtgttatgtaTCTCACAAACATATAAGACTGTGTGTTTGTTGACTGGAGGAAGAGATGCTATAAAGACCACCTTTTGAAACTTCCCAAATACTGCCACTGATGTCCTGATGGAGGTATGAAAACATCCACTAAAATTTGTGGTTTATTCGTTTTTCATTATTTTGTTTAAGGAGGTCTATAGTGGAAGAGG
-------
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" />
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/maf_to_bed.xml
--- a/tools/maf/maf_to_bed.xml
+++ b/tools/maf/maf_to_bed.xml
@@ -1,5 +1,8 @@
<tool id="MAF_To_BED1" name="MAF to BED" force_history_refresh="True"><description>Converts a MAF formatted file to the BED format</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_to_bed.py "${ input1 }" "${ out_file1 }" "${ species }" "${ complete_blocks }" "." "${ out_file1.id }"</command><inputs><param format="maf" name="input1" type="data" label="MAF file to convert"/>
@@ -123,14 +126,9 @@
5. score - A score between 0 and 1000.
6. strand - Defines the strand - either '+' or '-'.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
+@HELP_CITATIONS@
</help>
+ <expand macro="citations" /><code file="maf_to_bed_code.py"/></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/maf_to_fasta.xml
--- a/tools/maf/maf_to_fasta.xml
+++ b/tools/maf/maf_to_fasta.xml
@@ -1,5 +1,8 @@
<tool id="MAF_To_Fasta1" name="MAF to FASTA" version="1.0.1"><description>Converts a MAF formatted file to FASTA format</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">
#if $fasta_target_type.fasta_type == "multiple" #maf_to_fasta_multiple_sets.py $input1 $out_file1 $fasta_target_type.species $fasta_target_type.complete_blocks
#else #maf_to_fasta_concat.py $fasta_target_type.species $input1 $out_file1
@@ -188,12 +191,7 @@
- An "i" line containing information about what is in the aligned species DNA before and after the immediately preceding "s" line;
- An "e" line containing information about the size of the gap between the alignments that span the current block.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/maf_to_interval.xml
--- a/tools/maf/maf_to_interval.xml
+++ b/tools/maf/maf_to_interval.xml
@@ -1,5 +1,8 @@
<tool id="MAF_To_Interval1" name="MAF to Interval" force_history_refresh="True"><description>Converts a MAF formatted file to the Interval format</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_to_interval.py "${ input1 }" "${ out_file1 }" "${ out_file1.id }" "." "${ input1.dbkey }" "${ species }" "${ input1.metadata.species }" "${ complete_blocks }" "${ remove_gaps }"</command><inputs><param format="maf" name="input1" type="data" label="MAF file to convert"/>
@@ -121,13 +124,8 @@
- An "i" line containing information about what is in the aligned species DNA before and after the immediately preceding "s" line;
- An "e" line containing information about the size of the gap between the alignments that span the current block.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
+@HELP_CITATIONS@
</help>
+ <expand macro="citations" /></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/maf/vcf_to_maf_customtrack.xml
--- a/tools/maf/vcf_to_maf_customtrack.xml
+++ b/tools/maf/vcf_to_maf_customtrack.xml
@@ -1,5 +1,8 @@
<tool id="vcf_to_maf_customtrack1" name="VCF to MAF Custom Track"><description>for display at UCSC</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">vcf_to_maf_customtrack.py '$out_file1'
#if $vcf_source_type.vcf_file
'${vcf_source_type.vcf_file[0].vcf_input.dbkey}'
@@ -121,12 +124,8 @@
s CHB+JPT_1.5 0 1 + 1 *------
s CHB+JPT_2.5 0 7 + 7 *GGA***
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
+@HELP_CITATIONS@
</help>
+ <expand macro="citations" /></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/phenotype_association/beam.xml
--- a/tools/phenotype_association/beam.xml
+++ b/tools/phenotype_association/beam.xml
@@ -134,4 +134,8 @@
Submitted.
</help>
+ <citations>
+ <citation type="doi">10.1038/ng2110</citation>
+ <citation type="doi">10.1214/11-AOAS469</citation>
+ </citations></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/phenotype_association/gpass.xml
--- a/tools/phenotype_association/gpass.xml
+++ b/tools/phenotype_association/gpass.xml
@@ -109,4 +109,7 @@
Submitted.
</help>
+ <citations>
+ <citation type="doi">10.1198/jasa.2011.ap10657</citation>
+ </citations></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/phenotype_association/ldtools.xml
--- a/tools/phenotype_association/ldtools.xml
+++ b/tools/phenotype_association/ldtools.xml
@@ -108,4 +108,7 @@
Am J Hum Genet. 74(1):106-20. Epub 2003 Dec 15.
</help>
+ <citations>
+ <citation type="doi">10.1086/381000</citation>
+ </citations></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/phenotype_association/linkToDavid.xml
--- a/tools/phenotype_association/linkToDavid.xml
+++ b/tools/phenotype_association/linkToDavid.xml
@@ -107,4 +107,8 @@
Genome Biol. 4(5):P3. Epub 2003 Apr 3.
</help>
+ <citations>
+ <citation type="doi">10.1038/nprot.2008.211</citation>
+ <citation type="doi">10.1186/gb-2003-4-5-p3</citation>
+ </citations></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/phenotype_association/linkToGProfile.xml
--- a/tools/phenotype_association/linkToGProfile.xml
+++ b/tools/phenotype_association/linkToGProfile.xml
@@ -87,4 +87,7 @@
Nucleic Acids Res. 35(Web Server issue):W193-200. Epub 2007 May 3.
</help>
+ <citations>
+ <citation type="doi">10.1093/nar/gkm226</citation>
+ </citations></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/phenotype_association/lps.xml
--- a/tools/phenotype_association/lps.xml
+++ b/tools/phenotype_association/lps.xml
@@ -301,4 +301,18 @@
--></help>
+ <citations>
+ <citation type="bibtex">@ARTICLE{Kim07aninterior-point,
+ author = {Seung-jean Kim and Kwangmoo Koh and Michael Lustig and Stephen Boyd and Dimitry Gorinevsky},
+ title = {An interior-point method for large-scale l1-regularized logistic regression},
+ journal = {Journal of Machine Learning Research},
+ year = {2007},
+ volume = {2007}
+}</citation>
+ <citation type="bibtex">@MISC{Shi08lasso-patternsearchalgorithm,
+ author = {Weiliang Shi and Grace Wahba and Stephen Wright and Kristine Lee and Ronald Klein and Barbara Klein},
+ title = { LASSO-Patternsearch Algorithm with Application to Ophthalmology and Genomic Data},
+ year = {2008}
+}</citation>
+ </citations></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/phenotype_association/pass.xml
--- a/tools/phenotype_association/pass.xml
+++ b/tools/phenotype_association/pass.xml
@@ -123,4 +123,8 @@
Submitted.
</help>
+ <citations>
+ <citation type="doi">10.1093/bioinformatics/btn549</citation>
+ <citation type="doi">10.1093/bioinformatics/btq379</citation>
+ </citations></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/phenotype_association/sift.xml
--- a/tools/phenotype_association/sift.xml
+++ b/tools/phenotype_association/sift.xml
@@ -171,4 +171,10 @@
Nat Protoc. 4(7):1073-81. Epub 2009 Jun 25.
</help>
+ <citations>
+ <citation type="doi">10.1101/gr.176601</citation>
+ <citation type="doi">10.1101/gr.212802</citation>
+ <citation type="doi">10.1093/nar/gkg509</citation>
+ <citation type="doi">10.1038/nprot.2009.86</citation>
+ </citations></tool>
diff -r 3ba68bb089e15a393724db39e2a2ed1d25d2f579 -r 08d1eb86cd6f9f519880bce2a17b651be2bc928a tools/plotting/boxplot.xml
--- a/tools/plotting/boxplot.xml
+++ b/tools/plotting/boxplot.xml
@@ -105,4 +105,7 @@
</help>
+ <citations>
+ <citation type="doi">10.1093/bioinformatics/btq281</citation>
+ </citations></tool>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/60f63d6d4cb7/
Changeset: 60f63d6d4cb7
User: jmchilton
Date: 2014-08-06 15:41:38
Summary: Add annotated citations for MAF tools.
Add macro file to centralize this and in help citation description as well.
Affected #: 17 files
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/genebed_maf_to_fasta.xml
--- a/tools/maf/genebed_maf_to_fasta.xml
+++ b/tools/maf/genebed_maf_to_fasta.xml
@@ -1,5 +1,8 @@
<tool id="GeneBed_Maf_Fasta2" name="Stitch Gene blocks" version="1.0.1"><description>given a set of coding exon intervals</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">
#if $maf_source_type.maf_source == "user" #interval_maf_to_merged_fasta.py --dbkey=$dbkey --species=$maf_source_type.species --mafSource=$maf_source_type.maf_file --mafIndex=$maf_source_type.maf_file.metadata.maf_index --interval_file=$input1 --output_file=$out_file1 --mafSourceType=$maf_source_type.maf_source --geneBED --mafIndexFileDir=${GALAXY_DATA_INDEX_DIR}
#else #interval_maf_to_merged_fasta.py --dbkey=$dbkey --species=$maf_source_type.species --mafSource=$maf_source_type.maf_identifier --interval_file=$input1 --output_file=$out_file1 --mafSourceType=$maf_source_type.maf_source --geneBED --mafIndexFileDir=${GALAXY_DATA_INDEX_DIR}
@@ -87,12 +90,7 @@
* stitches blocks together and resolves overlaps based on alignment score;
* outputs alignments in FASTA format.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/interval2maf.xml
--- a/tools/maf/interval2maf.xml
+++ b/tools/maf/interval2maf.xml
@@ -1,5 +1,8 @@
<tool id="Interval2Maf1" name="Extract MAF blocks" version="1.0.1"><description>given a set of genomic intervals</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">
#if $maf_source_type.maf_source == "user" #interval2maf.py --dbkey=${input1.dbkey} --chromCol=${input1.metadata.chromCol} --startCol=${input1.metadata.startCol} --endCol=${input1.metadata.endCol} --strandCol=${input1.metadata.strandCol} --mafFile=$maf_source_type.mafFile --mafIndex=$maf_source_type.mafFile.metadata.maf_index --interval_file=$input1 --output_file=$out_file1 --mafIndexFile=${GALAXY_DATA_INDEX_DIR}/maf_index.loc --species=$maf_source_type.species
#else #interval2maf.py --dbkey=${input1.dbkey} --chromCol=${input1.metadata.chromCol} --startCol=${input1.metadata.startCol} --endCol=${input1.metadata.endCol} --strandCol=${input1.metadata.strandCol} --mafType=$maf_source_type.mafType --interval_file=$input1 --output_file=$out_file1 --mafIndexFile=${GALAXY_DATA_INDEX_DIR}/maf_index.loc --species=$maf_source_type.species
@@ -283,12 +286,7 @@
s species2.chr1 129723925 79 + 229575298 ATGGCGTCGGCCTCCTCCGGGCCGTCGTCTTCGGTCGGTTTTTCATCCTTTGATCCCGCGGTCCCTTCCTGTACCTC------AG
s species3.chr3 68255714 76 - 258222147 ATGGCGTCCGCCTCCTCAGGGCCAGCGGC---GGCGGGGTTTTCACCCCTTGATTCCGGGGTCCCTGCCGGTACCGC------AG
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/interval2maf_pairwise.xml
--- a/tools/maf/interval2maf_pairwise.xml
+++ b/tools/maf/interval2maf_pairwise.xml
@@ -1,5 +1,8 @@
<tool id="Interval2Maf_pairwise1" name="Extract Pairwise MAF blocks" version="1.0.1"><description>given a set of genomic intervals</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">interval2maf.py --dbkey=${input1.dbkey} --chromCol=${input1.metadata.chromCol} --startCol=${input1.metadata.startCol} --endCol=${input1.metadata.endCol} --strandCol=${input1.metadata.strandCol} --mafType=$mafType --interval_file=$input1 --output_file=$out_file1 --indexLocation=${GALAXY_DATA_INDEX_DIR}/maf_pairwise.loc</command><inputs><param name="input1" type="data" format="interval" label="Interval File">
@@ -39,12 +42,7 @@
.. image:: ${static_path}/images/maf_icons/interval2maf.png
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/interval_maf_to_merged_fasta.xml
--- a/tools/maf/interval_maf_to_merged_fasta.xml
+++ b/tools/maf/interval_maf_to_merged_fasta.xml
@@ -1,5 +1,8 @@
<tool id="Interval_Maf_Merged_Fasta2" name="Stitch MAF blocks" version="1.0.1"><description>given a set of genomic intervals</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">
#if $maf_source_type.maf_source == "user" #interval_maf_to_merged_fasta.py --dbkey=$dbkey --species=$maf_source_type.species --mafSource=$maf_source_type.maf_file --mafIndex=$maf_source_type.maf_file.metadata.maf_index --interval_file=$input1 --output_file=$out_file1 --chromCol=${input1.metadata.chromCol} --startCol=${input1.metadata.startCol} --endCol=${input1.metadata.endCol} --strandCol=${input1.metadata.strandCol} --mafSourceType=$maf_source_type.maf_source --mafIndexFileDir=${GALAXY_DATA_INDEX_DIR}
#else #interval_maf_to_merged_fasta.py --dbkey=$dbkey --species=$maf_source_type.species --mafSource=$maf_source_type.maf_identifier --interval_file=$input1 --output_file=$out_file1 --chromCol=${input1.metadata.chromCol} --startCol=${input1.metadata.startCol} --endCol=${input1.metadata.endCol} --strandCol=${input1.metadata.strandCol} --mafSourceType=$maf_source_type.maf_source --mafIndexFileDir=${GALAXY_DATA_INDEX_DIR}
@@ -103,12 +106,7 @@
.. image:: ${static_path}/images/maf_icons/stitchMaf.png
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/macros.xml
--- /dev/null
+++ b/tools/maf/macros.xml
@@ -0,0 +1,16 @@
+<macros>
+ <token name="@HELP_CITATIONS@">
+------
+
+**Citation**
+
+If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
+
+
+ </token>
+ <xml name="citations">
+ <citations>
+ <citation type="doi">10.1093/bioinformatics/btr398</citation>
+ </citations>
+ </xml>
+</macros>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/maf_by_block_number.xml
--- a/tools/maf/maf_by_block_number.xml
+++ b/tools/maf/maf_by_block_number.xml
@@ -1,5 +1,8 @@
<tool id="maf_by_block_number1" name="Extract MAF by block number" version="1.0.1"><description>given a set of block numbers and a MAF file</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_by_block_number.py $input1 $input2 $out_file1 $block_col $species</command><inputs><param format="txt" name="input1" type="data" label="Block Numbers"/>
@@ -29,12 +32,7 @@
This tool takes a list of block numbers, one per line, and extracts the corresponding MAF blocks from the provided file. Block numbers start at 0.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/maf_filter.xml
--- a/tools/maf/maf_filter.xml
+++ b/tools/maf/maf_filter.xml
@@ -1,5 +1,8 @@
<tool id="MAF_filter" name="Filter MAF" version="1.0.1"><description>by specified attributes</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_filter.py $maf_filter_file $input1 $out_file1 $out_file1.files_path $species $min_size $max_size $min_species_per_block $exclude_incomplete_blocks ${input1.metadata.species}</command><inputs><page>
@@ -191,12 +194,7 @@
You can also provide a size range and limit your output to the MAF blocks which fall within the specified range.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
-</help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/maf_limit_size.xml
--- a/tools/maf/maf_limit_size.xml
+++ b/tools/maf/maf_limit_size.xml
@@ -1,5 +1,8 @@
<tool id="maf_limit_size1" name="Filter MAF blocks" version="1.0.1"><description>by Size</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_limit_size.py $input1 $out_file1 $min_size $max_size</command><inputs><page>
@@ -25,12 +28,7 @@
This tool takes a MAF file and a size range and extracts the MAF blocks which fall within the specified range.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/maf_limit_to_species.xml
--- a/tools/maf/maf_limit_to_species.xml
+++ b/tools/maf/maf_limit_to_species.xml
@@ -1,5 +1,8 @@
<tool id="MAF_Limit_To_Species1" name="Filter MAF blocks"><description>by Species</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_limit_to_species.py $species $input1 $out_file1 $allow_partial $min_species</command><inputs><param name="input1" type="data" format="maf" label="MAF file"/>
@@ -39,13 +42,8 @@
* **Exclude blocks with have only one species** - if this option is set to **YES** all single sequence alignment blocks WILL NOT be returned.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/maf_reverse_complement.xml
--- a/tools/maf/maf_reverse_complement.xml
+++ b/tools/maf/maf_reverse_complement.xml
@@ -1,5 +1,8 @@
<tool id="MAF_Reverse_Complement_1" name="Reverse Complement" version="1.0.1"><description>a MAF file</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_reverse_complement.py $input1 $out_file1 $species</command><inputs><page>
@@ -42,12 +45,7 @@
s panTro1.chr6 31691510 58 - 161576975 CCTCTTCCACTATAGACCTCCTTAAACAAAATAATGAAAAACGAATAAACCACAAATT
s mm5.chr6 120816549 54 - 149721531 CCTCTTCCACTGAGGAATTTCTTTTTTTAAATGATGAGCAATCAATGAAACG----TT
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/maf_split_by_species.xml
--- a/tools/maf/maf_split_by_species.xml
+++ b/tools/maf/maf_split_by_species.xml
@@ -1,5 +1,8 @@
<tool id="MAF_split_blocks_by_species1" name="Split MAF blocks" version="1.0.0"><description>by Species</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_split_by_species.py $input1 $out_file1 $collapse_columns</command><inputs><param format="maf" name="input1" type="data" label="MAF file to split"/>
@@ -211,13 +214,8 @@
- An "i" line containing information about what is in the aligned species DNA before and after the immediately preceding "s" line;
- An "e" line containing information about the size of the gap between the alignments that span the current block.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
+@HELP_CITATIONS@
</help>
+ <expand macro="citations" /></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/maf_stats.xml
--- a/tools/maf/maf_stats.xml
+++ b/tools/maf/maf_stats.xml
@@ -1,5 +1,8 @@
<tool id="maf_stats1" name="MAF Coverage Stats" version="1.0.1"><description>Alignment coverage information</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">
maf_stats.py
#if $maf_source_type.maf_source == "user":
@@ -109,12 +112,7 @@
where **coverage** is the number of nucleotides divided by the total length of the provided intervals.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/maf_thread_for_species.xml
--- a/tools/maf/maf_thread_for_species.xml
+++ b/tools/maf/maf_thread_for_species.xml
@@ -1,5 +1,8 @@
<tool id="MAF_Thread_For_Species1" name="Join MAF blocks"><description>by Species</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_thread_for_species.py $input1 $out_file1 $species</command><inputs><param format="maf" name="input1" type="data" label="MAF file"/>
@@ -48,13 +51,9 @@
s hg17.chr7 127471195 389 + 158628139 gtttgccatcttttgctgctctagggaatccagcagctgtcaccatgtaaacaagcccaggctagaccaGTTACCCTCATCATCTTAGCTGATAGCCAGCCAGCCACCACAGGCAtgagtcaggccatattgctggacccacagaattatgagctaaataaatagtcttgggttaagccactaagttttaggcatagtgtgttatgtaTCTCACAAACATATAAGACTGTGTGTTTGTTGACTGGAGGAAGAGATGCTATAAAGACCACCTTTTAAAACTTCCCAAATACTGCCACTGATGTCCTGATGGAGGTATGAAAACATCCACTAAAATTTGTGGTTTATTCATTTTTCATTATTTTGTTTAAGGAGGTCTATAGTGGAAGAGG
s panTro1.chr6 129885076 389 + 161576975 gtttgccatcttttgctgctcttgggaatccagcagctgtcaccatgtaaacaagcccaggctagaccaGTTACCCTCATCATCTTAGCTGATAGCCAGCCAGCCACCACAGGCAtgagtcaggccatattgctggacccacagaattatgagctaaataaatagtcttgggttaagccactaagttttaggcatagtgtgttatgtaTCTCACAAACATATAAGACTGTGTGTTTGTTGACTGGAGGAAGAGATGCTATAAAGACCACCTTTTGAAACTTCCCAAATACTGCCACTGATGTCCTGATGGAGGTATGAAAACATCCACTAAAATTTGTGGTTTATTCGTTTTTCATTATTTTGTTTAAGGAGGTCTATAGTGGAAGAGG
-------
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" />
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/maf_to_bed.xml
--- a/tools/maf/maf_to_bed.xml
+++ b/tools/maf/maf_to_bed.xml
@@ -1,5 +1,8 @@
<tool id="MAF_To_BED1" name="MAF to BED" force_history_refresh="True"><description>Converts a MAF formatted file to the BED format</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_to_bed.py "${ input1 }" "${ out_file1 }" "${ species }" "${ complete_blocks }" "." "${ out_file1.id }"</command><inputs><param format="maf" name="input1" type="data" label="MAF file to convert"/>
@@ -123,14 +126,9 @@
5. score - A score between 0 and 1000.
6. strand - Defines the strand - either '+' or '-'.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
+@HELP_CITATIONS@
</help>
+ <expand macro="citations" /><code file="maf_to_bed_code.py"/></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/maf_to_fasta.xml
--- a/tools/maf/maf_to_fasta.xml
+++ b/tools/maf/maf_to_fasta.xml
@@ -1,5 +1,8 @@
<tool id="MAF_To_Fasta1" name="MAF to FASTA" version="1.0.1"><description>Converts a MAF formatted file to FASTA format</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">
#if $fasta_target_type.fasta_type == "multiple" #maf_to_fasta_multiple_sets.py $input1 $out_file1 $fasta_target_type.species $fasta_target_type.complete_blocks
#else #maf_to_fasta_concat.py $fasta_target_type.species $input1 $out_file1
@@ -188,12 +191,7 @@
- An "i" line containing information about what is in the aligned species DNA before and after the immediately preceding "s" line;
- An "e" line containing information about the size of the gap between the alignments that span the current block.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
- </help>
+@HELP_CITATIONS@
+ </help>
+ <expand macro="citations" /></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/maf_to_interval.xml
--- a/tools/maf/maf_to_interval.xml
+++ b/tools/maf/maf_to_interval.xml
@@ -1,5 +1,8 @@
<tool id="MAF_To_Interval1" name="MAF to Interval" force_history_refresh="True"><description>Converts a MAF formatted file to the Interval format</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">maf_to_interval.py "${ input1 }" "${ out_file1 }" "${ out_file1.id }" "." "${ input1.dbkey }" "${ species }" "${ input1.metadata.species }" "${ complete_blocks }" "${ remove_gaps }"</command><inputs><param format="maf" name="input1" type="data" label="MAF file to convert"/>
@@ -121,13 +124,8 @@
- An "i" line containing information about what is in the aligned species DNA before and after the immediately preceding "s" line;
- An "e" line containing information about the size of the gap between the alignments that span the current block.
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
-
+@HELP_CITATIONS@
</help>
+ <expand macro="citations" /></tool>
diff -r 853b09d9ed468ea36b57f6ccb009d9134a403889 -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 tools/maf/vcf_to_maf_customtrack.xml
--- a/tools/maf/vcf_to_maf_customtrack.xml
+++ b/tools/maf/vcf_to_maf_customtrack.xml
@@ -1,5 +1,8 @@
<tool id="vcf_to_maf_customtrack1" name="VCF to MAF Custom Track"><description>for display at UCSC</description>
+ <macros>
+ <import>macros.xml</import>
+ </macros><command interpreter="python">vcf_to_maf_customtrack.py '$out_file1'
#if $vcf_source_type.vcf_file
'${vcf_source_type.vcf_file[0].vcf_input.dbkey}'
@@ -121,12 +124,8 @@
s CHB+JPT_1.5 0 1 + 1 *------
s CHB+JPT_2.5 0 7 + 7 *GGA***
-------
-
-**Citation**
-
-If you use this tool, please cite `Blankenberg D, Taylor J, Nekrutenko A; The Galaxy Team. Making whole genome multiple alignments usable for biologists. Bioinformatics. 2011 Sep 1;27(17):2426-2428. <http://www.ncbi.nlm.nih.gov/pubmed/21775304>`_
-
+@HELP_CITATIONS@
</help>
+ <expand macro="citations" /></tool>
https://bitbucket.org/galaxy/galaxy-central/commits/39c983151fe3/
Changeset: 39c983151fe3
User: jmchilton
Date: 2014-08-06 15:41:38
Summary: Add annotated citations various tools.
Affected #: 9 files
diff -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 -r 39c983151fe328ff5d415f6da81ce5b21a7e18a4 tools/phenotype_association/beam.xml
--- a/tools/phenotype_association/beam.xml
+++ b/tools/phenotype_association/beam.xml
@@ -134,4 +134,8 @@
Submitted.
</help>
+ <citations>
+ <citation type="doi">10.1038/ng2110</citation>
+ <citation type="doi">10.1214/11-AOAS469</citation>
+ </citations></tool>
diff -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 -r 39c983151fe328ff5d415f6da81ce5b21a7e18a4 tools/phenotype_association/gpass.xml
--- a/tools/phenotype_association/gpass.xml
+++ b/tools/phenotype_association/gpass.xml
@@ -109,4 +109,7 @@
Submitted.
</help>
+ <citations>
+ <citation type="doi">10.1198/jasa.2011.ap10657</citation>
+ </citations></tool>
diff -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 -r 39c983151fe328ff5d415f6da81ce5b21a7e18a4 tools/phenotype_association/ldtools.xml
--- a/tools/phenotype_association/ldtools.xml
+++ b/tools/phenotype_association/ldtools.xml
@@ -108,4 +108,7 @@
Am J Hum Genet. 74(1):106-20. Epub 2003 Dec 15.
</help>
+ <citations>
+ <citation type="doi">10.1086/381000</citation>
+ </citations></tool>
diff -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 -r 39c983151fe328ff5d415f6da81ce5b21a7e18a4 tools/phenotype_association/linkToDavid.xml
--- a/tools/phenotype_association/linkToDavid.xml
+++ b/tools/phenotype_association/linkToDavid.xml
@@ -107,4 +107,8 @@
Genome Biol. 4(5):P3. Epub 2003 Apr 3.
</help>
+ <citations>
+ <citation type="doi">10.1038/nprot.2008.211</citation>
+ <citation type="doi">10.1186/gb-2003-4-5-p3</citation>
+ </citations></tool>
diff -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 -r 39c983151fe328ff5d415f6da81ce5b21a7e18a4 tools/phenotype_association/linkToGProfile.xml
--- a/tools/phenotype_association/linkToGProfile.xml
+++ b/tools/phenotype_association/linkToGProfile.xml
@@ -87,4 +87,7 @@
Nucleic Acids Res. 35(Web Server issue):W193-200. Epub 2007 May 3.
</help>
+ <citations>
+ <citation type="doi">10.1093/nar/gkm226</citation>
+ </citations></tool>
diff -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 -r 39c983151fe328ff5d415f6da81ce5b21a7e18a4 tools/phenotype_association/lps.xml
--- a/tools/phenotype_association/lps.xml
+++ b/tools/phenotype_association/lps.xml
@@ -301,4 +301,18 @@
--></help>
+ <citations>
+ <citation type="bibtex">@ARTICLE{Kim07aninterior-point,
+ author = {Seung-jean Kim and Kwangmoo Koh and Michael Lustig and Stephen Boyd and Dimitry Gorinevsky},
+ title = {An interior-point method for large-scale l1-regularized logistic regression},
+ journal = {Journal of Machine Learning Research},
+ year = {2007},
+ volume = {2007}
+}</citation>
+ <citation type="bibtex">@MISC{Shi08lasso-patternsearchalgorithm,
+ author = {Weiliang Shi and Grace Wahba and Stephen Wright and Kristine Lee and Ronald Klein and Barbara Klein},
+ title = { LASSO-Patternsearch Algorithm with Application to Ophthalmology and Genomic Data},
+ year = {2008}
+}</citation>
+ </citations></tool>
diff -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 -r 39c983151fe328ff5d415f6da81ce5b21a7e18a4 tools/phenotype_association/pass.xml
--- a/tools/phenotype_association/pass.xml
+++ b/tools/phenotype_association/pass.xml
@@ -123,4 +123,8 @@
Submitted.
</help>
+ <citations>
+ <citation type="doi">10.1093/bioinformatics/btn549</citation>
+ <citation type="doi">10.1093/bioinformatics/btq379</citation>
+ </citations></tool>
diff -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 -r 39c983151fe328ff5d415f6da81ce5b21a7e18a4 tools/phenotype_association/sift.xml
--- a/tools/phenotype_association/sift.xml
+++ b/tools/phenotype_association/sift.xml
@@ -171,4 +171,10 @@
Nat Protoc. 4(7):1073-81. Epub 2009 Jun 25.
</help>
+ <citations>
+ <citation type="doi">10.1101/gr.176601</citation>
+ <citation type="doi">10.1101/gr.212802</citation>
+ <citation type="doi">10.1093/nar/gkg509</citation>
+ <citation type="doi">10.1038/nprot.2009.86</citation>
+ </citations></tool>
diff -r 60f63d6d4cb7b73286f3c747e8acaa475e4b6fa8 -r 39c983151fe328ff5d415f6da81ce5b21a7e18a4 tools/plotting/boxplot.xml
--- a/tools/plotting/boxplot.xml
+++ b/tools/plotting/boxplot.xml
@@ -105,4 +105,7 @@
</help>
+ <citations>
+ <citation type="doi">10.1093/bioinformatics/btq281</citation>
+ </citations></tool>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
3 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/fc4f6db48ad3/
Changeset: fc4f6db48ad3
Branch: next-stable
User: jmchilton
Date: 2014-08-06 15:36:30
Summary: Fix-up citation related GUI.
Was displaying warning message about history citations being potentially incomplete for tools - which if they have annotated citations we should assume they are complete.
Affected #: 2 files
diff -r 96abe113c582eed53fcf143bd516ad9cf5152c26 -r fc4f6db48ad35bf970eab651e7a52edd18d66378 static/scripts/mvc/citation/citation-model.js
--- a/static/scripts/mvc/citation/citation-model.js
+++ b/static/scripts/mvc/citation/citation-model.js
@@ -37,7 +37,8 @@
var BaseCitationCollection = Backbone.Collection.extend( baseMVC.LoggableMixin ).extend( {
/** root api url */
urlRoot : galaxy_config.root + 'api',
- model : Citation
+ partial : true, // Assume some tools in history/workflow may not be properly annotated yet.
+ model : Citation,
} );
var HistoryCitationCollection = BaseCitationCollection.extend( {
@@ -51,7 +52,8 @@
/** complete api url */
url : function() {
return this.urlRoot + '/tools/' + this.tool_id + '/citations';
- }
+ },
+ partial : false, // If a tool has citations, assume they are complete.
} );
//==============================================================================
diff -r 96abe113c582eed53fcf143bd516ad9cf5152c26 -r fc4f6db48ad35bf970eab651e7a52edd18d66378 static/scripts/mvc/citation/citation-view.js
--- a/static/scripts/mvc/citation/citation-view.js
+++ b/static/scripts/mvc/citation/citation-view.js
@@ -120,7 +120,7 @@
},
render: function() {
- this.$el.html(this.citationsElement);
+ this.$el.html(this.citationsElement());
this.collection.each(function( item ){
this.renderCitation( item );
}, this);
@@ -142,29 +142,40 @@
this.$(".citations-formatted").show();
},
- citationsElement: [
- '<div class="toolForm">',
- '<div class="toolFormTitle">',
- _l("Citations"),
- ' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',
- ' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',
- '</div>',
- '<div class="toolFormBody" style="padding:5px 10px">',
- '<div style="padding:5px 10px">',
- '<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate',
- ' citations explicitly at this time. When writing up your analysis, please manually',
- ' review your histories and find all references',
- ' that should be cited in order to completely describe your work. Also, please remember to',
- ' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',
- '</div>',
- '<span class="citations-formatted"></span>',
- '</div>',
- '<div class="citations-bibtex toolFormBody" style="padding:5px 10px">',
- '<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',
- '</div>',
- '</div>'
- ].join( '' )
+ partialWarningElement: function() {
+ if( this.collection.partial ) {
+ return [
+ '<div style="padding:5px 10px">',
+ '<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate',
+ ' citations explicitly at this time. When writing up your analysis, please manually',
+ ' review your histories and find all references',
+ ' that should be cited in order to completely describe your work. Also, please remember to',
+ ' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',
+ '</div>',
+ ].join('');
+ } else {
+ return '';
+ }
+ },
+ citationsElement: function() {
+ return [
+ '<div class="toolForm">',
+ '<div class="toolFormTitle">',
+ _l("Citations"),
+ ' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',
+ ' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',
+ '</div>',
+ '<div class="toolFormBody" style="padding:5px 10px">',
+ this.partialWarningElement(),
+ '<span class="citations-formatted"></span>',
+ '</div>',
+ '<div class="citations-bibtex toolFormBody" style="padding:5px 10px">',
+ '<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',
+ '</div>',
+ '</div>'
+ ].join( '' );
+ }
});
//==============================================================================
https://bitbucket.org/galaxy/galaxy-central/commits/8a80483f4a57/
Changeset: 8a80483f4a57
Branch: next-stable
User: jmchilton
Date: 2014-08-06 15:37:08
Summary: Pack scripts.
Affected #: 2 files
diff -r fc4f6db48ad35bf970eab651e7a52edd18d66378 -r 8a80483f4a571ea66c0c397bcc367b2e8e4d52df static/scripts/packed/mvc/citation/citation-model.js
--- a/static/scripts/packed/mvc/citation/citation-model.js
+++ b/static/scripts/packed/mvc/citation/citation-model.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","utils/localization"],function(a,e){var f=Backbone.Model.extend(a.LoggableMixin).extend({initialize:function(){var g=this.attributes.content;var h=new BibtexParser(g).entries[0];this.entry=h},entryType:function(){return this.entry.EntryType},fields:function(){return this.entry.Fields}});var b=Backbone.Collection.extend(a.LoggableMixin).extend({urlRoot:galaxy_config.root+"api",model:f});var d=b.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}});var c=b.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"}});return{Citation:f,HistoryCitationCollection:d,ToolCitationCollection:c}});
\ No newline at end of file
+define(["mvc/base-mvc","utils/localization"],function(a,e){var f=Backbone.Model.extend(a.LoggableMixin).extend({initialize:function(){var g=this.attributes.content;var h=new BibtexParser(g).entries[0];this.entry=h},entryType:function(){return this.entry.EntryType},fields:function(){return this.entry.Fields}});var b=Backbone.Collection.extend(a.LoggableMixin).extend({urlRoot:galaxy_config.root+"api",partial:true,model:f,});var d=b.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}});var c=b.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"},partial:false,});return{Citation:f,HistoryCitationCollection:d,ToolCitationCollection:c}});
\ No newline at end of file
diff -r fc4f6db48ad35bf970eab651e7a52edd18d66378 -r 8a80483f4a571ea66c0c397bcc367b2e8e4d52df static/scripts/packed/mvc/citation/citation-view.js
--- a/static/scripts/packed/mvc/citation/citation-view.js
+++ b/static/scripts/packed/mvc/citation/citation-view.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return f?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement);this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},citationsElement:['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">','<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
+define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return f?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
https://bitbucket.org/galaxy/galaxy-central/commits/853b09d9ed46/
Changeset: 853b09d9ed46
User: jmchilton
Date: 2014-08-06 15:37:23
Summary: Merge next-stable.
Affected #: 4 files
diff -r 33c032a19f9af4549a5dfa7a55df7883117b4ea8 -r 853b09d9ed468ea36b57f6ccb009d9134a403889 static/scripts/mvc/citation/citation-model.js
--- a/static/scripts/mvc/citation/citation-model.js
+++ b/static/scripts/mvc/citation/citation-model.js
@@ -37,7 +37,8 @@
var BaseCitationCollection = Backbone.Collection.extend( baseMVC.LoggableMixin ).extend( {
/** root api url */
urlRoot : galaxy_config.root + 'api',
- model : Citation
+ partial : true, // Assume some tools in history/workflow may not be properly annotated yet.
+ model : Citation,
} );
var HistoryCitationCollection = BaseCitationCollection.extend( {
@@ -51,7 +52,8 @@
/** complete api url */
url : function() {
return this.urlRoot + '/tools/' + this.tool_id + '/citations';
- }
+ },
+ partial : false, // If a tool has citations, assume they are complete.
} );
//==============================================================================
diff -r 33c032a19f9af4549a5dfa7a55df7883117b4ea8 -r 853b09d9ed468ea36b57f6ccb009d9134a403889 static/scripts/mvc/citation/citation-view.js
--- a/static/scripts/mvc/citation/citation-view.js
+++ b/static/scripts/mvc/citation/citation-view.js
@@ -120,7 +120,7 @@
},
render: function() {
- this.$el.html(this.citationsElement);
+ this.$el.html(this.citationsElement());
this.collection.each(function( item ){
this.renderCitation( item );
}, this);
@@ -142,29 +142,40 @@
this.$(".citations-formatted").show();
},
- citationsElement: [
- '<div class="toolForm">',
- '<div class="toolFormTitle">',
- _l("Citations"),
- ' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',
- ' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',
- '</div>',
- '<div class="toolFormBody" style="padding:5px 10px">',
- '<div style="padding:5px 10px">',
- '<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate',
- ' citations explicitly at this time. When writing up your analysis, please manually',
- ' review your histories and find all references',
- ' that should be cited in order to completely describe your work. Also, please remember to',
- ' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',
- '</div>',
- '<span class="citations-formatted"></span>',
- '</div>',
- '<div class="citations-bibtex toolFormBody" style="padding:5px 10px">',
- '<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',
- '</div>',
- '</div>'
- ].join( '' )
+ partialWarningElement: function() {
+ if( this.collection.partial ) {
+ return [
+ '<div style="padding:5px 10px">',
+ '<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate',
+ ' citations explicitly at this time. When writing up your analysis, please manually',
+ ' review your histories and find all references',
+ ' that should be cited in order to completely describe your work. Also, please remember to',
+ ' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',
+ '</div>',
+ ].join('');
+ } else {
+ return '';
+ }
+ },
+ citationsElement: function() {
+ return [
+ '<div class="toolForm">',
+ '<div class="toolFormTitle">',
+ _l("Citations"),
+ ' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',
+ ' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',
+ '</div>',
+ '<div class="toolFormBody" style="padding:5px 10px">',
+ this.partialWarningElement(),
+ '<span class="citations-formatted"></span>',
+ '</div>',
+ '<div class="citations-bibtex toolFormBody" style="padding:5px 10px">',
+ '<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',
+ '</div>',
+ '</div>'
+ ].join( '' );
+ }
});
//==============================================================================
diff -r 33c032a19f9af4549a5dfa7a55df7883117b4ea8 -r 853b09d9ed468ea36b57f6ccb009d9134a403889 static/scripts/packed/mvc/citation/citation-model.js
--- a/static/scripts/packed/mvc/citation/citation-model.js
+++ b/static/scripts/packed/mvc/citation/citation-model.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","utils/localization"],function(a,e){var f=Backbone.Model.extend(a.LoggableMixin).extend({initialize:function(){var g=this.attributes.content;var h=new BibtexParser(g).entries[0];this.entry=h},entryType:function(){return this.entry.EntryType},fields:function(){return this.entry.Fields}});var b=Backbone.Collection.extend(a.LoggableMixin).extend({urlRoot:galaxy_config.root+"api",model:f});var d=b.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}});var c=b.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"}});return{Citation:f,HistoryCitationCollection:d,ToolCitationCollection:c}});
\ No newline at end of file
+define(["mvc/base-mvc","utils/localization"],function(a,e){var f=Backbone.Model.extend(a.LoggableMixin).extend({initialize:function(){var g=this.attributes.content;var h=new BibtexParser(g).entries[0];this.entry=h},entryType:function(){return this.entry.EntryType},fields:function(){return this.entry.Fields}});var b=Backbone.Collection.extend(a.LoggableMixin).extend({urlRoot:galaxy_config.root+"api",partial:true,model:f,});var d=b.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}});var c=b.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"},partial:false,});return{Citation:f,HistoryCitationCollection:d,ToolCitationCollection:c}});
\ No newline at end of file
diff -r 33c032a19f9af4549a5dfa7a55df7883117b4ea8 -r 853b09d9ed468ea36b57f6ccb009d9134a403889 static/scripts/packed/mvc/citation/citation-view.js
--- a/static/scripts/packed/mvc/citation/citation-view.js
+++ b/static/scripts/packed/mvc/citation/citation-view.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return f?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement);this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},citationsElement:['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">','<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
+define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return f?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dannon: Merged in jmchilton/galaxy-central-fork-1 (pull request #450)
by commits-noreply@bitbucket.org 05 Aug '14
by commits-noreply@bitbucket.org 05 Aug '14
05 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/33c032a19f9a/
Changeset: 33c032a19f9a
User: dannon
Date: 2014-08-05 16:33:09
Summary: Merged in jmchilton/galaxy-central-fork-1 (pull request #450)
Plugin framework enhancements to improve galaxy-ipython.
Affected #: 2 files
diff -r 626c583781a1d6f2d550fb3c2c4b357f1f3d5273 -r 33c032a19f9af4549a5dfa7a55df7883117b4ea8 lib/galaxy/visualization/registry.py
--- a/lib/galaxy/visualization/registry.py
+++ b/lib/galaxy/visualization/registry.py
@@ -13,6 +13,7 @@
from galaxy.web import url_for
from galaxy.web.base import pluginframework
+from galaxy.managers import api_keys
import logging
log = logging.getLogger( __name__ )
@@ -338,6 +339,19 @@
config = self.resource_parser.parse_config( trans, controller, param_confs, query_dict )
return config
+ def fill_template( self, trans, plugin, template_filename, **kwargs ):
+ # TODO: As part of a future note plugin registry effort - move this
+ # override and let VisualizationsRegistry just revert to using parent's
+ # fill_template.
+ if 'get_api_key' not in kwargs:
+
+ def get_api_key():
+ return api_keys.ApiKeyManager( trans.app ).get_or_create_api_key( trans.user )
+
+ kwargs[ 'get_api_key' ] = get_api_key
+
+ return super( VisualizationsRegistry, self ).fill_template( trans, plugin, template_filename, **kwargs )
+
# ------------------------------------------------------------------- parsing the config file
class ParsingException( ValueError ):
diff -r 626c583781a1d6f2d550fb3c2c4b357f1f3d5273 -r 33c032a19f9af4549a5dfa7a55df7883117b4ea8 lib/galaxy/web/base/pluginframework.py
--- a/lib/galaxy/web/base/pluginframework.py
+++ b/lib/galaxy/web/base/pluginframework.py
@@ -588,6 +588,9 @@
``plugin.template_path``
:returns: rendered template
"""
+ if 'plugin_path' not in kwargs:
+ kwargs[ 'plugin_path'] = os.path.abspath( plugin.path )
+
# defined here to be overridden
return trans.fill_template( template_filename, template_lookup=plugin.template_lookup, **kwargs )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
3 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/0fd4d60db4e2/
Changeset: 0fd4d60db4e2
User: jmchilton
Date: 2014-08-05 04:47:36
Summary: Add get_api_key helper method to visualization templates.
For use in the IPython visualization plugin - improves abstraction level and likely allows users who have never created a key to use IPython visualization.
Affected #: 1 file
diff -r a714f168aa7ddb1dfd3142f49869992cd325456c -r 0fd4d60db4e202d04fd42aa93c4af40c5d7b9748 lib/galaxy/visualization/registry.py
--- a/lib/galaxy/visualization/registry.py
+++ b/lib/galaxy/visualization/registry.py
@@ -13,6 +13,7 @@
from galaxy.web import url_for
from galaxy.web.base import pluginframework
+from galaxy.managers import api_keys
import logging
log = logging.getLogger( __name__ )
@@ -338,6 +339,19 @@
config = self.resource_parser.parse_config( trans, controller, param_confs, query_dict )
return config
+ def fill_template( self, trans, plugin, template_filename, **kwargs ):
+ # TODO: As part of a future note plugin registry effort - move this
+ # override and let VisualizationsRegistry just revert to using parent's
+ # fill_template.
+ if 'get_api_key' not in kwargs:
+
+ def get_api_key():
+ return api_keys.ApiKeyManager( trans.app ).get_or_create_api_key( trans.user )
+
+ kwargs[ 'get_api_key' ] = get_api_key
+
+ return super( VisualizationsRegistry, self ).fill_template( trans, plugin, template_filename, **kwargs )
+
# ------------------------------------------------------------------- parsing the config file
class ParsingException( ValueError ):
https://bitbucket.org/galaxy/galaxy-central/commits/ddc9a669d53a/
Changeset: ddc9a669d53a
User: jmchilton
Date: 2014-08-05 04:47:36
Summary: Plugin framework: Expose plugin path to mako templates.
Allows plugin templates to utilize resources contained in the plugin. Requested by Eric - should clean up IPython plugin somewhat.
Affected #: 1 file
diff -r 0fd4d60db4e202d04fd42aa93c4af40c5d7b9748 -r ddc9a669d53aa259d38efc882c890503444daaf5 lib/galaxy/web/base/pluginframework.py
--- a/lib/galaxy/web/base/pluginframework.py
+++ b/lib/galaxy/web/base/pluginframework.py
@@ -588,6 +588,9 @@
``plugin.template_path``
:returns: rendered template
"""
+ if 'plugin_path' not in kwargs:
+ kwargs[ 'plugin_path'] = os.path.abspath( plugin.path )
+
# defined here to be overridden
return trans.fill_template( template_filename, template_lookup=plugin.template_lookup, **kwargs )
https://bitbucket.org/galaxy/galaxy-central/commits/33c032a19f9a/
Changeset: 33c032a19f9a
User: dannon
Date: 2014-08-05 16:33:09
Summary: Merged in jmchilton/galaxy-central-fork-1 (pull request #450)
Plugin framework enhancements to improve galaxy-ipython.
Affected #: 2 files
diff -r 626c583781a1d6f2d550fb3c2c4b357f1f3d5273 -r 33c032a19f9af4549a5dfa7a55df7883117b4ea8 lib/galaxy/visualization/registry.py
--- a/lib/galaxy/visualization/registry.py
+++ b/lib/galaxy/visualization/registry.py
@@ -13,6 +13,7 @@
from galaxy.web import url_for
from galaxy.web.base import pluginframework
+from galaxy.managers import api_keys
import logging
log = logging.getLogger( __name__ )
@@ -338,6 +339,19 @@
config = self.resource_parser.parse_config( trans, controller, param_confs, query_dict )
return config
+ def fill_template( self, trans, plugin, template_filename, **kwargs ):
+ # TODO: As part of a future note plugin registry effort - move this
+ # override and let VisualizationsRegistry just revert to using parent's
+ # fill_template.
+ if 'get_api_key' not in kwargs:
+
+ def get_api_key():
+ return api_keys.ApiKeyManager( trans.app ).get_or_create_api_key( trans.user )
+
+ kwargs[ 'get_api_key' ] = get_api_key
+
+ return super( VisualizationsRegistry, self ).fill_template( trans, plugin, template_filename, **kwargs )
+
# ------------------------------------------------------------------- parsing the config file
class ParsingException( ValueError ):
diff -r 626c583781a1d6f2d550fb3c2c4b357f1f3d5273 -r 33c032a19f9af4549a5dfa7a55df7883117b4ea8 lib/galaxy/web/base/pluginframework.py
--- a/lib/galaxy/web/base/pluginframework.py
+++ b/lib/galaxy/web/base/pluginframework.py
@@ -588,6 +588,9 @@
``plugin.template_path``
:returns: rendered template
"""
+ if 'plugin_path' not in kwargs:
+ kwargs[ 'plugin_path'] = os.path.abspath( plugin.path )
+
# defined here to be overridden
return trans.fill_template( template_filename, template_lookup=plugin.template_lookup, **kwargs )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/96abe113c582/
Changeset: 96abe113c582
Branch: next-stable
User: greg
Date: 2014-08-05 16:09:20
Summary: Fix for writing entries to shed_tool_conf.xml so that sym linked files are handled correctly (thanks Bjoern), and making changes to this and data manager config files thread-safe.
Affected #: 2 files
diff -r 7cacfb33db90dee8c4e9ce78a3a735cd6cef8490 -r 96abe113c582eed53fcf143bd516ad9cf5152c26 lib/tool_shed/galaxy_install/tools/data_manager.py
--- a/lib/tool_shed/galaxy_install/tools/data_manager.py
+++ b/lib/tool_shed/galaxy_install/tools/data_manager.py
@@ -1,5 +1,6 @@
import logging
import os
+import threading
from tool_shed.galaxy_install.tools import tool_panel_manager
@@ -18,12 +19,19 @@
Persist the current in-memory list of config_elems to a file named by the value
of config_filename.
"""
- fh = open( config_filename, 'wb' )
- fh.write( '<?xml version="1.0"?>\n<data_managers>\n' )
- for elem in config_elems:
- fh.write( xml_util.xml_to_string( elem ) )
- fh.write( '</data_managers>\n' )
- fh.close()
+ lock = threading.Lock()
+ lock.acquire( True )
+ try:
+ fh = open( config_filename, 'wb' )
+ fh.write( '<?xml version="1.0"?>\n<data_managers>\n' )
+ for elem in config_elems:
+ fh.write( xml_util.xml_to_string( elem ) )
+ fh.write( '</data_managers>\n' )
+ fh.close()
+ except Exception, e:
+ log.exception( "Exception in DataManagerHandler.data_manager_config_elems_to_xml_file: %s" % str( e ) )
+ finally:
+ lock.release()
def install_data_managers( self, shed_data_manager_conf_filename, metadata_dict, shed_config_dict,
relative_install_dir, repository, repository_tools_tups ):
diff -r 7cacfb33db90dee8c4e9ce78a3a735cd6cef8490 -r 96abe113c582eed53fcf143bd516ad9cf5152c26 lib/tool_shed/galaxy_install/tools/tool_panel_manager.py
--- a/lib/tool_shed/galaxy_install/tools/tool_panel_manager.py
+++ b/lib/tool_shed/galaxy_install/tools/tool_panel_manager.py
@@ -1,7 +1,6 @@
import logging
import os
-import shutil
-import tempfile
+import threading
import galaxy.tools
from galaxy.tools.search import ToolBoxSearch
@@ -90,15 +89,19 @@
Persist the current in-memory list of config_elems to a file named by the
value of config_filename.
"""
- fd, filename = tempfile.mkstemp( prefix="tmp-toolshed-cetxf" )
- os.write( fd, '<?xml version="1.0"?>\n' )
- os.write( fd, '<toolbox tool_path="%s">\n' % str( tool_path ) )
- for elem in config_elems:
- os.write( fd, '%s' % xml_util.xml_to_string( elem, use_indent=True ) )
- os.write( fd, '</toolbox>\n' )
- os.close( fd )
- shutil.move( filename, os.path.abspath( config_filename ) )
- os.chmod( config_filename, 0644 )
+ lock = threading.Lock()
+ lock.acquire( True )
+ try:
+ fh = open( config_filename, 'wb' )
+ fh.write( '<?xml version="1.0"?>\n<toolbox tool_path="%s">\n' % str( tool_path ) )
+ for elem in config_elems:
+ fh.write( xml_util.xml_to_string( elem, use_indent=True ) )
+ fh.write( '</toolbox>\n' )
+ fh.close()
+ except Exception, e:
+ log.exception( "Exception in ToolPanelManager.config_elems_to_xml_file: %s" % str( e ) )
+ finally:
+ lock.release()
def generate_tool_elem( self, tool_shed, repository_name, changeset_revision, owner, tool_file_path,
tool, tool_section ):
https://bitbucket.org/galaxy/galaxy-central/commits/626c583781a1/
Changeset: 626c583781a1
User: greg
Date: 2014-08-05 16:09:56
Summary: Merged next-stable
Affected #: 2 files
diff -r 213a23e98fec2ad620483e36286ce4a35b3f7c1f -r 626c583781a1d6f2d550fb3c2c4b357f1f3d5273 lib/tool_shed/galaxy_install/tools/data_manager.py
--- a/lib/tool_shed/galaxy_install/tools/data_manager.py
+++ b/lib/tool_shed/galaxy_install/tools/data_manager.py
@@ -1,5 +1,6 @@
import logging
import os
+import threading
from tool_shed.galaxy_install.tools import tool_panel_manager
@@ -18,12 +19,19 @@
Persist the current in-memory list of config_elems to a file named by the value
of config_filename.
"""
- fh = open( config_filename, 'wb' )
- fh.write( '<?xml version="1.0"?>\n<data_managers>\n' )
- for elem in config_elems:
- fh.write( xml_util.xml_to_string( elem ) )
- fh.write( '</data_managers>\n' )
- fh.close()
+ lock = threading.Lock()
+ lock.acquire( True )
+ try:
+ fh = open( config_filename, 'wb' )
+ fh.write( '<?xml version="1.0"?>\n<data_managers>\n' )
+ for elem in config_elems:
+ fh.write( xml_util.xml_to_string( elem ) )
+ fh.write( '</data_managers>\n' )
+ fh.close()
+ except Exception, e:
+ log.exception( "Exception in DataManagerHandler.data_manager_config_elems_to_xml_file: %s" % str( e ) )
+ finally:
+ lock.release()
def install_data_managers( self, shed_data_manager_conf_filename, metadata_dict, shed_config_dict,
relative_install_dir, repository, repository_tools_tups ):
diff -r 213a23e98fec2ad620483e36286ce4a35b3f7c1f -r 626c583781a1d6f2d550fb3c2c4b357f1f3d5273 lib/tool_shed/galaxy_install/tools/tool_panel_manager.py
--- a/lib/tool_shed/galaxy_install/tools/tool_panel_manager.py
+++ b/lib/tool_shed/galaxy_install/tools/tool_panel_manager.py
@@ -1,7 +1,6 @@
import logging
import os
-import shutil
-import tempfile
+import threading
import galaxy.tools
from galaxy.tools.search import ToolBoxSearch
@@ -90,15 +89,19 @@
Persist the current in-memory list of config_elems to a file named by the
value of config_filename.
"""
- fd, filename = tempfile.mkstemp( prefix="tmp-toolshed-cetxf" )
- os.write( fd, '<?xml version="1.0"?>\n' )
- os.write( fd, '<toolbox tool_path="%s">\n' % str( tool_path ) )
- for elem in config_elems:
- os.write( fd, '%s' % xml_util.xml_to_string( elem, use_indent=True ) )
- os.write( fd, '</toolbox>\n' )
- os.close( fd )
- shutil.move( filename, os.path.abspath( config_filename ) )
- os.chmod( config_filename, 0644 )
+ lock = threading.Lock()
+ lock.acquire( True )
+ try:
+ fh = open( config_filename, 'wb' )
+ fh.write( '<?xml version="1.0"?>\n<toolbox tool_path="%s">\n' % str( tool_path ) )
+ for elem in config_elems:
+ fh.write( xml_util.xml_to_string( elem, use_indent=True ) )
+ fh.write( '</toolbox>\n' )
+ fh.close()
+ except Exception, e:
+ log.exception( "Exception in ToolPanelManager.config_elems_to_xml_file: %s" % str( e ) )
+ finally:
+ lock.release()
def generate_tool_elem( self, tool_shed, repository_name, changeset_revision, owner, tool_file_path,
tool, tool_section ):
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dannon: Merged in iracooke/galaxy-central (pull request #446)
by commits-noreply@bitbucket.org 05 Aug '14
by commits-noreply@bitbucket.org 05 Aug '14
05 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/213a23e98fec/
Changeset: 213a23e98fec
User: dannon
Date: 2014-08-05 16:00:07
Summary: Merged in iracooke/galaxy-central (pull request #446)
Metadata detection for sqlite datatype
Affected #: 1 file
diff -r a714f168aa7ddb1dfd3142f49869992cd325456c -r 213a23e98fec2ad620483e36286ce4a35b3f7c1f lib/galaxy/datatypes/binary.py
--- a/lib/galaxy/datatypes/binary.py
+++ b/lib/galaxy/datatypes/binary.py
@@ -20,7 +20,7 @@
from bx.seq.twobit import TWOBIT_MAGIC_NUMBER, TWOBIT_MAGIC_NUMBER_SWAP, TWOBIT_MAGIC_SIZE
-from galaxy.datatypes.metadata import MetadataElement
+from galaxy.datatypes.metadata import MetadataElement,ListParameter,DictParameter
from galaxy.datatypes import metadata
from galaxy.datatypes.sniff import *
import dataproviders
@@ -550,8 +550,36 @@
@dataproviders.decorators.has_dataproviders
class SQlite ( Binary ):
+ """Class describing a Sqlite database """
+ MetadataElement( name="tables", default=[], param=ListParameter, desc="Database Tables", readonly=True, visible=True, no_value=[] )
+ MetadataElement( name="table_columns", default={}, param=DictParameter, desc="Database Table Columns", readonly=True, visible=True, no_value={} )
+ MetadataElement( name="table_row_count", default={}, param=DictParameter, desc="Database Table Row Count", readonly=True, visible=True, no_value={} )
file_ext = "sqlite"
+ def init_meta( self, dataset, copy_from=None ):
+ Binary.init_meta( self, dataset, copy_from=copy_from )
+
+ def set_meta( self, dataset, overwrite = True, **kwd ):
+ try:
+ tables = []
+ columns = dict()
+ rowcounts = dict()
+ conn = sqlite3.connect(dataset.file_name)
+ c = conn.cursor()
+ tables_query = "SELECT name,sql FROM sqlite_master WHERE type='table' ORDER BY name"
+ rslt = c.execute(tables_query).fetchall()
+ for table,sql in rslt:
+ tables.append(table)
+ columns[table] = re.sub('^.*\((.*)\)$','\\1',sql).split(',')
+ for table in tables:
+ row_query = "SELECT count(*) FROM %s" % table
+ rowcounts[table] = c.execute(row_query).fetchone()[0]
+ dataset.metadata.tables = tables
+ dataset.metadata.table_columns = columns
+ dataset.metadata.table_row_count = rowcounts
+ except Exception, exc:
+ pass
+
# Connects and runs a query that should work on any real database
# If the file is not sqlite, an exception will be thrown and the sniffer will return false
def sniff( self, filename ):
@@ -568,6 +596,14 @@
def set_peek( self, dataset, is_multi_byte=False ):
if not dataset.dataset.purged:
dataset.peek = "SQLite Database"
+ lines = ['SQLite Database']
+ if dataset.metadata.tables:
+ for table in dataset.metadata.tables:
+ try:
+ lines.append('%s [%s]' % (table,dataset.metadata.table_row_count[table]))
+ except:
+ continue
+ dataset.peek = '\n'.join(lines)
dataset.blurb = data.nice_size( dataset.get_size() )
else:
dataset.peek = 'file does not exist'
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
3 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a0db2788e912/
Changeset: a0db2788e912
User: iracooke
Date: 2014-08-01 03:31:51
Summary: Added sqlite metadata detection (from JJ)
Affected #: 1 file
diff -r 19859e3e4b1c58217c31d2f3c472359c667c2a7f -r a0db2788e9125270aec5391e676d8a0b36691233 lib/galaxy/datatypes/binary.py
--- a/lib/galaxy/datatypes/binary.py
+++ b/lib/galaxy/datatypes/binary.py
@@ -20,7 +20,7 @@
from bx.seq.twobit import TWOBIT_MAGIC_NUMBER, TWOBIT_MAGIC_NUMBER_SWAP, TWOBIT_MAGIC_SIZE
-from galaxy.datatypes.metadata import MetadataElement
+from galaxy.datatypes.metadata import MetadataElement,ListParameter,DictParameter
from galaxy.datatypes import metadata
from galaxy.datatypes.sniff import *
import dataproviders
@@ -550,8 +550,36 @@
@dataproviders.decorators.has_dataproviders
class SQlite ( Binary ):
+ """Class describing a Sqlite database """
+ MetadataElement( name="tables", default=[], param=ListParameter, desc="Database Tables", readonly=True, visible=True, no_value=[] )
+ MetadataElement( name="table_columns", default={}, param=DictParameter, desc="Database Table Columns", readonly=True, visible=True, no_value={} )
+ MetadataElement( name="table_row_count", default={}, param=DictParameter, desc="Database Table Row Count", readonly=True, visible=True, no_value={} )
file_ext = "sqlite"
+ def init_meta( self, dataset, copy_from=None ):
+ Binary.init_meta( self, dataset, copy_from=copy_from )
+
+ def set_meta( self, dataset, overwrite = True, **kwd ):
+ try:
+ tables = []
+ columns = dict()
+ rowcounts = dict()
+ conn = sqlite3.connect(dataset.file_name)
+ c = conn.cursor()
+ tables_query = "SELECT name,sql FROM sqlite_master WHERE type='table' ORDER BY name"
+ rslt = c.execute(tables_query).fetchall()
+ for table,sql in rslt:
+ tables.append(table)
+ columns[table] = re.sub('^.*\((.*)\)$','\\1',sql).split(',')
+ for table in tables:
+ row_query = "SELECT count(*) FROM %s" % table
+ rowcounts[table] = c.execute(row_query).fetchone()[0]
+ dataset.metadata.tables = tables
+ dataset.metadata.table_columns = columns
+ dataset.metadata.table_row_count = rowcounts
+ except Exception, exc:
+ pass
+
# Connects and runs a query that should work on any real database
# If the file is not sqlite, an exception will be thrown and the sniffer will return false
def sniff( self, filename ):
@@ -568,6 +596,14 @@
def set_peek( self, dataset, is_multi_byte=False ):
if not dataset.dataset.purged:
dataset.peek = "SQLite Database"
+ lines = ['SQLite Database']
+ if dataset.metadata.tables:
+ for table in dataset.metadata.tables:
+ try:
+ lines.append('%s [%s]' % (table,dataset.metadata.table_row_count[table]))
+ except:
+ continue
+ dataset.peek = '\n'.join(lines)
dataset.blurb = data.nice_size( dataset.get_size() )
else:
dataset.peek = 'file does not exist'
https://bitbucket.org/galaxy/galaxy-central/commits/7dd390cfd674/
Changeset: 7dd390cfd674
User: iracooke
Date: 2014-08-01 03:33:22
Summary: Merged galaxy/galaxy-central into default
Affected #: 50 files
diff -r a0db2788e9125270aec5391e676d8a0b36691233 -r 7dd390cfd674cae4c2833fb36f9b4875576cb1c0 .hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -7,6 +7,13 @@
26f58e05aa1068761660681583821e21e6cbf7ab release_2013.11.04
5e605ed6069fe4c5ca9875e95e91b2713499e8ca release_2014.02.10
9e53251b0b7e93b9563008a2b112f2e815a04bbc release_2014.04.14
-68a8b0397947c732b28207d465d3f3c4e2a7a8a0 latest_2014.04.14
7e257c7b10badb65772b1528cb61d58175a42e47 release_2014.06.02
-8a863a311a6c9f14b302799bffcf94df9186fef7 latest_2014.06.02
+8c30e91bc9ae19ee4dc7ec2c22fa825979497108 latest_2014.06.02
+9661b9d5d5b330483ae3ad2236410e0efaa7c500 latest_2014.04.14
+6b0bd93038a843b1585155f0d63f0eea2459c70b latest_2013.01.13
+3e62060b14b9afc46f8e0ec02e1a4500d77db9e1 latest_2013.02.08
+425009b3ff4d8b67d2812253b221f3c4f4a8d1e3 latest_2013.04.01
+9713d86392ef985ffcdc39ff0c8ddf51a1f9ce47 latest_2013.06.03
+9ed84cd208e07e8985ec917cb025fcbbb09edcfb latest_2013.08.12
+81fbe25bd02edcd53065e8e4476dd1dfb5a72cf2 latest_2013.11.04
+2a756ca2cb1826db7796018e77d12e2dd7b67603 latest_2014.02.10
diff -r a0db2788e9125270aec5391e676d8a0b36691233 -r 7dd390cfd674cae4c2833fb36f9b4875576cb1c0 lib/galaxy/util/__init__.py
--- a/lib/galaxy/util/__init__.py
+++ b/lib/galaxy/util/__init__.py
@@ -714,11 +714,11 @@
def object_to_string( obj ):
- return binascii.hexlify( pickle.dumps( obj, 2 ) )
+ return binascii.hexlify( obj )
def string_to_object( s ):
- return pickle.loads( binascii.unhexlify( s ) )
+ return binascii.unhexlify( s )
class ParamsWithSpecs( collections.defaultdict ):
diff -r a0db2788e9125270aec5391e676d8a0b36691233 -r 7dd390cfd674cae4c2833fb36f9b4875576cb1c0 lib/galaxy/webapps/galaxy/controllers/ucsc_proxy.py
--- a/lib/galaxy/webapps/galaxy/controllers/ucsc_proxy.py
+++ b/lib/galaxy/webapps/galaxy/controllers/ucsc_proxy.py
@@ -5,6 +5,7 @@
from galaxy.web.base.controller import *
import sys
+import json
from galaxy import web, util
import re, urllib, logging
@@ -33,7 +34,7 @@
try:
store = params.get("__GALAXY__", None)
if store:
- store = util.string_to_object(store)
+ store = json.loads(util.string_to_object(store))
else:
store = {}
UCSC_URL = 'UCSC_URL'
@@ -86,7 +87,7 @@
# Serialize store into a form element
store_text = "<INPUT TYPE=\"HIDDEN\" NAME=\"__GALAXY__\" ID=\"__GALAXY__\" VALUE=\"" \
- + util.object_to_string(store) + "\" \>"
+ + json.dumps(util.object_to_string(store)) + "\" \>"
# Remove text regions that should not be exposed
for key,value in altered_regions.items():
diff -r a0db2788e9125270aec5391e676d8a0b36691233 -r 7dd390cfd674cae4c2833fb36f9b4875576cb1c0 lib/galaxy/webapps/tool_shed/controllers/repository.py
--- a/lib/galaxy/webapps/tool_shed/controllers/repository.py
+++ b/lib/galaxy/webapps/tool_shed/controllers/repository.py
@@ -20,13 +20,13 @@
from tool_shed.galaxy_install import dependency_display
from tool_shed.metadata import repository_metadata_manager
+from tool_shed.utility_containers import ToolShedUtilityContainerManager
from tool_shed.tools import tool_validator
from tool_shed.tools import tool_version_manager
from tool_shed.util import basic_util
from tool_shed.util import common_util
-from tool_shed.util import container_util
from tool_shed.util import encoding_util
from tool_shed.util import hg_util
from tool_shed.util import metadata_util
@@ -1273,12 +1273,12 @@
# Only display repository dependencies if they exist.
exclude = [ 'datatypes', 'invalid_repository_dependencies', 'invalid_tool_dependencies', 'invalid_tools',
'readme_files', 'tool_dependencies', 'tools', 'tool_test_results', 'workflows', 'data_manager' ]
- containers_dict = container_util.build_repository_containers_for_tool_shed( trans.app,
- repository,
- changeset_revision,
- repository_dependencies,
- repository_metadata,
- exclude=exclude )
+ tsucm = ToolShedUtilityContainerManager( trans.app )
+ containers_dict = tsucm.build_repository_containers( repository,
+ changeset_revision,
+ repository_dependencies,
+ repository_metadata,
+ exclude=exclude )
export_repository_dependencies_check_box = CheckboxField( 'export_repository_dependencies', checked=True )
else:
containers_dict = None
@@ -2458,11 +2458,11 @@
skip_tool_tests_check_box = CheckboxField( 'skip_tool_tests', checked=skip_tool_tests_checked )
categories = suc.get_categories( trans.app )
selected_categories = [ rca.category_id for rca in repository.categories ]
- containers_dict = container_util.build_repository_containers_for_tool_shed( trans.app,
- repository,
- changeset_revision,
- repository_dependencies,
- repository_metadata )
+ tsucm = ToolShedUtilityContainerManager( trans.app )
+ containers_dict = tsucm.build_repository_containers( repository,
+ changeset_revision,
+ repository_dependencies,
+ repository_metadata )
heads = hg_util.get_repository_heads( repo )
deprecated_repository_dependency_tups = \
metadata_util.get_repository_dependency_tups_from_repository_metadata( trans.app,
@@ -2653,11 +2653,11 @@
selected_value=changeset_revision,
add_id_to_name=False,
downloadable=False )
- containers_dict = container_util.build_repository_containers_for_tool_shed( trans.app,
- repository,
- changeset_revision,
- repository_dependencies,
- repository_metadata )
+ tsucm = ToolShedUtilityContainerManager( trans.app )
+ containers_dict = tsucm.build_repository_containers( repository,
+ changeset_revision,
+ repository_dependencies,
+ repository_metadata )
return trans.fill_template( '/webapps/tool_shed/repository/preview_tools_in_changeset.mako',
repository=repository,
containers_dict=containers_dict,
@@ -3360,11 +3360,11 @@
else:
message += malicious_error
status = 'error'
- containers_dict = container_util.build_repository_containers_for_tool_shed( trans.app,
- repository,
- changeset_revision,
- repository_dependencies,
- repository_metadata )
+ tsucm = ToolShedUtilityContainerManager( trans.app )
+ containers_dict = tsucm.build_repository_containers( repository,
+ changeset_revision,
+ repository_dependencies,
+ repository_metadata )
repository_type_select_field = rt_util.build_repository_type_select_field( trans, repository=repository )
heads = hg_util.get_repository_heads( repo )
return trans.fill_template( '/webapps/tool_shed/repository/view_repository.mako',
diff -r a0db2788e9125270aec5391e676d8a0b36691233 -r 7dd390cfd674cae4c2833fb36f9b4875576cb1c0 lib/galaxy/webapps/tool_shed/controllers/repository_review.py
--- a/lib/galaxy/webapps/tool_shed/controllers/repository_review.py
+++ b/lib/galaxy/webapps/tool_shed/controllers/repository_review.py
@@ -1,17 +1,26 @@
-import os, logging
-from galaxy import web, util
+import logging
+import os
+
+from sqlalchemy.sql.expression import func
+
+from galaxy import util
+from galaxy import web
+
+from galaxy.model.orm import and_
+from galaxy.util.odict import odict
from galaxy.web.base.controller import BaseUIController
-from galaxy.web.form_builder import SelectField, CheckboxField
-from sqlalchemy.sql.expression import func
-from galaxy.model.orm import and_
+from galaxy.web.form_builder import CheckboxField
+from galaxy.web.form_builder import SelectField
+
from galaxy.webapps.tool_shed.util import ratings_util
+
+import tool_shed.grids.repository_review_grids as repository_review_grids
+import tool_shed.grids.util as grids_util
+
from tool_shed.util.container_util import STRSEP
-import tool_shed.util.shed_util_common as suc
from tool_shed.util import hg_util
from tool_shed.util import review_util
-from galaxy.util.odict import odict
-import tool_shed.grids.repository_review_grids as repository_review_grids
-import tool_shed.grids.util as grids_util
+from tool_shed.util import shed_util_common as suc
log = logging.getLogger( __name__ )
diff -r a0db2788e9125270aec5391e676d8a0b36691233 -r 7dd390cfd674cae4c2833fb36f9b4875576cb1c0 lib/tool_shed/dependencies/repository/relation_builder.py
--- a/lib/tool_shed/dependencies/repository/relation_builder.py
+++ b/lib/tool_shed/dependencies/repository/relation_builder.py
@@ -3,6 +3,7 @@
from galaxy.util import asbool
from galaxy.util import listify
+
from tool_shed.util import common_util
from tool_shed.util import container_util
from tool_shed.util import hg_util
diff -r a0db2788e9125270aec5391e676d8a0b36691233 -r 7dd390cfd674cae4c2833fb36f9b4875576cb1c0 lib/tool_shed/galaxy_install/dependency_display.py
--- a/lib/tool_shed/galaxy_install/dependency_display.py
+++ b/lib/tool_shed/galaxy_install/dependency_display.py
@@ -5,6 +5,9 @@
from galaxy import util
+from tool_shed.galaxy_install.utility_containers import GalaxyUtilityContainerManager
+from tool_shed.utility_containers import utility_container_manager
+
from tool_shed.util import common_util
from tool_shed.util import container_util
from tool_shed.util import readme_util
@@ -276,22 +279,23 @@
old_container_repository_dependencies_root = old_container_dict[ 'repository_dependencies' ]
if old_container_repository_dependencies_root:
if repository_dependencies_root_folder is None:
- repository_dependencies_root_folder = container_util.Folder( id=folder_id,
- key='root',
- label='root',
- parent=None )
+ repository_dependencies_root_folder = utility_container_manager.Folder( id=folder_id,
+ key='root',
+ label='root',
+ parent=None )
folder_id += 1
- repository_dependencies_folder = container_util.Folder( id=folder_id,
- key='merged',
- label='Repository dependencies',
- parent=repository_dependencies_root_folder )
+ repository_dependencies_folder = utility_container_manager.Folder( id=folder_id,
+ key='merged',
+ label='Repository dependencies',
+ parent=repository_dependencies_root_folder )
folder_id += 1
# The old_container_repository_dependencies_root will be a root folder containing a single sub_folder.
old_container_repository_dependencies_folder = old_container_repository_dependencies_root.folders[ 0 ]
# Change the folder id so it won't confict with others being merged.
old_container_repository_dependencies_folder.id = folder_id
folder_id += 1
- repository_components_tuple = container_util.get_components_from_key( old_container_repository_dependencies_folder.key )
+ repository_components_tuple = \
+ container_util.get_components_from_key( old_container_repository_dependencies_folder.key )
components_list = suc.extract_components_from_tuple( repository_components_tuple )
name = components_list[ 1 ]
# Generate the label by retrieving the repository name.
@@ -301,15 +305,15 @@
old_container_tool_dependencies_root = old_container_dict[ 'tool_dependencies' ]
if old_container_tool_dependencies_root:
if tool_dependencies_root_folder is None:
- tool_dependencies_root_folder = container_util.Folder( id=folder_id,
- key='root',
- label='root',
- parent=None )
+ tool_dependencies_root_folder = utility_container_manager.Folder( id=folder_id,
+ key='root',
+ label='root',
+ parent=None )
folder_id += 1
- tool_dependencies_folder = container_util.Folder( id=folder_id,
- key='merged',
- label='Tool dependencies',
- parent=tool_dependencies_root_folder )
+ tool_dependencies_folder = utility_container_manager.Folder( id=folder_id,
+ key='merged',
+ label='Tool dependencies',
+ parent=tool_dependencies_root_folder )
folder_id += 1
else:
td_list = [ td.listify for td in tool_dependencies_folder.tool_dependencies ]
@@ -410,23 +414,22 @@
repository_missing_tool_dependencies=missing_tool_dependencies,
required_repo_info_dicts=None )
# Most of the repository contents are set to None since we don't yet know what they are.
- containers_dict = \
- container_util.build_repository_containers_for_galaxy( app=self.app,
- repository=None,
- datatypes=None,
- invalid_tools=None,
- missing_repository_dependencies=missing_repository_dependencies,
- missing_tool_dependencies=missing_tool_dependencies,
- readme_files_dict=readme_files_dict,
- repository_dependencies=installed_repository_dependencies,
- tool_dependencies=installed_tool_dependencies,
- valid_tools=None,
- workflows=None,
- valid_data_managers=None,
- invalid_data_managers=None,
- data_managers_errors=None,
- new_install=True,
- reinstalling=False )
+ gucm = GalaxyUtilityContainerManager( self.app )
+ containers_dict = gucm.build_repository_containers( repository=None,
+ datatypes=None,
+ invalid_tools=None,
+ missing_repository_dependencies=missing_repository_dependencies,
+ missing_tool_dependencies=missing_tool_dependencies,
+ readme_files_dict=readme_files_dict,
+ repository_dependencies=installed_repository_dependencies,
+ tool_dependencies=installed_tool_dependencies,
+ valid_tools=None,
+ workflows=None,
+ valid_data_managers=None,
+ invalid_data_managers=None,
+ data_managers_errors=None,
+ new_install=True,
+ reinstalling=False )
if not updating:
# If we installing a new repository and not updaing an installed repository, we can merge
# the missing_repository_dependencies container contents to the installed_repository_dependencies
@@ -508,23 +511,22 @@
valid_data_managers = metadata['data_manager'].get( 'data_managers', None )
invalid_data_managers = metadata['data_manager'].get( 'invalid_data_managers', None )
data_managers_errors = metadata['data_manager'].get( 'messages', None )
- containers_dict = \
- container_util.build_repository_containers_for_galaxy( app=self.app,
- repository=repository,
- datatypes=datatypes,
- invalid_tools=invalid_tools,
- missing_repository_dependencies=missing_repository_dependencies,
- missing_tool_dependencies=missing_tool_dependencies,
- readme_files_dict=readme_files_dict,
- repository_dependencies=installed_repository_dependencies,
- tool_dependencies=installed_tool_dependencies,
- valid_tools=valid_tools,
- workflows=workflows,
- valid_data_managers=valid_data_managers,
- invalid_data_managers=invalid_data_managers,
- data_managers_errors=data_managers_errors,
- new_install=False,
- reinstalling=reinstalling )
+ gucm = GalaxyUtilityContainerManager( self.app )
+ containers_dict = gucm.build_repository_containers( repository=repository,
+ datatypes=datatypes,
+ invalid_tools=invalid_tools,
+ missing_repository_dependencies=missing_repository_dependencies,
+ missing_tool_dependencies=missing_tool_dependencies,
+ readme_files_dict=readme_files_dict,
+ repository_dependencies=installed_repository_dependencies,
+ tool_dependencies=installed_tool_dependencies,
+ valid_tools=valid_tools,
+ workflows=workflows,
+ valid_data_managers=valid_data_managers,
+ invalid_data_managers=invalid_data_managers,
+ data_managers_errors=data_managers_errors,
+ new_install=False,
+ reinstalling=reinstalling )
else:
containers_dict = dict( datatypes=None,
invalid_tools=None,
diff -r a0db2788e9125270aec5391e676d8a0b36691233 -r 7dd390cfd674cae4c2833fb36f9b4875576cb1c0 lib/tool_shed/galaxy_install/utility_containers/__init__.py
--- /dev/null
+++ b/lib/tool_shed/galaxy_install/utility_containers/__init__.py
@@ -0,0 +1,145 @@
+import logging
+import os
+import threading
+
+from tool_shed.utility_containers import utility_container_manager
+
+log = logging.getLogger( __name__ )
+
+
+class GalaxyUtilityContainerManager( utility_container_manager.UtilityContainerManager ):
+
+ def __init__( self, app ):
+ self.app = app
+
+ def build_repository_containers( self, repository, datatypes, invalid_tools, missing_repository_dependencies,
+ missing_tool_dependencies, readme_files_dict, repository_dependencies,
+ tool_dependencies, valid_tools, workflows, valid_data_managers,
+ invalid_data_managers, data_managers_errors, new_install=False,
+ reinstalling=False ):
+ """
+ Return a dictionary of containers for the received repository's dependencies and readme files for
+ display during installation to Galaxy.
+ """
+ containers_dict = dict( datatypes=None,
+ invalid_tools=None,
+ missing_tool_dependencies=None,
+ readme_files=None,
+ repository_dependencies=None,
+ missing_repository_dependencies=None,
+ tool_dependencies=None,
+ valid_tools=None,
+ workflows=None,
+ valid_data_managers=None,
+ invalid_data_managers=None )
+ # Some of the tool dependency folders will include links to display tool dependency information, and
+ # some of these links require the repository id. However we need to be careful because sometimes the
+ # repository object is None.
+ if repository:
+ repository_id = repository.id
+ changeset_revision = repository.changeset_revision
+ else:
+ repository_id = None
+ changeset_revision = None
+ lock = threading.Lock()
+ lock.acquire( True )
+ try:
+ folder_id = 0
+ # Datatypes container.
+ if datatypes:
+ folder_id, datatypes_root_folder = self.build_datatypes_folder( folder_id, datatypes )
+ containers_dict[ 'datatypes' ] = datatypes_root_folder
+ # Invalid tools container.
+ if invalid_tools:
+ folder_id, invalid_tools_root_folder = \
+ self.build_invalid_tools_folder( folder_id,
+ invalid_tools,
+ changeset_revision,
+ repository=repository,
+ label='Invalid tools' )
+ containers_dict[ 'invalid_tools' ] = invalid_tools_root_folder
+ # Readme files container.
+ if readme_files_dict:
+ folder_id, readme_files_root_folder = self.build_readme_files_folder( folder_id, readme_files_dict )
+ containers_dict[ 'readme_files' ] = readme_files_root_folder
+ # Installed repository dependencies container.
+ if repository_dependencies:
+ if new_install:
+ label = 'Repository dependencies'
+ else:
+ label = 'Installed repository dependencies'
+ folder_id, repository_dependencies_root_folder = \
+ self.build_repository_dependencies_folder( folder_id=folder_id,
+ repository_dependencies=repository_dependencies,
+ label=label,
+ installed=True )
+ containers_dict[ 'repository_dependencies' ] = repository_dependencies_root_folder
+ # Missing repository dependencies container.
+ if missing_repository_dependencies:
+ folder_id, missing_repository_dependencies_root_folder = \
+ self.build_repository_dependencies_folder( folder_id=folder_id,
+ repository_dependencies=missing_repository_dependencies,
+ label='Missing repository dependencies',
+ installed=False )
+ containers_dict[ 'missing_repository_dependencies' ] = missing_repository_dependencies_root_folder
+ # Installed tool dependencies container.
+ if tool_dependencies:
+ if new_install:
+ label = 'Tool dependencies'
+ else:
+ label = 'Installed tool dependencies'
+ # We only want to display the Status column if the tool_dependency is missing.
+ folder_id, tool_dependencies_root_folder = \
+ self.build_tool_dependencies_folder( folder_id,
+ tool_dependencies,
+ label=label,
+ missing=False,
+ new_install=new_install,
+ reinstalling=reinstalling )
+ containers_dict[ 'tool_dependencies' ] = tool_dependencies_root_folder
+ # Missing tool dependencies container.
+ if missing_tool_dependencies:
+ # We only want to display the Status column if the tool_dependency is missing.
+ folder_id, missing_tool_dependencies_root_folder = \
+ self.build_tool_dependencies_folder( folder_id,
+ missing_tool_dependencies,
+ label='Missing tool dependencies',
+ missing=True,
+ new_install=new_install,
+ reinstalling=reinstalling )
+ containers_dict[ 'missing_tool_dependencies' ] = missing_tool_dependencies_root_folder
+ # Valid tools container.
+ if valid_tools:
+ folder_id, valid_tools_root_folder = self.build_tools_folder( folder_id,
+ valid_tools,
+ repository,
+ changeset_revision,
+ label='Valid tools' )
+ containers_dict[ 'valid_tools' ] = valid_tools_root_folder
+ # Workflows container.
+ if workflows:
+ folder_id, workflows_root_folder = \
+ self.build_workflows_folder( folder_id=folder_id,
+ workflows=workflows,
+ repository_metadata_id=None,
+ repository_id=repository_id,
+ label='Workflows' )
+ containers_dict[ 'workflows' ] = workflows_root_folder
+ if valid_data_managers:
+ folder_id, valid_data_managers_root_folder = \
+ self.build_data_managers_folder( folder_id=folder_id,
+ data_managers=valid_data_managers,
+ label='Valid Data Managers' )
+ containers_dict[ 'valid_data_managers' ] = valid_data_managers_root_folder
+ if invalid_data_managers or data_managers_errors:
+ folder_id, invalid_data_managers_root_folder = \
+ self.build_invalid_data_managers_folder( folder_id=folder_id,
+ data_managers=invalid_data_managers,
+ error_messages=data_managers_errors,
+ label='Invalid Data Managers' )
+ containers_dict[ 'invalid_data_managers' ] = invalid_data_managers_root_folder
+ except Exception, e:
+ log.debug( "Exception in build_repository_containers: %s" % str( e ) )
+ finally:
+ lock.release()
+ return containers_dict
diff -r a0db2788e9125270aec5391e676d8a0b36691233 -r 7dd390cfd674cae4c2833fb36f9b4875576cb1c0 lib/tool_shed/grids/repository_grid_filter_manager.py
--- a/lib/tool_shed/grids/repository_grid_filter_manager.py
+++ b/lib/tool_shed/grids/repository_grid_filter_manager.py
@@ -27,7 +27,7 @@
return "Certified 2 Repository Suites %s" % trailing_string
if filter == self.filters.SUITES:
return "Repository Suites %s" % trailing_string
- return "%s" % default
+ return "%s %s" % ( default, trailing_string )
def get_filter( self, trans ):
filter = trans.get_cookie( name='toolshedrepogridfilter' )
This diff is so big that we needed to truncate the remainder.
https://bitbucket.org/galaxy/galaxy-central/commits/213a23e98fec/
Changeset: 213a23e98fec
User: dannon
Date: 2014-08-05 16:00:07
Summary: Merged in iracooke/galaxy-central (pull request #446)
Metadata detection for sqlite datatype
Affected #: 1 file
diff -r a714f168aa7ddb1dfd3142f49869992cd325456c -r 213a23e98fec2ad620483e36286ce4a35b3f7c1f lib/galaxy/datatypes/binary.py
--- a/lib/galaxy/datatypes/binary.py
+++ b/lib/galaxy/datatypes/binary.py
@@ -20,7 +20,7 @@
from bx.seq.twobit import TWOBIT_MAGIC_NUMBER, TWOBIT_MAGIC_NUMBER_SWAP, TWOBIT_MAGIC_SIZE
-from galaxy.datatypes.metadata import MetadataElement
+from galaxy.datatypes.metadata import MetadataElement,ListParameter,DictParameter
from galaxy.datatypes import metadata
from galaxy.datatypes.sniff import *
import dataproviders
@@ -550,8 +550,36 @@
@dataproviders.decorators.has_dataproviders
class SQlite ( Binary ):
+ """Class describing a Sqlite database """
+ MetadataElement( name="tables", default=[], param=ListParameter, desc="Database Tables", readonly=True, visible=True, no_value=[] )
+ MetadataElement( name="table_columns", default={}, param=DictParameter, desc="Database Table Columns", readonly=True, visible=True, no_value={} )
+ MetadataElement( name="table_row_count", default={}, param=DictParameter, desc="Database Table Row Count", readonly=True, visible=True, no_value={} )
file_ext = "sqlite"
+ def init_meta( self, dataset, copy_from=None ):
+ Binary.init_meta( self, dataset, copy_from=copy_from )
+
+ def set_meta( self, dataset, overwrite = True, **kwd ):
+ try:
+ tables = []
+ columns = dict()
+ rowcounts = dict()
+ conn = sqlite3.connect(dataset.file_name)
+ c = conn.cursor()
+ tables_query = "SELECT name,sql FROM sqlite_master WHERE type='table' ORDER BY name"
+ rslt = c.execute(tables_query).fetchall()
+ for table,sql in rslt:
+ tables.append(table)
+ columns[table] = re.sub('^.*\((.*)\)$','\\1',sql).split(',')
+ for table in tables:
+ row_query = "SELECT count(*) FROM %s" % table
+ rowcounts[table] = c.execute(row_query).fetchone()[0]
+ dataset.metadata.tables = tables
+ dataset.metadata.table_columns = columns
+ dataset.metadata.table_row_count = rowcounts
+ except Exception, exc:
+ pass
+
# Connects and runs a query that should work on any real database
# If the file is not sqlite, an exception will be thrown and the sniffer will return false
def sniff( self, filename ):
@@ -568,6 +596,14 @@
def set_peek( self, dataset, is_multi_byte=False ):
if not dataset.dataset.purged:
dataset.peek = "SQLite Database"
+ lines = ['SQLite Database']
+ if dataset.metadata.tables:
+ for table in dataset.metadata.tables:
+ try:
+ lines.append('%s [%s]' % (table,dataset.metadata.table_row_count[table]))
+ except:
+ continue
+ dataset.peek = '\n'.join(lines)
dataset.blurb = data.nice_size( dataset.get_size() )
else:
dataset.peek = 'file does not exist'
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/ea4f983c227e/
Changeset: ea4f983c227e
User: jmchilton
Date: 2014-08-05 03:45:02
Summary: API tests for authenticate and some of users endpoints.
Affected #: 4 files
diff -r d4070ec86d404eec61f78a60f23536080b04ab1f -r ea4f983c227e4cac4b331699e8b7a87f9383df06 test/api/test_authenticate.py
--- /dev/null
+++ b/test/api/test_authenticate.py
@@ -0,0 +1,29 @@
+import base64
+
+from base.interactor import get_request
+from base import api
+
+
+TEST_USER_EMAIL = "auth_user_test(a)bx.psu.edu"
+TEST_USER_PASSWORD = "testpassword1"
+
+
+class AuthenticationApiTestCase( api.ApiTestCase ):
+
+ def test_auth( self ):
+ self._setup_user( TEST_USER_EMAIL, TEST_USER_PASSWORD )
+ baseauth_url = self._api_url( "authenticate/baseauth", use_key=False )
+ unencoded_credentials = "%s:%s" % ( TEST_USER_EMAIL, TEST_USER_PASSWORD )
+ authorization = base64.b64encode(unencoded_credentials)
+ headers = {
+ "Authorization": authorization,
+ }
+ auth_response = get_request( baseauth_url, headers=headers )
+ self._assert_status_code_is( auth_response, 200 )
+ auth_dict = auth_response.json()
+ self._assert_has_keys( auth_dict, "api_key" )
+
+ # Verify key...
+ random_api_url = self._api_url( "users", use_key=False )
+ random_api_response = get_request( random_api_url, params=dict( key=auth_dict[ "api_key" ] ) )
+ self._assert_status_code_is( random_api_response, 200 )
diff -r d4070ec86d404eec61f78a60f23536080b04ab1f -r ea4f983c227e4cac4b331699e8b7a87f9383df06 test/api/test_users.py
--- /dev/null
+++ b/test/api/test_users.py
@@ -0,0 +1,24 @@
+from base import api
+
+TEST_USER_EMAIL = "user_for_users_index_test(a)bx.psu.edu"
+
+
+class UsersApiTestCase( api.ApiTestCase ):
+
+ def test_index( self ):
+ self._setup_user( TEST_USER_EMAIL )
+ all_users_response = self._get( "users", admin=True )
+ self._assert_status_code_is( all_users_response, 200 )
+ all_users = all_users_response.json()
+ # New user is in list
+ assert len( [ u for u in all_users if u[ "email" ] == TEST_USER_EMAIL ] ) == 1
+ # Request made from admin user, so should at least self and this
+ # new user.
+ assert len( all_users ) > 1
+
+ def test_index_only_self_for_nonadmins( self ):
+ self._setup_user( TEST_USER_EMAIL )
+ with self._different_user( ):
+ all_users_response = self._get( "users" )
+ # Non admin users can only see themselves
+ assert len( all_users_response.json() ) == 1
diff -r d4070ec86d404eec61f78a60f23536080b04ab1f -r ea4f983c227e4cac4b331699e8b7a87f9383df06 test/base/api.py
--- a/test/base/api.py
+++ b/test/base/api.py
@@ -41,8 +41,8 @@
url = "%s?%s" % ( url, query )
return url
- def _setup_user( self, email ):
- self.galaxy_interactor.ensure_user_with_email(email)
+ def _setup_user( self, email, password=None ):
+ self.galaxy_interactor.ensure_user_with_email( email, password=password )
users = self._get( "users", admin=True ).json()
user = [ user for user in users if user["email"] == email ][0]
return user
diff -r d4070ec86d404eec61f78a60f23536080b04ab1f -r ea4f983c227e4cac4b331699e8b7a87f9383df06 test/base/interactor.py
--- a/test/base/interactor.py
+++ b/test/base/interactor.py
@@ -325,16 +325,17 @@
)
return self._post( "tools", files=files, data=data )
- def ensure_user_with_email( self, email ):
+ def ensure_user_with_email( self, email, password=None ):
admin_key = self.master_api_key
all_users = self._get( 'users', key=admin_key ).json()
try:
test_user = [ user for user in all_users if user["email"] == email ][0]
except IndexError:
username = re.sub('[^a-z-]', '--', email.lower())
+ password = password or 'testpass'
data = dict(
email=email,
- password='testuser',
+ password=password,
username=username,
)
test_user = self._post( 'users', data, key=admin_key ).json()
https://bitbucket.org/galaxy/galaxy-central/commits/a714f168aa7d/
Changeset: a714f168aa7d
User: jmchilton
Date: 2014-08-05 03:45:02
Summary: Introduce ApiKeyManager to replace and expand upon CreatedApiKeysMixin.
Affected #: 3 files
diff -r ea4f983c227e4cac4b331699e8b7a87f9383df06 -r a714f168aa7ddb1dfd3142f49869992cd325456c lib/galaxy/managers/api_keys.py
--- /dev/null
+++ b/lib/galaxy/managers/api_keys.py
@@ -0,0 +1,26 @@
+
+
+class ApiKeyManager( object ):
+
+ def __init__( self, app ):
+ self.app = app
+
+ def create_api_key( self, user ):
+ guid = self.app.security.get_new_guid()
+ new_key = self.app.model.APIKeys()
+ new_key.user_id = user.id
+ new_key.key = guid
+ sa_session = self.app.model.context
+ sa_session.add( new_key )
+ sa_session.flush()
+ return guid
+
+ def get_or_create_api_key( self, user ):
+ # Logic Galaxy has always used - but it would appear to have a race
+ # condition. Worth fixing? Would kind of need a message queue to fix
+ # in multiple process mode.
+ if user.api_keys:
+ key = user.api_keys[0].key
+ else:
+ key = self.create_api_key( user )
+ return key
diff -r ea4f983c227e4cac4b331699e8b7a87f9383df06 -r a714f168aa7ddb1dfd3142f49869992cd325456c lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -37,6 +37,7 @@
from galaxy.model import ExtendedMetadata, ExtendedMetadataIndex, LibraryDatasetDatasetAssociation, HistoryDatasetAssociation
+from galaxy.managers import api_keys
from galaxy.datatypes.metadata import FileParameter
from galaxy.tools.parameters import RuntimeValue, visit_input_values
from galaxy.tools.parameters.basic import DataToolParameter
@@ -286,16 +287,12 @@
class CreatesApiKeysMixin:
"""
Mixing centralizing logic for creating API keys for user objects.
+
+ Deprecated - please use api_keys.ApiKeyManager for new development.
"""
def create_api_key( self, trans, user ):
- guid = trans.app.security.get_new_guid()
- new_key = trans.app.model.APIKeys()
- new_key.user_id = user.id
- new_key.key = guid
- trans.sa_session.add( new_key )
- trans.sa_session.flush()
- return guid
+ return api_keys.ApiKeyManager( trans.app ).create_api_key( user )
class SharableItemSecurityMixin:
diff -r ea4f983c227e4cac4b331699e8b7a87f9383df06 -r a714f168aa7ddb1dfd3142f49869992cd325456c lib/galaxy/webapps/galaxy/api/authenticate.py
--- a/lib/galaxy/webapps/galaxy/api/authenticate.py
+++ b/lib/galaxy/webapps/galaxy/api/authenticate.py
@@ -15,14 +15,19 @@
from urllib import unquote
from galaxy.web import _future_expose_api_anonymous as expose_api_anonymous
+from galaxy.managers import api_keys
from galaxy import exceptions
-from galaxy.web.base.controller import BaseAPIController, CreatesApiKeysMixin
+from galaxy.web.base.controller import BaseAPIController
import logging
log = logging.getLogger( __name__ )
-class AuthenticationController( BaseAPIController, CreatesApiKeysMixin ):
+class AuthenticationController( BaseAPIController ):
+
+ def __init__( self, app ):
+ super( AuthenticationController, self ).__init__( app )
+ self.api_keys_manager = api_keys.ApiKeyManager( app )
@expose_api_anonymous
def get_api_key( self, trans, **kwd ):
@@ -47,10 +52,7 @@
user = user[0]
is_valid_user = user.check_password( password )
if ( is_valid_user ):
- if user.api_keys:
- key = user.api_keys[0].key
- else:
- key = self.create_api_key( trans, user )
+ key = self.api_keys_manager.get_or_create_api_key( user )
return dict( api_key=key )
else:
raise exceptions.AuthenticationFailed()
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
04 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d4070ec86d40/
Changeset: d4070ec86d40
User: jmchilton
Date: 2014-08-04 21:02:01
Summary: Merge next-stable.
Affected #: 6 files
diff -r cd82587fb36ecbc802931edad29372f69cee7108 -r d4070ec86d404eec61f78a60f23536080b04ab1f lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -69,7 +69,7 @@
from galaxy.model import Workflow
from tool_shed.util import common_util
from tool_shed.util import shed_util_common as suc
-from .loader import load_tool, template_macro_params
+from .loader import load_tool, template_macro_params, raw_tool_xml_tree, imported_macro_paths
from .execute import execute as execute_job
from .wrappers import (
ToolParameterValueWrapper,
@@ -2989,6 +2989,23 @@
def get_default_history_by_trans( self, trans, create=False ):
return trans.get_history( create=create )
+ @classmethod
+ def get_externally_referenced_paths( self, path ):
+ """ Return relative paths to externally referenced files by the tool
+ described by file at `path`. External components should not assume things
+ about the structure of tool xml files (this is the tool's responsibility).
+ """
+ tree = raw_tool_xml_tree(path)
+ root = tree.getroot()
+ external_paths = []
+ for code_elem in root.findall( 'code' ):
+ external_path = code_elem.get( 'file' )
+ if external_path:
+ external_paths.append( external_path )
+ external_paths.extend( imported_macro_paths( root ) )
+ # May also need to load external citation files as well at some point.
+ return external_paths
+
class OutputParameterJSONTool( Tool ):
"""
diff -r cd82587fb36ecbc802931edad29372f69cee7108 -r d4070ec86d404eec61f78a60f23536080b04ab1f lib/galaxy/tools/loader.py
--- a/lib/galaxy/tools/loader.py
+++ b/lib/galaxy/tools/loader.py
@@ -10,7 +10,7 @@
"""
Loads tool from file system and preprocesses tool macros.
"""
- tree = parse_xml(path)
+ tree = raw_tool_xml_tree(path)
root = tree.getroot()
_import_macros(root, path)
@@ -38,14 +38,31 @@
return param_dict
+def raw_tool_xml_tree(path):
+ """ Load raw (no macro expansion) tree representation of tool represented
+ at the specified path.
+ """
+ tree = parse_xml(path)
+ return tree
+
+
+def imported_macro_paths(root):
+ macros_el = _macros_el(root)
+ return _imported_macro_paths_from_el(macros_el)
+
+
def _import_macros(root, path):
tool_dir = os.path.dirname(path)
- macros_el = root.find('macros')
+ macros_el = _macros_el(root)
if macros_el:
macro_els = _load_macros(macros_el, tool_dir)
_xml_set_children(macros_el, macro_els)
+def _macros_el(root):
+ return root.find('macros')
+
+
def _macros_of_type(root, type, el_func):
macros_el = root.find('macros')
macro_dict = {}
@@ -159,6 +176,17 @@
def _load_imported_macros(macros_el, tool_dir):
macros = []
+ for tool_relative_import_path in _imported_macro_paths_from_el(macros_el):
+ import_path = \
+ os.path.join(tool_dir, tool_relative_import_path)
+ file_macros = _load_macro_file(import_path, tool_dir)
+ macros.extend(file_macros)
+
+ return macros
+
+
+def _imported_macro_paths_from_el(macros_el):
+ imported_macro_paths = []
macro_import_els = []
if macros_el:
macro_import_els = macros_el.findall("import")
@@ -166,12 +194,8 @@
raw_import_path = macro_import_el.text
tool_relative_import_path = \
os.path.basename(raw_import_path) # Sanitize this
- import_path = \
- os.path.join(tool_dir, tool_relative_import_path)
- file_macros = _load_macro_file(import_path, tool_dir)
- macros.extend(file_macros)
-
- return macros
+ imported_macro_paths.append( tool_relative_import_path )
+ return imported_macro_paths
def _load_macro_file(path, tool_dir):
diff -r cd82587fb36ecbc802931edad29372f69cee7108 -r d4070ec86d404eec61f78a60f23536080b04ab1f lib/tool_shed/tools/tool_validator.py
--- a/lib/tool_shed/tools/tool_validator.py
+++ b/lib/tool_shed/tools/tool_validator.py
@@ -3,6 +3,7 @@
import os
import tempfile
+from galaxy.tools import Tool
from galaxy.tools import parameters
from galaxy.tools.parameters import dynamic_options
@@ -311,15 +312,14 @@
message = ''
tmp_tool_config = hg_util.get_named_tmpfile_from_ctx( ctx, ctx_file, work_dir )
if tmp_tool_config:
- element_tree, error_message = xml_util.parse_xml( tmp_tool_config )
- if element_tree is None:
+ tool_element, error_message = xml_util.parse_xml( tmp_tool_config )
+ if tool_element is None:
return tool, message
- element_tree_root = element_tree.getroot()
- # Look for code files required by the tool config.
+ # Look for external files required by the tool config.
tmp_code_files = []
- for code_elem in element_tree_root.findall( 'code' ):
- code_file_name = code_elem.get( 'file' )
- tmp_code_file_name = hg_util.copy_file_from_manifest( repo, ctx, code_file_name, work_dir )
+ external_paths = Tool.get_externally_referenced_paths( tmp_tool_config )
+ for path in external_paths:
+ tmp_code_file_name = hg_util.copy_file_from_manifest( repo, ctx, path, work_dir )
if tmp_code_file_name:
tmp_code_files.append( tmp_code_file_name )
tool, valid, message = self.load_tool_from_config( repository_id, tmp_tool_config )
diff -r cd82587fb36ecbc802931edad29372f69cee7108 -r d4070ec86d404eec61f78a60f23536080b04ab1f static/scripts/packed/viz/trackster/painters.js
--- a/static/scripts/packed/viz/trackster/painters.js
+++ b/static/scripts/packed/viz/trackster/painters.js
@@ -1,1 +1,1 @@
-define(["libs/underscore"],function(_){var BEFORE=1001,CONTAINS=1002,OVERLAP_START=1003,OVERLAP_END=1004,CONTAINED_BY=1005,AFTER=1006;var compute_overlap=function(first_region,second_region){var first_start=first_region[0],first_end=first_region[1],second_start=second_region[0],second_end=second_region[1],overlap;if(first_start<second_start){if(first_end<=second_start){overlap=BEFORE}else{if(first_end<=second_end){overlap=OVERLAP_START}else{overlap=CONTAINS}}}else{if(first_start>second_end){overlap=AFTER}else{if(first_end<=second_end){overlap=CONTAINED_BY}else{overlap=OVERLAP_END}}}return overlap};var is_overlap=function(first_region,second_region){var overlap=compute_overlap(first_region,second_region);return(overlap!==BEFORE&&overlap!==AFTER)};var dashedLine=function(ctx,x1,y1,x2,y2,dashLen){if(dashLen===undefined){dashLen=4}var dX=x2-x1;var dY=y2-y1;var dashes=Math.floor(Math.sqrt(dX*dX+dY*dY)/dashLen);var dashX=dX/dashes;var dashY=dY/dashes;var q;for(q=0;q<dashes;q++,x1+=dashX,y1+=dashY){if(q%2!==0){continue}ctx.fillRect(x1,y1,dashLen,1)}};var drawDownwardEquilateralTriangle=function(ctx,down_vertex_x,down_vertex_y,side_len){var x1=down_vertex_x-side_len/2,x2=down_vertex_x+side_len/2,y=down_vertex_y-Math.sqrt(side_len*3/2);ctx.beginPath();ctx.moveTo(x1,y);ctx.lineTo(x2,y);ctx.lineTo(down_vertex_x,down_vertex_y);ctx.lineTo(x1,y);ctx.strokeStyle=this.fillStyle;ctx.fill();ctx.stroke();ctx.closePath()};var Scaler=function(default_val){this.default_val=(default_val?default_val:1)};Scaler.prototype.gen_val=function(input){return this.default_val};var DrawResults=function(options){this.incomplete_features=options.incomplete_features;this.feature_mapper=options.feature_mapper};var Painter=function(data,view_start,view_end,prefs,mode){this.data=data;this.view_start=view_start;this.view_end=view_end;this.prefs=_.extend({},this.default_prefs,prefs);this.mode=mode};Painter.prototype.default_prefs={};Painter.prototype.draw=function(ctx,width,height,w_scale){};var LinePainter=function(data,view_start,view_end,prefs,mode){Painter.call(this,data,view_start,view_end,prefs,mode);if(this.prefs.min_value===undefined){this.prefs.min_value=_.min(_.map(this.data,function(d){return d[1]}))||0}if(this.prefs.max_value===undefined){this.prefs.max_value=_.max(_.map(this.data,function(d){return d[1]}))||0}};LinePainter.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Histogram",color:"#000",overflow_color:"#F66"};LinePainter.prototype.draw=function(ctx,width,height,w_scale){var in_path=false,min_value=this.prefs.min_value,max_value=this.prefs.max_value,vertical_range=max_value-min_value,height_px=height,view_start=this.view_start,mode=this.mode,data=this.data;ctx.save();var y_zero=Math.round(height+min_value/vertical_range*height);if(mode!=="Intensity"){ctx.fillStyle="#aaa";ctx.fillRect(0,y_zero,width,1)}ctx.beginPath();var x_scaled,y,delta_x_px;if(data.length>1){delta_x_px=Math.ceil((data[1][0]-data[0][0])*w_scale)}else{delta_x_px=10}var painter_color=this.prefs.block_color||this.prefs.color,pref_color=parseInt(painter_color.slice(1),16),pref_r=(pref_color&16711680)>>16,pref_g=(pref_color&65280)>>8,pref_b=pref_color&255,top_overflow=false,bot_overflow=false;for(var i=0,len=data.length;i<len;i++){ctx.fillStyle=ctx.strokeStyle=painter_color;top_overflow=bot_overflow=false;x_scaled=Math.round((data[i][0]-view_start)*w_scale);y=data[i][1];if(y===null){if(in_path&&mode==="Filled"){ctx.lineTo(x_scaled,height_px)}in_path=false;continue}if(y<min_value){bot_overflow=true;y=min_value}else{if(y>max_value){top_overflow=true;y=max_value}}if(mode==="Histogram"){y=Math.round(y/vertical_range*height_px);ctx.fillRect(x_scaled,y_zero,delta_x_px,-y)}else{if(mode==="Intensity"){var saturation=(y-min_value)/vertical_range,new_r=Math.round(pref_r+(255-pref_r)*(1-saturation)),new_g=Math.round(pref_g+(255-pref_g)*(1-saturation)),new_b=Math.round(pref_b+(255-pref_b)*(1-saturation));ctx.fillStyle="rgb("+new_r+","+new_g+","+new_b+")";ctx.fillRect(x_scaled,0,delta_x_px,height_px)}else{y=Math.round(height_px-(y-min_value)/vertical_range*height_px);if(in_path){ctx.lineTo(x_scaled,y)}else{in_path=true;if(mode==="Filled"){ctx.moveTo(x_scaled,height_px);ctx.lineTo(x_scaled,y)}else{ctx.moveTo(x_scaled,y)}}}}ctx.fillStyle=this.prefs.overflow_color;if(top_overflow||bot_overflow){var overflow_x;if(mode==="Histogram"||mode==="Intensity"){overflow_x=delta_x_px}else{x_scaled-=2;overflow_x=4}if(top_overflow){ctx.fillRect(x_scaled,0,overflow_x,3)}if(bot_overflow){ctx.fillRect(x_scaled,height_px-3,overflow_x,3)}}ctx.fillStyle=painter_color}if(mode==="Filled"){if(in_path){ctx.lineTo(x_scaled,y_zero);ctx.lineTo(0,y_zero)}ctx.fill()}else{ctx.stroke()}ctx.restore()};var FeaturePositionMapper=function(slot_height){this.feature_positions={};this.slot_height=slot_height;this.translation=0;this.y_translation=0};FeaturePositionMapper.prototype.map_feature_data=function(feature_data,slot,x_start,x_end){if(!this.feature_positions[slot]){this.feature_positions[slot]=[]}this.feature_positions[slot].push({data:feature_data,x_start:x_start,x_end:x_end})};FeaturePositionMapper.prototype.get_feature_data=function(x,y){var slot=Math.floor((y-this.y_translation)/this.slot_height),feature_dict;if(!this.feature_positions[slot]){return null}x+=this.translation;for(var i=0;i<this.feature_positions[slot].length;i++){feature_dict=this.feature_positions[slot][i];if(x>=feature_dict.x_start&&x<=feature_dict.x_end){return feature_dict.data}}};var FeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){Painter.call(this,data,view_start,view_end,prefs,mode);this.alpha_scaler=(alpha_scaler?alpha_scaler:new Scaler());this.height_scaler=(height_scaler?height_scaler:new Scaler());this.max_label_length=200};FeaturePainter.prototype.default_prefs={block_color:"#FFF",connector_color:"#FFF"};_.extend(FeaturePainter.prototype,{get_required_height:function(rows_required,width){var required_height=this.get_row_height(),y_scale=required_height,mode=this.mode;if(mode==="no_detail"||mode==="Squish"||mode==="Pack"){required_height=rows_required*y_scale}return required_height+this.get_top_padding(width)},get_top_padding:function(width){return 0},draw:function(ctx,width,height,w_scale,slots){var data=this.data,view_start=this.view_start,view_end=this.view_end;ctx.save();ctx.fillStyle=this.prefs.block_color;ctx.textAlign="right";var y_scale=this.get_row_height(),feature_mapper=new FeaturePositionMapper(y_scale),x_draw_coords,incomplete_features=[];for(var i=0,len=data.length;i<len;i++){var feature=data[i],feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],slot=(slots&&slots[feature_uid]!==undefined?slots[feature_uid]:null);if((this.mode==="Dense"||slot!==null)&&(feature_start<view_end&&feature_end>view_start)){x_draw_coords=this.draw_element(ctx,this.mode,feature,slot,view_start,view_end,w_scale,y_scale,width);feature_mapper.map_feature_data(feature,slot,x_draw_coords[0],x_draw_coords[1]);if(feature_start<view_start||feature_end>view_end){incomplete_features.push(feature)}}}ctx.restore();feature_mapper.y_translation=this.get_top_padding(width);return new DrawResults({incomplete_features:incomplete_features,feature_mapper:feature_mapper})},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){return[0,0]}});var DENSE_TRACK_HEIGHT=10,NO_DETAIL_TRACK_HEIGHT=3,SQUISH_TRACK_HEIGHT=5,PACK_TRACK_HEIGHT=10,NO_DETAIL_FEATURE_HEIGHT=1,DENSE_FEATURE_HEIGHT=9,SQUISH_FEATURE_HEIGHT=3,PACK_FEATURE_HEIGHT=9,LABEL_SPACING=2,CONNECTOR_COLOR="#ccc";var LinkedFeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){FeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.draw_background_connector=true;this.draw_individual_connectors=false};_.extend(LinkedFeaturePainter.prototype,FeaturePainter.prototype,{get_row_height:function(){var mode=this.mode,height;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="no_detail"){height=NO_DETAIL_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT}}}return height},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){var feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],feature_name=feature[3],feature_strand=feature[4],f_start=Math.floor(Math.max(0,(feature_start-tile_low-0.5)*w_scale)),f_end=Math.ceil(Math.min(width,Math.max(0,(feature_end-tile_low-0.5)*w_scale))),draw_start=f_start,draw_end=f_end,y_start=(mode==="Dense"?0:(0+slot))*y_scale+this.get_top_padding(width),thickness,y_start,thick_start=null,thick_end=null,block_color=(!feature_strand||feature_strand==="+"||feature_strand==="."?this.prefs.block_color:this.prefs.reverse_strand_color);label_color=this.prefs.label_color;ctx.globalAlpha=this.alpha_scaler.gen_val(feature);if(mode==="Dense"){slot=1}if(mode==="no_detail"){ctx.fillStyle=block_color;ctx.fillRect(f_start,y_start+5,f_end-f_start,NO_DETAIL_FEATURE_HEIGHT)}else{var feature_ts=feature[5],feature_te=feature[6],feature_blocks=feature[7],full_height=true;if(feature_ts&&feature_te){thick_start=Math.floor(Math.max(0,(feature_ts-tile_low)*w_scale));thick_end=Math.ceil(Math.min(width,Math.max(0,(feature_te-tile_low)*w_scale)))}var thin_height,thick_height;if(mode==="Squish"){thin_height=1;thick_height=SQUISH_FEATURE_HEIGHT;full_height=false}else{if(mode==="Dense"){thin_height=5;thick_height=DENSE_FEATURE_HEIGHT}else{thin_height=5;thick_height=PACK_FEATURE_HEIGHT}}if(!feature_blocks){ctx.fillStyle=block_color;ctx.fillRect(f_start,y_start+1,f_end-f_start,thick_height);if(feature_strand&&full_height){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand_inv")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand_inv")}}ctx.fillRect(f_start,y_start+1,f_end-f_start,thick_height)}}else{var cur_y_start,cur_height;if(mode==="Squish"||mode==="Dense"){cur_y_start=y_start+Math.floor(SQUISH_FEATURE_HEIGHT/2)+1;cur_height=1}else{if(feature_strand){cur_y_start=y_start;cur_height=thick_height}else{cur_y_start+=(SQUISH_FEATURE_HEIGHT/2)+1;cur_height=1}}if(this.draw_background_connector){if(mode==="Squish"||mode==="Dense"){ctx.fillStyle=CONNECTOR_COLOR}else{if(feature_strand){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand")}}}else{ctx.fillStyle=CONNECTOR_COLOR}}ctx.fillRect(f_start,cur_y_start,f_end-f_start,cur_height)}var start_and_height;for(var k=0,k_len=feature_blocks.length;k<k_len;k++){var block=feature_blocks[k],block_start=Math.floor(Math.max(0,(block[0]-tile_low-0.5)*w_scale)),block_end=Math.ceil(Math.min(width,Math.max((block[1]-tile_low-0.5)*w_scale))),last_block_start,last_block_end;if(block_start>block_end){continue}ctx.fillStyle=block_color;ctx.fillRect(block_start,y_start+(thick_height-thin_height)/2+1,block_end-block_start,thin_height);if(thick_start!==undefined&&feature_te>feature_ts&&!(block_start>thick_end||block_end<thick_start)){var block_thick_start=Math.max(block_start,thick_start),block_thick_end=Math.min(block_end,thick_end);ctx.fillRect(block_thick_start,y_start+1,block_thick_end-block_thick_start,thick_height);if(feature_blocks.length===1&&mode==="Pack"){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand_inv")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand_inv")}}if(block_thick_start+14<block_thick_end){block_thick_start+=2;block_thick_end-=2}ctx.fillRect(block_thick_start,y_start+1,block_thick_end-block_thick_start,thick_height)}}if(this.draw_individual_connectors&&last_block_start){this.draw_connector(ctx,last_block_start,last_block_end,block_start,block_end,y_start)}last_block_start=block_start;last_block_end=block_end}if(mode==="Pack"){ctx.globalAlpha=1;ctx.fillStyle="white";var hscale_factor=this.height_scaler.gen_val(feature),new_height=Math.ceil(thick_height*hscale_factor),ws_height=Math.round((thick_height-new_height)/2);if(hscale_factor!==1){ctx.fillRect(f_start,cur_y_start+1,f_end-f_start,ws_height);ctx.fillRect(f_start,cur_y_start+thick_height-ws_height+1,f_end-f_start,ws_height)}}}ctx.globalAlpha=1;if(feature_name&&mode==="Pack"&&feature_start>tile_low){ctx.fillStyle=label_color;if(tile_low===0&&f_start-ctx.measureText(feature_name).width<0){ctx.textAlign="left";ctx.fillText(feature_name,f_end+LABEL_SPACING,y_start+8,this.max_label_length);draw_end+=ctx.measureText(feature_name).width+LABEL_SPACING}else{ctx.textAlign="right";ctx.fillText(feature_name,f_start-LABEL_SPACING,y_start+8,this.max_label_length);draw_start-=ctx.measureText(feature_name).width+LABEL_SPACING}}}ctx.globalAlpha=1;return[draw_start,draw_end]}});var ReadPainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler,ref_seq,base_color_fn){FeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.ref_seq=(ref_seq?ref_seq.data:null);this.base_color_fn=base_color_fn};_.extend(ReadPainter.prototype,FeaturePainter.prototype,{get_row_height:function(){var height,mode=this.mode;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT;if(this.prefs.show_insertions){height*=2}}}return height},_parse_cigar:function(cigar_str){var cigar_ops="MIDNSHP=X";var blocks=[[0,0]],cur_block=blocks[0],base_pos=0,parsed_cigar=_.map(cigar_str.match(/[0-9]+[MIDNSHP=X]/g),function(op){var op_len=parseInt(op.slice(0,-1),10),op_char=op.slice(-1);if(op_char==="N"){if(cur_block[1]!==0){cur_block=[base_pos+op_len,base_pos+op_len];blocks.push(cur_block)}}else{if("ISHP".indexOf(op_char)===-1){cur_block[1]+=op_len;base_pos+=op_len}}return[cigar_ops.indexOf(op_char),op_len]});return{blocks:blocks,cigar:parsed_cigar}},draw_read:function(ctx,mode,w_scale,y_start,tile_low,tile_high,feature_start,cigar,strand,read_seq){var update_base_offset=function(offset,cig_op,cig_len){if("M=NXD".indexOf(cig_op)!==-1){offset+=cig_len}return offset},update_seq_offset=function(offset,cig_op,cig_len){if("IX".indexOf(cig_op)!==-1){offset+=cig_len}return offset},get_draw_coord=function(sequence_coord){return Math.floor(Math.max(0,(sequence_coord-tile_low-0.5)*w_scale))};ctx.textAlign="center";var tile_region=[tile_low,tile_high],base_offset=0,seq_offset=0,gap=Math.round(w_scale/2),char_width_px=ctx.canvas.manager.char_width_px,block_color=(strand==="+"?this.prefs.detail_block_color:this.prefs.reverse_strand_color),pack_mode=(mode==="Pack"),draw_height=(pack_mode?PACK_FEATURE_HEIGHT:SQUISH_FEATURE_HEIGHT),rect_y=y_start+1,paint_utils=new ReadPainterUtils(ctx,draw_height,w_scale,mode),drawing_blocks=[],s_start,s_end;var draw_last=[];var t=this._parse_cigar(cigar);cigar=t.cigar;drawing_blocks=t.blocks;for(var i=0;i<drawing_blocks.length;i++){var block=drawing_blocks[i];if(is_overlap([feature_start+block[0],feature_start+block[1]],tile_region)){s_start=get_draw_coord(feature_start+block[0]);s_end=get_draw_coord(feature_start+block[1]);if(s_start===s_end){s_end+=1}ctx.fillStyle=block_color;ctx.fillRect(s_start,rect_y,s_end-s_start,draw_height)}}for(var cig_id=0,len=cigar.length;cig_id<len;cig_id++){var cig=cigar[cig_id],cig_op="MIDNSHP=X"[cig[0]],cig_len=cig[1];var seq_start=feature_start+base_offset;s_start=get_draw_coord(seq_start);s_end=get_draw_coord(seq_start+cig_len);if(!is_overlap([seq_start,seq_start+cig_len],tile_region)){base_offset=update_base_offset(base_offset,cig_op,cig_len);seq_offset=update_seq_offset(seq_offset,cig_op,cig_len);continue}if(s_start===s_end){s_end+=1}switch(cig_op){case"H":case"S":case"P":break;case"M":base_offset+=cig_len;break;case"=":case"X":var cur_seq="";if(cig_op==="X"){cur_seq=read_seq.slice(seq_offset,seq_offset+cig_len)}else{if(this.ref_seq){cur_seq=this.ref_seq.slice(Math.max(0,seq_start-tile_low),Math.min(seq_start-tile_low+cig_len,tile_high-tile_low))}}var start_pos=Math.max(seq_start,tile_low);for(var c=0;c<cur_seq.length;c++){if(cur_seq&&!this.prefs.show_differences||cig_op==="X"){var c_start=Math.floor(Math.max(0,(start_pos+c-tile_low)*w_scale));ctx.fillStyle=this.base_color_fn(cur_seq[c]);if(pack_mode&&w_scale>char_width_px){ctx.fillText(cur_seq[c],c_start,y_start+9)}else{if(w_scale>0.05){ctx.fillRect(c_start-gap,rect_y,Math.max(1,Math.round(w_scale)),draw_height)}}}}if(cig_op==="X"){seq_offset+=cig_len}base_offset+=cig_len;break;case"N":ctx.fillStyle=CONNECTOR_COLOR;ctx.fillRect(s_start,y_start+5,s_end-s_start,1);base_offset+=cig_len;break;case"D":paint_utils.draw_deletion(s_start,rect_y,cig_len);base_offset+=cig_len;break;case"I":var insert_x_coord=s_start-gap;if(is_overlap([seq_start,seq_start+cig_len],tile_region)){var seq=read_seq.slice(seq_offset,seq_offset+cig_len);if(this.prefs.show_insertions){var x_center=s_start-(s_end-s_start)/2;if((mode==="Pack"||this.mode==="Auto")&&read_seq!==undefined&&w_scale>char_width_px){ctx.fillStyle="yellow";ctx.fillRect(x_center-gap,y_start-9,s_end-s_start,9);draw_last[draw_last.length]={type:"triangle",data:[insert_x_coord,y_start+4,5]};ctx.fillStyle=CONNECTOR_COLOR;switch(compute_overlap([seq_start,seq_start+cig_len],tile_region)){case (OVERLAP_START):seq=seq.slice(tile_low-seq_start);break;case (OVERLAP_END):seq=seq.slice(0,seq_start-tile_high);break;case (CONTAINED_BY):break;case (CONTAINS):seq=seq.slice(tile_low-seq_start,seq_start-tile_high);break}for(var c=0,str_len=seq.length;c<str_len;c++){var c_start=Math.floor(Math.max(0,(seq_start+c-tile_low)*w_scale));ctx.fillText(seq[c],c_start-(s_end-s_start)/2,y_start)}}else{ctx.fillStyle="yellow";ctx.fillRect(x_center,y_start+(this.mode!=="Dense"?2:5),s_end-s_start,(mode!=="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}else{if((mode==="Pack"||this.mode==="Auto")&&read_seq!==undefined&&w_scale>char_width_px){draw_last.push({type:"text",data:[seq.length,insert_x_coord,y_start+9]})}else{}}}seq_offset+=cig_len;break}}ctx.fillStyle="yellow";var item,type,data;for(var i=0;i<draw_last.length;i++){item=draw_last[i];type=item.type;data=item.data;if(type==="text"){ctx.save();ctx.font="bold "+ctx.font;ctx.fillText(data[0],data[1],data[2]);ctx.restore()}else{if(type==="triangle"){drawDownwardEquilateralTriangle(ctx,data[0],data[1],data[2])}}}},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){var feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],feature_name=feature[3],f_start=Math.floor(Math.max(-0.5*w_scale,(feature_start-tile_low-0.5)*w_scale)),f_end=Math.ceil(Math.min(width,Math.max(0,(feature_end-tile_low-0.5)*w_scale))),y_start=(mode==="Dense"?0:(0+slot))*y_scale,label_color=this.prefs.label_color;if(feature[5] instanceof Array){var connector=true;if(feature[4][1]>=tile_low&&feature[4][0]<=tile_high&&feature[4][2]){this.draw_read(ctx,mode,w_scale,y_start,tile_low,tile_high,feature[4][0],feature[4][2],feature[4][3],feature[4][4])}else{connector=false}if(feature[5][1]>=tile_low&&feature[5][0]<=tile_high&&feature[5][2]){this.draw_read(ctx,mode,w_scale,y_start,tile_low,tile_high,feature[5][0],feature[5][2],feature[5][3],feature[5][4])}else{connector=false}var b1_end=Math.ceil(Math.min(width,Math.max(-0.5*w_scale,(feature[4][1]-tile_low-0.5)*w_scale))),b2_start=Math.floor(Math.max(-0.5*w_scale,(feature[5][0]-tile_low-0.5)*w_scale));if(connector&&b2_start>b1_end){ctx.fillStyle=CONNECTOR_COLOR;dashedLine(ctx,b1_end,y_start+5,b2_start,y_start+5)}}else{this.draw_read(ctx,mode,w_scale,y_start,tile_low,tile_high,feature_start,feature[4],feature[5],feature[6])}if(mode==="Pack"&&feature_start>=tile_low&&feature_name!=="."){ctx.fillStyle=this.prefs.label_color;if(tile_low===0&&f_start-ctx.measureText(feature_name).width<0){ctx.textAlign="left";ctx.fillText(feature_name,f_end+LABEL_SPACING,y_start+9,this.max_label_length)}else{ctx.textAlign="right";ctx.fillText(feature_name,f_start-LABEL_SPACING,y_start+9,this.max_label_length)}}return[0,0]}});var ArcLinkedFeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){LinkedFeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.longest_feature_length=this.calculate_longest_feature_length();this.draw_background_connector=false;this.draw_individual_connectors=true};_.extend(ArcLinkedFeaturePainter.prototype,FeaturePainter.prototype,LinkedFeaturePainter.prototype,{calculate_longest_feature_length:function(){var longest_feature_length=0;for(var i=0,len=this.data.length;i<len;i++){var feature=this.data[i],feature_start=feature[1],feature_end=feature[2];longest_feature_length=Math.max(longest_feature_length,feature_end-feature_start)}return longest_feature_length},get_top_padding:function(width){var view_range=this.view_end-this.view_start,w_scale=width/view_range;return Math.min(128,Math.ceil((this.longest_feature_length/2)*w_scale))},draw_connector:function(ctx,block1_start,block1_end,block2_start,block2_end,y_start){var x_center=(block1_end+block2_start)/2,radius=block2_start-x_center;var angle1=Math.PI,angle2=0;if(radius>0){ctx.beginPath();ctx.arc(x_center,y_start,block2_start-x_center,Math.PI,0);ctx.stroke()}}});var Color=function(rgb,a){if(Array.isArray(rgb)){this.rgb=rgb}else{if(rgb.length==6){this.rgb=rgb.match(/.{2}/g).map(function(c){return parseInt(c,16)})}else{if(rgb.length==7){this.rgb=rgb.substring(1,7).match(/.{2}/g).map(function(c){return parseInt(c,16)})}else{this.rgb=rgb.split("").map(function(c){return parseInt(c+c,16)})}}}this.alpha=typeof(a)==="number"?a:1};Color.prototype={eval:function(){return this},toCSS:function(){if(this.alpha<1){return"rgba("+this.rgb.map(function(c){return Math.round(c)}).concat(this.alpha).join(", ")+")"}else{return"#"+this.rgb.map(function(i){i=Math.round(i);i=(i>255?255:(i<0?0:i)).toString(16);return i.length===1?"0"+i:i}).join("")}},toHSL:function(){var r=this.rgb[0]/255,g=this.rgb[1]/255,b=this.rgb[2]/255,a=this.alpha;var max=Math.max(r,g,b),min=Math.min(r,g,b);var h,s,l=(max+min)/2,d=max-min;if(max===min){h=s=0}else{s=l>0.5?d/(2-max-min):d/(max+min);switch(max){case r:h=(g-b)/d+(g<b?6:0);break;case g:h=(b-r)/d+2;break;case b:h=(r-g)/d+4;break}h/=6}return{h:h*360,s:s,l:l,a:a}},toARGB:function(){var argb=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+argb.map(function(i){i=Math.round(i);i=(i>255?255:(i<0?0:i)).toString(16);return i.length===1?"0"+i:i}).join("")},mix:function(color2,weight){color1=this;var p=weight;var w=p*2-1;var a=color1.toHSL().a-color2.toHSL().a;var w1=(((w*a==-1)?w:(w+a)/(1+w*a))+1)/2;var w2=1-w1;var rgb=[color1.rgb[0]*w1+color2.rgb[0]*w2,color1.rgb[1]*w1+color2.rgb[1]*w2,color1.rgb[2]*w1+color2.rgb[2]*w2];var alpha=color1.alpha*p+color2.alpha*(1-p);return new Color(rgb,alpha)}};var LinearRamp=function(start_color,end_color,start_value,end_value){this.start_color=new Color(start_color);this.end_color=new Color(end_color);this.start_value=start_value;this.end_value=end_value;this.value_range=end_value-start_value};LinearRamp.prototype.map_value=function(value){value=Math.max(value,this.start_value);value=Math.min(value,this.end_value);value=(value-this.start_value)/this.value_range;return this.start_color.mix(this.end_color,1-value).toCSS()};var SplitRamp=function(start_color,middle_color,end_color,start_value,end_value){this.positive_ramp=new LinearRamp(middle_color,end_color,0,end_value);this.negative_ramp=new LinearRamp(middle_color,start_color,0,-start_value);this.start_value=start_value;this.end_value=end_value};SplitRamp.prototype.map_value=function(value){value=Math.max(value,this.start_value);value=Math.min(value,this.end_value);if(value>=0){return this.positive_ramp.map_value(value)}else{return this.negative_ramp.map_value(-value)}};var DiagonalHeatmapPainter=function(data,view_start,view_end,prefs,mode){Painter.call(this,data,view_start,view_end,prefs,mode);var i,len;if(this.prefs.min_value===undefined){var min_value=Infinity;for(i=0,len=this.data.length;i<len;i++){min_value=Math.min(min_value,this.data[i][5])}this.prefs.min_value=min_value}if(this.prefs.max_value===undefined){var max_value=-Infinity;for(i=0,len=this.data.length;i<len;i++){max_value=Math.max(max_value,this.data[i][5])}this.prefs.max_value=max_value}};DiagonalHeatmapPainter.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Heatmap",pos_color:"#FF8C00",neg_color:"#4169E1"};DiagonalHeatmapPainter.prototype.draw=function(ctx,width,height,w_scale){var min_value=this.prefs.min_value,max_value=this.prefs.max_value,value_range=max_value-min_value,height_px=height,view_start=this.view_start,mode=this.mode,data=this.data,invsqrt2=1/Math.sqrt(2);var ramp=(new SplitRamp(this.prefs.neg_color,"#FFFFFF",this.prefs.pos_color,min_value,max_value));var d,s1,e1,s2,e2,value;var scale=function(p){return(p-view_start)*w_scale};ctx.save();ctx.rotate(-45*Math.PI/180);ctx.scale(invsqrt2,invsqrt2);for(var i=0,len=data.length;i<len;i++){d=data[i];s1=scale(d[1]);e1=scale(d[2]);s2=scale(d[4]);e2=scale(d[5]);value=d[6];ctx.fillStyle=(ramp.map_value(value));ctx.fillRect(s1,s2,(e1-s1),(e2-s2))}ctx.restore()};var ReadPainterUtils=function(ctx,row_height,px_per_base,mode){this.ctx=ctx;this.row_height=row_height;this.px_per_base=px_per_base;this.draw_details=(mode==="Pack"||mode==="Auto")&&(px_per_base>=ctx.canvas.manager.char_width_px);this.delete_details_thickness=0.2};_.extend(ReadPainterUtils.prototype,{draw_deletion:function(x,y,len){this.ctx.fillStyle="black";var thickness=(this.draw_details?this.delete_details_thickness:1)*this.row_height;y+=0.5*(this.row_height-thickness);this.ctx.fillRect(x,y,len*this.px_per_base,thickness)}});var VariantPainter=function(data,view_start,view_end,prefs,mode,base_color_fn){Painter.call(this,data,view_start,view_end,prefs,mode);this.base_color_fn=base_color_fn;this.divider_height=1};_.extend(VariantPainter.prototype,Painter.prototype,{get_row_height:function(){var mode=this.mode,height;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT}}return height},get_required_height:function(num_samples){var height=this.prefs.summary_height;if(num_samples>1&&this.prefs.show_sample_data){height+=this.divider_height+num_samples*this.get_row_height()}return height},draw:function(ctx,width,height,w_scale){ctx.save();var get_deletion_info=function(ref,alt){var ref_len=ref.length,alt_len=alt.length,start=0,len=1,is_delete=false;if(alt==="-"){is_delete=true;len=ref.length}else{if(ref.indexOf(alt)===0&&ref_len>alt_len){is_delete=true;len=ref_len=alt_len;start+=alt_len}}return(is_delete?{start:start,len:len}:null)};var locus_data,pos,id,ref,alt,qual,filter,sample_gts,allele_counts,variant,draw_x_start,char_x_start,draw_y_start,genotype,base_px=Math.max(1,Math.floor(w_scale)),num_samples=(this.data.length?this.data[0][7].split(",").length:0),row_height=(this.mode==="Squish"?SQUISH_TRACK_HEIGHT:PACK_TRACK_HEIGHT),feature_height=(w_scale<0.1?row_height:(this.mode==="Squish"?SQUISH_FEATURE_HEIGHT:PACK_FEATURE_HEIGHT)),draw_summary=true,paint_utils=new ReadPainterUtils(ctx,row_height,w_scale,this.mode),j;if(num_samples===1){row_height=feature_height=(w_scale<ctx.canvas.manager.char_width_px?this.prefs.summary_height:row_height);paint_utils.row_height=row_height;draw_summary=false}if(this.prefs.show_sample_data&&draw_summary){ctx.fillStyle="#F3F3F3";ctx.globalAlpha=1;ctx.fillRect(0,this.prefs.summary_height-this.divider_height,width,this.divider_height)}ctx.textAlign="center";for(var i=0;i<this.data.length;i++){locus_data=this.data[i];pos=locus_data[1];ref=locus_data[3];alt=[locus_data[4].split(",")];sample_gts=locus_data[7].split(",");allele_counts=locus_data.slice(8);alt=_.map(_.flatten(alt),function(a){var type,alt_info={},delete_info=get_deletion_info(ref,a);if(delete_info){type="deletion";_.extend(alt_info,delete_info)}else{type="snp"}return _.extend(alt_info,{type:type,value:a,})});if(pos<this.view_start||pos>this.view_end){continue}draw_x_start=Math.floor(Math.max(-0.5*w_scale,(pos-this.view_start-0.5)*w_scale));char_x_start=Math.floor(Math.max(0,(pos-this.view_start)*w_scale));if(draw_summary){ctx.fillStyle="#999999";ctx.globalAlpha=1;ctx.fillRect(draw_x_start,0,base_px,this.prefs.summary_height);draw_y_start=this.prefs.summary_height;for(j=0;j<alt.length;j++){ctx.fillStyle=(alt[j].type==="deletion"?"black":this.base_color_fn(alt[j].value));allele_frac=allele_counts/sample_gts.length;draw_height=Math.ceil(this.prefs.summary_height*allele_frac);ctx.fillRect(draw_x_start,draw_y_start-draw_height,base_px,draw_height);draw_y_start-=draw_height}}if(!this.prefs.show_sample_data){continue}draw_y_start=(draw_summary?this.prefs.summary_height+this.divider_height:0);for(j=0;j<sample_gts.length;j++,draw_y_start+=row_height){genotype=(sample_gts[j]?sample_gts[j].split(/\/|\|/):["0","0"]);variant=null;if(genotype[0]===genotype[1]){if(genotype[0]==="."){}else{if(genotype[0]!=="0"){variant=alt[parseInt(genotype[0],10)-1];ctx.globalAlpha=1}}}else{variant=(genotype[0]!=="0"?genotype[0]:genotype[1]);variant=alt[parseInt(variant,10)-1];ctx.globalAlpha=0.5}if(variant){if(variant.type==="snp"){var snp=variant.value;ctx.fillStyle=this.base_color_fn(snp);if(paint_utils.draw_details){ctx.fillText(snp,char_x_start,draw_y_start+row_height)}else{ctx.fillRect(draw_x_start,draw_y_start+1,base_px,feature_height)}}else{if(variant.type==="deletion"){paint_utils.draw_deletion(draw_x_start+base_px*variant.start,draw_y_start+1,variant.len)}else{}}}}}ctx.restore()}});return{Scaler:Scaler,LinePainter:LinePainter,LinkedFeaturePainter:LinkedFeaturePainter,ReadPainter:ReadPainter,ArcLinkedFeaturePainter:ArcLinkedFeaturePainter,DiagonalHeatmapPainter:DiagonalHeatmapPainter,VariantPainter:VariantPainter}});
\ No newline at end of file
+define(["libs/underscore"],function(_){var BEFORE=1001,CONTAINS=1002,OVERLAP_START=1003,OVERLAP_END=1004,CONTAINED_BY=1005,AFTER=1006;var compute_overlap=function(first_region,second_region){var first_start=first_region[0],first_end=first_region[1],second_start=second_region[0],second_end=second_region[1],overlap;if(first_start<second_start){if(first_end<=second_start){overlap=BEFORE}else{if(first_end<=second_end){overlap=OVERLAP_START}else{overlap=CONTAINS}}}else{if(first_start>second_end){overlap=AFTER}else{if(first_end<=second_end){overlap=CONTAINED_BY}else{overlap=OVERLAP_END}}}return overlap};var is_overlap=function(first_region,second_region){var overlap=compute_overlap(first_region,second_region);return(overlap!==BEFORE&&overlap!==AFTER)};var dashedLine=function(ctx,x1,y1,x2,y2,dashLen){if(dashLen===undefined){dashLen=4}var dX=x2-x1;var dY=y2-y1;var dashes=Math.floor(Math.sqrt(dX*dX+dY*dY)/dashLen);var dashX=dX/dashes;var dashY=dY/dashes;var q;for(q=0;q<dashes;q++,x1+=dashX,y1+=dashY){if(q%2!==0){continue}ctx.fillRect(x1,y1,dashLen,1)}};var drawDownwardEquilateralTriangle=function(ctx,down_vertex_x,down_vertex_y,side_len){var x1=down_vertex_x-side_len/2,x2=down_vertex_x+side_len/2,y=down_vertex_y-Math.sqrt(side_len*3/2);ctx.beginPath();ctx.moveTo(x1,y);ctx.lineTo(x2,y);ctx.lineTo(down_vertex_x,down_vertex_y);ctx.lineTo(x1,y);ctx.strokeStyle=this.fillStyle;ctx.fill();ctx.stroke();ctx.closePath()};var Scaler=function(default_val){this.default_val=(default_val?default_val:1)};Scaler.prototype.gen_val=function(input){return this.default_val};var DrawResults=function(options){this.incomplete_features=options.incomplete_features;this.feature_mapper=options.feature_mapper};var Painter=function(data,view_start,view_end,prefs,mode){this.data=data;this.view_start=view_start;this.view_end=view_end;this.prefs=_.extend({},this.default_prefs,prefs);this.mode=mode};Painter.prototype.default_prefs={};Painter.prototype.draw=function(ctx,width,height,w_scale){};var LinePainter=function(data,view_start,view_end,prefs,mode){Painter.call(this,data,view_start,view_end,prefs,mode);if(this.prefs.min_value===undefined){this.prefs.min_value=_.min(_.map(this.data,function(d){return d[1]}))||0}if(this.prefs.max_value===undefined){this.prefs.max_value=_.max(_.map(this.data,function(d){return d[1]}))||0}};LinePainter.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Histogram",color:"#000",overflow_color:"#F66"};LinePainter.prototype.draw=function(ctx,width,height,w_scale){var in_path=false,min_value=this.prefs.min_value,max_value=this.prefs.max_value,vertical_range=max_value-min_value,height_px=height,view_start=this.view_start,mode=this.mode,data=this.data;ctx.save();var y_zero=Math.round(height+min_value/vertical_range*height);if(mode!=="Intensity"){ctx.fillStyle="#aaa";ctx.fillRect(0,y_zero,width,1)}ctx.beginPath();var x_scaled,y,delta_x_px;if(data.length>1){delta_x_px=Math.ceil((data[1][0]-data[0][0])*w_scale)}else{delta_x_px=10}var painter_color=this.prefs.block_color||this.prefs.color,pref_color=parseInt(painter_color.slice(1),16),pref_r=(pref_color&16711680)>>16,pref_g=(pref_color&65280)>>8,pref_b=pref_color&255,top_overflow=false,bot_overflow=false;for(var i=0,len=data.length;i<len;i++){ctx.fillStyle=ctx.strokeStyle=painter_color;top_overflow=bot_overflow=false;x_scaled=Math.ceil((data[i][0]-view_start)*w_scale);y=data[i][1];if(y===null){if(in_path&&mode==="Filled"){ctx.lineTo(x_scaled,height_px)}in_path=false;continue}if(y<min_value){bot_overflow=true;y=min_value}else{if(y>max_value){top_overflow=true;y=max_value}}if(mode==="Histogram"){y=Math.round(y/vertical_range*height_px);ctx.fillRect(x_scaled,y_zero,delta_x_px,-y)}else{if(mode==="Intensity"){var saturation=(y-min_value)/vertical_range,new_r=Math.round(pref_r+(255-pref_r)*(1-saturation)),new_g=Math.round(pref_g+(255-pref_g)*(1-saturation)),new_b=Math.round(pref_b+(255-pref_b)*(1-saturation));ctx.fillStyle="rgb("+new_r+","+new_g+","+new_b+")";ctx.fillRect(x_scaled,0,delta_x_px,height_px)}else{y=Math.round(height_px-(y-min_value)/vertical_range*height_px);if(in_path){ctx.lineTo(x_scaled,y)}else{in_path=true;if(mode==="Filled"){ctx.moveTo(x_scaled,height_px);ctx.lineTo(x_scaled,y)}else{ctx.moveTo(x_scaled,y)}}}}ctx.fillStyle=this.prefs.overflow_color;if(top_overflow||bot_overflow){var overflow_x;if(mode==="Histogram"||mode==="Intensity"){overflow_x=delta_x_px}else{x_scaled-=2;overflow_x=4}if(top_overflow){ctx.fillRect(x_scaled,0,overflow_x,3)}if(bot_overflow){ctx.fillRect(x_scaled,height_px-3,overflow_x,3)}}ctx.fillStyle=painter_color}if(mode==="Filled"){if(in_path){ctx.lineTo(x_scaled,y_zero);ctx.lineTo(0,y_zero)}ctx.fill()}else{ctx.stroke()}ctx.restore()};var FeaturePositionMapper=function(slot_height){this.feature_positions={};this.slot_height=slot_height;this.translation=0;this.y_translation=0};FeaturePositionMapper.prototype.map_feature_data=function(feature_data,slot,x_start,x_end){if(!this.feature_positions[slot]){this.feature_positions[slot]=[]}this.feature_positions[slot].push({data:feature_data,x_start:x_start,x_end:x_end})};FeaturePositionMapper.prototype.get_feature_data=function(x,y){var slot=Math.floor((y-this.y_translation)/this.slot_height),feature_dict;if(!this.feature_positions[slot]){return null}x+=this.translation;for(var i=0;i<this.feature_positions[slot].length;i++){feature_dict=this.feature_positions[slot][i];if(x>=feature_dict.x_start&&x<=feature_dict.x_end){return feature_dict.data}}};var FeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){Painter.call(this,data,view_start,view_end,prefs,mode);this.alpha_scaler=(alpha_scaler?alpha_scaler:new Scaler());this.height_scaler=(height_scaler?height_scaler:new Scaler());this.max_label_length=200};FeaturePainter.prototype.default_prefs={block_color:"#FFF",connector_color:"#FFF"};_.extend(FeaturePainter.prototype,{get_required_height:function(rows_required,width){var required_height=this.get_row_height(),y_scale=required_height,mode=this.mode;if(mode==="no_detail"||mode==="Squish"||mode==="Pack"){required_height=rows_required*y_scale}return required_height+this.get_top_padding(width)},get_top_padding:function(width){return 0},draw:function(ctx,width,height,w_scale,slots){var data=this.data,view_start=this.view_start,view_end=this.view_end;ctx.save();ctx.fillStyle=this.prefs.block_color;ctx.textAlign="right";var y_scale=this.get_row_height(),feature_mapper=new FeaturePositionMapper(y_scale),x_draw_coords,incomplete_features=[];for(var i=0,len=data.length;i<len;i++){var feature=data[i],feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],slot=(slots&&slots[feature_uid]!==undefined?slots[feature_uid]:null);if((this.mode==="Dense"||slot!==null)&&(feature_start<view_end&&feature_end>view_start)){x_draw_coords=this.draw_element(ctx,this.mode,feature,slot,view_start,view_end,w_scale,y_scale,width);feature_mapper.map_feature_data(feature,slot,x_draw_coords[0],x_draw_coords[1]);if(feature_start<view_start||feature_end>view_end){incomplete_features.push(feature)}}}ctx.restore();feature_mapper.y_translation=this.get_top_padding(width);return new DrawResults({incomplete_features:incomplete_features,feature_mapper:feature_mapper})},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){return[0,0]}});var DENSE_TRACK_HEIGHT=10,NO_DETAIL_TRACK_HEIGHT=3,SQUISH_TRACK_HEIGHT=5,PACK_TRACK_HEIGHT=10,NO_DETAIL_FEATURE_HEIGHT=1,DENSE_FEATURE_HEIGHT=9,SQUISH_FEATURE_HEIGHT=3,PACK_FEATURE_HEIGHT=9,LABEL_SPACING=2,CONNECTOR_COLOR="#ccc";var LinkedFeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){FeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.draw_background_connector=true;this.draw_individual_connectors=false};_.extend(LinkedFeaturePainter.prototype,FeaturePainter.prototype,{get_row_height:function(){var mode=this.mode,height;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="no_detail"){height=NO_DETAIL_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT}}}return height},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){var feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],feature_name=feature[3],feature_strand=feature[4],f_start=Math.floor(Math.max(0,(feature_start-tile_low-0.5)*w_scale)),f_end=Math.ceil(Math.min(width,Math.max(0,(feature_end-tile_low-0.5)*w_scale))),draw_start=f_start,draw_end=f_end,y_start=(mode==="Dense"?0:(0+slot))*y_scale+this.get_top_padding(width),thickness,y_start,thick_start=null,thick_end=null,block_color=(!feature_strand||feature_strand==="+"||feature_strand==="."?this.prefs.block_color:this.prefs.reverse_strand_color);label_color=this.prefs.label_color;ctx.globalAlpha=this.alpha_scaler.gen_val(feature);if(mode==="Dense"){slot=1}if(mode==="no_detail"){ctx.fillStyle=block_color;ctx.fillRect(f_start,y_start+5,f_end-f_start,NO_DETAIL_FEATURE_HEIGHT)}else{var feature_ts=feature[5],feature_te=feature[6],feature_blocks=feature[7],full_height=true;if(feature_ts&&feature_te){thick_start=Math.floor(Math.max(0,(feature_ts-tile_low)*w_scale));thick_end=Math.ceil(Math.min(width,Math.max(0,(feature_te-tile_low)*w_scale)))}var thin_height,thick_height;if(mode==="Squish"){thin_height=1;thick_height=SQUISH_FEATURE_HEIGHT;full_height=false}else{if(mode==="Dense"){thin_height=5;thick_height=DENSE_FEATURE_HEIGHT}else{thin_height=5;thick_height=PACK_FEATURE_HEIGHT}}if(!feature_blocks){ctx.fillStyle=block_color;ctx.fillRect(f_start,y_start+1,f_end-f_start,thick_height);if(feature_strand&&full_height){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand_inv")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand_inv")}}ctx.fillRect(f_start,y_start+1,f_end-f_start,thick_height)}}else{var cur_y_start,cur_height;if(mode==="Squish"||mode==="Dense"){cur_y_start=y_start+Math.floor(SQUISH_FEATURE_HEIGHT/2)+1;cur_height=1}else{if(feature_strand){cur_y_start=y_start;cur_height=thick_height}else{cur_y_start+=(SQUISH_FEATURE_HEIGHT/2)+1;cur_height=1}}if(this.draw_background_connector){if(mode==="Squish"||mode==="Dense"){ctx.fillStyle=CONNECTOR_COLOR}else{if(feature_strand){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand")}}}else{ctx.fillStyle=CONNECTOR_COLOR}}ctx.fillRect(f_start,cur_y_start,f_end-f_start,cur_height)}var start_and_height;for(var k=0,k_len=feature_blocks.length;k<k_len;k++){var block=feature_blocks[k],block_start=Math.floor(Math.max(0,(block[0]-tile_low-0.5)*w_scale)),block_end=Math.ceil(Math.min(width,Math.max((block[1]-tile_low-0.5)*w_scale))),last_block_start,last_block_end;if(block_start>block_end){continue}ctx.fillStyle=block_color;ctx.fillRect(block_start,y_start+(thick_height-thin_height)/2+1,block_end-block_start,thin_height);if(thick_start!==undefined&&feature_te>feature_ts&&!(block_start>thick_end||block_end<thick_start)){var block_thick_start=Math.max(block_start,thick_start),block_thick_end=Math.min(block_end,thick_end);ctx.fillRect(block_thick_start,y_start+1,block_thick_end-block_thick_start,thick_height);if(feature_blocks.length===1&&mode==="Pack"){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand_inv")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand_inv")}}if(block_thick_start+14<block_thick_end){block_thick_start+=2;block_thick_end-=2}ctx.fillRect(block_thick_start,y_start+1,block_thick_end-block_thick_start,thick_height)}}if(this.draw_individual_connectors&&last_block_start){this.draw_connector(ctx,last_block_start,last_block_end,block_start,block_end,y_start)}last_block_start=block_start;last_block_end=block_end}if(mode==="Pack"){ctx.globalAlpha=1;ctx.fillStyle="white";var hscale_factor=this.height_scaler.gen_val(feature),new_height=Math.ceil(thick_height*hscale_factor),ws_height=Math.round((thick_height-new_height)/2);if(hscale_factor!==1){ctx.fillRect(f_start,cur_y_start+1,f_end-f_start,ws_height);ctx.fillRect(f_start,cur_y_start+thick_height-ws_height+1,f_end-f_start,ws_height)}}}ctx.globalAlpha=1;if(feature_name&&mode==="Pack"&&feature_start>tile_low){ctx.fillStyle=label_color;if(tile_low===0&&f_start-ctx.measureText(feature_name).width<0){ctx.textAlign="left";ctx.fillText(feature_name,f_end+LABEL_SPACING,y_start+8,this.max_label_length);draw_end+=ctx.measureText(feature_name).width+LABEL_SPACING}else{ctx.textAlign="right";ctx.fillText(feature_name,f_start-LABEL_SPACING,y_start+8,this.max_label_length);draw_start-=ctx.measureText(feature_name).width+LABEL_SPACING}}}ctx.globalAlpha=1;return[draw_start,draw_end]}});var ReadPainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler,ref_seq,base_color_fn){FeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.ref_seq=(ref_seq?ref_seq.data:null);this.base_color_fn=base_color_fn};_.extend(ReadPainter.prototype,FeaturePainter.prototype,{get_row_height:function(){var height,mode=this.mode;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT;if(this.prefs.show_insertions){height*=2}}}return height},_parse_cigar:function(cigar_str){var cigar_ops="MIDNSHP=X";var blocks=[[0,0]],cur_block=blocks[0],base_pos=0,parsed_cigar=_.map(cigar_str.match(/[0-9]+[MIDNSHP=X]/g),function(op){var op_len=parseInt(op.slice(0,-1),10),op_char=op.slice(-1);if(op_char==="N"){if(cur_block[1]!==0){cur_block=[base_pos+op_len,base_pos+op_len];blocks.push(cur_block)}}else{if("ISHP".indexOf(op_char)===-1){cur_block[1]+=op_len;base_pos+=op_len}}return[cigar_ops.indexOf(op_char),op_len]});return{blocks:blocks,cigar:parsed_cigar}},draw_read:function(ctx,mode,w_scale,y_start,tile_low,tile_high,feature_start,cigar,strand,read_seq){var update_base_offset=function(offset,cig_op,cig_len){if("M=NXD".indexOf(cig_op)!==-1){offset+=cig_len}return offset},update_seq_offset=function(offset,cig_op,cig_len){if("IX".indexOf(cig_op)!==-1){offset+=cig_len}return offset},get_draw_coord=function(sequence_coord){return Math.floor(Math.max(0,(sequence_coord-tile_low-0.5)*w_scale))};ctx.textAlign="center";var tile_region=[tile_low,tile_high],base_offset=0,seq_offset=0,gap=Math.round(w_scale/2),char_width_px=ctx.canvas.manager.char_width_px,block_color=(strand==="+"?this.prefs.detail_block_color:this.prefs.reverse_strand_color),pack_mode=(mode==="Pack"),draw_height=(pack_mode?PACK_FEATURE_HEIGHT:SQUISH_FEATURE_HEIGHT),rect_y=y_start+1,paint_utils=new ReadPainterUtils(ctx,draw_height,w_scale,mode),drawing_blocks=[],s_start,s_end;var draw_last=[];var t=this._parse_cigar(cigar);cigar=t.cigar;drawing_blocks=t.blocks;for(var i=0;i<drawing_blocks.length;i++){var block=drawing_blocks[i];if(is_overlap([feature_start+block[0],feature_start+block[1]],tile_region)){s_start=get_draw_coord(feature_start+block[0]);s_end=get_draw_coord(feature_start+block[1]);if(s_start===s_end){s_end+=1}ctx.fillStyle=block_color;ctx.fillRect(s_start,rect_y,s_end-s_start,draw_height)}}for(var cig_id=0,len=cigar.length;cig_id<len;cig_id++){var cig=cigar[cig_id],cig_op="MIDNSHP=X"[cig[0]],cig_len=cig[1];var seq_start=feature_start+base_offset;s_start=get_draw_coord(seq_start);s_end=get_draw_coord(seq_start+cig_len);if(!is_overlap([seq_start,seq_start+cig_len],tile_region)){base_offset=update_base_offset(base_offset,cig_op,cig_len);seq_offset=update_seq_offset(seq_offset,cig_op,cig_len);continue}if(s_start===s_end){s_end+=1}switch(cig_op){case"H":case"S":case"P":break;case"M":base_offset+=cig_len;break;case"=":case"X":var cur_seq="";if(cig_op==="X"){cur_seq=read_seq.slice(seq_offset,seq_offset+cig_len)}else{if(this.ref_seq){cur_seq=this.ref_seq.slice(Math.max(0,seq_start-tile_low),Math.min(seq_start-tile_low+cig_len,tile_high-tile_low))}}var start_pos=Math.max(seq_start,tile_low);for(var c=0;c<cur_seq.length;c++){if(cur_seq&&!this.prefs.show_differences||cig_op==="X"){var c_start=Math.floor(Math.max(0,(start_pos+c-tile_low)*w_scale));ctx.fillStyle=this.base_color_fn(cur_seq[c]);if(pack_mode&&w_scale>char_width_px){ctx.fillText(cur_seq[c],c_start,y_start+9)}else{if(w_scale>0.05){ctx.fillRect(c_start-gap,rect_y,Math.max(1,Math.round(w_scale)),draw_height)}}}}if(cig_op==="X"){seq_offset+=cig_len}base_offset+=cig_len;break;case"N":ctx.fillStyle=CONNECTOR_COLOR;ctx.fillRect(s_start,y_start+5,s_end-s_start,1);base_offset+=cig_len;break;case"D":paint_utils.draw_deletion(s_start,rect_y,cig_len);base_offset+=cig_len;break;case"I":var insert_x_coord=s_start-gap;if(is_overlap([seq_start,seq_start+cig_len],tile_region)){var seq=read_seq.slice(seq_offset,seq_offset+cig_len);if(this.prefs.show_insertions){var x_center=s_start-(s_end-s_start)/2;if((mode==="Pack"||this.mode==="Auto")&&read_seq!==undefined&&w_scale>char_width_px){ctx.fillStyle="yellow";ctx.fillRect(x_center-gap,y_start-9,s_end-s_start,9);draw_last[draw_last.length]={type:"triangle",data:[insert_x_coord,y_start+4,5]};ctx.fillStyle=CONNECTOR_COLOR;switch(compute_overlap([seq_start,seq_start+cig_len],tile_region)){case (OVERLAP_START):seq=seq.slice(tile_low-seq_start);break;case (OVERLAP_END):seq=seq.slice(0,seq_start-tile_high);break;case (CONTAINED_BY):break;case (CONTAINS):seq=seq.slice(tile_low-seq_start,seq_start-tile_high);break}for(var c=0,str_len=seq.length;c<str_len;c++){var c_start=Math.floor(Math.max(0,(seq_start+c-tile_low)*w_scale));ctx.fillText(seq[c],c_start-(s_end-s_start)/2,y_start)}}else{ctx.fillStyle="yellow";ctx.fillRect(x_center,y_start+(this.mode!=="Dense"?2:5),s_end-s_start,(mode!=="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}else{if((mode==="Pack"||this.mode==="Auto")&&read_seq!==undefined&&w_scale>char_width_px){draw_last.push({type:"text",data:[seq.length,insert_x_coord,y_start+9]})}else{}}}seq_offset+=cig_len;break}}ctx.fillStyle="yellow";var item,type,data;for(var i=0;i<draw_last.length;i++){item=draw_last[i];type=item.type;data=item.data;if(type==="text"){ctx.save();ctx.font="bold "+ctx.font;ctx.fillText(data[0],data[1],data[2]);ctx.restore()}else{if(type==="triangle"){drawDownwardEquilateralTriangle(ctx,data[0],data[1],data[2])}}}},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){var feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],feature_name=feature[3],f_start=Math.floor(Math.max(-0.5*w_scale,(feature_start-tile_low-0.5)*w_scale)),f_end=Math.ceil(Math.min(width,Math.max(0,(feature_end-tile_low-0.5)*w_scale))),y_start=(mode==="Dense"?0:(0+slot))*y_scale,label_color=this.prefs.label_color;if(feature[5] instanceof Array){var connector=true;if(feature[4][1]>=tile_low&&feature[4][0]<=tile_high&&feature[4][2]){this.draw_read(ctx,mode,w_scale,y_start,tile_low,tile_high,feature[4][0],feature[4][2],feature[4][3],feature[4][4])}else{connector=false}if(feature[5][1]>=tile_low&&feature[5][0]<=tile_high&&feature[5][2]){this.draw_read(ctx,mode,w_scale,y_start,tile_low,tile_high,feature[5][0],feature[5][2],feature[5][3],feature[5][4])}else{connector=false}var b1_end=Math.ceil(Math.min(width,Math.max(-0.5*w_scale,(feature[4][1]-tile_low-0.5)*w_scale))),b2_start=Math.floor(Math.max(-0.5*w_scale,(feature[5][0]-tile_low-0.5)*w_scale));if(connector&&b2_start>b1_end){ctx.fillStyle=CONNECTOR_COLOR;dashedLine(ctx,b1_end,y_start+5,b2_start,y_start+5)}}else{this.draw_read(ctx,mode,w_scale,y_start,tile_low,tile_high,feature_start,feature[4],feature[5],feature[6])}if(mode==="Pack"&&feature_start>=tile_low&&feature_name!=="."){ctx.fillStyle=this.prefs.label_color;if(tile_low===0&&f_start-ctx.measureText(feature_name).width<0){ctx.textAlign="left";ctx.fillText(feature_name,f_end+LABEL_SPACING,y_start+9,this.max_label_length)}else{ctx.textAlign="right";ctx.fillText(feature_name,f_start-LABEL_SPACING,y_start+9,this.max_label_length)}}return[0,0]}});var ArcLinkedFeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){LinkedFeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.longest_feature_length=this.calculate_longest_feature_length();this.draw_background_connector=false;this.draw_individual_connectors=true};_.extend(ArcLinkedFeaturePainter.prototype,FeaturePainter.prototype,LinkedFeaturePainter.prototype,{calculate_longest_feature_length:function(){var longest_feature_length=0;for(var i=0,len=this.data.length;i<len;i++){var feature=this.data[i],feature_start=feature[1],feature_end=feature[2];longest_feature_length=Math.max(longest_feature_length,feature_end-feature_start)}return longest_feature_length},get_top_padding:function(width){var view_range=this.view_end-this.view_start,w_scale=width/view_range;return Math.min(128,Math.ceil((this.longest_feature_length/2)*w_scale))},draw_connector:function(ctx,block1_start,block1_end,block2_start,block2_end,y_start){var x_center=(block1_end+block2_start)/2,radius=block2_start-x_center;var angle1=Math.PI,angle2=0;if(radius>0){ctx.beginPath();ctx.arc(x_center,y_start,block2_start-x_center,Math.PI,0);ctx.stroke()}}});var Color=function(rgb,a){if(Array.isArray(rgb)){this.rgb=rgb}else{if(rgb.length==6){this.rgb=rgb.match(/.{2}/g).map(function(c){return parseInt(c,16)})}else{if(rgb.length==7){this.rgb=rgb.substring(1,7).match(/.{2}/g).map(function(c){return parseInt(c,16)})}else{this.rgb=rgb.split("").map(function(c){return parseInt(c+c,16)})}}}this.alpha=typeof(a)==="number"?a:1};Color.prototype={eval:function(){return this},toCSS:function(){if(this.alpha<1){return"rgba("+this.rgb.map(function(c){return Math.round(c)}).concat(this.alpha).join(", ")+")"}else{return"#"+this.rgb.map(function(i){i=Math.round(i);i=(i>255?255:(i<0?0:i)).toString(16);return i.length===1?"0"+i:i}).join("")}},toHSL:function(){var r=this.rgb[0]/255,g=this.rgb[1]/255,b=this.rgb[2]/255,a=this.alpha;var max=Math.max(r,g,b),min=Math.min(r,g,b);var h,s,l=(max+min)/2,d=max-min;if(max===min){h=s=0}else{s=l>0.5?d/(2-max-min):d/(max+min);switch(max){case r:h=(g-b)/d+(g<b?6:0);break;case g:h=(b-r)/d+2;break;case b:h=(r-g)/d+4;break}h/=6}return{h:h*360,s:s,l:l,a:a}},toARGB:function(){var argb=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+argb.map(function(i){i=Math.round(i);i=(i>255?255:(i<0?0:i)).toString(16);return i.length===1?"0"+i:i}).join("")},mix:function(color2,weight){color1=this;var p=weight;var w=p*2-1;var a=color1.toHSL().a-color2.toHSL().a;var w1=(((w*a==-1)?w:(w+a)/(1+w*a))+1)/2;var w2=1-w1;var rgb=[color1.rgb[0]*w1+color2.rgb[0]*w2,color1.rgb[1]*w1+color2.rgb[1]*w2,color1.rgb[2]*w1+color2.rgb[2]*w2];var alpha=color1.alpha*p+color2.alpha*(1-p);return new Color(rgb,alpha)}};var LinearRamp=function(start_color,end_color,start_value,end_value){this.start_color=new Color(start_color);this.end_color=new Color(end_color);this.start_value=start_value;this.end_value=end_value;this.value_range=end_value-start_value};LinearRamp.prototype.map_value=function(value){value=Math.max(value,this.start_value);value=Math.min(value,this.end_value);value=(value-this.start_value)/this.value_range;return this.start_color.mix(this.end_color,1-value).toCSS()};var SplitRamp=function(start_color,middle_color,end_color,start_value,end_value){this.positive_ramp=new LinearRamp(middle_color,end_color,0,end_value);this.negative_ramp=new LinearRamp(middle_color,start_color,0,-start_value);this.start_value=start_value;this.end_value=end_value};SplitRamp.prototype.map_value=function(value){value=Math.max(value,this.start_value);value=Math.min(value,this.end_value);if(value>=0){return this.positive_ramp.map_value(value)}else{return this.negative_ramp.map_value(-value)}};var DiagonalHeatmapPainter=function(data,view_start,view_end,prefs,mode){Painter.call(this,data,view_start,view_end,prefs,mode);var i,len;if(this.prefs.min_value===undefined){var min_value=Infinity;for(i=0,len=this.data.length;i<len;i++){min_value=Math.min(min_value,this.data[i][5])}this.prefs.min_value=min_value}if(this.prefs.max_value===undefined){var max_value=-Infinity;for(i=0,len=this.data.length;i<len;i++){max_value=Math.max(max_value,this.data[i][5])}this.prefs.max_value=max_value}};DiagonalHeatmapPainter.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Heatmap",pos_color:"#FF8C00",neg_color:"#4169E1"};DiagonalHeatmapPainter.prototype.draw=function(ctx,width,height,w_scale){var min_value=this.prefs.min_value,max_value=this.prefs.max_value,value_range=max_value-min_value,height_px=height,view_start=this.view_start,mode=this.mode,data=this.data,invsqrt2=1/Math.sqrt(2);var ramp=(new SplitRamp(this.prefs.neg_color,"#FFFFFF",this.prefs.pos_color,min_value,max_value));var d,s1,e1,s2,e2,value;var scale=function(p){return(p-view_start)*w_scale};ctx.save();ctx.rotate(-45*Math.PI/180);ctx.scale(invsqrt2,invsqrt2);for(var i=0,len=data.length;i<len;i++){d=data[i];s1=scale(d[1]);e1=scale(d[2]);s2=scale(d[4]);e2=scale(d[5]);value=d[6];ctx.fillStyle=(ramp.map_value(value));ctx.fillRect(s1,s2,(e1-s1),(e2-s2))}ctx.restore()};var ReadPainterUtils=function(ctx,row_height,px_per_base,mode){this.ctx=ctx;this.row_height=row_height;this.px_per_base=px_per_base;this.draw_details=(mode==="Pack"||mode==="Auto")&&(px_per_base>=ctx.canvas.manager.char_width_px);this.delete_details_thickness=0.2};_.extend(ReadPainterUtils.prototype,{draw_deletion:function(x,y,len){this.ctx.fillStyle="black";var thickness=(this.draw_details?this.delete_details_thickness:1)*this.row_height;y+=0.5*(this.row_height-thickness);this.ctx.fillRect(x,y,len*this.px_per_base,thickness)}});var VariantPainter=function(data,view_start,view_end,prefs,mode,base_color_fn){Painter.call(this,data,view_start,view_end,prefs,mode);this.base_color_fn=base_color_fn;this.divider_height=1};_.extend(VariantPainter.prototype,Painter.prototype,{get_row_height:function(){var mode=this.mode,height;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT}}return height},get_required_height:function(num_samples){var height=this.prefs.summary_height;if(num_samples>1&&this.prefs.show_sample_data){height+=this.divider_height+num_samples*this.get_row_height()}return height},draw:function(ctx,width,height,w_scale){ctx.save();var get_deletion_info=function(ref,alt){var ref_len=ref.length,alt_len=alt.length,start=0,len=1,is_delete=false;if(alt==="-"){is_delete=true;len=ref.length}else{if(ref.indexOf(alt)===0&&ref_len>alt_len){is_delete=true;len=ref_len=alt_len;start+=alt_len}}return(is_delete?{start:start,len:len}:null)};var locus_data,pos,id,ref,alt,qual,filter,sample_gts,allele_counts,variant,draw_x_start,char_x_start,draw_y_start,genotype,base_px=Math.max(1,Math.floor(w_scale)),num_samples=(this.data.length?this.data[0][7].split(",").length:0),row_height=(this.mode==="Squish"?SQUISH_TRACK_HEIGHT:PACK_TRACK_HEIGHT),feature_height=(w_scale<0.1?row_height:(this.mode==="Squish"?SQUISH_FEATURE_HEIGHT:PACK_FEATURE_HEIGHT)),draw_summary=true,paint_utils=new ReadPainterUtils(ctx,row_height,w_scale,this.mode),j;if(num_samples===1){row_height=feature_height=(w_scale<ctx.canvas.manager.char_width_px?this.prefs.summary_height:row_height);paint_utils.row_height=row_height;draw_summary=false}if(this.prefs.show_sample_data&&draw_summary){ctx.fillStyle="#F3F3F3";ctx.globalAlpha=1;ctx.fillRect(0,this.prefs.summary_height-this.divider_height,width,this.divider_height)}ctx.textAlign="center";for(var i=0;i<this.data.length;i++){locus_data=this.data[i];pos=locus_data[1];ref=locus_data[3];alt=[locus_data[4].split(",")];sample_gts=locus_data[7].split(",");allele_counts=locus_data.slice(8);alt=_.map(_.flatten(alt),function(a){var type,alt_info={},delete_info=get_deletion_info(ref,a);if(delete_info){type="deletion";_.extend(alt_info,delete_info)}else{type="snp"}return _.extend(alt_info,{type:type,value:a,})});if(pos<this.view_start||pos>this.view_end){continue}draw_x_start=Math.floor(Math.max(-0.5*w_scale,(pos-this.view_start-0.5)*w_scale));char_x_start=Math.floor(Math.max(0,(pos-this.view_start)*w_scale));if(draw_summary){ctx.fillStyle="#999999";ctx.globalAlpha=1;ctx.fillRect(draw_x_start,0,base_px,this.prefs.summary_height);draw_y_start=this.prefs.summary_height;for(j=0;j<alt.length;j++){ctx.fillStyle=(alt[j].type==="deletion"?"black":this.base_color_fn(alt[j].value));allele_frac=allele_counts/sample_gts.length;draw_height=Math.ceil(this.prefs.summary_height*allele_frac);ctx.fillRect(draw_x_start,draw_y_start-draw_height,base_px,draw_height);draw_y_start-=draw_height}}if(!this.prefs.show_sample_data){continue}draw_y_start=(draw_summary?this.prefs.summary_height+this.divider_height:0);for(j=0;j<sample_gts.length;j++,draw_y_start+=row_height){genotype=(sample_gts[j]?sample_gts[j].split(/\/|\|/):["0","0"]);variant=null;if(genotype[0]===genotype[1]){if(genotype[0]==="."){}else{if(genotype[0]!=="0"){variant=alt[parseInt(genotype[0],10)-1];ctx.globalAlpha=1}}}else{variant=(genotype[0]!=="0"?genotype[0]:genotype[1]);variant=alt[parseInt(variant,10)-1];ctx.globalAlpha=0.5}if(variant){if(variant.type==="snp"){var snp=variant.value;ctx.fillStyle=this.base_color_fn(snp);if(paint_utils.draw_details){ctx.fillText(snp,char_x_start,draw_y_start+row_height)}else{ctx.fillRect(draw_x_start,draw_y_start+1,base_px,feature_height)}}else{if(variant.type==="deletion"){paint_utils.draw_deletion(draw_x_start+base_px*variant.start,draw_y_start+1,variant.len)}else{}}}}}ctx.restore()}});return{Scaler:Scaler,LinePainter:LinePainter,LinkedFeaturePainter:LinkedFeaturePainter,ReadPainter:ReadPainter,ArcLinkedFeaturePainter:ArcLinkedFeaturePainter,DiagonalHeatmapPainter:DiagonalHeatmapPainter,VariantPainter:VariantPainter}});
\ No newline at end of file
diff -r cd82587fb36ecbc802931edad29372f69cee7108 -r d4070ec86d404eec61f78a60f23536080b04ab1f static/scripts/viz/trackster/painters.js
--- a/static/scripts/viz/trackster/painters.js
+++ b/static/scripts/viz/trackster/painters.js
@@ -196,7 +196,7 @@
ctx.fillStyle = ctx.strokeStyle = painter_color;
top_overflow = bot_overflow = false;
- x_scaled = Math.round((data[i][0] - view_start) * w_scale);
+ x_scaled = Math.ceil((data[i][0] - view_start) * w_scale);
y = data[i][1];
// Process Y (scaler) value.
diff -r cd82587fb36ecbc802931edad29372f69cee7108 -r d4070ec86d404eec61f78a60f23536080b04ab1f test/unit/tools/test_tool_external_files.py
--- /dev/null
+++ b/test/unit/tools/test_tool_external_files.py
@@ -0,0 +1,30 @@
+""" Unit test logic related to finding externally referenced files in tool
+descriptions.
+"""
+import tempfile
+import os
+import shutil
+from galaxy.tools import Tool
+
+
+def test_finds_external_code_file():
+ assert __external_files("""<tool><code file="foo.py" /></tool>""") == ["foo.py"]
+
+
+def test_finds_skips_empty_code_file_attribute():
+ assert __external_files("""<tool><code /></tool>""") == []
+
+
+def test_finds_external_macro_file():
+ assert __external_files("""<tool><macros><import>cool_macros.xml</import></macros></tool>""") == ["cool_macros.xml"]
+
+
+def __external_files(contents):
+ base_path = tempfile.mkdtemp()
+ try:
+ tool_path = os.path.join(base_path, "tool.xml")
+ with open(tool_path, "w") as f:
+ f.write(contents)
+ return Tool.get_externally_referenced_paths(tool_path)
+ finally:
+ shutil.rmtree(base_path)
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jmchilton: Merged in jmchilton/galaxy-central-fork-1/next-stable (pull request #449)
by commits-noreply@bitbucket.org 04 Aug '14
by commits-noreply@bitbucket.org 04 Aug '14
04 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/7cacfb33db90/
Changeset: 7cacfb33db90
Branch: next-stable
User: jmchilton
Date: 2014-08-04 20:57:31
Summary: Merged in jmchilton/galaxy-central-fork-1/next-stable (pull request #449)
Fix tool shed's logic related to finding tool externally referenced files.
Affected #: 4 files
diff -r 7ac5a36c0ce7a6eb280d339de2107740552825ce -r 7cacfb33db90dee8c4e9ce78a3a735cd6cef8490 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -69,7 +69,7 @@
from galaxy.model import Workflow
from tool_shed.util import common_util
from tool_shed.util import shed_util_common as suc
-from .loader import load_tool, template_macro_params
+from .loader import load_tool, template_macro_params, raw_tool_xml_tree, imported_macro_paths
from .execute import execute as execute_job
from .wrappers import (
ToolParameterValueWrapper,
@@ -2989,6 +2989,23 @@
def get_default_history_by_trans( self, trans, create=False ):
return trans.get_history( create=create )
+ @classmethod
+ def get_externally_referenced_paths( self, path ):
+ """ Return relative paths to externally referenced files by the tool
+ described by file at `path`. External components should not assume things
+ about the structure of tool xml files (this is the tool's responsibility).
+ """
+ tree = raw_tool_xml_tree(path)
+ root = tree.getroot()
+ external_paths = []
+ for code_elem in root.findall( 'code' ):
+ external_path = code_elem.get( 'file' )
+ if external_path:
+ external_paths.append( external_path )
+ external_paths.extend( imported_macro_paths( root ) )
+ # May also need to load external citation files as well at some point.
+ return external_paths
+
class OutputParameterJSONTool( Tool ):
"""
diff -r 7ac5a36c0ce7a6eb280d339de2107740552825ce -r 7cacfb33db90dee8c4e9ce78a3a735cd6cef8490 lib/galaxy/tools/loader.py
--- a/lib/galaxy/tools/loader.py
+++ b/lib/galaxy/tools/loader.py
@@ -10,7 +10,7 @@
"""
Loads tool from file system and preprocesses tool macros.
"""
- tree = parse_xml(path)
+ tree = raw_tool_xml_tree(path)
root = tree.getroot()
_import_macros(root, path)
@@ -38,14 +38,31 @@
return param_dict
+def raw_tool_xml_tree(path):
+ """ Load raw (no macro expansion) tree representation of tool represented
+ at the specified path.
+ """
+ tree = parse_xml(path)
+ return tree
+
+
+def imported_macro_paths(root):
+ macros_el = _macros_el(root)
+ return _imported_macro_paths_from_el(macros_el)
+
+
def _import_macros(root, path):
tool_dir = os.path.dirname(path)
- macros_el = root.find('macros')
+ macros_el = _macros_el(root)
if macros_el:
macro_els = _load_macros(macros_el, tool_dir)
_xml_set_children(macros_el, macro_els)
+def _macros_el(root):
+ return root.find('macros')
+
+
def _macros_of_type(root, type, el_func):
macros_el = root.find('macros')
macro_dict = {}
@@ -159,6 +176,17 @@
def _load_imported_macros(macros_el, tool_dir):
macros = []
+ for tool_relative_import_path in _imported_macro_paths_from_el(macros_el):
+ import_path = \
+ os.path.join(tool_dir, tool_relative_import_path)
+ file_macros = _load_macro_file(import_path, tool_dir)
+ macros.extend(file_macros)
+
+ return macros
+
+
+def _imported_macro_paths_from_el(macros_el):
+ imported_macro_paths = []
macro_import_els = []
if macros_el:
macro_import_els = macros_el.findall("import")
@@ -166,12 +194,8 @@
raw_import_path = macro_import_el.text
tool_relative_import_path = \
os.path.basename(raw_import_path) # Sanitize this
- import_path = \
- os.path.join(tool_dir, tool_relative_import_path)
- file_macros = _load_macro_file(import_path, tool_dir)
- macros.extend(file_macros)
-
- return macros
+ imported_macro_paths.append( tool_relative_import_path )
+ return imported_macro_paths
def _load_macro_file(path, tool_dir):
diff -r 7ac5a36c0ce7a6eb280d339de2107740552825ce -r 7cacfb33db90dee8c4e9ce78a3a735cd6cef8490 lib/tool_shed/tools/tool_validator.py
--- a/lib/tool_shed/tools/tool_validator.py
+++ b/lib/tool_shed/tools/tool_validator.py
@@ -3,6 +3,7 @@
import os
import tempfile
+from galaxy.tools import Tool
from galaxy.tools import parameters
from galaxy.tools.parameters import dynamic_options
@@ -311,15 +312,14 @@
message = ''
tmp_tool_config = hg_util.get_named_tmpfile_from_ctx( ctx, ctx_file, work_dir )
if tmp_tool_config:
- element_tree, error_message = xml_util.parse_xml( tmp_tool_config )
- if element_tree is None:
+ tool_element, error_message = xml_util.parse_xml( tmp_tool_config )
+ if tool_element is None:
return tool, message
- element_tree_root = element_tree.getroot()
- # Look for code files required by the tool config.
+ # Look for external files required by the tool config.
tmp_code_files = []
- for code_elem in element_tree_root.findall( 'code' ):
- code_file_name = code_elem.get( 'file' )
- tmp_code_file_name = hg_util.copy_file_from_manifest( repo, ctx, code_file_name, work_dir )
+ external_paths = Tool.get_externally_referenced_paths( tmp_tool_config )
+ for path in external_paths:
+ tmp_code_file_name = hg_util.copy_file_from_manifest( repo, ctx, path, work_dir )
if tmp_code_file_name:
tmp_code_files.append( tmp_code_file_name )
tool, valid, message = self.load_tool_from_config( repository_id, tmp_tool_config )
diff -r 7ac5a36c0ce7a6eb280d339de2107740552825ce -r 7cacfb33db90dee8c4e9ce78a3a735cd6cef8490 test/unit/tools/test_tool_external_files.py
--- /dev/null
+++ b/test/unit/tools/test_tool_external_files.py
@@ -0,0 +1,30 @@
+""" Unit test logic related to finding externally referenced files in tool
+descriptions.
+"""
+import tempfile
+import os
+import shutil
+from galaxy.tools import Tool
+
+
+def test_finds_external_code_file():
+ assert __external_files("""<tool><code file="foo.py" /></tool>""") == ["foo.py"]
+
+
+def test_finds_skips_empty_code_file_attribute():
+ assert __external_files("""<tool><code /></tool>""") == []
+
+
+def test_finds_external_macro_file():
+ assert __external_files("""<tool><macros><import>cool_macros.xml</import></macros></tool>""") == ["cool_macros.xml"]
+
+
+def __external_files(contents):
+ base_path = tempfile.mkdtemp()
+ try:
+ tool_path = os.path.join(base_path, "tool.xml")
+ with open(tool_path, "w") as f:
+ f.write(contents)
+ return Tool.get_externally_referenced_paths(tool_path)
+ finally:
+ shutil.rmtree(base_path)
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
3 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/e90ee102ac65/
Changeset: e90ee102ac65
Branch: next-stable
User: jmchilton
Date: 2014-08-04 18:18:00
Summary: Restructure tool external file logic in load_tool_from_tmp_config in ToolValidator...
... so internals of tool XML description are only utilized in the galaxy.tools module (and submodules). Add some unit tests for this new method for finding externally referenced files.
Affected #: 4 files
diff -r 2438770e2cfbf804acc0d5c7b2f3d6e491f30695 -r e90ee102ac654cc88bc3cf156aa1319008412846 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -69,7 +69,7 @@
from galaxy.model import Workflow
from tool_shed.util import common_util
from tool_shed.util import shed_util_common as suc
-from .loader import load_tool, template_macro_params
+from .loader import load_tool, template_macro_params, raw_tool_xml_tree
from .execute import execute as execute_job
from .wrappers import (
ToolParameterValueWrapper,
@@ -2989,6 +2989,21 @@
def get_default_history_by_trans( self, trans, create=False ):
return trans.get_history( create=create )
+ @classmethod
+ def get_externally_referenced_paths( self, path ):
+ """ Return relative paths to externally referenced files by the tool
+ described by file at `path`. External components should not assume things
+ about the structure of tool xml files (this is the tool's responsibility).
+ """
+ tree = raw_tool_xml_tree(path)
+ root = tree.getroot()
+ external_paths = []
+ for code_elem in root.findall( 'code' ):
+ external_path = code_elem.get( 'file' )
+ if external_path:
+ external_paths.append( external_path )
+ return external_paths
+
class OutputParameterJSONTool( Tool ):
"""
diff -r 2438770e2cfbf804acc0d5c7b2f3d6e491f30695 -r e90ee102ac654cc88bc3cf156aa1319008412846 lib/galaxy/tools/loader.py
--- a/lib/galaxy/tools/loader.py
+++ b/lib/galaxy/tools/loader.py
@@ -10,7 +10,7 @@
"""
Loads tool from file system and preprocesses tool macros.
"""
- tree = parse_xml(path)
+ tree = raw_tool_xml_tree(path)
root = tree.getroot()
_import_macros(root, path)
@@ -38,6 +38,14 @@
return param_dict
+def raw_tool_xml_tree(path):
+ """ Load raw (no macro expansion) tree representation of tool represented
+ at the specified path.
+ """
+ tree = parse_xml(path)
+ return tree
+
+
def _import_macros(root, path):
tool_dir = os.path.dirname(path)
macros_el = root.find('macros')
diff -r 2438770e2cfbf804acc0d5c7b2f3d6e491f30695 -r e90ee102ac654cc88bc3cf156aa1319008412846 lib/tool_shed/tools/tool_validator.py
--- a/lib/tool_shed/tools/tool_validator.py
+++ b/lib/tool_shed/tools/tool_validator.py
@@ -3,6 +3,7 @@
import os
import tempfile
+from galaxy.tools import Tool
from galaxy.tools import parameters
from galaxy.tools.parameters import dynamic_options
@@ -311,15 +312,14 @@
message = ''
tmp_tool_config = hg_util.get_named_tmpfile_from_ctx( ctx, ctx_file, work_dir )
if tmp_tool_config:
- element_tree, error_message = xml_util.parse_xml( tmp_tool_config )
- if element_tree is None:
+ tool_element, error_message = xml_util.parse_xml( tmp_tool_config )
+ if tool_element is None:
return tool, message
- element_tree_root = element_tree.getroot()
- # Look for code files required by the tool config.
+ # Look for external files required by the tool config.
tmp_code_files = []
- for code_elem in element_tree_root.findall( 'code' ):
- code_file_name = code_elem.get( 'file' )
- tmp_code_file_name = hg_util.copy_file_from_manifest( repo, ctx, code_file_name, work_dir )
+ external_paths = Tool.get_externally_referenced_paths( tmp_tool_config )
+ for path in external_paths:
+ tmp_code_file_name = hg_util.copy_file_from_manifest( repo, ctx, path, work_dir )
if tmp_code_file_name:
tmp_code_files.append( tmp_code_file_name )
tool, valid, message = self.load_tool_from_config( repository_id, tmp_tool_config )
diff -r 2438770e2cfbf804acc0d5c7b2f3d6e491f30695 -r e90ee102ac654cc88bc3cf156aa1319008412846 test/unit/tools/test_tool_external_files.py
--- /dev/null
+++ b/test/unit/tools/test_tool_external_files.py
@@ -0,0 +1,26 @@
+""" Unit test logic related to finding externally referenced files in tool
+descriptions.
+"""
+import tempfile
+import os
+import shutil
+from galaxy.tools import Tool
+
+
+def test_finds_external_code_file():
+ assert __external_files("""<tool><code file="foo.py" /></tool>""") == ["foo.py"]
+
+
+def test_finds_skips_empty_code_file_attribute():
+ assert __external_files("""<tool><code /></tool>""") == []
+
+
+def __external_files(contents):
+ base_path = tempfile.mkdtemp()
+ try:
+ tool_path = os.path.join(base_path, "tool.xml")
+ with open(tool_path, "w") as f:
+ f.write(contents)
+ return Tool.get_externally_referenced_paths(tool_path)
+ finally:
+ shutil.rmtree(base_path)
https://bitbucket.org/galaxy/galaxy-central/commits/d026577e04ac/
Changeset: d026577e04ac
Branch: next-stable
User: jmchilton
Date: 2014-08-04 18:18:00
Summary: Fix new Tool.get_externally_referenced_paths to find imported macro files.
Should fix this bug https://trello.com/c/TeguDYSq discovered by Bjoern... on stage at the GCC.
Affected #: 3 files
diff -r e90ee102ac654cc88bc3cf156aa1319008412846 -r d026577e04ac9802249aeecb64d14292bf59e20d lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -69,7 +69,7 @@
from galaxy.model import Workflow
from tool_shed.util import common_util
from tool_shed.util import shed_util_common as suc
-from .loader import load_tool, template_macro_params, raw_tool_xml_tree
+from .loader import load_tool, template_macro_params, raw_tool_xml_tree, imported_macro_paths
from .execute import execute as execute_job
from .wrappers import (
ToolParameterValueWrapper,
@@ -3002,6 +3002,8 @@
external_path = code_elem.get( 'file' )
if external_path:
external_paths.append( external_path )
+ external_paths.extend( imported_macro_paths( root ) )
+ # May also need to load external citation files as well at some point.
return external_paths
diff -r e90ee102ac654cc88bc3cf156aa1319008412846 -r d026577e04ac9802249aeecb64d14292bf59e20d lib/galaxy/tools/loader.py
--- a/lib/galaxy/tools/loader.py
+++ b/lib/galaxy/tools/loader.py
@@ -46,14 +46,23 @@
return tree
+def imported_macro_paths(root):
+ macros_el = _macros_el(root)
+ return _imported_macro_paths_from_el(macros_el)
+
+
def _import_macros(root, path):
tool_dir = os.path.dirname(path)
- macros_el = root.find('macros')
+ macros_el = _macros_el(root)
if macros_el:
macro_els = _load_macros(macros_el, tool_dir)
_xml_set_children(macros_el, macro_els)
+def _macros_el(root):
+ return root.find('macros')
+
+
def _macros_of_type(root, type, el_func):
macros_el = root.find('macros')
macro_dict = {}
@@ -167,6 +176,17 @@
def _load_imported_macros(macros_el, tool_dir):
macros = []
+ for tool_relative_import_path in _imported_macro_paths_from_el(macros_el):
+ import_path = \
+ os.path.join(tool_dir, tool_relative_import_path)
+ file_macros = _load_macro_file(import_path, tool_dir)
+ macros.extend(file_macros)
+
+ return macros
+
+
+def _imported_macro_paths_from_el(macros_el):
+ imported_macro_paths = []
macro_import_els = []
if macros_el:
macro_import_els = macros_el.findall("import")
@@ -174,12 +194,8 @@
raw_import_path = macro_import_el.text
tool_relative_import_path = \
os.path.basename(raw_import_path) # Sanitize this
- import_path = \
- os.path.join(tool_dir, tool_relative_import_path)
- file_macros = _load_macro_file(import_path, tool_dir)
- macros.extend(file_macros)
-
- return macros
+ imported_macro_paths.append( tool_relative_import_path )
+ return imported_macro_paths
def _load_macro_file(path, tool_dir):
diff -r e90ee102ac654cc88bc3cf156aa1319008412846 -r d026577e04ac9802249aeecb64d14292bf59e20d test/unit/tools/test_tool_external_files.py
--- a/test/unit/tools/test_tool_external_files.py
+++ b/test/unit/tools/test_tool_external_files.py
@@ -15,6 +15,10 @@
assert __external_files("""<tool><code /></tool>""") == []
+def test_finds_external_macro_file():
+ assert __external_files("""<tool><macros><import>cool_macros.xml</import></macros></tool>""") == ["cool_macros.xml"]
+
+
def __external_files(contents):
base_path = tempfile.mkdtemp()
try:
https://bitbucket.org/galaxy/galaxy-central/commits/7cacfb33db90/
Changeset: 7cacfb33db90
Branch: next-stable
User: jmchilton
Date: 2014-08-04 20:57:31
Summary: Merged in jmchilton/galaxy-central-fork-1/next-stable (pull request #449)
Fix tool shed's logic related to finding tool externally referenced files.
Affected #: 4 files
diff -r 7ac5a36c0ce7a6eb280d339de2107740552825ce -r 7cacfb33db90dee8c4e9ce78a3a735cd6cef8490 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -69,7 +69,7 @@
from galaxy.model import Workflow
from tool_shed.util import common_util
from tool_shed.util import shed_util_common as suc
-from .loader import load_tool, template_macro_params
+from .loader import load_tool, template_macro_params, raw_tool_xml_tree, imported_macro_paths
from .execute import execute as execute_job
from .wrappers import (
ToolParameterValueWrapper,
@@ -2989,6 +2989,23 @@
def get_default_history_by_trans( self, trans, create=False ):
return trans.get_history( create=create )
+ @classmethod
+ def get_externally_referenced_paths( self, path ):
+ """ Return relative paths to externally referenced files by the tool
+ described by file at `path`. External components should not assume things
+ about the structure of tool xml files (this is the tool's responsibility).
+ """
+ tree = raw_tool_xml_tree(path)
+ root = tree.getroot()
+ external_paths = []
+ for code_elem in root.findall( 'code' ):
+ external_path = code_elem.get( 'file' )
+ if external_path:
+ external_paths.append( external_path )
+ external_paths.extend( imported_macro_paths( root ) )
+ # May also need to load external citation files as well at some point.
+ return external_paths
+
class OutputParameterJSONTool( Tool ):
"""
diff -r 7ac5a36c0ce7a6eb280d339de2107740552825ce -r 7cacfb33db90dee8c4e9ce78a3a735cd6cef8490 lib/galaxy/tools/loader.py
--- a/lib/galaxy/tools/loader.py
+++ b/lib/galaxy/tools/loader.py
@@ -10,7 +10,7 @@
"""
Loads tool from file system and preprocesses tool macros.
"""
- tree = parse_xml(path)
+ tree = raw_tool_xml_tree(path)
root = tree.getroot()
_import_macros(root, path)
@@ -38,14 +38,31 @@
return param_dict
+def raw_tool_xml_tree(path):
+ """ Load raw (no macro expansion) tree representation of tool represented
+ at the specified path.
+ """
+ tree = parse_xml(path)
+ return tree
+
+
+def imported_macro_paths(root):
+ macros_el = _macros_el(root)
+ return _imported_macro_paths_from_el(macros_el)
+
+
def _import_macros(root, path):
tool_dir = os.path.dirname(path)
- macros_el = root.find('macros')
+ macros_el = _macros_el(root)
if macros_el:
macro_els = _load_macros(macros_el, tool_dir)
_xml_set_children(macros_el, macro_els)
+def _macros_el(root):
+ return root.find('macros')
+
+
def _macros_of_type(root, type, el_func):
macros_el = root.find('macros')
macro_dict = {}
@@ -159,6 +176,17 @@
def _load_imported_macros(macros_el, tool_dir):
macros = []
+ for tool_relative_import_path in _imported_macro_paths_from_el(macros_el):
+ import_path = \
+ os.path.join(tool_dir, tool_relative_import_path)
+ file_macros = _load_macro_file(import_path, tool_dir)
+ macros.extend(file_macros)
+
+ return macros
+
+
+def _imported_macro_paths_from_el(macros_el):
+ imported_macro_paths = []
macro_import_els = []
if macros_el:
macro_import_els = macros_el.findall("import")
@@ -166,12 +194,8 @@
raw_import_path = macro_import_el.text
tool_relative_import_path = \
os.path.basename(raw_import_path) # Sanitize this
- import_path = \
- os.path.join(tool_dir, tool_relative_import_path)
- file_macros = _load_macro_file(import_path, tool_dir)
- macros.extend(file_macros)
-
- return macros
+ imported_macro_paths.append( tool_relative_import_path )
+ return imported_macro_paths
def _load_macro_file(path, tool_dir):
diff -r 7ac5a36c0ce7a6eb280d339de2107740552825ce -r 7cacfb33db90dee8c4e9ce78a3a735cd6cef8490 lib/tool_shed/tools/tool_validator.py
--- a/lib/tool_shed/tools/tool_validator.py
+++ b/lib/tool_shed/tools/tool_validator.py
@@ -3,6 +3,7 @@
import os
import tempfile
+from galaxy.tools import Tool
from galaxy.tools import parameters
from galaxy.tools.parameters import dynamic_options
@@ -311,15 +312,14 @@
message = ''
tmp_tool_config = hg_util.get_named_tmpfile_from_ctx( ctx, ctx_file, work_dir )
if tmp_tool_config:
- element_tree, error_message = xml_util.parse_xml( tmp_tool_config )
- if element_tree is None:
+ tool_element, error_message = xml_util.parse_xml( tmp_tool_config )
+ if tool_element is None:
return tool, message
- element_tree_root = element_tree.getroot()
- # Look for code files required by the tool config.
+ # Look for external files required by the tool config.
tmp_code_files = []
- for code_elem in element_tree_root.findall( 'code' ):
- code_file_name = code_elem.get( 'file' )
- tmp_code_file_name = hg_util.copy_file_from_manifest( repo, ctx, code_file_name, work_dir )
+ external_paths = Tool.get_externally_referenced_paths( tmp_tool_config )
+ for path in external_paths:
+ tmp_code_file_name = hg_util.copy_file_from_manifest( repo, ctx, path, work_dir )
if tmp_code_file_name:
tmp_code_files.append( tmp_code_file_name )
tool, valid, message = self.load_tool_from_config( repository_id, tmp_tool_config )
diff -r 7ac5a36c0ce7a6eb280d339de2107740552825ce -r 7cacfb33db90dee8c4e9ce78a3a735cd6cef8490 test/unit/tools/test_tool_external_files.py
--- /dev/null
+++ b/test/unit/tools/test_tool_external_files.py
@@ -0,0 +1,30 @@
+""" Unit test logic related to finding externally referenced files in tool
+descriptions.
+"""
+import tempfile
+import os
+import shutil
+from galaxy.tools import Tool
+
+
+def test_finds_external_code_file():
+ assert __external_files("""<tool><code file="foo.py" /></tool>""") == ["foo.py"]
+
+
+def test_finds_skips_empty_code_file_attribute():
+ assert __external_files("""<tool><code /></tool>""") == []
+
+
+def test_finds_external_macro_file():
+ assert __external_files("""<tool><macros><import>cool_macros.xml</import></macros></tool>""") == ["cool_macros.xml"]
+
+
+def __external_files(contents):
+ base_path = tempfile.mkdtemp()
+ try:
+ tool_path = os.path.join(base_path, "tool.xml")
+ with open(tool_path, "w") as f:
+ f.write(contents)
+ return Tool.get_externally_referenced_paths(tool_path)
+ finally:
+ shutil.rmtree(base_path)
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Trackster: fix single-pixel gap bug in quantitative track display.
by commits-noreply@bitbucket.org 04 Aug '14
by commits-noreply@bitbucket.org 04 Aug '14
04 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/7ac5a36c0ce7/
Changeset: 7ac5a36c0ce7
Branch: next-stable
User: jgoecks
Date: 2014-08-04 20:50:28
Summary: Trackster: fix single-pixel gap bug in quantitative track display.
Affected #: 2 files
diff -r 2438770e2cfbf804acc0d5c7b2f3d6e491f30695 -r 7ac5a36c0ce7a6eb280d339de2107740552825ce static/scripts/packed/viz/trackster/painters.js
--- a/static/scripts/packed/viz/trackster/painters.js
+++ b/static/scripts/packed/viz/trackster/painters.js
@@ -1,1 +1,1 @@
-define(["libs/underscore"],function(_){var BEFORE=1001,CONTAINS=1002,OVERLAP_START=1003,OVERLAP_END=1004,CONTAINED_BY=1005,AFTER=1006;var compute_overlap=function(first_region,second_region){var first_start=first_region[0],first_end=first_region[1],second_start=second_region[0],second_end=second_region[1],overlap;if(first_start<second_start){if(first_end<=second_start){overlap=BEFORE}else{if(first_end<=second_end){overlap=OVERLAP_START}else{overlap=CONTAINS}}}else{if(first_start>second_end){overlap=AFTER}else{if(first_end<=second_end){overlap=CONTAINED_BY}else{overlap=OVERLAP_END}}}return overlap};var is_overlap=function(first_region,second_region){var overlap=compute_overlap(first_region,second_region);return(overlap!==BEFORE&&overlap!==AFTER)};var dashedLine=function(ctx,x1,y1,x2,y2,dashLen){if(dashLen===undefined){dashLen=4}var dX=x2-x1;var dY=y2-y1;var dashes=Math.floor(Math.sqrt(dX*dX+dY*dY)/dashLen);var dashX=dX/dashes;var dashY=dY/dashes;var q;for(q=0;q<dashes;q++,x1+=dashX,y1+=dashY){if(q%2!==0){continue}ctx.fillRect(x1,y1,dashLen,1)}};var drawDownwardEquilateralTriangle=function(ctx,down_vertex_x,down_vertex_y,side_len){var x1=down_vertex_x-side_len/2,x2=down_vertex_x+side_len/2,y=down_vertex_y-Math.sqrt(side_len*3/2);ctx.beginPath();ctx.moveTo(x1,y);ctx.lineTo(x2,y);ctx.lineTo(down_vertex_x,down_vertex_y);ctx.lineTo(x1,y);ctx.strokeStyle=this.fillStyle;ctx.fill();ctx.stroke();ctx.closePath()};var Scaler=function(default_val){this.default_val=(default_val?default_val:1)};Scaler.prototype.gen_val=function(input){return this.default_val};var DrawResults=function(options){this.incomplete_features=options.incomplete_features;this.feature_mapper=options.feature_mapper};var Painter=function(data,view_start,view_end,prefs,mode){this.data=data;this.view_start=view_start;this.view_end=view_end;this.prefs=_.extend({},this.default_prefs,prefs);this.mode=mode};Painter.prototype.default_prefs={};Painter.prototype.draw=function(ctx,width,height,w_scale){};var LinePainter=function(data,view_start,view_end,prefs,mode){Painter.call(this,data,view_start,view_end,prefs,mode);if(this.prefs.min_value===undefined){this.prefs.min_value=_.min(_.map(this.data,function(d){return d[1]}))||0}if(this.prefs.max_value===undefined){this.prefs.max_value=_.max(_.map(this.data,function(d){return d[1]}))||0}};LinePainter.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Histogram",color:"#000",overflow_color:"#F66"};LinePainter.prototype.draw=function(ctx,width,height,w_scale){var in_path=false,min_value=this.prefs.min_value,max_value=this.prefs.max_value,vertical_range=max_value-min_value,height_px=height,view_start=this.view_start,mode=this.mode,data=this.data;ctx.save();var y_zero=Math.round(height+min_value/vertical_range*height);if(mode!=="Intensity"){ctx.fillStyle="#aaa";ctx.fillRect(0,y_zero,width,1)}ctx.beginPath();var x_scaled,y,delta_x_px;if(data.length>1){delta_x_px=Math.ceil((data[1][0]-data[0][0])*w_scale)}else{delta_x_px=10}var painter_color=this.prefs.block_color||this.prefs.color,pref_color=parseInt(painter_color.slice(1),16),pref_r=(pref_color&16711680)>>16,pref_g=(pref_color&65280)>>8,pref_b=pref_color&255,top_overflow=false,bot_overflow=false;for(var i=0,len=data.length;i<len;i++){ctx.fillStyle=ctx.strokeStyle=painter_color;top_overflow=bot_overflow=false;x_scaled=Math.round((data[i][0]-view_start)*w_scale);y=data[i][1];if(y===null){if(in_path&&mode==="Filled"){ctx.lineTo(x_scaled,height_px)}in_path=false;continue}if(y<min_value){bot_overflow=true;y=min_value}else{if(y>max_value){top_overflow=true;y=max_value}}if(mode==="Histogram"){y=Math.round(y/vertical_range*height_px);ctx.fillRect(x_scaled,y_zero,delta_x_px,-y)}else{if(mode==="Intensity"){var saturation=(y-min_value)/vertical_range,new_r=Math.round(pref_r+(255-pref_r)*(1-saturation)),new_g=Math.round(pref_g+(255-pref_g)*(1-saturation)),new_b=Math.round(pref_b+(255-pref_b)*(1-saturation));ctx.fillStyle="rgb("+new_r+","+new_g+","+new_b+")";ctx.fillRect(x_scaled,0,delta_x_px,height_px)}else{y=Math.round(height_px-(y-min_value)/vertical_range*height_px);if(in_path){ctx.lineTo(x_scaled,y)}else{in_path=true;if(mode==="Filled"){ctx.moveTo(x_scaled,height_px);ctx.lineTo(x_scaled,y)}else{ctx.moveTo(x_scaled,y)}}}}ctx.fillStyle=this.prefs.overflow_color;if(top_overflow||bot_overflow){var overflow_x;if(mode==="Histogram"||mode==="Intensity"){overflow_x=delta_x_px}else{x_scaled-=2;overflow_x=4}if(top_overflow){ctx.fillRect(x_scaled,0,overflow_x,3)}if(bot_overflow){ctx.fillRect(x_scaled,height_px-3,overflow_x,3)}}ctx.fillStyle=painter_color}if(mode==="Filled"){if(in_path){ctx.lineTo(x_scaled,y_zero);ctx.lineTo(0,y_zero)}ctx.fill()}else{ctx.stroke()}ctx.restore()};var FeaturePositionMapper=function(slot_height){this.feature_positions={};this.slot_height=slot_height;this.translation=0;this.y_translation=0};FeaturePositionMapper.prototype.map_feature_data=function(feature_data,slot,x_start,x_end){if(!this.feature_positions[slot]){this.feature_positions[slot]=[]}this.feature_positions[slot].push({data:feature_data,x_start:x_start,x_end:x_end})};FeaturePositionMapper.prototype.get_feature_data=function(x,y){var slot=Math.floor((y-this.y_translation)/this.slot_height),feature_dict;if(!this.feature_positions[slot]){return null}x+=this.translation;for(var i=0;i<this.feature_positions[slot].length;i++){feature_dict=this.feature_positions[slot][i];if(x>=feature_dict.x_start&&x<=feature_dict.x_end){return feature_dict.data}}};var FeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){Painter.call(this,data,view_start,view_end,prefs,mode);this.alpha_scaler=(alpha_scaler?alpha_scaler:new Scaler());this.height_scaler=(height_scaler?height_scaler:new Scaler());this.max_label_length=200};FeaturePainter.prototype.default_prefs={block_color:"#FFF",connector_color:"#FFF"};_.extend(FeaturePainter.prototype,{get_required_height:function(rows_required,width){var required_height=this.get_row_height(),y_scale=required_height,mode=this.mode;if(mode==="no_detail"||mode==="Squish"||mode==="Pack"){required_height=rows_required*y_scale}return required_height+this.get_top_padding(width)},get_top_padding:function(width){return 0},draw:function(ctx,width,height,w_scale,slots){var data=this.data,view_start=this.view_start,view_end=this.view_end;ctx.save();ctx.fillStyle=this.prefs.block_color;ctx.textAlign="right";var y_scale=this.get_row_height(),feature_mapper=new FeaturePositionMapper(y_scale),x_draw_coords,incomplete_features=[];for(var i=0,len=data.length;i<len;i++){var feature=data[i],feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],slot=(slots&&slots[feature_uid]!==undefined?slots[feature_uid]:null);if((this.mode==="Dense"||slot!==null)&&(feature_start<view_end&&feature_end>view_start)){x_draw_coords=this.draw_element(ctx,this.mode,feature,slot,view_start,view_end,w_scale,y_scale,width);feature_mapper.map_feature_data(feature,slot,x_draw_coords[0],x_draw_coords[1]);if(feature_start<view_start||feature_end>view_end){incomplete_features.push(feature)}}}ctx.restore();feature_mapper.y_translation=this.get_top_padding(width);return new DrawResults({incomplete_features:incomplete_features,feature_mapper:feature_mapper})},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){return[0,0]}});var DENSE_TRACK_HEIGHT=10,NO_DETAIL_TRACK_HEIGHT=3,SQUISH_TRACK_HEIGHT=5,PACK_TRACK_HEIGHT=10,NO_DETAIL_FEATURE_HEIGHT=1,DENSE_FEATURE_HEIGHT=9,SQUISH_FEATURE_HEIGHT=3,PACK_FEATURE_HEIGHT=9,LABEL_SPACING=2,CONNECTOR_COLOR="#ccc";var LinkedFeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){FeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.draw_background_connector=true;this.draw_individual_connectors=false};_.extend(LinkedFeaturePainter.prototype,FeaturePainter.prototype,{get_row_height:function(){var mode=this.mode,height;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="no_detail"){height=NO_DETAIL_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT}}}return height},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){var feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],feature_name=feature[3],feature_strand=feature[4],f_start=Math.floor(Math.max(0,(feature_start-tile_low-0.5)*w_scale)),f_end=Math.ceil(Math.min(width,Math.max(0,(feature_end-tile_low-0.5)*w_scale))),draw_start=f_start,draw_end=f_end,y_start=(mode==="Dense"?0:(0+slot))*y_scale+this.get_top_padding(width),thickness,y_start,thick_start=null,thick_end=null,block_color=(!feature_strand||feature_strand==="+"||feature_strand==="."?this.prefs.block_color:this.prefs.reverse_strand_color);label_color=this.prefs.label_color;ctx.globalAlpha=this.alpha_scaler.gen_val(feature);if(mode==="Dense"){slot=1}if(mode==="no_detail"){ctx.fillStyle=block_color;ctx.fillRect(f_start,y_start+5,f_end-f_start,NO_DETAIL_FEATURE_HEIGHT)}else{var feature_ts=feature[5],feature_te=feature[6],feature_blocks=feature[7],full_height=true;if(feature_ts&&feature_te){thick_start=Math.floor(Math.max(0,(feature_ts-tile_low)*w_scale));thick_end=Math.ceil(Math.min(width,Math.max(0,(feature_te-tile_low)*w_scale)))}var thin_height,thick_height;if(mode==="Squish"){thin_height=1;thick_height=SQUISH_FEATURE_HEIGHT;full_height=false}else{if(mode==="Dense"){thin_height=5;thick_height=DENSE_FEATURE_HEIGHT}else{thin_height=5;thick_height=PACK_FEATURE_HEIGHT}}if(!feature_blocks){ctx.fillStyle=block_color;ctx.fillRect(f_start,y_start+1,f_end-f_start,thick_height);if(feature_strand&&full_height){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand_inv")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand_inv")}}ctx.fillRect(f_start,y_start+1,f_end-f_start,thick_height)}}else{var cur_y_start,cur_height;if(mode==="Squish"||mode==="Dense"){cur_y_start=y_start+Math.floor(SQUISH_FEATURE_HEIGHT/2)+1;cur_height=1}else{if(feature_strand){cur_y_start=y_start;cur_height=thick_height}else{cur_y_start+=(SQUISH_FEATURE_HEIGHT/2)+1;cur_height=1}}if(this.draw_background_connector){if(mode==="Squish"||mode==="Dense"){ctx.fillStyle=CONNECTOR_COLOR}else{if(feature_strand){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand")}}}else{ctx.fillStyle=CONNECTOR_COLOR}}ctx.fillRect(f_start,cur_y_start,f_end-f_start,cur_height)}var start_and_height;for(var k=0,k_len=feature_blocks.length;k<k_len;k++){var block=feature_blocks[k],block_start=Math.floor(Math.max(0,(block[0]-tile_low-0.5)*w_scale)),block_end=Math.ceil(Math.min(width,Math.max((block[1]-tile_low-0.5)*w_scale))),last_block_start,last_block_end;if(block_start>block_end){continue}ctx.fillStyle=block_color;ctx.fillRect(block_start,y_start+(thick_height-thin_height)/2+1,block_end-block_start,thin_height);if(thick_start!==undefined&&feature_te>feature_ts&&!(block_start>thick_end||block_end<thick_start)){var block_thick_start=Math.max(block_start,thick_start),block_thick_end=Math.min(block_end,thick_end);ctx.fillRect(block_thick_start,y_start+1,block_thick_end-block_thick_start,thick_height);if(feature_blocks.length===1&&mode==="Pack"){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand_inv")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand_inv")}}if(block_thick_start+14<block_thick_end){block_thick_start+=2;block_thick_end-=2}ctx.fillRect(block_thick_start,y_start+1,block_thick_end-block_thick_start,thick_height)}}if(this.draw_individual_connectors&&last_block_start){this.draw_connector(ctx,last_block_start,last_block_end,block_start,block_end,y_start)}last_block_start=block_start;last_block_end=block_end}if(mode==="Pack"){ctx.globalAlpha=1;ctx.fillStyle="white";var hscale_factor=this.height_scaler.gen_val(feature),new_height=Math.ceil(thick_height*hscale_factor),ws_height=Math.round((thick_height-new_height)/2);if(hscale_factor!==1){ctx.fillRect(f_start,cur_y_start+1,f_end-f_start,ws_height);ctx.fillRect(f_start,cur_y_start+thick_height-ws_height+1,f_end-f_start,ws_height)}}}ctx.globalAlpha=1;if(feature_name&&mode==="Pack"&&feature_start>tile_low){ctx.fillStyle=label_color;if(tile_low===0&&f_start-ctx.measureText(feature_name).width<0){ctx.textAlign="left";ctx.fillText(feature_name,f_end+LABEL_SPACING,y_start+8,this.max_label_length);draw_end+=ctx.measureText(feature_name).width+LABEL_SPACING}else{ctx.textAlign="right";ctx.fillText(feature_name,f_start-LABEL_SPACING,y_start+8,this.max_label_length);draw_start-=ctx.measureText(feature_name).width+LABEL_SPACING}}}ctx.globalAlpha=1;return[draw_start,draw_end]}});var ReadPainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler,ref_seq,base_color_fn){FeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.ref_seq=(ref_seq?ref_seq.data:null);this.base_color_fn=base_color_fn};_.extend(ReadPainter.prototype,FeaturePainter.prototype,{get_row_height:function(){var height,mode=this.mode;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT;if(this.prefs.show_insertions){height*=2}}}return height},_parse_cigar:function(cigar_str){var cigar_ops="MIDNSHP=X";var blocks=[[0,0]],cur_block=blocks[0],base_pos=0,parsed_cigar=_.map(cigar_str.match(/[0-9]+[MIDNSHP=X]/g),function(op){var op_len=parseInt(op.slice(0,-1),10),op_char=op.slice(-1);if(op_char==="N"){if(cur_block[1]!==0){cur_block=[base_pos+op_len,base_pos+op_len];blocks.push(cur_block)}}else{if("ISHP".indexOf(op_char)===-1){cur_block[1]+=op_len;base_pos+=op_len}}return[cigar_ops.indexOf(op_char),op_len]});return{blocks:blocks,cigar:parsed_cigar}},draw_read:function(ctx,mode,w_scale,y_start,tile_low,tile_high,feature_start,cigar,strand,read_seq){var update_base_offset=function(offset,cig_op,cig_len){if("M=NXD".indexOf(cig_op)!==-1){offset+=cig_len}return offset},update_seq_offset=function(offset,cig_op,cig_len){if("IX".indexOf(cig_op)!==-1){offset+=cig_len}return offset},get_draw_coord=function(sequence_coord){return Math.floor(Math.max(0,(sequence_coord-tile_low-0.5)*w_scale))};ctx.textAlign="center";var tile_region=[tile_low,tile_high],base_offset=0,seq_offset=0,gap=Math.round(w_scale/2),char_width_px=ctx.canvas.manager.char_width_px,block_color=(strand==="+"?this.prefs.detail_block_color:this.prefs.reverse_strand_color),pack_mode=(mode==="Pack"),draw_height=(pack_mode?PACK_FEATURE_HEIGHT:SQUISH_FEATURE_HEIGHT),rect_y=y_start+1,paint_utils=new ReadPainterUtils(ctx,draw_height,w_scale,mode),drawing_blocks=[],s_start,s_end;var draw_last=[];var t=this._parse_cigar(cigar);cigar=t.cigar;drawing_blocks=t.blocks;for(var i=0;i<drawing_blocks.length;i++){var block=drawing_blocks[i];if(is_overlap([feature_start+block[0],feature_start+block[1]],tile_region)){s_start=get_draw_coord(feature_start+block[0]);s_end=get_draw_coord(feature_start+block[1]);if(s_start===s_end){s_end+=1}ctx.fillStyle=block_color;ctx.fillRect(s_start,rect_y,s_end-s_start,draw_height)}}for(var cig_id=0,len=cigar.length;cig_id<len;cig_id++){var cig=cigar[cig_id],cig_op="MIDNSHP=X"[cig[0]],cig_len=cig[1];var seq_start=feature_start+base_offset;s_start=get_draw_coord(seq_start);s_end=get_draw_coord(seq_start+cig_len);if(!is_overlap([seq_start,seq_start+cig_len],tile_region)){base_offset=update_base_offset(base_offset,cig_op,cig_len);seq_offset=update_seq_offset(seq_offset,cig_op,cig_len);continue}if(s_start===s_end){s_end+=1}switch(cig_op){case"H":case"S":case"P":break;case"M":base_offset+=cig_len;break;case"=":case"X":var cur_seq="";if(cig_op==="X"){cur_seq=read_seq.slice(seq_offset,seq_offset+cig_len)}else{if(this.ref_seq){cur_seq=this.ref_seq.slice(Math.max(0,seq_start-tile_low),Math.min(seq_start-tile_low+cig_len,tile_high-tile_low))}}var start_pos=Math.max(seq_start,tile_low);for(var c=0;c<cur_seq.length;c++){if(cur_seq&&!this.prefs.show_differences||cig_op==="X"){var c_start=Math.floor(Math.max(0,(start_pos+c-tile_low)*w_scale));ctx.fillStyle=this.base_color_fn(cur_seq[c]);if(pack_mode&&w_scale>char_width_px){ctx.fillText(cur_seq[c],c_start,y_start+9)}else{if(w_scale>0.05){ctx.fillRect(c_start-gap,rect_y,Math.max(1,Math.round(w_scale)),draw_height)}}}}if(cig_op==="X"){seq_offset+=cig_len}base_offset+=cig_len;break;case"N":ctx.fillStyle=CONNECTOR_COLOR;ctx.fillRect(s_start,y_start+5,s_end-s_start,1);base_offset+=cig_len;break;case"D":paint_utils.draw_deletion(s_start,rect_y,cig_len);base_offset+=cig_len;break;case"I":var insert_x_coord=s_start-gap;if(is_overlap([seq_start,seq_start+cig_len],tile_region)){var seq=read_seq.slice(seq_offset,seq_offset+cig_len);if(this.prefs.show_insertions){var x_center=s_start-(s_end-s_start)/2;if((mode==="Pack"||this.mode==="Auto")&&read_seq!==undefined&&w_scale>char_width_px){ctx.fillStyle="yellow";ctx.fillRect(x_center-gap,y_start-9,s_end-s_start,9);draw_last[draw_last.length]={type:"triangle",data:[insert_x_coord,y_start+4,5]};ctx.fillStyle=CONNECTOR_COLOR;switch(compute_overlap([seq_start,seq_start+cig_len],tile_region)){case (OVERLAP_START):seq=seq.slice(tile_low-seq_start);break;case (OVERLAP_END):seq=seq.slice(0,seq_start-tile_high);break;case (CONTAINED_BY):break;case (CONTAINS):seq=seq.slice(tile_low-seq_start,seq_start-tile_high);break}for(var c=0,str_len=seq.length;c<str_len;c++){var c_start=Math.floor(Math.max(0,(seq_start+c-tile_low)*w_scale));ctx.fillText(seq[c],c_start-(s_end-s_start)/2,y_start)}}else{ctx.fillStyle="yellow";ctx.fillRect(x_center,y_start+(this.mode!=="Dense"?2:5),s_end-s_start,(mode!=="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}else{if((mode==="Pack"||this.mode==="Auto")&&read_seq!==undefined&&w_scale>char_width_px){draw_last.push({type:"text",data:[seq.length,insert_x_coord,y_start+9]})}else{}}}seq_offset+=cig_len;break}}ctx.fillStyle="yellow";var item,type,data;for(var i=0;i<draw_last.length;i++){item=draw_last[i];type=item.type;data=item.data;if(type==="text"){ctx.save();ctx.font="bold "+ctx.font;ctx.fillText(data[0],data[1],data[2]);ctx.restore()}else{if(type==="triangle"){drawDownwardEquilateralTriangle(ctx,data[0],data[1],data[2])}}}},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){var feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],feature_name=feature[3],f_start=Math.floor(Math.max(-0.5*w_scale,(feature_start-tile_low-0.5)*w_scale)),f_end=Math.ceil(Math.min(width,Math.max(0,(feature_end-tile_low-0.5)*w_scale))),y_start=(mode==="Dense"?0:(0+slot))*y_scale,label_color=this.prefs.label_color;if(feature[5] instanceof Array){var connector=true;if(feature[4][1]>=tile_low&&feature[4][0]<=tile_high&&feature[4][2]){this.draw_read(ctx,mode,w_scale,y_start,tile_low,tile_high,feature[4][0],feature[4][2],feature[4][3],feature[4][4])}else{connector=false}if(feature[5][1]>=tile_low&&feature[5][0]<=tile_high&&feature[5][2]){this.draw_read(ctx,mode,w_scale,y_start,tile_low,tile_high,feature[5][0],feature[5][2],feature[5][3],feature[5][4])}else{connector=false}var b1_end=Math.ceil(Math.min(width,Math.max(-0.5*w_scale,(feature[4][1]-tile_low-0.5)*w_scale))),b2_start=Math.floor(Math.max(-0.5*w_scale,(feature[5][0]-tile_low-0.5)*w_scale));if(connector&&b2_start>b1_end){ctx.fillStyle=CONNECTOR_COLOR;dashedLine(ctx,b1_end,y_start+5,b2_start,y_start+5)}}else{this.draw_read(ctx,mode,w_scale,y_start,tile_low,tile_high,feature_start,feature[4],feature[5],feature[6])}if(mode==="Pack"&&feature_start>=tile_low&&feature_name!=="."){ctx.fillStyle=this.prefs.label_color;if(tile_low===0&&f_start-ctx.measureText(feature_name).width<0){ctx.textAlign="left";ctx.fillText(feature_name,f_end+LABEL_SPACING,y_start+9,this.max_label_length)}else{ctx.textAlign="right";ctx.fillText(feature_name,f_start-LABEL_SPACING,y_start+9,this.max_label_length)}}return[0,0]}});var ArcLinkedFeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){LinkedFeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.longest_feature_length=this.calculate_longest_feature_length();this.draw_background_connector=false;this.draw_individual_connectors=true};_.extend(ArcLinkedFeaturePainter.prototype,FeaturePainter.prototype,LinkedFeaturePainter.prototype,{calculate_longest_feature_length:function(){var longest_feature_length=0;for(var i=0,len=this.data.length;i<len;i++){var feature=this.data[i],feature_start=feature[1],feature_end=feature[2];longest_feature_length=Math.max(longest_feature_length,feature_end-feature_start)}return longest_feature_length},get_top_padding:function(width){var view_range=this.view_end-this.view_start,w_scale=width/view_range;return Math.min(128,Math.ceil((this.longest_feature_length/2)*w_scale))},draw_connector:function(ctx,block1_start,block1_end,block2_start,block2_end,y_start){var x_center=(block1_end+block2_start)/2,radius=block2_start-x_center;var angle1=Math.PI,angle2=0;if(radius>0){ctx.beginPath();ctx.arc(x_center,y_start,block2_start-x_center,Math.PI,0);ctx.stroke()}}});var Color=function(rgb,a){if(Array.isArray(rgb)){this.rgb=rgb}else{if(rgb.length==6){this.rgb=rgb.match(/.{2}/g).map(function(c){return parseInt(c,16)})}else{if(rgb.length==7){this.rgb=rgb.substring(1,7).match(/.{2}/g).map(function(c){return parseInt(c,16)})}else{this.rgb=rgb.split("").map(function(c){return parseInt(c+c,16)})}}}this.alpha=typeof(a)==="number"?a:1};Color.prototype={eval:function(){return this},toCSS:function(){if(this.alpha<1){return"rgba("+this.rgb.map(function(c){return Math.round(c)}).concat(this.alpha).join(", ")+")"}else{return"#"+this.rgb.map(function(i){i=Math.round(i);i=(i>255?255:(i<0?0:i)).toString(16);return i.length===1?"0"+i:i}).join("")}},toHSL:function(){var r=this.rgb[0]/255,g=this.rgb[1]/255,b=this.rgb[2]/255,a=this.alpha;var max=Math.max(r,g,b),min=Math.min(r,g,b);var h,s,l=(max+min)/2,d=max-min;if(max===min){h=s=0}else{s=l>0.5?d/(2-max-min):d/(max+min);switch(max){case r:h=(g-b)/d+(g<b?6:0);break;case g:h=(b-r)/d+2;break;case b:h=(r-g)/d+4;break}h/=6}return{h:h*360,s:s,l:l,a:a}},toARGB:function(){var argb=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+argb.map(function(i){i=Math.round(i);i=(i>255?255:(i<0?0:i)).toString(16);return i.length===1?"0"+i:i}).join("")},mix:function(color2,weight){color1=this;var p=weight;var w=p*2-1;var a=color1.toHSL().a-color2.toHSL().a;var w1=(((w*a==-1)?w:(w+a)/(1+w*a))+1)/2;var w2=1-w1;var rgb=[color1.rgb[0]*w1+color2.rgb[0]*w2,color1.rgb[1]*w1+color2.rgb[1]*w2,color1.rgb[2]*w1+color2.rgb[2]*w2];var alpha=color1.alpha*p+color2.alpha*(1-p);return new Color(rgb,alpha)}};var LinearRamp=function(start_color,end_color,start_value,end_value){this.start_color=new Color(start_color);this.end_color=new Color(end_color);this.start_value=start_value;this.end_value=end_value;this.value_range=end_value-start_value};LinearRamp.prototype.map_value=function(value){value=Math.max(value,this.start_value);value=Math.min(value,this.end_value);value=(value-this.start_value)/this.value_range;return this.start_color.mix(this.end_color,1-value).toCSS()};var SplitRamp=function(start_color,middle_color,end_color,start_value,end_value){this.positive_ramp=new LinearRamp(middle_color,end_color,0,end_value);this.negative_ramp=new LinearRamp(middle_color,start_color,0,-start_value);this.start_value=start_value;this.end_value=end_value};SplitRamp.prototype.map_value=function(value){value=Math.max(value,this.start_value);value=Math.min(value,this.end_value);if(value>=0){return this.positive_ramp.map_value(value)}else{return this.negative_ramp.map_value(-value)}};var DiagonalHeatmapPainter=function(data,view_start,view_end,prefs,mode){Painter.call(this,data,view_start,view_end,prefs,mode);var i,len;if(this.prefs.min_value===undefined){var min_value=Infinity;for(i=0,len=this.data.length;i<len;i++){min_value=Math.min(min_value,this.data[i][5])}this.prefs.min_value=min_value}if(this.prefs.max_value===undefined){var max_value=-Infinity;for(i=0,len=this.data.length;i<len;i++){max_value=Math.max(max_value,this.data[i][5])}this.prefs.max_value=max_value}};DiagonalHeatmapPainter.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Heatmap",pos_color:"#FF8C00",neg_color:"#4169E1"};DiagonalHeatmapPainter.prototype.draw=function(ctx,width,height,w_scale){var min_value=this.prefs.min_value,max_value=this.prefs.max_value,value_range=max_value-min_value,height_px=height,view_start=this.view_start,mode=this.mode,data=this.data,invsqrt2=1/Math.sqrt(2);var ramp=(new SplitRamp(this.prefs.neg_color,"#FFFFFF",this.prefs.pos_color,min_value,max_value));var d,s1,e1,s2,e2,value;var scale=function(p){return(p-view_start)*w_scale};ctx.save();ctx.rotate(-45*Math.PI/180);ctx.scale(invsqrt2,invsqrt2);for(var i=0,len=data.length;i<len;i++){d=data[i];s1=scale(d[1]);e1=scale(d[2]);s2=scale(d[4]);e2=scale(d[5]);value=d[6];ctx.fillStyle=(ramp.map_value(value));ctx.fillRect(s1,s2,(e1-s1),(e2-s2))}ctx.restore()};var ReadPainterUtils=function(ctx,row_height,px_per_base,mode){this.ctx=ctx;this.row_height=row_height;this.px_per_base=px_per_base;this.draw_details=(mode==="Pack"||mode==="Auto")&&(px_per_base>=ctx.canvas.manager.char_width_px);this.delete_details_thickness=0.2};_.extend(ReadPainterUtils.prototype,{draw_deletion:function(x,y,len){this.ctx.fillStyle="black";var thickness=(this.draw_details?this.delete_details_thickness:1)*this.row_height;y+=0.5*(this.row_height-thickness);this.ctx.fillRect(x,y,len*this.px_per_base,thickness)}});var VariantPainter=function(data,view_start,view_end,prefs,mode,base_color_fn){Painter.call(this,data,view_start,view_end,prefs,mode);this.base_color_fn=base_color_fn;this.divider_height=1};_.extend(VariantPainter.prototype,Painter.prototype,{get_row_height:function(){var mode=this.mode,height;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT}}return height},get_required_height:function(num_samples){var height=this.prefs.summary_height;if(num_samples>1&&this.prefs.show_sample_data){height+=this.divider_height+num_samples*this.get_row_height()}return height},draw:function(ctx,width,height,w_scale){ctx.save();var get_deletion_info=function(ref,alt){var ref_len=ref.length,alt_len=alt.length,start=0,len=1,is_delete=false;if(alt==="-"){is_delete=true;len=ref.length}else{if(ref.indexOf(alt)===0&&ref_len>alt_len){is_delete=true;len=ref_len=alt_len;start+=alt_len}}return(is_delete?{start:start,len:len}:null)};var locus_data,pos,id,ref,alt,qual,filter,sample_gts,allele_counts,variant,draw_x_start,char_x_start,draw_y_start,genotype,base_px=Math.max(1,Math.floor(w_scale)),num_samples=(this.data.length?this.data[0][7].split(",").length:0),row_height=(this.mode==="Squish"?SQUISH_TRACK_HEIGHT:PACK_TRACK_HEIGHT),feature_height=(w_scale<0.1?row_height:(this.mode==="Squish"?SQUISH_FEATURE_HEIGHT:PACK_FEATURE_HEIGHT)),draw_summary=true,paint_utils=new ReadPainterUtils(ctx,row_height,w_scale,this.mode),j;if(num_samples===1){row_height=feature_height=(w_scale<ctx.canvas.manager.char_width_px?this.prefs.summary_height:row_height);paint_utils.row_height=row_height;draw_summary=false}if(this.prefs.show_sample_data&&draw_summary){ctx.fillStyle="#F3F3F3";ctx.globalAlpha=1;ctx.fillRect(0,this.prefs.summary_height-this.divider_height,width,this.divider_height)}ctx.textAlign="center";for(var i=0;i<this.data.length;i++){locus_data=this.data[i];pos=locus_data[1];ref=locus_data[3];alt=[locus_data[4].split(",")];sample_gts=locus_data[7].split(",");allele_counts=locus_data.slice(8);alt=_.map(_.flatten(alt),function(a){var type,alt_info={},delete_info=get_deletion_info(ref,a);if(delete_info){type="deletion";_.extend(alt_info,delete_info)}else{type="snp"}return _.extend(alt_info,{type:type,value:a,})});if(pos<this.view_start||pos>this.view_end){continue}draw_x_start=Math.floor(Math.max(-0.5*w_scale,(pos-this.view_start-0.5)*w_scale));char_x_start=Math.floor(Math.max(0,(pos-this.view_start)*w_scale));if(draw_summary){ctx.fillStyle="#999999";ctx.globalAlpha=1;ctx.fillRect(draw_x_start,0,base_px,this.prefs.summary_height);draw_y_start=this.prefs.summary_height;for(j=0;j<alt.length;j++){ctx.fillStyle=(alt[j].type==="deletion"?"black":this.base_color_fn(alt[j].value));allele_frac=allele_counts/sample_gts.length;draw_height=Math.ceil(this.prefs.summary_height*allele_frac);ctx.fillRect(draw_x_start,draw_y_start-draw_height,base_px,draw_height);draw_y_start-=draw_height}}if(!this.prefs.show_sample_data){continue}draw_y_start=(draw_summary?this.prefs.summary_height+this.divider_height:0);for(j=0;j<sample_gts.length;j++,draw_y_start+=row_height){genotype=(sample_gts[j]?sample_gts[j].split(/\/|\|/):["0","0"]);variant=null;if(genotype[0]===genotype[1]){if(genotype[0]==="."){}else{if(genotype[0]!=="0"){variant=alt[parseInt(genotype[0],10)-1];ctx.globalAlpha=1}}}else{variant=(genotype[0]!=="0"?genotype[0]:genotype[1]);variant=alt[parseInt(variant,10)-1];ctx.globalAlpha=0.5}if(variant){if(variant.type==="snp"){var snp=variant.value;ctx.fillStyle=this.base_color_fn(snp);if(paint_utils.draw_details){ctx.fillText(snp,char_x_start,draw_y_start+row_height)}else{ctx.fillRect(draw_x_start,draw_y_start+1,base_px,feature_height)}}else{if(variant.type==="deletion"){paint_utils.draw_deletion(draw_x_start+base_px*variant.start,draw_y_start+1,variant.len)}else{}}}}}ctx.restore()}});return{Scaler:Scaler,LinePainter:LinePainter,LinkedFeaturePainter:LinkedFeaturePainter,ReadPainter:ReadPainter,ArcLinkedFeaturePainter:ArcLinkedFeaturePainter,DiagonalHeatmapPainter:DiagonalHeatmapPainter,VariantPainter:VariantPainter}});
\ No newline at end of file
+define(["libs/underscore"],function(_){var BEFORE=1001,CONTAINS=1002,OVERLAP_START=1003,OVERLAP_END=1004,CONTAINED_BY=1005,AFTER=1006;var compute_overlap=function(first_region,second_region){var first_start=first_region[0],first_end=first_region[1],second_start=second_region[0],second_end=second_region[1],overlap;if(first_start<second_start){if(first_end<=second_start){overlap=BEFORE}else{if(first_end<=second_end){overlap=OVERLAP_START}else{overlap=CONTAINS}}}else{if(first_start>second_end){overlap=AFTER}else{if(first_end<=second_end){overlap=CONTAINED_BY}else{overlap=OVERLAP_END}}}return overlap};var is_overlap=function(first_region,second_region){var overlap=compute_overlap(first_region,second_region);return(overlap!==BEFORE&&overlap!==AFTER)};var dashedLine=function(ctx,x1,y1,x2,y2,dashLen){if(dashLen===undefined){dashLen=4}var dX=x2-x1;var dY=y2-y1;var dashes=Math.floor(Math.sqrt(dX*dX+dY*dY)/dashLen);var dashX=dX/dashes;var dashY=dY/dashes;var q;for(q=0;q<dashes;q++,x1+=dashX,y1+=dashY){if(q%2!==0){continue}ctx.fillRect(x1,y1,dashLen,1)}};var drawDownwardEquilateralTriangle=function(ctx,down_vertex_x,down_vertex_y,side_len){var x1=down_vertex_x-side_len/2,x2=down_vertex_x+side_len/2,y=down_vertex_y-Math.sqrt(side_len*3/2);ctx.beginPath();ctx.moveTo(x1,y);ctx.lineTo(x2,y);ctx.lineTo(down_vertex_x,down_vertex_y);ctx.lineTo(x1,y);ctx.strokeStyle=this.fillStyle;ctx.fill();ctx.stroke();ctx.closePath()};var Scaler=function(default_val){this.default_val=(default_val?default_val:1)};Scaler.prototype.gen_val=function(input){return this.default_val};var DrawResults=function(options){this.incomplete_features=options.incomplete_features;this.feature_mapper=options.feature_mapper};var Painter=function(data,view_start,view_end,prefs,mode){this.data=data;this.view_start=view_start;this.view_end=view_end;this.prefs=_.extend({},this.default_prefs,prefs);this.mode=mode};Painter.prototype.default_prefs={};Painter.prototype.draw=function(ctx,width,height,w_scale){};var LinePainter=function(data,view_start,view_end,prefs,mode){Painter.call(this,data,view_start,view_end,prefs,mode);if(this.prefs.min_value===undefined){this.prefs.min_value=_.min(_.map(this.data,function(d){return d[1]}))||0}if(this.prefs.max_value===undefined){this.prefs.max_value=_.max(_.map(this.data,function(d){return d[1]}))||0}};LinePainter.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Histogram",color:"#000",overflow_color:"#F66"};LinePainter.prototype.draw=function(ctx,width,height,w_scale){var in_path=false,min_value=this.prefs.min_value,max_value=this.prefs.max_value,vertical_range=max_value-min_value,height_px=height,view_start=this.view_start,mode=this.mode,data=this.data;ctx.save();var y_zero=Math.round(height+min_value/vertical_range*height);if(mode!=="Intensity"){ctx.fillStyle="#aaa";ctx.fillRect(0,y_zero,width,1)}ctx.beginPath();var x_scaled,y,delta_x_px;if(data.length>1){delta_x_px=Math.ceil((data[1][0]-data[0][0])*w_scale)}else{delta_x_px=10}var painter_color=this.prefs.block_color||this.prefs.color,pref_color=parseInt(painter_color.slice(1),16),pref_r=(pref_color&16711680)>>16,pref_g=(pref_color&65280)>>8,pref_b=pref_color&255,top_overflow=false,bot_overflow=false;for(var i=0,len=data.length;i<len;i++){ctx.fillStyle=ctx.strokeStyle=painter_color;top_overflow=bot_overflow=false;x_scaled=Math.ceil((data[i][0]-view_start)*w_scale);y=data[i][1];if(y===null){if(in_path&&mode==="Filled"){ctx.lineTo(x_scaled,height_px)}in_path=false;continue}if(y<min_value){bot_overflow=true;y=min_value}else{if(y>max_value){top_overflow=true;y=max_value}}if(mode==="Histogram"){y=Math.round(y/vertical_range*height_px);ctx.fillRect(x_scaled,y_zero,delta_x_px,-y)}else{if(mode==="Intensity"){var saturation=(y-min_value)/vertical_range,new_r=Math.round(pref_r+(255-pref_r)*(1-saturation)),new_g=Math.round(pref_g+(255-pref_g)*(1-saturation)),new_b=Math.round(pref_b+(255-pref_b)*(1-saturation));ctx.fillStyle="rgb("+new_r+","+new_g+","+new_b+")";ctx.fillRect(x_scaled,0,delta_x_px,height_px)}else{y=Math.round(height_px-(y-min_value)/vertical_range*height_px);if(in_path){ctx.lineTo(x_scaled,y)}else{in_path=true;if(mode==="Filled"){ctx.moveTo(x_scaled,height_px);ctx.lineTo(x_scaled,y)}else{ctx.moveTo(x_scaled,y)}}}}ctx.fillStyle=this.prefs.overflow_color;if(top_overflow||bot_overflow){var overflow_x;if(mode==="Histogram"||mode==="Intensity"){overflow_x=delta_x_px}else{x_scaled-=2;overflow_x=4}if(top_overflow){ctx.fillRect(x_scaled,0,overflow_x,3)}if(bot_overflow){ctx.fillRect(x_scaled,height_px-3,overflow_x,3)}}ctx.fillStyle=painter_color}if(mode==="Filled"){if(in_path){ctx.lineTo(x_scaled,y_zero);ctx.lineTo(0,y_zero)}ctx.fill()}else{ctx.stroke()}ctx.restore()};var FeaturePositionMapper=function(slot_height){this.feature_positions={};this.slot_height=slot_height;this.translation=0;this.y_translation=0};FeaturePositionMapper.prototype.map_feature_data=function(feature_data,slot,x_start,x_end){if(!this.feature_positions[slot]){this.feature_positions[slot]=[]}this.feature_positions[slot].push({data:feature_data,x_start:x_start,x_end:x_end})};FeaturePositionMapper.prototype.get_feature_data=function(x,y){var slot=Math.floor((y-this.y_translation)/this.slot_height),feature_dict;if(!this.feature_positions[slot]){return null}x+=this.translation;for(var i=0;i<this.feature_positions[slot].length;i++){feature_dict=this.feature_positions[slot][i];if(x>=feature_dict.x_start&&x<=feature_dict.x_end){return feature_dict.data}}};var FeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){Painter.call(this,data,view_start,view_end,prefs,mode);this.alpha_scaler=(alpha_scaler?alpha_scaler:new Scaler());this.height_scaler=(height_scaler?height_scaler:new Scaler());this.max_label_length=200};FeaturePainter.prototype.default_prefs={block_color:"#FFF",connector_color:"#FFF"};_.extend(FeaturePainter.prototype,{get_required_height:function(rows_required,width){var required_height=this.get_row_height(),y_scale=required_height,mode=this.mode;if(mode==="no_detail"||mode==="Squish"||mode==="Pack"){required_height=rows_required*y_scale}return required_height+this.get_top_padding(width)},get_top_padding:function(width){return 0},draw:function(ctx,width,height,w_scale,slots){var data=this.data,view_start=this.view_start,view_end=this.view_end;ctx.save();ctx.fillStyle=this.prefs.block_color;ctx.textAlign="right";var y_scale=this.get_row_height(),feature_mapper=new FeaturePositionMapper(y_scale),x_draw_coords,incomplete_features=[];for(var i=0,len=data.length;i<len;i++){var feature=data[i],feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],slot=(slots&&slots[feature_uid]!==undefined?slots[feature_uid]:null);if((this.mode==="Dense"||slot!==null)&&(feature_start<view_end&&feature_end>view_start)){x_draw_coords=this.draw_element(ctx,this.mode,feature,slot,view_start,view_end,w_scale,y_scale,width);feature_mapper.map_feature_data(feature,slot,x_draw_coords[0],x_draw_coords[1]);if(feature_start<view_start||feature_end>view_end){incomplete_features.push(feature)}}}ctx.restore();feature_mapper.y_translation=this.get_top_padding(width);return new DrawResults({incomplete_features:incomplete_features,feature_mapper:feature_mapper})},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){return[0,0]}});var DENSE_TRACK_HEIGHT=10,NO_DETAIL_TRACK_HEIGHT=3,SQUISH_TRACK_HEIGHT=5,PACK_TRACK_HEIGHT=10,NO_DETAIL_FEATURE_HEIGHT=1,DENSE_FEATURE_HEIGHT=9,SQUISH_FEATURE_HEIGHT=3,PACK_FEATURE_HEIGHT=9,LABEL_SPACING=2,CONNECTOR_COLOR="#ccc";var LinkedFeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){FeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.draw_background_connector=true;this.draw_individual_connectors=false};_.extend(LinkedFeaturePainter.prototype,FeaturePainter.prototype,{get_row_height:function(){var mode=this.mode,height;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="no_detail"){height=NO_DETAIL_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT}}}return height},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){var feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],feature_name=feature[3],feature_strand=feature[4],f_start=Math.floor(Math.max(0,(feature_start-tile_low-0.5)*w_scale)),f_end=Math.ceil(Math.min(width,Math.max(0,(feature_end-tile_low-0.5)*w_scale))),draw_start=f_start,draw_end=f_end,y_start=(mode==="Dense"?0:(0+slot))*y_scale+this.get_top_padding(width),thickness,y_start,thick_start=null,thick_end=null,block_color=(!feature_strand||feature_strand==="+"||feature_strand==="."?this.prefs.block_color:this.prefs.reverse_strand_color);label_color=this.prefs.label_color;ctx.globalAlpha=this.alpha_scaler.gen_val(feature);if(mode==="Dense"){slot=1}if(mode==="no_detail"){ctx.fillStyle=block_color;ctx.fillRect(f_start,y_start+5,f_end-f_start,NO_DETAIL_FEATURE_HEIGHT)}else{var feature_ts=feature[5],feature_te=feature[6],feature_blocks=feature[7],full_height=true;if(feature_ts&&feature_te){thick_start=Math.floor(Math.max(0,(feature_ts-tile_low)*w_scale));thick_end=Math.ceil(Math.min(width,Math.max(0,(feature_te-tile_low)*w_scale)))}var thin_height,thick_height;if(mode==="Squish"){thin_height=1;thick_height=SQUISH_FEATURE_HEIGHT;full_height=false}else{if(mode==="Dense"){thin_height=5;thick_height=DENSE_FEATURE_HEIGHT}else{thin_height=5;thick_height=PACK_FEATURE_HEIGHT}}if(!feature_blocks){ctx.fillStyle=block_color;ctx.fillRect(f_start,y_start+1,f_end-f_start,thick_height);if(feature_strand&&full_height){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand_inv")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand_inv")}}ctx.fillRect(f_start,y_start+1,f_end-f_start,thick_height)}}else{var cur_y_start,cur_height;if(mode==="Squish"||mode==="Dense"){cur_y_start=y_start+Math.floor(SQUISH_FEATURE_HEIGHT/2)+1;cur_height=1}else{if(feature_strand){cur_y_start=y_start;cur_height=thick_height}else{cur_y_start+=(SQUISH_FEATURE_HEIGHT/2)+1;cur_height=1}}if(this.draw_background_connector){if(mode==="Squish"||mode==="Dense"){ctx.fillStyle=CONNECTOR_COLOR}else{if(feature_strand){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand")}}}else{ctx.fillStyle=CONNECTOR_COLOR}}ctx.fillRect(f_start,cur_y_start,f_end-f_start,cur_height)}var start_and_height;for(var k=0,k_len=feature_blocks.length;k<k_len;k++){var block=feature_blocks[k],block_start=Math.floor(Math.max(0,(block[0]-tile_low-0.5)*w_scale)),block_end=Math.ceil(Math.min(width,Math.max((block[1]-tile_low-0.5)*w_scale))),last_block_start,last_block_end;if(block_start>block_end){continue}ctx.fillStyle=block_color;ctx.fillRect(block_start,y_start+(thick_height-thin_height)/2+1,block_end-block_start,thin_height);if(thick_start!==undefined&&feature_te>feature_ts&&!(block_start>thick_end||block_end<thick_start)){var block_thick_start=Math.max(block_start,thick_start),block_thick_end=Math.min(block_end,thick_end);ctx.fillRect(block_thick_start,y_start+1,block_thick_end-block_thick_start,thick_height);if(feature_blocks.length===1&&mode==="Pack"){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand_inv")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand_inv")}}if(block_thick_start+14<block_thick_end){block_thick_start+=2;block_thick_end-=2}ctx.fillRect(block_thick_start,y_start+1,block_thick_end-block_thick_start,thick_height)}}if(this.draw_individual_connectors&&last_block_start){this.draw_connector(ctx,last_block_start,last_block_end,block_start,block_end,y_start)}last_block_start=block_start;last_block_end=block_end}if(mode==="Pack"){ctx.globalAlpha=1;ctx.fillStyle="white";var hscale_factor=this.height_scaler.gen_val(feature),new_height=Math.ceil(thick_height*hscale_factor),ws_height=Math.round((thick_height-new_height)/2);if(hscale_factor!==1){ctx.fillRect(f_start,cur_y_start+1,f_end-f_start,ws_height);ctx.fillRect(f_start,cur_y_start+thick_height-ws_height+1,f_end-f_start,ws_height)}}}ctx.globalAlpha=1;if(feature_name&&mode==="Pack"&&feature_start>tile_low){ctx.fillStyle=label_color;if(tile_low===0&&f_start-ctx.measureText(feature_name).width<0){ctx.textAlign="left";ctx.fillText(feature_name,f_end+LABEL_SPACING,y_start+8,this.max_label_length);draw_end+=ctx.measureText(feature_name).width+LABEL_SPACING}else{ctx.textAlign="right";ctx.fillText(feature_name,f_start-LABEL_SPACING,y_start+8,this.max_label_length);draw_start-=ctx.measureText(feature_name).width+LABEL_SPACING}}}ctx.globalAlpha=1;return[draw_start,draw_end]}});var ReadPainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler,ref_seq,base_color_fn){FeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.ref_seq=(ref_seq?ref_seq.data:null);this.base_color_fn=base_color_fn};_.extend(ReadPainter.prototype,FeaturePainter.prototype,{get_row_height:function(){var height,mode=this.mode;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT;if(this.prefs.show_insertions){height*=2}}}return height},_parse_cigar:function(cigar_str){var cigar_ops="MIDNSHP=X";var blocks=[[0,0]],cur_block=blocks[0],base_pos=0,parsed_cigar=_.map(cigar_str.match(/[0-9]+[MIDNSHP=X]/g),function(op){var op_len=parseInt(op.slice(0,-1),10),op_char=op.slice(-1);if(op_char==="N"){if(cur_block[1]!==0){cur_block=[base_pos+op_len,base_pos+op_len];blocks.push(cur_block)}}else{if("ISHP".indexOf(op_char)===-1){cur_block[1]+=op_len;base_pos+=op_len}}return[cigar_ops.indexOf(op_char),op_len]});return{blocks:blocks,cigar:parsed_cigar}},draw_read:function(ctx,mode,w_scale,y_start,tile_low,tile_high,feature_start,cigar,strand,read_seq){var update_base_offset=function(offset,cig_op,cig_len){if("M=NXD".indexOf(cig_op)!==-1){offset+=cig_len}return offset},update_seq_offset=function(offset,cig_op,cig_len){if("IX".indexOf(cig_op)!==-1){offset+=cig_len}return offset},get_draw_coord=function(sequence_coord){return Math.floor(Math.max(0,(sequence_coord-tile_low-0.5)*w_scale))};ctx.textAlign="center";var tile_region=[tile_low,tile_high],base_offset=0,seq_offset=0,gap=Math.round(w_scale/2),char_width_px=ctx.canvas.manager.char_width_px,block_color=(strand==="+"?this.prefs.detail_block_color:this.prefs.reverse_strand_color),pack_mode=(mode==="Pack"),draw_height=(pack_mode?PACK_FEATURE_HEIGHT:SQUISH_FEATURE_HEIGHT),rect_y=y_start+1,paint_utils=new ReadPainterUtils(ctx,draw_height,w_scale,mode),drawing_blocks=[],s_start,s_end;var draw_last=[];var t=this._parse_cigar(cigar);cigar=t.cigar;drawing_blocks=t.blocks;for(var i=0;i<drawing_blocks.length;i++){var block=drawing_blocks[i];if(is_overlap([feature_start+block[0],feature_start+block[1]],tile_region)){s_start=get_draw_coord(feature_start+block[0]);s_end=get_draw_coord(feature_start+block[1]);if(s_start===s_end){s_end+=1}ctx.fillStyle=block_color;ctx.fillRect(s_start,rect_y,s_end-s_start,draw_height)}}for(var cig_id=0,len=cigar.length;cig_id<len;cig_id++){var cig=cigar[cig_id],cig_op="MIDNSHP=X"[cig[0]],cig_len=cig[1];var seq_start=feature_start+base_offset;s_start=get_draw_coord(seq_start);s_end=get_draw_coord(seq_start+cig_len);if(!is_overlap([seq_start,seq_start+cig_len],tile_region)){base_offset=update_base_offset(base_offset,cig_op,cig_len);seq_offset=update_seq_offset(seq_offset,cig_op,cig_len);continue}if(s_start===s_end){s_end+=1}switch(cig_op){case"H":case"S":case"P":break;case"M":base_offset+=cig_len;break;case"=":case"X":var cur_seq="";if(cig_op==="X"){cur_seq=read_seq.slice(seq_offset,seq_offset+cig_len)}else{if(this.ref_seq){cur_seq=this.ref_seq.slice(Math.max(0,seq_start-tile_low),Math.min(seq_start-tile_low+cig_len,tile_high-tile_low))}}var start_pos=Math.max(seq_start,tile_low);for(var c=0;c<cur_seq.length;c++){if(cur_seq&&!this.prefs.show_differences||cig_op==="X"){var c_start=Math.floor(Math.max(0,(start_pos+c-tile_low)*w_scale));ctx.fillStyle=this.base_color_fn(cur_seq[c]);if(pack_mode&&w_scale>char_width_px){ctx.fillText(cur_seq[c],c_start,y_start+9)}else{if(w_scale>0.05){ctx.fillRect(c_start-gap,rect_y,Math.max(1,Math.round(w_scale)),draw_height)}}}}if(cig_op==="X"){seq_offset+=cig_len}base_offset+=cig_len;break;case"N":ctx.fillStyle=CONNECTOR_COLOR;ctx.fillRect(s_start,y_start+5,s_end-s_start,1);base_offset+=cig_len;break;case"D":paint_utils.draw_deletion(s_start,rect_y,cig_len);base_offset+=cig_len;break;case"I":var insert_x_coord=s_start-gap;if(is_overlap([seq_start,seq_start+cig_len],tile_region)){var seq=read_seq.slice(seq_offset,seq_offset+cig_len);if(this.prefs.show_insertions){var x_center=s_start-(s_end-s_start)/2;if((mode==="Pack"||this.mode==="Auto")&&read_seq!==undefined&&w_scale>char_width_px){ctx.fillStyle="yellow";ctx.fillRect(x_center-gap,y_start-9,s_end-s_start,9);draw_last[draw_last.length]={type:"triangle",data:[insert_x_coord,y_start+4,5]};ctx.fillStyle=CONNECTOR_COLOR;switch(compute_overlap([seq_start,seq_start+cig_len],tile_region)){case (OVERLAP_START):seq=seq.slice(tile_low-seq_start);break;case (OVERLAP_END):seq=seq.slice(0,seq_start-tile_high);break;case (CONTAINED_BY):break;case (CONTAINS):seq=seq.slice(tile_low-seq_start,seq_start-tile_high);break}for(var c=0,str_len=seq.length;c<str_len;c++){var c_start=Math.floor(Math.max(0,(seq_start+c-tile_low)*w_scale));ctx.fillText(seq[c],c_start-(s_end-s_start)/2,y_start)}}else{ctx.fillStyle="yellow";ctx.fillRect(x_center,y_start+(this.mode!=="Dense"?2:5),s_end-s_start,(mode!=="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}else{if((mode==="Pack"||this.mode==="Auto")&&read_seq!==undefined&&w_scale>char_width_px){draw_last.push({type:"text",data:[seq.length,insert_x_coord,y_start+9]})}else{}}}seq_offset+=cig_len;break}}ctx.fillStyle="yellow";var item,type,data;for(var i=0;i<draw_last.length;i++){item=draw_last[i];type=item.type;data=item.data;if(type==="text"){ctx.save();ctx.font="bold "+ctx.font;ctx.fillText(data[0],data[1],data[2]);ctx.restore()}else{if(type==="triangle"){drawDownwardEquilateralTriangle(ctx,data[0],data[1],data[2])}}}},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){var feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],feature_name=feature[3],f_start=Math.floor(Math.max(-0.5*w_scale,(feature_start-tile_low-0.5)*w_scale)),f_end=Math.ceil(Math.min(width,Math.max(0,(feature_end-tile_low-0.5)*w_scale))),y_start=(mode==="Dense"?0:(0+slot))*y_scale,label_color=this.prefs.label_color;if(feature[5] instanceof Array){var connector=true;if(feature[4][1]>=tile_low&&feature[4][0]<=tile_high&&feature[4][2]){this.draw_read(ctx,mode,w_scale,y_start,tile_low,tile_high,feature[4][0],feature[4][2],feature[4][3],feature[4][4])}else{connector=false}if(feature[5][1]>=tile_low&&feature[5][0]<=tile_high&&feature[5][2]){this.draw_read(ctx,mode,w_scale,y_start,tile_low,tile_high,feature[5][0],feature[5][2],feature[5][3],feature[5][4])}else{connector=false}var b1_end=Math.ceil(Math.min(width,Math.max(-0.5*w_scale,(feature[4][1]-tile_low-0.5)*w_scale))),b2_start=Math.floor(Math.max(-0.5*w_scale,(feature[5][0]-tile_low-0.5)*w_scale));if(connector&&b2_start>b1_end){ctx.fillStyle=CONNECTOR_COLOR;dashedLine(ctx,b1_end,y_start+5,b2_start,y_start+5)}}else{this.draw_read(ctx,mode,w_scale,y_start,tile_low,tile_high,feature_start,feature[4],feature[5],feature[6])}if(mode==="Pack"&&feature_start>=tile_low&&feature_name!=="."){ctx.fillStyle=this.prefs.label_color;if(tile_low===0&&f_start-ctx.measureText(feature_name).width<0){ctx.textAlign="left";ctx.fillText(feature_name,f_end+LABEL_SPACING,y_start+9,this.max_label_length)}else{ctx.textAlign="right";ctx.fillText(feature_name,f_start-LABEL_SPACING,y_start+9,this.max_label_length)}}return[0,0]}});var ArcLinkedFeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){LinkedFeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.longest_feature_length=this.calculate_longest_feature_length();this.draw_background_connector=false;this.draw_individual_connectors=true};_.extend(ArcLinkedFeaturePainter.prototype,FeaturePainter.prototype,LinkedFeaturePainter.prototype,{calculate_longest_feature_length:function(){var longest_feature_length=0;for(var i=0,len=this.data.length;i<len;i++){var feature=this.data[i],feature_start=feature[1],feature_end=feature[2];longest_feature_length=Math.max(longest_feature_length,feature_end-feature_start)}return longest_feature_length},get_top_padding:function(width){var view_range=this.view_end-this.view_start,w_scale=width/view_range;return Math.min(128,Math.ceil((this.longest_feature_length/2)*w_scale))},draw_connector:function(ctx,block1_start,block1_end,block2_start,block2_end,y_start){var x_center=(block1_end+block2_start)/2,radius=block2_start-x_center;var angle1=Math.PI,angle2=0;if(radius>0){ctx.beginPath();ctx.arc(x_center,y_start,block2_start-x_center,Math.PI,0);ctx.stroke()}}});var Color=function(rgb,a){if(Array.isArray(rgb)){this.rgb=rgb}else{if(rgb.length==6){this.rgb=rgb.match(/.{2}/g).map(function(c){return parseInt(c,16)})}else{if(rgb.length==7){this.rgb=rgb.substring(1,7).match(/.{2}/g).map(function(c){return parseInt(c,16)})}else{this.rgb=rgb.split("").map(function(c){return parseInt(c+c,16)})}}}this.alpha=typeof(a)==="number"?a:1};Color.prototype={eval:function(){return this},toCSS:function(){if(this.alpha<1){return"rgba("+this.rgb.map(function(c){return Math.round(c)}).concat(this.alpha).join(", ")+")"}else{return"#"+this.rgb.map(function(i){i=Math.round(i);i=(i>255?255:(i<0?0:i)).toString(16);return i.length===1?"0"+i:i}).join("")}},toHSL:function(){var r=this.rgb[0]/255,g=this.rgb[1]/255,b=this.rgb[2]/255,a=this.alpha;var max=Math.max(r,g,b),min=Math.min(r,g,b);var h,s,l=(max+min)/2,d=max-min;if(max===min){h=s=0}else{s=l>0.5?d/(2-max-min):d/(max+min);switch(max){case r:h=(g-b)/d+(g<b?6:0);break;case g:h=(b-r)/d+2;break;case b:h=(r-g)/d+4;break}h/=6}return{h:h*360,s:s,l:l,a:a}},toARGB:function(){var argb=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+argb.map(function(i){i=Math.round(i);i=(i>255?255:(i<0?0:i)).toString(16);return i.length===1?"0"+i:i}).join("")},mix:function(color2,weight){color1=this;var p=weight;var w=p*2-1;var a=color1.toHSL().a-color2.toHSL().a;var w1=(((w*a==-1)?w:(w+a)/(1+w*a))+1)/2;var w2=1-w1;var rgb=[color1.rgb[0]*w1+color2.rgb[0]*w2,color1.rgb[1]*w1+color2.rgb[1]*w2,color1.rgb[2]*w1+color2.rgb[2]*w2];var alpha=color1.alpha*p+color2.alpha*(1-p);return new Color(rgb,alpha)}};var LinearRamp=function(start_color,end_color,start_value,end_value){this.start_color=new Color(start_color);this.end_color=new Color(end_color);this.start_value=start_value;this.end_value=end_value;this.value_range=end_value-start_value};LinearRamp.prototype.map_value=function(value){value=Math.max(value,this.start_value);value=Math.min(value,this.end_value);value=(value-this.start_value)/this.value_range;return this.start_color.mix(this.end_color,1-value).toCSS()};var SplitRamp=function(start_color,middle_color,end_color,start_value,end_value){this.positive_ramp=new LinearRamp(middle_color,end_color,0,end_value);this.negative_ramp=new LinearRamp(middle_color,start_color,0,-start_value);this.start_value=start_value;this.end_value=end_value};SplitRamp.prototype.map_value=function(value){value=Math.max(value,this.start_value);value=Math.min(value,this.end_value);if(value>=0){return this.positive_ramp.map_value(value)}else{return this.negative_ramp.map_value(-value)}};var DiagonalHeatmapPainter=function(data,view_start,view_end,prefs,mode){Painter.call(this,data,view_start,view_end,prefs,mode);var i,len;if(this.prefs.min_value===undefined){var min_value=Infinity;for(i=0,len=this.data.length;i<len;i++){min_value=Math.min(min_value,this.data[i][5])}this.prefs.min_value=min_value}if(this.prefs.max_value===undefined){var max_value=-Infinity;for(i=0,len=this.data.length;i<len;i++){max_value=Math.max(max_value,this.data[i][5])}this.prefs.max_value=max_value}};DiagonalHeatmapPainter.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Heatmap",pos_color:"#FF8C00",neg_color:"#4169E1"};DiagonalHeatmapPainter.prototype.draw=function(ctx,width,height,w_scale){var min_value=this.prefs.min_value,max_value=this.prefs.max_value,value_range=max_value-min_value,height_px=height,view_start=this.view_start,mode=this.mode,data=this.data,invsqrt2=1/Math.sqrt(2);var ramp=(new SplitRamp(this.prefs.neg_color,"#FFFFFF",this.prefs.pos_color,min_value,max_value));var d,s1,e1,s2,e2,value;var scale=function(p){return(p-view_start)*w_scale};ctx.save();ctx.rotate(-45*Math.PI/180);ctx.scale(invsqrt2,invsqrt2);for(var i=0,len=data.length;i<len;i++){d=data[i];s1=scale(d[1]);e1=scale(d[2]);s2=scale(d[4]);e2=scale(d[5]);value=d[6];ctx.fillStyle=(ramp.map_value(value));ctx.fillRect(s1,s2,(e1-s1),(e2-s2))}ctx.restore()};var ReadPainterUtils=function(ctx,row_height,px_per_base,mode){this.ctx=ctx;this.row_height=row_height;this.px_per_base=px_per_base;this.draw_details=(mode==="Pack"||mode==="Auto")&&(px_per_base>=ctx.canvas.manager.char_width_px);this.delete_details_thickness=0.2};_.extend(ReadPainterUtils.prototype,{draw_deletion:function(x,y,len){this.ctx.fillStyle="black";var thickness=(this.draw_details?this.delete_details_thickness:1)*this.row_height;y+=0.5*(this.row_height-thickness);this.ctx.fillRect(x,y,len*this.px_per_base,thickness)}});var VariantPainter=function(data,view_start,view_end,prefs,mode,base_color_fn){Painter.call(this,data,view_start,view_end,prefs,mode);this.base_color_fn=base_color_fn;this.divider_height=1};_.extend(VariantPainter.prototype,Painter.prototype,{get_row_height:function(){var mode=this.mode,height;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT}}return height},get_required_height:function(num_samples){var height=this.prefs.summary_height;if(num_samples>1&&this.prefs.show_sample_data){height+=this.divider_height+num_samples*this.get_row_height()}return height},draw:function(ctx,width,height,w_scale){ctx.save();var get_deletion_info=function(ref,alt){var ref_len=ref.length,alt_len=alt.length,start=0,len=1,is_delete=false;if(alt==="-"){is_delete=true;len=ref.length}else{if(ref.indexOf(alt)===0&&ref_len>alt_len){is_delete=true;len=ref_len=alt_len;start+=alt_len}}return(is_delete?{start:start,len:len}:null)};var locus_data,pos,id,ref,alt,qual,filter,sample_gts,allele_counts,variant,draw_x_start,char_x_start,draw_y_start,genotype,base_px=Math.max(1,Math.floor(w_scale)),num_samples=(this.data.length?this.data[0][7].split(",").length:0),row_height=(this.mode==="Squish"?SQUISH_TRACK_HEIGHT:PACK_TRACK_HEIGHT),feature_height=(w_scale<0.1?row_height:(this.mode==="Squish"?SQUISH_FEATURE_HEIGHT:PACK_FEATURE_HEIGHT)),draw_summary=true,paint_utils=new ReadPainterUtils(ctx,row_height,w_scale,this.mode),j;if(num_samples===1){row_height=feature_height=(w_scale<ctx.canvas.manager.char_width_px?this.prefs.summary_height:row_height);paint_utils.row_height=row_height;draw_summary=false}if(this.prefs.show_sample_data&&draw_summary){ctx.fillStyle="#F3F3F3";ctx.globalAlpha=1;ctx.fillRect(0,this.prefs.summary_height-this.divider_height,width,this.divider_height)}ctx.textAlign="center";for(var i=0;i<this.data.length;i++){locus_data=this.data[i];pos=locus_data[1];ref=locus_data[3];alt=[locus_data[4].split(",")];sample_gts=locus_data[7].split(",");allele_counts=locus_data.slice(8);alt=_.map(_.flatten(alt),function(a){var type,alt_info={},delete_info=get_deletion_info(ref,a);if(delete_info){type="deletion";_.extend(alt_info,delete_info)}else{type="snp"}return _.extend(alt_info,{type:type,value:a,})});if(pos<this.view_start||pos>this.view_end){continue}draw_x_start=Math.floor(Math.max(-0.5*w_scale,(pos-this.view_start-0.5)*w_scale));char_x_start=Math.floor(Math.max(0,(pos-this.view_start)*w_scale));if(draw_summary){ctx.fillStyle="#999999";ctx.globalAlpha=1;ctx.fillRect(draw_x_start,0,base_px,this.prefs.summary_height);draw_y_start=this.prefs.summary_height;for(j=0;j<alt.length;j++){ctx.fillStyle=(alt[j].type==="deletion"?"black":this.base_color_fn(alt[j].value));allele_frac=allele_counts/sample_gts.length;draw_height=Math.ceil(this.prefs.summary_height*allele_frac);ctx.fillRect(draw_x_start,draw_y_start-draw_height,base_px,draw_height);draw_y_start-=draw_height}}if(!this.prefs.show_sample_data){continue}draw_y_start=(draw_summary?this.prefs.summary_height+this.divider_height:0);for(j=0;j<sample_gts.length;j++,draw_y_start+=row_height){genotype=(sample_gts[j]?sample_gts[j].split(/\/|\|/):["0","0"]);variant=null;if(genotype[0]===genotype[1]){if(genotype[0]==="."){}else{if(genotype[0]!=="0"){variant=alt[parseInt(genotype[0],10)-1];ctx.globalAlpha=1}}}else{variant=(genotype[0]!=="0"?genotype[0]:genotype[1]);variant=alt[parseInt(variant,10)-1];ctx.globalAlpha=0.5}if(variant){if(variant.type==="snp"){var snp=variant.value;ctx.fillStyle=this.base_color_fn(snp);if(paint_utils.draw_details){ctx.fillText(snp,char_x_start,draw_y_start+row_height)}else{ctx.fillRect(draw_x_start,draw_y_start+1,base_px,feature_height)}}else{if(variant.type==="deletion"){paint_utils.draw_deletion(draw_x_start+base_px*variant.start,draw_y_start+1,variant.len)}else{}}}}}ctx.restore()}});return{Scaler:Scaler,LinePainter:LinePainter,LinkedFeaturePainter:LinkedFeaturePainter,ReadPainter:ReadPainter,ArcLinkedFeaturePainter:ArcLinkedFeaturePainter,DiagonalHeatmapPainter:DiagonalHeatmapPainter,VariantPainter:VariantPainter}});
\ No newline at end of file
diff -r 2438770e2cfbf804acc0d5c7b2f3d6e491f30695 -r 7ac5a36c0ce7a6eb280d339de2107740552825ce static/scripts/viz/trackster/painters.js
--- a/static/scripts/viz/trackster/painters.js
+++ b/static/scripts/viz/trackster/painters.js
@@ -196,7 +196,7 @@
ctx.fillStyle = ctx.strokeStyle = painter_color;
top_overflow = bot_overflow = false;
- x_scaled = Math.round((data[i][0] - view_start) * w_scale);
+ x_scaled = Math.ceil((data[i][0] - view_start) * w_scale);
y = data[i][1];
// Process Y (scaler) value.
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0