Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
PseudocontactShiftData.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  //////////////////////////////////////////////
11  /// @begin
12  ///
13  /// @file PseudocontactShiftData.cc
14  ///
15  /// @brief Hold the PCS data on which the SVD will be applied
16  ///
17  /// @detailed
18  ///
19  /// @param
20  ///
21  /// @return
22  ///
23  /// @remarks
24  ///
25  /// @references
26  ///
27  /// @authorsv Christophe Schmitz
28  ///
29  /// @last_modified June 2009
30  ////////////////////////////////////////////////
31 
32 // TO DO FOR FASTER COMPILATION: remove the Pose.hh dependancy that could be centralized only in
33 // PseudocontactShiftEnergy.cc, by doing the work on Pose in PseudocontactShiftEnergy.cc instead of here.
34 // That would be ONLY in update_X_Y_Z_all() !!
35 
36 // Unit headers
38 
39 // Package headers
42 
43 // Project headers
45 #include <core/pose/Pose.hh>
46 #include <basic/Tracer.hh>
47 
48 #include <basic/options/option.hh>
49 #include <basic/options/keys/PCS.OptionKeys.gen.hh>
50 
51 // Utility headers
52 
53 // Numeric headers
54 #include <numeric/constants.hh>
55 
56 // Objexx headers
57 #include <ObjexxFCL/FArray1D.hh>
58 
59 // C++ headers
60 #include <iostream>
61 #include <iomanip>
62 
63 #include <utility/vector1.hh>
64 
65 
66 namespace protocols{
67 namespace scoring{
68 namespace methods{
69 namespace pcs{
70 
71 using namespace ObjexxFCL;
72 
73 basic::Tracer TR_pcs_d_p_l("protocols.scoring.methods.pcs.PCS_data_per_lanthanides");
74 basic::Tracer TR_pcs_d("protocols.scoring.methods.pcs.PCS_data");
75 
77 }
78 
80  filename_(""), weight_(0)
81 {
82  utility_exit_with_message( "You shouldn't call the empty constructor for PCS_data_per_lanthanides class" );
83 }
84 
86  filename_(other.filename_), svd_s_(other.svd_s_), weight_(other.weight_)
87 {
88  n_pcs_ = other.n_pcs_;
89  A_index_ = other.A_index_;
90  fstyle_A_ = other.fstyle_A_;
91  fstyle_b_ = other.fstyle_b_;
96 }
97 
100  return weight_;
101 }
102 
105  return normalization_factor_;
106 }
107 
108  /*
109 core::Real
110 PCS_data_per_lanthanides::get_normalization_1() const{
111  return normalization_1_;
112 }
113 
114 core::Real
115 PCS_data_per_lanthanides::get_normalization_2() const{
116  return normalization_2_;
117 }
118 
119 core::Real
120 PCS_data_per_lanthanides::get_normalization_3() const{
121  return normalization_3_;
122 }
123  */
124 
127 {
128  if ( this != &other ) {
129  n_pcs_ = other.n_pcs_;
130  A_index_ = other.A_index_;
131  fstyle_A_ = other.fstyle_A_;
132  fstyle_b_ = other.fstyle_b_;
133  svd_s_ = other.svd_s_;
138  }
139  return *this;
140 }
141 
143  utility_exit_with_message( "You shouldn't call the empty constructor for PCS_data class" );
144 }
145 
147 }
148 
149 PCS_data &
151 {
152  if ( this != &other ) {
154  n_pcs_spin_ = other.n_pcs_spin_;
157  A_all_ = other.A_all_;
158  X_all_ = other.X_all_;
159  Z_all_ = other.Z_all_;
160  Y_all_ = other.Y_all_;
161  }
162  return *this;
163 }
164 
166  CacheableData()
167 {
169  n_pcs_spin_ = other.n_pcs_spin_;
172  A_all_ = other.A_all_;
173  X_all_ = other.X_all_;
174  Y_all_ = other.Y_all_;
175  Z_all_ = other.Z_all_;
176 }
177 
178 basic::datacache::CacheableDataOP
180  return new PCS_data( *this );
181 }
182 
183 void
185  core::Real const xM,
186  core::Real const yM,
187  core::Real const zM,
188  core::Real const x,
189  core::Real const y,
190  core::Real const z){
191 
192  using namespace core;
193 
194  core::Real value_1_4_PI_r5;
195  core::Real r2;
196  core::Real r;
197  core::Real r5;
198  core::Real x2, y2, z2;
199  core::Real v_x, v_y, v_z;
200 
201  static const core::Real FACT_USI_PRECALC_FOR_A_3( (10000.0/12.0/ core::Real( numeric::constants::d::pi ) ) * 3.0 );
202 
203  v_x = x - xM;
204  v_y = y - yM;
205  v_z = z - zM;
206  x2 = v_x * v_x;
207  y2 = v_y * v_y;
208  z2 = v_z * v_z;
209 
210  r2 = x2 + y2 + z2;
211  r = sqrt(r2);
212  r5 = r2 * r2 * r;
213 
214  value_1_4_PI_r5 = FACT_USI_PRECALC_FOR_A_3 / r5;
215 
216  A_line[1] = value_1_4_PI_r5 * (x2 - z2);
217  A_line[2] = value_1_4_PI_r5 * (2.0 * v_x * v_y);
218  A_line[3] = value_1_4_PI_r5 * (2.0 * v_x * v_z);
219  A_line[4] = value_1_4_PI_r5 * (y2 - z2);
220  A_line[5] = value_1_4_PI_r5 * (2.0 * v_y * v_z);
221 }
222 
223 void
225  core::Size i, j;
226  for(i = 1; i <= A_index_.size(); ++i){
227  for(j = 1; j <= 5; ++j){
228  fstyle_A_(i, j) = A_all[A_index_[i]][j];
229  }
230  }
231  svd_s_.set_matrix_A(fstyle_A_);
232 }
233 
236 
237  core::Real score;
238 
239  //#define FAST_SCORING
240  //FAST SCORING is actually not faster (nor slower)
241  //FAST SCORING gives the PCS score without actually solving Ax = b
242  //(but still, the matrix has to be decomposed.
243  //So FAST_SCORING doesn't give the tensor parameters...
244  //FAST SCORING might become handy when working on unassigned data, that's why I keep it.
245 
246  svd_s_.run_decomp_svd();
247 
248 #ifdef FAST_SCORING
249  score = svd_s_.run_score_svd_without_solving();
250  PCS_t.reset_tensor(0, 0, 0, 0, 0); //Junk tensor to avoid warning at compilation
251 #else
252  svd_s_.run_solve_svd();
253  score = svd_s_.run_score_svd_on_matrix(fstyle_A_);
254  // The 2 following calls are not that necessary for just scoring
255  // FArray1D<core::Real> f (svd_s_.get_svd_solution());
256 
257  utility::vector1<core::Real> const & f (svd_s_.get_svd_solution());
258 
259  // PCS_t.reset_tensor(f(1), f(2), f(3), f(4), f(5));
260  PCS_t.reset_tensor(f[1], f[2], f[3], f[4], f[5]);
261 #endif
262 
263  // std::cerr << weight_ << "applyed as individual weight in svd" << std::endl;
264 
265  score *= weight_;
266 
267  return(score/normalization_factor_);
268 }
269 
273 }
274 
277  return (PCS_data_line_all_spin_);
278 }
279 
283 }
284 
285 void
287  core::Size i;
288  for( i = 1; i <= PCS_data_per_lanthanides_all_.size(); ++i){
289  PCS_data_per_lanthanides_all_[i].update_my_A_matrix(A_all_);
290  }
291 }
292 
293 void
295  core::Real const Y,
296  core::Real const Z){
297  core::Size i;
298  core::Real x, y, z;
299 
300  for( i = 1; i <= n_pcs_spin_; ++i){
301  x = X_all_[i];
302  y = Y_all_[i];
303  z = Z_all_[i];
304  fill_A_line(A_all_[i], X, Y, Z, x, y, z);
305  }
306  update_matrix_A();
307 }
308 
309 
310 //To be called each time the pose is changed
311 void
313  core::Size i, res;
314  std::string at;
316 
317  for( i = 1; i <= PCS_data_line_all_spin_.size(); ++i){
318  res = PCS_data_line_all_spin_[i].residue_num();
319  if(res > pose.total_residue()){
320  std::cerr << "Error: Couldn't find residue " << res << std::endl;
321  std::cerr << "Numbering residue within Rosetta match the sequence provided as input" << std::endl;
322  std::cerr << "Make sure the numbering between the sequence and the PseudocontactShift (npc) input file match" << std::endl;
323  utility_exit_with_message("Check your pdb and PseudocontactShift (npc) input file");
324  }
325 
326  at = PCS_data_line_all_spin_[i].atom_name();
327  if( ! pose.residue(res).has(at)){
328  std::cerr << "Error: Couldn't find the atom " << at << " in residue " << res << std::endl;
329  std::cerr << "Numbering residue within Rosetta match the sequence provided as input" << std::endl;
330  std::cerr << "Make sure the numbering between the sequence and the PseudocontactShift (npc) input file match" << std::endl;
331  std::cerr << "Use only PCS for the backbone for abinitio." << std::endl;
332  std::cerr << "only N, CA, C, O, CB, H and CEN" << std::endl;
333 
334  utility_exit_with_message("Check your pdb and PseudocontactShift (npc) input file");
335  }
336  coo = pose.residue(res).atom(at).xyz();
337  X_all_[i] = coo.x();
338  Y_all_[i] = coo.y();
339  Z_all_[i] = coo.z();
340  }
341 }
342 
345  return (n_pcs_);
346 }
347 
348 
351  return(A_index_);
352 }
353 
354 const FArray1D< core::Real > &
356  return(fstyle_b_);
357 }
358 
359 /*
360 //Function for debugging
361 void
362 PCS_data_per_lanthanides::print_index_A() const{
363  core::Size i;
364  for (i = 1; i <= n_pcs_; ++i){
365  TR_pcs_d_p_l << i << " -> " <<A_index_[i] << std::endl;
366  }
367 }
368 */
369 
373  core::Size index;
374  index = 1;
375  for ( it = PCS_data_line_all_spin_.begin(); it != PCS_data_line_all_spin_.end(); ++it ) {
376  if ((*it).residue_num() == P_l_d.residue_num()){
377  if ((*it).atom_name() == P_l_d.atom_name()){
378  return(index);
379  }
380  }
381  index = index + 1;
382  }
383  return (0);
384 }
385 
386 // PCS_data_per_lanthanides::PCS_data_per_lanthanides(std::string filename,
387 // PCS_file_data & PCS_f_d,
388 // core::Real const weight):
389 // filename_(filename), svd_s_(numeric::svd::SVD_Solver(PCS_f_d.get_PCS_data_line_all_reference().size(), 5)), weight_(weight)
390 // {
391 
392 // using namespace core;
393 // using namespace basic::options;
394 // using namespace basic::options::OptionKeys;
395 
396 // core::Size i;
397 // utility::vector1<PCS_line_data>::iterator it;
398 
399 // utility::vector1<PCS_line_data> & PCS_d_l_a = PCS_f_d.get_PCS_data_line_all_reference();
400 
401 // n_pcs_ = PCS_d_l_a.size();
402 // A_index_.resize(n_pcs_);
403 
404 // core::Size M, N;
405 // M = n_pcs_;
406 // N = 5;
407 
408 // svd_s_ = numeric::svd::SVD_Solver(M, N);
409 // utility::vector1<core::Real> vec_temp;
410 // fstyle_A_.dimension(M, N);
411 // fstyle_b_.dimension(M);
412 
413 // normalization_1_ = 0;
414 // core::Real sum (0);
415 
416 // for (i = 1; i <= PCS_d_l_a.size(); ++i){
417 // PCS_line_data PCS_l_d = PCS_d_l_a[i];
418 // vec_temp.push_back(PCS_l_d.PCS_experimental());
419 // fstyle_b_(i) = PCS_l_d.PCS_experimental();
420 // normalization_1_ += PCS_l_d.PCS_experimental() * PCS_l_d.PCS_experimental();
421 // sum += PCS_l_d.PCS_experimental();
422 // }
423 // svd_s_.set_vector_b(vec_temp);
424 // normalization_1_ = sqrt(normalization_1_);
425 
426 // normalization_3_ = sqrt(normalization_1_ / PCS_d_l_a.size());
427 
428 // core::Real average(sum/PCS_d_l_a.size());
429 
430 // normalization_2_ = 0;
431 // for (i = 1; i <= PCS_d_l_a.size(); ++i){
432 // normalization_2_ += (fstyle_b_(i) - average) * (fstyle_b_(i) - average);
433 // }
434 // normalization_2_ = sqrt( normalization_2_ / PCS_d_l_a.size() );
435 
436 // TR_pcs_d_p_l << "n_pcs: " << n_pcs_ << std::endl;
437 // TR_pcs_d_p_l << "Normalization 1: " << normalization_1_ << std::endl;
438 // TR_pcs_d_p_l << "Normalization 2: " << normalization_2_ << std::endl;
439 // TR_pcs_d_p_l << "Normalization 3: " << normalization_3_ << std::endl;
440 
441 // if( option[ basic::options::OptionKeys::PCS::normalization_id ].user() ){
442 // core::Size norma_id (option[ basic::options::OptionKeys::PCS::normalization_id ]());
443 
444 // switch (norma_id){
445 // case 1:{
446 // TR_pcs_d_p_l << "Using Normalization '1': " << normalization_1_ << ". Normalize each data set by SQRT( SUM( PCScalc(i)^2 ) ) " << std::endl;
447 // normalization_factor_ = normalization_1_;
448 // break;
449 // }
450 // case 2:{
451 // TR_pcs_d_p_l << "Using Normalization '2': " << normalization_2_ << ". Normalize each data set by Standard Deviation" << std::endl;
452 // normalization_factor_ = normalization_2_;
453 // break;
454 // }
455 // case 3:{
456 // TR_pcs_d_p_l << "Using Normalization '3': " << normalization_3_ << ". Normalize each data set by SQRT( SUM( PCScalc(i)^2 ) / N) " << std::endl;
457 // normalization_factor_ = normalization_3_;
458 // break;
459 // }
460 // default:{
461 // TR_pcs_d_p_l << "Normalization '"<< norma_id << "' id not recognized " << std::endl;
462 // utility_exit_with_message("You should use a valid normalization id ('1' or '2' or '3')");
463 // break;
464 // }
465 // }
466 // }
467 // else{
468 // TR_pcs_d_p_l << "Normalization NOT used in calculations " << std::endl;
469 // normalization_factor_ = 1.0;
470 // }
471 // }
472 
473 
475  core::Real const weight,
477  filename_(filename), svd_s_(basic::svd::SVD_Solver(PCS_d_l_a.size(), 5)), weight_(weight)
478 {
479  using namespace core;
480  using namespace basic::options;
481  using namespace basic::options::OptionKeys;
482 
483  core::Size i;
485 
486  n_pcs_ = PCS_d_l_a.size();
487  A_index_.resize(n_pcs_);
488 
489  core::Size M, N;
490  M = n_pcs_;
491  N = 5;
492 
493  svd_s_ = basic::svd::SVD_Solver(M, N);
495  fstyle_A_.dimension(M, N);
496  fstyle_b_.dimension(M);
497 
498  normalization_1_ = 0;
499  core::Real sum (0);
500 
501  for (i = 1; i <= PCS_d_l_a.size(); ++i){
502  PCS_line_data PCS_l_d = PCS_d_l_a[i];
503  vec_temp.push_back(PCS_l_d.PCS_experimental());
504  fstyle_b_(i) = PCS_l_d.PCS_experimental();
505  normalization_1_ += PCS_l_d.PCS_experimental() * PCS_l_d.PCS_experimental();
506  sum += PCS_l_d.PCS_experimental();
507  }
508  svd_s_.set_vector_b(vec_temp);
510 
511  normalization_3_ = sqrt(normalization_1_ / PCS_d_l_a.size());
512 
513  core::Real average(sum/PCS_d_l_a.size());
514 
515  normalization_2_ = 0;
516  for (i = 1; i <= PCS_d_l_a.size(); ++i){
517  normalization_2_ += (fstyle_b_(i) - average) * (fstyle_b_(i) - average);
518  }
519  normalization_2_ = sqrt( normalization_2_ / PCS_d_l_a.size() );
520 
521  TR_pcs_d_p_l << "n_pcs: " << n_pcs_ << std::endl;
522  TR_pcs_d_p_l << "Normalization 1: " << normalization_1_ << std::endl;
523  TR_pcs_d_p_l << "Normalization 2: " << normalization_2_ << std::endl;
524  TR_pcs_d_p_l << "Normalization 3: " << normalization_3_ << std::endl;
525 
526  if( option[ basic::options::OptionKeys::PCS::normalization_id ].user() ){
527  core::Size norma_id (option[ basic::options::OptionKeys::PCS::normalization_id ]());
528 
529  switch (norma_id){
530  case 1:{
531  TR_pcs_d_p_l << "Using Normalization '1': " << normalization_1_ << ". Normalize each data set by SQRT( SUM( PCScalc(i)^2 ) ) " << std::endl;
533  break;
534  }
535  case 2:{
536  TR_pcs_d_p_l << "Using Normalization '2': " << normalization_2_ << ". Normalize each data set by Standard Deviation" << std::endl;
538  break;
539  }
540  case 3:{
541  TR_pcs_d_p_l << "Using Normalization '3': " << normalization_3_ << ". Normalize each data set by SQRT( SUM( PCScalc(i)^2 ) / N) " << std::endl;
543  break;
544  }
545  default:{
546  TR_pcs_d_p_l << "Normalization '"<< norma_id << "' id not recognized " << std::endl;
547  utility_exit_with_message("You should use a valid normalization id ('1' or '2' or '3')");
548  break;
549  }
550  }
551  }
552  else{
553  TR_pcs_d_p_l << "Normalization NOT used in calculations " << std::endl;
554  normalization_factor_ = 1.0;
555  }
556 }
557 
560  return (filename_);
561 }
562 
563 void
565  core::Size index){
566  A_index_[j] = index;
567 }
568 
570  std::map< std::string, PCS_file_data >::iterator it;
571 
573  PCS_line_data * P_l_d_temp;
574  core::Size index, i, j;
575 
576  n_pcs_spin_ = 0;
577  n_lanthanides_ = 0;
578 
579  std::map< std::string, PCS_file_data > & P_f_a_d = P_d_i.get_PCS_data_input_reference();
580 
581  for ( it = P_f_a_d.begin(); it != P_f_a_d.end(); ++it ) {
582  filename = it->first;
583 
584  PCS_file_data & P_f_d = (it->second);
585  n_lanthanides_ = n_lanthanides_ + 1;
586  TR_pcs_d << "Filename " << filename <<std::endl;
587  core::Real weight(P_f_d.get_weight());
588 
591 
592  PCS_data_per_lanthanides P_d_p_l = PCS_data_per_lanthanides(filename, weight, PCS_d_l_a );
593 
594  j = 1;
595  for ( it2 = PCS_d_l_a.begin(); it2 != PCS_d_l_a.end(); ++it2 ){
596  P_l_d_temp = &(*it2);
597  index = where_is_line(*P_l_d_temp);
598  if(index == 0){
599  PCS_data_line_all_spin_.push_back(*it2);
600  n_pcs_spin_ = n_pcs_spin_ + 1;
601  P_d_p_l.set_A_index(j, n_pcs_spin_);
602  }
603  else{
604  P_d_p_l.set_A_index(j, index);
605  }
606  j = j + 1;
607  }
608  PCS_data_per_lanthanides_all_.push_back(P_d_p_l);
609  }
610  TR_pcs_d << "Total spin independent: " << n_pcs_spin_ << std::endl;
611 
612  A_all_.resize(n_pcs_spin_);
613  for(i = 1; i <= n_pcs_spin_; i++){
614  (A_all_[i]).resize(5);
615  }
616  X_all_.resize(n_pcs_spin_);
617  Y_all_.resize(n_pcs_spin_);
618  Z_all_.resize(n_pcs_spin_);
619 }
620 
622  std::map< std::string, PCS_file_data >::iterator it;
623 
625  PCS_line_data * P_l_d_temp;
626  core::Size index, i, j;
627 
628  n_pcs_spin_ = 0;
629  n_lanthanides_ = 0;
630 
631  std::map< std::string, PCS_file_data > & P_f_a_d = P_d_i.get_PCS_data_input_reference();
632 
633  for ( it = P_f_a_d.begin(); it != P_f_a_d.end(); ++it ) {
634  filename = it->first;
635 
636  PCS_file_data & P_f_d = (it->second);
637  n_lanthanides_ = n_lanthanides_ + 1;
638  TR_pcs_d << "Filename " << filename <<std::endl;
639  core::Real weight(P_f_d.get_weight());
640 
644 
645  for ( it2 = file_PCS_d_l_a.begin(); it2 != file_PCS_d_l_a.end(); ++it2 ){
646  bool use_residue = false;
647 
648  if ( it2->residue_num() > exclude_residues.size() ) {
649  use_residue = true;
650  } else {
651  if ( exclude_residues[it2->residue_num()] == false ) {
652  use_residue = true;
653  }
654  }
655 
656  if (use_residue == true) {
657  PCS_d_l_a.push_back(*it2);
658  }
659  }
660 
661  PCS_data_per_lanthanides P_d_p_l = PCS_data_per_lanthanides(filename, weight, PCS_d_l_a );
662 
663  j = 1;
664  for ( it2 = PCS_d_l_a.begin(); it2 != PCS_d_l_a.end(); ++it2 ){
665  P_l_d_temp = &(*it2);
666  index = where_is_line(*P_l_d_temp);
667  if(index == 0){
668  PCS_data_line_all_spin_.push_back(*it2);
669  n_pcs_spin_ = n_pcs_spin_ + 1;
670  P_d_p_l.set_A_index(j, n_pcs_spin_);
671  }
672  else{
673  P_d_p_l.set_A_index(j, index);
674  }
675  j = j + 1;
676  }
677  PCS_data_per_lanthanides_all_.push_back(P_d_p_l);
678  }
679  TR_pcs_d << "Total spin independent: " << n_pcs_spin_ << std::endl;
680 
681  A_all_.resize(n_pcs_spin_);
682  for(i = 1; i <= n_pcs_spin_; i++){
683  (A_all_[i]).resize(5);
684  }
685  X_all_.resize(n_pcs_spin_);
686  Y_all_.resize(n_pcs_spin_);
687  Z_all_.resize(n_pcs_spin_);
688 }
689 
690 
693  return (n_lanthanides_);
694 }
695 
698  return(X_all_);
699 }
700 
703  return(Y_all_);
704 }
705 
708  return(Z_all_);
709 }
710 
711 std::ostream &
712 operator<<(std::ostream& out, const PCS_data & P_d){
713  core::Size i;
714  out << "n lanthanides experiment: " << P_d.get_n_lanthanides() << std::endl;
715  out << "n independent spins in total: " << P_d.n_pcs_spin_ << std::endl;
716  for (i = 1 ; i <= P_d.n_lanthanides_; ++i){
717  out << P_d.PCS_data_per_lanthanides_all_[i] << std::endl;
718  }
719 
720  return out;
721 }
722 
723 std::ostream &
724 operator<<(std::ostream& out, const PCS_data_per_lanthanides &PCS_d_p_l){
725  core::Size i, j;
726  out << std::setprecision(4) << std::endl;
727  out << " Filename : " << PCS_d_p_l.get_filename() << std::endl;
728  out << " Number of pcs : " << PCS_d_p_l.get_n_pcs() << std::endl;
729  out << " b vector (pcs values) : " << std::endl;
730 
731  for ( i = 1; i <= PCS_d_p_l.get_n_pcs(); ++i){
732  out << " " << std::setw(4) << i << ":"<< std::setw(10) <<PCS_d_p_l.fstyle_b_(i) << std::endl;
733  }
734  out << std::endl;
735 
736  out << " A_index : " << std::endl;
737  for ( i = 1; i <= PCS_d_p_l.get_n_pcs(); ++i){
738  out << " " << std::setw(4) << i << ":" << std::setw(4) <<PCS_d_p_l.A_index_[i];
739  out << std::endl;
740  }
741 
742 
743  out << " Matrix A:"<< std::endl;
744  for( i = 1; i <= PCS_d_p_l.n_pcs_ ; ++i ){
745  out << " " << std::setw(4) << i << ":";
746  for (j = 1; j <= 5; ++j){
747  out << " " << std::setw(12) << PCS_d_p_l.fstyle_A_( i, j);
748  }
749  out << std::endl;
750  }
751  return out;
752 }
753 
754 }//namespcacs PCS
755 }//namespace methods
756 }//namespace scoring
757 }//namespace protocols