def runStochKitLocal(self, params): """ Submit a local StochKit job """ modelDb = StochKitModelWrapper.get_by_id(params["id"]) if not modelDb: return {'status':False, 'msg':'Failed to retrive the model to simulate.'} model = modelDb.createStochKitModel() # Execute as concentration or population? execType = params['execType'].lower() if execType not in ["deterministic", "stochastic", "sensitivity"]: raise Exception('exec_type must be deterministic, sensitivity, or stochastic. Found "{0}"'.format(execType)) if model.units.lower() == 'concentration' and execType.lower() == 'stochastic': raise Exception('Concentration models cannot be executed stochastically') # Assemble the argument list args = '' args += ' -t {0} '.format(params['time']) num_output_points = int(float(params['time'])/float(params['increment'])) args += ' -i {0} '.format(num_output_points) path = os.path.abspath(os.path.dirname(__file__)) # Algorithm, SSA or Tau-leaping? if params['execType'] != 'deterministic': executable = "{0}/../../StochKit/{1}".format(path, params['algorithm']) args += ' --realizations {0} '.format(params['realizations']) args += ' --keep-trajectories ' if int(params['seed']) < 0: random.seed() params['seed'] = random.randint(0, 2147483647) args += '--seed {0} '.format(params['seed']) else: executable = "{0}/../../ode/stochkit_ode.py".format(path) # Columns need to be labeled for visulatization page to work. args += ' --label' cmd = executable + ' ' + args basedir = path + '/../' dataDir = tempfile.mkdtemp(dir = basedir + 'output') # Wow, what a hack if params['execType'] == 'deterministic' and model.units.lower() == 'population': document = model.serialize() model = StochMLDocument.fromString(document).toModel(model.name) for reactionN in model.getAllReactions(): reaction = model.getAllReactions()[reactionN] if reaction.massaction: if len(reaction.reactants) == 1 and reaction.reactants.values()[0] == 2: reaction.marate.setExpression(reaction.marate.expression + ' / 2') modelFileName = '{0}/{1}.xml'.format(dataDir, model.name) fmodelHandle = open(modelFileName, 'w') fmodelHandle.write(model.serialize()) fmodelHandle.close() cmd += ' -m {0} --out-dir {1}/result'.format(modelFileName, dataDir) logging.info("cmd =\n{}".format(cmd)) logging.debug('simulation.runLocal(): cmd={0}'.format(cmd)) logging.debug('*'*80) logging.debug('*'*80) #ode = "{0}/../../ode/stochkit_ode.py {1}".format(path, args) exstring = '{0}/backend/wrapper.py {1}/stdout {1}/stderr {1}/return_code {2}'.format(basedir, dataDir, cmd) logging.debug('simulation.runLocal(): exstring={0}'.format(exstring)) logging.debug('*'*80) logging.debug('*'*80) handle = subprocess.Popen(exstring.split(), preexec_fn=os.setsid) # Create a wrapper to store the Job description in the datastore job = StochKitJobWrapper() job.resource = 'Local' # stochkit_job.uuid = res['uuid'] job.user_id = self.user.user_id() job.startTime = time.strftime("%Y-%m-%d-%H-%M-%S") job.name = params['jobName'] job.modelName = model.name job.pid = handle.pid # Create a StochKitJob instance job.indata = json.dumps( { "type" : 'StochKit2 Ensemble', "final_time" : params['time'], "realizations" : params['realizations'], "increment" : params['increment'], "seed" : params['seed'], "exec_type" : params['execType'], "units" : model.units.lower(), "epsilon" : params['epsilon'], "threshold" : params['threshold'] } ) job.outData = dataDir job.stdout = '{0}/stdout'.format(dataDir) job.stderr = '{0}/stderr'.format(dataDir) job.status = 'Running' job.put() return job
def runMolns(self, params): """ Submit a remote molns StochKit job """ modelDb = StochKitModelWrapper.get_by_id(params["id"]) sys.stderr.write("*" * 80 + "\n") sys.stderr.write("*" * 80 + "\n") sys.stderr.write("runMolns\n") logging.info('runMolns') sys.stderr.write("*" * 80 + "\n") sys.stderr.write("*" * 80 + "\n") if not modelDb: return { 'status': False, 'msg': 'Failed to retrive the model to simulate.' } model = modelDb.createStochKitModel() # Execute as concentration or population? execType = params['execType'].lower() if execType not in ["deterministic", "stochastic", "sensitivity"]: raise Exception( 'exec_type must be deterministic, sensitivity, or stochastic. Found "{0}"' .format(execType)) if model.units.lower() == 'concentration' and execType.lower( ) == 'stochastic': raise Exception( 'Concentration models cannot be executed stochastically') # Assemble the argument list args = '' args += ' -t {0} '.format(params['time']) num_output_points = int( float(params['time']) / float(params['increment'])) args += ' -i {0} '.format(num_output_points) path = os.path.abspath(os.path.dirname(__file__)) # Algorithm, SSA or Tau-leaping? if params['execType'] != 'deterministic': executable = "/usr/local/StochKit/{0}".format(params['algorithm']) args += ' --realizations {0} '.format(params['realizations']) args += ' --keep-trajectories ' if int(params['seed']) < 0: random.seed() params['seed'] = random.randint(0, 2147483647) args += '--seed {0} '.format(params['seed']) else: executable = "/usr/local/ode-1.0.2/stochkit_ode.py" # Columns need to be labeled for visulatization page to work. args += ' --label' cmd = executable + ' ' + args basedir = path + '/../' dataDir = tempfile.mkdtemp(dir=basedir + 'output') # Wow, what a hack if params['execType'] == 'deterministic' and model.units.lower( ) == 'population': document = model.serialize() model = StochMLDocument.fromString(document).toModel(model.name) for reactionN in model.getAllReactions(): reaction = model.getAllReactions()[reactionN] if reaction.massaction: if len(reaction.reactants ) == 1 and reaction.reactants.values()[0] == 2: reaction.marate.setExpression( reaction.marate.expression + ' / 2') modelFileName = '{0}/{1}.xml'.format(dataDir, model.name) with open(modelFileName, 'w') as fmodelHandle: fmodelHandle.write(model.serialize()) cmd += ' -m {0} --out-dir ./result'.format( os.path.basename(modelFileName)) sys.stderr.write('*' * 80 + "\n") logging.error("cmd =\n{}".format(cmd)) sys.stderr.write('simulation.runMolns(): cmd={0}\n'.format(cmd)) with tempfile.NamedTemporaryFile() as exec_file: exec_file.write(cmd + "\n") exec_file.write("tar -czf result.tar.gz result") exec_file.flush() controllerName = 'EC2_controller' #TODO: look this up exec_str = "bash {0} {1}".format(exec_file.name, modelFileName) sys.stderr.write( "result = molns.MOLNSExec.start_job(['{0}', '{1}])".format( controllerName, exec_str)) sys.stderr.write('*' * 80 + "\n") molnsConfigDb = db.GqlQuery( "SELECT * FROM MolnsConfigWrapper WHERE user_id = :1", self.user.user_id()).get() if not molnsConfigDb: raise Exception("Molns not initialized") config = molns.MOLNSConfig(config_dir=molnsConfigDb.folder) result = molns.MOLNSExec.start_job([controllerName, exec_str], config) sys.stderr.write('result = {0}'.format(result)) sys.stderr.write('*' * 80 + "\n") # Create a wrapper to store the Job description in the datastore # Create a StochKitJob instance job = StochKitJobWrapper() job.resource = 'Molns' job.user_id = self.user.user_id() job.startTime = time.strftime("%Y-%m-%d-%H-%M-%S") job.name = params['jobName'] job.modelName = model.name #job.pid = None job.pid = result['id'] job.indata = json.dumps({ "type": 'StochKit2 Ensemble', "final_time": params['time'], "realizations": params['realizations'], "increment": params['increment'], "seed": params['seed'], "exec_type": params['execType'], "units": model.units.lower(), "epsilon": params['epsilon'], "threshold": params['threshold'] }) job.outData = dataDir job.status = 'Running' job.put() return job
def runStochKitLocal(self, params): """ Submit a local StochKit job """ modelDb = StochKitModelWrapper.get_by_id(params["id"]) if not modelDb: return { 'status': False, 'msg': 'Failed to retrive the model to simulate.' } model = modelDb.createStochKitModel() # Execute as concentration or population? execType = params['execType'].lower() if execType not in ["deterministic", "stochastic", "sensitivity"]: raise Exception( 'exec_type must be deterministic, sensitivity, or stochastic. Found "{0}"' .format(execType)) if model.units.lower() == 'concentration' and execType.lower( ) == 'stochastic': raise Exception( 'Concentration models cannot be executed stochastically') # Assemble the argument list args = '' args += ' -t {0} '.format(params['time']) num_output_points = int( float(params['time']) / float(params['increment'])) args += ' -i {0} '.format(num_output_points) path = os.path.abspath(os.path.dirname(__file__)) # Algorithm, SSA or Tau-leaping? if params['execType'] != 'deterministic': executable = "{0}/../../StochKit/{1}".format( path, params['algorithm']) args += ' --realizations {0} '.format(params['realizations']) args += ' --keep-trajectories ' if int(params['seed']) < 0: random.seed() params['seed'] = random.randint(0, 2147483647) args += '--seed {0} '.format(params['seed']) else: executable = "{0}/../../ode/stochkit_ode.py".format(path) # Columns need to be labeled for visulatization page to work. args += ' --label' cmd = executable + ' ' + args basedir = path + '/../' dataDir = tempfile.mkdtemp(dir=basedir + 'output') # Wow, what a hack if params['execType'] == 'deterministic' and model.units.lower( ) == 'population': document = model.serialize() model = StochMLDocument.fromString(document).toModel(model.name) for reactionN in model.getAllReactions(): reaction = model.getAllReactions()[reactionN] if reaction.massaction: if len(reaction.reactants ) == 1 and reaction.reactants.values()[0] == 2: reaction.marate.setExpression( reaction.marate.expression + ' / 2') modelFileName = '{0}/{1}.xml'.format(dataDir, model.name) fmodelHandle = open(modelFileName, 'w') fmodelHandle.write(model.serialize()) fmodelHandle.close() cmd += ' -m {0} --out-dir {1}/result'.format(modelFileName, dataDir) if params['execType'] == 'deterministic': cmd += ' -r {0} -a {1} --mxsteps {2}'.format( params['rTol'], params['aTol'], params['mxSteps']) logging.info("cmd =\n{}".format(cmd)) logging.debug('simulation.runLocal(): cmd={0}'.format(cmd)) logging.debug('*' * 80) logging.debug('*' * 80) #ode = "{0}/../../ode/stochkit_ode.py {1}".format(path, args) exstring = '{0}/backend/wrapper.py {1}/stdout {1}/stderr {1}/return_code {2}'.format( basedir, dataDir, cmd) logging.debug('simulation.runLocal(): exstring={0}'.format(exstring)) logging.debug('*' * 80) logging.debug('*' * 80) handle = subprocess.Popen(exstring.split(), preexec_fn=os.setsid) # Create a wrapper to store the Job description in the datastore job = StochKitJobWrapper() job.resource = 'local' # stochkit_job.uuid = res['uuid'] job.user_id = self.user.user_id() job.startTime = time.strftime("%Y-%m-%d-%H-%M-%S") job.name = params['jobName'] job.modelName = model.name job.pid = handle.pid # Create a StochKitJob instance job.indata = json.dumps({ "type": 'StochKit2 Ensemble', "final_time": params['time'], "realizations": params['realizations'], "increment": params['increment'], "seed": params['seed'], "exec_type": params['execType'], "units": model.units.lower(), "epsilon": params['epsilon'], "rTol": params['rTol'], "aTol": params['aTol'], "mxSteps": params['mxSteps'], "threshold": params['threshold'] }) job.outData = dataDir job.stdout = '{0}/stdout'.format(dataDir) job.stderr = '{0}/stderr'.format(dataDir) job.status = 'Running' job.put() return job
def runMolns(self, params): """ Submit a remote molns StochKit job """ modelDb = StochKitModelWrapper.get_by_id(params["id"]) sys.stderr.write("*"*80 + "\n") sys.stderr.write("*"*80 + "\n") sys.stderr.write("runMolns\n") logging.info('runMolns') sys.stderr.write("*"*80 + "\n") sys.stderr.write("*"*80 + "\n") if not modelDb: return {'status':False, 'msg':'Failed to retrive the model to simulate.'} model = modelDb.createStochKitModel() # Execute as concentration or population? execType = params['execType'].lower() if execType not in ["deterministic", "stochastic", "sensitivity"]: raise Exception('exec_type must be deterministic, sensitivity, or stochastic. Found "{0}"'.format(execType)) if model.units.lower() == 'concentration' and execType.lower() == 'stochastic': raise Exception('Concentration models cannot be executed stochastically') # Assemble the argument list args = '' args += ' -t {0} '.format(params['time']) num_output_points = int(float(params['time'])/float(params['increment'])) args += ' -i {0} '.format(num_output_points) path = os.path.abspath(os.path.dirname(__file__)) # Algorithm, SSA or Tau-leaping? if params['execType'] != 'deterministic': executable = "/usr/local/StochKit/{0}".format(params['algorithm']) args += ' --realizations {0} '.format(params['realizations']) args += ' --keep-trajectories ' if int(params['seed']) < 0: random.seed() params['seed'] = random.randint(0, 2147483647) args += '--seed {0} '.format(params['seed']) else: executable = "/usr/local/ode-1.0.2/stochkit_ode.py" # Columns need to be labeled for visulatization page to work. args += ' --label' cmd = executable + ' ' + args basedir = path + '/../' dataDir = tempfile.mkdtemp(dir = basedir + 'output') # Wow, what a hack if params['execType'] == 'deterministic' and model.units.lower() == 'population': document = model.serialize() model = StochMLDocument.fromString(document).toModel(model.name) for reactionN in model.getAllReactions(): reaction = model.getAllReactions()[reactionN] if reaction.massaction: if len(reaction.reactants) == 1 and reaction.reactants.values()[0] == 2: reaction.marate.setExpression(reaction.marate.expression + ' / 2') modelFileName = '{0}/{1}.xml'.format(dataDir, model.name) with open(modelFileName, 'w') as fmodelHandle: fmodelHandle.write(model.serialize()) cmd += ' -m {0} --out-dir ./result'.format(os.path.basename(modelFileName)) sys.stderr.write('*'*80+"\n") logging.error("cmd =\n{}".format(cmd)) sys.stderr.write('simulation.runMolns(): cmd={0}\n'.format(cmd)) with tempfile.NamedTemporaryFile() as exec_file: exec_file.write(cmd+"\n") exec_file.write("tar -czf result.tar.gz result") exec_file.flush() controllerName = 'EC2_controller' #TODO: look this up exec_str = "bash {0} {1}".format(exec_file.name, modelFileName) sys.stderr.write("result = molns.MOLNSExec.start_job(['{0}', '{1}])".format(controllerName, exec_str)) sys.stderr.write('*'*80+"\n") molnsConfigDb = db.GqlQuery("SELECT * FROM MolnsConfigWrapper WHERE user_id = :1", self.user.user_id()).get() if not molnsConfigDb: raise Exception("Molns not initialized") config = molns.MOLNSConfig(config_dir=molnsConfigDb.folder) result = molns.MOLNSExec.start_job([controllerName, exec_str], config) sys.stderr.write('result = {0}'.format(result)) sys.stderr.write('*'*80+"\n") # Create a wrapper to store the Job description in the datastore # Create a StochKitJob instance job = StochKitJobWrapper() job.resource = 'Molns' job.user_id = self.user.user_id() job.startTime = time.strftime("%Y-%m-%d-%H-%M-%S") job.name = params['jobName'] job.modelName = model.name #job.pid = None job.pid = result['id'] job.indata = json.dumps( { "type" : 'StochKit2 Ensemble', "final_time" : params['time'], "realizations" : params['realizations'], "increment" : params['increment'], "seed" : params['seed'], "exec_type" : params['execType'], "units" : model.units.lower(), "epsilon" : params['epsilon'], "threshold" : params['threshold'] } ) job.outData = dataDir job.status = 'Running' job.put() return job