예제 #1
0
def main_function():

    parser = OptionParser()

    parser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False, help="set verbose mode")

    parser.add_option(
        "--config",
        type="string",
        metavar="FILE",
        dest="config",
        default="redirector.config",
        help="Master configuration file that provides most setting for the Flux Balanace Analysis. Extra variable settings will be ingnored.  Hence the same config can be used for multiple analysis functions",
    )

    parser.add_option(
        "-c",
        "--modelConfig",
        type="string",
        metavar="FILE",
        dest="configFileName",
        default="model_config.txt",
        help="Configuration file which sets model files",
    )

    parser.add_option(
        "-n",
        "--configNames",
        type="string",
        metavar="String",
        dest="configNames",
        default="Default",
        help="A comma separated list of the names of configurations to use, as set out in the configuration file",
    )

    parser.add_option(
        "-m",
        "--modelname",
        type="string",
        metavar="String",
        dest="modelName",
        default="",
        help="Name of model(s) from the modelconfiguration file",
    )

    parser.add_option(
        "-b",
        "--bioObjective",
        type="string",
        dest="bioObj",
        default="Biomass",
        help="Name / ID of biological objective reaction",
        metavar="String",
    )

    parser.add_option(
        "-o",
        "--outputfile",
        dest="outputFileName",
        default=None,
        help="Name of report file to be generated",
        metavar="FILE",
    )

    parser.add_option(
        "-r",
        "--result_directory",
        type="string",
        metavar="directory",
        dest="resultDirectory",
        default="../../results/",
        help="Directory where results are stored",
    )

    parser.add_option(
        "--targets",
        type="string",
        metavar="String",
        dest="targets",
        default="",
        help="List of valid reaction target, if left blank will be automatically filled in from metabolic network file",
    )

    parser.add_option(
        "--report",
        action="store_true",
        dest="isReport",
        default=False,
        help="When this tag is used a report will be generated when the analysis is finished",
        metavar="boolean",
    )

    parser.add_option("--debug", action="store_true", dest="debug", default=False, help="turn on debug mode")

    parser.add_option("--gm", "--GeneMap", action="store_true", dest="useGeneMap", default=False, help="Use Gene Map")

    parser.add_option(
        "--section",
        type="string",
        metavar="String",
        dest="subSections",
        default="",
        help="Comma separated list of sections of the model files to use",
    )

    # -------------------------------
    # Parse options
    # -------------------------------

    (options, args) = parser.parse_args()
    config = ReflectionConfig()
    config.readfp(open("Redirector.config"))

    # ---------------------------
    # configure preset analysis
    # ---------------------------

    configNames = options.configNames.split(",")
    configNames.insert(0, "Redirector Model")
    for name in configNames:
        config.merge(name, "Redirector", append=True)

    # ----------------------------------------
    # reflect options from configuration
    # ----------------------------------------

    config.reflect("Redirector", options)
    config.load("Redirector", options.__dict__, override=False)

    # -----------------------------------------
    # Check and Build Storage Directories
    # -----------------------------------------

    dataDirectory = config.getValue("Redirector", "dataDirectory", classType="".__class__)
    resultsDirectory = config.getValue("Redirector", "resultDirectory", classType="".__class__)
    analysisDirectory = config.getValue("Redirector", "analysisDirectory", classType="".__class__)

    if not os.path.exists(dataDirectory):
        raise IOError("unable to find required data directory" % dataDirectory)
    if not os.path.exists(resultsDirectory):
        os.makedirs(resultsDirectory)
    if not os.path.exists(analysisDirectory):
        os.makedirs(analysisDirectory)

    # ----------------------------
    # Parse Inputs
    # ----------------------------

    verbose = options.verbose
    modelName = options.modelName
    objectiveName = options.bioObj
    outputFileName = options.outputFileName

    """
    #----------------------------------------------------
    # Initialize and set values for tools and factories
    #----------------------------------------------------
    """

    naturalObjective = {objectiveName: -1.0}

    if verbose:
        print "Flux Balanace Analysis Version 1.6"
    if verbose:
        print "Model names: [%s]" % (modelName)
    if verbose:
        print "Parsing data files for [%s]" % (modelName)

    """
    I. Parse data files and configuration settings
    """

    if verbose:
        print "----------------Loading Metabolic Models---------------"
    modelNames = modelName.split(",")
    modelFactory = ModelFactory()
    config.reflect("Redirector", modelFactory)
    (fluxModel, modelMatrix, reducer, geneReduction) = modelFactory.loadModel(modelNames)

    model = modelMatrix
    if verbose:
        print "removing objectives from target set"
    targets = modelMatrix.targets
    if verbose:
        print "Targets List Size [%s]" % len(targets)

    lps = LPSolver()
    predictions = lps.run(model, naturalObjective)
    objectiveValue = predictions[objectiveName]
    lps.clear()

    if verbose:
        print "Optimized Objective [%s] Value [%s]" % (objectiveName, objectiveValue)

    report = fluxModel.getReport()
    report.addColumnHash("Flux", predictions)

    if outputFileName == None or outputFileName == "":
        outputFileName = resultsDirectory + "FBA_%s_%s.txt" % (modelName, strftime("%Y%m%dT%H%M%S"))

    writer = ReportWriter()
    writer.setFile(outputFileName)
    writer.write(report)
    writer.closeFile()

    if verbose:
        print "Report Written [%s]" % (outputFileName)
예제 #2
0
def main_function():

    parser = OptionParser()
    
    parser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False, help="set verbose mode")
    
    parser.add_option("-c","--config", dest="config", default="redirector.config", help="master configuration file", metavar="FILE")
                  
    parser.add_option("--model_config", dest="modelConfig", default="model.config", help="configuration file", metavar="FILE")
    
    parser.add_option("-n","--configNames", type = "string", dest = "configNames", default = "Default", help = "comma separated list of configuration settings to include", metavar="FILE")
    
    parser.add_option("-m","--modelname", type = "string", dest="modelName", default="", help="name of model from configuration file", metavar="String")
    
    parser.add_option("-b","--bioObjective", type = "string", dest="bioObj", default = 'Biomass', help="name of biological objective reaction", metavar="String")
    
    parser.add_option("-s","--synthObjective", type = "string", dest="synthObj", default='', help="name of synthetic objective reaction", metavar="String")
                       
    parser.add_option("--sn", "--searchNeighborhood", dest = "searchNeighborhood", default = 1, type = int, help = "size of search neighborhood", metavar = "int")
    
    parser.add_option("--iter", "--searchIterations", dest = "iterations", default = 1, type = int, help = "maximum number of iterations, if blank no max", metavar = "int")
    
    parser.add_option("--report", action = "store_true", dest = "isReport", default = False, help = "Write report", metavar = "boolean")
    
    parser.add_option("--pl","--preload", dest = "preload", default = 0, type = int, help = "indicate size of pre-made library to load for faster start", metavar="int")
    
    parser.add_option("--ps", "--preStart", dest = "preStart", default = 0, type = int, help = "start from previous iteration state", metavar = "int")
        
    parser.add_option("--gm", "--GeneMap", action="store_true", dest = "useGeneMap", default = False, help = "Use Gene Map")
    
    parser.add_option("--control", dest="control", default = "flat", help = "control library type, flat,binary,sense", metavar="String")
    
    parser.add_option("--simocontrol", dest="simoControl", default = 1.0, help = "number of simultaneously active controls", metavar="int")
    
    parser.add_option("--section", dest="subSections", default = '', help = "Comma separated list of sections of the model files to use", metavar="String")
        
    parser.add_option("-o", dest="resultDirectory", default = './Result', help = "Directory to store analysis results", metavar="String")
    
    
    # Parse options
    (options,args) = parser.parse_args()    
    config = ReflectionConfig()    
    config.readfp(open("Redirector.config"))

    '''
    0. configure analysis
    '''
    
    configNames = options.configNames.split(",")
    configNames.insert(0,"Redirector Model")
    for name in configNames:
        config.merge(name,"Redirector",append=True)
    
    #----------------------------------------
    # reflect options from configuration
    #----------------------------------------

    config.reflect("Redirector",options)
    config.load("Redirector", options.__dict__,override=False)
    
    #-----------------------------------------
    # Check and Build Storage Directories
    #-----------------------------------------
    
    dataDirectory = config.getValue("Redirector","dataDirectory",classType=''.__class__)
    libraryDirectory = config.getValue("Redirector","libraryDirectory",classType=''.__class__)
    resultsDirectory = config.getValue("Redirector","resultDirectory",classType=''.__class__)
    analysisDirectory = config.getValue("Redirector","analysisDirectory",classType=''.__class__)
    
    if not os.path.exists(dataDirectory):
        raise IOError("unable to find required data directory" % dataDirectory)
    if not os.path.exists(resultsDirectory):
        os.makedirs(resultsDirectory)
    if not os.path.exists(libraryDirectory):
        os.makedirs(libraryDirectory)
    if not os.path.exists(analysisDirectory):
        os.makedirs(analysisDirectory)
    
    #----------------------------
    # Parse Inputs
    #----------------------------

    verbose                     = config.get("Redirector","verbose") 
    modelName                   = config.get("Redirector","modelName")
    objectiveName               = config.get("Redirector","bioObj")
    syntheticObjectiveName      = config.get("Redirector","synthObj")
    searchSize                  = config.get("Redirector","searchNeighborhood")
    searchIter                  = config.get("Redirector","iterations")
    objectiveMinPercent         = float(config.get("Redirector","bioTarget"))
    usePrimeBounds              = config.get("Redirector","primeBounds") == "True"
   
    #----------------------------------------------------
    # Initialize and set values for tools and factories
    #----------------------------------------------------
    
    naturalObjective = {objectiveName:-1.0}
    syntheticObjective = {syntheticObjectiveName:-1.0}
    protectedTargets = set(naturalObjective.keys()).union(syntheticObjective.keys())
    
    if verbose: print "Redirector Version 1.0"
    if verbose: print "Model names: [%s]" % (modelName)
    if verbose: print "Synthetic objective: [%s]" % (syntheticObjectiveName)
    if verbose: print "Parsing data files for [%s]" % (modelName)
    if verbose: print "Search Size [%s] Iterations [%s]" % (searchSize,searchIter)
    
    '''
    I. Parse data files and configuration settings
    '''
    
    if verbose: print "----------------Loading Metabolic Models---------------"
    modelNames = modelName.split(",")        
    modelFactory = ModelFactory()
    config.reflect("Redirector",modelFactory)
    modelFactory.protectedTargets = protectedTargets
    (fluxModel,modelMatrix) = modelFactory.loadModel(modelNames)    
    
    if verbose: print "Removing objectives from target set"
    targets = modelMatrix.targets
    targets = set(targets).difference(protectedTargets)
    if verbose: print "Targets List Size [%s]" % len(targets)
    simControl = options.simoControl
    if verbose: print "Simultaneous Control %s" % simControl
           
    #-------------------------------------------------------------------
    # Pre-discovery of flux bound current not used due to instability
    #-------------------------------------------------------------------
        
    primeFluxBoundaries = {}
    
    boundarySearchSize = 1
    boundaryTargets = targets
    boundaryReportFileName = "rd_flux_boundary_M_%s_t_%s_p_%s_s_%s_analysis.csv" % (modelName,len(targets),objectiveMinPercent,boundarySearchSize)
    fluxBoundariesFile = "ControlLibraries/FluxBounds_M_%s_O_%s_T_%s_S_%s" % (modelName,objectiveName,objectiveMinPercent,syntheticObjectiveName)
    
    naturalFluxBounds = None
    if usePrimeBounds:
        
        print "finding natural flux bounds [%s]" % (usePrimeBounds)
        #return False
        naturalFluxBounds = LinearModelVariableBoundarys(modelMatrix, objectiveName=objectiveName, targets=boundaryTargets, pickleFileName = fluxBoundariesFile, minObjectivePercent=objectiveMinPercent,searchSize=boundarySearchSize)
        print "finding production flux bounds"
        #syntheticFluxBounds = LinearModelVariableBoundarys(modelMatrix, objectiveName=syntheticObjectiveName, targets=boundaryTargets, pickleFileName = fluxBoundariesFile, minObjectivePercent=objectiveMinPercent,searchSize=boundarySearchSize)
        if verbose: print "Prime flux boundaries found."
        
        boundaryReport = Report()
        boundaryReport.addColumnHash(objectiveName, naturalFluxBounds)
        #boundaryReport.addColumnHash(syntheticObjectiveName, syntheticFluxBounds)
        
        writer = ReportWriter()       
        writer.setFile(boundaryReportFileName)
        writer.write(boundaryReport) 
        writer.closeFile()
        
    '''
    II. Generate Control Library(ies)
    '''
    
    if verbose:  print "===============Setting up control libraries================="
    processLibrary = OptimizationControlFactory()
    config.reflect("Redirector",processLibrary)
    
    processLibrary.geneMap = modelMatrix.controlMap
    processLibrary.fluxBounds = primeFluxBoundaries
    processLibrary.naturalObjectiveName = objectiveName
    processLibrary.syntheticObjectiveName = syntheticObjectiveName     
    
    controlLibraries = []
    controlMap = {}
    controlTags = options.control.split(",")
    
    if "sense" in controlTags:
        print "====>Using sensitivity control library"
        (icontrolLibraries, controlMap) = processLibrary.generateControl(modelMatrix,targets,targetsOnly = False)
        icontrolLibraries = processLibrary._filterControl(icontrolLibraries, targets)
        controlLibraries.extend(icontrolLibraries)
            
    if "flat" in controlTags:
        print "====>Using flat control library"
        (icontrolLibraries) = processLibrary.seedTestLibrary(targets, randomize=False)
        controlLibraries.extend(icontrolLibraries)
        
    if "random" in controlTags: 
        print "====>Using random control library"
        (icontrolLibraries) = processLibrary.seedTestLibrary(targets, randomize=True, factor = 2.0)
        controlLibraries.extend(icontrolLibraries)
        
    if "binary" in controlTags:
        print "====>Using binary control library"
        binaryRange =[-3,-2,-1,0]
        icontrolLibraries = processLibrary.generateBinaryControl(targets,binaryRange)
        controlLibraries.extend(icontrolLibraries)
    
    controlReportName = "ControlLibraries/ControlReport_%s_%s_%s_%s.csv" % (options.configNames,objectiveName,syntheticObjectiveName,len(targets))
    processLibrary.controlReport(modelMatrix, controlLibraries, controlMap, targets, controlReportName)
    
    
    print "============Control Constructed============="
    
    #--------------------------------------------------
    #configure Redirector model construction object 
    #--------------------------------------------------
    if verbose: print "==Formulating Framework=="    
    con = ConstructRegulationOptimization()
    config.reflect("Redirector",con)
    con.controlMax = options.searchNeighborhood
    con.newObjective = syntheticObjectiveName
    
    #----------------------------------------
    # Initialize redirector analysis object
    #----------------------------------------
    if verbose: print "==Running Optimization=="
    redirector = OptimizationControlRedirector()
    config.reflect("Redirector",redirector)
    
    redirector.modelFactory = modelFactory
    redirector.con = con
    redirector.controlFactory = processLibrary
    redirector.controlLibraries = controlLibraries
    redirector.primeBounds = naturalFluxBounds
    #redirector.targets = targets
    redirector.rGeneMap = modelMatrix.controlMap
    #redirector.modelName = modelName
    redirector.naturalObjectiveName = objectiveName
    redirector.syntheticObjectiveName = syntheticObjectiveName
    
    
    #--------------------------------------------------------
    # Debugging option which tests addition / removal of 
    # reactions from the objective
    #--------------------------------------------------------
    
    if "toggle0" in options.control.split(","):
        if verbose: print "-----------control test toggle 0-------------------"
        redirector.testDesignOptimization(modelMatrix)
    if "toggle" in options.control.split(","):
        if verbose: print "-----------control test toggle all-------------------"
        redirector.testDesignOptimization(modelMatrix,fullTest=True)
        
    (ltReport,oPredVal,sPredVal,finalCheckValue,fObjective) = redirector.optimizeControl(modelMatrix)
    
    finalPredictionValue = ltReport["flux"]       
    if verbose: print "Final Production: %s" % (finalPredictionValue[syntheticObjectiveName])

    #-----------------------------
    # Write Report
    #----------------------------
       
    if options.isReport:
        
        try:
            print "Writing Full Model Report in %s" % (options.resultDirectory)
            redirector.writeReport(ltReport,fluxModel,oPredVal,sPredVal,searchSize,searchIter,fObjective,resultsDirectory)
        except Exception, e:
            print "Unable to write report: %s" % (e)
        try:
            targetReportName = "Target_Report_M_%s_N_%s_S_%s_K_%s_I_%s.txt" % (modelName,objectiveName,syntheticObjectiveName,options.searchNeighborhood,options.iterations)
            print "Writing Optimization target Report %s" % (targetReportName)
            iteration = options.preStart + options.iterations
            redirector.writeAnnotatedTargets(fObjective, modelMatrix, annotationName = "bnumber", regex="[a-zA-Z0-9\(\)]+", iteration = iteration, oPrediction = oPredVal, nPrediction = finalPredictionValue)
        except:
            print "failed to write %s" % (targetReportName)
 targetFileObjectives = options.targetFileObjectives
 if targetFileObjectives != '':
     findBestTargetSets(targetFileObjectives, k, n)      
 
 '''
 I. Parse data files and configuration settings
 '''
 
 modelNames = modelName.split(",")
         
 modelFactory = ModelFactory()
 config.reflect("Redirector",modelFactory)
 modelFactory.protectedTargets = protectedTargets
 
 if verbose: print "----------------Loading Metabolic Models---------------"
 (fluxModel,modelMatrix,reducer,geneReduction) = modelFactory.loadModel(modelNames)    
 
 targets = modelMatrix.targets
 
 persistTag= "%s_%s_%s_%s_k%s_n%s_s%s" % (resultTag,options.modelName,naturalObjectiveName,syntheticObjectiveName,k,n,str(searchDepth))
 persistFileName = "ControlSearches/Persist_Cdependency_%s.bac" % persistTag
 
 '''
 II. Dependency analysis
 
 if option search depth != 0:
     Perform dependency analysis
 '''
 '''
 Scan persisted designs
 or