Beispiel #1
0
class Lintools(object):
    """This class controls the behaviour of all other classes (Data,Plots,Molecule,Figure)
     of lintools and inherits and transfers them resulting in a final SVG file that contains
     the protein-ligand interactions.

    It also controls the analysis (Residence_time and HBonds classes).

    Takes:
        * topology * - topology file
        * trajectory * - trajectory file(s)
        * mol_file * - MOL file of the ligand
        * ligand * - MDAnalysis atomgroup of ligand that is going to be analysed
        * offset * - residue offset which determines by how many numbers the protein residue numbering
        should be offset (e.g. with offset = 30 the first residue will be changed from 1 to 30, 2 - 31, etc.)
        * cutoff * - cutoff distance in angstroms that defines the native contacts (default - 3.5A)
        * start_frame * - start frame(s) for trajectory analysis (can be different for each trajectory)
        * end_frame * - end frame(s) for trajectory analysis (can be different for each trajectory)
        * skip * - number of frames to skip (can be different for each trajectory)
        * analysis_cutoff * - a fraction of time a residue has to fullfil the analysis parameters for (default - 0.3)
        * diagram_type * - string of the selected diagram type (e.g. "amino" or "clocks")
        * output_name * - name of the folder with results and the final SVG file

    """
    __version__ = "09.2016"

    def __init__(self, topology, trajectory, mol_file, ligand, offset, cutoff,
                 start_frame, end_frame, skip, analysis_cutoff, diagram_type,
                 output_name, cfg):
        """Defines the input variables."""
        self.topology = os.path.abspath(topology)
        try:
            self.trajectory = []
            for traj in trajectory:
                self.trajectory.append(os.path.abspath(traj))
        except Exception:
            self.trajectory = []
        if mol_file != None:
            self.mol_file = os.path.abspath(mol_file)
        else:
            self.mol_file = mol_file
        self.ligand = ligand
        self.offset = offset
        self.cutoff = cutoff
        if cfg == False:
            self.start = [
                None if start_frame == [None] else int(start_frame[i])
                for i in range(len(trajectory))
            ]
            self.end = [
                None if end_frame == [None] else int(end_frame[i])
                for i in range(len(trajectory))
            ]
            self.skip = [
                None if skip == [None] else int(skip[i])
                for i in range(len(trajectory))
            ]
        else:
            self.start = start_frame
            self.end = end_frame
            self.skip = skip
        self.analysis_cutoff = analysis_cutoff
        self.diagram_type = diagram_type
        self.output_name = output_name

    def data_input_and_res_time_analysis(self):
        """
        Loads the data into Data() - renumbers the residues, imports mol file in rdkit.
        If there are trajectories to analyse, the residues that will be plotted are determined
        from Residence_time() analysis.
        """
        self.topol_data = Data()
        self.topol_data.load_data(self.topology, self.mol_file, self.ligand,
                                  self.offset)
        if len(self.trajectory) == 0:
            self.topol_data.analyse_topology(self.topology, self.cutoff)
        else:
            self.res_time = Residence_time(self.topol_data, self.trajectory,
                                           self.start, self.end, self.skip,
                                           self.topology, self.ligand,
                                           self.offset)
            self.res_time.measure_residence_time(self.cutoff)
            self.res_time.define_residues_for_plotting_traj(
                self.analysis_cutoff)
            self.topol_data.find_the_closest_atoms(self.topology)

    def analysis_of_prot_lig_interactions(self):
        """
        The classes and function that deal with protein-ligand interaction analysis.
        """
        self.hbonds = HBonds(self.topol_data,
                             self.trajectory,
                             self.start,
                             self.end,
                             self.skip,
                             self.analysis_cutoff,
                             distance=3)
        self.pistacking = PiStacking(self.topol_data, self.trajectory,
                                     self.start, self.end, self.skip,
                                     self.analysis_cutoff)
        self.sasa = SASA(self.topol_data, self.trajectory)
        self.lig_descr = LigDescr(self.topol_data)
        if self.trajectory != []:
            self.rmsf = RMSF_measurements(self.topol_data, self.topology,
                                          self.trajectory, self.ligand,
                                          self.start, self.end, self.skip)
        self.salt_bridges = SaltBridges(self.topol_data, self.trajectory,
                                        self.lig_descr, self.start, self.end,
                                        self.skip, self.analysis_cutoff)

    def plot_residues(self, colormap):
        """
        Calls Plot() that plots the residues with the required diagram_type.
        """
        self.plots = Plots(self.topol_data, self.diagram_type, colormap)

    def draw_figure(self,
                    data_for_color=None,
                    data_for_size=None,
                    data_for_clouds=None,
                    rot_bonds=None,
                    color_for_clouds="Blues",
                    color_type_color="viridis"):
        """
        Draws molecule through Molecule() and then puts the final figure together with
        Figure().
        """
        self.molecule = Molecule(self.topol_data)

        self.draw = Draw(self.topol_data, self.molecule, self.hbonds,
                         self.pistacking, self.salt_bridges, self.lig_descr)
        self.draw.draw_molecule(data_for_color, data_for_size, data_for_clouds,
                                rot_bonds, color_for_clouds, color_type_color)

        self.figure = Figure(self.molecule, self.topol_data, self.draw)
        self.figure.add_bigger_box()
        self.figure.manage_the_plots()
        self.figure.draw_white_circles()
        self.figure.put_everything_together()
        self.figure.write_final_draw_file(self.output_name)

    def save_files(self):
        """Saves all output from LINTools run in a single directory named after the output name."""
        while True:
            try:
                os.mkdir(self.output_name)
            except Exception as e:
                self.output_name = raw_input(
                    "This directory already exists - please enter a new name:")
            else:
                break
        self.workdir = os.getcwd()
        os.chdir(self.workdir + "/" + self.output_name)

    def write_config_file(self, cfg):
        if cfg != None:
            #copy the config file to results directory
            shutil.copy("../" + cfg, "lintools.config")
        else:
            #If there was no config file, write one
            cfg_dir = {
                'input': {
                    'topology': self.topology,
                    'trajectory': self.trajectory,
                    'mol file': self.mol_file,
                    'ligand': self.ligand,
                    'traj start': self.start,
                    'traj end': self.end,
                    'traj skip': self.skip,
                    'offset': self.offset,
                    'distance cutoff': self.cutoff,
                    'analysis cutoff': self.analysis_cutoff,
                    'diagram type': self.diagram_type,
                    'output name': self.output_name
                },
                'representation': {
                    'data to show in color': None,
                    'data to show as size': None,
                    'data to show as cloud': None,
                    'rotatable bonds': None,
                    'cloud color scheme': 'Blues',
                    'atom color scheme': 'viridis',
                    'clock color scheme': 'summer'
                }
            }

            with open("lintools.config", "wb") as ymlfile:
                yaml.dump(cfg_dir, ymlfile, default_flow_style=False)

    def remove_files(self):
        """Removes intermediate files."""
        file_list = [
            "molecule.svg", "lig.pdb", "HIS.pdb", "PHE.pdb", "TRP.pdb",
            "TYR.pdb", "lig.mol", "test.xtc"
        ]
        for residue in self.topol_data.dict_of_plotted_res.keys():
            file_list.append(residue[1] + residue[2] + ".svg")
        for f in file_list:
            if os.path.isfile(f) == True:
                os.remove(f)
Beispiel #2
0
class Lintools(object):
    """This class controls the behaviour of all other classes (Data,Plots,Molecule,Figure)
     of lintools and inherits and transfers them resulting in a final SVG file that contains
     the protein-ligand interactions.

    It also controls the analysis (Residence_time and HBonds classes).

    Takes:
        * topology * - topology file
        * trajectory * - trajectory file(s)
        * mol_file * - MOL file of the ligand
        * ligand * - MDAnalysis atomgroup of ligand that is going to be analysed
        * offset * - residue offset which determines by how many numbers the protein residue numbering
        should be offset (e.g. with offset = 30 the first residue will be changed from 1 to 30, 2 - 31, etc.)
        * cutoff * - cutoff distance in angstroms that defines the native contacts (default - 3.5A)
        * start_frame * - start frame(s) for trajectory analysis (can be different for each trajectory)
        * end_frame * - end frame(s) for trajectory analysis (can be different for each trajectory)
        * skip * - number of frames to skip (can be different for each trajectory)
        * analysis_cutoff * - a fraction of time a residue has to fullfil the analysis parameters for (default - 0.3)
        * sasa * - set this to 1 to turn on solvent accessible surface area calculation (currently only works across whole trajectory)
        * diagram_type * - string of the selected diagram type (e.g. "amino" or "clocks")
        * output_name * - name of the folder with results and the final SVG file

    """
    __version__ = "06.2018"
    def __init__(self,topology,trajectory,mol_file,ligand,offset,cutoff,start_frame,end_frame,skip,analysis_cutoff,sasa,diagram_type,output_name,cfg):
        """Defines the input variables."""
        self.topology = os.path.abspath(topology)
        try:
            self.trajectory = []
            for traj in trajectory:
                self.trajectory.append(os.path.abspath(traj))
        except Exception:
            self.trajectory = []
        if mol_file!=None:
            self.mol_file = os.path.abspath(mol_file)
        else:
            self.mol_file = mol_file
        self.ligand = ligand
        self.offset = offset
        self.cutoff = cutoff
        if cfg==False:
            self.start = [None if start_frame==[None] else int(start_frame[i]) for i in range(len(trajectory))]
            self.end = [None if end_frame==[None] else int(end_frame[i]) for i in range(len(trajectory))]
            self.skip = [None if skip==[None] else int(skip[i]) for i in range(len(trajectory))]
        else:
            self.start = start_frame
            self.end = end_frame
            self.skip = skip
        self.analysis_cutoff = analysis_cutoff
        self.sasa = sasa
        self.diagram_type = diagram_type
        self.output_name = output_name
    def data_input_and_res_time_analysis(self):
        """
        Loads the data into Data() - renumbers the residues, imports mol file in rdkit.
        If there are trajectories to analyse, the residues that will be plotted are determined
        from Residence_time() analysis.
        """
        self.topol_data = Data()
        self.topol_data.load_data(self.topology,self.mol_file,self.ligand,self.offset)
        if len(self.trajectory) == 0:
            self.topol_data.analyse_topology(self.topology,self.cutoff)
        else:
            self.res_time = Residence_time(self.topol_data,self.trajectory, self.start, self.end, self.skip,self.topology, self.ligand,self.offset)
            self.res_time.measure_residence_time(self.cutoff)
            self.res_time.define_residues_for_plotting_traj(self.analysis_cutoff)
            self.topol_data.find_the_closest_atoms(self.topology)
    def analysis_of_prot_lig_interactions(self):
        """
        The classes and function that deal with protein-ligand interaction analysis.
        """
        self.hbonds = HBonds(self.topol_data,self.trajectory,self.start,self.end,self.skip,self.analysis_cutoff,distance=3)
        self.pistacking = PiStacking(self.topol_data,self.trajectory,self.start,self.end,self.skip, self.analysis_cutoff)
        if self.sasa==1:
            self.sasa = SASA(self.topol_data,self.trajectory)
        self.lig_descr = LigDescr(self.topol_data)
        if self.trajectory!=[]:
            self.rmsf = RMSF_measurements(self.topol_data,self.topology,self.trajectory,self.ligand,self.start,self.end,self.skip)
        self.salt_bridges = SaltBridges(self.topol_data,self.trajectory,self.lig_descr,self.start,self.end,self.skip,self.analysis_cutoff)
    def plot_residues(self):
        """
        Calls Plot() that plots the residues with the required diagram_type.
        """
        self.plots = Plots(self.topol_data,self.diagram_type)
    def draw_figure(self,data_for_color=None, data_for_size=None, data_for_clouds=None, rot_bonds=None, color_for_clouds="Blues", color_type_color="viridis"):
        """
        Draws molecule through Molecule() and then puts the final figure together with
        Figure().
        """
        self.molecule = Molecule(self.topol_data)

        self.draw = Draw(self.topol_data,self.molecule,self.hbonds,self.pistacking,self.salt_bridges,self.lig_descr)
        self.draw.draw_molecule(data_for_color, data_for_size, data_for_clouds, rot_bonds, color_for_clouds, color_type_color)

        self.figure = Figure(self.molecule,self.topol_data,self.draw)
        self.figure.add_bigger_box()
        self.figure.manage_the_plots()
        self.figure.draw_white_circles()
        self.figure.put_everything_together()
        self.figure.write_final_draw_file(self.output_name)

    def save_files(self):
        """Saves all output from LINTools run in a single directory named after the output name."""
        while True:
            try:
                os.mkdir(self.output_name)
            except Exception as e:
                self.output_name = raw_input("This directory already exists - please enter a new name:")
            else:
                break
        self.workdir = os.getcwd()
        os.chdir(self.workdir+"/"+self.output_name)
    def write_config_file(self, cfg):
        if cfg!=None:
            #copy the config file to results directory
            shutil.copy("../"+cfg, "lintools.config")
        else:
            #If there was no config file, write one
            cfg_dir = {'input':{
                            'topology':self.topology,
                            'trajectory':self.trajectory,
                            'mol file':self.mol_file,
                            'ligand':self.ligand,
                            'traj start':self.start,
                            'traj end':self.end,
                            'traj skip': self.skip,
                            'offset': self.offset,
                            'distance cutoff': self.cutoff,
                            'analysis cutoff': self.analysis_cutoff,
                            'sasa': self.sasa,
                            'diagram type': self.diagram_type,
                            'output name': self.output_name},
                    'representation':{
                            'data to show in color':None,
                            'data to show as size':None,
                            'data to show as cloud':None,
                            'rotatable bonds':None,
                            'cloud color scheme':'Blues',
                            'atom color scheme':'viridis',
                            'clock color scheme':'summer'}
                            }

            with open("lintools.config","wb") as ymlfile:
                yaml.dump(cfg_dir,ymlfile,default_flow_style=False)
    def remove_files(self):
        """Removes intermediate files."""
        file_list = ["molecule.svg","lig.pdb","HIS.pdb","PHE.pdb","TRP.pdb","TYR.pdb","lig.mol","test.xtc"]
        for residue in self.topol_data.dict_of_plotted_res.keys():
            file_list.append(residue[1]+residue[2]+".svg")
        for f in file_list:
            if os.path.isfile(f)==True:
                os.remove(f)
Beispiel #3
0
class Lintools(object):
    """This class controls the behaviour of all other classes (Data,Plots,Molecule,Figure) 
     of lintools and inherits and transfers them resulting in a final SVG file that contains
     the protein-ligand interactions.

    It also controls the analysis (Residence_time and HBonds classes).

    Takes:
        * topology * - topology file
        * trajectory * - trajectory file(s)
        * mol2_file * - MOL2 file of the ligand
        * ligand * - MDAnalysis atomgroup of ligand that is going to be analysed
        * offset * - residue offset which determines by how many numbers the protein residue numbering
        should be offset (e.g. with offset = 30 the first residue will be changed from 1 to 30, 2 - 31, etc.)
        * cutoff * - cutoff distance in angstroms that defines the native contacts (default - 3.5A)   
        * start_frame * - start frame(s) for trajectory analysis (can be different for each trajectory)
        * end_frame * - end frame(s) for trajectory analysis (can be different for each trajectory)
        * skip * - number of frames to skip (can be different for each trajectory)
        * analysis_cutoff * - a fraction of time a residue has to fullfil the analysis parameters for (default - 0.3)
        * diagram_type * - string of the selected diagram type (e.g. "amino" or "clocks")
        * output_name * - name of the folder with results and the final SVG file

    """
    __version__ = "09.2016"

    def __init__(self, topology, trajectory, mol2_file, ligand, offset, cutoff,
                 start_frame, end_frame, skip, analysis_cutoff, diagram_type,
                 output_name):
        """Defines the input variables."""
        self.topology = os.path.abspath(topology)
        try:
            self.trajectory = []
            for traj in trajectory:
                self.trajectory.append(os.path.abspath(traj))
        except Exception:
            self.trajectory = []
        self.mol2_file = os.path.abspath(mol2_file)
        self.ligand = ligand
        self.offset = offset
        self.cutoff = cutoff
        self.start = [
            None if start_frame == [None] else int(start_frame[i])
            for i in range(len(trajectory))
        ]
        self.end = [
            None if end_frame == [None] else int(end_frame[i])
            for i in range(len(trajectory))
        ]
        self.skip = [
            None if skip == [None] else int(skip[i])
            for i in range(len(trajectory))
        ]
        self.analysis_cutoff = analysis_cutoff
        self.diagram_type = diagram_type
        self.output_name = output_name

    def data_input_and_res_time_analysis(self):
        """
        Loads the data into Data() - renumbers the residues, imports mol2 file in rdkit. 
        If there are trajectories to analyse, the residues that will be plotted are determined 
        from Residence_time() analysis.
        """
        self.topol_data = Data()
        self.topol_data.load_data(self.topology, self.mol2_file, self.ligand,
                                  self.offset)
        if len(self.trajectory) == 0:
            self.topol_data.analyse_topology(self.topology, self.cutoff)
        else:
            self.res_time = Residence_time(self.topol_data, self.trajectory,
                                           self.start, self.end, self.skip,
                                           self.topology, self.mol2_file,
                                           self.ligand, self.offset)
            self.res_time.measure_residence_time(self.cutoff)
            self.res_time.define_residues_for_plotting_traj(
                self.analysis_cutoff)
            self.topol_data.find_the_closest_atoms(self.topology)

    def analysis_of_prot_lig_interactions(self, hydr_bonds):
        """
        The classes and function that deal with protein-ligand interaction analysis.
        """
        if hydr_bonds != True:
            self.hbonds = HBonds(self.topol_data,
                                 self.trajectory,
                                 self.start,
                                 self.end,
                                 self.skip,
                                 self.analysis_cutoff,
                                 distance=3)
        else:
            self.hbonds = None

    def plot_residues(self):
        """
        Calls Plot() that plots the residues with the required diagram_type.
        """
        self.plots = Plots(self.topol_data, self.diagram_type)

    def draw_figure(self):
        """
        Draws molecule through Molecule() and then puts the final figure together with
        Figure().
        """
        self.molecule = Molecule(self.topol_data)

        self.figure = Figure(self.molecule, self.topol_data, self.hbonds)
        self.figure.add_bigger_box()
        self.figure.manage_the_plots()
        self.figure.draw_hydrogen_bonds()
        self.figure.draw_white_circles()
        self.figure.put_everything_together()
        self.figure.write_final_draw_file(self.output_name)

    def save_files(self):
        """Saves all output from LINTools run in a single directory named after the output name."""
        os.system("mkdir " + self.output_name)
        self.workdir = os.getcwd()
        os.chdir(self.workdir + "/" + self.output_name)

    def remove_files(self):
        """Removes intermediate files."""
        file_list = ["molecule.svg", "LIG.pdb"]
        for residue in self.topol_data.dict_of_plotted_res.keys():
            file_list.append(residue[1] + residue[2] + ".svg")
        for f in file_list:
            if os.path.isfile(f) == True:
                os.remove(f)