def __init__(self,params,out_path_orig,pymc_import=False,multinest_import=False):
     params.out_save_plots = True
     
     if params.gen_type == 'transmission' or params.fit_transmission:
         if os.path.isdir(os.path.join(out_path_orig, 'stage_0')):
             params.out_path = os.path.join(out_path_orig, 'stage_0')
         else:
             params.out_path = out_path_orig
                 
         dataob = data(params)
         atmosphereob = atmosphere(dataob)
         forwardmodelob = transmission(atmosphereob)
         fittingob = fitting(forwardmodelob)
         if params.mcmc_run and pymc_import:
             fittingob.MCMC = True
         if params.nest_run and multinest_import:
             fittingob.NEST = True
         outputob = output(fittingob)
         if params.verbose or params.out_save_plots:
             outputob.plot_all(save2pdf=params.out_save_plots, param_labels=fittingob.fit_params_texlabels)
         outputob.save_ascii_spectra()
         
         
     if params.gen_type == 'emission' or params.fit_emission:
         
         folders = ['stage_0', 'stage_1']
         for f in folders:
             dir = os.path.join(out_path_orig, f)
             if os.path.isdir(dir):
                 params.out_path = dir
                 dataob = data(params)
                 if f is 'stage_1':
                     Cov_array = np.loadtxt(os.path.join(out_path_orig, 'stage_0/tp_covariance.dat'))
                     atmosphereob = atmosphere(dataob, tp_profile_type='hybrid', covariance=Cov_array)
                 else:
                     atmosphereob = atmosphere(dataob) 
                 forwardmodelob = emission(atmosphereob)
                 fittingob = fitting(forwardmodelob)
                 if params.mcmc_run and pymc_import:
                     fittingob.MCMC = True
                 if params.nest_run and multinest_import:
                     fittingob.NEST = True
                 outputob = output(fittingob)
                 if params.verbose or params.out_save_plots:
                     outputob.plot_all(save2pdf=params.out_save_plots,
                                    params_names=fittingob.fit_params_names[:fittingob.fit_X_nparams],
                                    params_labels=fittingob.fit_params_texlabels[:fittingob.fit_X_nparams])
                 outputob.save_ascii_spectra()
                 # save and plot TP profile (plotting only if save2pdf=True)
                 outputob.save_TP_profile(save2pdf=True)  #saving TP profile
                 
                 #deleting objectes
                 dataob = None; atmosphereob = None; forwardmodelob = None; fittingob = None;
                 outputob = None
                 del dataob; del atmosphereob; del forwardmodelob; del fittingob; del outputob;
Example #2
0
def run(params, options=False):

    # initialising data object
    dataob = data(params)

    #initialising TP profile instance
    atmosphereob = atmosphere(dataob)

    #initialising transmission radiative transfer code instance
    forwardmodelob = transmission(atmosphereob)

    #initialising fitting object
    fittingob = fitting(forwardmodelob)

    #fit data
    if params.downhill_run:
        if MPIimport:
            if MPI.COMM_WORLD.Get_rank() == 0:
                fittingob.downhill_fit(
                )  # simplex downhill fit, only on first core
        else:
            fittingob.downhill_fit(
            )  # simplex downhill fit, only on first core

    if MPIimport:
        MPI.COMM_WORLD.Barrier()  # wait for everybody to synchronize here

    if params.mcmc_run and pymc_import:
        fittingob.mcmc_fit()  # MCMC fit
        if MPIimport:
            MPI.COMM_WORLD.Barrier()


    if (not options and params.nest_run and multinest_import) \
        or (params.nest_run and multinest_import and not options.no_multinest):
        fittingob.multinest_fit()  # Nested sampling fit
    elif options and (params.nest_run and multinest_import
                      and options.no_multinest):
        fittingob.NEST = True

    if params.nest_poly_run and polychord_import:
        fittingob.polychord_fit()  #Polychord sampling fit
        if MPIimport:
            MPI.COMM_WORLD.Barrier()  # wait for everybody to synchronize here

    # exit if the rank of MPI process is > 0 (.e. leave only master process running)
    if MPIimport:
        MPIsize = MPI.COMM_WORLD.Get_size()
        if MPI.COMM_WORLD.Get_rank() > 0:
            sys.exit()
    else:
        MPIsize = 0

    # initiating output instance with fitted data from fitting class
    # running inteprolations with nthreads = MPIsize
    outputob = output(fittingob)

    return outputob
Example #3
0
    def init_stats(self):
        '''
        manually initialises the TauREx output analysis
        when not loaded distance functinos are still available
        ''' 
        
        self.dir = self.options.dir
        self.params.gen_manual_waverange = False
        self.params.nest_run = False
        self.params.mcmc_run = False
        self.params.downhill_run = True

        #setting up output storage 
        self.stats = {}
        
        #loading data from TauREx NEST output 
        self.load_traces_likelihood('nest_out.db')
        
        #loading parameter list 
#         self.parameters = np.loadtxt(os.path.join(self.dir,'parameters.txt'),dtype='str')
        self.stats['parameters'] = self.NEST_db['fit_params_names']
        
        # initialising data object
        self.dataob = data(self.params)

        # initialising atmosphere object
        self.atmosphereob = atmosphere(self.dataob)

        # set forward model
        if self.params.gen_type == 'transmission':
            self.fmob = transmission(self.atmosphereob)
        elif self.params.gen_type == 'emission':
            self.fmob = emission(self.atmosphereob)
        
        #initialising fitting object 
        self.fitting = fitting(self.fmob)
def run(params, options=False):

    out_path_orig = params.out_path

    ###############################
    # STAGE 1
    ###############################

    # set output directory of stage 1
    params.out_path = os.path.join(out_path_orig, 'stage_0')

    # initialising data object
    dataob = data(params)

    #initialising TP profile instance
    atmosphereob = atmosphere(dataob)

    #initialising emission radiative transfer code instance
    forwardmodelob = emission(atmosphereob, stage=0)

    #initialising fitting object
    fittingob = fitting(forwardmodelob)

    #fit data for stage 1
    if params.downhill_run:
        fittingob.downhill_fit()  #simplex downhill fit

    if params.mcmc_run and pymc_import:
        fittingob.mcmc_fit()  # MCMC fit
        if MPIimport:
            MPI.COMM_WORLD.Barrier()  # wait for everybody to synchronize here

    if params.nest_run and multinest_import:
        fittingob.multinest_fit()  # Nested sampling fit
        if MPIimport:
            MPI.COMM_WORLD.Barrier()  # wait for everybody to synchronize here

    if MPIimport and MPI.COMM_WORLD.Get_rank() != 0:
        exit()

    outputob = output(fittingob,
                      out_path=os.path.join(out_path_orig, 'stage_0'))

    return outputob

    #     exit()

    # todo fix stage 2

    # generating TP profile covariance from previous fit
    Cov_array = generate_tp_covariance(outputob)

    # saving covariance
    if MPIimport and MPI.COMM_WORLD.Get_rank() is 0 or MPIimport is False:
        np.savetxt(os.path.join(params.out_path, 'tp_covariance.dat'),
                   Cov_array)

    ###############################
    # STAGE 2
    ###############################

    if params.fit_emission_stage2:
        # set output directory of stage 2
        params.out_path = os.path.join(out_path_orig, 'stage_1')

        #setting up objects for stage 2 fitting
        dataob1 = data(params)

        #setting stage 2 atmosphere object
        atmosphereob1 = atmosphere(dataob1,
                                   tp_profile_type='hybrid',
                                   covariance=Cov_array)

        #setting stage 2 forward model
        forwardmodelob1 = emission(atmosphereob1)

        #setting stage 2 fitting object
        fittingob1 = fitting(forwardmodelob1)

        # #running stage 2 fit
        if params.downhill_run:
            fittingob1.downhill_fit()  #simplex downhill fit

        if params.mcmc_run and pymc_import:
            fittingob1.mcmc_fit()  # MCMC fit
            MPI.COMM_WORLD.Barrier()  # wait for everybody to synchronize here

        if params.nest_run and multinest_import:
            fittingob1.multinest_fit()  # Nested sampling fit
            MPI.COMM_WORLD.Barrier()  # wait for everybody to synchronize here

    ###############
    #finished fitting. Post fitting analysis from here

    #forcing slave processes to exit at this stage
    if MPIimport and MPI.COMM_WORLD.Get_rank() != 0:
        exit()

    #initiating output instance with fitted data from fitting class
    if params.fit_emission_stage2:
        outputob1 = output(fittingob1,
                           out_path=os.path.join(out_path_orig, 'stage_1'))
def runModel():
    log.info('POST /run')
    try:
        if request.form and request.form['jsonData']:
            parameters = json.loads(request.form['jsonData'])
        else:
            message = "Missing input jsonData!"
            log.error(message)
            return buildFailure(message, 400)

        sendToQueue = parameters.get('sendToQueue', False)

        inputFileName = None
        id = str(uuid.uuid4())
        if (len(request.files) > 0):
            inputCSVFile = request.files['csvFile']
            ext = os.path.splitext(inputCSVFile.filename)[1]
            if sendToQueue:
                bucket = S3Bucket(INPUT_BUCKET, log)
                object = bucket.uploadFileObj(getInputFileKey(id, ext),
                                              inputCSVFile)
                if object:
                    parameters['inputCSVFile'] = {
                        'originalName': inputCSVFile.filename,
                        'bucket_name': object.bucket_name,
                        'key': object.key
                    }
                else:
                    message = "Upload CSV file to S3 failed!"
                    log.error(message)
                    return buildFailure(message, 500)

            else:
                parameters['inputCSVFile'] = inputCSVFile.filename
                inputFileName = getInputFilePath(id, ext)
                inputCSVFile.save(inputFileName)
                if not os.path.isfile(inputFileName):
                    message = "Upload file failed!"
                    log.error(message)
                    return buildFailure(message, 500)
                outputRdsFileName = getOutputFilePath(id, '.rds')
                outputSSFileName = getOutputFilePath(
                    id, extensionMap[SS_FILE_TYPE])
                outputFileName = getOutputFilePath(id, '.out')
                parameters['filename'] = inputFileName
                parameters['outputRdsFilename'] = outputRdsFileName
                parameters['outputFilename'] = outputFileName
        else:
            message = 'No input data (CSV) file, please upload a data file!'
            log.warning(message)
            return buildFailure(message, 400)

        columns = [
            parameters['outcomeC'], parameters['outcomeL'],
            parameters['outcomeR']
        ]
        if 'design' in parameters and parameters['design'] == 1:
            columns += [parameters['strata'], parameters['weight']]
            parameters['weightInfo'] = [{
                'samp.weight': parameters['weight'],
                'strata': parameters['strata']
            }]
        if parameters['covariatesSelection']:
            covariateNameMap = mapCategoricalCovariates(
                parameters['covariatesArr'])
            columns += parameters['covariatesSelection']
            covariates = ' + '.join([
                covariateNameMap[x] for x in parameters['covariatesSelection']
            ])

            if 'effects' in parameters:
                effects = [
                    covariateNameMap[x[0]] + ' * ' + covariateNameMap[x[1]]
                    for x in parameters['effects']
                ]
                effectsPlain = [
                    x[0] + ' * ' + x[1] for x in parameters['effects']
                ]
                if effects:
                    covariates += ' + ' + ' + '.join(effects)
                    parameters['effectsString'] = ' + '.join(effectsPlain)
            parameters['covariates'] = covariates
        parameters['columns'] = columns

        if sendToQueue:
            # Send parameters to queue
            sqs = Queue(log)
            sqs.sendMsgToQueue(
                {
                    'parameters': parameters,
                    'jobId': id,
                    'extension': ext,
                    'jobType': 'fitting'
                }, id)
            return buildSuccess({
                'enqueued':
                True,
                'jobId':
                id,
                'message':
                'Job "{}" has been added to queue successfully!'.format(
                    parameters.get('jobName', 'PIMixture'))
            })
        else:
            fittingResult = fitting(parameters,
                                    outputSSFileName,
                                    SS_FILE_TYPE,
                                    log,
                                    timeout=FITTING_TIMEOUT)
            if fittingResult['status']:
                return buildSuccess(fittingResult['results'])
            else:
                return buildFailure(fittingResult)

    except Exception as e:
        exc_type, exc_obj, tb = sys.exc_info()
        f = tb.tb_frame
        lineno = tb.tb_lineno
        inputFileName = f.f_code.co_filename
        linecache.checkcache(inputFileName)
        line = linecache.getline(inputFileName, lineno, f.f_globals)
        log.exception("Exception occurred")
        return buildFailure({
            "status": False,
            "message": "An unknown error occurred"
        })