From c1504d4d71afcd0764bfbb51578ebed556f36aec Mon Sep 17 00:00:00 2001
From: Samo Penic <samo.penic@gmail.com>
Date: Tue, 21 Feb 2017 08:54:27 +0000
Subject: [PATCH] Added analysis options and analysis decorator

---
 trisurf/trisurf.py  |    3 +++
 networkedExample.py |   14 +++++++++-----
 trisurf/analyses.py |   14 +++++++++++++-
 trisurf/tsmgr.py    |   19 ++++++++++---------
 4 files changed, 35 insertions(+), 15 deletions(-)

diff --git a/networkedExample.py b/networkedExample.py
index 1464aff..3e958bb 100755
--- a/networkedExample.py
+++ b/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)
diff --git a/trisurf/analyses.py b/trisurf/analyses.py
index 7b061f2..4862867 100644
--- a/trisurf/analyses.py
+++ b/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
 
diff --git a/trisurf/trisurf.py b/trisurf/trisurf.py
index 33673ed..3a052fc 100644
--- a/trisurf/trisurf.py
+++ b/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.
diff --git a/trisurf/tsmgr.py b/trisurf/tsmgr.py
index 101c84c..3cbffc5 100644
--- a/trisurf/tsmgr.py
+++ b/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']

--
Gitblit v1.9.3