diff --git a/build/lib/packman/__init__.py b/build/lib/packman/__init__.py index 4ace1f6..f759673 100644 --- a/build/lib/packman/__init__.py +++ b/build/lib/packman/__init__.py @@ -14,5 +14,5 @@ from .utilities import * -#VERSION CHANGE HERE CHANGES IT IN docs AND setup.py; STILL NEED TO CHANGE IT IN requirement.txt -__version__='1.2.9' \ No newline at end of file +#VERSION CHANGE HERE CHANGES IT IN docs AND setup.py +__version__='1.2.10' \ No newline at end of file diff --git a/build/lib/packman/anm/anm.py b/build/lib/packman/anm/anm.py index 6ead259..99ae61b 100644 --- a/build/lib/packman/anm/anm.py +++ b/build/lib/packman/anm/anm.py @@ -2,12 +2,11 @@ """The 'ANM' object host file. This is file information, not the class information. This information is only for the API developers. -Please read the 'ANM' object documentation for details. [ help(packman.anm.ANM) ] +Please read the 'ANM' object documentation for details. -Example: - - >>>from packman.anm import ANM - >>>help( ANM ) +Example:: + from packman.anm import ANM + help( ANM ) Notes: * Tutorial: https://jerniganlab.github.io/Software/PACKMAN/Tutorials/compliance @@ -278,14 +277,13 @@ def calculate_stiffness_compliance(self): self.compliance_profile = [numpy.nanmean(i) for i in compliance_map] return True - def calculate_movie(self,mode_number,scale=1.5,n=10, direction="both"): - """Get the movie of the obtained LINEAR modes. + def calculate_movie(self,mode_number,scale=1.5,n=20): + """Get the movie of the obtained LINEAR modes. The first frame is the original structure and the projection progresses in positive (+) direction, returning to original structure and then in negative direction (-) again returning to the original structure. Args: mode_number (int) : Mode number. (first non-rigid mode is 6th) - scale (float) : Multiplier; extent to which mode will be extrapolated. Defaults to 1.5. - n (int) : Number of frames in output Defaults to 10 - direction (both/+/-) : Explore specific direcrion of the motion. Defaults to "both" + scale (float) : Multiplier; extent to which mode will be extrapolated. Defaults to 1.5 + n (int) : Number of frames in output (should be =>8 and ideally multiple of 4) Defaults to 20 Note: - Scale and n parameters should be redesigned. @@ -297,12 +295,7 @@ def calculate_movie(self,mode_number,scale=1.5,n=10, direction="both"): x0=self.coords new_coords=[] with open('ANM_'+str(mode_number)+'.pdb','w') as fh: - if(direction=="both"): - movement = [k for k in range(-n,n)]+[k for k in range(-n,n)[::-1]] - elif(direction=="+"): - movement = [k for k in range(n)]+[k for k in range(n)[::-1]] - elif(direction=="-"): - movement = [k for k in range(-n,1)]+[k for k in range(-n,1)[::-1]] + movement = [ numpy.sin(k*(1.0/float(n))*2*numpy.pi) for k in range(0,n+1,1) ] for j in movement: for numi,i in enumerate(x0): new_x=i[0]+scale*j*self.eigen_vectors[:,mode_number][(numi*3)+0] diff --git a/build/lib/packman/anm/hd_anm.py b/build/lib/packman/anm/hd_anm.py index 4ddf071..1492e15 100644 --- a/build/lib/packman/anm/hd_anm.py +++ b/build/lib/packman/anm/hd_anm.py @@ -2,7 +2,7 @@ """The 'hdANM' object host file. This is file information, not the class information. This information is only for the API developers. -Please read the 'hdANM' object documentation for details. [ help(packman.anm.hdANM) ] +Please read the 'hdANM' object documentation for details. About .hng File: - hdANM requires the information about hinges and domains in the .hng format. @@ -11,20 +11,20 @@ Filename_ChainID Domain/HingeId ResidueStartPosition:ResidueEndPosition -Example of .hng file for PDBID 1EXR +Example of .hng file for PDBID 1EXR:: -1EXR_A D1 1:70 -1EXR_A H1 70:90 -1EXR_A D2 90:148 + 1EXR_A D1 1:70 + 1EXR_A H1 70:90 + 1EXR_A D2 90:148 Above format means that there are two domains (D1 and D2) separated by a hinge (H1). D1 stretches from residue 1 to 70; D2 stretches from 90 to 148 and hinge H1 is in the middle. -Example: +Example:: - >>>from packman.anm import hdANM - >>>help( hdANM ) + from packman.anm import hdANM + help( hdANM ) Notes: * Tutorial: @@ -552,15 +552,14 @@ def calculate_cross_correlation( self, n_modes = "all" ): self.crosscorrelation_matrix[i][j] = trace_H_inv_ij / numpy.sqrt( trace_H_inv_ii*trace_H_inv_jj ) - def calculate_movie(self,mode_number,scale=1.5,n=10, extrapolation="curvilinear", direction="both", ftype='cif'): - """This function generates the dynamic 3D projection of the normal modes obtained using hd-ANM. The 3D projection can be linearly extrapolated or curvilinearly extrapolated depending on the choices. + def calculate_movie(self, mode_number, scale=1.5, n=20, extrapolation="curvilinear", ftype='cif'): + """This function generates the dynamic 3D projection of the normal modes obtained using hd-ANM. The 3D projection can be linearly extrapolated or curvilinearly extrapolated depending on the choices. The first frame is the original structure and the projection progresses in positive (+) direction, returning to original structure and then in negative direction (-) again returning to the original structure. Args: mode_number (int) : Mode number. (first non-rigid mode is 6th) - scale (float) : Multiplier; extent to which mode will be extrapolated. Defaults to 1.5. - n (int) : Number of frames in output Defaults to 10 - extrapolation (linear/curvilinear) : Extrapolation method Defaults to "curvilinear" - direction (both/+/-) : Explore specific direcrion of the motion. Defaults to "both" + scale (float) : Multiplier; extent to which mode will be extrapolated. Defaults to 1.5 + n (int) : Number of frames in output (should be =>8 and ideally multiple of 4) Defaults to 20 + extrapolation (linear/curvilinear) : Extrapolation method Defaults to "curvilinear" ftype (string) : Extension of the output file (.cif / .pdb) Note: @@ -576,13 +575,7 @@ def calculate_movie(self,mode_number,scale=1.5,n=10, extrapolation="curvilinear" new_coords=[] if(extrapolation=="linear"): - - if(direction=="both"): - movement = [k for k in range(-n,n)]+[k for k in range(-n,n)[::-1]] - elif(direction=="+"): - movement = [k for k in range(n)]+[k for k in range(n)[::-1]] - elif(direction=="-"): - movement = [k for k in range(-n,1)]+[k for k in range(-n,1)[::-1]] + movement = [ numpy.sin(k*(1.0/float(n))*2*numpy.pi) for k in range(0,n+1,1) ] ModelsOfTheProtein = [] for j in movement: HingeResidue=0 @@ -614,13 +607,7 @@ def calculate_movie(self,mode_number,scale=1.5,n=10, extrapolation="curvilinear" elif(extrapolation=="curvilinear"): - - if(direction=="both"): - movement = [k for k in range(-n,n)]+[k for k in range(-n,n)[::-1]] - elif(direction=="+"): - movement = [k for k in range(n)]+[k for k in range(n)[::-1]] - elif(direction=="-"): - movement = [k for k in range(-n,1)]+[k for k in range(-n,1)[::-1]] + movement = [ numpy.sin(k*(1.0/float(n))*2*numpy.pi) for k in range(0,n+1,1) ] ModelsOfTheProtein = [] for j in movement: HingeResidue=0 @@ -660,11 +647,11 @@ def calculate_movie(self,mode_number,scale=1.5,n=10, extrapolation="curvilinear" currentatm = Atom(self.atoms[numi].get_id() , self.atoms[numi].get_name(), numpy.array([new_x,new_y,new_z]), self.atoms[numi].get_occupancy(), self.atoms[numi].get_bfactor(), self.atoms[numi].get_element(),self.atoms[numi].get_charge(), self.atoms[numi].get_parent() ) AtomsOfTheFrame[numi] = currentatm - ModelsOfTheProtein.append( Model(j, AtomsOfTheFrame, None, None, None, None) ) + ModelsOfTheProtein.append( Model(j, AtomsOfTheFrame, None, None, None, None) ) Annotations = self.atoms[0].get_parent().get_parent().get_parent().get_parent().get_data() prot = Protein(str(mode_number), ModelsOfTheProtein) prot.set_data(Annotations) - prot.write_structure( str(mode_number)+'.'+ftype ) + prot.write_structure( str(mode_number)+'.'+ftype ) return True \ No newline at end of file diff --git a/build/lib/packman/apps/__init__.py b/build/lib/packman/apps/__init__.py index f2c26f5..0117ada 100644 --- a/build/lib/packman/apps/__init__.py +++ b/build/lib/packman/apps/__init__.py @@ -7,7 +7,7 @@ Notes: * Current apps list: - predict_hinge : A program to predict the hinge on the molecule given the atoms and relevent parameters -Example: +Example:: * Review the packman.bin.PACKMAN.py file for the app use. Todo: diff --git a/build/lib/packman/apps/predict_hinge.py b/build/lib/packman/apps/predict_hinge.py index e8242d7..5e87bc0 100644 --- a/build/lib/packman/apps/predict_hinge.py +++ b/build/lib/packman/apps/predict_hinge.py @@ -2,12 +2,12 @@ """The 'predict_hinge' object host file. This is file information, not the class information. This information is only for the API developers. -Please read the 'predict_hinge' object documentation for details. [ help(packman.apps.predict_hinge) ] +Please read the 'predict_hinge' object documentation for details. -Example: +Example:: - >>>from packman import apps - >>>help( apps.predict_hinge ) + from packman.apps import predict_hinge + help( predict_hinge ) Todo: * Finish writing up the documentation. diff --git a/build/lib/packman/bin/PACKMAN.py b/build/lib/packman/bin/PACKMAN.py index 3ee406f..298e470 100644 --- a/build/lib/packman/bin/PACKMAN.py +++ b/build/lib/packman/bin/PACKMAN.py @@ -228,10 +228,17 @@ def show_frame(self,frame_name): class top_menu(tk.Frame): def __init__(self,parent): - tk.Frame.__init__(self) - tk.Button(parent, text = 'Home', command = lambda: parent.show_frame('HomePage') ).grid(row=0,column=0,sticky=E+W) - tk.Button(parent, text = 'Hinge Prediction', command = lambda: parent.show_frame('HingePrediction') ).grid(row=0,column=1,sticky=E+W) - tk.Button(parent, text = 'hdANM', command = lambda: parent.show_frame('hdANM_GUI') ).grid(row=0,column=2,sticky=E+W) + number_of_buttons = 3 + Canvas_top_menu = tk.Canvas(parent) + Canvas_top_menu.grid(row=0,column=0,columnspan=3, sticky=E+W ) + + for i in range(0,number_of_buttons): + Grid.columnconfigure(Canvas_top_menu, i, weight=1) + + #tk.Frame.__init__(self) + tk.Button(Canvas_top_menu, text = 'Home', command = lambda: parent.show_frame('HomePage') ).grid( row=0,column=0,sticky=E+W ) + tk.Button(Canvas_top_menu, text = 'Hinge Prediction', command = lambda: parent.show_frame('HingePrediction') ).grid( row=0,column=1,sticky=E+W ) + tk.Button(Canvas_top_menu, text = 'hdANM', command = lambda: parent.show_frame('hdANM_GUI') ).grid( row=0,column=2,sticky=E+W ) @@ -257,9 +264,9 @@ def __init__(self,parent): self.all_objects = self.__dict__ def show(self): - self.Label1.grid(row=1,columnspan=3) - self.Label2.grid(row=2,columnspan=3) - self.Text1.grid(row=3,columnspan=3) + self.Label1.grid(row=1,columnspan=3, sticky=E+W, padx=10, pady=10 ) + self.Label2.grid(row=2,columnspan=3, sticky=E+W, padx=10, pady=10 ) + self.Text1.grid(row=3,columnspan=3, sticky=E+W, padx=10, pady=10 ) def hide(self): for i in self.all_objects: @@ -381,11 +388,10 @@ def run_PACKMAN(self): #At this point, everything is okay - #Results + #Hinge Prediction Results pop_up1 = tk.Toplevel() pop_up1.title('PACKMAN Results') - #Canvas Canvas1 = tk.Canvas(pop_up1) Canvas1.grid(row=0,column=0,columnspan=6,sticky=N+S+E+W, padx=10, pady=10 ) @@ -503,7 +509,6 @@ def show_details(content): #on_click() Ends here return True - ''' diff --git a/build/lib/packman/bin/logo.ico b/build/lib/packman/bin/logo.ico new file mode 100644 index 0000000..3acd7b1 Binary files /dev/null and b/build/lib/packman/bin/logo.ico differ diff --git a/build/lib/packman/molecule/annotations.py b/build/lib/packman/molecule/annotations.py index a2bb3d9..61201a3 100644 --- a/build/lib/packman/molecule/annotations.py +++ b/build/lib/packman/molecule/annotations.py @@ -4,10 +4,10 @@ This is file information, not the class information. This information is only for the API developers. Please read the corrosponding object documentation for details. -Example: +Example:: - >>>from packman import molecule - >>>help( molecule.Hinge ) + from packman.molecule import Hinge + help( Hinge ) Todo: * Finish writing up the documentation. diff --git a/build/lib/packman/molecule/atom.py b/build/lib/packman/molecule/atom.py index 8e284cf..926d82f 100644 --- a/build/lib/packman/molecule/atom.py +++ b/build/lib/packman/molecule/atom.py @@ -2,15 +2,13 @@ """The 'Atom' object host file. This is file information, not the class information. This information is only for the API developers. -Please read the 'Atom' object documentation for details. [ help(packman.molecule.atoms.Atom) ] +Please read the 'Atom' object documentation for details. -Example: - >>>from packman.molecule import atom.Atom - >>>help( Atom ) - OR +Example:: + + from packman.molecule import Atom + help( Atom ) - >>>from packman import molecule - >>>help( molecule.Atom ) Todo: * Finish writing up the documentation. diff --git a/build/lib/packman/molecule/chain.py b/build/lib/packman/molecule/chain.py index a070406..6f0c8da 100644 --- a/build/lib/packman/molecule/chain.py +++ b/build/lib/packman/molecule/chain.py @@ -2,15 +2,12 @@ """The 'Chain' object host file. This is file information, not the class information. This information is only for the API developers. -Please read the 'Chain' object documentation for details. [ help(packman.molecule.chain.Chain) ] +Please read the 'Chain' object documentation for details. -Example: - >>>from packman.molecule import chain.Chain - >>>help( Chain ) - OR +Example:: - >>>from packman import molecule - >>>help( molecule.Chain ) + from packman.molecule import Chain + help( Chain ) Note: * Iterating over chain only fetches the residues not the hetero atoms diff --git a/build/lib/packman/molecule/hetmol.py b/build/lib/packman/molecule/hetmol.py index 341654d..8e0ed31 100644 --- a/build/lib/packman/molecule/hetmol.py +++ b/build/lib/packman/molecule/hetmol.py @@ -2,15 +2,12 @@ """The 'HetMol' object host file. This is file information, not the class information. This information is only for the API developers. -Please read the 'HetMol' object documentation for details. [ help(packman.molecule.residue.Residue) ] +Please read the 'HetMol' object documentation for details. -Example: - >>>from packman.molecule import residue.HetMol - >>>help( HetMol ) - OR +Example:: - >>>from packman import HetMol - >>>help( molecule.HetMol ) + from packman.molecule import HetMol + help( HetMol ) Todo: * Finish writing up the documentation. diff --git a/build/lib/packman/molecule/model.py b/build/lib/packman/molecule/model.py index b43fa4a..3a1cc3c 100644 --- a/build/lib/packman/molecule/model.py +++ b/build/lib/packman/molecule/model.py @@ -2,15 +2,12 @@ """The 'Model' object host file. This is file information, not the class information. This information is only for the API developers. -Please read the 'Model' object documentation for details. [ help(packman.molecule.model.Model) ] +Please read the 'Model' object documentation for details. -Example: - >>>from packman.molecule import model.Model - >>>help( Model ) - OR +Example:: - >>>from packman import molecule - >>>help( molecule.Model ) + from packman.molecule import Model + help( Model ) Note: * The models are nothing but frames of the PDB file. @@ -26,6 +23,7 @@ import numpy +import logging class Model(): @@ -81,9 +79,16 @@ def get_residues(self): """Get the generator of corresponding 'Residue' objects of the 'Model' Returns: - generator of 'Residue' objects if successful, None otherwise. + array of 'Residue' objects if successful, None otherwise. """ - return [j for i in self.__AllChains.keys() for j in self.__AllChains[i].get_residues()] + #return [j for i in self.__AllChains.keys() for j in self.__AllChains[i].get_residues()] + residues = [] + for i in self.__AllChains.keys(): + try: + residues.extend( self.__AllChains[i].get_residues() ) + except: + logging.warning("Chain "+str(i)+" either doesn't have residues or an error occurred; Model.get_residues() may have loaded other chains.") + return residues def get_atoms(self): """Get the generator of corresponding 'Atom' objects of the 'Model' diff --git a/build/lib/packman/molecule/molecule.py b/build/lib/packman/molecule/molecule.py index 83b08db..e0645bf 100644 --- a/build/lib/packman/molecule/molecule.py +++ b/build/lib/packman/molecule/molecule.py @@ -2,16 +2,13 @@ """The 'Molecule' object host file. This is file information, not the class information. This information is only for the API developers. -Please read the 'Model' object documentation for details. [ help(packman.molecule) ] +Please read the 'Model' object documentation for details. -Example: - >>>from packman.molecule import molecule - >>>help( Model ) - OR +Example:: + + from packman.molecule import Model + help( Model ) - >>>from packman import molecule - >>>help( molecule ) - Todo: * Finish writing up the documentation. * Finish error handling. @@ -367,6 +364,7 @@ def load_structure(filename, ftype = 'cif'): This class helps user to load the 3D structure of the protein onto a packman.molecule.Protein object. Example:: + from packman import molecule molecule.download_structure('1prw') molecule.load_structure('1prw.cif') @@ -379,7 +377,9 @@ def load_structure(filename, ftype = 'cif'): packman.molecule.Protein: Protein object containing all the information about the Protein """ try: - ftype = filename.split('.')[1] + possible_ftype = filename.split('.')[1] + if(possible_ftype == 'cif' or possible_ftype == 'pdb'): + ftype = possible_ftype except: None @@ -402,8 +402,8 @@ def download_structure(pdbid,save_name=None,ftype='cif'): Example:: - >>> from packman import molecule - >>> molecule.download_structure('1prw') + from packman import molecule + molecule.download_structure('1prw') Args: pdbid (str) : A Unique 4 Letter PDB ID (eg.. 1PRW) diff --git a/build/lib/packman/molecule/protein.py b/build/lib/packman/molecule/protein.py index 434a96b..6127ab8 100644 --- a/build/lib/packman/molecule/protein.py +++ b/build/lib/packman/molecule/protein.py @@ -2,17 +2,12 @@ """The 'Protein' object host file. This is file information, not the class information. This information is only for the API developers. -Please read the 'Protein' object documentation for details. [ help(packman.molecule.protein.Protein) ] +Please read the 'Protein' object documentation for details. Example:: - >>> from packman.molecule import protein.Protein - >>> help( Protein ) - - OR:: - - >>> from packman import molecule - >>> help( molecule.Protein ) + from packman.molecule import Protein + help( Protein ) Note: * Top in the hierarchy diff --git a/build/lib/packman/molecule/residue.py b/build/lib/packman/molecule/residue.py index 0958516..235a194 100644 --- a/build/lib/packman/molecule/residue.py +++ b/build/lib/packman/molecule/residue.py @@ -2,15 +2,13 @@ """The 'Residue' object host file. This is file information, not the class information. This information is only for the API developers. -Please read the 'Residue' object documentation for details. [ help(packman.molecule.residue.Residue) ] +Please read the 'Residue' object documentation for details. -Example: - >>>from packman.molecule import residue.Residue - >>>help( Residue ) - OR +Example:: + + from packman.molecule import Residue + help( Residue ) - >>>from packman import molecule - >>>help( molecule.Residue ) Todo: * Finish writing up the documentation. diff --git a/build/lib/packman/utilities/utilities.py b/build/lib/packman/utilities/utilities.py index a6d0b2b..c717d57 100644 --- a/build/lib/packman/utilities/utilities.py +++ b/build/lib/packman/utilities/utilities.py @@ -123,7 +123,7 @@ def load_hinge(filename): Filename_ChainID Domain/HingeId ResidueStartPosition:ResidueEndPosition - Example of .hng file for PDBID 1EXR + Example of .hng file for PDBID 1EXR:: 1EXR_A D1 1:70 1EXR_A H1 70:90 diff --git a/dist/py-packman-1.2.10.tar.gz b/dist/py-packman-1.2.10.tar.gz new file mode 100644 index 0000000..6ae155e Binary files /dev/null and b/dist/py-packman-1.2.10.tar.gz differ diff --git a/dist/py_packman-1.2.10-py3-none-any.whl b/dist/py_packman-1.2.10-py3-none-any.whl new file mode 100644 index 0000000..1022099 Binary files /dev/null and b/dist/py_packman-1.2.10-py3-none-any.whl differ diff --git a/py_packman.egg-info/PKG-INFO b/py_packman.egg-info/PKG-INFO index b614c1f..fc5f060 100644 --- a/py_packman.egg-info/PKG-INFO +++ b/py_packman.egg-info/PKG-INFO @@ -1,14 +1,73 @@ Metadata-Version: 1.1 Name: py-packman -Version: 1.2.9 +Version: 1.2.10 Summary: A software package for molecular PACKing and Motion ANalysis (PACKMAN) Home-page: https://github.com/Pranavkhade/PACKMAN Author: Pranav Khade Author-email: pranavk@iastate.edu License: MIT -Description: This package focuses on studying molecular structures and their dynamics using a simple yet informative property known as Protein Packing. Over the last few years, we have worked on several techniques to capture and quantify the protein packing, resulting in a few publications. This package has all the code to repeat and further develop these techniques. +Description: [![Build Status](https://travis-ci.com/Pranavkhade/PACKMAN.svg?branch=master)](https://travis-ci.com/Pranavkhade/PACKMAN) [![Documentation Status](https://readthedocs.org/projects/py-packman/badge/?version=latest)](https://py-packman.readthedocs.io/en/latest/?badge=latest) [![Downloads](https://pepy.tech/badge/py-packman)](https://pepy.tech/project/py-packman) - Please visit for more details: https://github.com/Pranavkhade/PACKMAN + + PACKMAN: PACKing and Motion ANalysis + ------------------------------------ + + + This package focuses on studying molecular structures and their dynamics using a simple yet informative property known as Protein Packing. Over the last few years, we have worked on several techniques to capture and quantify the protein packing, resulting in a few publications. This package has all the code to repeat and further develop these techniques. + + + DOCUMENTATION + ------------- + * [IMPORTANT : Documentation, Tutorials & More](https://py-packman.readthedocs.io) + * [Hinge Prediction Web Server](https://packman.bb.iastate.edu/) + * [hd-ANM Web Server](https://hdanm.bb.iastate.edu/) + * [Reference for Hinge Prediction](https://doi.org/10.1016/j.jmb.2019.11.018) + * [Reference for Compliance](https://doi.org/10.1002/prot.25968) + * [Reference for hd-ANM](coming_soon) + + INSTALLATION + ------------ + + 1. Installing with pip (Recommended) + ``` + pip install py-packman + ``` + + 2. Installing from source + ``` + git clone https://github.com/Pranavkhade/PACKMAN + cd PACKMAN + python setup.py install + ``` + + HOW TO USE + ---------- + + PACKMAN, along with its components, can be accessed via Graphical User Interface (GUI), Command-line Interface (CLI), and Application programming interface (API). + + For the GUI, please run the following command. + ``` + python -m packman gui + ``` + OR + ``` + python3 -m packman gui + ``` + + For the CLI and API, please read the tutorials & documentation. + + PREREQUISITES + ------------- + + * [numpy](http://www.numpy.org/) + + * [scipy](https://www.scipy.org/) + + * [networkx](https://networkx.github.io/) + + * [mlxtend](http://rasbt.github.io/mlxtend/) + + * [sklearn](https://scikit-learn.org/stable/) Keywords: protein,dynamics,protein packing,protein domain,protein hinge Platform: UNKNOWN Classifier: Intended Audience :: Education diff --git a/py_packman.egg-info/SOURCES.txt b/py_packman.egg-info/SOURCES.txt index 3419160..d09fc3c 100644 --- a/py_packman.egg-info/SOURCES.txt +++ b/py_packman.egg-info/SOURCES.txt @@ -9,6 +9,7 @@ packman/apps/__init__.py packman/apps/predict_hinge.py packman/bin/PACKMAN.py packman/bin/__init__.py +packman/bin/logo.ico packman/constants/Constants.py packman/constants/__init__.py packman/molecule/__init__.py