Source code for sevenbridges.models.marker

import logging

from sevenbridges.decorators import inplace_reload
from sevenbridges.errors import ResourceNotModified
from sevenbridges.meta.fields import (
    HrefField, StringField, CompoundField, DateTimeField
)
from sevenbridges.meta.resource import Resource
from sevenbridges.meta.transformer import Transform
from sevenbridges.models.compound.markers.position import MarkerPosition

logger = logging.getLogger(__name__)


[docs]class Marker(Resource): _URL = { 'query': '/genome/markers', 'get': '/genome/markers/{id}', 'delete': '/genome/markers/{id}' } href = HrefField(read_only=True) id = StringField(read_only=True) file = StringField(read_only=True) name = StringField(read_only=False) chromosome = StringField(read_only=False) position = CompoundField(MarkerPosition, read_only=False) created_time = DateTimeField(read_only=True) created_by = StringField(read_only=True) def __str__(self): return f'<Marker: id={self.id}>' def __eq__(self, other): if type(other) is not type(self): return False return self is other or self.id == other.id
[docs] @classmethod def query(cls, file, offset=None, limit=None, api=None): """ Queries genome markers on a file. :param file: Genome file - Usually bam file. :param offset: Pagination offset. :param limit: Pagination limit. :param api: Api instance. :return: Collection object. """ api = api if api else cls._API file = Transform.to_file(file) return super()._query( url=cls._URL['query'], offset=offset, limit=limit, file=file, fields='_all', api=api )
[docs] @classmethod def create(cls, file, name, position, chromosome, private=True, api=None): """ Create a marker on a file. :param file: File object or identifier. :param name: Marker name. :param position: Marker position object. :param chromosome: Chromosome number. :param private: Whether the marker is private or public. :param api: Api instance. :return: Marker object. """ api = api if api else cls._API file = Transform.to_file(file) data = { 'file': file, 'name': name, 'position': position, 'chromosome': chromosome, 'private': private } extra = { 'resource': cls.__name__, 'query': data } logger.info('Creating marker', extra=extra) marker_data = api.post(url=cls._URL['query'], data=data).json() return Marker(api=api, **marker_data)
@inplace_reload def save(self, inplace=True): """ Saves all modification to the marker on the server. :param inplace Apply edits on the current instance or get a new one. :return: Marker instance. """ modified_data = self._modified_data() if modified_data: extra = { 'resource': type(self).__name__, 'query': { 'id': self.id, 'modified_data': modified_data } } logger.info('Saving marker', extra=extra) data = self._api.patch(url=self._URL['get'].format(id=self.id), data=modified_data).json() marker = Marker(api=self._api, **data) return marker else: raise ResourceNotModified()