MELDOpenMMPlugin
MeldForce.h
1 /*
2  Copyright 2015 by Justin MacCallum, Alberto Perez, Ken Dill
3  All rights reserved
4 */
5 
6 #ifndef OPENMM_MELD_FORCE_H_
7 #define OPENMM_MELD_FORCE_H_
8 
9 #include "openmm/Force.h"
10 #include "openmm/Vec3.h"
11 #include "internal/windowsExportMeld.h"
12 #include <map>
13 #include <vector>
14 
15 namespace MeldPlugin {
16 
21 class OPENMM_EXPORT_MELD MeldForce : public OpenMM::Force {
22 
23 public:
27  MeldForce();
28 
40  void updateParametersInContext(OpenMM::Context& context);
41 
45  int getNumDistRestraints() const;
46 
50  int getNumHyperbolicDistRestraints() const;
51 
55  int getNumTorsionRestraints() const;
56 
60  int getNumDistProfileRestraints() const;
61 
65  int getNumDistProfileRestParams() const;
66 
70  int getNumTorsProfileRestraints() const;
71 
75  int getNumTorsProfileRestParams() const;
76 
80  int getNumTotalRestraints() const;
81 
85  int getNumGroups() const;
86 
90  int getNumCollections() const;
91 
106  void getDistanceRestraintParams(int index, int& atom1, int& atom2, float& r1, float& r2, float& r3,
107  float& r4, float& forceConstant, int& globalIndex) const;
108 
125  void getHyperbolicDistanceRestraintParams(int index, int& atom1, int& atom2, float& r1, float& r2, float& r3,
126  float& r4, float& forceConstant, float& asymptote, int& globalIndex) const;
141  void getTorsionRestraintParams(int index, int& atom1, int& atom2, int& atom3, int&atom4,
142  float& phi, float& deltaPhi, float& forceConstant, int& globalIndex) const;
143 
158  void getDistProfileRestraintParams(int index, int& atom1, int& atom2, float& rMin, float & rMax,
159  int& nBins, std::vector<double>& a0, std::vector<double>& a1, std::vector<double>& a2,
160  std::vector<double>& a3, float& scaleFactor, int& globalIndex) const;
161 
179  void getTorsProfileRestraintParams(int index, int& atom1, int& atom2, int& atom3, int& atom4,
180  int& atom5, int& atom6, int& atom7, int& atom8, int& nBins,
181  std::vector<double>& a0, std::vector<double>& a1, std::vector<double>& a2,
182  std::vector<double>& a3, std::vector<double>& a4, std::vector<double>& a5,
183  std::vector<double>& a6, std::vector<double>& a7, std::vector<double>& a8,
184  std::vector<double>& a9, std::vector<double>& a10, std::vector<double>& a11,
185  std::vector<double>& a12, std::vector<double>& a13, std::vector<double>& a14,
186  std::vector<double>& a15, float& scaleFactor, int& globalIndex) const;
187 
195  void getGroupParams(int index, std::vector<int>& indices, int& numActive) const;
196 
204  void getCollectionParams(int index, std::vector<int>& indices, int& numActive) const;
205 
231  int addDistanceRestraint(int particle1, int particle2, float r1, float r2, float r3, float r4,
232  float force_constant);
233 
247  void modifyDistanceRestraint(int index, int particle1, int particle2, float r1, float r2, float r3,
248  float r4, float force_constant);
249 
280  int addHyperbolicDistanceRestraint(int particle1, int particle2, float r1, float r2, float r3, float r4,
281  float force_constant, float asymptote);
282 
297  void modifyHyperbolicDistanceRestraint(int index, int particle1, int particle2, float r1, float r2, float r3,
298  float r4, float force_constant, float asymptote);
299 
321  int addTorsionRestraint(int atom1, int atom2, int atom3, int atom4, float phi, float deltaPhi, float forceConstant);
322 
336  void modifyTorsionRestraint(int index, int atom1, int atom2, int atom3, int atom4, float phi,
337  float deltaPhi, float forceConstant);
338 
359  int addDistProfileRestraint(int atom1, int atom2, float rMin, float rMax, int nBins, std::vector<double> a0,
360  std::vector<double> a1, std::vector<double> a2, std::vector<double> a3, float scaleFactor);
361 
375  void modifyDistProfileRestraint(int index, int atom1, int atom2, float rMin, float rMax, int nBins,
376  std::vector<double> a0, std::vector<double> a1, std::vector<double> a2, std::vector<double> a3,
377  float scaleFactor);
378 
395  int addTorsProfileRestraint(int atom1, int atom2, int atom3, int atom4,
396  int atom5, int atom6, int atom7, int atom8, int nBins,
397  std::vector<double> a0, std::vector<double> a1, std::vector<double> a2,
398  std::vector<double> a3, std::vector<double> a4, std::vector<double> a5,
399  std::vector<double> a6, std::vector<double> a7, std::vector<double> a8,
400  std::vector<double> a9, std::vector<double> a10, std::vector<double> a11,
401  std::vector<double> a12, std::vector<double> a13, std::vector<double> a14,
402  std::vector<double> a15, float scaleFactor);
403 
420  void modifyTorsProfileRestraint(int index, int atom1, int atom2, int atom3, int atom4,
421  int atom5, int atom6, int atom7, int atom8, int nBins,
422  std::vector<double> a0, std::vector<double> a1, std::vector<double> a2,
423  std::vector<double> a3, std::vector<double> a4, std::vector<double> a5,
424  std::vector<double> a6, std::vector<double> a7, std::vector<double> a8,
425  std::vector<double> a9, std::vector<double> a10, std::vector<double> a11,
426  std::vector<double> a12, std::vector<double> a13, std::vector<double> a14,
427  std::vector<double> a15, float scaleFactor);
428 
436  int addGroup(std::vector<int> restraint_indices, int n_active);
437 
445  int addCollection(std::vector<int> group_indices, int n_active);
446 
447 protected:
448  OpenMM::ForceImpl* createImpl() const;
449 
450 private:
451  class TorsionRestraintInfo;
452  class DistanceRestraintInfo;
453  class HyperbolicDistanceRestraintInfo;
454  class DistProfileRestraintInfo;
455  class TorsProfileRestraintInfo;
456  class GroupInfo;
457  class CollectionInfo;
458  int n_restraints;
459  std::vector<DistanceRestraintInfo> distanceRestraints;
460  std::vector<HyperbolicDistanceRestraintInfo> hyperbolicDistanceRestraints;
461  std::vector<TorsionRestraintInfo> torsions;
462  std::vector<DistProfileRestraintInfo> distProfileRestraints;
463  std::vector<TorsProfileRestraintInfo> torsProfileRestraints;
464  std::vector<GroupInfo> groups;
465  std::vector<CollectionInfo> collections;
466 
467  class DistanceRestraintInfo {
468  public:
469  int particle1, particle2;
470  float r1, r2, r3, r4, force_constant;
471  int global_index;
472 
473  DistanceRestraintInfo() {
474  particle1 = particle2 = -1;
475  force_constant = 0.0;
476  r1 = r2 = r3 = r4 = 0.0;
477  global_index = -1;
478  }
479 
480  DistanceRestraintInfo(int particle1, int particle2, float r1, float r2, float r3, float r4,
481  float force_constant, int global_index) : particle1(particle1), particle2(particle2), r1(r1),
482  r2(r2), r3(r3), r4(r4), force_constant(force_constant),
483  global_index(global_index) {
484  }
485  };
486 
487  class HyperbolicDistanceRestraintInfo {
488  public:
489  int particle1, particle2;
490  float r1, r2, r3, r4, force_constant, asymptote;
491  int global_index;
492 
493  HyperbolicDistanceRestraintInfo() {
494  particle1 = particle2 = -1;
495  force_constant = 0.0;
496  r1 = r2 = r3 = r4 = asymptote = 0.0;
497  global_index = -1;
498  }
499 
500  HyperbolicDistanceRestraintInfo(int particle1, int particle2, float r1, float r2, float r3, float r4,
501  float force_constant, float asymptote, int global_index) : particle1(particle1), particle2(particle2), r1(r1),
502  r2(r2), r3(r3), r4(r4), force_constant(force_constant),
503  asymptote(asymptote), global_index(global_index) {
504  }
505  };
506 
507  class TorsionRestraintInfo {
508  public:
509  int atom1, atom2, atom3, atom4;
510  float phi, deltaPhi, forceConstant;
511  int globalIndex;
512 
513  TorsionRestraintInfo() {
514  atom1 = atom2 = atom3 = atom4 = -1;
515  phi = 0;
516  deltaPhi = 0;
517  forceConstant = 0;
518  globalIndex = -1;
519  }
520 
521  TorsionRestraintInfo(int atom1, int atom2, int atom3, int atom4, float phi, float deltaPhi,
522  float forceConstant, int globalIndex) :
523  atom1(atom1), atom2(atom2), atom3(atom3), atom4(atom4), phi(phi), deltaPhi(deltaPhi),
524  forceConstant(forceConstant), globalIndex(globalIndex) {
525  }
526  };
527 
528  class DistProfileRestraintInfo {
529  public:
530  int atom1, atom2, nBins;
531  float rMin, rMax, scaleFactor;
532  std::vector<double> a0;
533  std::vector<double> a1;
534  std::vector<double> a2;
535  std::vector<double> a3;
536  int globalIndex;
537 
538  DistProfileRestraintInfo() {
539  atom1 = atom2 = -1;
540  nBins = 0;
541  rMin = rMax = scaleFactor = -1.0;
542  globalIndex = -1;
543  }
544 
545  DistProfileRestraintInfo(int atom1, int atom2, float rMin, float rMax, int nBins,
546  std::vector<double> a0, std::vector<double> a1, std::vector<double> a2,
547  std::vector<double> a3, float scaleFactor, int globalIndex) :
548  atom1(atom1), atom2(atom2), nBins(nBins), rMin(rMin), rMax(rMax), scaleFactor(scaleFactor),
549  globalIndex(globalIndex), a0(a0), a1(a1), a2(a2), a3(a3) {
550  }
551  };
552 
553  class TorsProfileRestraintInfo {
554  public:
555  int atom1, atom2, atom3, atom4, atom5, atom6, atom7, atom8, nBins, globalIndex;
556  float scaleFactor;
557  std::vector<double> a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15;
558 
559  TorsProfileRestraintInfo() {
560  atom1 = atom2 = atom3 = atom4 = atom5 = atom6 = atom7 = atom8 = nBins = globalIndex = -1;
561  scaleFactor = 0;
562  }
563 
564  TorsProfileRestraintInfo(int atom1, int atom2, int atom3, int atom4,
565  int atom5, int atom6, int atom7, int atom8, int nBins,
566  std::vector<double> a0, std::vector<double> a1, std::vector<double> a2,
567  std::vector<double> a3, std::vector<double> a4, std::vector<double> a5,
568  std::vector<double> a6, std::vector<double> a7, std::vector<double> a8,
569  std::vector<double> a9, std::vector<double> a10, std::vector<double> a11,
570  std::vector<double> a12, std::vector<double> a13, std::vector<double> a14,
571  std::vector<double> a15, float scaleFactor, int globalIndex) :
572  atom1(atom1), atom2(atom2), atom3(atom3), atom4(atom4),
573  atom5(atom5), atom6(atom6), atom7(atom7), atom8(atom8), nBins(nBins),
574  a0(a0), a1(a1), a2(a2), a3(a3), a4(a4), a5(a5), a6(a6), a7(a7),
575  a8(a8), a9(a9), a10(a10), a11(a11), a12(a12), a13(a13), a14(a14), a15(a15),
576  scaleFactor(scaleFactor), globalIndex(globalIndex) {
577  }
578  };
579 
580  class GroupInfo {
581  public:
582  std::vector<int> restraint_indices;
583  int n_active;
584 
585  GroupInfo(): n_active(0) {
586  }
587 
588  GroupInfo(std::vector<int> restraint_indices, int n_active):
589  restraint_indices(restraint_indices), n_active(n_active) {
590  }
591  };
592 
593  class CollectionInfo {
594  public:
595  std::vector<int> group_indices;
596  int n_active;
597 
598  CollectionInfo(): n_active(0) {
599  }
600 
601  CollectionInfo(std::vector<int> group_indices, int n_active) :
602  group_indices(group_indices), n_active(n_active) {
603  }
604  };
605 };
606 
607 } // namespace MeldPlugin
608 
609 #endif /*OPENMM_MELD_FORCE_H_*/
Definition: MeldForceImpl.h:17
This is the MELD Force.
Definition: MeldForce.h:21