Python wrapper for running instances of trisurf-ng
Samo Penic
2017-02-21 c1504d4d71afcd0764bfbb51578ebed556f36aec
Added analysis options and analysis decorator
4 files modified
50 ■■■■ changed files
networkedExample.py 14 ●●●●● patch | view | raw | blame | history
trisurf/analyses.py 14 ●●●●● patch | view | raw | blame | history
trisurf/trisurf.py 3 ●●●●● patch | view | raw | blame | history
trisurf/tsmgr.py 19 ●●●● patch | view | raw | blame | history
networkedExample.py
@@ -2,7 +2,7 @@
from trisurf import trisurf
from trisurf import tsmgr
from trisurf import analyses
from trisurf.analyses import analysis
#Ok... Configure your keys:
@@ -22,6 +22,7 @@
Runs=[run2, run3]
#this is how analyses are defined
@analysis('analyze')
def analyze(run, **kwargs):
    host=kwargs.get('host', None)
    print("Demo analysis")
@@ -40,8 +41,11 @@
    print("\n\nStatistics file:")
    print(run.Statistics.readText())
hosts=({'name':'natalie','address':'kabinet.penic.eu', 'runs':Runs, 'username':'samo', 'remotebasepath':'simulations-test/subdir/subdir'},
    {'name':'Hestia','address':'127.0.0.1', 'runs':Runs, 'username':'samo'})
analyses={'analysis1':analyze,'webReport':testWebAnalysis,'runningavg':analyses.plotrunningavginteractive}
hosts=({'name':'altea','address':'localhost', 'runs':Runs, 'username':'samo', 'remotebasepath':'simulations-test/subdir/subdir'},)
#hosts=({'name':'natalie','address':'kabinet.penic.eu', 'runs':Runs, 'username':'samo', 'remotebasepath':'simulations-test/subdir/subdir'},
#    {'name':'Hestia','address':'127.0.0.1', 'runs':Runs, 'username':'samo'})
#analyses={'analysis1':analyze,'webReport':testWebAnalysis,'runningavg':analyses.plotrunningavginteractive}
tsmgr.start(hosts, analyses=analyses)
print(trisurf._analysis_list)
tsmgr.start(hosts)
trisurf/analyses.py
@@ -1,6 +1,17 @@
from . import trisurf
def analysis(analysis_name='unnamed_analysis'):
    """Decorator for adding the analysis functions to function lists"""
    def analysis_decorator(analysis_function):
        trisurf._analysis_list[analysis_name]=analysis_function
        def wrapper(*args, **kwargs):
            analysis_function(*args,**kwargs)
        return wrapper
    return analysis_decorator
@analysis('demo')
def demo(run, **kwargs):
    host=kwargs.get('host', None)
    print("Demo analysis")
@@ -14,6 +25,7 @@
# can be wrapped to specify scalar_field)
@analysis('plotrunningavginteractive')
def plotrunningavginteractive(run, scalar_field='vertices_idx', **kwargs):
    import matplotlib.pyplot as plt
    from trisurf import VTKRendering as vtk
@@ -48,7 +60,7 @@
# -------------------------------
# these functions should be wrapped
# -------------------------------
@analysis('plotColumnFromPostProcess')
def plotColumnFromPostProcess(run, filename='data_tspoststat.csv', column='hbar', **kwargs):
    import matplotlib.pyplot as plt
trisurf/trisurf.py
@@ -20,6 +20,9 @@
TS_RUNNING=2 # process is running
TS_COMPLETED=3 #simulation is completed
#namespace variable. Seems the best place to put the variable in :)
_analysis_list={}
class FileContent:
    '''
    Class is helpful for reading and writting the specific files.
trisurf/tsmgr.py
@@ -56,6 +56,7 @@
    parser.add_argument('-R','--raw',help='print status and the rest of the information in raw format', action="store_true")
    parser.add_argument('-x','--local-only',help='do not attempt to contact remote hosts. Run all operations only on local machine',action='store_true')
    parser.add_argument('--originating-host',nargs=1,help='specify which host started the remote connections. Useful mainly fo internal functionaly of tsmgr and analyses.')
    parser.add_argument('--analysis-options', nargs='+', help='options passed down to analyses')
    args = parser.parse_args(arguments)
    return args
@@ -202,9 +203,9 @@
    exit(0)
def analyze(args,host,a_dict, analysis,hosts):
    if len(a_dict)==0:
        print ('Error: no analyses are specified in the tsmgr.start()!')
def analyze(args,host,analysis,hosts):
    if len(trisurf._analysis_list)==0:
        print ('Error: no decorated function with @analysis decorator!')
        exit(1)
    target_runs=getTargetRunIdxList(args)
    if target_runs==None:
@@ -212,11 +213,11 @@
    for i in target_runs:
        for anal in analysis:
            if(anal not in a_dict):
                print("Analysis '"+anal+"' is not known. Available analyses: "+", ".join(a_dict.keys())+".")
            if(anal not in trisurf._analysis_list):
                print("Analysis '"+anal+"' is not known. Available analyses: "+", ".join(trisurf._analysis_list.keys())+".")
                exit(0)
        for anal in analysis:
            retval=a_dict[anal](host['runs'][i-1],host=host, args=args, hosts=hosts)
            retval=trisurf._analysis_list[anal](host['runs'][i-1],host=host, args=args, hosts=hosts)
            #try:
            if(retval):
                exit(0)
@@ -247,7 +248,7 @@
        embed()
        exit(0)
    elif args['analysis']!= None:
        analyze(args,host,kwargs.get('analyses', {}), args['analysis'],kwargs.get('hosts',None))
        analyze(args,host, args['analysis'],kwargs.get('hosts',None))
        exit(0)
    else: #version requested
        print(getTrisurfVersion())
@@ -276,7 +277,7 @@
def start(hosts,argv=sys.argv[1:], analyses={}):
def start(hosts,argv=sys.argv[1:]):
    args=vars(ParseCLIArguments(argv))
    #Backward compatibility... If running just on localmode, the host specification is unnecessary. Check if only Runs are specified
    try:
@@ -304,7 +305,7 @@
                print("Host <font color='orange'>"+host['name']+"</font> reports:")
            else:
                print("Host "+bcolors.WARNING+host['name']+bcolors.ENDC+" reports:")
            perform_action(args,host, analyses=analyses, hosts=hosts)
            perform_action(args,host, hosts=hosts)
        elif not args['local_only']:
            if('remotebasepath' in host):
                remote_dir=host['remotebasepath']