Rosetta
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Region.py
Go to the documentation of this file.
1 #!/usr/bin/python
2 # (c) Copyright Rosetta Commons Member Institutions.
3 # (c) This file is part of the Rosetta software suite and is made available under license.
4 # (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
5 # (c) For more information, see http://www.rosettacommons.org. Questions about this can be
6 # (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
7 
8 ## @file /GUIs/pyrosetta_toolkit/modules/Region.py
9 ## @brief This class will eventually replace the loop_string and loops_as_strings region selection of the GUI.
10 ## @author Jared Adolf-Bryfogle (jadolfbr@gmail.com)
11 
12 #Rosetta Imports
13 from rosetta import *
16 
17 #Python Imports
18 import re
19 
20 class Region:
21  """
22  This is a PDB numbering based region class. Its primary purpose is to make dealing with regions/selections through the GUI and code more intuitive.
23  It will eventually replace the loop_string in loops_as_strings in the main GUIinput class.
24  Region is inclusive - Though, Lets think about this.
25  Might eventually make it's way into C++ Rosetta in a similar form.
26  """
27 
28  def __init__(self, chain, start=None, end=None):
29  """
30  What you give determines the region_type.
31  Give only a chain, and the region is a chain.
32  Give chain and start, and the region is a C-Terminal tail
33  Give chain and end, and the region is a N-Terminal tail
34  These designations are mainly for cutpoint + Foldtree related things.
35  **Please use self.check_if_region_exists(pose) before using the region.
36  """
37 
38  assert type(chain) == str
39  if type(start)== str:
40  start = int(start)
41 
42  if type(end) == str:
43  end = int(end)
44 
45  self.start = start
46  self.end = end
47  self.chain = chain
48 
49  if not self.start and not self.end:
50  self.region = ":"+":"+chain.upper()
51  elif not self.start:
52  self.region = ":"+repr(end)+":"+chain.upper()
53  elif not self.end:
54  self.region = repr(start)+":"+":"+chain.upper()
55  else:
56  self.region = repr(start)+":"+repr(end)+":"+chain.upper()
57 
58  def __str__(self):
59  return self.region
60 
61  def region_exists(self, pose):
62  """
63  Checks if the region exists for the given Pose.
64  Returns True or False
65  """
66  if not rosetta.core.pose.has_chain(self.chain, pose):
67  print "Chain not found in PDB"
68  return False
69 
70  try:
71  self.get_rosetta_start(pose)
72  self.get_rosetta_end(pose)
73  except PyRosettaException:
74  return False
75 
76  return True
77 
78  def set_Loop_for_region(self, pose, cutpoint):
79  #if not self.get_region_type()=='loop':
80  #return
81  self.loop = Loop(self.get_rosetta_start(pose), self.get_rosetta_end(pose), cutpoint)
82 
83  def get_loop(self):
84  if not self.loop: return
85  return self.loop
86 
87  def get_movemap(self, pose):
88  movemap = MoveMap()
89  for i in range(self.get_rosetta_start(pose), self.get_rosetta_end(pose)+1):
90  movemap.set_bb(i, True)
91  movemap.set_chi(i, True)
92  return movemap
93 
94  def get_region(self):
95  """
96  Gets the region string.
97  """
98  return self.region
99 
100  def get_region_string(self):
101  """
102  Redundant. Gets region string.
103  """
104  return self.region
105 
107  """
108  Returns the loops string with full residue numbers instead of blank ::
109  """
110  s = repr(self.get_pdb_start(pose))+":"+repr(self.get_pdb_end(pose))+":"+self.get_chain()
111  return s
112 
113  def get_region_type(self):
114  if not self.start and not self.end:
115  return "chain"
116  elif not self.start:
117  return 'nter'
118  elif not self.end:
119  return 'cter'
120  elif self.start == self.end:
121  return 'residue'
122  else:
123  return 'loop'
124 
125  #Main Getters - These will be blank depending on region type.
126  def get_start(self):
127  return self.start
128  def get_end(self):
129  return self.end
130  def get_chain(self):
131  return self.chain
132 
133  #Rosetta Getters
134  def get_rosetta_start(self, pose):
135 
136  if ((self.get_region_type()=='nter') or (self.get_region_type()=='chain')):
137  #First residue of the chain - Would be useful to have pdb_info() be able to return this.
138  for resnum in range(1, pose.total_residue()+1):
139  chain = pose.pdb_info().chain(resnum)
140  if chain == self.chain:
141  return resnum
142  else:
143  continue
144  else:
145  return pose.pdb_info().pdb2pose(self.chain, self.start)
146 
147 
148  def get_rosetta_end(self, pose):
149 
150  if (self.get_region_type()=='cter') or (self.get_region_type()=='chain'):
151  #Last residue of the chain - Would be useful to have pdb_info() be able to return this.
152  resnum = pose.total_residue()
153  while resnum !=1:
154  chain = pose.pdb_info().chain(resnum)
155  #print repr(resnum); print chain; print "Should Be: "+self.chain
156  if chain == self.chain:
157  return resnum
158  else:
159  resnum-=1
160  continue
161  else:
162  return pose.pdb_info().pdb2pose(self.chain, self.end)
163 
164  def get_pdb_start(self, pose):
165 
166  return pose.pdb_info().number(self.get_rosetta_start(pose))
167 
168  def get_pdb_end(self, pose):
169 
170  return pose.pdb_info().number(self.get_rosetta_end(pose))
171 
172  #Useful functions
173  def get_length(self, pose):
174  return self.get_rosetta_end(pose)-self.get_rosetta_start(pose)+1
175 
176  def get_sequence(self, pose):
177  if self.get_region_type()=='chain':
178  c = rosetta.core.pose.get_chain_id_from_chain(self.chain, pose)
179  return pose.chain_sequence(c)
180  else:
181  sequence = pose.sequence()
182  return sequence[self.get_rosetta_start(pose)-1:self.get_rosetta_end(pose)]
183 
184 class Regions:
185  """
186  This class is analogous to the Loops class in Rosetta.
187  Iterable.
188  Like the Region class, may eventually be ported to C++.
189  """
190 
191  def __init__(self):
192  self.regions = []
193  self.current = 0
194 
195  def __str__(self):
196  loops = ""
197  for region in self.regions:
198  loops = loops+" "+str(region)
199  return loops
200 
201  def __iter__(self):
202  return self
203 
204  def __len__(self):
205  return len(self.regions)
206 
207  def __nonzero__(self):
208  if len(self.regions)>0:
209  return True
210  else:
211  return False
212 
213 
214 
215  def next(self):
216  if self.current >= len(self.regions):
217  self.current = 0
218  raise StopIteration
219  else:
220  region = self.regions[self.current]
221  self.current+=1
222  return region
223 
224  def iterkeys(self):
225  return self
226 
227  def add_region(self, region_object):
228  self.regions.append(region_object)
229 
230  def remove_region(self, region_string):
231  regions = self.regions
232  for region in regions:
233  if region.get_region()==region_string:
234  self.regions.remove(region)
235  break
236 
237  def get_regions(self):
238  return self.regions
239 
240  def get_num_regions(self):
241  return len(self.regions)
242 
243  def get_regions_of_type(self, type):
244  regions = []
245  for region in self.regions:
246  if region.get_region_type()==type:
247  regions.append(region)
248  return regions
249 
250  def get_regions_of_types(self, array_of_types):
251  regions = []
252  if len(array_of_types)>1:
253  for type in array_of_types:
254  for region in self.regions:
255  if region.get_region_type()==type:
256  regions.append()
257  return regions
258  else:
259  return self.get_regions_of_type(array_of_types[0])
260 
261  def get_regions_of_chain(self, chain):
262  regions = []
263  for region in self.regions:
264  if region.get_chain()==chain:
265  regions.append(region)
266  return regions
267 
268  def get_cter_regions(self):
269  return self.get_regions_of_type('cter')
270  def get_nter_regions(self):
271  return self.get_regions_of_type('nter')
273  return self.get_regions_of_type('residue')
274  def get_chain_regions(self):
275  return self.get_regions_of_type('chain')
276  def get_loop_regions(self):
277  return self.get_regions_of_type('loop')
278 
279  def get_movemap(self, pose, include_only_regions=False):
280  """
281  Create a movemap where bb and sc are on from the regions in the region object.
282  """
283  regions = self.regions
284  movemap = MoveMap()
285 
286  if not self.regions:
287  for i in range(1, pose.total_residue()+1):
288  movemap.set_bb(i, True)
289  movemap.set_chi(i, True)
290  return movemap
291 
292  if include_only_regions:
293  regions = self.get_regions_of_types(include_only_regions)
294 
295  for region in regions:
296  #print region.get_region()
297  start = region.get_rosetta_start(pose)
298  end = region.get_rosetta_end(pose)
299  for i in range(start, end+1):
300  movemap.set_bb(i, True)
301  movemap.set_chi(i, True)
302  return movemap
303 
304  def get_packer_task(self, pose, include_only_regions = False):
305  """
306  Create a packer task for repacking.
307  """
308  regions = self.regions
309  packer_task=standard_packer_task(pose)
310  packer_task.restrict_to_repacking()
311 
312 
313  if self.regions:
314  packer_task.temporarily_fix_everything()
315  else:
316  return packer_task
317 
318  if include_only_regions:
319  regions = self.get_regions_of_types(include_only_regions)
320 
321  for region in regions:
322 
323 
324  start = region.get_rosetta_start(pose)
325  end = region.get_rosetta_end(pose)
326  print "Rosetta start: "+repr(start)
327  print "Rosetta end: "+repr(end)
328  for i in range(start, end+1):
329  packer_task.temporarily_set_pack_residue(i, True)
330  print packer_task
331  return packer_task
332 
333  def get_basic_tf(self, pose):
334  """
335  Returns a basic tf - no design, no neighbors. Only regions set.
336  """
337  regions = self.regions
338  tf = TaskFactory()
339  tf.push_back(InitializeFromCommandline())
340 
341  tf.push_back(RestrictToRepacking())
342  mmop = RestrictToMoveMapChiOperation(self.get_movemap(pose))
343  tf.push_back(mmop)
344  return tf
345 
346  #Loop/Region integration:
348  """
349  Must have used set_Loop_for_region for the Region object to use.
350  """
351  loops = Loops()
352  for region in self.regions:
353  if region.loop:
354  loops.add_loop(region.get_loop())
355  return loops
356 
Fstring::size_type len(Fstring const &s)
Length.
Definition: Fstring.hh:2207
def standard_packer_task
Definition: __init__.py:537