-
Notifications
You must be signed in to change notification settings - Fork 1
/
IonWisecondor.py
97 lines (84 loc) · 3.19 KB
/
IonWisecondor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/usr/bin/env python
from ion.plugin import *
import os
import sys
import json
import subprocess
from multiprocessing.pool import Pool
import glob
import pickle
from django.template import Context, Template
from django.conf import settings
class IonWisecondor(IonPlugin):
""" IonWisecondor """
version = "2.0"
allow_autorun = False
author = "sacha@labsquare.org"
envDict = dict(os.environ)
def launch(self, data=None):
print("Launch started...")
# ================ GET GLOBAL PATH
self.outputDir = os.environ["RESULTS_DIR"]; # The wisecondor results directory
self.analysisDir = os.environ["ANALYSIS_DIR"];
self.pluginDir = os.environ["PLUGIN_PATH"];
self.urlRoot = os.environ["URL_ROOT"] # /output/Home/X/
self.urlPlugin = os.environ["TSP_URLPATH_PLUGIN_DIR"] # /output/Home/X/plugin_out/IonWisecondor
self.date = os.environ["TSP_ANALYSIS_DATE"]
# ================ GET INSTANCE PARAMETERS AND STORE THEM IN A LIST
fileCount = int(os.environ["PLUGINCONFIG__COUNT"])
files = []
for i in range(fileCount):
item = {}
key = "PLUGINCONFIG__ITEMS__"+str(i)
barcode = os.environ[key+"__BARCODE"]
sample = os.environ[key+"__SAMPLE"]
input = self.analysisDir +"/" + barcode + "_rawlib.bam"
sample = sample.replace(' ', '_')
item["sample"] = sample
item["barcode"] = barcode
item["key"] = key
item["input"] = input
item["pickle"] = self.urlPlugin + "/" + sample + "_" + self.date +".pickle"
item["gcc"] = self.urlPlugin + "/" + sample + "_" + self.date +".gcc"
item["tested"] = self.urlPlugin + "/" + sample + "_" + self.date +".tested"
item["pdf"] = self.urlPlugin + "/" + sample + "_" + self.date +".pdf"
files.append(item)
# ================ LOOP ON EACH FILES AND START COMPUTATION
for item in files:
# Launch run.sh
cmd = self.pluginDir+"/run.sh %s %s %s %s %s" % (item["input"], self.outputDir, self.pluginDir, item["sample"], self.date)
p1 = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
stdout, stderr = p1.communicate()
# Check error
if p1.returncode == 0:
# Compute average of zSmoothDict from sample_rawlib.tested
filePath = os.environ["RESULTS_DIR"] + "/" + item["sample"] + "_" + self.date + ".tested"
item["s21"] = self.scoreOf(filePath, "21")
item["s18"] = self.scoreOf(filePath, "18")
item["s13"] = self.scoreOf(filePath, "13")
print(stdout)
else:
raise Exception(stderr)
# ================ GENERATE RESULTS HTML FROM DJANGO TEMPLATE SYSTEM
settings.configure()
source = open(os.environ["RUNINFO__PLUGIN__PATH"] + "/block_template.html", "r").read()
t = Template(source)
# Pass files arguments to the template
c = Context({'files': files})
html = t.render(c)
# Output html render
f = open(self.outputDir+"/resultat_block.html","w")
f.write(html)
f.close()
def scoreOf(self, testedFile, chrom):
with open(testedFile) as file:
data = pickle.loads(file.read())
zScores = data["zSmoothDict"][chrom]
score = -1
try:
score = sum(zScores) / len(zScores)
except :
score = -1
return round(score,2)
if __name__ == "__main__":
PluginCLI()