Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
RotamerDumpMover.cc
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file protocols/RotamerDump/RotamerDumpMover.cc
11 /// @author Sam DeLuca
12 
13 #include <typeinfo>
14 
16 // AUTO-REMOVED #include <core/chemical/ChemicalManager.hh>
17 
21 // AUTO-REMOVED #include <core/pack/interaction_graph/PDInteractionGraph.hh>
27 #include <core/graph/Graph.hh>
28 #include <basic/Tracer.hh>
32 
33 // AUTO-REMOVED #include <core/io/pdb/pose_io.hh>
34 // AUTO-REMOVED #include <ObjexxFCL/format.hh>
35 
36 #include <basic/options/option.hh>
37 #include <basic/options/keys/rotamerdump.OptionKeys.gen.hh>
38 
39 #include <utility/string_util.hh>
40 
42 
43 #include <core/pose/Pose.hh>
44 #include <protocols/jd2/Job.hh>
45 #include <utility/vector0.hh>
46 #include <utility/vector1.hh>
47 
48 
49 namespace protocols {
50 namespace RotamerDump {
51 
52 static basic::Tracer RotamerTracer("protocols.RotamerDump.RotamerDumpMover");
53 
55  core::scoring::ScoreFunctionOP score_function) :
56  task_factory_(task_factory), score_function_(score_function)
57 {
58 
59 }
60 
62 {
63 
65 
67 
68 
69  core::pack::task::PackerTaskCOP packer_task( task_factory_->create_task_and_apply_taskoperations(pose));
71 
72  score_function_->setup_for_packing(pose, packer_task->repacking_residues(), packer_task->designing_residues());
73 
74  core::graph::GraphOP packer_neighbor_graph(core::pack::create_packer_graph(pose,*score_function_,packer_task));
75 
76  rotamer_sets->set_task(packer_task);
77  rotamer_sets->build_rotamers(pose,*score_function_,packer_neighbor_graph);
78 
79  rotamer_sets->prepare_sets_for_packing(pose,*score_function_);
80 
81  RotamerTracer << "built " << rotamer_sets->nrotamers() << " rotamers at " <<rotamer_sets->nmoltenres() <<" positions" <<std::endl;
82 
84  rotamer_sets->compute_energies(pose,*score_function_,packer_neighbor_graph,ig);
85 
86  RotamerTracer << "IG: " <<ig->getTotalMemoryUsage() << " bytes"<<std::endl;
87 
89 
90  std::list<std::string> job_data;
91 
92  if(basic::options::option[basic::options::OptionKeys::rotamerdump::one_body].user())
93  {
94  RotamerTracer << "Generating one body energy table"<<std::endl;
95  job_data.push_back(get_onebody_energy_table(ig,rotamer_sets));
96  }
97  if(basic::options::option[basic::options::OptionKeys::rotamerdump::xyz].user())
98  {
99  RotamerTracer << "Generating XYZ rotamer table"<<std::endl;
100  job_data.push_back(get_xyz_coord_table(rotamer_sets));
101  }
102  if(basic::options::option[basic::options::OptionKeys::rotamerdump::two_body].user())
103  {
104  RotamerTracer << "Generating two body energy table"<<std::endl;
105  job_data.push_back(get_twobody_energy_table(ig,rotamer_sets));
106  }
107  if(basic::options::option[basic::options::OptionKeys::rotamerdump::annealer].user())
108  {
109  RotamerTracer <<"Running Annealer" <<std::endl;
110  job_data.push_back(get_annealer_pick_table(ig,rotamer_sets,pose,packer_task));
111  }
112  job->add_strings(job_data);
113  //RotamerTracer <<two_body_energy <<std::endl;
114  //RotamerTracer << one_body_energy <<std::endl;
115 
116 }
117 
118 /// @detailed appends a line to the job in the form one_body num_items (resno, resn, rotno, energy) for each 1 body energy in the IG
121 {
122  std::string table_type("one_body");
123  core::Size ig_size = ig->get_num_nodes();
124  std::string data ="";
125  core::Size elements = 0;
126  //table.append(" "+utility::to_string<core::Size>(ig_size));
127  for(core::Size node_id = 1; node_id <= ig_size; ++node_id)
128  {
129  core::Size residue_id = rotamer_sets->moltenres_2_resid(node_id);
130  std::string residue_id_string = utility::to_string<core::Size>(residue_id);
131 
132 
133  core::Size node_states = ig->get_num_states_for_node(node_id);
134  for(core::Size state_id = 1; state_id <= node_states; ++state_id)
135  {
136  float one_body_energy = ig->get_one_body_energy_for_node_state(node_id,state_id);
137  std::string one_body_energy_string = utility::to_string<float>(one_body_energy);
138 
139  core::pack::rotamer_set::RotamerSetOP rotamer_set(rotamer_sets->rotamer_set_for_moltenresidue(node_id));
140  core::conformation::ResidueCOP current_residue(rotamer_set->rotamer(state_id));
141 
142 
143  std::string residue_name(current_residue->name3());
144  std::string state_id_string = utility::to_string<core::Size>(state_id);
145 
146  //RotamerTracer << residue_id_string << " " << residue_name << " " << state_id_string << " " << one_body_energy_string <<std::endl;
147  data.append(" ("+residue_id_string+","+residue_name+","+state_id_string+","+one_body_energy_string+")");
148  elements++;
149  }
150  }
151  return table_type+" "+utility::to_string<core::Size>(elements)+" "+data;
152 }
153 
154 /// @detailed appends a line to the job in the form two_body num_items (nres1,nrot1,resn1,nres2,nrot2,resn2,energy) for each 2 body energy in the IG
157 {
158  std::string table_type("two_body");
159  std::string data = "";
160  core::Size elements = 0;
161 
164 
165  if(!p_ig)
166  {
167  utility_exit_with_message("Interaction graph is not pre-computed");
168  }
169  core::Size ig_size = ig->get_num_nodes();
170  for(core::Size node_1_id = 1; node_1_id <= ig_size; ++node_1_id)
171  {
172  core::Size residue_1_id = rotamer_sets->moltenres_2_resid(node_1_id);
173  std::string residue_1_id_string = utility::to_string<core::Size>(residue_1_id);
174 
175 
176 
177  for(core::Size node_2_id = node_1_id+2; node_2_id <= ig_size; ++node_2_id)
178  {
179  core::Size residue_2_id = rotamer_sets->moltenres_2_resid(node_2_id);
180  std::string residue_2_id_string = utility::to_string<core::Size>(residue_2_id);
181 
182 
183 
184  core::Size const num_states_1(ig->get_num_states_for_node(node_1_id));
185  core::Size const num_states_2(ig->get_num_states_for_node(node_2_id));
186  if(!ig->get_edge_exists(node_1_id,node_2_id))
187  {
188  continue;
189  }
190 
191  for(core::Size node_1_state = 1; node_1_state <= num_states_1;++node_1_state)
192  {
193  std::string node_1_state_string = utility::to_string<core::Size>(node_1_state);
194 
195  core::pack::rotamer_set::RotamerSetOP rotamer_set_1(rotamer_sets->rotamer_set_for_moltenresidue(node_1_id));
196  core::conformation::ResidueCOP residue_1(rotamer_set_1->rotamer(node_1_state));
197  std::string residue_1_name(residue_1->name3());
198 
199  for(core::Size node_2_state = 1; node_2_state <= num_states_2;++node_2_state)
200  {
201  core::pack::rotamer_set::RotamerSetOP rotamer_set_2(rotamer_sets->rotamer_set_for_moltenresidue(node_2_id));
202  core::conformation::ResidueCOP residue_2(rotamer_set_2->rotamer(node_2_state));
203  std::string residue_2_name(residue_2->name3());
204 
205  std::string node_2_state_string = utility::to_string<core::Size>(node_2_state);
206  float energy = p_ig->get_two_body_energy_for_edge(node_1_id,node_2_id,node_1_state,node_2_state);
207  if(energy != 0.0)
208  {
209  std::string energy_string = utility::to_string<float>(energy);
210  data.append(" ("+residue_1_id_string+","+node_1_state_string+","+residue_1_name+","+residue_2_id_string+","+node_2_state_string+","+residue_2_name+","+energy_string+")" );
211  elements++;
212  }
213  }
214  }
215  }
216  }
217  return table_type+" "+utility::to_string<core::Size>(elements)+" "+data;
218 }
219 
220 /// @detailed appends a line to the job in the form xyz_coord num_items xyz_coord (resno,rotno,resn,atomName,x,y,z) for each atom in the IG
222 {
223  std::string table_type("xyz_coord");
224  std::string data = "";
225  core::Size elements = 0;
226 
227  core::Size n_molten_res =rotamer_sets->nmoltenres();
228  for(core::Size molten_res =1; molten_res <= n_molten_res;++molten_res)
229  {
230  core::pack::rotamer_set::RotamerSetOP rotamer_set(rotamer_sets->rotamer_set_for_moltenresidue(molten_res));
231  core::Size n_rotamers = rotamer_set->num_rotamers();
232  std::string res_id_string = utility::to_string<core::Size>(rotamer_sets->moltenres_2_resid(molten_res));
233 
234  for(core::Size rotamer_id =1; rotamer_id <= n_rotamers; ++rotamer_id)
235  {
236  std::string rotamer_id_string = utility::to_string<core::Size>(rotamer_id);
237 
238  core::conformation::ResidueCOP current_residue(rotamer_set->rotamer(rotamer_id));
239  std::string residue_name(current_residue->name3());
240 
241  core::Size n_atoms = current_residue->natoms();
242  for(core::Size atom_id = 1; atom_id <= n_atoms;++atom_id)
243  {
244  std::string atom_name = utility::trim(current_residue->atom_name(atom_id));
245 
246  core::Vector xyz_coords = current_residue->xyz(atom_id);
247  std::string x_string = utility::to_string<core::Real>(xyz_coords.x());
248  std::string y_string = utility::to_string<core::Real>(xyz_coords.y());
249  std::string z_string = utility::to_string<core::Real>(xyz_coords.z());
250 
251  data.append(" ("+res_id_string+","+rotamer_id_string+","+residue_name+","+atom_name+","+x_string+","+y_string+","+z_string+")");
252  elements++;
253  }
254  }
255  }
256  return table_type+" "+utility::to_string<core::Size>(elements)+" "+data;
257 }
258 
259 /// @detailed appends a line to the job in the form annealer_results num_items (nres,selected_nres, selected_resn) for each atom in the IG
261 {
262  std::string table_type("annealer_results");
263  std::string data = "";
264  core::Size elements = 0;
265 
266  //bool start_with_current(false);
267  ObjexxFCL::FArray1D_int current_rot_index(pose.total_residue(),0);
268  //bool calc_rot_freq(false);
269  ObjexxFCL::FArray1D<float> rot_freq(ig->get_num_total_states(),0.0);
270  ObjexxFCL::FArray1D_int bestrotamer_at_seqpos(pose.total_residue());
271  utility::vector0<int> rot_to_pack;
272  float bestenergy = 0;
273 
274  core::pack::pack_rotamers_run(pose,task,rotamer_sets,ig,rot_to_pack,bestrotamer_at_seqpos,bestenergy);
275 
276  core::Size n_molten_res =rotamer_sets->nmoltenres();
277  for(core::Size molten_res =1; molten_res <= n_molten_res;++molten_res)
278  {
279  core::Size residue_id = rotamer_sets->moltenres_2_resid(molten_res);
280  std::string residue_id_string = utility::to_string<core::Size>(residue_id);
281 
282  core::Size selected_rotamer = rotamer_sets->rotid_on_moltenresidue(bestrotamer_at_seqpos(residue_id));
283  std::string selected_rotamer_string = utility::to_string<core::Size>(selected_rotamer);
284 
285  core::conformation::ResidueCOP selected_residue(rotamer_sets->rotamer_set_for_moltenresidue(molten_res)->rotamer(selected_rotamer));
286  std::string selected_residue_name(selected_residue->name3());
287 
288  data.append(" ("+residue_id_string+","+selected_rotamer_string+","+selected_residue_name+")");
289  elements++;
290  }
291  return table_type+" "+utility::to_string<core::Size>(elements)+" "+data;
292 }
293 
294 
296 {
297  return "RotamerDumpMover";
298 }
299 
300 }
301 }