23 #include <numeric/conversions.hh>
26 #include <basic/Tracer.hh>
28 #include <utility/vector1.hh>
42 static basic::Tracer
tr(
"core.chemical");
62 Size pos( name.find( nconn_tag ) );
63 if ( pos < name.size() ) {
84 bool const rebuild_icoor_xyz(
true );
91 using numeric::conversions::radians;
92 std::istringstream l( line );
93 std::string tag, atom1, atom2, atom3, atom4, atom_name, atom_type_name, mm_atom_type_name, property;
94 Real charge, mean, sdev, radius;
97 if ( l.fail() || tag[0] ==
'#' )
return 0;
98 if ( tag ==
"ADD_ATOM" ) {
99 if ( line.size() < 25 )
return 0;
100 atom_name = line.substr( 9,4); l >> tag;
102 l >> mm_atom_type_name;
104 if ( l.fail() )
return 0;
105 return new AddAtom( atom_name, atom_type_name, mm_atom_type_name, charge );
106 }
else if ( tag ==
"DELETE_ATOM" ) {
108 if ( l.fail() )
return 0;
110 }
else if ( tag ==
"SET_BACKBONE_HEAVYATOM" ) {
112 if ( l.fail() )
return 0;
114 }
else if ( tag ==
"SET_IO_STRING" ) {
116 if ( line.size() < 19 )
return 0;
117 std::string const three_letter_code( line.substr(14,3) ), one_letter_code( line.substr(18,1) );
118 return new SetIO_String( three_letter_code, one_letter_code[0] );
119 }
else if ( tag ==
"NBR_ATOM" ) {
121 if ( l.fail() )
return 0;
123 }
else if ( tag ==
"NBR_RADIUS" ) {
127 }
else if ( tag ==
"ADD_PROPERTY" ) {
129 if ( l.fail() )
return 0;
131 }
else if ( tag ==
"DELETE_PROPERTY" ) {
133 if ( l.fail() )
return 0;
137 }
else if ( tag ==
"ADD_CHI" ) {
138 l >> chino >> atom1 >> atom2 >> atom3 >> atom4;
139 if ( l.fail() )
return 0;
140 return new AddChi( chino, atom1, atom2, atom3, atom4 );
143 }
else if ( tag ==
"ADD_PROTON_CHI") {
144 Size chino, nsamples, nextra_samples;
150 for (
Size ii = 1; ii <= nsamples; ++ii ) {
156 for (
Size ii = 1; ii <= nextra_samples; ++ii ) {
157 l >> extra_samples[ ii ];
159 if ( l.fail() )
return 0;
160 return new AddProtonChi( chino, samples, extra_samples );
162 }
else if ( tag ==
"REDEFINE_CHI" ) {
163 l >> chino >> atom1 >> atom2 >> atom3 >> atom4;
164 if ( l.fail() )
return 0;
165 return new RedefineChi( chino, atom1, atom2, atom3, atom4 );
168 }
else if ( tag ==
"ADD_CHI_ROTAMER" ) {
169 l >> chino >> mean >> sdev;
170 if ( l.fail() )
return 0;
174 }
else if ( tag ==
"ADD_BOND" ) {
176 if ( l.fail() )
return 0;
177 return new AddBond( atom1, atom2 );
178 }
else if ( tag ==
"ADD_CONNECT" ) {
181 if ( l.fail() )
return 0;
184 return new AddConnect( connect_atom, 0.0, 0.0, 0.0, connect_atom, connect_atom, connect_atom );
188 l >> phi >> theta >> d >> parent_atom >> angle_atom >> torsion_atom;
189 if ( l.fail() || tag !=
"ICOOR" ) {
190 utility_exit_with_message(
"bad line in patchfile: "+line );
192 return new AddConnect( connect_atom, radians(phi), radians(theta), d, parent_atom, angle_atom, torsion_atom );
194 }
else if ( tag ==
"SET_ATOM_TYPE" ) {
195 l >> atom_name >> atom_type_name;
196 if ( l.fail() )
return 0;
197 return new SetAtomType( atom_name, atom_type_name );
198 }
else if ( tag ==
"SET_MM_ATOM_TYPE" ) {
199 l >> atom_name >> mm_atom_type_name;
200 if ( l.fail() )
return 0;
202 }
else if ( tag ==
"SET_ATOMIC_CHARGE" ) {
203 l >> atom_name >> charge;
204 if ( l.fail() )
return 0;
206 }
else if ( tag ==
"SET_POLYMER_CONNECT" ) {
207 l >> tag >> atom_name;
208 if ( l.fail() )
return 0;
210 }
else if ( tag ==
"SET_ICOOR" ) {
213 l >> atom_name >> phi >> theta >> d >> stub1 >> stub2 >> stub3;
214 if ( l.fail() )
return 0;
215 return new SetICoor( atom_name, radians(phi), radians(theta), d, stub1, stub2, stub3 );
216 }
else if ( tag ==
"PREPEND_MAINCHAIN_ATOM" ) {
219 }
else if ( tag ==
"APPEND_MAINCHAIN_ATOM" ) {
222 }
else if ( tag ==
"NCAA_ROTLIB_PATH" ) {
227 else if ( tag ==
"SET_NBR_ATOM") {
229 if ( l.fail() )
return 0;
232 else if ( tag ==
"SET_NBR_RADIUS") {
234 if ( l.fail() )
return 0;
237 else if ( tag ==
"SET_ORIENT_ATOM") {
239 if ( tag ==
"NBR" ) {
241 }
else if ( tag ==
"DEFAULT" ) {
244 tr.Warning <<
"Unknown SET_ORIENT ATOM tag: " << tag << std::endl;
248 tr.Warning <<
"patch_operation_from_patch_file_line: bad line: " << line << std::endl;