+ extended docu
[qpalma.git] / qpalma / SettingsParser.py
index cb09308..83b0858 100644 (file)
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
+# 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 2 of the License, or
+# (at your option) any later version.
+#
+# Written (W) 2008 Fabio De Bona
+# Copyright (C) 2008 Max-Planck-Society
+
+#
+# This file contains the main interface to the QPalma pipeline.
+#
 
 import os 
+import re
 import os.path 
-import pdb 
 import sys 
-from optparse import OptionParser 
+import pdb
+
 jp = os.path.join
 
+
 def parseSettingsFile(filename):
    """
+   This function parse all key value pairs from the given filename
    """
-   global_settings = {}
+   settings = {}
    for line in open(filename):
       if (not line.strip()) or line.startswith('#'):
          pass
       else:
-         key, val = line.strip().replace(' ', '').split('=')
-         global_settings[key] = val
+         line = line.strip()
+         line = re.sub('\s', '', line)  
+         key, val = line.split('=')
 
-   return global_settings
+         settings[key] = val
 
+   return settings
 
 
-def makeSettings(global_settings):
+def makeSettings(settings):
    """
    
    """
-   assert os.path.exists(global_settings['result_dir']),'Error: You have to specify a existing result directory!'
-   result_dir = global_settings['result_dir']
-   global_settings['approximation_dir'] = jp(result_dir, 'approximation')
-   global_settings['preproc_dir'] = jp(result_dir, 'preprocessing')
-   global_settings['postproc_dir'] = jp(result_dir, 'postprocessing')
-   global_settings['prediction_dir'] = jp(result_dir, 'prediction')
-   global_settings['training_dir'] = jp(result_dir, 'training')
-
-   for dir_name in ['approximation_dir', 'preproc_dir', 'postproc_dir',\
-     'prediction_dir', 'training_dir']:
+   assert os.path.exists(settings['result_dir']),'Error: You have to specify a existing result directory!'
+   result_dir = settings['result_dir']
+   settings['approximation_dir'] = jp(result_dir, 'approximation')
+   settings['dataset_dir'] = jp(result_dir, 'dataset')
+   settings['preproc_dir'] = jp(result_dir, 'preprocessing')
+   settings['postproc_dir'] = jp(result_dir, 'postprocessing')
+   settings['prediction_dir'] = jp(result_dir, 'prediction')
+   settings['training_dir'] = jp(result_dir, 'training')
+   settings['alignment_dir'] = jp(result_dir, 'alignment')
+
+   for dir_name in ['approximation_dir','dataset_dir', 'preproc_dir', 'postproc_dir',\
+     'prediction_dir', 'training_dir', 'alignment_dir']:
       try:
-         os.mkdir(global_settings[dir_name])
+         os.mkdir(settings[dir_name])
          continue
       except:
          print ('Error: There was a problem generating the subdirectory: %s' % dir_name)
 
+   #assert checkSettings(settings),'Check your settings some entries were invalid!'
+
+   ddir = settings['dataset_dir']
+   settings['prediction_dataset_fn']      = jp(ddir,'prediction_data.pickle')
+   settings['prediction_dataset_keys_fn'] = jp(ddir,'prediction_data.keys.pickle')
+   settings['training_dataset_fn']        = jp(ddir,'training_data.pickle')
+   settings['training_dataset_keys_fn']   = jp(ddir,'training_data.keys.pickle')
+
    try:
-      os.mkdir(global_settings['global_log_fn'])
+      os.mknod(settings['global_log_fn'])
    except:
-      print ('Error: There was a problem generating the logfile %s' % global_settings['global_log_fn'])
+      print 'Error: There was a problem generating the logfile %s' % settings['global_log_fn']
 
-   return global_settings
+   # addd checking support!!
+   settings['allowed_fragments'] = eval(settings['allowed_fragments'])
 
+   TF = [True,False]
 
+   # convert and check all boolean parameters
+   for parameter in ['enable_quality_scores', 'enable_intron_length', 'enable_splice_scores',\
+   'remove_duplicate_scores', 'print_matrix']:
 
-def checkSettings(global_settings):
-   for (key, val,) in global_settings.items():
-      if key.endswith('_fn'):
-         assert os.path.exists(val), 'Error: Path/File %s with value %s does not seem to exist!' % (key,val)
-      if key.endswith('_dir'):
-         assert os.path.exists(val), 'Error: Path/File %s with value %s does not seem to exist!' % (key,val)
+      try:
+         settings[parameter]   = eval(settings[parameter])
+         assert settings[parameter] in TF
+      except:
+         print "Unexpected error:", sys.exc_info()[0]
+         print 'The value of %s has to be either True or False!'%parameter
+
+   # now convert and check all integer parameters
+   for parameter in ['matchmatrixCols', 'matchmatrixRows', 'numAccSuppPoints', 'numConstraintsPerRound',\
+   'numDonSuppPoints', 'numLengthSuppPoints', 'numQualPlifs', 'numQualSuppPoints', 'anzpath', 'iter_steps',\
+   'max_intron_len', 'max_qual', 'min_intron_len', 'min_qual', 'totalQualSuppPoints','C','num_splits','prb_offset','half_window_size']:
+         
+      try:
+         settings[parameter] = int(settings[parameter])
+      except:
+         print 'Error: %s has to be an integer!'%parameter
 
-   return True
+   # now convert and check all integer parameters
+   for parameter in ['max_svm_score','min_svm_score']:
+         
+      try:
+         settings[parameter] = float(settings[parameter])
+      except:
+         print 'Error: %s has to be an float!'%parameter
 
+   return settings
+
+
+def checkSettings(settings):
+   for (key, val,) in settings.items():
+      if key.endswith('_fn') or key.endswith('_dir'):
+         assert os.path.exists(val), 'Error: Path/File %s with value %s does not seem to exist!' % (key,val)
+   return True
 
 
 def parseSettings(filename):
-   global_settings = parseSettingsFile(filename)
-   global_settings = makeSettings(global_settings)
-   assert checkSettings(global_settings),'Check your settings some entries were invalid!'
+   settings = parseSettingsFile(filename)
+   settings = makeSettings(settings)
+   #assert checkSettings(settings)
+   return settings
 
-   return global_settings
+if __name__ == '__main__':
+   print parseSettings(sys.argv[1])