# runbatch.py -- Python script for running a batch of simulation # multi-seed runs on a single machine. # # Use # python runbatchpbs_mist_20params.py # from the command line to start the batch. # # eg. python runbatchpbs_mist_20params.py 14sep16b data/14sep16b_evol/gen_86_cand_151 # Last update: 13/09/01 (salvadord) # Set whether the commands are actually done (as opposed to just displayed). do_commands = True # Import packages needed for commands. import os, sys from numpy import * from pylab import * import subprocess from popen2 import popen2 import time import pickle import random as rnd from shutil import copyfile # save list of perturbed cells in file def makePerturbCells (filestem, percent): cellsTot = 191 cellsPerturbed = int(round(percent/100.0 * cellsTot)) randCells = rnd.sample(xrange(cellsTot), cellsPerturbed) outfilename = "%s-cellsPerturbed.txt"%(filestem) savetxt(outfilename,randCells,fmt='%11.3f') print "Cell perturbation file %s saved." % outfilename def copyPerturbCellsFile(fileorigin,filestem): copyfile("%s-cellsPerturbed.txt"%(fileorigin), "%s-cellsPerturbed.txt"%(filestem)) # save list of perturbed synapses in file def makePerturbSyns (filestem, percent): # check max number of connections synsTot = 21588 synsPerturbed = int(round(percent/100.0 * synsTot)) randCells = rnd.sample(xrange(synsTot), synsPerturbed) outfilename = "%s-synsPerturbed.txt"%(filestem) savetxt(outfilename,randCells,fmt='%11.3f') print "Synapse perturbation file %s saved." % outfilename def copyPerturbSynsFile(fileorigin,filestem): copyfile("%s-synsPerturbed.txt"%(fileorigin), "%s-synsPerturbed.txt"%(filestem)) # save list of stimulated cells in file def makeProbingStims (filestem,mistCell,mistStart,mistDuration,mistRate): # Create full stimulus event1=[mistCell,mistStart,mistRate] # create data to write event2=[mistCell,mistStart+mistDuration,0] # events=vstack([event1,event2]) #event1=arange(1,10) outfilename="%s-in.txt"%(filestem) savetxt(outfilename,events,fmt='%11.3f') print "Stimulus file %s saved." % outfilename # save list of randomly stimulated cells in file def makeMultProbingStims (filestem, mistCell,mistStart,mistDuration,mistRate): maxCells = 10 # max number of cells stim simultaneously rateRange = [100,500] # range of random stimulation rate (Hz) durRange = [200,201] # rate of random durations (ms) event_list = [] event1=[mistCell,mistStart,mistRate] # first stim cell fixed event2=[mistCell,mistStart+mistDuration,0] # event_list.append(event1) event_list.append(event2) for i in range(rnd.randrange(maxCells)): randCell = rnd.randrange(0,192,1) event = [randCell, mistStart, mistRate] #randrange(rateRange[0], rateRange[1])] event_list.append(event) event = [randCell, mistStart+mistDuration, 0]#randrange(durRange[0], durRange[1]), 0] event_list.append(event) events=vstack(event_list) outfilename="%s-in.txt"%(filestem) savetxt(outfilename,events,fmt='%11.3f') print "Stimulus file %s saved." % outfilename # save list of stimulated cells in file def makeRepairStims (filestem, target, param1, param2): fileorigin = '%s-repair_target-%d_ptype-%d_pperc-%d-in.txt' % (filestem, target, param1, param2) filedest = "%s-in.txt" % (filestem) copyfile(fileorigin, filestem) print "Repair stimulus file %s copied to %s." % (fileorigin, filedest) # Load params paramFile = 'stimdata/gen_86_cand_151' with open('%s_params'% (paramFile)) as f: param = pickle.load(f) # read initial params from file print param # Set sim duration (in s) simdur = 2 # number of different iseeds required iseedstart = 1235 iseedstep = 17 # seed values niseeds=50 wseedvals = 120456 iseedvals = arange(iseedstart, iseedstart+(niseeds*iseedstep), iseedstep) target_range = [1,3] #arange(4) # only four targets wseed_range = arange(1) inseed_range = arange(niseeds) probing = 0 # 0 = Repair, 1 = single cell, 2 = multiple cell, 3 = special cases (multiple test seeds) param1_range = [0,1] #kill cells or synapses param2_range = [5,10] # kill 5% or 10% if probing == 3: param3_range = [iseedvals[i] for i in arange(0,19)]#arange(0,191,1) # mistCell param4_range = [999]#[400] # mistStart param5_range = [1]#[200] # mistDuration param6_range = [1]#[250] # mistRate repair_range = ['']; elif probing: param3_range = arange(0,191)#arange(0,191,1) # mistCell param4_range = [100]#[400] # mistStart param5_range = [200]#[200] # mistDuration param6_range = [250]#[250] # mistRate repair_range = ['']; else: param3_range = [1000] #arange(0,191)#arange(0,191,1) # mistCell param4_range = [100]#[400] # mistStart param5_range = [200]#[200] # mistDuration param6_range = [250]#[250] # mistRate repair_range = ['both']; #['single', 'multi'];#, selectCellPerturbs = [[2,2],[30,9]] selectSynPerturbs = [[43,45],[8,34]] # save params with open('stimdata/params', 'w') as f: pickle.dump([param, wseed_range, inseed_range], f) # to save LFPs and EMGs" calcErr = -1 # Loop over repair types (using single, multi or both probing seqs) for irepair in repair_range: targetCounter = -1 # Loop over target vals for target in target_range: targetCounter += 1 # Loop over wiring seed... if target == 1: iseed = iseedvals[12] elif target == 3: iseed = iseedvals[22] mistparam1 = 'stimdata/target-%d_i-%d_w-120456_plastnq.nqs' % (target,iseed) for wseed in wseed_range: wseedval = wseedvals # Loop over param1 vals for param1 in param1_range: param2Counter = -1 # Loop over param2 vals for param2 in param2_range: param2Counter += 1 # Loop over param3 vals for param3 in param3_range: # Loop over param4 vals for param4 in param4_range: # Loop over param5 vals for param5 in param5_range: # Loop over param6 vals for param6 in param6_range: if (param5 > 0 and param6 > 0):# generate microstim if probing == 1: # probing data with single cell stim (filename includes mist details) outfilestem = 'stimdata/target-%d_ptype-%d_pperc-%d_cell-%d_start-%d_dur-%d_rate-%d' % \ (target, param1, param2, param3, param4, param5, param6) makeProbingStims(outfilestem, param3,param4,param5,param6) # generate .txt file probing stim elif probing == 2: # probing data with multiple cell stim (filename includes mist details and 'multi') outfilestem = 'stimdata/target-%d_ptype-%d_pperc-%d_cell-%d_start-%d_dur-%d_rate-%d_multi' % \ (target, param1, param2, param3, param4, param5, param6) makeMultProbingStims(outfilestem, param3,param4,param5,param6) # generate .txt file probing stim elif probing == 3: # special case: generating multiple test iseeds (no probing or repair) outfilestem = 'stimdata/target-%d_ptype-%d_pperc-%d_iseed-%d_start-%d_dur-%d_rate-%d' % \ (target, param1, param2, param3, param4, param5, param6) elif probing == 0: # repair data (file name says 'repair') outfilestem = 'stimdata/target-%d_ptype-%d_pperc-%d_%s_repair' % (target, param1, param2, irepair) # generate perturbations (saves data to file so can be read by sim) # or copies over specific perturbation file previously selected if param1 == 0: iPerturb = selectCellPerturbs[param2Counter][targetCounter] filename = 'stimdata/target-%d_ptype-%d_pperc-%d_cell-%d_start-%d_dur-%d_rate-%d' % \ (target, param1, param2, iPerturb, 0, 0, 0) copyPerturbCellsFile(filename, outfilestem) elif param1 == 1: iPerturb = selectSynPerturbs[param2Counter][targetCounter] filename = 'stimdata/target-%d_ptype-%d_pperc-%d_cell-%d_start-%d_dur-%d_rate-%d' % \ (target, param1, param2, iPerturb, 0, 0, 0) copyPerturbSynsFile(filename, outfilestem) print filename # launch sim if probing == 3: sys_str = './runsim_neurostim %s %.2f %.3f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %d %d %d %d %s' % \ (outfilestem, param[0], param[1], param[2], param[3], param[4], param[5], param[6], param[7], param[8], param[9], param[10], param[11], param[12], param[13], param[14], param[15], \ param[16], param[17], param[18], param[19], param[20], target, param3, wseedval, calcErr, mistparam1) else: sys_str = './runsim_neurostim %s %.2f %.3f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %d %d %d %d %s' % \ (outfilestem, param[0], param[1], param[2], param[3], param[4], param[5], param[6], param[7], param[8], param[9], param[10], param[11], param[12], param[13], param[14], param[15], \ param[16], param[17], param[18], param[19], param[20], target, iseed, wseedval, calcErr, mistparam1) print sys_str # Open a pipe to the qsub command. # output, input = popen2('qsub') # # Customize your options here # job_name = outfilestem # walltime = "00:30:00" # processors = "nodes=1:ppn=2" # command = sys_str # job_string = """#!/bin/bash # #PBS -N %s # #PBS -l walltime=%s # #PBS -q longerq # #PBS -l %s # #PBS -o %s.out # #PBS -e %s.err # cd $PBS_O_WORKDIR # echo $PBS_O_WORKDIR # %s""" % (job_name, walltime, processors, job_name, job_name, command) # # Send job_string to qsub # input.write(job_string) # input.close() os.system(sys_str) # Print your job and the response to the screen # print job_string # print output.read() time.sleep(0.1)