16 #include <utility/vector1.hh>
17 #include <utility/string_util.hh>
18 #include <numeric/xyz.functions.hh>
19 #include <ObjexxFCL/string.functions.hh>
20 #include <numeric/conversions.hh>
21 #include <numeric/constants.hh>
22 #include <numeric/NumericTraits.hh>
24 namespace ObjexxFCL {
namespace fmt { } }
using namespace ObjexxFCL::fmt;
31 using namespace ObjexxFCL;
32 using namespace ObjexxFCL::fmt;
39 left_justify( trimmed_name ); trim( trimmed_name );
55 if(
restype_->actcoord_atoms().size() != 0){
64 if(!atmtype.is_virtual()){
78 for (
Size ii = 1; ii <=
restype_->actcoord_atoms().size(); ++ii )
82 new_action.x() /=
restype_->actcoord_atoms().size();
83 new_action.y() /=
restype_->actcoord_atoms().size();
84 new_action.z() /=
restype_->actcoord_atoms().size();
97 pi_orbital_xyz_vector.push_back((xyz_left.normalized() *
AOdist_) +
restype_->atom(atm_index3).ideal_xyz());
98 pi_orbital_xyz_vector.push_back((xyz_right.normalized() *
AOdist_) +
restype_->atom(atm_index3).ideal_xyz());
101 for(
core::Size vector_index = 1; vector_index <= pi_orbital_xyz_vector.size(); ++vector_index){
117 std::cout <<
"WARNING: extremely small distance=" << distance <<
" for " <<
118 p_orbital_element_name <<
" ,using 0.0 for theta and phi."<<
119 " If you were not expecting this warning, something is very wrong" <<std::endl;
122 theta = numeric::angle_radians<core::Real>(pi_orbital_xyz_vector[vector_index],stub1_xyz,stub2_xyz);
123 if( (theta < 1e-2) || (theta > numeric::NumericTraits<Real>::pi()-1e-2) )
128 phi = numeric::dihedral_radians<core::Real>(pi_orbital_xyz_vector[vector_index],stub1_xyz,stub2_xyz,stub3_xyz);
138 std::string const const_name(p_orbital_element_name);
139 restype_->set_orbital_icoor_id( const_name,const_phi,const_theta,distance,stub1,stub2,stub3);
153 if (atmtype.atom_has_orbital()){
155 core::Size atom_type_index = atom_type_set->atom_type_index(atmtype.atom_type_name());
156 core::Size parameter_hybridization = atom_type_set->extra_parameter_index(
"ORBITAL_HYBRIDIZATION");
157 core::Size parameter_orbitaltypes = atom_type_set->extra_parameter_index(
"ORBITAL_TYPES");
158 core::Size parameter_bohrradius = atom_type_set->extra_parameter_index(
"BOHR_RADIUS");
162 Orbtype_ = (
core::Size)( atom_type_set->operator[](atom_type_index).extra_parameter(parameter_orbitaltypes) );
163 AOdist_ = atom_type_set->operator[](atom_type_index).extra_parameter(parameter_bohrradius);
167 if(atmtype.name() ==
"Nhis"){
196 core::Real const theta(numeric::conversions::radians(54.365));
213 restype_->set_orbital_icoor_id( orbital_element_name,phi,theta,
AOdist_,stub1,stub2,stub3);
254 core::Real const theta(numeric::conversions::radians(54.0));
259 restype_->set_orbital_icoor_id( orbital_element_name,phi,theta,
AOdist_,stub1,stub2,stub3);
293 core::Real const theta(numeric::conversions::radians(70.0));
307 restype_->set_orbital_icoor_id( orbital_element_name,phi,theta,
AOdist_,stub1,stub2,stub3);
308 restype_->set_orbital_icoor_id( orbital_element_name2,-phi,theta,
AOdist_,stub1,stub2,stub3);
324 for(
core::Size vector_index = 1; vector_index <= orbital_xyz_vector.size(); ++vector_index){
329 calculate_orbital_icoor(orbital_xyz_vector[vector_index], atm_index, atm_index2,atm_index3, orbital_element_name);
354 for(
core::Size x=1; x<= neighbor_bonded_atms2.size(); ++x){
358 if(
Aindex_ != neighbor_bonded_atms2[x])
360 atm_index3 = neighbor_bonded_atms2[x];
376 for(
core::Size x=1; x<= neighbor_bonded_atms2.size(); ++x){
378 if(
Aindex_ != neighbor_bonded_atms2[x])
380 atm_index3 = neighbor_bonded_atms2[x];
400 for(
core::Size x=1; x<= neighbor_bonded_atms2.size(); ++x){
402 if(
Aindex_ != neighbor_bonded_atms2[x])
404 atm_index3 = neighbor_bonded_atms2[x];
440 pi_orbital_xyz_vector.push_back((xyz_right.normalized() * dist) + restype_->atom(atm_index1).ideal_xyz());
441 pi_orbital_xyz_vector.push_back((xyz_left.normalized() * dist) + restype_->atom(atm_index1).ideal_xyz());
443 return pi_orbital_xyz_vector;
456 for(
core::Size vector_index = 1; vector_index <= orbital_xyz_vectors.size(); ++vector_index){
474 if(hybridization == 1 ){
476 }
else if(hybridization ==2 ){
478 }
else if(hybridization ==3 ){
482 std::string orbital_type_full_name(atm_element+
"."+orbitaltype+
"."+hyb);
483 return orbital_type_full_name;
491 std::string orbital_element_name(orbital_name+orb_index_string);
492 return orbital_element_name;
507 restype_->add_orbital(orbital_element_name, orbital_type_full_name);
508 restype_->add_orbital_bond(atm_name, orbital_element_name);
533 std::cout <<
"WARNING: extremely small distance=" <<
distance <<
" for " <<
534 orbital_element_name <<
" ,using 0.0 for theta and phi."<<
535 " If you were not expecting this warning, something is very wrong" <<std::endl;
538 theta = numeric::angle_radians<core::Real>(orbital_xyz,stub1_xyz,stub2_xyz);
539 if( (theta < 1e-2) || (theta > numeric::NumericTraits<Real>::pi()-1e-2) )
544 phi = numeric::dihedral_radians<core::Real>(orbital_xyz,stub1_xyz,stub2_xyz,stub3_xyz);
554 std::string const const_name(orbital_element_name);
563 restype_->set_orbital_icoor_id( const_name,const_phi,const_theta,
distance,stub1,stub2,stub3);
583 core::Real angle_xab = numeric::constants::r::pi_over_3;
592 core::Real dihedral_xabc1 = numeric::constants::r::pi;
602 v1 - v2 * std::sin(dihedral_xabc1) + v3 * std::cos(dihedral_xabc1)
609 v1 - v2 * std::sin(dihedral_xabc2) + v3 * std::cos(dihedral_xabc2)
623 orbital_xyz_vector.push_back(vector_a+x1);
624 orbital_xyz_vector.push_back(vector_a+x2);
627 return orbital_xyz_vector;
650 ( ( vector_a - vector_b).normalized()
651 + ( vector_a - vector_c).normalized() + ( vector_a - vector_d).normalized()).normalized() * dist
655 orbital_xyz_vector.push_back(vector_a+x);
657 return orbital_xyz_vector;