results_file = objFolder / f'{obj}_{ext}_measurements.txt' lineLog_file = objFolder / f'{obj}_{ext}_linesLog_{cycle}.txt' outputDb = objFolder / f'{obj}_{ext}_fitting_{cycle}.db' outputTxt = objFolder / f'{obj}_{ext}_fitting_{cycle}.txt' outputPiDb = objFolder / f'{obj}_{ext}_pI_fitting_{cycle}.db' outputPiTxt = objFolder / f'{obj}_{ext}_pI_fitting_{cycle}.txt' outputDirectHIIchemDb = objFolder / f'{obj}_{ext}_Direct-Teff-logU_{cycle}.db' outputDirectHIIchemTxt = objFolder / f'{obj}_{ext}_Direct-Teff-logU_{cycle}.txt' obj1_model = sr.SpectraSynthesizer() measurements_dict = sr.loadConfData(results_file, group_variables=False) objLinesDF = sr.import_emission_line_data(lineLog_file) fit_pickle = sr.load_MC_fitting(outputDb) pI_pickle = sr.load_MC_fitting(outputPiDb) bayes_plus_PI_pickle = sr.load_MC_fitting(outputDirectHIIchemDb) fit_inputs_dict = sr.loadConfData(outputTxt) pI_inputs_dict = sr.loadConfData(outputPiTxt) bayes_inputs_dict = sr.loadConfData(outputDirectHIIchemTxt) # Recover Direct method Bayesian fitting sr_lineLabels = fit_inputs_dict['Input_data']['lineLabels_list'] inFlux = fit_inputs_dict['Input_data']['inputFlux_array'] inErr = fit_inputs_dict['Input_data']['inputErr_array'] flux_matrix = fit_pickle['trace']['calcFluxes_Op'] mean_line_values = flux_matrix.mean(axis=0) std_line_values = flux_matrix.std(axis=0)
objMask = dataFolder / f'{obj}_{ext}_mask.txt' results_file = objFolder / f'{obj}_{ext}_measurements.txt' lineLog_file = objFolder / f'{obj}_{ext}_linesLog_{cycle}.txt' # Declare output files outputDb = objFolder / f'{obj}_{ext}_fitting_{cycle}.db' outputTxt = objFolder / f'{obj}_{ext}_fitting_{cycle}.txt' simConf = dataFolder / f'{obj}_config.txt' figure_file = objFolder/f'{obj}_DirectMethod_posteriors.png' figure_file_flux = objFolder/f'{obj}_DirectMethod_ObsVsFitFluxes.png' table_file_fluxes = objFolder/f'{obj}_DirectMethod_ObsVsFitFluxes' print(outputDb) print(figure_file) # Load the results fit_pickle = sr.load_MC_fitting(outputDb) fit_inputs_dict = sr.loadConfData(outputTxt) obj1_model = sr.SpectraSynthesizer() # Format outputs from old storing container inLines = fit_inputs_dict['Input_data']['lineLabels_list'] inFluxes, inErr = fit_inputs_dict['Input_data']['inputFlux_array'], fit_inputs_dict['Input_data']['inputErr_array'] inParameters = np.array(['T_high', 'n_e', 'Ar3', 'Ar4', 'Fe3', 'He1', 'He2', 'N2', 'Ne3', 'O2', 'O3', 'S2', 'S3', 'cHbeta']) traces_dict = {param: fit_pickle['trace'][param] for param in inParameters} for i, lineLabel in enumerate(inLines): traces_dict[lineLabel] = fit_pickle['trace']['calcFluxes_Op'][:, i] # Printint results # obj1_model.tracesPosteriorPlot(figure_file, inParameters, traces_dict, dark_mode=False) # obj1_model.fluxes_distribution(figure_file_flux, inLines, inFluxes, inErr, traces_dict) obj1_model.table_line_fluxes(table_file_fluxes, inLines, inFluxes, inErr, traces_dict)
# flambda_new = objLinesDF.loc[idcs_lines, 'f_lambda'] # obj1_model.lineFlambda = flambda_new # # # Declare sampling properties # obj1_model.simulation_configuration(objParams['inference_model_configuration']['parameter_list'], # prior_conf_dict=objParams['priors_configuration'], # photo_ionization_grid=False) # # # Declare simulation inference model # obj1_model.inference_model(fit_T_low=False) # # # Run the simulation # obj1_model.run_sampler(objFolder/outputDb, 5000, 2000, njobs=1) # Plot the results fit_results = sr.load_MC_fitting(outputDb) # print('-- Model parameters table') # figure_file = objFolder/f'{obj}_MeanOutputs' # obj1_model.table_mean_outputs(figure_file, fit_results, true_values=true_values) # # print('-- Flux values table') # figure_file = objFolder/f'{obj}_FluxComparison' # obj1_model.table_line_fluxes(figure_file, fit_results, combined_dict=combined_line_dict) # # print('-- Model parameters posterior diagram') # figure_file = objFolder/f'{obj}_ParamsPosteriors.png' # fig_conf = {'figure.figsize': (5, 10), 'axes.titlesize': 8, 'axes.labelsize': 8, 'legend.fontsize': 8} # obj1_model.tracesPosteriorPlot(None, fit_results, true_values=None) print('-- Line flux posteriors')
# Declare region physical model obj1_model.define_region(objLinesDF, objIons, objRed, objChem) # Declare sampling properties obj1_model.simulation_configuration(objParams['parameter_list'], prior_conf_dict=objParams) # Declare simulation inference model obj1_model.inference_model( include_Thigh_prior=objParams['T_high_check']) # Run the simulation obj1_model.run_sampler(simFolder / outputDb, 5000, 2000, njobs=1) # Plot the results fit_results = sr.load_MC_fitting(simFolder / outputDb) print('-- Model parameters table') figure_file = simFolder / f'{objName}_MeanOutputs' obj1_model.table_mean_outputs(figure_file, fit_results) print('-- Flux values table') figure_file = simFolder / f'{objName}_FluxComparison' obj1_model.table_line_fluxes(figure_file, fit_results) print('-- Model parameters posterior diagram') figure_file = simFolder / f'{objName}_ParamsPosteriors.png' obj1_model.tracesPosteriorPlot(figure_file, fit_results) print('-- Line flux posteriors') figure_file = simFolder / f'{objName}_lineFluxPosteriors.png'
row_data[2] = param_entry # Planar fitting HII-CHI-mistry grid_file = 'C17_bb_Teff_30-90_pp.dat' section_label = f'HII_Tef_fit_{grid_file}_{cycle}_sed' param_value = results_dict[section_label][param] if param == 'Teff': param_entry = r'${:.0f}\pm{:.0f}$'.format(param_value[0], param_value[1]) else: param_entry = r'${:.2f}\pm{:.2f}$'.format(param_value[0], param_value[1]) row_data[3] = param_entry # Bayesian HII-CHI-mistry model_fit = sr.load_MC_fitting(outputPiDb) trace = model_fit['trace'][param] param_value = (np.mean(trace), np.std(trace)) if param == 'Teff': param_entry = r'${:.0f}\pm{:.0f}$'.format(param_value[0], param_value[1]) else: param_entry = r'${:.2f}\pm{:.2f}$'.format(param_value[0], param_value[1]) row_data[4] = param_entry # Bayesian Direct method + HII-CHI-mistry if outputDirectHIIchemDb.is_file(): model_fit = sr.load_MC_fitting(outputDirectHIIchemDb) trace = model_fit['trace'][param] param_value = (np.mean(trace), np.std(trace))
for i, obj in enumerate(objList): if i < 3: objFolder = resultsFolder / f'{obj}' results_file = objFolder / f'{obj}_{ext}_measurements.txt' lineLog_file = objFolder / f'{obj}_{ext}_linesLog_{cycle}.txt' outputDb = objFolder / f'{obj}_{ext}_fitting_{cycle}.db' outputPiDb = objFolder / f'{obj}_{ext}_pI_fitting_{cycle}.db' outputDirectHIIchemDb = objFolder / f'{obj}_{ext}_Direct-Teff-logU_{cycle}.db' obj1_model = sr.SpectraSynthesizer() measurements_dict = sr.loadConfData(results_file, group_variables=False) objLinesDF = sr.import_emission_line_data(lineLog_file) pI_results = sr.load_MC_fitting(outputPiDb) fit_results = sr.load_MC_fitting(outputDb) bayes_plus_PI_results = sr.load_MC_fitting(outputDirectHIIchemDb) # Recover Direct method Bayesian fitting sr_lineLabels = fit_results['Input_data']['lineLabels_list'] inFlux = fit_results['Input_data']['inputFlux_array'] inErr = fit_results['Input_data']['inputErr_array'] flux_matrix = fit_results['trace']['calcFluxes_Op'] mean_line_values = flux_matrix.mean(axis=0) std_line_values = flux_matrix.std(axis=0) # Recover Direct method + HIIchem fitting srPlus_lineLabels = bayes_plus_PI_results['Input_data']['lineLabels_list'] inFluxPlus = bayes_plus_PI_results['Input_data']['inputFlux_array'] inErrPlus = bayes_plus_PI_results['Input_data']['inputErr_array']
displaySimulationData(inferenModel) # Run the model trace = pymc3.sample(5000, tune=2000, chains=2, cores=1) # Save the database with open(output_db, 'wb') as trace_pickle: pickle.dump({'model': inferenModel, 'trace': trace}, trace_pickle) # Load the .db file with open(output_db, 'rb') as trace_restored: db = pickle.load(trace_restored) # Restore parameters data inferenModel, trace = db['model'], db['trace'] traces_dict = ss.load_MC_fitting(output_db) # Declare sampler obj1_model = ss.SpectraSynthesizer() modelParams = list(traces_dict.keys()) modelParams.remove('calcFluxes_Op') # Traces and Posteriors print('-- Model parameters posterior diagram') figure_file = f'{user_folder}interPolationTesting_ParamsPosteriors.txt' obj1_model.tracesPosteriorPlot(modelParams, traces_dict, true_values=objParams) obj1_model.savefig(figure_file, resolution=200) # # Traces and Posteriors # print('-- Model parameters corner diagram')
obj1_model.define_region(lineLabels, lineFluxes, lineErr, extinction_model=objRed) # Declare region physical model obj1_model.simulation_configuration(model_parameters=conf_fit['inference_model_configuration']['parameter_list'], prior_conf_dict=conf_fit['priors_configuration'], grid_interpolator=grid_interpolators) obj1_model.photoionization_sampling(conf_fit['inference_model_configuration']['parameter_list']) obj1_model.run_sampler(1000, 3000, nchains=8, njobs=4, init='advi') # obj1_model.save_fit(outputCfg, cord_label, output_format='cfg') obj1_model.save_fit(outputDb, cord_label, output_format='pickle') # obj1_model.save_fit(outputFits, cord_label, output_format='fits', user_header=header_params) # Plot the results fit_pickle = sr.load_MC_fitting(outputDb, output_format='pickle') inLines, inParameters = fit_pickle['inputs']['line_list'], fit_pickle['inputs']['parameter_list'] inFlux, inErr = fit_pickle['inputs']['line_fluxes'].astype(float), fit_pickle['inputs']['line_err'].astype(float) traces_dict = fit_pickle['outputs'] # Load the results # fit_fits = sr.load_MC_fitting(outputFits, output_format='fits') # in_header, out_header, trace_header = fit_fits['inputs'][1], fit_fits['outputs'][1], fit_fits['traces'][1] # inLines, inParameters = fit_fits['inputs'][0]['line_list'], fit_fits['outputs'][0]['parameters_list'] # inFlux, inErr = fit_fits['inputs'][0]['line_fluxes'], fit_fits['inputs'][0]['line_err'] # traces_dict = fit_fits['traces'][0] # print('-- Model parameters table') figure_file = objFolder / f'{cord_label}_pI_fitting_MeanOutputs' obj1_model.table_mean_outputs(figure_file, inParameters, traces_dict, true_values=header_params)