def create_instance(self, inst_name, conf_builder, flow_file): "Creates a new workflow instance" #TODO check in the db if inst_name in self._instances_map: raise Exception("Instance with this name already exists: {}".format(inst_name)) self._log.debug("Creating instance {} from {} ...".format(inst_name, flow_file)) cb = ConfigBuilder() cb.add_value("wok.__instance.name", inst_name) cb.add_value("wok.__instance.work_path", os.path.join(self._work_path, inst_name)) cb.add_builder(conf_builder) # Create instance inst = Instance(self, inst_name, cb, flow_file) try: # Initialize instance and register by name inst.initialize() self._instances += [inst] self._instances_map[inst_name] = inst self._cvar.notify() #TODO self._db.instance_persist(inst) except: self._log.error("Error while creating instance {} for the workflow {} with configuration {}".format(inst_name, flow_file, cb())) raise self._log.debug("\n" + repr(inst)) return inst
def project_analysis(files, assembly="hg19", conf_builder=None): cb = ConfigBuilder(conf_builder) cb.add_value("files", files) cb.add_value("assembly", assembly) conf = cb.get_conf() flow_uri = "intogen-mutations:project" return cb, flow_uri
def projects_analysis(scan_paths, includes, excludes, conf_builder=None): cb = ConfigBuilder(conf_builder) cb.add_value("scan_paths", scan_paths) cb.add_value("includes", includes) cb.add_value("excludes", excludes) conf = cb.get_conf() flow_uri = "intogen-mutations:project" return cb, flow_uri
def run(type): if type not in [COHORT_ANALYSIS, SINGLE_TUMOR_ANALYSIS]: abort(400) if request.method == "GET": form = dict( ofm_genes_threshold=ONCODRIVEFM_GENES_THRESHOLD, ofm_pathways_threshold=ONCODRIVEFM_PATHWAYS_THRESHOLD, oclust_genes_threshold=ONCODRIVECLUST_MUTATIONS_THRESHOLD) return render_template("analysis.html", type=type, form=form) if current_app.wok.cases_count(current_user) >= current_app.config.get("LIMIT_NUM_CASES", 100): flash("""There is a limit on the number of simultaneous analysis that can be managed. You must remove finished analysis before running new ones.""", "error") return redirect(url_for("cases.index")) mutations_file = request.files['mutations_file'] file_name = os.path.basename(mutations_file.filename) project_id = request.form['project_name'] if len(project_id) == 0: project_id = os.path.splitext(file_name)[0] project_id = unique_project_id(normalize_id(project_id)) ''' if not current_user.validated: flash("""You can not run an analysis with your data until you are completely registered. Please check your email and follow the instructions to validate this account.""", "error") flash("Meanwhile you can play with the included examples.") return redirect(url_for("examples")) ''' cb = ConfigBuilder() cb.add_value("user_id", current_user.nick) cb.add_value("workspace", DEFAULT_WORKSPACE) cb.add_value("project.id", project_id) #case_name = "-".join([current_user.nick, project_id]) #cb.add_value("wok.instance.name", case_name) results_path, project_path, project_temp_path = get_paths(project_id) if not current_user.is_anonymous(): cb.add_value("website.user_id", current_user.nick) if type == SINGLE_TUMOR_ANALYSIS: #request.form.get("variants_only") == "1": cb.add_value("variants_only", True) cb.add_value("skip_oncodrivefm", True) cb.add_value("skip_oncodriveclust", True) try: threshold = request.form["ofm_genes_threshold"] if re.match(r"^[1-9]\d*%?$", threshold): cb.add_value(ONCODRIVEFM_GENES_THRESHOLD_KEY, threshold) except: if type == COHORT_ANALYSIS: current_app.logger.warn("[{}] Wrong form input: {}={}".format( current_user.nick, "ofm_genes_threshold", request.form.get("ofm_genes_threshold"))) try: threshold = request.form["ofm_pathways_threshold"] if re.match(r"^[1-9]\d*%?$", threshold): cb.add_value(ONCODRIVEFM_PATHWAYS_THRESHOLD_KEY, threshold) except: if type == COHORT_ANALYSIS: current_app.logger.warn("[{}] Wrong form input: {}={}".format( current_user.nick, "ofm_pathways_threshold", reuqest.form.get("ofm_pathways_threshold"))) try: threshold = int(request.form["oclust_genes_threshold"]) if threshold >= 1: cb.add_value(ONCODRIVECLUST_GENES_THRESHOLD_KEY, threshold) except: if type == COHORT_ANALYSIS: current_app.logger.warn("[{}] Wrong form input: {}={}".format( current_user.nick, "oclust_genes_threshold", request.form.get("oclust_genes_threshold"))) genes_filter_enabled = request.form.get('genes_filter_enabled') == "1" cb.add_value(ONCODRIVEFM_FILTER_ENABLED_KEY, genes_filter_enabled) cb.add_value(ONCODRIVECLUST_FILTER_ENABLED_KEY, genes_filter_enabled) if genes_filter_enabled: try: genes_filter_file = request.files['genes_filter_file'] genes_filter_file_path = os.path.join(project_temp_path, "genes-filter.txt") genes_filter_file.save(genes_filter_file_path) if os.path.getsize(genes_filter_file_path) != 0: cb.add_value(ONCODRIVEFM_GENES_FILTER_KEY, genes_filter_file_path) cb.add_value(ONCODRIVECLUST_GENES_FILTER_KEY, genes_filter_file_path) except: current_app.logger.exception("Error retrieving genes filter from form") assembly = request.form.get("assembly", DEFAULT_ASSEMBLY).lower() project = dict( id=project_id, assembly=assembly, files=[file_name]) projects = [init_project_files(project, check_paths=False)] cb.add_value("projects", projects) properties = dict( analysis_type=type, path=os.path.relpath(project_path, results_path)) current_app.logger.info("[{}] Starting analysis {} ...".format(current_user.nick, project_id)) case = current_app.wok.create_case(current_user, project_id, cb, PROJECT_NAME, MUTATIONS_FLOW_NAME, properties=properties, start=False) engine_case = current_app.wok.engine.case(case.engine_name) #TODO use a background thread upload_files(current_app.logger, case.engine_name, engine_case.storages, projects, streams=[mutations_file.stream]) current_app.logger.info("[{}] Analysis {} started on case {}...".format( current_user.nick, project_id, case.engine_name)) engine_case.start() return redirect(url_for("cases.index", highlight=case.id))
def run(type): if type not in [COHORT_ANALYSIS, SINGLE_TUMOR_ANALYSIS]: abort(400) if request.method == "GET": form = dict( ofm_genes_threshold=ONCODRIVEFM_GENES_THRESHOLD, ofm_pathways_threshold=ONCODRIVEFM_PATHWAYS_THRESHOLD, oclust_genes_threshold=ONCODRIVECLUST_MUTATIONS_THRESHOLD) return render_template("analysis.html", type=type, form=form) mutations_file = request.files['mutations_file'] file_name = os.path.basename(mutations_file.filename) project_id = request.form['project_name'] if len(project_id) == 0: project_id = os.path.splitext(file_name)[0] project_id = normalize_id(project_id) i = 0 base_id = project_id while current_app.wok.exists_case(current_user, project_id): i += 1 project_id = "{}-{}".format(base_id, i) ''' if current_app.wok.exists_case(current_user, project_id): flash("An analysis with this name already exists. Please give it a different name or remove the previous one before starting again.", "error") return render_template("analysis.html", type=type, form=request.form) ''' ''' if g.demo and current_user.max_analysis != -1 and proj_manager.get_projects_count(g.conn, g.user_id) >= current_user.max_analysis: flash("""The online version is for demo only and there is a limit for the number of simultaneous analysis a user can manage. You must remove finished analysis before running new ones. Please download the pipeline and install in your system to avoid these limitations.""", "error") return redirect(url_for("download")) if not current_user.validated: flash("""You can not run an analysis with your data until you are completely registered. Please check your email and follow the instructions to validate this account.""", "error") flash("Meanwhile you can play with the included examples.") return redirect(url_for("examples")) ''' cb = ConfigBuilder(current_app.wok.conf_builder) cb.add_value("workspace", "default") cb.add_value("project.id", project_id) #case_name = "-".join([current_user.nick, project_id]) #cb.add_value("wok.instance.name", case_name) conf = cb.get_conf() results_path = os.path.join(conf["results_path"], current_user.nick) cb.add_value("results_path", results_path) temp_path = os.path.join(conf["temp_path"], current_user.nick) cb.add_value("temp_path", temp_path) conf = cb.get_conf() project_path = get_project_path(conf, project_id) if not os.path.exists(project_path): os.makedirs(project_path) project_temp_path = get_temp_path(conf, project_id) if not os.path.exists(project_temp_path): os.makedirs(project_temp_path) if not current_user.is_anonymous(): cb.add_value("website.user_id", current_user.nick) # FIXME ? type == SINGLE_TUMOR_ANALYSIS if request.form.get("variants_only") == "1": cb.add_value("variants_only", True) cb.add_value("skip_oncodrivefm", True) cb.add_value("skip_oncodriveclust", True) try: threshold = request.form["ofm_genes_threshold"] if re.match(r"^[1-9]\d*%?$", threshold): cb.add_value(ONCODRIVEFM_GENES_THRESHOLD_KEY, threshold) except: if type == COHORT_ANALYSIS: current_app.logger.warn("Undefined form input: {}".format("ofm_genes_threshold")) try: threshold = request.form["ofm_pathways_threshold"] if re.match(r"^[1-9]\d*%?$", threshold): cb.add_value(ONCODRIVEFM_PATHWAYS_THRESHOLD_KEY, threshold) except: if type == COHORT_ANALYSIS: current_app.logger.warn("Undefined form input: {}".format("ofm_pathways_threshold")) try: threshold = int(request.form["oclust_genes_threshold"]) if threshold >= 1: cb.add_value(ONCODRIVECLUST_GENES_THRESHOLD_KEY, threshold) except: if type == COHORT_ANALYSIS: current_app.logger.warn("Undefined form input: {}".format("oclust_genes_threshold")) genes_filter_enabled = request.form.get('genes_filter_enabled') == "1" cb.add_value(ONCODRIVEFM_FILTER_ENABLED_KEY, genes_filter_enabled) cb.add_value(ONCODRIVECLUST_FILTER_ENABLED_KEY, genes_filter_enabled) if genes_filter_enabled: try: genes_filter_file = request.files['genes_filter_file'] genes_filter_file_path = os.path.join(project_temp_path, "genes-filter.txt") genes_filter_file.save(genes_filter_file_path) if os.path.getsize(genes_filter_file_path) != 0: cb.add_value(ONCODRIVEFM_GENES_FILTER_KEY, genes_filter_file_path) cb.add_value(ONCODRIVECLUST_GENES_FILTER_KEY, genes_filter_file_path) except: current_app.logger.exception("Error retrieving genes filter from form") mutations_path = os.path.join(project_temp_path, file_name) try: mutations_file.save(mutations_path) except: current_app.logger.exception("Error while saving mutations file {} into {}".format(mutations_file.filename, mutations_path)) flash("""There were some problem with the input file for mutations. Please check that a file has been loaded before submitting a new analysis. This error has been already submitted to the application administrators who will take care of it as soon as possible.""") return render_template("analysis.html", type=type, form=request.form) assembly = request.form.get("assembly", "hg19").lower() cb, flow_uri = project_analysis( mutations_path, assembly=assembly, conf_builder=cb) properties = dict( analysis_type=type, path=project_path, temp_path=project_temp_path, data_file=mutations_path) current_app.logger.info("[{}] Starting analysis {} ...".format( current_user.nick, project_id)) case = current_app.wok.create_case(current_user, project_id, cb, flow_uri, properties=properties, start=True) current_app.logger.info("[{}] Analysis {} started on case {}...".format( current_user.nick, project_id, case.engine_name)) return redirect(url_for("cases.index", highlight=case.id))
def run(type): if type not in [COHORT_ANALYSIS, SINGLE_TUMOR_ANALYSIS]: abort(400) if current_app.wok.cases_count(current_user) >= current_app.config.get("LIMIT_NUM_CASES", 100): flash("""There is a limit on the number of simultaneous analysis that can be managed. You must remove finished analysis before running new ones.""", "error") return redirect(url_for("cases.index")) cb = ConfigBuilder() cb.add_value("user_id", current_user.nick) cb.add_value("workspace", DEFAULT_WORKSPACE) if not current_user.is_anonymous(): cb.add_value("website.user_id", current_user.nick) conf = get_project_conf() if type == COHORT_ANALYSIS: project_id = "cohort-example" mutations_path = get_examples_path(conf, "meduloblastoma_cohort_tier1.muts") elif type == SINGLE_TUMOR_ANALYSIS: project_id = "single-tumor-example" mutations_path = get_examples_path(conf, "pat4_crc.muts") cb.add_value("variants_only", True) cb.add_value("skip_oncodrivefm", True) cb.add_value("skip_oncodriveclust", True) project_id = unique_project_id(project_id) cb.add_value("project.id", project_id) results_path, project_path, project_temp_path = get_paths(project_id, conf=conf) assembly = "hg19" project = dict( id=project_id, assembly=assembly, files=[mutations_path]) projects = [init_project_files(project)] cb.add_value("projects", projects) properties = dict( analysis_type=type, path=os.path.relpath(project_path, results_path), data_file=mutations_path) current_app.logger.info("[{}] Starting example {} ...".format(current_user.nick, project_id)) case = current_app.wok.create_case(current_user, project_id, cb, PROJECT_NAME, MUTATIONS_FLOW_NAME, properties=properties, start=False) engine_case = current_app.wok.engine.case(case.engine_name) #TODO use a background thread upload_files(current_app.logger, case.engine_name, engine_case.storages, projects) current_app.logger.info("[{}] Example {} started on case {}...".format( current_user.nick, project_id, case.engine_name)) engine_case.start() return redirect(url_for("cases.index", highlight=case.id))
def run(type): if type not in [COHORT_ANALYSIS, SINGLE_TUMOR_ANALYSIS]: abort(400) ''' if g.demo and current_user.max_analysis != -1 and proj_manager.get_projects_count(g.conn, g.user_id) >= current_user.max_analysis: flash("""The online version is for demo only and there is a limit for the number of simultaneous analysis a user can manage. You must remove finished analysis before running new ones. Please download the pipeline and install in your system to avoid these limitations.""", "error") return redirect(url_for("download")) ''' cb = ConfigBuilder(current_app.wok.conf_builder) cb.add_value("workspace", "default") conf = cb.get_conf() results_path = os.path.join(conf["results_path"], current_user.nick) cb.add_value("results_path", results_path) temp_path = os.path.join(conf["temp_path"], current_user.nick) cb.add_value("temp_path", temp_path) if not current_user.is_anonymous(): cb.add_value("website.user_id", current_user.nick) if type == COHORT_ANALYSIS: project_id = "cohort-example" mutations_path = get_examples_path(conf, "meduloblastoma_cohort_tier1.muts") elif type == SINGLE_TUMOR_ANALYSIS: project_id = "single-tumor-example" mutations_path = get_examples_path(conf, "pat4_crc.muts") cb.add_value("variants_only", True) cb.add_value("skip_oncodrivefm", True) cb.add_value("skip_oncodriveclust", True) i = 0 base_id = project_id while current_app.wok.exists_case(current_user, project_id): i += 1 project_id = "{}-{}".format(base_id, i) cb.add_value("project.id", project_id) conf = cb.get_conf() project_path = get_project_path(conf, project_id) if not os.path.exists(project_path): os.makedirs(project_path) project_temp_path = get_temp_path(conf, project_id) if not os.path.exists(project_temp_path): os.makedirs(project_temp_path) assembly = "hg19" cb, flow_uri = project_analysis( mutations_path, assembly=assembly, conf_builder=cb) properties = dict( analysis_type=type, path=project_path, temp_path=project_temp_path, data_file=mutations_path) current_app.logger.info("[{}] Starting example {} ...".format( current_user.nick, project_id)) case = current_app.wok.create_case(current_user, project_id, cb, flow_uri, properties=properties, start=True) current_app.logger.info("[{}] Example {} started on case {}...".format( current_user.nick, project_id, case.engine_name)) return redirect(url_for("cases.index", highlight=case.id))