@@ -463,6 +463,15 @@ def _splitForces_nb(self):
463
463
forces [nb_data [0 ][n ]] = [nb_data [1 ][n ], nb_data [2 ][n ], nb_data [3 ][n ]]
464
464
self .nonbond = forces
465
465
466
+ def _splitForces_dihedrals (self ):
467
+ #Custom Dihedrals
468
+ dihedrals_data = self .data ['dihedrals' ]
469
+ n_forces = len (dihedrals_data [3 ])
470
+ forces = {}
471
+ for n in range (n_forces ):
472
+ forces [dihedrals_data [3 ][n ]] = [dihedrals_data [0 ][n ], dihedrals_data [1 ][n ], dihedrals_data [2 ][n ]]
473
+ self .dihedrals = forces
474
+
466
475
def _customSmogForce (self , name , data ):
467
476
#first set the equation
468
477
contacts_ff = CustomBondForce (data [0 ])
@@ -488,6 +497,31 @@ def _customSmogForce(self, name, data):
488
497
contacts_ff .setForceGroup (self .forceCount )
489
498
self .forceCount += 1
490
499
500
+ def _customSmogForce_cd (self , name , data ):
501
+ #first set the equation
502
+ dihedrals_ff = CustomTorsionForce (data [0 ])
503
+
504
+ #second set the number of variable
505
+ for pars in data [1 ]:
506
+ dihedrals_ff .addPerTorsionParameter (pars )
507
+
508
+ #third, apply the bonds from each pair of atoms and the related variables.
509
+ pars = [pars for pars in data [1 ]]
510
+
511
+ for iteraction in data [2 ]:
512
+ atom_index_i = int (iteraction ['i' ])- 1
513
+ atom_index_j = int (iteraction ['j' ])- 1
514
+ atom_index_k = int (iteraction ['k' ])- 1
515
+ atom_index_l = int (iteraction ['l' ])- 1
516
+ parameters = [float (iteraction [k ]) for k in pars ]
517
+
518
+ dihedrals_ff .addTorsion (atom_index_i , atom_index_j , atom_index_k , atom_index_l , parameters )
519
+
520
+ self .forcesDict [name ] = dihedrals_ff
521
+ dihedrals_ff .setForceGroup (self .forceCount )
522
+ self .forceCount += 1
523
+
524
+
491
525
def _customSmogForce_nb (self , name , data ):
492
526
#first set the equation
493
527
nonbond_ff = CustomNonbondedForce (data [0 ])
@@ -710,6 +744,41 @@ def import_xml2OpenSMOG(file_xml):
710
744
xml_data ['nonbond' ]= [NonBond_Num ,NBExpression ,NBExpressionParameters ,NBParameters ]
711
745
else :
712
746
self .nonbond_present = False
747
+
748
+
749
+ ## Custom Dihedrals
750
+ CDForce_Names = []
751
+ CDExpression = []
752
+ CDParameters = []
753
+ ijkl = []
754
+
755
+ self .dihedrals_present = False
756
+ if root .find ('dihedrals' ) == None :
757
+ print ('''
758
+ Only dihedrals contribution in the top file will be added
759
+ ''' )
760
+ else :
761
+ self .dihedrals_present = True
762
+ dihedrals_xml = root .find ('dihedrals' )
763
+ for i in range (len (dihedrals_xml )):
764
+ for name in dihedrals_xml [i ].iter ('dihedrals_type' ):
765
+ CDForce_Names .append (name .attrib ['name' ])
766
+
767
+ for expr in dihedrals_xml [i ].iter ('expression' ):
768
+ CDExpression .append (expr .attrib ['expr' ])
769
+
770
+ CDinternal_Param = []
771
+ for par in dihedrals_xml [i ].iter ('parameter' ):
772
+ CDinternal_Param .append (par .text )
773
+ CDParameters .append (CDinternal_Param )
774
+
775
+ internal_ijkl = []
776
+ for atoms_ijkl in dihedrals_xml [i ].iter ('interaction' ):
777
+ internal_ijkl .append (atoms_ijkl .attrib )
778
+ ijkl .append (internal_ijkl )
779
+
780
+ xml_data ['dihedrals' ]= [CDExpression ,CDParameters ,ijkl ,CDForce_Names ]
781
+
713
782
return xml_data
714
783
715
784
if not (self .forceApplied ):
@@ -725,6 +794,13 @@ def import_xml2OpenSMOG(file_xml):
725
794
print ("Creating Contacts force {:} from xml file" .format (force ))
726
795
self ._customSmogForce (force , self .contacts [force ])
727
796
self .system .addForce (self .forcesDict [force ])
797
+
798
+ if self .dihedrals_present == True :
799
+ self ._splitForces_dihedrals ()
800
+ for force in self .dihedrals :
801
+ print ("Creating Dihedrals force {:} from xml file" .format (force ))
802
+ self ._customSmogForce_cd (force , self .dihedrals [force ])
803
+ self .system .addForce (self .forcesDict [force ])
728
804
729
805
if self .nonbond_present == True :
730
806
self ._splitForces_nb ()
0 commit comments