#!/usr/bin/env python # # # Run the lltp test cases multiple times, collect the outputs in # per-testcase directories, and calculate means and stdev # Plot the means of the pertinent variables. If -v is specified, # then also plot stdev as variation bands from __future__ import print_function import sys, os, time, subprocess, getopt, re class TestCase : def __init__(self, gilFile, stopTime, molecules, title): self.gilFile = gilFile self.stopTime = stopTime self.molecules = molecules self.title = title testCases = [ TestCase("lltp_induction", 300, "R_A,P,A_I,E1_A", "NMDAR stimulation"), TestCase("lltp_ind_psi", 300, "R_A,P,A_I,E1_A", "NMDAR stimulation + PSI"), TestCase("lltp_ind_zip", 300, "R_A,P,A_I,E1_A", "NMDAR stimulation + ZIP"), TestCase("lltp_infusion", 300, "R_A,P,A_I", "PKMZ infusion"), TestCase("lltp_inf_psi_100", 1200, "R_A,P,A_I", "PKMZ infusion + PSI"), TestCase("lltp_maint_psi_90",1200, "R_A,P,A_I,E1_A", "PSI during maintenance"), TestCase("lltp_react", 300, "R_A,P,A_I,E1_A,E2_A", "Reactivation"), TestCase("lltp_react_psi", 1200, "R_A,P,A_I,E1_A,E2_A", "Reactivation + PSI"), TestCase("lltp_react_psi_y", 1200, "R_A,P,A_I,E1_A,E2_A", "Reactivation + PSI + GluR2_3_Y"), TestCase("lltp_maint_zip", 1200, "R_A,P,A_I,E1_A", "ZIP during maintenance"), TestCase("lltp_maint_zip_y", 1200, "R_A,P,A_I,E1_A", "ZIP + GluR2_3_Y during maintenance") ] pname='' def usage(): print('Usage: ' + pname + ' [-h|--help] [-r] [-s|--small] [-v|vbands] [-g|--gilFile <gilFile>] [-d|--dir <dir>] [<numRuns>]') print(' -r: recalculate avg, stdev and sterr (only with <numRuns> == 0)') print(' -s: small plot with no legend') print(' -v: plot variation (error) bands') print(' -g: gilFile[s] to run (default: all of them)') print(' -d: output base directory. Default is out/yyyy_mm_dd__hh_mm_ss') print(' Subdirectories will be created for each test case') print(' <numRuns>: number of runs of each test case. Default is 0') print(' If <numRuns> == 0, then plot existing data in <dir>') sys.exit(2) def main(): pname = os.path.basename(sys.argv[0]) try: opts, args = getopt.getopt(sys.argv[1:], "hrsg:d:v", ["help", "recalc", "small", "gilFile=", "dir=", "vbands"]) except getopt.GetoptError as err: print(err) sys.exit(2) small = False recalc = False gilFiles = [] outBaseDir = '' vflag = '' numRuns = 0 for opt, val in opts: if opt in ("-h", "--help"): usage() sys.exit() elif opt in ("-s", "--small"): small = True elif opt in ("-r", "--recalc"): recalc = True elif opt in ("-d", "--dir"): outBaseDir = val elif opt in ("-g", "--gilFile"): gilFiles = gilFiles + [val] elif opt in ("-v", "--vbands"): vflag = "-v" else: assert False, "unhandled option" if (small): plotFlags="-w 300 -h 200 -c lltp.col -k off " + vflag else: plotFlags="-w 800 -h 500 -c lltp.col " + vflag if len(args) > 1: print('Too many arguments') sys.exit(2) elif (len(args) == 1): try: numRuns = int(args[0]) except: print('Bad value for numRuns: ' + args[0]); sys.exit(2) selectedTestCases = [] for gf in gilFiles: # strip .gil suffix m = re.match('(.*)\.gil$', gf) if m: gf = m.group(1) found = False for tc in testCases: if (gf == tc.gilFile): found = True selectedTestCases = selectedTestCases + [tc] break if (not found): print('Unknown gilFile: ' + gf) sys.exit(2) if (len(selectedTestCases) == 0): selectedTestCases = testCases if (numRuns == 0): if (outBaseDir == ''): print('Either -d <dir> or <numRuns> != 0 must be specified') sys.exit(2) if (not os.path.isdir(outBaseDir)): print("'" + outBaseDir + "' is not a directory (must exist when numRuns == 0)") sys.exit(2) else: if (outBaseDir == ''): outBaseDir = 'out' + '/' + time.strftime('%Y_%m_%d__%H_%M_%S') if (os.path.isdir(outBaseDir)): print("'" + outBaseDir + "' already exists (not ok when numRuns != 0)") sys.exit(2) for tc in selectedTestCases: outDir = outBaseDir + '/' + tc.gilFile avgFile = outDir + '/' + 'avg.out' stdevsFile = outDir + '/' + 'stdevs.out' sterrFile = outDir + '/' + 'sterr.out' statsFile = outDir + '/' + 'stats.out' if (numRuns != 0): os.makedirs(outDir) procs = [] for i in range(numRuns): outFile = outDir + '/' + str(i) + '.out' cmd = ("./gil " + tc.gilFile + " -stop " + str(tc.stopTime) + "| ./add_complexes_to_p_and_ai" + "> " + outFile) p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) procs.append(p) exitCodes = [p.wait() for p in procs] print('Exit codes(' + tc.gilFile + '): ', end='') print(exitCodes) outputs = [p.communicate()[0] for p in procs] print('Outputs(' + tc.gilFile + '): ', end='') print(outputs) if ((numRuns != 0) or recalc): procs = [] cmd = './mat -hdr -ind avg ' + outDir + '/[0-9]*.out > ' + avgFile p = subprocess.Popen(cmd, shell=True) procs.append(p) cmd = './mat -hdr -ind -pref S_ stdevs ' + outDir + '/[0-9]*.out > ' + stdevsFile p = subprocess.Popen(cmd, shell=True) procs.append(p) cmd = './mat -hdr -ind -pref E_ sterr ' + outDir + '/[0-9]*.out > ' + sterrFile p = subprocess.Popen(cmd, shell=True) procs.append(p) exitCodes = [p.wait() for p in procs] cmd = ("paste " + avgFile + " " + stdevsFile + " " + sterrFile + " | " + " ./columns t A_I P R_A E1_A E2_A S_A_I S_P S_R_A S_E1_A S_E2_A > " + statsFile) p = subprocess.Popen(cmd, shell=True) p.wait() cmd = ("./gilplot " + plotFlags + " -m " + tc.molecules + " -Y [0:120] " + " -t " + '"' + tc.title + '" < ' + statsFile) subprocess.Popen(cmd, shell=True) print(cmd) if __name__ == "__main__": main()