NAMD
GroupRestraintsParam.C
Go to the documentation of this file.
1 #include "GroupRestraintsParam.h"
2 #include "InfoStream.h"
3 #include "strlib.h"
4 
6  groupNameDefined = false;
7  restraintForceDefined = false;
8  group1RefPositionDefined = false;
9  restraintCenterDefined = false;
10  groupName = NULL;
11  group1Idx.clear();
12  group2Idx.clear();
13  restraintExp = 2;
14  restraintForce = 0.0;
15  group1RefPosition = 0.0;
16  restraintDir = 1.0;
17  restraintCenter = 0.0;
18  useDistanceMagnitude = false;
19 }
20 
22  if (groupName) delete [] groupName;
23 }
24 
27  char err_msg[512]; // Buffer for error message
28  char buffer[512]; // Buffer for file reading
29 
30  if(group1Idx.size()) {
31  group1Idx.clear();
32  sprintf(err_msg, "Group restraints: Redefining existing group 1 indices for %s!\n",
33  groupName);
34  iout << iWARN << err_msg << "\n" << endi;
35  }
36 
37  if (! fileName) {
38  sprintf(err_msg, "Group restraints: No group 1 restraint file is defined for '%s'!\n", groupName);
39  NAMD_die(err_msg);
40  }
41 
42  FILE *file = fopen(fileName, "r");
43  if (!file) {
44  sprintf(err_msg, "Group restraints: Unable to open group 1 restraint file '%s'!\n", fileName);
45  NAMD_die(err_msg);
46  } else {
47  iout << iINFO << "Reading group 1 restraint file " << fileName << " for group " <<
48  groupName << "\n" << endi;
49  }
50 
51  while (true) {
52  int index;
53  int badLine = 0;
54  int return_code = 0;
55  do {
56  return_code = NAMD_read_line(file, buffer, 512);
57  } while ( (return_code == 0) && (NAMD_blank_string(buffer)) );
58 
59  if (return_code) {
60  break;
61  }
62  if (sscanf(buffer, "%d", &index) != 1) {
63  sprintf(err_msg, "Group restraints: Bad line in group 1 restraint file '%s': %s!\n", fileName, buffer);
64  NAMD_die(err_msg);
65  } else {
66  group1Idx.push_back(index);
67  }
68  }
69  fclose(file);
70 }
71 
74  char err_msg[512]; // Buffer for error message
75  char buffer[512]; // Buffer for file reading
76 
77  if(group2Idx.size()) {
78  group2Idx.clear();
79  sprintf(err_msg, "Group restraints: Redefining existing group 2 indices for %s!\n",
80  groupName);
81  iout << iWARN << err_msg << "\n" << endi;
82  }
83 
84  if (! fileName) {
85  sprintf(err_msg, "Group restraints: No group 2 restraint file is defined for '%s'!\n", groupName);
86  NAMD_die(err_msg);
87  }
88 
89  FILE *file = fopen(fileName, "r");
90  if (!file) {
91  sprintf(err_msg, "Group restraints: Unable to open group 2 restraint file '%s'!\n", fileName);
92  NAMD_die(err_msg);
93  } else {
94  iout << iINFO << "Reading group 2 restraint file " << fileName << " for group " <<
95  groupName << "\n" << endi;
96  }
97 
98  while (true) {
99  int index;
100  int badLine = 0;
101  int return_code = 0;
102  do {
103  return_code = NAMD_read_line(file, buffer, 512);
104  } while ( (return_code == 0) && (NAMD_blank_string(buffer)) );
105 
106  if (return_code) {
107  break;
108  }
109  if (sscanf(buffer, "%d", &index) != 1) {
110  sprintf(err_msg, "Group restraints: Bad line in group 2 restraint file '%s': %s!\n", fileName, buffer);
111  NAMD_die(err_msg);
112  } else {
113  group2Idx.push_back(index);
114  }
115  }
116  fclose(file);
117 }
118 
121  char err_msg[512]; // Buffer for error message
122  int index, numRead;
123  int i = 0;
124 
125  if(group1Idx.size()) {
126  group1Idx.clear();
127  sprintf(err_msg, "Group restraints: Redefining existing group 1 restraint indices for %s!\n",
128  groupName);
129  iout << iWARN << err_msg << "\n" << endi;
130  }
131 
132  // Get the length of string
133  int strLength = strlen(list);
134  // Read the index and advance the number of read char
135  // until we reach to the end of it
136  while (i < strLength) {
137  if(sscanf(list,"%d%n", &index, &numRead) != 1) {
138  sprintf(err_msg, "Group restraints: Bad line in group 1 restraint list for '%s': %s!\n",
139  groupName, list);
140  NAMD_die(err_msg);
141  } else {
142  list += numRead + 1;
143  i += numRead + 1;
144  group1Idx.push_back(index);
145  }
146  }
147 }
148 
151  char err_msg[512]; // Buffer for error message
152  int index, numRead;
153  int i = 0;
154 
155  if(group2Idx.size()) {
156  group2Idx.clear();
157  sprintf(err_msg, "Group restraints: Redefining existing group 2 restraint indices for %s!\n",
158  groupName);
159  iout << iWARN << err_msg << "\n" << endi;
160  }
161 
162  // Get the length of string
163  int strLength = strlen(list);
164  // Read the index and advance the number of read char
165  // until we reach to the end of it
166  while (i < strLength) {
167  if(sscanf(list,"%d%n", &index, &numRead) != 1) {
168  sprintf(err_msg, "Group restraints: Bad line in group 2 restraint list for '%s': %s!\n",
169  groupName, list);
170  NAMD_die(err_msg);
171  } else {
172  list += numRead + 1;
173  i += numRead + 1;
174  group2Idx.push_back(index);
175  }
176  }
177 }
178 
180 void GroupRestraintParam::SetGroupName(const char *name) {
181  char err_msg[512]; // Buffer for error message
182  if (groupName) {
183  sprintf(err_msg, "Group restraints: Redefining existing group restraint name from %s to %s!\n",
184  groupName, name);
185  NAMD_die(err_msg);
186  } else {
187  groupNameDefined = true;
188  int nameLength = strlen(name);
189  groupName = new char[nameLength + 1];
190  strncpy(groupName, name, nameLength + 1);
191  }
192 }
193 
196  char err_msg[512]; // Buffer for error message
197  if (restraintForceDefined) {
198  sprintf(err_msg, "Group restraints: Redefining restraint force for %s!\n",
199  groupName);
200  iout << iWARN << err_msg << "\n" << endi;
201  }
202  restraintForce = force;
203  restraintForceDefined = true;
204 }
205 
207 void GroupRestraintParam::SetExponent(const int exponent) {
208  restraintExp = exponent;
209 }
210 
213  char err_msg[512]; // Buffer for error message
214  if (group1RefPositionDefined) {
215  sprintf(err_msg, "Group restraints: Redefining group 1 reference COM position for %s!\n",
216  groupName);
217  iout << iWARN << err_msg << "\n" << endi;
218  }
219 
220  if(group1RefPosition.set(vec)) {
221  group1RefPositionDefined = true;
222  } else {
223  sprintf(err_msg, "Group restraints: Bad reference COM position for %s: { %s }. %s\n",
224  groupName, vec, "Expect a {x y z} vector.");
225  NAMD_die(err_msg);
226  }
227 }
228 
230 void GroupRestraintParam::SetResCenter(const char *vec) {
231  char err_msg[512]; // Buffer for error message
232  if (restraintCenterDefined) {
233  sprintf(err_msg, "Group restraints: Redefining restraint center for %s!\n",
234  groupName);
235  iout << iWARN << err_msg << "\n" << endi;
236  }
237 
238  if(restraintCenter.set(vec)) {
239  restraintCenterDefined = true;
240  } else {
241  sprintf(err_msg, "Group restraints: Bad restraint center value for %s: { %s }. %s\n",
242  groupName, vec, "Expect a {x y z} vector.");
243  NAMD_die(err_msg);
244  }
245 }
246 
248 void GroupRestraintParam::SetResDirection(const char *status, const int component) {
249  // Only modify the resDir if we turn off the specific component
250  // because the default behaviour is that we apply restraint in
251  // all direction
252  BigReal value = this->CheckStatus<BigReal>(status);
253 
254  switch (component) {
255  case 0 :
256  restraintDir.x = value;
257  break;
258  case 1 :
259  restraintDir.y = value;
260  break;
261  case 2 :
262  restraintDir.z = value;
263  break;
264  default :
265  NAMD_die("Group restraints: Unknown vector component in SetResDirection function! \n");
266  }
267 }
268 
271  useDistanceMagnitude = this->CheckStatus<bool>(status);
272 }
273 
276  char err_msg[512];
277 
278  if (!groupNameDefined) {
279  sprintf(err_msg, "Group restraints: Key or tag name is not defined!\n");
280  NAMD_die(err_msg);
281  }
282 
283  if (!restraintForceDefined) {
284  sprintf(err_msg, "Group restraints: Restraint Force constant is not defined for %s!\n", groupName);
285  NAMD_die(err_msg);
286  }
287 
288  if (!restraintCenterDefined) {
289  sprintf(err_msg, "Group restraints: Restraint center is not defined for %s!\n", groupName);
290  NAMD_die(err_msg);
291  }
292 
293  if (!(restraintExp > 0)) {
294  sprintf(err_msg, "Group restraints: Restraint exponent must be positive value for %s!\n", groupName);
295  NAMD_die(err_msg);
296  }
297 
298  if (restraintExp % 2) {
299  sprintf(err_msg, "Group restraints: Restraint exponent must be an even number for %s!\n", groupName);
300  NAMD_die(err_msg);
301  }
302 
303  if (!(restraintForce > 0)) {
304  sprintf(err_msg, "Group restraints: Restraint Force constant must be positive value for %s!\n", groupName);
305  NAMD_die(err_msg);
306  }
307 
308  if (!group1RefPositionDefined && !group1Idx.size()) {
309  sprintf(err_msg, "Group restraints: Either reference COM position or atom indices for group 1 must be defined for %s!\n", groupName);
310  NAMD_die(err_msg);
311  }
312 
313  if (group1RefPositionDefined && group1Idx.size()) {
314  sprintf(err_msg, "Group restraints: Reference COM position and atom indices for group 1 cannot be defined together for %s!\n", groupName);
315  NAMD_die(err_msg);
316  }
317 
318  if (!(group2Idx.size())) {
319  sprintf(err_msg, "Group restraints: No atom is defined for group 2 to be restrained for %s!\n", groupName);
320  NAMD_die(err_msg);
321  }
322 
323  if (!(restraintDir.length2())) {
324  sprintf(err_msg, "Group restraints: At least one component of restraint distance "
325  "must be selected for %s!\n", groupName);
326  NAMD_die(err_msg);
327  }
328 }
329 
332  iout << iINFO << "GROUP RESTRAINT KEY " << groupName << "\n" << endi;
333  if (useDistanceMagnitude) {
334  iout << iINFO << " RESTRAINT DISTANCE MAGNITUDE " << "ACTIVE\n" << endi;
335  iout << iINFO << " RESTRAINT CENTER " << restraintCenter.length() << "\n" << endi;
336  } else {
337  iout << iINFO << " RESTRAINT DISTANCE VECTOR " << "ACTIVE\n" << endi;
338  iout << iINFO << " RESTRAINT CENTER " << restraintCenter << "\n" << endi;
339  }
340  iout << iINFO << " RESTRAINT FORCE " << restraintForce << "\n" << endi;
341  iout << iINFO << " RESTRAINT EXPONENT " << restraintExp << "\n" << endi;
342  iout << iINFO << " RESTRAINT COMPONENT X " << (restraintDir.x ? "YES" : "NO") << "\n" << endi;
343  iout << iINFO << " RESTRAINT COMPONENT Y " << (restraintDir.y ? "YES" : "NO") << "\n" << endi;
344  iout << iINFO << " RESTRAINT COMPONENT Z " << (restraintDir.z ? "YES" : "NO") << "\n" << endi;
345  iout << iINFO << " RESTRAINED ATOMS IN GROUP 2 " << group2Idx.size() << "\n" << endi;
346  if (group1RefPositionDefined) {
347  iout << iINFO << " COM REF. POSITION IN GROUP 1 " << group1RefPosition << "\n" << endi;
348  } else {
349  iout << iINFO << " RESTRAINED ATOMS IN GROUP 1 " << group1Idx.size() << "\n" << endi;
350  }
351 }
352 
354 template<typename Type>
355 Type GroupRestraintParam::CheckStatus(const char *status) const {
356  Type state = static_cast<Type>(1);
357  if (0 == strcasecmp(status, "no") ||
358  0 == strcasecmp(status, "off") ||
359  0 == strcasecmp(status, "false")) {
360  state = static_cast<Type>(0);
361  } else if (0 == strcasecmp(status, "yes") ||
362  0 == strcasecmp(status, "on") ||
363  0 == strcasecmp(status, "true")) {
364  state = static_cast<Type>(1);
365  } else {
366  char err_msg[512];
367  sprintf(err_msg, "Group restraints: Unknown status keyword '%s'!"
368  " Options are: no, off, false, yes, on, true.\n", status);
369  NAMD_die(err_msg);
370  }
371  return state;
372 }
373 
374 // ###########################################################################
375 // # GroupRestraintList functions
376 // ###########################################################################
377 
379  for (auto it = groupRestraints.begin(); it != groupRestraints.end(); ++it) {
380  delete it->second;
381  }
382 }
383 
385 void GroupRestraintList::SetGroup1AtomFileIndices(const char *groupTag, const char *fileName) {
386  GroupRestraintParam *resParam = FindGroupRestraint(groupTag);
387  resParam->SetGroup1AtomFileIndices(fileName);
388 }
389 
391 void GroupRestraintList::SetGroup1AtomListIndices(const char *groupTag, const char *list) {
392  GroupRestraintParam *resParam = FindGroupRestraint(groupTag);
393  resParam->SetGroup1AtomListIndices(list);
394 }
395 
397 void GroupRestraintList::SetGroup1RefPosition(const char *groupTag, const char *vec) {
398  GroupRestraintParam *resParam = FindGroupRestraint(groupTag);
399  resParam->SetGroup1RefPosition(vec);
400 }
401 
403 void GroupRestraintList::SetGroup2AtomFileIndices(const char *groupTag, const char *fileName) {
404  GroupRestraintParam *resParam = FindGroupRestraint(groupTag);
405  resParam->SetGroup2AtomFileIndices(fileName);
406 }
407 
409 void GroupRestraintList::SetGroup2AtomListIndices(const char *groupTag, const char *list) {
410  GroupRestraintParam *resParam = FindGroupRestraint(groupTag);
411  resParam->SetGroup2AtomListIndices(list);
412 }
413 
415 void GroupRestraintList::SetResCenter(const char *groupTag, const char *vec) {
416  GroupRestraintParam *resParam = FindGroupRestraint(groupTag);
417  resParam->SetResCenter(vec);
418 }
419 
421 void GroupRestraintList::SetForce(const char *groupTag, const BigReal force) {
422  GroupRestraintParam *resParam = FindGroupRestraint(groupTag);
423  resParam->SetForce(force);
424 }
425 
427 void GroupRestraintList::SetExponent(const char *groupTag, const int exponent) {
428  GroupRestraintParam *resParam = FindGroupRestraint(groupTag);
429  resParam->SetExponent(exponent);
430 }
431 
433 void GroupRestraintList::SetResDirectionX(const char *groupTag, const char *status) {
434  GroupRestraintParam *resParam = FindGroupRestraint(groupTag);
435  resParam->SetResDirection(status, 0);
436 }
437 
439 void GroupRestraintList::SetResDirectionY(const char *groupTag, const char *status) {
440  GroupRestraintParam *resParam = FindGroupRestraint(groupTag);
441  resParam->SetResDirection(status, 1);
442 }
443 
445 void GroupRestraintList::SetResDirectionZ(const char *groupTag, const char *status) {
446  GroupRestraintParam *resParam = FindGroupRestraint(groupTag);
447  resParam->SetResDirection(status, 2);
448 }
449 
451 void GroupRestraintList::SetUseDistMagnitude(const char *groupTag, const char *status){
452  GroupRestraintParam *resParam = FindGroupRestraint(groupTag);
453  resParam->SetUseDistMagnitude(status);
454 }
455 
458  for (auto it = groupRestraints.begin(); it != groupRestraints.end(); ++it) {
459  it->second->CheckParam();
460  }
461 }
462 
465  for (auto it = groupRestraints.begin(); it != groupRestraints.end(); ++it) {
466  it->second->PrintSummary();
467  }
468 }
469 
472 GroupRestraintParam* GroupRestraintList::FindGroupRestraint(const char *tag) {
473  std::string groupName(tag);
474  auto it = groupRestraints.find(groupName);
475  if (it == groupRestraints.end()) {
476  GroupRestraintParam *resParam = new GroupRestraintParam();
477  resParam->SetGroupName(tag);
478  groupRestraints.insert(std::make_pair(groupName, resParam));
479  return groupRestraints.find(groupName)->second;
480  } else {
481  return it->second;
482  }
483 }
std::ostream & iINFO(std::ostream &s)
Definition: InfoStream.C:81
void SetExponent(const int exponent)
void SetGroup2AtomListIndices(const char *groupTag, const char *list)
int NAMD_read_line(FILE *fd, char *buf, int bufsize)
Definition: strlib.C:38
void SetResCenter(const char *groupTag, const char *vec)
std::ostream & endi(std::ostream &s)
Definition: InfoStream.C:54
BigReal z
Definition: Vector.h:74
void SetForce(const BigReal force)
std::ostream & iWARN(std::ostream &s)
Definition: InfoStream.C:82
#define iout
Definition: InfoStream.h:51
void SetResDirectionY(const char *groupTag, const char *status)
void SetGroup1AtomFileIndices(const char *groupTag, const char *fileName)
void SetGroup1AtomListIndices(const char *list)
void SetGroup2AtomFileIndices(const char *fileName)
void SetResDirectionX(const char *groupTag, const char *status)
void SetGroup2AtomFileIndices(const char *groupTag, const char *fileName)
NAMD_HOST_DEVICE BigReal length(void) const
Definition: Vector.h:202
int NAMD_blank_string(char *str)
Definition: strlib.C:222
void SetResCenter(const char *vec)
void SetGroup2AtomListIndices(const char *list)
void SetResDirectionZ(const char *groupTag, const char *status)
void SetGroupName(const char *name)
NAMD_HOST_DEVICE BigReal length2(void) const
Definition: Vector.h:206
BigReal x
Definition: Vector.h:74
void SetForce(const char *groupTag, const BigReal force)
void NAMD_die(const char *err_msg)
Definition: common.C:147
Bool set(const char *s)
Definition: Vector.h:261
void SetGroup1RefPosition(const char *groupTag, const char *vec)
BigReal y
Definition: Vector.h:74
void SetResDirection(const char *status, const int component)
void SetUseDistMagnitude(const char *groupTag, const char *status)
void SetGroup1RefPosition(const char *vec)
void SetGroup1AtomFileIndices(const char *fileName)
void SetUseDistMagnitude(const char *status)
void SetExponent(const char *groupTag, const int exponent)
double BigReal
Definition: common.h:123
void SetGroup1AtomListIndices(const char *groupTag, const char *list)