#!/usr/bin/env python
"""
epitopepredict config
Created March 2016
Copyright (C) Damien Farrell
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""
from __future__ import absolute_import, print_function
import sys, os, string, time
import types, re, subprocess, glob, shutil
from collections import OrderedDict
import pandas as pd
try:
import configparser
except:
import ConfigParser as configparser
path = os.path.dirname(os.path.abspath(__file__))
datadir = os.path.join(path, 'data')
home = os.path.expanduser("~")
config_path = os.path.join(home, '.config/epitopepredict')
baseoptions = OrderedDict()
baseoptions['base'] = {'predictors': 'tepitope',
'mhc2_alleles':'HLA-DRB1*01:01,HLA-DRB1*04:01',
'mhc1_alleles':'HLA-A*01:01',
'mhc1_length': 11,
'mhc2_length': 11,
'n': 2, #number of alleles
'cutoff_method': 'default',
'cutoffs': .95, #percentile cutoff
'sequence_file':'', #genbank/fasta file
'peptide_file':'', #plain text list of peptides
'path': 'results',
'overwrite': 'no',
'verbose':'no',
'names': '', #subset of protein names
'overwrite': 'no',
'threads': 1,
'compression': '',
'fasta_header_sep': ' '}
baseoptions['iedbtools'] = {'iedbmhc1_path':'', 'iedbmhc2_path':'',
'iedb_mhc1_method':'IEDB_recommended',
'iedb_mhc2_method':'IEDB_recommended'}
baseoptions['neopredict'] = {'vcf_files':'', 'ensembl_release':'75',
'selection_method':'promiscuity'}
[docs]def write_default_config():
"""Write a default config to users .config folder. Used to add global settings."""
fname = os.path.join(config_path, 'default.conf')
os.makedirs(config_path, exist_ok=True)
if not os.path.exists(fname):
write_config(conffile=fname, defaults=baseoptions)
return fname
[docs]def write_config(conffile='default.conf', defaults={}):
"""Write a default config file"""
if not os.path.exists(conffile):
cp = create_config_parser_from_dict(defaults, ['base','iedbtools'])
cp.write(open(conffile,'w'))
print ('wrote config file %s' %conffile)
return conffile
[docs]def create_config_parser_from_dict(data=None, sections=['base','iedbtools'], **kwargs):
"""Helper method to create a ConfigParser from a dict of the form shown in
baseoptions"""
if data is None:
data = baseoptions
#print (data)
cp = configparser.ConfigParser()
for s in sections:
cp.add_section(s)
if not s in data:
continue
for name in sorted(data[s]):
val = data[s][name]
if type(val) is list:
val = ','.join(val)
cp.set(s, name, str(val))
#use kwargs to create specific settings in the appropriate section
for s in cp.sections():
opts = cp.options(s)
for k in kwargs:
if k in opts:
cp.set(s, k, kwargs[k])
return cp
[docs]def parse_config(conffile=None):
"""Parse a configparser file"""
f = open(conffile,'r')
cp = configparser.ConfigParser()
try:
cp.read(conffile)
except Exception as e:
print ('failed to read config file! check format')
print ('Error returned:', e)
return
f.close()
return cp
[docs]def get_options(cp):
"""Makes sure boolean opts are parsed"""
from collections import OrderedDict
options = OrderedDict()
#options = cp._sections['base']
for section in cp.sections():
options.update( (cp._sections[section]) )
for o in options:
for section in cp.sections():
try:
options[o] = cp.getboolean(section, o)
except:
pass
try:
options[o] = cp.getint(section, o)
except:
pass
return options
[docs]def print_options(options):
"""Print option key/value pairs"""
for key in options:
print (key, ':', options[key])
print ()
[docs]def check_options(opts):
"""Check for missing default options in dict. Meant to handle
incomplete config files"""
sections = list(baseoptions.keys())
for s in sections:
defaults = dict(baseoptions[s])
for i in defaults:
if i not in opts:
opts[i] = defaults[i]
return opts