import os
import pandas as pd
from BLRun.runner import Runner
[docs]class PPCORRunner(Runner):
"""Concrete runner for the PPCOR GRN inference algorithm."""
[docs] def run(self):
'''
Function to run PPCOR algorithm
'''
cmdToRun = ' '.join(['docker run --rm',
f"-v {self.working_dir}:/usr/working_dir",
f'{self.image} /bin/sh -c \"time -v -o',
"/usr/working_dir/time.txt",
'Rscript runPPCOR.R',
"/usr/working_dir/ExpressionData.csv", "/usr/working_dir/outFile.txt", '\"'])
# Run command
self._run_docker(cmdToRun)
[docs] def parseOutput(self):
'''
Function to parse outputs from PPCOR.
'''
workDir = self.working_dir
outFile = workDir / 'outFile.txt'
# Quit if output file does not exist
if not outFile.exists():
print(str(outFile) + ' does not exist, skipping...')
return
# Read output
OutDF = pd.read_csv(outFile, sep = '\t', header = 0)
# edges with significant p-value
part1 = OutDF.loc[OutDF['pValue'] <= float(self.params['pVal'])]
part1 = part1.assign(absCorVal = part1['corVal'].abs())
# edges without significant p-value
part2 = OutDF.loc[OutDF['pValue'] > float(self.params['pVal'])]
part1_sorted = part1.sort_values('absCorVal', ascending=False)
part2_out = part2[['Gene1', 'Gene2']].copy()
part2_out['EdgeWeight'] = 0.0
self._write_ranked_edges(pd.concat([
part1_sorted[['Gene1', 'Gene2']].assign(EdgeWeight=part1_sorted['corVal']),
part2_out,
], ignore_index=True)[['Gene1', 'Gene2', 'EdgeWeight']])