00001 /********************************************************************** 00002 tetraplanar.h - OBTetraPlanarStereo 00003 00004 Copyright (C) 2009 by Tim Vandermeersch 00005 00006 This file is part of the Open Babel project. 00007 For more information, see <http://openbabel.org/> 00008 00009 This program is free software; you can redistribute it and/or modify 00010 it under the terms of the GNU General Public License as published by 00011 the Free Software Foundation; either version 2 of the License, or 00012 (at your option) any later version. 00013 00014 This program is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 GNU General Public License for more details. 00018 00019 You should have received a copy of the GNU General Public License 00020 along with this program; if not, write to the Free Software 00021 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 00022 02110-1301, USA. 00023 **********************************************************************/ 00024 #ifndef OB_TETRAPLANAR_H 00025 #define OB_TETRAPLANAR_H 00026 00027 #include "stereo.h" 00028 #include <algorithm> // std::rotate 00029 00030 namespace OpenBabel { 00031 00083 class OBAPI OBTetraPlanarStereo : public OBStereoBase 00084 { 00085 public: 00086 OBTetraPlanarStereo(OBMol *mol); 00087 virtual ~OBTetraPlanarStereo(); 00088 00089 template <typename ConfigType> 00090 static ConfigType ToConfig(const ConfigType &cfg, unsigned long start, 00091 OBStereo::Shape shape = OBStereo::ShapeU) 00092 { 00093 ConfigType result = cfg; 00094 result.shape = shape; 00095 00096 // convert from U/Z/4 to U shape 00097 switch (cfg.shape) { 00098 case OBStereo::ShapeU: 00099 break; 00100 case OBStereo::ShapeZ: 00101 OBStereo::Permutate(result.refs, 2, 3); // convert to U shape 00102 break; 00103 case OBStereo::Shape4: 00104 OBStereo::Permutate(result.refs, 1, 2); // convert to U shape 00105 break; 00106 } 00107 00108 00109 // since refs are U shaped we can rotate the refs lexicographically 00110 for (int i = 0; i < 4; ++i) { 00111 std::rotate(result.refs.begin(), result.refs.begin() + 1, result.refs.end()); 00112 // start at refs[0]? 00113 if (result.refs.at(0) == start) 00114 break; 00115 } 00116 00117 // convert from U to desired U/Z/4 00118 // (don't change refs[0]!) 00119 switch (shape) { 00120 case OBStereo::ShapeU: 00121 break; 00122 case OBStereo::ShapeZ: 00123 OBStereo::Permutate(result.refs, 2, 3); // convert to Z shape 00124 break; 00125 case OBStereo::Shape4: 00126 OBStereo::Permutate(result.refs, 1, 2); // convert to 4 shape 00127 break; 00128 } 00129 00130 return result; 00131 } 00132 00133 }; 00134 00135 } 00136 00137 #endif 00138
This file is part of the documentation for Open Babel, version 2.3.