OpenStructure
Loading...
Searching...
No Matches
gromacs_block_modifiers.hh
Go to the documentation of this file.
1//------------------------------------------------------------------------------
2// This file is part of the OpenStructure project <www.openstructure.org>
3//
4// Copyright (C) 2008-2020 by the OpenStructure authors
5//
6// This library is free software; you can redistribute it and/or modify it under
7// the terms of the GNU Lesser General Public License as published by the Free
8// Software Foundation; either version 3.0 of the License, or (at your option)
9// any later version.
10// This library is distributed in the hope that it will be useful, but WITHOUT
11// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
13// details.
14//
15// You should have received a copy of the GNU Lesser General Public License
16// along with this library; if not, write to the Free Software Foundation, Inc.,
17// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18//------------------------------------------------------------------------------
19
20#ifndef OST_MM_GROMCACS_BLOCK_MODIFIERS_HH
21#define OST_MM_GROMCACS_BLOCK_MODIFIERS_HH
22
23
24#include <boost/shared_ptr.hpp>
25
26#include <ost/message.hh>
31#include <ost/mol/xcs_editor.hh>
32#include <ost/geom/vec3.hh>
35
36
37namespace ost{ namespace mol{ namespace mm{
38
39class GromacsHydrogenConstructor;
40class GromacsTerminiConstructor;
41class GromacsBlockModifier;
42
43typedef boost::shared_ptr<GromacsHydrogenConstructor> GromacsHydrogenConstructorPtr;
44typedef boost::shared_ptr<GromacsTerminiConstructor> GromacsTerminiConstructorPtr;
45typedef boost::shared_ptr<GromacsBlockModifier> GromacsBlockModifierPtr;
46
48
49public:
50 static std::vector<geom::Vec3> EvaluatePosRule(int rule, int number,
51 const std::vector<geom::Vec3>& anchors);
52};
53
55
56public:
57
59
61
63
64 void AddHydrogenRule(uint number, int method,
65 const std::vector<String>& hydrogen_names,
66 const std::vector<String>& anchors);
67
68 // GET STUFF (for data extraction)
69 uint GetNumHydrogenRules() const { return add_number_.size(); }
70 // all getters for idx < GetNumHydrogenRules()
71 int GetHydrogenRuleNumber(uint idx) const { return add_number_[idx]; }
72 int GetHydrogenRuleMethod(uint idx) const { return methods_[idx]; }
73 const std::vector<String>&
74 GetHydrogenRuleNames(uint idx) const { return hydrogen_names_[idx]; }
75 const std::vector<String>&
76 GetHydrogenRuleAnchors(uint idx) const { return anchor_atom_names_[idx]; }
77
78 virtual void OnSave(ost::io::BinaryDataSink& ds) { ds << *this; }
79
81
82 template <typename DS>
83 void Serialize(DS& ds){
84 int num_hydrogen_add_rules = add_number_.size();
85 ds & num_hydrogen_add_rules;
86
87 if(ds.IsSource()){
88 add_number_ = std::vector<int>(num_hydrogen_add_rules);
89 methods_ = std::vector<int>(num_hydrogen_add_rules);
90 hydrogen_names_ = std::vector<std::vector<String> >(num_hydrogen_add_rules);
91 anchor_atom_names_ = std::vector<std::vector<String> >(num_hydrogen_add_rules);
92 }
93
94 for(int i = 0; i < num_hydrogen_add_rules; ++i){
95 ds & add_number_[i];
96 ds & methods_[i];
97 int num_hydrogen_names = hydrogen_names_[i].size();
98 int num_anchor_names = anchor_atom_names_[i].size();
99 ds & num_hydrogen_names;
100 ds & num_anchor_names;
101 if(ds.IsSource()){
102 hydrogen_names_[i] = std::vector<String>(num_hydrogen_names);
103 anchor_atom_names_[i] = std::vector<String>(num_anchor_names);
104 }
105
106 for(int j = 0; j < num_hydrogen_names; ++j){
107 ds & hydrogen_names_[i][j];
108 }
109 for(int j = 0; j < num_anchor_names; ++j){
110 ds & anchor_atom_names_[i][j];
111 }
112 }
113 }
114
115private:
116 std::vector<int> add_number_;
117 std::vector<int> methods_;
118 std::vector<std::vector<String> > hydrogen_names_;
119 std::vector<std::vector<String> > anchor_atom_names_;
120};
121
122
124
125public:
126
128
130
132
133 void AddReplaceRule(const String& name, const String& new_name,
134 const String& new_type, Real new_charge);
135
136 void AddAddRule(int number, int method,
137 const std::vector<String>& atom_names,
138 const std::vector<String>& anchors,
139 const String& type, Real charge);
140
141 void AddBond(InteractionPtr p) { this->CheckInteractionToAdd(p,"BOND");
142 bonds_.push_back(p); }
143
144 void AddAngle(InteractionPtr p) { this->CheckInteractionToAdd(p,"ANGLE");
145 angles_.push_back(p); }
146
147 void AddDihedral(InteractionPtr p) { this->CheckInteractionToAdd(p,"DIHEDRAL");
148 dihedrals_.push_back(p); }
149
150 void AddImproper(InteractionPtr p) { this->CheckInteractionToAdd(p,"IMPROPER");
151 impropers_.push_back(p); }
152
153 void AddCMap(InteractionPtr p) { this->CheckInteractionToAdd(p,"CMAP");
154 cmaps_.push_back(p); }
155
156 void AddDeleteAtom(const String& atom_name) { delete_atom_names_.push_back(atom_name); }
157
158 // GET STUFF (for data extraction)
159 const std::vector<InteractionPtr>& GetBonds() const { return bonds_; }
160 const std::vector<InteractionPtr>& GetAngles() const { return angles_; }
161 const std::vector<InteractionPtr>& GetDihedrals() const { return dihedrals_; }
162 const std::vector<InteractionPtr>& GetImpropers() const { return impropers_; }
163 const std::vector<InteractionPtr>& GetCmaps() const { return cmaps_; }
164 const std::vector<String>& GetDeleteAtoms() const { return delete_atom_names_; }
165 // all idx for replace rules < GetNumReplaceRules()
166 uint GetNumReplaceRules() const { return replace_old_atom_name_.size(); }
167 const String& GetReplaceRuleName(uint idx) const {
168 return replace_old_atom_name_[idx];
169 }
171 return replace_new_atom_name_[idx];
172 }
174 return replace_new_atom_type_[idx];
175 }
177 return replace_new_charge_[idx];
178 }
179 // all idx for add rules < GetNumAddRules()
180 uint GetNumAddRules() const { return add_add_number_.size(); }
181 int GetAddRuleNumber(uint idx) const { return add_add_number_[idx]; }
182 int GetAddRuleMethod(uint idx) const { return add_methods_[idx]; }
183 const std::vector<String>&
184 GetAddRuleNames(uint idx) const { return add_atom_names_[idx]; }
185 const std::vector<String>&
186 GetAddRuleAnchors(uint idx) const { return add_anchor_atom_names_[idx]; }
187 const String& GetAddRuleType(uint idx) const { return add_atom_types_[idx]; }
188 Real GetAddRuleCharge(uint idx) const { return add_charges_[idx]; }
189
190 virtual void OnSave(ost::io::BinaryDataSink& ds) { ds << *this; }
191
193
194 template <typename DS>
195 void Serialize(DS& ds){
196
197 int num_bonds = bonds_.size();
198 int num_angles = angles_.size();
199 int num_dihedrals = dihedrals_.size();
200 int num_impropers = impropers_.size();
201 int num_cmaps = cmaps_.size();
202
203 ds & num_bonds;
204 ds & num_angles;
205 ds & num_dihedrals;
206 ds & num_impropers;
207 ds & num_cmaps;
208
209 for(int i = 0; i < num_bonds; ++i){
210 int func_type;
211 if(ds.IsSource()){
212 ds & func_type;
213 bonds_.push_back(InteractionPtr(new Interaction(FuncType(func_type))));
214 }
215 else{
216 func_type = bonds_[i]->GetFuncType();
217 ds & func_type;
218 }
219 ds & *(bonds_[i]);
220 }
221
222 for(int i = 0; i < num_angles; ++i){
223 int func_type;
224 if(ds.IsSource()){
225 ds & func_type;
226 angles_.push_back(InteractionPtr(new Interaction(FuncType(func_type))));
227 }
228 else{
229 func_type = angles_[i]->GetFuncType();
230 ds & func_type;
231 }
232 ds & *(angles_[i]);
233 }
234
235 for(int i = 0; i < num_dihedrals; ++i){
236 int func_type;
237 if(ds.IsSource()){
238 ds & func_type;
239 dihedrals_.push_back(InteractionPtr(new Interaction(FuncType(func_type))));
240 }
241 else{
242 func_type = dihedrals_[i]->GetFuncType();
243 ds & func_type;
244 }
245 ds & *(dihedrals_[i]);
246 }
247
248 for(int i = 0; i < num_impropers; ++i){
249 int func_type;
250 if(ds.IsSource()){
251 ds & func_type;
252 impropers_.push_back(InteractionPtr(new Interaction(FuncType(func_type))));
253 }
254 else{
255 func_type = impropers_[i]->GetFuncType();
256 ds & func_type;
257 }
258 ds & *(impropers_[i]);
259 }
260
261 for(int i = 0; i < num_cmaps; ++i){
262 int func_type;
263 if(ds.IsSource()){
264 ds & func_type;
265 cmaps_.push_back(InteractionPtr(new Interaction(FuncType(func_type))));
266 }
267 else{
268 func_type = cmaps_[i]->GetFuncType();
269 ds & func_type;
270 }
271 ds & *(cmaps_[i]);
272 }
273
274 int num_replace_atoms = replace_old_atom_name_.size();
275 ds & num_replace_atoms;
276
277 if(ds.IsSource()){
278 replace_old_atom_name_ = std::vector<String>(num_replace_atoms);
279 replace_new_atom_name_ = std::vector<String>(num_replace_atoms);
280 replace_new_atom_type_ = std::vector<String>(num_replace_atoms);
281 replace_new_charge_ = std::vector<Real>(num_replace_atoms);
282 }
283
284 for(int i = 0; i < num_replace_atoms; ++i){
285 ds & replace_old_atom_name_[i];
286 ds & replace_new_atom_name_[i];
287 ds & replace_new_atom_type_[i];
288 ds & replace_new_charge_[i];
289 }
290
291 int num_add_atoms = add_add_number_.size();
292 ds & num_add_atoms;
293
294 if(ds.IsSource()){
295 add_add_number_ = std::vector<int>(num_add_atoms);
296 add_methods_ = std::vector<int>(num_add_atoms);
297 add_atom_names_ = std::vector<std::vector<String> >(num_add_atoms);
298 add_anchor_atom_names_ = std::vector<std::vector<String> >(num_add_atoms);
299 add_atom_types_ = std::vector<String>(num_add_atoms);
300 add_charges_ = std::vector<Real>(num_add_atoms);
301 }
302
303 for(int i = 0; i < num_add_atoms; ++i){
304 ds & add_add_number_[i];
305 ds & add_methods_[i];
306 ds & add_atom_types_[i];
307 ds & add_charges_[i];
308 int num_add_atom_names = add_atom_names_[i].size();
309 int num_add_anchor_atom_names = add_anchor_atom_names_[i].size();
310 ds & num_add_atom_names;
311 ds & num_add_anchor_atom_names;
312 if(ds.IsSource()){
313 add_atom_names_[i] = std::vector<String>(num_add_atom_names);
314 add_anchor_atom_names_[i] = std::vector<String>(num_add_anchor_atom_names);
315 }
316 for(int j = 0; j < num_add_atom_names; ++j){
317 ds & add_atom_names_[i][j];
318 }
319 for(int j = 0; j < num_add_anchor_atom_names; ++j){
320 ds & add_anchor_atom_names_[i][j];
321 }
322 }
323
324 int num_delete_atoms = delete_atom_names_.size();
325 ds & num_delete_atoms;
326 if(ds.IsSource()){
327 delete_atom_names_ = std::vector<String>(num_delete_atoms);
328 }
329 for(int i = 0; i < num_delete_atoms; ++i){
330 ds & delete_atom_names_[i];
331 }
332 }
333
334private:
335
336 void CheckInteractionToAdd(InteractionPtr p, const String& interaction_type) const;
337
338 //Atoms, that will be added to the building block
339
340 //Interactions, that will be added to the building block
341 std::vector<InteractionPtr> bonds_;
342 std::vector<InteractionPtr> angles_;
343 std::vector<InteractionPtr> dihedrals_;
344 std::vector<InteractionPtr> impropers_;
345 std::vector<InteractionPtr> cmaps_;
346
347 //paramters we need for the replace statement
348 std::vector<String> replace_old_atom_name_;
349 std::vector<String> replace_new_atom_name_;
350 std::vector<String> replace_new_atom_type_;
351 std::vector<Real> replace_new_charge_;
352
353 //parameters we need for the add statement => gromacs dependent rules!
354 std::vector<int> add_add_number_;
355 std::vector<int> add_methods_;
356 std::vector<std::vector<String> > add_atom_names_;
357 std::vector<std::vector<String> > add_anchor_atom_names_;
358 std::vector<String> add_atom_types_;
359 std::vector<Real> add_charges_;
360
361 //parameters we need for the delete statement
362 std::vector<String> delete_atom_names_;
363};
364
365
366
367
368}}}
369
370#endif
external coordinate system editor
Definition xcs_editor.hh:36
virtual void OnSave(ost::io::BinaryDataSink &ds)
void AddDeleteAtom(const String &atom_name)
virtual void ApplyOnBuildingBlock(BuildingBlockPtr p)
const String & GetReplaceRuleName(uint idx) const
const std::vector< InteractionPtr > & GetImpropers() const
const std::vector< String > & GetAddRuleNames(uint idx) const
const std::vector< InteractionPtr > & GetDihedrals() const
const std::vector< String > & GetDeleteAtoms() const
const String & GetReplaceRuleNewName(uint idx) const
const std::vector< InteractionPtr > & GetCmaps() const
void AddAddRule(int number, int method, const std::vector< String > &atom_names, const std::vector< String > &anchors, const String &type, Real charge)
const std::vector< String > & GetAddRuleAnchors(uint idx) const
virtual void ApplyOnResidue(ost::mol::ResidueHandle &res, ost::mol::XCSEditor &ed)
const std::vector< InteractionPtr > & GetAngles() const
void AddReplaceRule(const String &name, const String &new_name, const String &new_type, Real new_charge)
virtual BlockModifierType GetBlockModifierType()
const String & GetReplaceRuleNewType(uint idx) const
const std::vector< InteractionPtr > & GetBonds() const
const String & GetAddRuleType(uint idx) const
virtual void OnSave(ost::io::BinaryDataSink &ds)
const std::vector< String > & GetHydrogenRuleNames(uint idx) const
virtual void ApplyOnResidue(ost::mol::ResidueHandle &res, ost::mol::XCSEditor &ed)
void AddHydrogenRule(uint number, int method, const std::vector< String > &hydrogen_names, const std::vector< String > &anchors)
virtual void ApplyOnBuildingBlock(BuildingBlockPtr)
const std::vector< String > & GetHydrogenRuleAnchors(uint idx) const
static std::vector< geom::Vec3 > EvaluatePosRule(int rule, int number, const std::vector< geom::Vec3 > &anchors)
unsigned int uint
Definition base.hh:29
float Real
Definition base.hh:44
std::string String
Definition base.hh:54
boost::shared_ptr< BuildingBlock > BuildingBlockPtr
boost::shared_ptr< GromacsBlockModifier > GromacsBlockModifierPtr
boost::shared_ptr< Interaction > InteractionPtr
boost::shared_ptr< GromacsHydrogenConstructor > GromacsHydrogenConstructorPtr
boost::shared_ptr< GromacsTerminiConstructor > GromacsTerminiConstructorPtr
Definition base.dox:1