import ecell.eml as eml
import sys
import os
import time
from numpy import *
import ecell.ecs
import ecell.emc
from ecell.ecssupport import *
from ecell.DataFileManager import *
from ecell.ECDDataFile import *
class Session:
'''Session class'''
def __init__( self, aSimulator=None, changeDirectory=False ):
'constructor'
self.theMessageMethod = self.__plainMessageMethod
if aSimulator is None:
self.theSimulator = ecell.emc.Simulator()
else:
self.theSimulator = aSimulator
self.theModelName = ''
self.changeDirectory = changeDirectory
def loadModel( self, aModel ):
if isinstance( aModel, eml.Eml ):
anEml = aModel
aModelName = '<eml.Eml>'
elif isinstance( aModel, str ) or isinstance( aModel, unicode ):
aFileObject = open( aModel )
try:
aModelName = aModel
anEml = eml.Eml( aFileObject )
finally:
print "Closing the file and removing the object"
aFileObject.close()
del aFileObject
elif isinstance( aModel, file ):
if self.changeDirectory:
dirname = os.path.dirname( aModel )
if dirname != "":
os.chdir( dirname )
aFileObject = aModel
try:
aModelName = aModel.name
anEml = eml.Eml( aFileObject )
finally:
print "Closing the file"
aFileObject.close()
else:
raise TypeError, " The type of aModel must be EML instance, string(file name) or file object "
self.__loadStepper( anEml )
self.__loadEntity( anEml )
self.__loadAllProperty( anEml )
self.theModelName = aModelName
def saveModel( self , aModel ):
anEml = eml.Eml()
self.__saveAllStepper( anEml )
self.__saveEntity( anEml, 'System::/' )
self.__saveAllEntity( anEml )
self.__saveProperty( anEml )
if type( aModel ) == str:
aCurrentInfo = '''<!-- created by ecell.Session.saveModel
date: %s
currenttime: %s
-->
<eml>
''' % ( time.asctime( time.localtime() ) , self.getCurrentTime() )
aString = anEml.asString()
aBuffer = aCurrentInfo.join( aString.split( '<eml>\n' ) )
aFileObject = open( aModel, 'w' )
aFileObject.write( aBuffer )
aFileObject.close()
elif type( aModel ) == file:
aString = anEml.asString()
aFileObject = aModel
aFileObject.write( aString )
aFileObject.close()
else:
raise TypeError, "The type of aModel must be string(file name) or file object "
def restoreMessageMethod( self ):
self.theMessageMethod=self.__plainMessageMethod
def setMessageMethod( self, aMethod ):
self.theMessageMethod = aMethod
def message( self, message ):
self.theMessageMethod( message )
def run( self , time='' ):
if not time:
self.theSimulator.run()
else:
self.theSimulator.run( time )
def stop( self ):
self.theSimulator.stop()
def step( self, num=1 ):
self.theSimulator.step( num )
def getNextEvent( self ):
return self.theSimulator.getNextEvent()
def getCurrentTime( self ):
return self.theSimulator.getCurrentTime()
def setEventChecker( self, event ):
self.theSimulator.setEventChecker( event )
def setEventHandler( self, event ):
self.theSimulator.setEventHandler( event )
def getStepperList( self ):
return self.theSimulator.getStepperList()
def createStepperStub( self, id ):
return StepperStub( self.theSimulator, id )
def getEntityList( self, entityType, systemPath ):
return self.theSimulator.getEntityList( entityType, systemPath )
def createEntityStub( self, fullid ):
return EntityStub( self.theSimulator, fullid )
def getLoggerList( self ):
return self.theSimulator.getLoggerList()
def createLogger( self, fullpn ):
self.message( 'createLogger method will be deprecated. Use LoggerStub.' )
aStub = self.createLoggerStub( fullpn )
aStub.create()
def createLoggerStub( self, fullpn ):
return LoggerStub( self.theSimulator, fullpn )
def saveLoggerData( self, fullpn=0, aSaveDirectory='./Data', aStartTime=-1, anEndTime=-1, anInterval=-1 ):
aLoggerNameList = []
if type( fullpn ) == str:
aLoggerNameList.append( fullpn )
elif not fullpn :
aLoggerNameList = self.getLoggerList()
elif type( fullpn ) == list:
aLoggerNameList = fullpn
elif type( fullpn ) == tuple:
aLoggerNameList = fullpn
else:
self.message( "%s is not suitable type.\nuse string or list or tuple"%fullpn )
return
if not os.path.isdir( aSaveDirectory ):
os.mkdir( aSaveDirectory )
aDataFileManager = DataFileManager()
aDataFileManager.setRootDirectory( aSaveDirectory )
aFileIndex=0
for aFullPNString in aLoggerNameList:
aRootIndex = aFullPNString.find( ':/' )
aFileName = aFullPNString[:aRootIndex]+aFullPNString[aRootIndex+1:]
aFileName = aFileName.replace( ':', '_' )
aFileName = aFileName.replace( '/', '_' )
aECDDataFile = ECDDataFile()
aECDDataFile.setFileName( aFileName )
aLoggerStub = self.createLoggerStub( aFullPNString )
if not aLoggerStub.exists():
aErrorMessage='\nLogger doesn\'t exist.!\n'
self.message( aErrorMessage )
return None
aLoggerStartTime= aLoggerStub.getStartTime()
aLoggerEndTime= aLoggerStub.getEndTime()
if aStartTime == -1 or anEndTime == -1:
aStartTime = aLoggerStartTime
anEndTime = aLoggerEndTime
else:
if not ( aLoggerStartTime < aStartTime < aLoggerEndTime ):
aStartTime = aLoggerStartTime
if not ( aLoggerStartTime < anEndTime < aLoggerEndTime ):
anEndTime = aLoggerEndTime
if anInterval == -1:
aMatrixData = aLoggerStub.getData( aStartTime, anEndTime )
else:
aMatrixData = aLoggerStub.getData( aStartTime, anEndTime, anInterval )
aECDDataFile.setDataName(aFullPNString)
aECDDataFile.setData(aMatrixData)
aDataFileManager.getFileMap()[`aFileIndex`] = aECDDataFile
aFileIndex = aFileIndex + 1
try:
aDataFileManager.saveAll()
except:
import traceback
print __name__,
aErrorMessageList = traceback.format_exception(sys.exc_type,sys.exc_value,sys.exc_traceback)
for aLine in aErrorMessageList:
self.message( aLine )
aErrorMessage= "Error : could not save [%s] " %aFullPNString
self.message( aErrorMessage )
else:
aSuccessMessage= " All files you selected are saved. "
self.message( aSuccessMessage )
def plainMessageMethod( self, aMessage ):
self.__plainMessageMethod( aMessage )
def __plainMessageMethod( self, aMessage ):
print aMessage
def __loadStepper( self, anEml ):
"""stepper loader"""
aStepperList = anEml.getStepperList()
for aStepper in aStepperList:
aClassName = anEml.getStepperClass( aStepper )
try:
self.theSimulator.createStepper( str( aClassName ),\
str( aStepper ) )
except RuntimeError, e:
raise RuntimeError( 'Failed to create Stepper [%s]: ' % (aStepper,) +\
str( e ) )
aPropertyList = anEml.getStepperPropertyList( aStepper )
for aProperty in aPropertyList:
aValue = anEml.getStepperProperty( aStepper, aProperty )
try:
self.theSimulator.loadStepperProperty( aStepper,\
aProperty,\
aValue )
except RuntimeError, e:
raise RuntimeError( 'When creating Stepper [%s], ' % (aStepper,) +\
'failed to set property [%s]: ' % (aProperty,) +\
str( e ) )
def __loadEntity( self, anEml, aSystemPath='/' ):
aVariableList = anEml.getEntityList( 'Variable', aSystemPath )
aProcessList = anEml.getEntityList( 'Process', aSystemPath )
aSubSystemList = anEml.getEntityList( 'System', aSystemPath )
self.__loadEntityList( anEml, 'Variable', aSystemPath, aVariableList )
self.__loadEntityList( anEml, 'Process', aSystemPath, aProcessList )
self.__loadEntityList( anEml, 'System', aSystemPath, aSubSystemList )
for aSystem in aSubSystemList:
aSubSystemPath = joinSystemPath( aSystemPath, aSystem )
self.__loadEntity( anEml, aSubSystemPath )
def __loadAllProperty( self, anEml, aSystemPath='' ):
aVariableList = anEml.getEntityList( 'Variable', aSystemPath )
aProcessList = anEml.getEntityList( 'Process', aSystemPath )
aSubSystemList = anEml.getEntityList( 'System', aSystemPath )
self.__loadPropertyList( anEml, 'Variable',\
aSystemPath, aVariableList )
self.__loadPropertyList( anEml, 'Process', aSystemPath, aProcessList )
self.__loadPropertyList( anEml, 'System',\
aSystemPath, aSubSystemList )
for aSystem in aSubSystemList:
aSubSystemPath = joinSystemPath( aSystemPath, aSystem )
self.__loadAllProperty( anEml, aSubSystemPath )
def __loadPropertyList( self, anEml, anEntityTypeString,\
aSystemPath, anIDList ):
for anID in anIDList:
aFullID = anEntityTypeString + ':' + aSystemPath + ':' + anID
aPropertyList = anEml.getEntityPropertyList( aFullID )
for aProperty in aPropertyList:
aFullPN = aFullID + ':' + aProperty
aValue = anEml.getEntityProperty( aFullPN )
try:
self.theSimulator.loadEntityProperty( aFullPN, aValue )
except RuntimeError, e:
raise RuntimeError( 'Failed to set Entity property [%s],'
% aFullPN \
+ 'value =:\n%s\n' % str( aValue ) +\
str( e ) )
def __loadEntityList( self, anEml, anEntityTypeString,\
aSystemPath, anIDList ):
aPrefix = anEntityTypeString + ':' + aSystemPath + ':'
for anID in anIDList:
aClassName = anEml.getEntityClass( aPrefix + anID )
aFullID = aPrefix + anID
try:
self.theSimulator.createEntity( aClassName, aFullID )
except RuntimeError, e:
raise RuntimeError( 'Failed to create Entity [%s]: ' % (aFullID,) +\
str( e ) )
def __createScriptContext( self, parameters ):
aContext = { 'theSession': self, 'self': self }
aKeyList = list ( self.__dict__.keys() +\
self.__class__.__dict__.keys() )
aDict = {}
for aKey in aKeyList:
aDict[ aKey ] = getattr( self, aKey )
aContext.update( aDict )
aContext.update( parameters )
return aContext
def __saveAllStepper( self , anEml ):
"""stepper loader"""
aStepperList = self.theSimulator.getStepperList()
for aStepper in aStepperList:
aClassName = self.theSimulator.getStepperClassName( aStepper )
anEml.createStepper( str( aClassName ), \
str( aStepper ) )
aPropertyList = self.theSimulator.getStepperPropertyList( aStepper )
for aProperty in aPropertyList:
anAttributeList = self.theSimulator.getStepperPropertyAttributes( aStepper, aProperty )
if anAttributeList[3] != 0:
aValue = self.theSimulator.\
getStepperProperty( aStepper, aProperty )
aValueList = list()
if type( aValue ) != tuple:
aValueList.append( str( aValue ) )
else:
aValueList = aValue
anEml.setStepperProperty( aStepper, \
aProperty, \
aValueList )
def __saveAllEntity( self, anEml, aSystemPath='/' ):
aVariableList = self.getEntityList( 'Variable', aSystemPath )
aProcessList = self.getEntityList( 'Process', aSystemPath )
aSubSystemList = self.getEntityList( 'System', aSystemPath )
self.__saveEntityList( anEml, 'System', aSystemPath, aSubSystemList )
self.__saveEntityList( anEml, 'Variable', aSystemPath, aVariableList )
self.__saveEntityList( anEml, 'Process', aSystemPath, aProcessList )
for aSystem in aSubSystemList:
aSubSystemPath = joinSystemPath( aSystemPath, aSystem )
self.__saveAllEntity( anEml, aSubSystemPath )
def __saveEntityList( self, anEml, anEntityTypeString, \
aSystemPath, anIDList ):
for anID in anIDList:
aFullID = anEntityTypeString + ':' + aSystemPath + ':' + anID
self.__saveEntity( anEml, aFullID )
def __saveEntity( self, anEml, aFullID ):
aClassName = self.theSimulator.getEntityClassName( aFullID )
anEml.createEntity( aClassName, aFullID )
def __saveProperty( self, anEml, aSystemPath='' ):
aVariableList = self.theSimulator.getEntityList( 'Variable', \
aSystemPath )
aProcessList = self.theSimulator.getEntityList( 'Process', \
aSystemPath )
aSubSystemList = self.theSimulator.getEntityList( 'System', \
aSystemPath )
self.__savePropertyList( anEml, 'Variable', \
aSystemPath, aVariableList )
self.__savePropertyList( anEml, 'Process', \
aSystemPath, aProcessList )
self.__savePropertyList( anEml, 'System', \
aSystemPath, aSubSystemList )
for aSystem in aSubSystemList:
aSubSystemPath = joinSystemPath( aSystemPath, aSystem )
self.__saveProperty( anEml, aSubSystemPath )
def __savePropertyList( self, anEml, anEntityTypeString, \
aSystemPath, anIDList ):
for anID in anIDList:
aFullID = anEntityTypeString + ':' + aSystemPath + ':' + anID
aPropertyList = self.theSimulator.getEntityPropertyList( aFullID )
for aProperty in aPropertyList:
aFullPN = aFullID + ':' + aProperty
anAttributeList = self.theSimulator.getEntityPropertyAttributes( aFullPN )
if anAttributeList[3] != 0:
aValue = self.theSimulator.saveEntityProperty( aFullPN )
if aValue != '':
aValueList = list()
if type( aValue ) != tuple:
aValueList.append( str( aValue ) )
elif aValue == ():
break
else:
aValueList = self.__convertPropertyValueList( aValue )
anEml.setEntityProperty( aFullID, aProperty,
aValueList )
def __convertPropertyValueList( self, aValueList ):
aList = list()
tmpList = list()
for aValueListNode in aValueList:
if type( aValueListNode ) == tuple:
if type( aValueListNode[0] ) == tuple:
aConvertedList = self.__convertPropertyValueList( aValueListNode )
else:
aConvertedList = map( str, aValueListNode )
aList.append( aConvertedList )
else:
tmpList.append( aValueListNode )
if tmpList != []:
aList.append( tmpList )
else:
pass
return aList
if __name__ == "__main__":
pass