# -*- python -*-
#
# This file is part of DREAMTools software
#
# Copyright (c) 2014-2015 - EBI-EMBL
#
# File author(s): Thomas Cokelaer <cokelaer@ebi.ac.uk>
#
# Distributed under the GPLv3 License.
# See accompanying file LICENSE.txt or copy at
# http://www.gnu.org/licenses/gpl-3.0.html
#
# website: http://github.org/dreamtools
#
##############################################################################
"""D9dot5C1 challenge scoring functions"""
import os
import pandas as pd
from easydev import TempFile, shellcmd
from dreamtools.core.ziptools import ZIP
from dreamtools.core.challenge import Challenge
from dreamtools.core.downloader import Downloader
__all__ = ['D9dot5C1']
[docs]class D9dot5C1(Challenge):
"""A class dedicated to D9dot5C1 challenge
::
from dreamtools import D9dot5C1
s = D9dot5C1()
s.download_templates()
s.score('templates.txt.gz') # takes about 5 minutes
"""
def __init__(self, verbose=True, download=True, **kargs):
""".. rubric:: constructor """
super(D9dot5C1, self).__init__('D9dot5C1', verbose, download, **kargs)
self.sub_challenges = ['sc1','sc2']
self.download_gs()
[docs] def score(self, filename, sub_challenge_name):
if sub_challenge_name == 'sc1':
self.score_sc1(filename)
if sub_challenge_name == 'sc2':
self.score_sc2(filename)
else:
raise ValueError('Invalid sub challenge name. Use %s' % self.sub_challenges)
[docs] def score_sc1(self, prediction_file):
"""Compute all results and compare user prediction with all official participants
This scoring function can take a long time (about 5-10 minutes).
"""
fh = TempFile()
gs1, _ = self.download_gs()
script = self.classpath + os.sep + "DREAM_Olfaction_scoring_Q1.pl"
cmd = "perl %s %s %s %s"
cmd = cmd % (script, prediction_file, fh.name, gs1)
shellcmd(cmd)
df = pd.read_csv(fh.name, sep='\t', index_col=None).ix[0]
fh.delete()
return df
# score sub1 = (zint +zple +zdec)/3
# sigma_int = 0.0787
# sigma_ple = 0.176
# signa_dec = 0.0042
# final is average of zscores
[docs] def score_sc2(self, prediction_file):
fh = TempFile()
_, gs2 = self.download_gs()
script = self.classpath + os.sep + "DREAM_Olfaction_scoring_Q2.pl"
cmd = "perl %s %s %s %s"
cmd = cmd % (script, prediction_file, fh.name, gs2)
shellcmd(cmd)
df = pd.read_csv(fh.name, sep='\t', index_col=None).ix[0]
fh.delete()
return df
# intensity + pleasantness + dec_19others and sigma_int
# score sub2 = 1/6 * (z_int + z_ple z_dec + z_sigma_int + z_sigma_ple +
# z_sigma_dec)
# sigma_int = 0.1193
# sigma_ple = 0.1265
# sigma_dec = 0.0265
# sigma_sigma_int = 0.1195
# sigma_sigma_ple = 0.1149
# sigma_sigma_dec = 0.0281
[docs] def download_template(self, name):
filename1, filename2 = self.download_templates()
if name == 'sc1':
return filename1
elif name == 'sc2':
return filename2
else:
raise ValueError("Invalid name provided. Use %s" % self.sub_challenges)
[docs] def download_templates(self):
"""Download a template from synapse into ~/config/dreamtools/dream5/D5C2
:return: filename and its full path
"""
filename1 = self._download_data('CecchiG_LB_s1_ok.txt', 'syn4538204')
filename2 = self._download_data('CecchiG_LB_s2_ok.txt', 'syn4538216')
return filename1, filename2
[docs] def download_gs(self):
self.gs2_filename = self._download_data('GS2.txt', 'syn4538229')
self.gs1_filename = self._download_data('GS1.txt', 'syn4538223')
return self.gs1_filename, self.gs2_filename
def _download_data(self, name, synid):
filename = self.directory + os.sep + name
if os.path.exists(filename) is False:
# must download the data now
print("File %s not found. Downloading from Synapse. You must have a login." % filename)
d = Downloader(self.alias)
d.download(synid)
return filename
[docs] def download_goldstandard(self, subname):
gs1, gs2 = self.download_gs()
if subname == 'gs1':
return gs1
elif subname == 'gs2':
return gs2