From 59dc0e8f6d4acadb8abd970a4b460385e2750278 Mon Sep 17 00:00:00 2001 From: recombinatrix Date: Fri, 21 Feb 2025 10:56:50 +1100 Subject: [PATCH 1/2] error message hotfix --- polyconf/polyconf/Polymer.py | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/polyconf/polyconf/Polymer.py b/polyconf/polyconf/Polymer.py index f123f79..2ceca0b 100644 --- a/polyconf/polyconf/Polymer.py +++ b/polyconf/polyconf/Polymer.py @@ -192,9 +192,6 @@ def extend(self, monomer, n, nn, names, joins, ortho=[1,1,1], any dummy atoms. """ - # TODO I renamed the atoms in the manuscript, so I guess I gotta fix that here - # cool. - # love that for me. Q = self.polymer.select_atoms(f"resid {n} and name {names['Q']}").positions[-1] S = self.polymer.select_atoms(f"resid {n} and name {names['S']}").positions[-1] @@ -238,14 +235,6 @@ def extend(self, monomer, n, nn, names, joins, ortho=[1,1,1], u_r2 = u_r1.atoms.rotateby(theta,axis=k,point=V1) - # R= u_.select_atoms('resid '+str(nn)+' and name '+names['R']).positions[0] - # S= u_.select_atoms('resid '+str(nn)+' and name '+names['S']).positions[0] - # RS=S-R - # RS_n=np.linalg.norm(RS) - # ortho_n=np.linalg.norm(ortho) - # check = degrees(np.arccos(np.dot(RS,ortho)/(RS_n * ortho_n))) - # if abs(check)>1: print('linear check =' ,check) - u_r1=u_r2 # combine extended polymer into new universe @@ -421,7 +410,6 @@ def dihedral_solver(self,pairlist,dummies='X*',cutoff=0.7,backwards_only=True): resolved and no clashes detected :rtype: bool """ - # TODO stepback isn't working right, it's not stepping back far enough steps=len(pairlist) tries={x:0 for x in range(0,steps)} # how many steps around the dihedral have we tried? resets to zero if you step backwards fails={x:0 for x in range(0,steps)} # how many times have we had to step backwards at this monomer? the more times, the further back we step @@ -461,7 +449,7 @@ def dihedral_solver(self,pairlist,dummies='X*',cutoff=0.7,backwards_only=True): done=True if failed or i<0: # hard coded to detect failure if you stop at i<=0 because detecting this automatically wasn't working print('Could not reach a valid conformation') - print('Perhaps you should try building a pseudolinear geometry with .extend(linearize=True) or randomising all dihedrals with shuffler(), and then try solving a conformation again') + print('Perhaps you should try building a pseudolinear geometry with .extend(linearise=True) or randomising a subset of the dihedrals with shuffler(), and then try solving a conformation again') return True else: return False From a3cd16ab31284113038a17ea902ef114edd77849 Mon Sep 17 00:00:00 2001 From: recombinatrix Date: Fri, 21 Feb 2025 11:04:37 +1100 Subject: [PATCH 2/2] make scripts executable --- .../01a_build_PEI_with_extend.py | 0 .../01b_build_PEI_with_linear_extend.py | 0 polyconf_examples/01c_build_PEI_then_solve.py | 0 .../01d_build_PEI_conformation.py | 0 .../01e_build_PEI_conformation_ensemble.py | 0 polyconf_examples/02a_build_PMMA_isotactic.py | 0 .../02b_build_PMMA_syndiotactic.py | 0 polyconf_examples/02c_build_PMMA_atactic.py | 2 + ...d_build_PMMA_atactic_with_linear_extend.py | 0 polyconf_examples/03_build_branched_PEI.py | 0 .../04_build_randomly_branched_PEI.py | 0 polyconf_examples/build_PMMA.py | 232 ------------------ 12 files changed, 2 insertions(+), 232 deletions(-) mode change 100644 => 100755 polyconf_examples/01a_build_PEI_with_extend.py mode change 100644 => 100755 polyconf_examples/01b_build_PEI_with_linear_extend.py mode change 100644 => 100755 polyconf_examples/01c_build_PEI_then_solve.py mode change 100644 => 100755 polyconf_examples/01d_build_PEI_conformation.py mode change 100644 => 100755 polyconf_examples/01e_build_PEI_conformation_ensemble.py mode change 100644 => 100755 polyconf_examples/02a_build_PMMA_isotactic.py mode change 100644 => 100755 polyconf_examples/02b_build_PMMA_syndiotactic.py mode change 100644 => 100755 polyconf_examples/02c_build_PMMA_atactic.py mode change 100644 => 100755 polyconf_examples/02d_build_PMMA_atactic_with_linear_extend.py mode change 100644 => 100755 polyconf_examples/03_build_branched_PEI.py mode change 100644 => 100755 polyconf_examples/04_build_randomly_branched_PEI.py delete mode 100644 polyconf_examples/build_PMMA.py diff --git a/polyconf_examples/01a_build_PEI_with_extend.py b/polyconf_examples/01a_build_PEI_with_extend.py old mode 100644 new mode 100755 diff --git a/polyconf_examples/01b_build_PEI_with_linear_extend.py b/polyconf_examples/01b_build_PEI_with_linear_extend.py old mode 100644 new mode 100755 diff --git a/polyconf_examples/01c_build_PEI_then_solve.py b/polyconf_examples/01c_build_PEI_then_solve.py old mode 100644 new mode 100755 diff --git a/polyconf_examples/01d_build_PEI_conformation.py b/polyconf_examples/01d_build_PEI_conformation.py old mode 100644 new mode 100755 diff --git a/polyconf_examples/01e_build_PEI_conformation_ensemble.py b/polyconf_examples/01e_build_PEI_conformation_ensemble.py old mode 100644 new mode 100755 diff --git a/polyconf_examples/02a_build_PMMA_isotactic.py b/polyconf_examples/02a_build_PMMA_isotactic.py old mode 100644 new mode 100755 diff --git a/polyconf_examples/02b_build_PMMA_syndiotactic.py b/polyconf_examples/02b_build_PMMA_syndiotactic.py old mode 100644 new mode 100755 diff --git a/polyconf_examples/02c_build_PMMA_atactic.py b/polyconf_examples/02c_build_PMMA_atactic.py old mode 100644 new mode 100755 index 87b5928..6f4c34f --- a/polyconf_examples/02c_build_PMMA_atactic.py +++ b/polyconf_examples/02c_build_PMMA_atactic.py @@ -51,6 +51,8 @@ dh += [sidechains[i]] print('attempting to solve initial conformation') +print('the random seed in this example script has been chosen specifically so that this process fails') +print('this is expected and is part of the tutorial') PMMA_atactic.dihedral_solver(dh,dummies=dummies,cutoff=1.1) diff --git a/polyconf_examples/02d_build_PMMA_atactic_with_linear_extend.py b/polyconf_examples/02d_build_PMMA_atactic_with_linear_extend.py old mode 100644 new mode 100755 diff --git a/polyconf_examples/03_build_branched_PEI.py b/polyconf_examples/03_build_branched_PEI.py old mode 100644 new mode 100755 diff --git a/polyconf_examples/04_build_randomly_branched_PEI.py b/polyconf_examples/04_build_randomly_branched_PEI.py old mode 100644 new mode 100755 diff --git a/polyconf_examples/build_PMMA.py b/polyconf_examples/build_PMMA.py deleted file mode 100644 index f4efd86..0000000 --- a/polyconf_examples/build_PMMA.py +++ /dev/null @@ -1,232 +0,0 @@ -#!/usr/bin/env python - -from polyconf.Monomer import Monomer -from polyconf.Polymer import Polymer -from polyconf.PDB import PDB -import random - -############################################################################### -# # -# Polymer one: Building an isotactic PMMA polymer # -# # -############################################################################### - -dummies="CMA CN CP CQ" - -PMMA_isotactic=Polymer(Monomer('MMAD_bonds.pdb')) # initialise - -imax=49 # we will lay 49 additional monomers - -for i in range (0,imax): - PMMA_isotactic.extend( # extend with one monomer, aligned along this step's linearization vector - Monomer('MMAD_bonds.pdb'), # extend with this monomer - n=PMMA_isotactic.maxresid(), # extend existing residue i - nn=PMMA_isotactic.newresid(), # incoming monomer will have resid i+1 - names=dict(P1='CA',P2='CMA',Q1='C',Q2='CN',R='CN',S='C'), # C1_i+1 fit to CX_i, then rotate so NX_i+1 fit to N1_i - joins=[('C','CA')],# new connection between N1_i and C1_i+1 - #linearise=True, - #ortho=[1,0,0] - ) - -alkanes=PMMA_isotactic.gen_pairlist(a1='C',a2='CA',first_resid=1,same_res=False,last_resid=49,mult=3) - -Saver = PDB(PMMA_isotactic) -Saver.cleanup() # center in box -Saver.save(dummyAtoms=dummies,fname='PMMA_isotactic_vanilla-extend') # save, excluding dummy atoms - -PMMA_isotactic.dihedral_solver(alkanes,dummy=dummies,cutoff=0.8) # this converts the shuffled conformation into one without overlapping atoms - -Saver = PDB(PMMA_isotactic) -Saver.cleanup() # center in box -Saver.save(dummyAtoms=dummies,fname='PMMA_isotactic_vanilla-solved') # save, excluding dummy atoms - -PMMA_isotactic.shuffler(alkanes) -PMMA_isotactic.dihedral_solver(alkanes,dummy=dummies,cutoff=1.1) # this converts the shuffled conformation into one without overlapping atoms - -Saver = PDB(PMMA_isotactic) -Saver.cleanup() # center in box -Saver.save(dummyAtoms=dummies,fname='PMMA_isotactic_shuffled_and_solved') # save, excluding dummy atoms - - - -############################################################################### -# # -# Polymer two: Building a syndiotactic PMMA polymer with # -# # -############################################################################### - -dummies="CMA CN CP CQ" - -Monomer_D='MMAD_bonds.pdb' -Monomer_L='MMAL_bonds.pdb' -alternator=True - -PMMA_syndiotactic=Polymer(Monomer(Monomer_D)) # initialise - -imax=49 # we will lay 49 additional monomers - -for i in range (0,imax): - if alternator: - monomer=Monomer_L - else: - monomer=Monomer_D - alternator=not alternator - PMMA_syndiotactic.extend( # extend with one monomer, aligned along this step's linearization vector - Monomer(monomer), # extend with this monomer - n=PMMA_syndiotactic.maxresid(), # extend existing residue i - nn=PMMA_syndiotactic.newresid(), # incoming monomer will have resid i+1 - names=dict(P1='CA',P2='CMA',Q1='C',Q2='CN',R='CN',S='C'), # C1_i+1 fit to CX_i, then rotate so NX_i+1 fit to N1_i - joins=[('C','CA')],# new connection between N1_i and C1_i+1 - #linearise=True, - #ortho=[1,0,0] - ) - -Saver = PDB(PMMA_syndiotactic) -Saver.cleanup() # center in box -Saver.save(dummyAtoms=dummies,fname='PMMA_syndiotactic_vanilla-extend') # save, excluding dummy atoms - -alkanes=PMMA_syndiotactic.gen_pairlist(a1='C',a2='CA',first_resid=1,same_res=False,last_resid=49,mult=3) -PMMA_syndiotactic.dihedral_solver(alkanes,dummy=dummies,cutoff=1.1) # this converts the shuffled conformation into one without overlapping atoms - -Saver = PDB(PMMA_syndiotactic) -Saver.cleanup() # center in box -Saver.save(dummyAtoms=dummies,fname='PMMA_syndiotactic_vanilla-solved') # save, excluding dummy atoms - -sidechains=PMMA_syndiotactic.gen_pairlist(a1='CA',a2='CB',first_resid=1,same_res=True,last_resid=50,mult=6) - -PMMA_syndiotactic.shuffler(alkanes) -PMMA_syndiotactic.dihedral_solver(alkanes,dummy=dummies,cutoff=1.1) # this converts the shuffled conformation into one without overlapping atoms -PMMA_syndiotactic.shuffler(sidechains) -PMMA_syndiotactic.dihedral_solver(sidechains,dummy=dummies,cutoff=1.1) # this converts the shuffled conformation into one without overlapping atoms - -Saver = PDB(PMMA_syndiotactic) -Saver.cleanup() # center in box -Saver.save(dummyAtoms=dummies,fname='PMMA_syndiotactic_shuffled_and_solved') # save, excluding dummy atoms - - - - -############################################################################### -# # -# Polymer two: Building an atactic PMMA polymer # -# # -############################################################################### - -dummies="CMA CN CP CQ" - -Monomer_D='MMAD_bonds.pdb' -Monomer_L='MMAL_bonds.pdb' - -composition=25*[Monomer_D] + 25*[Monomer_L] # a list containing 50 monomers, 25 with each taticity -composition = random.sample(composition,len(composition)) # randomise the order of the monomers - - -PMMA_atactic=Polymer(Monomer(composition[0])) # initialise with first monomer - -for monomer in composition[1:]: # extend with the remain 49 monomers - PMMA_atactic.extend( # extend with one monomer, aligned along this step's linearization vector - Monomer(monomer), # extend with this monomer - n=PMMA_atactic.maxresid(), # extend existing residue i - nn=PMMA_atactic.newresid(), # incoming monomer will have resid i+1 - names=dict(P1='CA',P2='CMA',Q1='C',Q2='CN',R='CN',S='C'), # C1_i+1 fit to CX_i, then rotate so NX_i+1 fit to N1_i - joins=[('C','CA')],# new connection between N1_i and C1_i+1 - #linearise=True, - #ortho=[0.5,-1,0] - ) - -Saver = PDB(PMMA_atactic) -Saver.cleanup() # center in box -Saver.save(dummyAtoms=dummies,fname='PMMA_atactic_vanilla-extend') # save, excluding dummy atoms - -alkanes=PMMA_atactic.gen_pairlist(a1='CA',a2='C',first_resid=1,same_res=True,last_resid=49,mult=12) -PMMA_atactic.dihedral_solver(alkanes,dummy=dummies,cutoff=1.1) # this converts the shuffled conformation into one without overlapping atoms - -Saver = PDB(PMMA_atactic) -Saver.cleanup() # center in box -Saver.save(dummyAtoms=dummies,fname='PMMA_atactic_vanilla-solved') # save, excluding dummy atoms - -sidechains=PMMA_atactic.gen_pairlist(a1='CA',a2='CB',first_resid=1,same_res=True,last_resid=50,mult=6) - -PMMA_atactic.shuffler(alkanes) -PMMA_atactic.dihedral_solver(alkanes,dummy=dummies,cutoff=1.1) # this converts the shuffled conformation into one without overlapping atoms -# PMMA_atactic.shuffler(sidechains) -# PMMA_atactic.dihedral_solver(sidechains,dummy=dummies,cutoff=1.1) # this converts the shuffled conformation into one without overlapping atoms - -Saver = PDB(PMMA_atactic) -Saver.cleanup() # center in box -Saver.save(dummyAtoms=dummies,fname='PMMA_atactic_shuffled_and_solved_01') # save, excluding dummy atoms - -# PMMA_atactic=Polymer(Monomer(composition[0])) # initialise with first monomer - -# for monomer in composition[1:]: # extend with the remain 49 monomers -# PMMA_atactic.extend( # extend with one monomer, aligned along this step's linearization vector -# Monomer(monomer), # extend with this monomer -# n=PMMA_atactic.maxresid(), # extend existing residue i -# nn=PMMA_atactic.newresid(), # incoming monomer will have resid i+1 -# names=dict(P1='CA',P2='CMA',Q1='C',Q2='CN',R='CN',S='C'), # C1_i+1 fit to CX_i, then rotate so NX_i+1 fit to N1_i -# joins=[('C','CA')],# new connection between N1_i and C1_i+1 -# linearise=True, -# ortho=[0.5,-1,0] -# ) - -# PMMA_atactic.shuffler(alkanes) -# PMMA_atactic.dihedral_solver(alkanes,dummy=dummies,cutoff=1.1) # this converts the shuffled conformation into one without overlapping atoms - -# Saver = PDB(PMMA_atactic) -# Saver.cleanup() # center in box -# Saver.save(dummyAtoms=dummies,fname='PMMA_atactic_shuffled_and_solved_02') # save, excluding dummy atoms - -# PMMA_atactic=Polymer(Monomer(composition[0])) # initialise with first monomer - -# for monomer in composition[1:]: # extend with the remain 49 monomers -# PMMA_atactic.extend( # extend with one monomer, aligned along this step's linearization vector -# Monomer(monomer), # extend with this monomer -# n=PMMA_atactic.maxresid(), # extend existing residue i -# nn=PMMA_atactic.newresid(), # incoming monomer will have resid i+1 -# names=dict(P1='CA',P2='CMA',Q1='C',Q2='CN',R='CN',S='C'), # C1_i+1 fit to CX_i, then rotate so NX_i+1 fit to N1_i -# joins=[('C','CA')],# new connection between N1_i and C1_i+1 -# linearise=True, -# ortho=[0.5,-1,0] -# ) -# PMMA_atactic.shuffler(alkanes) -# PMMA_atactic.dihedral_solver(alkanes,dummy=dummies,cutoff=1.1) # this converts the shuffled conformation into one without overlapping atoms - -# Saver = PDB(PMMA_atactic) -# Saver.cleanup() # center in box -# Saver.save(dummyAtoms=dummies,fname='PMMA_atactic_shuffled_and_solved_03') # save, excluding dummy atoms -# PMMA_atactic=Polymer(Monomer(composition[0])) # initialise with first monomer - -# for monomer in composition[1:]: # extend with the remain 49 monomers -# PMMA_atactic.extend( # extend with one monomer, aligned along this step's linearization vector -# Monomer(monomer), # extend with this monomer -# n=PMMA_atactic.maxresid(), # extend existing residue i -# nn=PMMA_atactic.newresid(), # incoming monomer will have resid i+1 -# names=dict(P1='CA',P2='CMA',Q1='C',Q2='CN',R='CN',S='C'), # C1_i+1 fit to CX_i, then rotate so NX_i+1 fit to N1_i -# joins=[('C','CA')],# new connection between N1_i and C1_i+1 -# linearise=True, -# ortho=[0.5,-1,0] -# ) -# PMMA_atactic.shuffler(alkanes) -# PMMA_atactic.dihedral_solver(alkanes,dummy=dummies,cutoff=1.1) # this converts the shuffled conformation into one without overlapping atoms -# PMMA_atactic=Polymer(Monomer(composition[0])) # initialise with first monomer - -# for monomer in composition[1:]: # extend with the remain 49 monomers -# PMMA_atactic.extend( # extend with one monomer, aligned along this step's linearization vector -# Monomer(monomer), # extend with this monomer -# n=PMMA_atactic.maxresid(), # extend existing residue i -# nn=PMMA_atactic.newresid(), # incoming monomer will have resid i+1 -# names=dict(P1='CA',P2='CMA',Q1='C',Q2='CN',R='CN',S='C'), # C1_i+1 fit to CX_i, then rotate so NX_i+1 fit to N1_i -# joins=[('C','CA')],# new connection between N1_i and C1_i+1 -# linearise=True, -# ortho=[0.5,-1,0] -# ) -# Saver = PDB(PMMA_atactic) -# Saver.cleanup() # center in box -# Saver.save(dummyAtoms=dummies,fname='PMMA_atactic_shuffled_and_solved_04') # save, excluding dummy atoms - -# PMMA_atactic.shuffler(alkanes) -# PMMA_atactic.dihedral_solver(alkanes,dummy=dummies,cutoff=1.1) # this converts the shuffled conformation into one without overlapping atoms - -# Saver = PDB(PMMA_atactic) -# Saver.cleanup() # center in box -# Saver.save(dummyAtoms=dummies,fname='PMMA_atactic_shuffled_and_solved_05') # save, excluding dummy atoms