def make_subfigure(self, fig_funcs, layout=(5, 4), close=True): #todo figure out how to iterate properly n = np.product(layout) chunks = grouper(n, fig_funcs) w = str(1 / layout[1]) pbar = tqdm(total=len(fig_funcs)) for chunk in chunks: with self.doc.create(pyl.Figure(position='ht')) as tex_fig: for i, fig_func in enumerate(chunk): if fig_func is None: continue with self.doc.create( pyl.SubFigure( position='b', width=pyl.NoEscape(w + r'\linewidth'))) as subfig: fig = fig_func() file_path = self._save_fig( fig, bbox_inches='tight') # todo access these kwargs if close: plt.close(fig) subfig.add_image(file_path, width=pyl.NoEscape(r'\linewidth')) if i % layout[1] == layout[1] - 1: self.doc.append('\n') pbar.update(1) self.doc.append(pyl.NewPage())
def createFig(self, imagePath, caption, width=tex.NoEscape(r'0.5\linewidth')): fig = tex.SubFigure(position='b', width=width) fig.add_image(str(imagePath), width=tex.NoEscape(r'\linewidth')) fig.add_caption(caption) return fig
def test_subfigure(self): fig = plt.figure() plt.plot([2,3,42,1]) file_path = self._save_fig(fig) with self.doc.create(pyl.Figure(position='h!')) as kittens: w = str(0.25) for i in range(8): with self.doc.create(pyl.SubFigure( position='b', width=pyl.NoEscape(w + r'\linewidth'))) as left_kitten: left_kitten.add_image(file_path, width=pyl.NoEscape(r'\linewidth')) left_kitten.add_caption(f'Kitten on the {i}') if i % 4 == 3: self.doc.append('\n') kittens.add_caption("Two kittens")
def profile_likelihood(self, pl_directory, size=0.3, num_per_row=3): """ compile any pdf, jpg and png files in directory into a latex pdf document :return: """ if isinstance(self.file_types, str): self.file_types = [self.file_types] files = self.search_recursive(pl_directory) if files is []: raise errors.InputError( '''Cannot locate pdf, jpg or png files in "{}". Please give the full path to where your model selection results are plotted. '''.format(pl_directory)) doc = pylatex.Document(self.filename, documentclass='article') for k, v in list(files.items()): assert isinstance(v, list) if v is not None: with doc.create( pylatex.Figure( position='htbp!', width=pylatex.NoEscape(r'\linewidth'))) as fig: # [fig.add_image(i) for i in v] for i in range(len(v)): with doc.create( pylatex.SubFigure(width=pylatex.NoEscape( str(size) + r'\linewidth'))) as sub: sub.add_image(v[i]) sub.add_caption(os.path.split(v[i])[1]) if i is not 0 and i % num_per_row is 0: doc.append(pylatex.NoEscape(r'\break')) # sub.add_label(i) # # fig.add_caption(os.path.join(*Path(v[i]).parts[-3:-1])) doc.append(pylatex.NoEscape(r'\hfill')) fig.add_caption(os.path.split(k)[1]) doc.generate_pdf() LOG.info('PDF generated at "{}"'.format(doc.default_filepath))
def prepare_document(self, directory, subdirs=False, file_types='.png'): """ compile any pdf, jpg and png files in directory into a latex pdf document :return: """ if subdirs not in [True, False]: raise errors.InputError( 'subdirs argument should be either True or False') if isinstance(file_types, str): file_types = [file_types] if subdirs: files = self.search_recursive(directory) else: files = self.search() if files is []: raise errors.InputError( '''Cannot locate pdf, jpg or png files in "{}". Please give the full path to where your model selection results are plotted. '''.format(directory)) doc = pylatex.Document(self.filename, documentclass='article') for k, v in list(files.items()): assert isinstance(v, list) if v is not None: with doc.create( pylatex.Section(os.path.join(*Path(k).parts[-1:]))): doc.append(k) doc.append(pylatex.NoEscape(r'\\*')) if len(v) == 1: with doc.create( pylatex.Figure(position='htbp!', width=pylatex.NoEscape( r'0.3\linewidth'))) as fig: fig.add_image(v[0]) fig.add_caption( os.path.join(*Path(v[0]).parts[-2:])) # fig.add_label(v[0]) else: with doc.create( pylatex.Figure( position='htbp!', width=pylatex.NoEscape(r'\linewidth'), )) as fig: for i in range(len(v)): with doc.create( pylatex.SubFigure( width=pylatex.NoEscape( r'0.3\linewidth'))) as sub: sub.add_image(v[i]) # sub.add_caption('') if i % 3 == 0: doc.append(pylatex.NoEscape(r'\break')) # sub.add_label(i) fig.add_caption( os.path.join(*Path(v[i]).parts[-3:-1])) doc.append(pylatex.NoEscape(r'\hfill')) doc.generate_pdf() LOG.info('PDF generated at "{}"'.format(doc.default_filepath))
def _add_fits(self, doc, fit_log, fit_name, operator_set, ratio, gap=False, const=False): with doc.create(pylatex.Center()) as centered: if gap and const and util.ERR_PREC <= 4: cols = "X[c] X[c] X[4,c] X[4,c] X[4,c] X[4,c] X[2,c] X[2,c] X[2,c] X[c]" elif (gap or const) and util.ERR_PREC <= 4: cols = "X[c] X[c] X[4,c] X[4,c] X[4,c] X[2,c] X[2,c] X[2,c] X[c]" else: cols = "X[c] X[c] X[4,c] X[4,c] X[2,c] X[2,c] X[2,c] X[c]" with centered.create(pylatex.LongTabu( cols, to=r"\linewidth")) as fit_table: if ratio: energy_header = r"$a_t \Delta E_{\rm fit}$" else: energy_header = r"$a_t E_{\rm fit}$" header_row = [ pylatex.NoEscape(r"$t_{\rm min}$"), pylatex.NoEscape(r"$t_{\rm max}$"), pylatex.NoEscape(energy_header), "A", pylatex.NoEscape(r"$\chi^2 / \text{dof}$"), pylatex.NoEscape(r"$p$-value"), pylatex.NoEscape(r"$t_{\rm exc}$"), pylatex.NoEscape(r"$\sigma_{\rm cut}$"), ] if const and util.ERR_PREC <= 4: header_row.insert(4, pylatex.NoEscape(r"const")) if gap and util.ERR_PREC <= 4: header_row.insert(4, pylatex.NoEscape(r"$a \Delta$")) fit_table.add_row(header_row, mapper=[pylatex.utils.bold]) fit_table.add_hline() fit_table.end_table_header() for fit_info, fit_result in fit_log.fits.items(): value_row = [ fit_info.tmin, fit_info.tmax, fit_result.energy, fit_result.amplitude, round(fit_result.chisq, 2), round(fit_result.quality, 2), fit_info.exclude_times, round(fit_info.noise_cutoff, 1), ] if const and util.ERR_PREC <= 4: value_row.insert(4, fit_result.const) if gap and util.ERR_PREC <= 4: value_row.insert(4, fit_result.gap) fit_table.add_row(value_row) if self.fit_plots: for fit_info1, fit_info2 in zip(*[iter(fit_log.fits.keys())] * 2): fit_plot1 = self.fit_plotfile(operator_set, fit_name, fit_info1, extension=util.PlotExtension.pdf) fit_plot2 = self.fit_plotfile(operator_set, fit_name, fit_info2, extension=util.PlotExtension.pdf) with doc.create(pylatex.Figure(position='H')) as fig: with doc.create( pylatex.SubFigure(position='b', width=pylatex.NoEscape( r'0.5\linewidth'))) as fig1: caption = f"{fit_info1.model.short_name}, $t_{{\\rm fit}} = {fit_info1.tmin}, {fit_info1.tmax}$" if fit_info1.ratio: caption += " Ratio" if fit_info1.exclude_times: caption += f" $t_{{\\rm exc}}$ = {fit_info1.exclude_times}" if fit_info1.noise_cutoff: caption += f" $\sigma_{{\\rm cut}} = {fit_info1.noise_cutoff}$" util.add_image(fig1, self.results_dir, fit_plot1, width="1.0", caption=caption) with doc.create( pylatex.SubFigure(position='b', width=pylatex.NoEscape( r'0.5\linewidth'))) as fig2: caption = f"{fit_info2.model.short_name}, $t_{{\\rm fit}} = {fit_info2.tmin}, {fit_info2.tmax}$" if fit_info1.ratio: caption += " Ratio" if fit_info2.exclude_times: caption += f" $t_{{\\rm exc}}$ = {fit_info2.exclude_times}" if fit_info2.noise_cutoff: caption += f" $\sigma_{{\\rm cut}} = {fit_info2.noise_cutoff}$" util.add_image(fig2, self.results_dir, fit_plot2, width="1.0", caption=caption) if len(fit_log.fits) % 2 != 0: fit_info = list(fit_log.fits.keys())[-1] fit_plot = self.fit_plotfile(operator_set, fit_name, fit_info, extension=util.PlotExtension.pdf) with doc.create(pylatex.Figure(position='H')) as fig: caption = f"{fit_info.model.short_name}, $t_{{\\rm fit}} = {fit_info.tmin}, {fit_info.tmax}$" if fit_info.ratio: caption += " Ratio" if fit_info.exclude_times: caption += f" $t_{{\\rm exc}}$ = {fit_info.exclude_times}" if fit_info.noise_cutoff: caption += f" $\sigma_{{\\rm cut}} = {fit_info.noise_cutoff}$" util.add_image(fig, self.results_dir, fit_plot, width="0.5", caption=caption) doc.append(pylatex.NoEscape(r"\newpage"))
def _add_tmins(self, doc, fit_infos, fit_name, operator_set, ratio): for fit_info1, fit_info2 in zip(*[iter(fit_infos)] * 2): fit_plot1 = self.tmin_fit_plotfile( operator_set, fit_name, fit_info1, extension=util.PlotExtension.pdf) fit_plot2 = self.tmin_fit_plotfile( operator_set, fit_name, fit_info2, extension=util.PlotExtension.pdf) with doc.create(pylatex.Figure(position='H')) as fig: with doc.create( pylatex.SubFigure( position='b', width=pylatex.NoEscape(r'0.5\linewidth'))) as fig1: caption = f"{fit_info1.model.short_name}, $t_{{\\rm max}} = {fit_info1.tmax}$" if fit_info1.ratio: caption += " Ratio" if fit_info1.exclude_times: caption += f" $t_{{\\rm exc}}$ = {fit_info1.exclude_times}" util.add_image(fig1, self.results_dir, fit_plot1, width="1.0", caption=caption) with doc.create( pylatex.SubFigure( position='b', width=pylatex.NoEscape(r'0.5\linewidth'))) as fig2: caption = f"{fit_info2.model.short_name}, $t_{{\\rm max}} = {fit_info2.tmax}$" if fit_info1.ratio: caption += " Ratio" if fit_info2.exclude_times: caption += f" $t_{{\\rm exc}}$ = {fit_info2.exclude_times}" util.add_image(fig2, self.results_dir, fit_plot2, width="1.0", caption=caption) if len(fit_infos) % 2 != 0: fit_info = list(fit_infos)[-1] fit_plot = self.tmin_fit_plotfile(operator_set, fit_name, fit_info, extension=util.PlotExtension.pdf) with doc.create(pylatex.Figure(position='H')) as fig: caption = f"{fit_info.model.short_name}, $t_{{\\rm max}} = {fit_info.tmax}$" if fit_info.ratio: caption += " Ratio" if fit_info.exclude_times: caption += f" $t_{{\\rm exc}}$ = {fit_info.exclude_times}" util.add_image(fig, self.results_dir, fit_plot, width="0.5", caption=caption) doc.append(pylatex.NoEscape(r"\newpage"))
def _add_data(doc: pl.Document, ds: Dataset, nr: NonRedundantization, meth: MLMethod): name = f'{ds.name}_{nr.name}_{meth.name}' directory = ds.name aVp_graph = f'{name}.jpg' angle_dist_graph = f'{name}_angledistribution.jpg' error_dist_graph = f'{name}_errordistribution.jpg' sqerror_graph = f'{name}_sqerror_vs_actual.jpg' stats_csv_all = f'{name}_stats_all.csv' stats_csv_out = f'{name}_stats_out.csv' actualVpred_file = os.path.join(directory, aVp_graph) ang_dist_file = os.path.join(directory, angle_dist_graph) error_dist_file = os.path.join(directory, error_dist_graph) sqerror_file = os.path.join(directory, sqerror_graph) df_all = pd.read_csv(os.path.join(directory, stats_csv_all)) df_out = pd.read_csv(os.path.join(directory, stats_csv_out)) with doc.create(pl.Section(f'Method: {ds.name}, {nr.name}, {meth.name}')): with doc.create(pl.Subsection('Summary of method:')): doc.append(f'Dataset: {ds.name}') doc.append(f'\nNon-redundantization: {nr.name}') doc.append(f'\nType of machine learning used: {meth.name}') with doc.create(pl.Subsection('Summary of the data:')): with doc.create(pl.Figure(position='!htbp')) as actualVpred: actualVpred.add_image(actualVpred_file, width='300px') actualVpred.add_caption( 'Graph showing the predicted packing angle against the actual packing angle, when using the above specified methods of non-redundetization and machine learning.' ) with doc.create(pl.Table(position='!htbp')) as table: table.add_caption('Summary of results for all data') table.append(pl.Command('centering')) table.append(pl.NoEscape(df_all.to_latex(escape=False))) with doc.create(pl.Table(position='!htbp')) as table: table.add_caption('Summary of results for outliers.') table.append(pl.Command('centering')) table.append(pl.NoEscape(df_out.to_latex(escape=False))) with doc.create(pl.Figure(position='!htbp')) as graphs: with doc.create( pl.SubFigure(position='!htbp', width=pl.NoEscape( r'0.30\linewidth'))) as ang_dist_graph: ang_dist_graph.add_image(ang_dist_file, width=pl.NoEscape(r'\linewidth')) ang_dist_graph.add_caption( 'Frequency distribution of the packing angle.') with doc.create( pl.SubFigure(position='!htbp', width=pl.NoEscape( r'0.33\linewidth'))) as error_dist_graph: error_dist_graph.add_image(error_dist_file, width=pl.NoEscape(r'\linewidth')) error_dist_graph.add_caption( 'Distribution of errors calculated as the difference between the predicted and actual interface angle.' ) with doc.create( pl.SubFigure(position='!htbp', width=pl.NoEscape( r'0.33\linewidth'))) as sqerror_graph: sqerror_graph.add_image(sqerror_file, width=pl.NoEscape(r'\linewidth')) sqerror_graph.add_caption( 'Squared error in predicted packing angle against actual packing angle.' ) graphs.add_caption('Graphs for further metrics.')
def add_correlator(doc, task_handler, correlator, name, obs_handler): operator_src = operator_info.operator.Operator(correlator.getSource()) subtractvev = task_handler.subtractvev and operator_src.channel.vev if correlator.isSinkSourceSame(): left_pdf_file = task_handler.correlator_plotfile( correlator, name, extension=PlotExtension.pdf) right_pdf_file = task_handler.energy_plotfile( operator_src, name, extension=PlotExtension.pdf) else: left_pdf_file = task_handler.correlator_plotfile( correlator, name, complex_arg=sigmond.ComplexArg.RealPart, extension=PlotExtension.pdf) right_pdf_file = task_handler.correlator_plotfile( correlator, name, complex_arg=sigmond.ComplexArg.ImaginaryPart, extension=PlotExtension.pdf) if correlator.isSinkSourceSame(): left_estimates = sigmond.getCorrelatorEstimates( obs_handler, correlator, task_handler.hermitian, subtractvev, sigmond.ComplexArg.RealPart, task_handler.sampling_mode) right_estimates = sigmond.getEffectiveEnergy( obs_handler, correlator, task_handler.hermitian, subtractvev, sigmond.ComplexArg.RealPart, task_handler.sampling_mode, task_handler.plot_info.timestep, task_handler.plot_info.eff_energy_type.value, 0.) else: left_estimates = sigmond.getCorrelatorEstimates( obs_handler, correlator, task_handler.hermitian, subtractvev, sigmond.ComplexArg.RealPart, task_handler.sampling_mode) right_estimates = sigmond.getCorrelatorEstimates( obs_handler, correlator, task_handler.hermitian, subtractvev, sigmond.ComplexArg.ImaginaryPart, task_handler.sampling_mode) if correlator.isSinkSourceSame(): doc.append(pylatex.NoEscape(rf"Score: {score(left_estimates)}")) with doc.create(pylatex.Figure(position='H')): with doc.create( pylatex.SubFigure( position='b', width=pylatex.NoEscape(r'0.5\linewidth'))) as left_fig: add_image(left_fig, task_handler.results_dir, left_pdf_file, width="1.0") with doc.create( pylatex.SubFigure( position='b', width=pylatex.NoEscape(r'0.5\linewidth'))) as right_fig: add_image(right_fig, task_handler.results_dir, right_pdf_file, width="1.0") if correlator.isSinkSourceSame(): header_row = [ pylatex.NoEscape(r"$t$"), pylatex.NoEscape(r"$C(t)$"), pylatex.NoEscape(r"$\delta C(t)$"), ] if task_handler.plot_info.eff_energy_type.value < 2: header_row.extend([ pylatex.NoEscape( rf"$a_t E_{{\rm eff}} (t + {task_handler.plot_info.timestep}/2)$" ), pylatex.NoEscape( rf"$\delta a_t E_{{\rm eff}} (t + {task_handler.plot_info.timestep}/2)$" ), ]) else: header_row.extend([ pylatex.NoEscape(r"$a_t E_{\rm eff} (t)$"), pylatex.NoEscape(r"$\delta a_t E_{\rm eff} (t)$"), ]) else: header_row = [ pylatex.NoEscape(r"$t$"), pylatex.NoEscape(r"$Re C(t)$"), pylatex.NoEscape(r"$\delta Re C(t)$"), pylatex.NoEscape(r"$Im C(t)$"), pylatex.NoEscape(r"$\delta Im C(t)$") ] with doc.create(pylatex.Center()) as centered: with centered.create( pylatex.LongTabu("X[c] X[2,c] X[2,c] X[2,c] X[2,c]", to=r"\linewidth")) as data_table: data_table.add_row(header_row, mapper=[pylatex.utils.bold]) data_table.add_hline() data_table.end_table_header() for t in sorted(left_estimates.keys()): left_value = left_estimates[t].getFullEstimate() left_error = left_estimates[t].getSymmetricError() left_est = nice_value(left_value, left_error) left_rel_error = round(left_estimates[t].getRelativeError(), 4) t_right = t if correlator.isSinkSourceSame( ) and task_handler.plot_info.eff_energy_type.value < 2: t_right = t + 0.5 * task_handler.plot_info.timestep if t_right in right_estimates: right_value = right_estimates[t_right].getFullEstimate() right_error = right_estimates[t_right].getSymmetricError() right_est = nice_value(right_value, right_error) right_rel_error = round( right_estimates[t_right].getRelativeError(), 4) else: right_est = "" right_rel_error = "" row = [ int(t), left_est, left_rel_error, right_est, right_rel_error ] data_table.add_row(row) doc.append(pylatex.NoEscape(r"\newpage"))
def makeInteractionFigure(self, ker, cum, n_terms): """ Create figure for interaction analysis, which includes a subfigure of the latest additive component and a subfigure of posterior of the overall compositional kernel up to now. :param ker: latest additive component to be plotted :type ker: GPCKernel :param cum: overall compositional kernel up to and including `ker` :type cum: GPCKernel :param n_terms: number of additive terms considered in `cum` so far """ assert isinstance(ker, GPCKernel), 'Kernel must be of type GPCKernel' assert isinstance(cum, GPCKernel), 'Kernel must be of type GPCKernel' doc = self.doc kerDims = ker.getActiveDims() cumDims = cum.getActiveDims() img1Name = 'additive{0}ker'.format(n_terms) img1Format = '.eps' if len(kerDims) != 3 else '.png' img1Filename = img1Name + img1Format ker.draw(os.path.join(self.path, img1Name), active_dims_only=True) if n_terms == 1 or len(cumDims) > 3: # Only present current additive component caption_str = r"Trained classifier on " + dims2text( kerDims, ker.data) + "." with doc.create(pl.Figure(position='htbp!')) as fig: fig.add_image(img1Filename, width=ut.NoEscape(r'0.7\textwidth')) fig.add_caption(ut.NoEscape(caption_str)) self.fignum += 1 else: # Present both current component and cumulative kernel img2Name = 'additive{0}cum'.format(n_terms) img2Format = '.eps' if len(cumDims) != 3 else '.png' img2Filename = img2Name + img2Format cum.draw(os.path.join(self.path, img2Name), active_dims_only=True) caption1_str = r"Current additive component involving " + dims2text( kerDims, ker.data) + "." caption2_str = r"Previous and current components combined, involving " + dims2text( cumDims, cum.data) + "." caption_str = r"Trained classifier on " + dims2text( cumDims, cum.data) + "." with doc.create(pl.Figure(position='htbp!')) as fig: with doc.create( pl.SubFigure( position='b', width=ut.NoEscape(r'0.47\textwidth'))) as subfig1: subfig1.add_image(img1Filename, width=ut.NoEscape(r'\textwidth')) subfig1.add_caption(ut.NoEscape(caption1_str)) doc.append(ut.NoEscape(r'\hfill')) with doc.create( pl.SubFigure( position='b', width=ut.NoEscape(r'0.47\textwidth'))) as subfig2: subfig2.add_image(img2Filename, width=ut.NoEscape(r'\textwidth')) subfig2.add_caption(ut.NoEscape(caption2_str)) fig.add_caption(ut.NoEscape(caption_str)) self.fignum += 1
def _add_data(doc: pl.Document, dataset): name = f'{dataset}_NR2_GBReg' directory = dataset aVp_graph = f'{name}.jpg' angle_dist_graph = f'{name}_angledistribution.jpg' error_dist_graph = f'{name}_errordistribution.jpg' sqerror_graph = f'{name}_sqerror_vs_actual.jpg' stats_csv_all = f'{name}_stats_all.csv' stats_csv_out = f'{name}_stats_out.csv' actualVpred_file = os.path.join(directory, aVp_graph) ang_dist_file = os.path.join(directory, angle_dist_graph) error_dist_file = os.path.join(directory, error_dist_graph) sqerror_file = os.path.join(directory, sqerror_graph) df_all = pd.read_csv(os.path.join(directory, stats_csv_all)) df_out = pd.read_csv(os.path.join(directory, stats_csv_out)) with doc.create(pl.Section(f'Results')): with doc.create(pl.Subsection('Summary of method:')): doc.append('Trained on PreAF2 dataset.') doc.append('\n') doc.append(f'Dataset tested: {dataset}') doc.append('\n') doc.append(f'GBR parameters: {gbr_params}.') doc.append('\n') with doc.create(pl.Subsection('Summary of the data:')): with doc.create(pl.Figure(position='!htbp')) as actualVpred: actualVpred.add_image(actualVpred_file, width='300px') actualVpred.add_caption( 'Graph showing the predicted packing angle against the actual packing angle.' ) with doc.create(pl.Table(position='!htbp')) as table: table.add_caption('Summary of results for all data') table.append(pl.Command('centering')) table.append(pl.NoEscape(df_all.to_latex(escape=False))) with doc.create(pl.Table(position='!htbp')) as table: table.add_caption('Summary of results for outliers.') table.append(pl.Command('centering')) table.append(pl.NoEscape(df_out.to_latex(escape=False))) with doc.create(pl.Figure(position='!htbp')) as graphs: with doc.create( pl.SubFigure(position='!htbp', width=pl.NoEscape( r'0.30\linewidth'))) as ang_dist_graph: ang_dist_graph.add_image(ang_dist_file, width=pl.NoEscape(r'\linewidth')) ang_dist_graph.add_caption( 'Frequency distribution of the packing angle.') with doc.create( pl.SubFigure(position='!htbp', width=pl.NoEscape( r'0.33\linewidth'))) as error_dist_graph: error_dist_graph.add_image(error_dist_file, width=pl.NoEscape(r'\linewidth')) error_dist_graph.add_caption( 'Distribution of errors calculated as the difference between the predicted and actual interface \ angle.') with doc.create( pl.SubFigure(position='!htbp', width=pl.NoEscape( r'0.33\linewidth'))) as sqerror_graph: sqerror_graph.add_image(sqerror_file, width=pl.NoEscape(r'\linewidth')) sqerror_graph.add_caption( 'Squared error in predicted packing angle against actual packing angle.' ) graphs.add_caption('Graphs for further metrics.')