From 1cfc7b4be5627608e6b6d16eb7572fba1892ace2 Mon Sep 17 00:00:00 2001 From: zsloan Date: Wed, 2 Feb 2022 18:48:46 +0000 Subject: Add covarstruct for rqtl mapping Added a function for generating a covarstruct file required for R/qtl mapping This file contains info on whether each covariate is categorical or numerical and is generated by querying the TraitMetadata table in the DB --- wqflask/wqflask/marker_regression/rqtl_mapping.py | 33 +++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/wqflask/wqflask/marker_regression/rqtl_mapping.py b/wqflask/wqflask/marker_regression/rqtl_mapping.py index 34b10fc5..e6421fe2 100644 --- a/wqflask/wqflask/marker_regression/rqtl_mapping.py +++ b/wqflask/wqflask/marker_regression/rqtl_mapping.py @@ -1,6 +1,7 @@ import csv import hashlib import io +import json import requests import shutil from typing import Dict @@ -10,6 +11,8 @@ from typing import TextIO import numpy as np +from flask import g + from base.webqtlConfig import TMPDIR from base.trait import create_trait from utility.tools import locate, GN3_LOCAL_URL @@ -35,6 +38,10 @@ def run_rqtl(trait_name, vals, samples, dataset, mapping_scale, model, method, n "scale": mapping_scale } + if cofactors: + covarstruct_file = write_covarstruct_file(cofactors) + post_data["covarstruct"] = covarstruct_file + if do_control == "true" and control_marker: post_data["control"] = control_marker @@ -63,6 +70,32 @@ def get_hash_of_textio(the_file: TextIO) -> str: return hash_of_file +def write_covarstruct_file(cofactors: str) -> str: + """ + Given list of cofactors (as comma-delimited string), write + a comma-delimited file where the first column consists of cofactor names + and the second column indicates whether they're numerical or categorical + """ + datatype_query = "SELECT value FROM TraitMetadata WHERE type='trait_data_type'" + trait_datatype_json = json.loads(g.db.execute(datatype_query).fetchone()[0]) + + covar_struct_file = io.StringIO() + writer = csv.writer(covar_struct_file, delimiter="\t", quoting = csv.QUOTE_NONE) + for cofactor in cofactors.split(","): + datatype = trait_datatype_json[cofactor] if cofactor in trait_datatype_json else "numerical" + cofactor_name = cofactor.split(":")[0] + writer.writerow([cofactor_name, datatype]) + + hash_of_file = get_hash_of_textio(covar_struct_file) + file_path = TMPDIR + hash_of_file + ".csv" + + with open(file_path, "w") as fd: + covar_struct_file.seek(0) + shutil.copyfileobj(covar_struct_file, fd) + + return file_path + + def write_phenotype_file(trait_name: str, samples: List[str], vals: List, -- cgit v1.2.3