27 #include <utility/exit.hh>
28 #include <utility/file/file_sys_util.hh>
29 #include <utility/io/izstream.hh>
30 #include <utility/io/ozstream.hh>
37 #include <basic/Tracer.hh>
39 #include <utility/vector1.hh>
48 static basic::Tracer
TR(
"core.conformation.SymmetryInfo");
51 namespace conformation {
68 return !( *
this == s );
75 for(std::map<std::string,Size>::const_iterator i = name2num.begin(); i != name2num.end(); ++i) {
93 else TR.Debug << *
this << std::endl;
97 Size const nres_monomer,
98 Size const njump_monomer,
100 std::map< Size, SymDof > dofs,
101 Size const score_subunit,
104 Size const num_interfaces,
108 initialize( nres_monomer, njump_monomer, N, N, dofs, score_subunit,
109 score_multiply_subunit, slide_info, num_interfaces, type );
122 Size const nres_monomer,
123 Size const njump_monomer,
124 Size const n_subunits,
125 Size const num_virtual,
126 std::map< Size, SymDof > dofs,
127 Size const score_subunit,
130 Size const num_interfaces,
160 if ( score_subunit > n_subunits || score_subunit < 1 ) {
161 utility_exit_with_message(
"score_subunit must be in the range 1-N");
165 if ( type ==
"c1" ) {
169 for (
Size i=1; i<= nres_monomer; ++i ) {
172 bb_clones_.insert( std::make_pair( i, clones ) );
175 for (
Size i=1; i<= njump_monomer; ++i ) {
183 for (
Size i=1; i<= nres_monomer; ++i ) {
185 int base ( i + ( score_subunit - 1 ) * nres_monomer );
186 for (
Size k=0; k<n_subunits; ++k ) {
187 if ( k+1 != score_subunit ) {
188 clones.push_back( i + k * nres_monomer );
193 bb_clones_.insert( std::make_pair( base, clones ) );
194 chi_clones_.insert( std::make_pair( base, clones ) );
198 for (
Size i=1; i<= njump_monomer; ++i ) {
200 for (
Size k=1; k<n_subunits; ++k ) {
207 if ( type ==
"no_pseudo" ) {
210 }
else if ( type ==
"simple" ) {
219 Size const base_jump( n_subunits*njump_monomer + 1 );
221 for (
Size k=1; k<n_subunits; ++k ) {
240 std::cerr <<
"unrecognized type: " << type << std::endl;
273 for (
int i=1; i<=(
int)indep_res.size(); ++i) {
285 Size const nres_monomer,
286 Size const njump_monomer,
287 Size const n_subunits,
288 Size const num_virtual,
289 std::map< Size, WtedClones > jump_clones,
290 std::map< Size, SymDof > dofs,
291 Size const score_subunit,
294 Size const num_interfaces,
330 for (
Size i=1; i<= nres_monomer; ++i ) {
332 int base ( i + ( score_subunit - 1 ) * nres_monomer );
333 for (
Size k=0; k<n_subunits; ++k ) {
334 if ( k+1 != score_subunit ) {
335 clones.push_back( i + k * nres_monomer );
340 bb_clones_.insert( std::make_pair( base, clones ) );
341 chi_clones_.insert( std::make_pair( base, clones ) );
345 for (
Size i=1; i<= njump_monomer; ++i ) {
346 for (
Size k=0; k<n_subunits; ++k ) {
347 if (k != ( score_subunit - 1 ) )
348 add_jump_clone( i + (score_subunit-1)*njump_monomer, i + k*njump_monomer, 0.0 );
353 std::map< Size,WtedClones >::const_iterator it, it_start=jump_clones.begin(), it_end=jump_clones.end();
354 for ( it=it_start; it != it_end; ++it ) {
356 for (
Size i = 1; i<= it->second.size(); ++i ) {
358 add_jump_clone( it->first + n_subunits*njump_monomer, it->second[i].first + n_subunits*njump_monomer, it->second[i].second );
382 TR <<
"Input failed: tag mismatch " << tag <<
" " << tag0 << std::endl;
386 for (
Size i=1; !fail && i<= nbase; ++i ) {
393 std::replace( jump_string.begin(), jump_string.end(),
',',
' ' );
394 std::istringstream l( jump_string );
404 if ( l.fail() )
break;
405 clones[ base_jump ].push_back( j );
407 if ( clones[ base_jump ].
size() < 1 ) {
413 is.setstate( std::ios_base::failbit );
423 std::map< Size, T > & clones,
431 TR <<
"Input failed: tag mismatch " << tag <<
" " << tag0 << std::endl;
435 for (
Size i=1; !fail && i<= nbase; ++i ) {
442 std::replace( jump_string.begin(), jump_string.end(),
',',
' ' );
443 std::istringstream l( jump_string );
450 l >> clones[ base_jump ];
453 is.setstate( std::ios_base::failbit );
462 std::map< Size, SymDof > & clones,
471 TR <<
"Input failed: tag mismatch " << tag <<
" " << tag0 << std::endl;
475 for (
Size i=1; !fail && i<= nbase; ++i ) {
482 std::replace( jump_string.begin(), jump_string.end(),
',',
' ' );
483 std::istringstream l( jump_string );
488 clones[base_jump].read(dof_line);
495 is.setstate( std::ios_base::failbit );
513 TR <<
"Input failed: tag mismatch " << tag <<
" " << tag0 << std::endl;
520 if ( is.fail() ) fail =
true;
521 std::replace( jump_string.begin(), jump_string.end(),
',',
' ' );
522 std::istringstream l( jump_string );
526 if ( l.fail() )
break;
527 clones.push_back( j );
529 if ( clones.size() != nbase ) {
534 is.setstate( std::ios_base::failbit );
539 template<
class CloneType>
545 typename std::map< Size,utility::vector1<CloneType> >::const_iterator it;
546 if( tag !=
"" ) out <<
' ' << tag ;
547 for ( it = clones.begin(); it != clones.end(); ++it ) {
548 out <<
' ' << it->first;
550 for (
Size i=1; i<= l.size(); ++i ) {
558 template<
class CloneType >
561 std::map< Size, CloneType > clones,
564 typename std::map< Size , CloneType >::const_iterator it;
565 if( tag !=
"" ) out <<
' ' << tag ;
566 for ( it = clones.begin(); it != clones.end(); ++it ) {
567 out <<
' ' << it->first <<
',' << it->second ;
575 std::map< Size, SymDof > clones,
579 if( tag !=
"" ) out <<
' ' << tag ;
580 for ( std::map< Size , SymDof >::const_iterator
581 it = clones.begin(); it != clones.end(); ++it ) {
583 out <<
" " << it->first <<
"," << it->second ;
595 if( tag !=
"" ) out <<
' ' << tag ;
596 for (
Size i=1; i<= clones.size(); ++i ) {
598 out <<
" " << clones[i] ;
600 out <<
',' << clones[i] ;
612 Size num_bb_indep, num_chi_indep, num_jump_indep;
613 Size num_bb_dep, num_chi_dep, num_jump_dep;
614 Size num_dof, num_score_multiply;
620 if ( tag !=
"SYMMETRY_INFO" || s.fail() ) {
623 s >> tag >> tag >> tag;
626 bool old_stream =
false;
627 if (tag ==
"N_RES_MONOMER") {
637 >> tag >> symminfo.
type_
638 >> tag >> num_bb_indep
639 >> tag >> num_chi_indep
640 >> tag >> num_jump_indep
642 >> tag >> num_chi_dep
643 >> tag >> num_jump_dep
645 >> tag >> num_score_multiply;
647 if ( s.fail() ) fail =
true;
655 TR <<
"Warning: Symmetric input stream is out of date! Trying to recover." << std::endl;
657 for (std::map<Size,SymmetryInfo::Clones>::const_iterator map_it=symminfo.
jump_clones_.begin(),
659 map_it != map_end; ++map_it) {
660 for (
Size i=1; i<=map_it->second.size(); ++i) {
667 std::map<Size,SymmetryInfo::Clones>::const_iterator first_bb_clone=symminfo.
bb_clones_.begin();
691 std::cout <<
"Symmetry_info operator>>: Input failed" << std::endl;
692 s.setstate( std::ios_base::failbit );
703 s <<
"SYMMETRY_INFO " <<
704 "N " << symminfo.
subunits() <<
' ' <<
708 "N_VIRT " << symminfo.
npseudo_ <<
' ' <<
710 "TYPE " << symminfo.
type_ <<
' ' <<
711 "BB_CLONES_SIZE " << symminfo.
bb_clones_.size() <<
' ' <<
712 "CHI_CLONES_SIZE " << symminfo.
chi_clones_.size() <<
' ' <<
713 "JUMP_CLONES_SIZE " << symminfo.
jump_clones_.size() <<
' ' <<
714 "BB_FOLLOWS_SIZE " << symminfo.
bb_follows_.size() <<
' ' <<
715 "CHI_FOLLOWS_SIZE " << symminfo.
chi_follows_.size() <<
' ' <<
716 "JUMP_FOLLOWS_SIZE " << symminfo.
jump_follows_.size() <<
' ' <<
717 "DOFS_SIZE " << symminfo.
dofs_.size() <<
' ' <<
745 bool success =
false;
747 utility::io::ozstream output;
749 output.open( filename );
751 output.open_append( filename );
754 output << *
this <<
'\n';
768 bool success =
false;
770 utility::io::izstream input ( filename.c_str() );
771 std::istringstream line_stream;
774 std::cerr <<
"ERROR:: Unable to open symmetry info file: "
775 << filename << std::endl;
779 while( !input.eof() ) {
782 line_stream.str(line);
783 line_stream >> *
this;
800 std::map< Size, Size >::const_iterator it(
bb_follows_.find( seqpos ) );
801 return ( it ==
bb_follows_.end() ? 0 : it->second );
807 std::map< Size, Size >::const_iterator it(
chi_follows_.find( seqpos ) );
814 std::map< Size, Size >::const_iterator it(
jump_follows_.find( seqpos ) );
818 std::vector < std::pair < Size, Size > >
821 std::vector < std::pair < Size, Size > > map;
822 int delta ( res2 - res1 );
824 for ( std::vector< Size>::const_iterator
831 mapped_res = *
clone + delta;
833 if ( mapped_res < 0 )
835 map.push_back( std::make_pair( *
clone, mapped_res ) );
876 residues.push_back(
true);
878 residues.push_back(
false);
961 std::map< Size, Clones >::const_iterator it(
bb_clones_.find( seqpos ) );
971 std::map< Size, Clones >::const_iterator it(
chi_clones_.find( seqpos ) );
981 std::map< Size, Clones >::const_iterator it(
jump_clones_.find( seqpos ) );
1006 bb_clones_.insert( std::make_pair( i, clones ) );
1007 chi_clones_.insert( std::make_pair( i, clones ) );
1013 for (
Size k=0; k<
N; ++k ) {
1020 bb_clones_.insert( std::make_pair( base, clones ) );
1021 chi_clones_.insert( std::make_pair( base, clones ) );
1035 std::map< Size, Clones > old_jump_clones =
jump_clones_;
1047 for (
Size i=1; i<= njump_monomer; ++i ) {
1048 for (
Size k=0; k<
N; ++k ) {
1058 for ( std::map<Size,Clones>::const_iterator it=old_jump_clones.begin(), it_end = old_jump_clones.end();
1059 it != it_end; it++) {
1060 Size source = it->first;
1061 Clones target = it->second;
1063 if (source > N*old_njump_monomer) {
1065 Size new_source = source + N*( njump_monomer - old_njump_monomer );
1066 for (
Size i=1; i<=target.size(); ++i) {
1067 add_jump_clone( new_source, target[i] + N*(njump_monomer-old_njump_monomer), old_jump_clone_weights[target[i]] );
1074 std::map< Size, SymDof > dofs_new;
1075 for ( std::map< Size, SymDof >::iterator it =
dofs_.begin(), it_end =
dofs_.end(); it!=it_end; ++it ) {
1076 dofs_new.insert( std::make_pair( it->first + N*( njump_monomer - old_njump_monomer ), it->second ) );
1085 std::cerr <<
"Error: add_bb_clone: base_pos is not independent: " <<
1086 base_pos <<
' ' <<
bb_follows_[ base_pos ] << std::endl;
1091 std::cerr <<
"Error: add_bb_clone: clone_pos already a follower: " <<
1092 clone_pos <<
' ' <<
bb_follows_[ clone_pos ] <<
' ' << base_pos <<
1098 bb_clones_[ base_pos ].push_back( clone_pos );
1105 std::cerr <<
"Error: add_chi_clone: base_pos is not independent: " <<
1106 base_pos <<
' ' <<
chi_follows_[ base_pos ] << std::endl;
1111 std::cerr <<
"Error: add_chi_clone: clone_pos already a follower: " <<
1112 clone_pos <<
' ' <<
chi_follows_[ clone_pos ] <<
' ' << base_pos <<
1125 std::cerr <<
"Error: add_jump_clone: base_pos is not independent: " <<
1126 base_pos <<
' ' <<
bb_follows_[ base_pos ] << std::endl;
1131 std::cerr <<
"Error: add_jump_clone: clone_pos already a follower: " <<
1132 clone_pos <<
' ' <<
jump_follows_[ clone_pos ] <<
' ' << base_pos <<
1142 std::map< Size, SymDof >
const &
1184 for (
Size i = 1; i<= n_subunits; ++i ) {
1185 for (
Size j = 1; j<= nres_subunit; ++j ) {
1189 for (
Size i = n_subunits + 1 ; i <= score_multiply_vector_subunit.size() ; ++i ) {
1250 utility_exit_with_message(
"SymmetryInfo::dependent_dofs: dof is not independent!" );
1253 Size const seqpos(
id.rsd() );
1254 Size const atomno(
id.atomno() );
1260 for ( Clones::const_iterator pos= clones.begin(), epos=clones.end(); pos != epos; ++pos ) {
1285 utility_exit_with_message(
"dof_is_independent: unrecognized TorsionType!");
1298 }
else if ( type ==
id::CHI ) {
1302 std::map< Size, Real >::const_iterator it(
jump_clone_wts_.find( jumpnum ) );
1306 utility_exit_with_message(
"get_dof_derivative_weight: unrecognized TorsionType!");
1332 utility_exit_with_message(
"SymmetryInfo::dependent_torsions: torsion is not independent!" );
1335 Size const seqpos(
id.rsd() );
1341 for ( Clones::const_iterator pos= seqpos_clones.begin(), epos=seqpos_clones.end(); pos != epos; ++pos ) {
1342 tors.push_back(
TorsionID( *pos,
id.type(),
id.torsion() ) );
1352 utility_exit_with_message(
"SymmetryInfo::dependent_atoms: atom is not independent!" );
1354 Size const seqpos(
id.rsd() );
1358 for ( Clones::const_iterator pos= seqpos_clones.begin(), epos=seqpos_clones.end(); pos != epos; ++pos ) {
1359 atoms.push_back(
AtomID(
id.atomno(), *pos ) );
1368 return ( !
get_use_symmetry() || res > nres_monomer*num_monomers || res <= nres_monomer );
1376 return ( res > nres_monomer*num_monomers ? res - nres_monomer*(num_monomers-1) : (res-1)%nres_monomer + 1 );
1389 if( 0 ==
jnum2dofname_.count(jnum) ) utility_exit_with_message(
"bad jump num");
1395 if( 0 ==
dofname2jnum_.count(jname) ) utility_exit_with_message(
"bad jump name");
1408 for(std::map<Size,SymDof>::const_iterator i =
dofs_.begin(); i !=
dofs_.end(); i++) {
1409 if (i->second.allow_dof(1) || i->second.allow_dof(2) || i->second.allow_dof(3)) retval++;
1416 if(
components_.size()==0) utility_exit_with_message(
"function not for use in single component symmetry");
1420 std::map<char,std::pair<Size,Size> >
const &
1422 if(
components_.size()==0) utility_exit_with_message(
"function not for use in single component symmetry");
1426 std::map<std::string,char>
const &
1428 if(
components_.size()==0) utility_exit_with_message(
"function not for use in single component symmetry");
1432 std::map<std::string,utility::vector1<char> >
const &
1434 if(
components_.size()==0) utility_exit_with_message(
"function not for use in single component symmetry");
1438 std::map<std::string,utility::vector1<Size> >
const &
1440 if(
components_.size()==0) utility_exit_with_message(
"function not for use in single component symmetry");
1443 std::pair<Size,Size>
const &
1445 if(
components_.size()==0) utility_exit_with_message(
"function not for use in single component symmetry");
1447 utility_exit_with_message(
std::string(
"no symmetry component ")+c);
1453 if(
components_.size()==0) utility_exit_with_message(
"function not for use in single component symmetry");
1455 utility_exit_with_message(
std::string(
"no symmetry component ")+c);
1461 if(
components_.size()==0) utility_exit_with_message(
"function not for use in single component symmetry");
1463 utility_exit_with_message(
std::string(
"no symmetry component ")+c);
1469 if(
components_.size()==0) utility_exit_with_message(
"function not for use in single component symmetry");
1471 utility_exit_with_message(
std::string(
"no symmetry component for residue "));
1475 char component = i->first;
1476 Size lower = i->second.first;
1477 Size upper = i->second.second;
1479 if( lower <= irindep && irindep <= upper )
return component;
1481 utility_exit_with_message(
std::string(
"no symmetry component for residue "));
1486 if(
components_.size()==0) utility_exit_with_message(
"function not for use in single component symmetry");
1488 utility_exit_with_message(
std::string(
"no symmetry component for ")+vname);
1494 if(
components_.size()==0) utility_exit_with_message(
"function not for use in single component symmetry");
1496 utility_exit_with_message(
std::string(
"no symmetry component for ")+jname);
1502 if(
components_.size()==0) utility_exit_with_message(
"function not for use in single component symmetry");
1504 utility_exit_with_message(
std::string(
"no symmetry component for ")+jname);
1513 std::map<
char,std::pair<Size,Size> >
const & component_bounds,
1514 std::map<std::string,char>
const & name2component,