| 1 | /********************************************************************** | 
| 2 | transform.cpp - Perform command-line requested transformations | 
| 3 |  | 
| 4 | Copyright (C) 2004-2005 by Chris Morley | 
| 5 |  | 
| 6 | This file is part of the Open Babel project. | 
| 7 | For more information, see <http://openbabel.sourceforge.net/> | 
| 8 |  | 
| 9 | This program is free software; you can redistribute it and/or modify | 
| 10 | it under the terms of the GNU General Public License as published by | 
| 11 | the Free Software Foundation version 2 of the License. | 
| 12 |  | 
| 13 | This program is distributed in the hope that it will be useful, | 
| 14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| 16 | GNU General Public License for more details. | 
| 17 | ***********************************************************************/ | 
| 18 |  | 
| 19 | #include "mol.hpp" | 
| 20 | #include <iostream> | 
| 21 |  | 
| 22 | using namespace std; | 
| 23 | namespace OpenBabel | 
| 24 | { | 
| 25 |  | 
| 26 | OBBase* OBMol::DoTransformations(const std::map<std::string, std::string>* pOptions) | 
| 27 | { | 
| 28 | // Perform any requested transformations | 
| 29 | // on a OBMol | 
| 30 | //The input map has option letters or name as the key and | 
| 31 | //any associated text as the value. | 
| 32 | //For normal(non-filter) transforms: | 
| 33 | // returns a pointer to the OBMol (this) if ok or NULL if not. | 
| 34 | //For filters returns a pointer to the OBMol (this) if there is a  match, | 
| 35 | //and NULL when not and in addition the OBMol object is deleted NULL. | 
| 36 |  | 
| 37 | //This is now a virtual function. The OBBase version just returns the OBMol pointer. | 
| 38 | //This is declared in mol.h | 
| 39 |  | 
| 40 | //The filter options, s and v allow a obgrep facility. | 
| 41 | //Used together they must both be true to allow a molecule through. | 
| 42 |  | 
| 43 | //Parse GeneralOptions | 
| 44 | if(pOptions->empty()) | 
| 45 | return this; | 
| 46 |  | 
| 47 | int ret=1; | 
| 48 | bool smatch=true, vmatch=true; | 
| 49 |  | 
| 50 | map<string,string>::const_iterator itr; | 
| 51 |  | 
| 52 | if(pOptions->find("b")!=pOptions->end()) | 
| 53 | ret=ConvertDativeBonds(); | 
| 54 |  | 
| 55 | if(pOptions->find("d")!=pOptions->end()) | 
| 56 | ret=DeleteHydrogens(); | 
| 57 |  | 
| 58 | if(pOptions->find("h")!=pOptions->end()) | 
| 59 | ret=AddHydrogens(false, false); | 
| 60 |  | 
| 61 | if(pOptions->find("p")!=pOptions->end()) | 
| 62 | ret=AddHydrogens(false, true); | 
| 63 |  | 
| 64 | if(pOptions->find("c")!=pOptions->end()) | 
| 65 | { | 
| 66 | Center(); | 
| 67 | ret=1; | 
| 68 | } | 
| 69 |  | 
| 70 | itr = pOptions->find("addtotitle"); //Appends text to title | 
| 71 | if(itr!=pOptions->end()) | 
| 72 | { | 
| 73 | string title(GetTitle()); | 
| 74 | title += itr->second; | 
| 75 | SetTitle(title.c_str()); | 
| 76 | ret=1; | 
| 77 | } | 
| 78 |  | 
| 79 | itr = pOptions->find("v"); | 
| 80 | if(itr!=pOptions->end()) | 
| 81 | { | 
| 82 | //inverse match quoted SMARTS string which follows | 
| 83 | OBSmartsPattern sp; | 
| 84 | sp.Init(itr->second); | 
| 85 | vmatch = !sp.Match(*this); //(*pmol) ; | 
| 86 | } | 
| 87 |  | 
| 88 | itr = pOptions->find("s"); | 
| 89 | if(itr!=pOptions->end()) | 
| 90 | { | 
| 91 | //match quoted SMARTS string which follows | 
| 92 | OBSmartsPattern sp; | 
| 93 | sp.Init(itr->second.c_str()); | 
| 94 | smatch = sp.Match(*this); //(*pmol) ; | 
| 95 | } | 
| 96 |  | 
| 97 | if(!smatch || !vmatch) | 
| 98 | { | 
| 99 | //filter failed: delete OBMol and return NULL | 
| 100 | delete this; | 
| 101 | return NULL; | 
| 102 | } | 
| 103 | else | 
| 104 | return ret ? this : NULL; | 
| 105 | } | 
| 106 |  | 
| 107 | /////////////////////////////////////////////////// | 
| 108 | const char* OBMol::ClassDescription() | 
| 109 | { | 
| 110 | return "For conversions of molecules\n \ | 
| 111 | Additional options :\n \ | 
| 112 | -d Delete Hydrogens\n \ | 
| 113 | -h Add Hydrogens\n \ | 
| 114 | -p Add Hydrogens appropriate for pH\n \ | 
| 115 | -b Convert dative bonds e.g.[N+]([O-])=O to N(=O)=O\n \ | 
| 116 | -c Center Coordinates\n \ | 
| 117 | -j Join all input molecules into a single output molecule\n \ | 
| 118 | -s\"smarts\" Convert only molecules matching SMARTS:\n \ | 
| 119 | -v\"smarts\" Convert only molecules NOT matching SMARTS:\n\n" ; | 
| 120 | } | 
| 121 |  | 
| 122 | } //namespace OpenBabel | 
| 123 |  | 
| 124 | //! \file transform.cpp | 
| 125 | //! \brief Perform command-line requested transformations for OBMol | 
| 126 | //!  and SMARTS filtering |