# Path: ensembler/core.py
# class MPIState:
# class DummyMPIState:
# class DummyMPIComm:
# class literal_str(str): pass
# class LogFile:
# class ManualOverrides:
# class TargetManualOverrides:
# class TemplateManualOverrides:
# class RefinementManualOverrides:
# class ProjectMetadata:
#     def __init__(self):
#     def __init__(self):
#     def Barrier(self):
#     def bcast(self, obj, root=0):
#     def gather(self, obj, root=0):
# def change_style(style, representer):
#     def new_representer(dumper, data):
# def get_utcnow_formatted():
# def strf_timedelta(delta_t):
# def check_project_toplevel_dir(raise_exception=True):
#     def __init__(self, log_filepath):
#     def log(self, new_log_data={}):
#     def __init__(self, manual_overrides_filepath=None):
#     def __init__(self, manual_overrides_yaml):
#     def __init__(self, manual_overrides_yaml):
#     def __init__(self, manual_overrides_yaml):
# def gen_metadata_filename(ensembler_stage, metadata_file_index):
#     def __init__(self, project_stage='init', target_id=None, project_toplevel_dir='.'):
#     def add_all_prev_metadata(self, project_stage):
#     def add_prev_metadata(self, project_stage):
#     def determine_latest_metadata_filepath(self, project_stage):
#     def metadata_dir_mapper(self, project_stage, target_id=None):
#     def metadata_file_basename_mapper(self, project_stage):
#     def determine_latest_metadata_file_index(self, project_stage):
#     def gen_metadata_filepath_from_dir_index_and_file_basename(self, dirpath, file_basename, index):
#     def add_data(self, data, project_stage=None):
#     def add_iteration_number_to_metadata(self, iter_number):
#     def write(self):
# def encode_url_query(uniprot_query):
#     def replace_all(text, replace_dict):
# def xpath_match_regex_case_sensitive(context, attrib_values, regex_str):
# def xpath_match_regex_case_insensitive(context, attrib_values, regex_str):
# def sequnwrap(sequence):
# def seqwrap(sequence, add_star=False):
# def construct_fasta_str(id, seq):
# def get_targets():
# def get_templates_resolved_seq():
# def get_templates_full_seq():
# def get_targets_and_templates():
# def find_loopmodel_executable():
# def check_ensembler_modeling_stage_first_model_file_exists(ensembler_stage, targetid):
# def check_ensembler_modeling_stage_metadata_exists(ensembler_stage, targetid):
# def check_ensembler_modeling_stage_complete(ensembler_stage, targetid):
# def get_most_advanced_ensembler_modeling_stage(targetid):
# def get_valid_model_ids(ensembler_stage, targetid):
# def select_templates_by_seqid_cutoff(targetid, seqid_cutoff=None):
# def select_templates_by_validation_score(targetid,
#                                          validation_score_cutoff=None,
#                                          validation_score_percentile=None
#                                          ):


import datetime
import ensembler
import os
import re
import numpy as np
import pandas as pd
import yaml
import mdtraj
import gzip
import warnings
from ensembler.core import logger, check_ensembler_modeling_stage_complete
                'successful': successful,
                'no_missing_residues': no_missing_residues,
                'exception': exception,
                'loopmodel_exception': loopmodel_exception,
                'loopmodel_output': loopmodel_output,
                'traceback': traceback,
                'datestamp': datestamp,
                'timing_str': timing_str,
                'timing_total_seconds': timing_total_seconds,
            }
        )
        return df

    def add_missing_resis_data(self):
        missing_resis_df = []
        for templateid in self.df.templateid:
            loopfile_path = os.path.join(self.project_dir, 'templates/structures-modeled-loops', templateid + '.loop')
            with open(loopfile_path) as loopfile:
                lines = loopfile.readlines()
                try:
                    nmissing_resis = 0
                    missing_resi_spans = []
                    for line in lines:
                        words = line.split()
                        loop_start = int(words[1])
                        loop_end = int(words[2])
                        missing_resi_span = loop_end - loop_start + 1
                        missing_resi_spans.append(missing_resi_span)
                        nmissing_resis += missing_resi_span
                except:

# Path: ensembler/core.py
# class MPIState:
# class DummyMPIState:
# class DummyMPIComm:
# class literal_str(str): pass
# class LogFile:
# class ManualOverrides:
# class TargetManualOverrides:
# class TemplateManualOverrides:
# class RefinementManualOverrides:
# class ProjectMetadata:
#     def __init__(self):
#     def __init__(self):
#     def Barrier(self):
#     def bcast(self, obj, root=0):
#     def gather(self, obj, root=0):
# def change_style(style, representer):
#     def new_representer(dumper, data):
# def get_utcnow_formatted():
# def strf_timedelta(delta_t):
# def check_project_toplevel_dir(raise_exception=True):
#     def __init__(self, log_filepath):
#     def log(self, new_log_data={}):
#     def __init__(self, manual_overrides_filepath=None):
#     def __init__(self, manual_overrides_yaml):
#     def __init__(self, manual_overrides_yaml):
#     def __init__(self, manual_overrides_yaml):
# def gen_metadata_filename(ensembler_stage, metadata_file_index):
#     def __init__(self, project_stage='init', target_id=None, project_toplevel_dir='.'):
#     def add_all_prev_metadata(self, project_stage):
#     def add_prev_metadata(self, project_stage):
#     def determine_latest_metadata_filepath(self, project_stage):
#     def metadata_dir_mapper(self, project_stage, target_id=None):
#     def metadata_file_basename_mapper(self, project_stage):
#     def determine_latest_metadata_file_index(self, project_stage):
#     def gen_metadata_filepath_from_dir_index_and_file_basename(self, dirpath, file_basename, index):
#     def add_data(self, data, project_stage=None):
#     def add_iteration_number_to_metadata(self, iter_number):
#     def write(self):
# def encode_url_query(uniprot_query):
#     def replace_all(text, replace_dict):
# def xpath_match_regex_case_sensitive(context, attrib_values, regex_str):
# def xpath_match_regex_case_insensitive(context, attrib_values, regex_str):
# def sequnwrap(sequence):
# def seqwrap(sequence, add_star=False):
# def construct_fasta_str(id, seq):
# def get_targets():
# def get_templates_resolved_seq():
# def get_templates_full_seq():
# def get_targets_and_templates():
# def find_loopmodel_executable():
# def check_ensembler_modeling_stage_first_model_file_exists(ensembler_stage, targetid):
# def check_ensembler_modeling_stage_metadata_exists(ensembler_stage, targetid):
# def check_ensembler_modeling_stage_complete(ensembler_stage, targetid):
# def get_most_advanced_ensembler_modeling_stage(targetid):
# def get_valid_model_ids(ensembler_stage, targetid):
# def select_templates_by_seqid_cutoff(targetid, seqid_cutoff=None):
# def select_templates_by_validation_score(targetid,
#                                          validation_score_cutoff=None,
#                                          validation_score_percentile=None
#                                          ):


# Path: ensembler/tools/inspect.py
import datetime
import ensembler
import os
import re
import numpy as np
import pandas as pd
import yaml
import mdtraj
import gzip
import warnings
from ensembler.core import logger, check_ensembler_modeling_stage_complete

                'successful': successful,
                'no_missing_residues': no_missing_residues,
                'exception': exception,
                'loopmodel_exception': loopmodel_exception,
                'loopmodel_output': loopmodel_output,
                'traceback': traceback,
                'datestamp': datestamp,
                'timing_str': timing_str,
                'timing_total_seconds': timing_total_seconds,
            }
        )
        return df

    def add_missing_resis_data(self):
        missing_resis_df = []
        for templateid in self.df.templateid:
            loopfile_path = os.path.join(self.project_dir, 'templates/structures-modeled-loops', templateid + '.loop')
            with open(loopfile_path) as loopfile:
                lines = loopfile.readlines()
                try:
                    nmissing_resis = 0
                    missing_resi_spans = []
                    for line in lines:
                        words = line.split()
                        loop_start = int(words[1])
                        loop_end = int(words[2])
                        missing_resi_span = loop_end - loop_start + 1
                        missing_resi_spans.append(missing_resi_span)
                        nmissing_resis += missing_resi_span
                except:

                    logger.exception(