+ restructured test cases
[qpalma.git] / scripts / qpalma_pipeline.py
index 3670dd7..bcb2a12 100644 (file)
@@ -1,34 +1,34 @@
 #!/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.
 #
-# This file contains the main interface to the QPalma pipeline.
-#
+# 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 os.path
+import pdb
+import sys
 
-from optparse import OptionParser
-
-
-from qpalma.gridtools import *
+from qpalma.gridtools import ApproximationTask,PreprocessingTask
+from qpalma.gridtools import AlignmentTask,PostprocessingTask
 
+from qpalma.DatasetUtils import generatePredictionDataset,generateTrainingDataset
 
-def create_option_parser():
-   parser = OptionParser()
+from qpalma.SettingsParser import parseSettings
 
-   #  
-   parser.add_option("-ci", "--check_and_init", help="check configuration and initialize directories")
-
-   #
-   parser.add_option("-r", "--run", help="write report to FILE", metavar="FILE")
-
-   #
-   parser.add_option("-xx", "--clear", action="store_false", dest="verbose", help="cleanup directories delete all created data")
-
-   return parser
+from qpalma.utils import logwrite
 
 
+Errormsg = """Usage is: python qpalma_pipeline.py predict|train <config filename>"""
 
 
 class System:
@@ -41,47 +41,115 @@ class System:
    - setting up the different pipeline modules
    - run the experiment and report the results
 
-   
    """
 
-   # Before creating a candidate spliced read dataset we have to first filter
-   # the matches from the first seed finding run.
-
-   grid_heuristic()
-
-   # approx_task = ApproximationTask(...)
-   # approx_task.createJobs()
-   # approx_task.submit()
-   # approx_task.checkIfTaskFinished()
-
-   # After filtering combine the filtered matches from the first run and the
-   # found matches from the second run to a full dataset
-
-   createNewDataset
+   def __init__(self,filename):
+      """
+      Inititalize the system by loading and parsing the settings file to obtain
+      all parameters.
+      """
+
+      self.settings = parseSettings(filename)
+      logwrite('Parsed settings system set up.',self.settings)
+
+
+   def training(self):
+      """
+      This function is responsible for the whole training process. It first
+      converts the data to the right format needed by QPalma for the training
+      algorithm.
+      """
+      logwrite('Begin of training.\n',self.settings)
+
+      print '#'*80
+      print '\t\t\tStarting approximation...\n'
+      print '#'*80
+
+      # When we are given only genomic reads we first generate artificially spliced
+      # ones in order to generate a training set
+      pre_task = TrainingPreprocessingTask(self.settings)
+      pre_task.createJobs()
+      pre_task.submit() 
+      pre_task.checkIfTaskFinished()
+
+      # Collect the data and create a pickled training set
+      generateTrainingDataset(self.settings)
+
+      # Now that we have a dataset we can perform training
+      train_task = TrainingTask(self.settings)
+      train_task.CreateJobs()
+      train_task.Submit()
+      train_task.CheckIfTaskFinished()
+
+      logwrite('End of training.\n',self.settings)
+
+
+   def prediction(self):
+      """
+      This function encapsulates all steps needed to perform a prediction. Given
+      the parameter of the training and paths to a prediction set it will
+      generate several output files containing the spliced alignments
+      """
+
+      logwrite('Begin of prediction.\n',self.settings)
+
+      print '#'*80
+      print '\t\t\tStarting approximation...\n'
+      print '#'*80
+
+      # Before creating a candidate spliced read dataset we have to first filter
+      # the matches from the first seed finding run.
+
+      approx_task = ApproximationTask(self.settings)
+      approx_task.CreateJobs()
+      approx_task.Submit()
+      approx_task.CheckIfTaskFinished()
+      
+      # After filtering combine the filtered matches from the first run and the
+      # found matches from the second run to a full dataset
+
+      print '#'*80
+      print '\t\t\tStarting dataset generation...\n'
+      print '#'*80
+
+      generatePredictionDataset(self.settings)
+
+      print '#'*80
+      print '\t\t\tStarting alignments...\n'
+      print '#'*80
+
+      # Now that we have a dataset we can perform accurate alignments
+      align_task = AlignmentTask(self.settings)
+      align_task.CreateJobs()
+      align_task.Submit()
+      align_task.CheckIfTaskFinished()
+
+      print '#'*80
+      print '\t\t\tPostprocessing...\n'
+      print '#'*80
+
+      # The results of the above alignment step can be converted to a data format
+      # needed for further postprocessing.
+      post_task = PostprocessingTask(self.settings)
+      post_task.CreateJobs()
+      post_task.Submit()
+      post_task.CheckIfTaskFinished()
+
+      logwrite('End of prediction.\n',self.settings)
    
-   # pre_task = PreprocessingTask(...)
-   # pre_task.createJobs()
-   # pre_task.submit()
-
-   # Now that we have a dataset we can perform the accurate alignments for this
-   # data
-
-   grid_predict()
-
-   # align_task = AlignmentTask(...)
-   # align_task.createJobs()
-   # align_task.submit()
-
-   # The results of the above alignment step can be converted to a data format
-   # needed for further postprocessing
-
-   grid_alignment()
-
-   # post_task = PostprocessingTask(...)
-   # post_task.createJobs()
-   # post_task.submit()
-
 
 if __name__ == '__main__':
-   parser = create_option_parser()
-   (options, args) = parser.parse_args()
+   mode     = sys.argv[1]
+   assert mode in ['predict','train'], Errormsg
+   filename = sys.argv[2]
+   assert os.path.exists(filename), Errormsg
+
+   # creating system object
+   system_obj = System(filename)
+
+   if mode == 'predict':
+      system_obj.prediction()
+   elif mode == 'train':
+      system_obj.training()
+   else:
+      assert False