Skip to content
Snippets Groups Projects
Select Git revision
  • 8b67744f49f47a0438e7923b6ba238a47da073c2
  • master default protected
  • develop protected
  • cmake_boost_refactor
  • ubuntu_ci
  • mmtf
  • non-orthogonal-maps
  • no_boost_filesystem
  • data_viewer
  • 2.11.1
  • 2.11.0
  • 2.10.0
  • 2.9.3
  • 2.9.2
  • 2.9.1
  • 2.9.0
  • 2.8.0
  • 2.7.0
  • 2.6.1
  • 2.6.0
  • 2.6.0-rc4
  • 2.6.0-rc3
  • 2.6.0-rc2
  • 2.6.0-rc
  • 2.5.0
  • 2.5.0-rc2
  • 2.5.0-rc
  • 2.4.0
  • 2.4.0-rc2
29 results

file_loader.cc

Blame
  • remote.py 3.58 KiB
    #------------------------------------------------------------------------------
    # This file is part of the OpenStructure project <www.openstructure.org>
    #
    # Copyright (C) 2008-2011 by the OpenStructure authors
    #
    # This library is free software; you can redistribute it and/or modify it under
    # the terms of the GNU Lesser General Public License as published by the Free
    # Software Foundation; either version 3.0 of the License, or (at your option)
    # any later version.
    # This library is distributed in the hope that it will be useful, but WITHOUT
    # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
    # details.
    #
    # You should have received a copy of the GNU Lesser General Public License
    # along with this library; if not, write to the Free Software Foundation, Inc.,
    # 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
    #------------------------------------------------------------------------------
    
    import urllib2
    import tempfile
    
    from ost.io import LoadPDB, LoadMMCIF
    
    class RemoteRepository:
      """
      A remote repository represents a structural database accessible through the 
      internet, e.g. the PDB or SWISS-MODEL template library.
      """
      def __init__(self, name, url_pattern, type, id_transform='upper'):
        self.name = name
        self.url_pattern = url_pattern
        self.type = type
        if type not in ('cif', 'pdb'):
          raise ValueError('only cif and pdb types are supported')
        self.id_transform = id_transform
    
      def URLForID(self, id):
        if self.id_transform == 'upper':
          id = id.upper()
        if self.id_transform == 'lower':
          id = id.lower()
        return self.url_pattern.replace('$ID', id)
    
      def Get(self, id):
        remote_url = self.URLForID(id)
        tmp_file_suffix = '.%s' % self.type
        if remote_url.endswith('.gz'):
          tmp_file_suffix+='.gz'
    
        try:
          connection = urllib2.urlopen(remote_url)
          if hasattr(connection, 'code'):
            status = connection.code
          else:
            status = connection.getcode()
        except urllib2.HTTPError, e:
          status = e.code
        if status != 200:
          raise IOError('Could not load %s from %s (status code %d, url %s)' \
                        % (id, self.name, status, remote_url))
        tmp_file = tempfile.NamedTemporaryFile(suffix=tmp_file_suffix)
        contents = ''.join(connection)
        tmp_file.write(contents)
        tmp_file.flush()
        return tmp_file
    
      def Load(self, id):
        tmp_file = self.Get(id)
        if self.type == 'pdb':
          return LoadPDB(tmp_file.name)
        if self.type == 'cif':
          return LoadMMCIF(tmp_file.name)
    
    REMOTE_REPOSITORIES = {
        'pdb' : RemoteRepository('pdb.org (PDB)', 'http://www.pdb.org/pdb/files/$ID.pdb.gz',
                       type='pdb', id_transform='upper'),
        'smtl' : RemoteRepository('SMTL', 'http://swissmodel.expasy.org/templates/$ID.pdb',
                       type='pdb', id_transform='lower'),
        'cif' : RemoteRepository('pdb.org (mmCIF)', 'http://www.pdb.org/pdb/files/$ID.cif.gz',
                       type='cif', id_transform='lower'),
        'pdb_redo' : RemoteRepository('pdbredo', 'http://pdb-redo.eu/db/$ID/$ID_besttls.pdb.gz',
                       type='pdb', id_transform='lower'),
    }
    
    def RemoteGet(id, from_repo='pdb'):
      remote_repo = REMOTE_REPOSITORIES.get(from_repo, None) 
      if not remote_repo:
        raise ValueError('%s is not a valid repository' % from_repo)
      return remote_repo.Get(id)
    
    def RemoteLoad(id, from_repo='pdb'):
      remote_repo = REMOTE_REPOSITORIES.get(from_repo, None) 
      if not remote_repo:
        raise ValueError('%s is not a valid repository' % from_repo)
      return remote_repo.Load(id)