"""
This is a prototype PySCeS interface to the System Biology Workbench
(http://www.sys-bio.org). Bits of code in this module have been shamelessly scavenged
from the SBW/Python inteface modules found in sbwStartup.py and sbwModuleProxy.py.
Essentially what I am trying to do is to get the SBW/Python interface to operate
as a module and not in the global/interactive namespace. Modules added as I
discover more about SBW ;-) Brett G. Olivier - 20060929
Notes: notification does not work yet, new SBW modules are not autoloaded - the
interface itself checks and, if necessary, loads services as required.
"""
try:
import SBW
except Exception, exc:
print '\nError loading SBW'
print 'Is the Systems Biology Workbench (www.sys-bio.org) installed?'
print 'If SBW is installed and still doesn\'t work try creating an empty file'
print 'called __init__.py and copy it into'
print '\tpython2.x\\lib\\site-packages\\SBW\\'
print 'if this directory doesn\'t exist copy python2.x\\SBW\\ to'
print 'python2.x\\lib\\site-packages\\SBW\\ add __init__.py and try again'
print exc,'\n'
import os
from time import sleep
import SBW.sbwModuleProxy as sbwModuleProxy
import SBW.psbw as psbw # give user access to psbw in interactive mode
sbwModuleProxy.importAllModules(SBW.__dict__, verbose=1)
sbwModuleProxy.startModuleNotification(SBW.__dict__, verbose=1)
class SBW_base:
sbml_file = 'The SBML file name'
sbml_string = 'The SBML file object as a string'
SBW = 'The inheriting class SBW interface'
output = 'Holds the output of the analysis'
## def __init__(self):
## #Load all modules the generic form of above probably should have its own function someday
## modules = [ sbwModuleProxy.ModuleProxy(id) for id in psbw.getModuleIdList() ]
## for module in modules:
## if not sbwModuleProxy.moduleDict.has_key(module.id):
## print 'Adding module to ModuleProxy', module.id
## sbwModuleProxy.moduleDict[module.id] = module
## if not SBW.__dict__.has_key(module.pythonName):
## print 'Adding module to SBW namespace', module.pythonName
## SBW.__dict__[module.pythonName] = module
def loadSBMLfromFile(self,filename,dir=None):
"""Loads an SBML file where name=filename"""
if dir != None:
filename = os.path.join(dir,filename)
self.sbml_file = filename
sbml_file = file(filename,'r')
self.sbml_string = ''
for line in sbml_file: self.sbml_string += line
sbml_file.close()
def Info(self):
"""Display module info"""
print ' '
print 'Module: ' + self.SBW.getName() + ' (ver. ' + self.SBW.getVersion() + ')'
print ' \"' + self.SBW.getDescription() + '\"'
print 'Author: ' + self.SBW.getAuthor() + ' (' + self.SBW.getURL() + ')'
def SBW_Methods(self):
"""Display available SBW service methods"""
print '\nMethods available as sbw.'+ self.SBW.getName()+'.SBW.*'
for x in self.SBW.methods:
print x
print '\n'
def WriteOutputToFile(self,filename,dir=None):
if dir != None:
filename = os.path.join(dir,filename)
Fout = file(filename,'w')
Fout.write(self.output)
Fout.flush()
Fout.close()
class StructAnalysis(SBW_base):
def __init__(self):
#Get the module instance and load it if necessary ... i think!?
#Note to self - find out for sure why this only works in __init__ it is a
#namespace issue but it would be nice to work around it ;-) - brett
struct_module_id = psbw.SBWGetModuleInstance('edu.kgi.StructAnalysis')
if not sbwModuleProxy.moduleDict.has_key(struct_module_id):
print '<PySCeS_SBW> Adding ' + sbwModuleProxy.ModuleProxy(struct_module_id).pythonName + ' to ModuleProxy (id=' + str(struct_module_id) + ')'
if not SBW.__dict__.has_key(sbwModuleProxy.ModuleProxy(struct_module_id).pythonName):
print '<PySCeS_SBW> Adding ' + sbwModuleProxy.ModuleProxy(struct_module_id).pythonName + ' to SBW namespace'
SBW.__dict__[sbwModuleProxy.ModuleProxy(struct_module_id).pythonName] = sbwModuleProxy.ModuleProxy(struct_module_id)
#wang the StructAnalysis methods into the StructAnalysis instance as SBW.*
self.SBW = SBW.edu_kgi_StructAnalysis.StructAnalysis
# MORE COMING SOON TO AN INTERFaCE NEAR YOU ...........
def _InitStuff(self):
#reassign some useful stuff for easy access
self.rank = self.SBW.getRank()
def loadSBML(self, sbml_str=None):
if sbml_str == None:
sbml_str = self.sbml_string
else:
self.sbml_string = sbml_str
try:
self.output = SBW.edu_kgi_StructAnalysis.StructAnalysis.loadSBML(sbml_str)
except Exception, ex:
print ex
self.output = str(ex)
self._InitStuff()
def Run(self, sbml_str=None):
if sbml_str == None:
sbml_str = self.sbml_string
else:
self.sbml_string = sbml_str
try:
self.output = SBW.edu_kgi_StructAnalysis.StructAnalysis.loadSBML(sbml_str)
except Exception, ex:
print ex
self.output = str(ex)
self._InitStuff()
def RunWithTests(self, sbml_str=None):
if sbml_str == None:
sbml_str = self.sbml_string
else:
self.sbml_string = sbml_str
try:
self.output = SBW.edu_kgi_StructAnalysis.StructAnalysis.loadSBMLwithTests(sbml_str)
except Exception, ex:
self.output = str(ex)
self._InitStuff()
class DrawNetworkGUI(SBW_base):
def __init__(self):
# externally spawn a GUI to avoid locking the console (uses default windows location)
os.spawnv(os.P_NOWAIT,'c:\\Program Files\\KGI\\SBW\\Layout\\DrawNetwork.exe',[])
print 'Loading ...'
sleep(3)
# as we have loaded the thing already, we can just get the Id
draw_module_id = psbw.getModuleId('DrawNetwork.GUI')
if not sbwModuleProxy.moduleDict.has_key(draw_module_id):
print '<PySCeS_SBW> Adding ' + sbwModuleProxy.ModuleProxy(draw_module_id).pythonName + ' to ModuleProxy (id=' + str(draw_module_id) + ')'
if not SBW.__dict__.has_key(sbwModuleProxy.ModuleProxy(draw_module_id).pythonName):
print '<PySCeS_SBW> Adding ' + sbwModuleProxy.ModuleProxy(draw_module_id).pythonName + ' to SBW namespace'
SBW.__dict__[sbwModuleProxy.ModuleProxy(draw_module_id).pythonName] = sbwModuleProxy.ModuleProxy(draw_module_id)
self.SBW = SBW.DrawNetwork_GUI.network
def loadSBML(self,sbml_str=None):
if sbml_str == None:
sbml_str = self.sbml_string
else:
self.sbml_string = sbml_str
try:
self.SBW.loadSBML(sbml_str)
except Exception, ex:
print ex
self.output = str(ex)
print '\n\n\tClick in the DrawNetwork window to refresh display\n\n'
def getSBMLstringWithLayout(self):
self.output = self.SBW.getSBML()
print "SBML+layout stored as output"
## class Simulate3D(SBW_base):
## def __init__(self):
## # externally spawn a GUI to avoid locking the console (uses default windows location)
## os.spawnv(os.P_NOWAIT,'c:\\Program Files\\KGI\\Simulate3D\\3Dlauncher.exe',[])
## print 'Loading ...'
## sleep(3)
## # as we have loaded the thing already, we can just get the Id
## threeD_module_id = psbw.getModuleId('Simulate3D')
## if not sbwModuleProxy.moduleDict.has_key(threeD_module_id):
## print '<PySCeS_SBW> Adding ' + sbwModuleProxy.ModuleProxy(threeD_module_id).pythonName + ' to ModuleProxy (id=' + str(threeD_module_id) + ')'
## if not SBW.__dict__.has_key(sbwModuleProxy.ModuleProxy(threeD_module_id).pythonName):
## print '<PySCeS_SBW> Adding ' + sbwModuleProxy.ModuleProxy(threeD_module_id).pythonName + ' to SBW namespace'
## SBW.__dict__[sbwModuleProxy.ModuleProxy(threeD_module_id).pythonName] = sbwModuleProxy.ModuleProxy(threeD_module_id)
## self.SBW = SBW.DrawNetwork_GUI.network
## def loadSBML(self,sbml_str=None):
## if sbml_str != None:
## self.sbml_string = sbml_str
## self.SBW.loadSBML(sbml_str)
## else:
## self.SBW.loadSBML(self.sbml_string)
## print '\n\n\tClick in the DrawNetwork window to refresh display\n\n'
## def getSBMLstringWithLayout(self):
## self.output = self.SBW.getSBML()
## print "SBML+layout stored as output"
|