# 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
        has_model_indices = self.df[self.df.has_model == True].index
        ca_atoms = [a.index for a in self.traj.topology.atoms if a.name == 'CA']
        rmsds = mdtraj.rmsd(self.traj, self.ref_model_traj, atom_indices=ca_atoms, parallel=False)
        template_rmsds = [None] * len(self.templateids)
        for m,t in enumerate(has_model_indices):
            template_rmsds[t] = rmsds[m]

        self.df['rmsd'] = template_rmsds

    def rmsd_dist(self):
        warnings.warn('Not yet implemented.')
        pass

    def to_csv(self, ofilepath=None):
        if ofilepath is None:
            ofilepath = os.path.join(self.models_target_dir, 'rmsds.csv')
        self.df.to_csv(ofilepath)


class AnalyzeEnergies(object):
    def __init__(self, targetid, ensembler_stage=None, project_dir='.', log_level=None):
        ensembler.core.check_project_toplevel_dir()
        ensembler.utils.set_loglevel(log_level)
        self.targetid = targetid
        self.models_target_dir = os.path.join(ensembler.core.default_project_dirnames.models, self.targetid)
        self.project_dir = project_dir
        if ensembler_stage is not None:
            self.ensembler_stage = ensembler_stage
        else:
            for stagename in ['refine_explicit_md', 'refine_implicit_md']:

# 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

        has_model_indices = self.df[self.df.has_model == True].index
        ca_atoms = [a.index for a in self.traj.topology.atoms if a.name == 'CA']
        rmsds = mdtraj.rmsd(self.traj, self.ref_model_traj, atom_indices=ca_atoms, parallel=False)
        template_rmsds = [None] * len(self.templateids)
        for m,t in enumerate(has_model_indices):
            template_rmsds[t] = rmsds[m]

        self.df['rmsd'] = template_rmsds

    def rmsd_dist(self):
        warnings.warn('Not yet implemented.')
        pass

    def to_csv(self, ofilepath=None):
        if ofilepath is None:
            ofilepath = os.path.join(self.models_target_dir, 'rmsds.csv')
        self.df.to_csv(ofilepath)


class AnalyzeEnergies(object):
    def __init__(self, targetid, ensembler_stage=None, project_dir='.', log_level=None):
        ensembler.core.check_project_toplevel_dir()
        ensembler.utils.set_loglevel(log_level)
        self.targetid = targetid
        self.models_target_dir = os.path.join(ensembler.core.default_project_dirnames.models, self.targetid)
        self.project_dir = project_dir
        if ensembler_stage is not None:
            self.ensembler_stage = ensembler_stage
        else:
            for stagename in ['refine_explicit_md', 'refine_implicit_md']:

                if check_ensembler_modeling_stage_complete(stagename, targetid):