Hi All,
I have a class called Mutant(), its constructor generates a random FASTA sequence.
A class method writeToPDB() uses modeller to push the FASTA into a template PDB. This is already working very well.
If I do 1000 mutants this takes an eternity (one after the other)... so I thought of crafting a ThreadPoolExecutor.
Modeller runs inside the class method. Concurrent calls should not share memory with other instances of Mutant().
mutants = [] #Holds an Array of mutant objects
executor = ThreadPoolExecutor(max_workers=20) #Thread executor
for i in range(1000):
mutants.append(Mutant())
executor.submit(mutants[i].writeToPDB, templatePDB)
This simply tells the executor to queue a new thread with the writeToPDB() method.
When I try to do this, it seems that modeller is being executed in the first call and sharing its state with all subsequent calls... so I get like 90 models (not 1000) written in whatever state modeller was when running the other instances.
How can I force a class method to use its own modeller instance?.
This is the method:
env = environ()
env.libs.topology.read(file='$(LIB)/top_heav.lib')
env.libs.parameters.read(file='$(LIB)/par.lib')
aln = alignment(env)
mdl = model(env, file=code)
aln.append_model(mdl, atom_files=code, align_codes=code)
residue = self.fasta[resid-Mutant.compensate]
sel.mutate(residue_type=Mutant.res1to3[residue]) #mutate
aln.append_model(mdl, align_codes='mut')
mdl.clear_topology()
mdl.generate_topology(aln['mut'])
mdl.transfer_xyz(aln)
mdl.build(initialize_xyz=False, build_method='INTERNAL_COORDINATES')
name = str(self.pdbpath)+str(
self.id)+".pdb"
mdl.write(file=name)