From 4a0842ec4cd10eaaadcc4989463d440f813f595a Mon Sep 17 00:00:00 2001 From: MarcoDiS Date: Tue, 17 Nov 2020 13:40:33 +0100 Subject: [PATCH 1/9] Python2/3 compatibility --- taddyn/experiment.py | 2 +- taddyn/modelling/impoptimizer.py | 17 +++++++++-------- taddyn/utils/extraviews.py | 3 +-- taddyn/utils/hic_filtering.py | 18 ++++++++---------- 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/taddyn/experiment.py b/taddyn/experiment.py index 78788d5..e8be43a 100644 --- a/taddyn/experiment.py +++ b/taddyn/experiment.py @@ -1368,7 +1368,7 @@ def print_hic_matrix(self, print_it=True, normalized=False, zeros=False, index=0 for i in xrange(siz)]) for j in xrange(siz)]) if print_it: - print out + print(out) else: return out + '\n' diff --git a/taddyn/modelling/impoptimizer.py b/taddyn/modelling/impoptimizer.py index 613fefc..d74d6f5 100644 --- a/taddyn/modelling/impoptimizer.py +++ b/taddyn/modelling/impoptimizer.py @@ -322,7 +322,7 @@ def run_grid_search(self, if verbose == 2: stderr.write(verb + str(round(result, 4)) + '\n') else: - print verb + str(round(result, 4)) + print(verb + str(round(result, 4))) continue config_tmp = {'kforce' : float(kforce), @@ -372,11 +372,12 @@ def run_grid_search(self, # Update nmodels with the ones that really finished if self.n_models != len(tdm): - print 'WARNING: not all models produced: step %s, nmodels=%s' %(i+1, len(tdm)) + print('WARNING: not all models produced: step %s, nmodels=%s' %(i+1, len(tdm))) self.n_models = len(tdm) - except Exception, e: - print ' SKIPPING: %s' % e + except ValueError: + _, e, _ = sys.exc_info() + print(' SKIPPING: %s' % e) result = 0 cutoff = my_round(dcutoff_arange[0]) for ct,m in enumerate(avg_result): @@ -391,7 +392,7 @@ def run_grid_search(self, if verbose == 2: stderr.write(verb + str(round(result, 4)) + '\n') else: - print verb + str(round(result, 4)) + print(verb + str(round(result, 4))) count += ct # Store the correlation for the TADdyn parameters set @@ -546,7 +547,7 @@ def get_best_parameters_dict(self, reference=None, with_corr=False): best = ((scale, maxdist, upfreq, lowfreq, kbending, cutoff), val) if with_corr: - print best + #print best return (dict((('scale' , float(best[0][0])), ('kbending' , float(best[0][1])), ('maxdist' , float(best[0][2])), @@ -746,7 +747,7 @@ def write_result(self, f_name): key=lambda x: self.results[ (scale, kbending, maxdist, lowfreq, upfreq, x)]) except IndexError: - print 'Missing dcutoff', (scale, kbending, maxdist, lowfreq, upfreq) + print('Missing dcutoff', (scale, kbending, maxdist, lowfreq, upfreq)) continue for c in cut: @@ -755,7 +756,7 @@ def write_result(self, f_name): out.write(' %-5s\t%-8s\t%-8s\t%-8s\t%-7s\t%-7s\t%-11s\n' % ( scale, kbending, maxdist, lowfreq, upfreq, c, result)) except KeyError: - print 'KeyError', (scale, kbending, maxdist, lowfreq, upfreq, c, result) + print('KeyError', (scale, kbending, maxdist, lowfreq, upfreq, c, result)) continue out.close() diff --git a/taddyn/utils/extraviews.py b/taddyn/utils/extraviews.py index 49a984a..6f9e25f 100644 --- a/taddyn/utils/extraviews.py +++ b/taddyn/utils/extraviews.py @@ -93,7 +93,6 @@ def plot_2d_optimization_result(result, # Commands for compatibility with the OLD version: #print axes_range if len(axes_range) == 4: - print "I'm here!!!" tmp_axes_range = axes_range tmp_axes_range[1] = [0.0] # kbending !!!New option!!! len_kbending_range = 1 @@ -268,7 +267,7 @@ def plot_2d_optimization_result(result, rect = patches.Rectangle((len(xax)-.5, -0.5), 2.5, len(yax), facecolor='grey', alpha=0.5) # Define the rectangles for - print dcutoff + #print dcutoff rect.set_clip_on(False) grid[cell-1].add_patch(rect) grid[cell-1].text(len(xax) + 1.0, len(yax) / 2., diff --git a/taddyn/utils/hic_filtering.py b/taddyn/utils/hic_filtering.py index b033e03..a096e1c 100644 --- a/taddyn/utils/hic_filtering.py +++ b/taddyn/utils/hic_filtering.py @@ -1,11 +1,12 @@ """ 06 Aug 2013 """ - +from __future__ import print_function # (at top of module) from warnings import warn from sys import stderr from re import sub + import numpy as np try: @@ -311,7 +312,7 @@ def _best_window_size(sorted_prc, size, beg, end, verbose=False): count = 0 if verbose: - print ' * first window size with stable median of cis-percentage: %d' % (win_size) + print(' * first window size with stable median of cis-percentage: %d' % (win_size)) return win_size @@ -419,12 +420,10 @@ def filter_by_cis_percentage(cisprc, beg=0.3, end=0.8, sigma=2, verbose=False, max_count = sorted_sum[-1] + 1 if verbose: - print ' * Lower cutoff applied until bin number: %d' % (cutoffL) - print ' * too few interactions defined as less than %9d interactions' % ( - min_count) - print ' * Upper cutoff applied until bin number: %d' % (cutoffR) - print ' * too much interactions defined as more than %9d interactions' % ( - max_count) + print(' * Lower cutoff applied until bin number: %d' % (cutoffL)) + print(' * too few interactions defined as less than %9d interactions' % (min_count)) + print(' * Upper cutoff applied until bin number: %d' % (cutoffR)) + print(' * too much interactions defined as more than %9d interactions' % (max_count)) # plot @@ -441,7 +440,6 @@ def filter_by_cis_percentage(cisprc, beg=0.3, end=0.8, sigma=2, verbose=False, elif cisprc[c][1] > max_count: # don't need get here, already cought in previous condition badcol[c] = cisprc.get(c, [0, 0])[1] countU += 1 - print ' => %d BAD bins (%d/%d/%d null/low/high counts) of %d (%.1f%%)' % ( - len(badcol), countZ, countL, countU, size, float(len(badcol)) / size * 100) + print(' => %d BAD bins (%d/%d/%d null/low/high counts) of %d (%.1f%%)' % (len(badcol), countZ, countL, countU, size, float(len(badcol)) / size * 100)) return badcol From d8ca1d7b3e029b6f20d9cb237fc94f13911cdae1 Mon Sep 17 00:00:00 2001 From: Marco Di Stefano Date: Wed, 13 Jan 2021 13:01:44 +0100 Subject: [PATCH 2/9] Update README.rst --- README.rst | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/README.rst b/README.rst index bc8c347..f7b7109 100644 --- a/README.rst +++ b/README.rst @@ -7,16 +7,7 @@ +-----------------------+-+ -TADdyn is a Python library that allows to model and explore single or time-series 3C-based data. -These datasets are constituted by interaction matrices that describe distinct stages of naturally -occurring or induced cellular process such as the cell trans-differentiation, or reprogramming. -With TADdyn the user can load at once the raw and normalised interaction binned matrices (Hi-C like matrices) -at each of the experimental stages, build 4D models, and finally, extract structural properties from the models. -The 4D models reproduce the expected interaction patterns at the experimental time-points, -and also describe the structural modifications at intermediate moments (between stages) under the hypothesis -that the changes occurring between consecutive experimental time-points are smooth. To do this, -TADdyn is designed as a combination of restraint-based modelling, and steered Langevin dynamics of Physics-based -chromatin models. +TADdyn. Documentation ************* @@ -83,4 +74,4 @@ and on LAMMPS [Plimpton]_ for the implementation of the simulations. Bibliography ************ -.. [Plimpton] Plimpton, S. Fast Parallel Algorithms for Short-Range Molecular Dynamics. J Comp Phys 117, 1-19 (1995) and Fiorin, G., Klein, M.L. & Hénin, J. Using collective variables to drive molecular dynamics simulations. Molecular Physics 111, 3345-3362 (2013). \ No newline at end of file +.. [Plimpton] Plimpton, S. Fast Parallel Algorithms for Short-Range Molecular Dynamics. J Comp Phys 117, 1-19 (1995) and Fiorin, G., Klein, M.L. & Hénin, J. Using collective variables to drive molecular dynamics simulations. Molecular Physics 111, 3345-3362 (2013). From dbe4a3671a65c462e920107889f5acfeefe213c9 Mon Sep 17 00:00:00 2001 From: Marco Di Stefano Date: Wed, 13 Jan 2021 13:02:01 +0100 Subject: [PATCH 3/9] Update README.rst --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index f7b7109..892c8bd 100644 --- a/README.rst +++ b/README.rst @@ -7,7 +7,7 @@ +-----------------------+-+ -TADdyn. +TADphys. Documentation ************* From 2ed875f5ac7a4bdcab872b1d11faa650bacc54b9 Mon Sep 17 00:00:00 2001 From: MarcoDiS Date: Wed, 20 Jan 2021 09:45:13 +0100 Subject: [PATCH 4/9] Creation of TADphys --- TADphys.egg-info/PKG-INFO | 87 + TADphys.egg-info/SOURCES.txt | 29 + TADphys.egg-info/dependency_links.txt | 1 + TADphys.egg-info/top_level.txt | 1 + .../tadphys}/Chromosome_region.py | 0 .../lib.linux-x86_64-3.6/tadphys/__init__.py | 72 + .../lib.linux-x86_64-3.6/tadphys}/_version.py | 0 .../tadphys/chromosome.py | 1009 +++++ .../tadphys/experiment.py | 1749 ++++++++ .../lib.linux-x86_64-3.6/tadphys}/hic_data.py | 0 .../tadphys}/modelling/HIC_CONFIG.py | 0 .../tadphys/modelling/LAMMPS_CONFIG.py | 100 + .../tadphys}/modelling/__init__.py | 0 .../tadphys}/modelling/impoptimizer.py | 0 .../tadphys}/modelling/lammps_modelling.py | 448 +- .../tadphys/modelling/lammpsmodel.py | 38 + .../tadphys}/modelling/restraints.py | 0 .../tadphys/modelling/structuralmodel.py | 955 ++++ ...nce_matrix.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 17608 bytes .../tadphys}/utils/__init__.py | 0 .../tadphys}/utils/extraviews.py | 0 .../tadphys}/utils/hic_filtering.py | 0 .../tadphys}/utils/hic_parser.py | 0 .../tadphys}/utils/maths.py | 0 .../tadphys}/utils/modelAnalysis.py | 0 .../tadphys}/utils/tadmaths.py | 0 .../squared_distance_matrix_calculation_py.o | Bin 0 -> 8312 bytes dist/TADdyn-0.1-py3.6-linux-x86_64.egg | Bin 0 -> 226036 bytes dist/TADphys-0.1-py3.6-linux-x86_64.egg | Bin 0 -> 228680 bytes dist/Tadphys-0.1-py3.6-linux-x86_64.egg | Bin 0 -> 448747 bytes setup.py | 10 +- tadphys/Chromosome_region.py | 360 ++ tadphys/__init__.py | 72 + {taddyn => tadphys}/__init__.pyc | Bin taddyn/__init__.py => tadphys/__init__.py~ | 0 tadphys/_version.py | 1 + tadphys/chromosome.py | 1009 +++++ .../chromosome.py => tadphys/chromosome.py~ | 26 +- tadphys/experiment.py | 1749 ++++++++ .../experiment.py => tadphys/experiment.py~ | 0 tadphys/hic_data.py | 0 tadphys/modelling/HIC_CONFIG.py | 46 + tadphys/modelling/LAMMPS_CONFIG.py | 100 + .../modelling/LAMMPS_CONFIG.py~ | 4 +- tadphys/modelling/__init__.py | 0 tadphys/modelling/impoptimizer.py | 906 ++++ tadphys/modelling/lammps_modelling.py | 3850 +++++++++++++++++ tadphys/modelling/lammps_modelling.py~ | 3850 +++++++++++++++++ tadphys/modelling/lammpsmodel.py | 38 + .../modelling/lammpsmodel.py~ | 0 tadphys/modelling/restraints.py | 321 ++ tadphys/modelling/structuralmodel.py | 955 ++++ .../modelling/structuralmodel.py~ | 0 tadphys/utils/__init__.py | 0 tadphys/utils/extraviews.py | 314 ++ tadphys/utils/hic_filtering.py | 445 ++ tadphys/utils/hic_parser.py | 391 ++ tadphys/utils/maths.py | 88 + tadphys/utils/modelAnalysis.py | 195 + tadphys/utils/tadmaths.py | 230 + test/compartmentalization.py | 47 + test/compartmentalization.sh | 12 + 62 files changed, 19336 insertions(+), 172 deletions(-) create mode 100644 TADphys.egg-info/PKG-INFO create mode 100644 TADphys.egg-info/SOURCES.txt create mode 100644 TADphys.egg-info/dependency_links.txt create mode 100644 TADphys.egg-info/top_level.txt rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/Chromosome_region.py (100%) create mode 100644 build/lib.linux-x86_64-3.6/tadphys/__init__.py rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/_version.py (100%) create mode 100644 build/lib.linux-x86_64-3.6/tadphys/chromosome.py create mode 100644 build/lib.linux-x86_64-3.6/tadphys/experiment.py rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/hic_data.py (100%) rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/modelling/HIC_CONFIG.py (100%) create mode 100644 build/lib.linux-x86_64-3.6/tadphys/modelling/LAMMPS_CONFIG.py rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/modelling/__init__.py (100%) rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/modelling/impoptimizer.py (100%) rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/modelling/lammps_modelling.py (91%) create mode 100644 build/lib.linux-x86_64-3.6/tadphys/modelling/lammpsmodel.py rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/modelling/restraints.py (100%) create mode 100644 build/lib.linux-x86_64-3.6/tadphys/modelling/structuralmodel.py create mode 100755 build/lib.linux-x86_64-3.6/tadphys/squared_distance_matrix.cpython-36m-x86_64-linux-gnu.so rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/utils/__init__.py (100%) rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/utils/extraviews.py (100%) rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/utils/hic_filtering.py (100%) rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/utils/hic_parser.py (100%) rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/utils/maths.py (100%) rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/utils/modelAnalysis.py (100%) rename {taddyn => build/lib.linux-x86_64-3.6/tadphys}/utils/tadmaths.py (100%) create mode 100644 build/temp.linux-x86_64-3.6/src/3d-lib/squared_distance_matrix_calculation_py.o create mode 100644 dist/TADdyn-0.1-py3.6-linux-x86_64.egg create mode 100644 dist/TADphys-0.1-py3.6-linux-x86_64.egg create mode 100644 dist/Tadphys-0.1-py3.6-linux-x86_64.egg create mode 100644 tadphys/Chromosome_region.py create mode 100644 tadphys/__init__.py rename {taddyn => tadphys}/__init__.pyc (100%) rename taddyn/__init__.py => tadphys/__init__.py~ (100%) create mode 100644 tadphys/_version.py create mode 100644 tadphys/chromosome.py rename taddyn/chromosome.py => tadphys/chromosome.py~ (98%) create mode 100644 tadphys/experiment.py rename taddyn/experiment.py => tadphys/experiment.py~ (100%) create mode 100644 tadphys/hic_data.py create mode 100644 tadphys/modelling/HIC_CONFIG.py create mode 100644 tadphys/modelling/LAMMPS_CONFIG.py rename taddyn/modelling/LAMMPS_CONFIG.py => tadphys/modelling/LAMMPS_CONFIG.py~ (98%) create mode 100644 tadphys/modelling/__init__.py create mode 100644 tadphys/modelling/impoptimizer.py create mode 100644 tadphys/modelling/lammps_modelling.py create mode 100644 tadphys/modelling/lammps_modelling.py~ create mode 100644 tadphys/modelling/lammpsmodel.py rename taddyn/modelling/lammpsmodel.py => tadphys/modelling/lammpsmodel.py~ (100%) create mode 100644 tadphys/modelling/restraints.py create mode 100644 tadphys/modelling/structuralmodel.py rename taddyn/modelling/structuralmodel.py => tadphys/modelling/structuralmodel.py~ (100%) create mode 100644 tadphys/utils/__init__.py create mode 100644 tadphys/utils/extraviews.py create mode 100644 tadphys/utils/hic_filtering.py create mode 100644 tadphys/utils/hic_parser.py create mode 100644 tadphys/utils/maths.py create mode 100644 tadphys/utils/modelAnalysis.py create mode 100644 tadphys/utils/tadmaths.py create mode 100644 test/compartmentalization.py create mode 100644 test/compartmentalization.sh diff --git a/TADphys.egg-info/PKG-INFO b/TADphys.egg-info/PKG-INFO new file mode 100644 index 0000000..4dde880 --- /dev/null +++ b/TADphys.egg-info/PKG-INFO @@ -0,0 +1,87 @@ +Metadata-Version: 1.0 +Name: TADphys +Version: 0.1 +Summary: Tadphys is a Python library that allows to model and explore single or time-series 3C-based data. +Home-page: UNKNOWN +Author: Marco Di Stefano, David Castillo +Author-email: marco.di.distefano.1985@gmail.com +License: GPLv3 +Description: + + +-----------------------+-+ + | | | + | Current version: pipeline_v0.2.722 | + | | | + +-----------------------+-+ + + + TADphys. + + Documentation + ************* + + **Install LAMMPS as a shared library** + | 1 - Download lammps + | git clone -b stable https://github.com/lammps/lammps.git mylammps + + | 2 - Download the colvar modified version + | git clone https://github.com/david-castillo/colvars + + | 3 - Update the user-defined colvars library + | ./colvars/update-colvars-code.sh ./mylammps/ + + | 4 - Compile colvars library + | cd ./mylammps/lib/colvars + | make -f Makefile.g++ + + | 5 - Install lammps as a shared library + | cd ../../src/ + | include "-DLAMMPS_EXCEPTIONS" in the LMP_INC line in src/MAKE/Makefile.serial + | make yes-user-colvars + | make yes-molecule + | make serial mode=shlib + | make install-python + + | cd ../../ + + **Install packages** + | conda install -y scipy # scientific computing in python + | conda install -y numpy # scientific computing in python + | conda install -y matplotlib # to produce plots + | conda install -y jupyter # this notebook :) + | conda install -y -c https://conda.anaconda.org/bcbio pysam # to deal with SAM/BAM files + | conda install -y -c https://conda.anaconda.org/salilab imp # for 3D modeling + | conda install -y -c bioconda mcl # for clustering + + **Install TADdyn** + | 1 - Download TADdyn from the Github repository + | git clone https://github.com/david-castillo/TADbit.git -b TADdyn TADdyn + + | 2 - Install TADdyn + | cd TADdyn + | python setup.py install + | cd .. + + **Try TADdyn** + | cd test/Sox2 + | python test_TADdyn_on_Sox2.py + + Citation + ******** + Please, cite this article if you use TADdyn. + + Marco Di Stefano, Ralph Stadhouders, Irene Farabella, David Castillo, François Serra, Thomas Graf, Marc A. Marti-Renom. + **Dynamic simulations of transcriptional control during cell reprogramming reveal spatial chromatin caging.** + *bioRxiv* 642009; `doi: https://doi.org/10.1101/642009`_ + + Methods implemented in TADdyn + ----------------------------- + In the actual implementation, TADdyn relies on TADbit for the preparation of the 3C-based datasets from mapping to normalization, + and on LAMMPS [Plimpton]_ for the implementation of the simulations. + + Bibliography + ************ + + .. [Plimpton] Plimpton, S. Fast Parallel Algorithms for Short-Range Molecular Dynamics. J Comp Phys 117, 1-19 (1995) and Fiorin, G., Klein, M.L. & Hénin, J. Using collective variables to drive molecular dynamics simulations. Molecular Physics 111, 3345-3362 (2013). + +Platform: OS Independent diff --git a/TADphys.egg-info/SOURCES.txt b/TADphys.egg-info/SOURCES.txt new file mode 100644 index 0000000..8e025c7 --- /dev/null +++ b/TADphys.egg-info/SOURCES.txt @@ -0,0 +1,29 @@ +README.rst +setup.py +TADphys.egg-info/PKG-INFO +TADphys.egg-info/SOURCES.txt +TADphys.egg-info/dependency_links.txt +TADphys.egg-info/top_level.txt +src/3d-lib/squared_distance_matrix_calculation_py.c +tadphys/Chromosome_region.py +tadphys/__init__.py +tadphys/_version.py +tadphys/chromosome.py +tadphys/experiment.py +tadphys/hic_data.py +tadphys/modelling/HIC_CONFIG.py +tadphys/modelling/LAMMPS_CONFIG.py +tadphys/modelling/__init__.py +tadphys/modelling/impoptimizer.py +tadphys/modelling/lammps_modelling.py +tadphys/modelling/lammpsmodel.py +tadphys/modelling/restraints.py +tadphys/modelling/structuralmodel.py +tadphys/utils/__init__.py +tadphys/utils/extraviews.py +tadphys/utils/hic_filtering.py +tadphys/utils/hic_parser.py +tadphys/utils/maths.py +tadphys/utils/modelAnalysis.py +tadphys/utils/tadmaths.py +test/test_TADdyn_on_Sox2.py \ No newline at end of file diff --git a/TADphys.egg-info/dependency_links.txt b/TADphys.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/TADphys.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/TADphys.egg-info/top_level.txt b/TADphys.egg-info/top_level.txt new file mode 100644 index 0000000..1599f3f --- /dev/null +++ b/TADphys.egg-info/top_level.txt @@ -0,0 +1 @@ +tadphys diff --git a/taddyn/Chromosome_region.py b/build/lib.linux-x86_64-3.6/tadphys/Chromosome_region.py similarity index 100% rename from taddyn/Chromosome_region.py rename to build/lib.linux-x86_64-3.6/tadphys/Chromosome_region.py diff --git a/build/lib.linux-x86_64-3.6/tadphys/__init__.py b/build/lib.linux-x86_64-3.6/tadphys/__init__.py new file mode 100644 index 0000000..e19de3e --- /dev/null +++ b/build/lib.linux-x86_64-3.6/tadphys/__init__.py @@ -0,0 +1,72 @@ +from future import standard_library +standard_library.install_aliases() +from os import environ +from subprocess import Popen, PIPE, check_call, CalledProcessError + +from tadphys._version import __version__ + +# ## Check if we have X display http://stackoverflow.com/questions/8257385/automatic-detection-of-display-availability-with-matplotlib +# if not "DISPLAY" in environ: +# import matplotlib +# matplotlib.use('Agg') +# else: +# try: +# check_call('python -c "import matplotlib.pyplot as plt; plt.figure()"', +# shell=True, stdout=PIPE, stderr=PIPE) +# except CalledProcessError: +# import matplotlib +# matplotlib.use('Agg') + +def get_dependencies_version(dico=False): + """ + Check versions of TADphys and all dependencies, as well and retrieves system + info. May be used to ensure reproducibility. + :returns: string with description of versions installed + """ + versions = {' TADphys': __version__ + '\n\n'} + + try: + import scipy + versions['scipy'] = scipy.__version__ + except ImportError: + versions['scipy'] = 'Not found' + + try: + import numpy + versions['numpy'] = numpy.__version__ + except ImportError: + versions['numpy'] = 'Not found' + try: + import matplotlib + versions['matplotlib'] = matplotlib.__version__ + except ImportError: + versions['matplotlib'] = 'Not found' + try: + mcl, _ = Popen(['mcl', '--version'], stdout=PIPE, + stderr=PIPE, universal_newlines=True).communicate() + versions['MCL'] = mcl.split()[1] + except: + versions['MCL'] = 'Not found' + + try: + uname, err = Popen(['uname', '-rom'], stdout=PIPE, + stderr=PIPE, universal_newlines=True).communicate() + versions[' Machine'] = uname + except: + versions[' Machine'] = 'Not found' + + if dico: + return versions + else: + return '\n'.join(['%15s : %s' % (k, versions[k]) for k in + sorted(versions.keys())]) + + +from tadphys.chromosome import Chromosome +from tadphys.experiment import Experiment, load_experiment_from_reads +from tadphys.chromosome import load_chromosome +# from taddyn.modelling.structuralmodels import StructuralModels +# from taddyn.modelling.structuralmodels import load_structuralmodels +# from taddyn.utils.hic_parser import load_hic_data_from_reads +# from taddyn.utils.hic_parser import load_hic_data_from_bam +from tadphys.utils.hic_parser import read_matrix diff --git a/taddyn/_version.py b/build/lib.linux-x86_64-3.6/tadphys/_version.py similarity index 100% rename from taddyn/_version.py rename to build/lib.linux-x86_64-3.6/tadphys/_version.py diff --git a/build/lib.linux-x86_64-3.6/tadphys/chromosome.py b/build/lib.linux-x86_64-3.6/tadphys/chromosome.py new file mode 100644 index 0000000..186fd28 --- /dev/null +++ b/build/lib.linux-x86_64-3.6/tadphys/chromosome.py @@ -0,0 +1,1009 @@ +""" +26 Nov 2012 + +""" + +from string import ascii_lowercase as letters +from copy import deepcopy as copy +from pickle import load, dump +from random import random +from math import sqrt +from sys import stderr +from os.path import exists +import tadphys +from tadphys.experiment import Experiment +# from tadphys.alignment import Alignment, randomization_test + +try: + import matplotlib.pyplot as plt +except ImportError: + stderr.write('matplotlib not found\n') + + +def load_chromosome(in_f, fast=2): + """ + Load a Chromosome object from a file. A Chromosome object can be saved with + the :func:`Chromosome.save_chromosome` function. + + :param in_f: path to a saved Chromosome object file + :param 2 fast: if fast=2 do not load the Hi-C data (in the case that they + were saved in a separate file see :func:`Chromosome.save_chromosome`). + If fast is equal to 1, the weights will be skipped from load to save + memory. Finally if fast=0, both the weights and Hi-C data will be loaded + + :returns: a Chromosome object + + TODO: remove first try/except type error... this is loading old experiments + """ + dico = load(open(in_f)) + name = '' + crm = Chromosome(dico['name']) + try: + exp_order = dico['experiment_order'] + except KeyError: + exp_order = dico['experiments'].keys() + for name in exp_order: + xpr = Experiment(name, dico['experiments'][name]['resolution'], + no_warn=True) + xpr.tads = dico['experiments'][name]['tads'] + xpr.norm = dico['experiments'][name]['wght'] + xpr.hic_data = dico['experiments'][name]['hi-c'] + xpr.conditions = dico['experiments'][name]['cond'] + xpr.size = dico['experiments'][name]['size'] + xpr._zeros = dico['experiments'][name].get('zero', {}) + try: # new in version post-CSDM13 + xpr.identifier = dico['experiments'][name]['iden'] + xpr.cell_type = dico['experiments'][name]['cell'] + xpr.exp_type = dico['experiments'][name]['expt'] + xpr.enzyme = dico['experiments'][name]['enzy'] + xpr.description = dico['experiments'][name]['desc'] + except KeyError: + xpr.identifier = None + xpr.cell_type = None + xpr.exp_type = None + xpr.enzyme = None + xpr.description = {} + try: + crm.experiments.append(xpr) + except TypeError: + continue + crm.size = dico['size'] + crm.r_size = dico['r_size'] + crm.max_tad_size = dico['max_tad_size'] + crm.forbidden = dico['forbidden'] + crm._centromere = dico['_centromere'] + try: # new in version post-CSDM13 + crm.species = dico['species'] + crm.assembly = dico['assembly'] + crm.description = dico['description'] + except KeyError: + crm.species = None + crm.assembly = None + crm.description = {} + if isinstance(dico['experiments'][name]['hi-c'], str) or fast != int(2): + try: + dicp = load(open(in_f + '_hic')) + for name in dico['experiments']: + crm.get_experiment(name).hic_data = dicp[name]['hi-c'] + if fast != 1: + crm.get_experiment(name).norm = dicp[name]['wght'] + except IOError: + try: + for name in dico['experiments']: + crm.get_experiment(name).hic_data = dico['experiments'][name]['hi-c'] + if fast != 1: + crm.get_experiment(name).norm = dico['experiments'][name]['wght'] + except KeyError: + raise Exception('ERROR: file %s not found\n' % ( + dico['experiments'][name]['hi-c'])) + elif not fast: + stderr.write('WARNING: data not saved correctly for fast loading.\n') + return crm + + +class Chromosome(object): + """ + A Chromosome object designed to deal with Topologically Associating Domains + predictions from different experiments, in different cell types for a given + chromosome of DNA, and to compare them. + + :param name: name of the chromosome (might be a chromosome name for example) + :param None species: species name + :param None assembly: version number of the genomic assembly used + :param None resolutions: list of resolutions corresponding to a list of + experiments passed. + :param None experiment_hic_data: :py:func:`list` of paths to files + containing the Hi-C count matrices corresponding to different experiments + :param None experiment_tads: :py:func:`list` of paths to files + containing the definition of TADs corresponding to different experiments + :param None experiment_names: :py:func:`list` of the names of each + experiment + :param infinite max_tad_size: maximum TAD size allowed. TADs longer than + this value will not be considered, and size of the corresponding + chromosome size will be reduced accordingly + :param 0 chr_len: size of the DNA chromosome in bp. By default it will be + inferred from the distribution of TADs + :param None parser: a parser function that returns a tuple of lists + representing the data matrix and the length of a row/column. With + the file example.tsv: + + :: + + chrT_001 chrT_002 chrT_003 chrT_004 + chrT_001 629 164 88 105 + chrT_002 164 612 175 110 + chrT_003 88 175 437 100 + chrT_004 105 110 100 278 + + the output of parser('example.tsv') would be be: + ``[([629, 164, 88, 105, 164, 612, 175, 110, 88, 175, 437, 100, 105, + 110, 100, 278]), 4]`` + :param None kw_descr: any other argument passed would be stored as + complementary descriptive field. For example:: + + crm = Chromosome('19', species='mus musculus', + subspecies='musculus musculus', + skin_color='black') + print crm + + # Chromosome 19: + # 0 experiment loaded: + # 0 alignment loaded: + # species : mus musculus + # assembly version: UNKNOWN + # subspecies : musculus musculus + # skin_color : black + + *note that these fields may appear in the header of generated out files* + + :return: Chromosome object + + + """ + def __init__(self, name, species=None, assembly=None, + experiment_resolutions=None, experiment_tads=None, + experiment_hic_data=None, experiment_norm_data=None, + experiment_names=None, max_tad_size=float('inf'), + chr_len=0, parser=None, centromere_search=False, + silent=False, **kw_descr): + self.name = name + self.size = self._given_size = self.r_size = chr_len + self.size = ChromosomeSize(self.size) + self.max_tad_size = max_tad_size + self.r_size = RelativeChromosomeSize(self.size) + self.forbidden = {} # only used for TAD alignment randomization + self.experiments = ExperimentList([], self) + self._centromere = None + self.alignment = AlignmentDict() + self.description = kw_descr + self.species = species + self.assembly = assembly + + self._search_centromere = centromere_search + if experiment_tads: + for i, handler in enumerate(experiment_tads or []): + name = experiment_names[i] if experiment_names else None + self.add_experiment(name, experiment_resolutions[i], + tad_def=handler, parser=parser) + if experiment_hic_data: + for i, handler in enumerate(experiment_hic_data or []): + name = experiment_names[i] if experiment_names else None + try: + xpr = self.get_experiment(name) + xpr.load_hic_data(handler, silent=silent) + continue + except: + pass + if isinstance(handler, Experiment): + handler.name = name or handler.name + self.experiments.append(handler) + else: + self.add_experiment(name, experiment_resolutions[i], + hic_data=handler, parser=parser, + silent=silent) + if experiment_norm_data: + for i, handler in enumerate(experiment_norm_data or []): + name = experiment_names[i] if experiment_names else None + try: + xpr = self.get_experiment(name) + xpr.load_norm_data(handler, silent=silent) + continue + except: + pass + if isinstance(handler, Experiment): + handler.name = name or handler.name + self.experiments.append(handler) + else: + self.add_experiment(name, experiment_resolutions[i], + norm_data=handler, parser=parser, + silent=silent) + + def __repr__(self): + outstr = 'Chromosome %s:\n' % self.name + outstr += (' %-2s experiment%s loaded: ' % ( + len(self.experiments), 's' * (len(self.experiments) > 0)) + + ', '.join([e.name for e in self.experiments]) + '\n') + outstr += (' %-2s alignment%s loaded: ' % ( + len(self.alignment), 's' * (len(self.alignment) > 0)) + + ', '.join([a.name for a in self.alignment]) + '\n') + try: # new in version post-CSDM13 + outstr += ' species : %s\n' % (self.species or 'UNKNOWN') + outstr += ' assembly version: %s\n' % (self.assembly or 'UNKNOWN') + for desc in self.description: + outstr += ' %-16s: %s\n' % (desc, self.description[desc]) + except AttributeError: + pass + return outstr + + + def _get_forbidden_region(self, xpr, resized=False): + """ + Find the regions for which there is no information in any of the + experiments. This is used to infer the relative chromosome size. + """ + if not xpr.tads: + return + forbidden = [] + for pos in xpr.tads: + start = float(xpr.tads[pos]['start']) + end = float(xpr.tads[pos]['end']) + diff = end - start + if diff * xpr.resolution > self.max_tad_size: + forbidden += range(int(start), int(end+1)) + xpr.tads[pos]['score'] = -abs(xpr.tads[pos]['score']) + else: + xpr.tads[pos]['score'] = abs(xpr.tads[pos]['score']) + if not self.forbidden: + self.forbidden = dict([(f, None) for f in forbidden]) + else: + self.forbidden = dict([(f, None) for f in + set(forbidden).intersection(self.forbidden)]) + # search for centromere: + if self._search_centromere: + self._find_centromere(xpr) + # add centromere as forbidden region: + if self._centromere: + for pos in xrange(int(self._centromere[0]), + int(self._centromere[1])): + self.forbidden[pos] = 'Centromere' + if not resized: + self.__update_size(xpr) + + + def get_experiment(self, name): + """ + Fetch an Experiment according to its name. + This can also be done directly with Chromosome.experiments[name]. + + :param name: name of the experiment to select + :returns: :class:`tadphys.Experiment` + """ + for exp in self.experiments: + if exp.name == name: + return exp + raise Exception(('ERROR: experiment ' + + '%s not found\n') % (name)) + + + def save_chromosome(self, out_f, fast=True, divide=True, force=False): + """ + Save a Chromosome object to a file (it uses :py:func:`pickle.load` from + the :py:mod:`cPickle`). Once saved, the object can be loaded with + :func:`load_chromosome`. + + :param out_f: path to the file where to store the :py:mod:`cPickle` + object + :param True fast: if True, skip Hi-C data and weights + :param True divide: if True writes two pickles, one with what would + result by using the fast option, and the second with the Hi-C and + weights data. The second file name will be extended by '_hic' (ie: + with out_f='chromosome12.pik' we would obtain chromosome12.pik and + chromosome12.pik_hic). When loaded :func:`load_chromosome` will + automatically search for both files + :param False force: overwrite the existing file + + """ + while exists(out_f) and not force: + out_f += '_' + dico = {'experiments': {}, + 'experiment_order': [xpr.name for xpr in self.experiments]} + if divide: + dicp = {} + for xpr in self.experiments: + dico['experiments'][xpr.name] = { + 'size' : xpr.size, + 'cond' : xpr.conditions, + 'tads' : xpr.tads, + 'resolution': xpr.resolution, + 'hi-c' : None, + 'wght' : None, + 'iden' : xpr.identifier, + 'cell' : xpr.cell_type, + 'expt' : xpr.exp_type, + 'enzy' : xpr.enzyme, + 'desc' : xpr.description, + 'zero' : xpr._zeros + } + if fast: + continue + if divide: + dicp[xpr.name] = { + 'wght': xpr.norm, + 'hi-c': xpr.hic_data} + dico['experiments'][xpr.name]['wght'] = None + dico['experiments'][xpr.name]['hi-c'] = None + else: + dico['experiments'][xpr.name]['wght'] = xpr.norm + dico['experiments'][xpr.name]['hi-c'] = xpr.hic_data + dico['name'] = self.name + dico['size'] = self.size + dico['r_size'] = self.r_size + dico['max_tad_size'] = self.max_tad_size + dico['forbidden'] = self.forbidden + dico['_centromere'] = self._centromere + dico['species'] = self.species + dico['assembly'] = self.assembly + dico['description'] = self.description + out = open(out_f, 'w') + dump(dico, out) + out.close() + if not fast and divide: + out = open(out_f + '_hic', 'w') + dump(dicp, out) + out.close() + + # def align_experiments(self, names=None, verbose=False, randomize=False, + # rnd_method='interpolate', rnd_num=1000, + # get_score=False, **kwargs): + # """ + # Align the predicted boundaries of two different experiments. The + # resulting alignment will be stored in the self.experiment list. + + # :param None names: list of names of the experiments to align. If None, + # align all + # :param experiment1: name of the first experiment to align + # :param experiment2: name of the second experiment to align + # :param -0.1 penalty: penalty for inserting a gap in the alignment + # :param 100000 max_dist: maximum distance between two boundaries + # allowing match (100Kb seems fair with HUMAN chromosomes) + # :param False verbose: if True, print some information about the + # alignments + # :param False randomize: check the alignment quality by comparing + # randomized boundaries over Chromosomes of the same size. This will + # return a extra value, the p-value of accepting that the observed + # alignment is not better than a random alignment + # :param False get_score: returns alignemnt object, alignment score and + # percentage of identity from one side and from the other + # :param interpolate rnd_method: by default uses the interpolation of TAD + # distribution. The alternative method is 'shuffle', where TADs are + # simply shuffled + # :param 1000 rnd_num: number of randomizations to do + # :param reciprocal method: if global, Needleman-Wunsch is used to align + # (see :func:`tadphys.boundary_aligner.globally.needleman_wunsch`); + # if reciprocal, a method based on reciprocal closest boundaries is + # used (see :func:`tadphys.boundary_aligner.reciprocally.reciprocal`) + + # :returns: an alignment object or, if the randomizattion was invoked, + # an alignment object, and a list of statistics that are, the alignment + # score, the probability that observed alignment performs better than + # randoms, the proportion of borders from the first experiment found + # aligned in the second experiment and the proportion of borders from + # the second experiment found aligned in the first experiment. + # Returned calues can be catched like this: + + # ali = crm.align_experiments() + + # or, with randomization test: + + # ali, (score, pval, prop1, prop2) = crm.align_experiments(randomize=True) + + # """ + # if names: + # xpers = ExperimentList([self.get_experiment(n) for n in names], + # self) + # else: + # xpers = self.experiments + # tads = [] + # for xpr in xpers: + # if not xpr.tads: + # raise Exception('No TADs defined, use find_tad function.\n') + # tads.append([xpr.tads[x]['brk'] * xpr.resolution for x in xpr.tads + # if xpr.tads[x]['score'] >= 0]) + # (aligneds, score, perc1, perc2), consensus = align(tads, verbose=verbose, **kwargs) + # name = tuple(sorted([x.name for x in xpers])) + # ali = Alignment(name, aligneds, xpers, consensus, score=score) + # self.alignment[name] = ali + # if verbose: + # print self.alignment[name] + # if not randomize: + # if get_score: + # return ali, score, perc1, perc2 + # else: + # return ali + # p_value = randomization_test(xpers, score=score, rnd_method=rnd_method, + # verbose=verbose, r_size=self.r_size, + # num=rnd_num, **kwargs) + # return ali, (score, p_value, perc1, perc2) + + + def add_experiment(self, name, resolution=None, tad_def=None, hic_data=None, + norm_data=None, replace=False, parser=None, + conditions=None, **kwargs): + """ + Add a Hi-C experiment to Chromosome + + :param name: name of the experiment or of the Experiment object + :param resolution: resolution of the experiment (needed if name is not + an Experiment object) + :param None hic_data: whether a file or a list of lists corresponding to + the Hi-C data + :param None tad_def: a file or a dict with precomputed TADs for this + experiment + :param False replace: overwrite the experiments loaded under the same + name + :param None parser: a parser function that returns a tuple of lists + representing the data matrix and the length of a row/column. With + a file example.tsv containing: + + :: + + chrT_001 chrT_002 chrT_003 chrT_004 + chrT_001 629 164 88 105 + chrT_002 164 612 175 110 + chrT_003 88 175 437 100 + chrT_004 105 110 100 278 + + the output of parser('example.tsv') would be: + ``[([629, 164, 88, 105, 164, 612, 175, 110, 88, 175, 437, 100, 105, + 110, 100, 278]), 4]`` + + """ + if not name: + name = ''.join([letters[int(random() * len(letters))] \ + for _ in xrange(5)]) + stderr.write('WARNING: No name provided, random name ' + + 'generated: %s\n' % (name)) + if name in self.experiments: + if 'hi-c' in self.get_experiment(name) and not replace: + stderr.write( + '''WARNING: Hi-C data already loaded under the name: %s. + This experiment will be kept under %s.\n''' % (name, + name + '_')) + name += '_' + if isinstance(name, Experiment): + self.experiments.append(name) + elif resolution: + self.experiments.append(Experiment( + name, resolution, hic_data=hic_data, norm_data=norm_data, + tad_def=tad_def, parser=parser, conditions=conditions, + **kwargs)) + else: + raise Exception('resolution param is needed\n') + + + # def find_tad(self, experiments, name=None, n_cpus=1, + # verbose=True, max_tad_size="max", heuristic=True, + # batch_mode=False, **kwargs): + # """ + # Call the :func:`tadphys.tadbit.tadbit` function to calculate the + # position of Topologically Associated Domain boundaries + + # :param experiment: A square matrix of interaction counts of Hi-C + # data or a list of such matrices for replicated experiments. The + # counts must be evenly sampled and not normalized. 'experiment' + # can be either a list of lists, a path to a file or a file handler + # :param True normalized: if False simple normalization will be computed, + # as well as a simple column filtering will be applied (remove columns + # where value at the diagonal is null) + # :param 1 n_cpus: The number of CPUs to allocate to TADbit. If + # n_cpus='max' the total number of CPUs will be used + # :param max max_tad_size: an integer defining the maximum size of a + # TAD. Default (auto) defines it as the number of rows/columns + # :param True heuristic: whether to use or not some heuristics + # :param False batch_mode: if True, all the experiments will be + # concatenated into one for the search of TADs. The resulting TADs + # found are stored under the name 'batch' plus a concatenation of the + # experiment names passed (e.g.: if experiments=['exp1', 'exp2'], the + # name would be: 'batch_exp1_exp2'). + + # """ + # experiments = experiments or self.experiments + # if not isinstance(experiments, list): + # experiments = [experiments] + # xprs = [] + # for xpr in experiments: + # if not isinstance(xpr, Experiment): + # xpr = self.get_experiment(xpr) + # xprs.append(xpr) + # # if normalized and (not xpr._zeros or not xpr._normalization): + # # raise Exception('ERROR: Experiments should be normalized, and' + + # # ' filtered first') + # if len(xprs) <= 1 and batch_mode: + # raise Exception('ERROR: batch_mode implies that more than one ' + + # 'experiment is passed') + # if batch_mode: + # matrix = [] + # if not name: + # name = 'batch' + # resolution = xprs[0].resolution + # for xpr in sorted(xprs, key=lambda x: x.name): + # if xpr.resolution != resolution: + # raise Exception('All Experiments must have the same ' + + # 'resolution\n') + # matrix.append(xpr.hic_data[0]) + # if name.startswith('batch'): + # name += '_' + xpr.name + # siz = xprs[0].size + # tmp = reduce(lambda x, y: x.__add__(y, silent=True), xprs) + # tmp.filter_columns(silent=kwargs.get('silent', False)) + # remove = tuple([1 if i in tmp._zeros else 0 + # for i in xrange(siz)]) + # result = tadbit(matrix, + # remove=remove, + # n_cpus=n_cpus, verbose=verbose, + # max_tad_size=max_tad_size, + # no_heuristic=not heuristic, **kwargs) + # xpr = Experiment(name, resolution, hic_data=matrix, + # tad_def=result, **kwargs) + # xpr._zeros = xprs[0]._zeros + # for other in xprs[1:]: + # xpr._zeros = dict([(k, None) for k in + # set(xpr._zeros.keys()).intersection( + # other._zeros.keys())]) + # self.add_experiment(xpr) + # return + # for xpr in xprs: + # result = tadbit( + # xpr.hic_data, + # remove=tuple([1 if i in xpr._zeros else 0 for i in + # xrange(xpr.size)]), + # n_cpus=n_cpus, verbose=verbose, + # max_tad_size=max_tad_size, + # no_heuristic=not heuristic, **kwargs) + # xpr.load_tad_def(result) + # self._get_forbidden_region(xpr) + + def __update_size(self, xpr): + """ + Update the chromosome size and relative size after loading new Hi-C + experiments, unless the Chromosome size was defined by hand. + + """ + if not self._given_size: + self.size = max(xpr.tads[max(xpr.tads)]['end'] * xpr.resolution, + self.size) + self.size = ChromosomeSize(self.size) + self._get_forbidden_region(xpr, resized=True) + + self.r_size = self.size - len(self.forbidden) * xpr.resolution + self.r_size = RelativeChromosomeSize(self.size) + + + # def tad_density_plot(self, name, axe=None, focus=None, extras=None, + # normalized=True, savefig=None, shape='ellipse'): + # """ + # Draw an summary of the TAD found in a given experiment and their density + # in terms of relative Hi-C interaction count. + + # :param name: name of the experiment to visualize + # :param None focus: can pass a tuple (bin_start, bin_stop) to display the + # alignment between these genomic bins + # :param None extras: list of coordinates (genomic bin) where to draw a + # red cross + # :param None ymax: limit the y axis up to a given value + # :param ('grey', ): successive colors for alignment + # :param True normalized: normalized Hi-C count are plotted instead of raw + # data. + # :param 'ellipse' shape: which kind of shape to use as schematic + # representation of TADs. Implemented: 'ellipse', 'rectangle', + # 'triangle' + # :param None savefig: path to a file where to save the image generated; + # if None, the image will be shown using matplotlib GUI (the extension + # of the file name will determine the desired format). + # """ + # if not self.experiments[name].tads: + # raise Exception("TAD borders not found\n") + # _tad_density_plot(self.experiments[name], axe=axe, focus=focus, + # extras=extras, normalized=normalized, + # savefig=savefig, shape=shape) + + + # def visualize(self, names=None, tad=None, focus=None, paint_tads=False, + # axe=None, show=True, logarithm=True, normalized=False, + # relative=True, decorate=True, savefig=None, clim=None, + # scale=(8, 6), cmap='jet'): + # """ + # Visualize the matrix of Hi-C interactions of a given experiment + + # :param None names: name of the experiment to visualize, or list of + # experiment names. If None, all experiments will be shown + # :param None tad: a given TAD in the form: + # :: + + # {'start': start, + # 'end' : end, + # 'brk' : end, + # 'score': score} + + # **Alternatively** a list of the TADs can be passed (all the TADs + # between the first and last one passed will be showed. Thus, passing + # more than two TADs might be superfluous) + # :param None focus: a tuple with the start and end positions of the + # region to visualize + # :param False paint_tads: draw a box around the TADs defined for this + # experiment + # :param None axe: an axe object from matplotlib can be passed in order + # to customize the picture + # :param True show: either to pop-up matplotlib image or not + # :param True logarithm: show the logarithm values + # :param True normalized: show the normalized data (weights might have + # been calculated previously). *Note: white rows/columns may appear in + # the matrix displayed; these rows correspond to filtered rows (see* + # :func:`tadphys.utils.hic_filtering.hic_filtering_for_modelling` *)* + # :param True relative: color scale is relative to the whole matrix of + # data, not only to the region displayed + # :param True decorate: draws color bar, title and axes labels + # :param None savefig: path to a file where to save the image generated; + # if None, the image will be shown using matplotlib GUI (the extension + # of the file name will determine the desired format). + # :param None clim: tuple with minimum and maximum value range for color + # scale. I.e. clim=(-4, 10) + # :param 'jet' cmap: color map from matplotlib. Can also be a + # preconfigured cmap object. + # """ + # if names == None: + # names = [xpr.name for xpr in self.experiments] + # if not isinstance(names, list) and not isinstance(names, tuple): + # names = [names] + # cols = 1 + # rows = 1 + # else: + # sqrtxpr = sqrt(len(names)) + # cols = int(round(sqrtxpr + (0.0 if int(sqrtxpr)==sqrtxpr else .5))) + # rows = int(sqrtxpr+.5) + # notaxe = axe == None + # if not scale: + # scale = (8, 6) + # if notaxe and len(names) != 1: + # fig = plt.figure(figsize=(scale[0] * cols, scale[1] * rows)) + # for i in xrange(rows): + # for j in xrange(cols): + # if i * cols + j >= len(names): + # break + # if notaxe and len(names) != 1: + # axe = fig.add_subplot( + # rows, cols, i * cols + j + 1) + # if (isinstance(names[i * cols + j], tuple) or + # isinstance(names[i * cols + j], list)): + # if not axe: + # fig = plt.figure(figsize=(scale[0] * cols, scale[1] * rows)) + # axe = fig.add_subplot( + # rows, cols, i * cols + j + 1) + # xpr1 = self.get_experiment(names[i * cols + j][0]) + # xpr2 = self.get_experiment(names[i * cols + j][1]) + # img = xpr1.view(tad=tad, focus=focus, paint_tads=paint_tads, + # axe=axe, show=False, logarithm=logarithm, + # normalized=normalized, relative=relative, + # decorate=decorate, savefig=False, + # where='up', clim=clim, cmap=cmap) + # img = xpr2.view(tad=tad, focus=focus, paint_tads=paint_tads, + # axe=axe, show=False, logarithm=logarithm, + # normalized=normalized, relative=relative, + # decorate=False, savefig=False, where='down', + # clim=clim or img.get_clim(), cmap=cmap) + # #axe = axe.twinx() + # #axe.set_aspect('equal',adjustable='box-forced',anchor='NE') + # if decorate: + # plt.text(1.01, .5, + # 'Chromosome %s experiment %s' % ( + # self.name, xpr2.name), + # rotation=-90, va='center', size='large', + # ha='left', transform=axe.transAxes) + # else: + # xper = self.get_experiment(names[i * cols + j]) + # if not xper.hic_data and not xper.norm: + # continue + # xper.view(tad=tad, focus=focus, paint_tads=paint_tads, + # axe=axe, show=False, logarithm=logarithm, + # normalized=normalized, relative=relative, + # decorate=decorate, savefig=False, clim=clim, + # cmap=cmap) + # if savefig: + # tadbit_savefig(savefig) + # if show: + # plt.show() + + + # def get_tad_hic(self, tad, x_name, normed=True, matrix_num=0): + # """ + # Retrieve the Hi-C data matrix corresponding to a given TAD. + + # :param tad: a given TAD (:py:class:`dict`) + # :param x_name: name of the experiment + # :param True normed: if True, normalize the Hi-C data + + # :returns: Hi-C data matrix for the given TAD + # """ + # beg, end = int(tad['start']), int(tad['end']) + # xpr = self.get_experiment(x_name) + # size = xpr.size + # matrix = [[0 for _ in xrange(beg, end)]\ + # for _ in xrange(beg, end)] + # for i, tadi in enumerate(xrange(beg, end)): + # tadi = tadi * size + # for j, tadj in enumerate(xrange(beg, end)): + # if normed: + # matrix[j][i] = xpr.norm[0][tadi + tadj] + # else: + # matrix[j][i] = xpr.hic_data[matrix_num][tadi + tadj] + # return matrix + + + # def iter_tads(self, x_name, normed=True): + # """ + # Iterate over the TADs corresponding to a given experiment. + + # :param x_name: name of the experiment + # :param True normed: normalize Hi-C data returned + + # :yields: Hi-C data corresponding to each TAD + # """ + # if not self.get_experiment(x_name).hic_data: + # raise Exception('No Hi-c data for %s experiment\n' % (x_name)) + # for name, ref in self.get_experiment(x_name).tads.iteritems(): + # yield name, self.get_tad_hic(ref, x_name, normed=normed) + + + # def set_max_tad_size(self, value): + # """ + # Change the maximum size allowed for TADs. It also applies to the + # computed experiments. + + # :param value: an int value (default is 5000000) + # """ + # self.max_tad_size = value + # for xpr in self.experiments: + # for tad in xpr.tads: + # xpr.tads[tad]['brk'] = xpr.tads[tad]['end'] + # if ((xpr.tads[tad]['end'] - xpr.tads[tad]['start']) + # * xpr.resolution) > self.max_tad_size: + # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) + + + # def _find_centromere(self, xpr): + # """ + # Search for the centromere in a chromosome, assuming that + # :class:`Chromosome` corresponds to a real chromosome. + # Add a boundary to all the experiments where the centromere is. + # * A centromere is defined as the largest area where the rows/columns + # of the Hi-C matrix are empty. + # """ + # beg = end = 0 + # size = xpr.size + # try: + # hic = xpr.hic_data[0] + # except TypeError: + # return + # # search for largest empty region of the chromosome + # best = (0, 0, 0) + # pos = 0 + # for pos, raw in enumerate(xrange(0, size * size, size)): + # if sum([hic[i] for i in xrange(raw, raw + size)]) == 0 and not beg: + # beg = float(pos) + # if sum([hic[i] for i in xrange(raw, raw + size)]) != 0 and beg: + # end = float(pos) + # if (end - beg) > best[0]: + # best = ((end - beg), beg, end) + # beg = end = 0 + # # this is for weared cases where centromere is at the end of Hi-C data + # if beg and not end: + # end = float(pos) + # if (end - beg) > best[0]: + # best = ((end - beg), beg, end) + # beg, end = best[1:] + # if not beg or not end: + # return + # tads = xpr.tads + # # if we already have a centromere defined, check if it can be reduced + # if self._centromere: + # if beg > self._centromere[0]: + # # readjust TADs that have been split around the centromere + # for tad in tads: + # if tads[tad]['end'] == self._centromere[0]: + # tads[tad]['end'] = beg + # self._centromere[0] = beg + # if end < self._centromere[1]: + # # readjust TADs that have been split around the centromere + # for tad in tads: + # if tads[tad]['start'] == self._centromere[1]: + # tads[tad]['start'] = end + # self._centromere[1] = end + # else: + # self._centromere = [beg, end] + # # split TADs overlapping with the centromere + # if [True for t in tads.values() \ + # if t['start'] < beg < t['end'] \ + # and t['start'] < end < t['end']]: + # tad = len(tads) + 1 + # plus = 0 + # while tad + plus > 1: + # start = tads[tad - 1 + plus]['start'] + # final = tads[tad - 1 + plus]['end'] + # # centromere found? + # if start < beg < final and start < end < final: + # tads[tad] = copy(tads[tad - 1]) + # tads[tad]['start'] = end + # tads[tad]['score'] = abs(tads[tad]['score']) + # if (tads[tad]['end'] - tads[tad]['start']) \ + # * xpr.resolution > self.max_tad_size: + # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) + # tads[tad]['brk'] = tads[tad]['end'] + # tad -= 1 + # tads[tad] = copy(tads[tad]) + # tads[tad]['score'] = abs(tads[tad]['score']) + # tads[tad]['end'] = beg + # if (tads[tad]['end'] - tads[tad]['start']) \ + # * xpr.resolution > self.max_tad_size: + # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) + # tads[tad]['brk'] = tads[tad]['end'] + # plus = 1 + # else: + # tads[tad] = copy(tads[tad - 1 + plus]) + # tad -= 1 + # # if tad includes centromere but starts in the same point + # elif [True for t in tads.values() \ + # if t['start'] == beg and end < t['end']]: + # tad = len(tads) + 1 + # while tad > 1: + # start = tads[tad - 1]['start'] + # final = tads[tad - 1]['end'] + # # centromere found? + # if start == beg: + # tads[tad] = copy(tads[tad - 1]) + # tads[tad]['start'] = end + # tads[tad]['score'] = abs(tads[tad]['score']) + # if (tads[tad]['end'] - tads[tad]['start']) \ + # * xpr.resolution > self.max_tad_size: + # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) + # else: + # tads[tad] = copy(tads[tad - 1]) + # tad -= 1 + # # if tad includes centromere but ends in the same point + # elif [True for t in tads.values() \ + # if t['end'] == end and beg > t['start']]: + # tad = len(tads) + 1 + # plus = 0 + # while tad + plus > 1: + # start = tads[tad - 1 + plus]['start'] + # final = tads[tad - 1 + plus]['end'] + # # centromere found? + # if final == end: + # tads[tad] = copy(tads[tad - 1]) + # tads[tad]['start'] = beg + # tads[tad]['score'] = abs(tads[tad]['score']) + # if (tads[tad]['end'] - tads[tad]['start']) \ + # * xpr.resolution > self.max_tad_size: + # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) + # tads[tad]['brk'] = tads[tad]['end'] + # tad -= 1 + # tads[tad] = copy(tads[tad]) + # tads[tad]['score'] = abs(tads[tad]['score']) + # tads[tad]['end'] = beg + # if (tads[tad]['end'] - tads[tad]['start']) \ + # * xpr.resolution > self.max_tad_size: + # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) + # tads[tad]['brk'] = tads[tad]['end'] + # plus = 1 + # else: + # tads[tad] = copy(tads[tad - 1 + plus]) + # tad -= 1 + + + +class ExperimentList(list): + """ + Inherited from python built in :py:func:`list`, modified for TADbit + :class:`tadphys.Experiment`. + + Mainly, `getitem`, `setitem`, and `append` were modified in order to + be able to search for experiments by index or by name, and to add + experiments simply using Chromosome.experiments.append(Experiment). + + The whole ExperimentList object is linked to a Chromosome instance + (:class:`tadphys.Chromosome`). + + """ + def __init__(self, thing, crm): + super(ExperimentList, self).__init__(thing) + self.crm = crm + + + def __getitem__(self, i): + try: + return super(ExperimentList, self).__getitem__(i) + except TypeError: + for nam in self: + if nam.name == i: + return nam + raise KeyError('Experiment %s not found\n' % (i)) + + + def __setitem__(self, i, exp): + try: + super(ExperimentList, self).__setitem__(i, exp) + exp.crm = self.crm + self.crm._get_forbidden_region(exp) + except TypeError: + for j, nam in enumerate(self): + if nam.name == i: + exp.crm = self.crm + self[j] = exp + self.crm._get_forbidden_region(exp) + break + else: + exp.crm = self.crm + self.append(exp) + self.crm._get_forbidden_region(exp) + + + def __delitem__(self, i): + try: + super(ExperimentList, self).__delitem__(i) + except TypeError: + for j, nam in enumerate(self): + if nam.name == i: + exp = self.pop(j) + del(exp) + break + else: + raise KeyError('Experiment %s not found\n' % (i)) + + + def append(self, exp): + if exp.name in [e.name for e in self]: + self[exp.name] = exp + self.crm._get_forbidden_region(exp) + else: + super(ExperimentList, self).append(exp) + self.crm._get_forbidden_region(exp) + exp.crm = self.crm + + +class AlignmentDict(dict): + """ + :py:func:`dict` of :class:`tadphys.Alignment` + + Modified getitem, setitem, and append in order to be able to search + alignments by index or by name. + + linked to a :class:`tadphys.Chromosome` + """ + + def __getitem__(self, nam): + try: + return super(AlignmentDict, self).__getitem__(tuple(sorted(nam))) + except KeyError: + for i, key in enumerate(self): + if nam == i: + return self[key] + raise TypeError('Alignment %s not found\n' % i) + + +class ChromosomeSize(int): + """ + Simple class inheriting from integer designed to hold chromosome size in + base pairs + """ + def __init__(self, thing): + super(ChromosomeSize, self).__init__(thing) + + +class RelativeChromosomeSize(int): + """ + Relative Chromosome size in base pairs. Equal to Chromosome size minus + forbidden regions (eg: the centromere) + + Only used for TAD alignment randomization. + """ + def __init__(self, thing): + super(RelativeChromosomeSize, self).__init__(thing) diff --git a/build/lib.linux-x86_64-3.6/tadphys/experiment.py b/build/lib.linux-x86_64-3.6/tadphys/experiment.py new file mode 100644 index 0000000..0f81f4a --- /dev/null +++ b/build/lib.linux-x86_64-3.6/tadphys/experiment.py @@ -0,0 +1,1749 @@ +""" +20 Feb 2013 + + +""" + +from copy import deepcopy as copy +from sys import stderr +from warnings import warn +from math import isnan +from numpy import log2, array +#from tadphys import HiC_data +from tadphys.modelling.HIC_CONFIG import CONFIG +from tadphys.utils.hic_parser import read_matrix +from tadphys.utils.extraviews import nicer +from tadphys.utils.tadmaths import zscore, nozero_log_matrix +from tadphys.utils.hic_filtering import hic_filtering_for_modelling +# from tadphys.modelling.structuralmodels import StructuralModels +from collections import OrderedDict + +try: + from tadphys.modelling.impoptimizer import IMPoptimizer + # from tadphys.modelling.imp_modelling import generate_3d_models + from tadphys.modelling.lammps_modelling import generate_lammps_models +except ImportError: + stderr.write('IMP not found, check PYTHONPATH\n') + +try: + import matplotlib.pyplot as plt + from matplotlib.cm import jet +except ImportError: + stderr.write('matplotlib not found\n') + + +def load_experiment_from_reads(name, fnam, genome_seq, resolution, + conditions=None, identifier=None, cell_type=None, + enzyme=None, exp_type='Hi-C', **kw_descr): + """ + Loads an experiment object from TADbit-generated read files, that are lists + of pairs of reads mapped to a reference genome. + + :param fnam: tsv file with reads1 and reads2 + :param name: name of the experiment + :param resolution: the resolution of the experiment (size of a bin in + bases) + :param None identifier: some identifier relative to the Hi-C data + :param None cell_type: cell type on which the experiment was done + :param None enzyme: restriction enzyme used in the Hi-C experiment + :param Hi-C exp_type: name of the experiment used (currently only Hi-C is + supported) + :param None conditions: :py:func:`list` of experimental conditions, e.g. + the cell type, the enzyme... (i.e.: ['HindIII', 'cortex', 'treatment']). + This parameter may be used to compare the effect of this conditions on + the TADs + :param None kw_descr: any other argument passed would be stored as + complementary descriptive field. For example:: + + exp = Experiment('k562_rep2', resolution=100000, + identifier='SRX015263', cell_type='K562', + enzyme='HindIII', cylce='synchronized') + print exp + + # Experiment k562_rep2: + # resolution : 100Kb + # TADs : None + # Hi-C rows : None + # normalized : None + # identifier : SRX015263 + # cell type : K562 + # restriction enzyme: HindIII + # cylce : synchronized + + *note that these fields may appear in the header of generated out files* + """ + size = 0 + section_sizes = {} + sections = [] + for crm in genome_seq: + len_crm = int(float(len(genome_seq[crm])) / resolution + 1) + section_sizes[(crm,)] = len_crm + size += len_crm + 1 + sections.extend([(crm, '%04d' % i) for i in xrange(len_crm + 1)]) + imx = HiC_data((), size) + dict_sec = dict([(j, i) for i, j in enumerate(sections)]) + for line in open(fnam): + _, cr1, ps1, _, _, _, _, cr2, ps2, _ = line.split('\t', 9) + ps1 = dict_sec[(cr1, '%04d' % (int(ps1) / resolution))] + ps2 = dict_sec[(cr2, '%04d' % (int(ps2) / resolution))] + imx[ps1 + ps2 * size] += 1 + imx[ps2 + ps1 * size] += 1 + + return Experiment(name, resolution=resolution, hic_data=imx, + conditions=conditions, identifier=identifier, + cell_type=cell_type, enzyme=enzyme, exp_type=exp_type, + **kw_descr) + +class Experiment(object): + """ + Hi-C experiment. + + :param name: name of the experiment + :param resolution: the resolution of the experiment (size of a bin in + bases) + :param None identifier: some identifier relative to the Hi-C data + :param None cell_type: cell type on which the experiment was done + :param None enzyme: restriction enzyme used in the Hi-C experiment + :param Hi-C exp_type: name of the experiment used (currently only Hi-C is + supported) + :param None hic_data: whether a file or a list of lists corresponding to + the Hi-C data + :param None tad_def: a file or a dict with precomputed TADs for this + experiment + :param None parser: a parser function that returns a tuple of lists + representing the data matrix and the length of a row/column. With + the file example.tsv: + + :: + + chrT_001 chrT_002 chrT_003 chrT_004 + chrT_001 629 164 88 105 + chrT_002 164 612 175 110 + chrT_003 88 175 437 100 + chrT_004 105 110 100 278 + + the output of parser('example.tsv') would be be: + ``[([629, 164, 88, 105, 164, 612, 175, 110, 88, 175, 437, 100, 105, + 110, 100, 278]), 4]`` + :param None conditions: :py:func:`list` of experimental conditions, e.g. + the cell type, the enzyme... (i.e.: ['HindIII', 'cortex', 'treatment']). + This parameter may be used to compare the effect of this conditions on + the TADs + :param True filter_columns: filter the columns with unexpectedly high + content of low values + :param None kw_descr: any other argument passed would be stored as + complementary descriptive field. For example:: + + exp = Experiment('k562_rep2', resolution=100000, + identifier='SRX015263', cell_type='K562', + enzyme='HindIII', cylce='synchronized') + print exp + + # Experiment k562_rep2: + # resolution : 100Kb + # TADs : None + # Hi-C rows : None + # normalized : None + # identifier : SRX015263 + # cell type : K562 + # restriction enzyme: HindIII + # cylce : synchronized + + *note that these fields may appear in the header of generated out files* + + TODO: doc conditions + TODO: normalization + """ + + + def __init__(self, name, resolution, hic_data=None, norm_data=None, + tad_def=None, parser=None, no_warn=False, weights=None, + conditions=None, identifier=None, + cell_type=None, enzyme=None, exp_type='Hi-C', **kw_descr): + self.name = name + self.resolution = resolution + self.identifier = identifier + self.cell_type = cell_type + self.enzyme = enzyme + self.description = kw_descr + self.exp_type = exp_type + self.crm = None + self._ori_resolution = resolution + self.hic_data = None + self._ori_hic = None + self._ori_norm = None + self._ori_size = None + self.conditions = sorted(conditions) if conditions else [] + self.size = None + self.tads = {} + self.norm = None + self.bias = None + self._normalization = None + self._filtered_cols = False + self._zeros = [] + self._zscores = [] + if hic_data: + self.load_hic_data(hic_data, parser, **kw_descr) + if norm_data: + self.load_norm_data(norm_data, parser, **kw_descr) + if tad_def: + self.load_tad_def(tad_def, weights=weights) + elif not hic_data and not no_warn and not norm_data: + stderr.write('WARNING: this is an empty shell, no data here.\n') + + + def __repr__(self): + return 'Experiment %s (resolution: %s, TADs: %s, Hi-C rows: %s, normalized: %s)' % ( + self.name, nicer(self.resolution), len(self.tads) or None, + self.size, self._normalization if self._normalization else 'None') + + + def __str__(self): + outstr = 'Experiment %s:\n' % (self.name) + outstr += ' resolution : %s\n' % (nicer(self.resolution)) + outstr += ' TADs : %s\n' % (len(self.tads) or None) + outstr += ' Hi-C rows : %s\n' % (self.size) + outstr += ' normalized : %s\n' % (self._normalization or None) + ukw = 'UNKNOWN' + try: # new in version post-CSDM13 + outstr += ' identifier : %s\n' % (self.identifier or ukw) + outstr += ' cell type : %s\n' % (self.cell_type or ukw) + outstr += ' restriction enzyme: %s\n' % (self.enzyme or ukw) + for desc in self.description: + outstr += ' %-18s: %s\n' % (desc, self.description[desc]) + except AttributeError: + pass + return outstr + + + def __add__(self, other, silent=False): + """ + sum Hi-C data of experiments into a new one. + """ + reso1, reso2 = self.resolution, other.resolution + if self.resolution == other.resolution: + resolution = self.resolution + changed_reso = False + else: + resolution = max(reso1, reso2) + self.set_resolution(resolution) + other.set_resolution(resolution) + if not silent: + stderr.write('WARNING: experiments of different resolution, ' + + 'setting both resolution of %s, and normalizing ' + + 'at this resolution\n' % (resolution)) + norm1 = copy(self.norm) + norm2 = copy(other.norm) + if self._normalization: + self.normalize_hic() + if other._normalization: + other.normalize_hic() + changed_reso = True + if self.hic_data: + new_hicdata = HiC_data([], size=self.size) + for i in self.hic_data[0]: + new_hicdata[i] = self.hic_data[0].get(i) + for i in other.hic_data[0]: + new_hicdata[i] += other.hic_data[0].get(i) + else: + new_hicdata = None + xpr = Experiment(name='%s+%s' % (self.name, other.name), + resolution=resolution, + hic_data=new_hicdata, no_warn=True) + # check if both experiments are normalized with the same method + # and sum both normalized data + if self._normalization != None and other._normalization != None: + if (self._normalization.split('_factor:')[0] == + other._normalization.split('_factor:')[0]): + xpr.norm = [HiC_data([], size=self.size)] + for i in self.norm[0]: + xpr.norm[0][i] = self.norm[0].get(i) + for i in other.norm[0]: + xpr.norm[0][i] += other.norm[0].get(i) + # The final value of the factor should be the sum of each + try: + xpr._normalization = ( + self._normalization.split('_factor:')[0] + + '_factor:' + + str(int(self._normalization.split('_factor:')[1]) + + int(other._normalization.split('_factor:')[1]))) + except IndexError: # no factor there + xpr._normalization = (self._normalization) + elif self.norm or other.norm: + try: + if (self.norm[0] or other.norm[0]) != {}: + if not silent: + raise Exception('ERROR: normalization differs between' + + ' each experiment\n') + else: + if not silent: + stderr.write('WARNING: experiments should be ' + + 'normalized before being summed\n') + except TypeError: + if not silent: + stderr.write('WARNING: experiments should be normalized ' + + 'before being summed\n') + else: + if not silent: + stderr.write('WARNING: experiments should be normalized ' + + 'before being summed\n') + if changed_reso: + self.set_resolution(reso1) + self.norm = norm1 + other.set_resolution(reso2) + other.norm = norm2 + xpr.crm = self.crm + if not xpr.size: + xpr.size = len(xpr.norm[0]) + + def __merge(own, fgn): + "internal function to merge descriptions" + if own == fgn: + return own + return '%s+%s' % (own , fgn) + + xpr.identifier = __merge(self.identifier , other.identifier ) + xpr.cell_type = __merge(self.cell_type , other.cell_type ) + xpr.enzyme = __merge(self.enzyme , other.enzyme ) + xpr.description = __merge(self.description, other.description) + xpr.exp_type = __merge(self.exp_type , other.exp_type ) + + for des in self.description: + if not des in other.description: + continue + xpr.description[des] = __merge(self.description[des], + other.description[des]) + return xpr + + + def __div__(self, other, silent=False): + """ + sum Hi-C data of experiments into a new one. + """ + reso1, reso2 = self.resolution, other.resolution + if self.resolution == other.resolution: + resolution = self.resolution + changed_reso = False + else: + resolution = max(reso1, reso2) + self.set_resolution(resolution) + other.set_resolution(resolution) + if not silent: + stderr.write('WARNING: experiments of different resolution, ' + + 'setting both resolution of %s, and normalizing ' + + 'at this resolution\n' % (resolution)) + norm1 = copy(self.norm) + norm2 = copy(other.norm) + if self._normalization: + self.normalize_hic() + if other._normalization: + other.normalize_hic() + changed_reso = True + if self.hic_data: + new_hicdata = HiC_data([], size=self.size) + for i in self.hic_data[0]: + new_hicdata[i] = self.hic_data[0].get(i) + for i in other.hic_data[0]: + try: + new_hicdata[i] /= other.hic_data[0].get(i) + except ZeroDivisionError: + new_hicdata[i] = float('NaN') + else: + new_hicdata = None + xpr = Experiment(name='%s/%s' % (self.name, other.name), + resolution=resolution, + hic_data=new_hicdata, no_warn=True) + # check if both experiments are normalized with the same method + # and sum both normalized data + if self._normalization != None and other._normalization != None: + if (self._normalization.split('_factor:')[0] == + other._normalization.split('_factor:')[0]): + xpr.norm = [HiC_data([], size=self.size)] + for i in self.norm[0]: + xpr.norm[0][i] = self.norm[0].get(i) + for i in other.norm[0]: + try: + xpr.norm[0][i] /= other.norm[0].get(i) + except ZeroDivisionError: + xpr.norm[0][i] = float('NaN') + # The final value of the factor should be the same of each + try: + xpr._normalization = ( + self._normalization.split('_factor:')[0] + + '_factor:' + + str(int(self._normalization.split('_factor:')[1]) + + int(other._normalization.split('_factor:')[1]))) / 2 + except IndexError: # no factor there + xpr._normalization = (self._normalization) + elif self.norm or other.norm: + try: + if (self.norm[0] or other.norm[0]) != {}: + if not silent: + raise Exception('ERROR: normalization differs between' + + ' each experiment\n') + except TypeError: + pass + if changed_reso: + self.set_resolution(reso1) + self.norm = norm1 + other.set_resolution(reso2) + other.norm = norm2 + xpr.crm = self.crm + if not xpr.size: + xpr.size = len(xpr.norm[0]) + + + + def __merge(own, fgn): + "internal function to merge descriptions" + if own == fgn: + return own + return '%s+%s' % (own , fgn) + + xpr.identifier = __merge(self.identifier , other.identifier ) + xpr.cell_type = __merge(self.cell_type , other.cell_type ) + xpr.enzyme = __merge(self.enzyme , other.enzyme ) + xpr.description = __merge(self.description, other.description) + xpr.exp_type = __merge(self.exp_type , other.exp_type ) + + for des in self.description: + if not des in other.description: + continue + xpr.description[des] = __merge(self.description[des], + other.description[des]) + return xpr + + + + def set_resolution(self, resolution, keep_original=True): + """ + Set a new value for the resolution. Copy the original data into + Experiment._ori_hic and replace the Experiment.hic_data + with the data corresponding to new data + (:func:`tadphys.Chromosome.compare_condition`). + + :param resolution: an integer representing the resolution. This number + must be a multiple of the original resolution, and higher than it + :param True keep_original: either to keep or not the original data + + """ + if resolution < self._ori_resolution: + raise Exception('New resolution might be higher than original.') + if resolution % self._ori_resolution: + raise Exception('New resolution might be a multiple original.\n' + + ' otherwise it is too complicated for me :P') + if resolution == self.resolution: + return + # if we want to go back to original resolution + if resolution == self._ori_resolution: + self.hic_data = self._ori_hic + self.norm = self._ori_norm + self.size = self._ori_size + self.resolution = self._ori_resolution + return + # if current resolution is the original one + if self.resolution == self._ori_resolution: + if self.hic_data: + self._ori_hic = copy(self.hic_data) + if self.norm: + self._ori_norm = self.norm[:] + # change the factor value in normalization description + try: + self._normalization = ( + self._normalization.split('_factor:')[0] + + '_factor:'+ + str(int(self._normalization.split('factor:')[1]) + * (resolution / self.resolution))) + except IndexError: # no factor there + pass + self.resolution = resolution + fact = self.resolution / self._ori_resolution + # super for! + try: + size = len(self._ori_hic[0]) + except TypeError: + size = len(self._ori_norm[0]) + self.size = size / fact + rest = size % fact + if rest: + self.size += 1 + self.hic_data = [HiC_data([], size / fact + (1 if rest else 0))] + self.norm = [HiC_data([], size / fact + (1 if rest else 0))] + def resize(mtrx, copee): + "resize both hic_data and normalized data" + for i in xrange(0, size, fact): + for j in xrange(0, size, fact): + val = 0 + for k in xrange(fact): + if i + k >= size: + break + for l in xrange(fact): + if j + l >= size: + break + val += copee[(i + k) * size + j + l] + if val: + mtrx[i/fact * self.size + j/fact] = val + try: + resize(self.hic_data[0], self._ori_hic[0]) + except TypeError: + pass + try: + resize(self.norm[0], self._ori_norm[0]) + except TypeError: + pass + # we need to recalculate zeros: + if self._filtered_cols: + stderr.write('WARNING: definition of filtered columns lost at ' + + 'this resolution\n') + self._filtered_cols = False + if not keep_original: + del(self._ori_hic) + del(self._ori_norm) + + + def filter_columns(self, silent=False, draw_hist=False, savefig=None, + diagonal=True, perc_zero=90, auto=True, min_count=None, + index=0): + """ + Call filtering function, to remove artifactual columns in a given Hi-C + matrix. This function will detect columns with very low interaction + counts; columns passing through a cell with no interaction in the + diagonal; and columns with NaN values (in this case NaN will be replaced + by zero in the original Hi-C data matrix). Filtered out columns will be + stored in the dictionary Experiment._zeros. + + :param False silent: does not warn for removed columns + :param False draw_hist: shows the distribution of mean values by column + the polynomial fit, and the cut applied. + :param None savefig: path to a file where to save the image generated; + if None, the image will be shown using matplotlib GUI (the extension + of the file name will determine the desired format). + :param True diagonal: remove row/columns with zero in the diagonal + :param 90 perc_zero: maximum percentage of cells with no interactions + allowed. + :param None min_count: minimum number of reads mapped to a bin (recommended + value could be 2500). If set this option overrides the perc_zero + filtering... This option is slightly slower. + :param True auto: if False, only filters based on the given percentage + zeros + :param 0 index: hic_data index to normalize + + """ + try: + data = self.hic_data[index] + ssize = self.hic_data[index]['size'] + except: + data = self.norm[index] + ssize = self.norm[index]['size'] + diagonal = True + self._zeros[index], has_nans = hic_filtering_for_modelling( + data, silent=silent, draw_hist=draw_hist, savefig=savefig, + diagonal=diagonal, perc_zero=perc_zero, auto=auto, + min_count=min_count) + if has_nans: # to make it simple + size2 = ssize**2 + for i in xrange(ssize): + if repr(self.hic_data[index].get(i, 0)) == 'nan': + del(self.hic_data[index][i]) + # Also remove columns where there is no data in the diagonal + # size = self.size + # else: + # self._zeros.update(dict([(i, None) for i in xrange(size) + # if not self.norm[0][i * size + i]])) + self._filtered_cols = True + + + def load_hic_data(self, hic_data, parser=None, wanted_resolution=None, + data_resolution=None, silent=False, **kwargs): + """ + Add a Hi-C experiment to the Chromosome object. + + :param None hic_data: whether a file or a list of lists corresponding to + the Hi-C data + :param name: name of the experiment + :param False force: overwrite the experiments loaded under the same + name + :param None parser: a parser function that returns a tuple of lists + representing the data matrix and the length of a row/column. + With the file example.tsv: + + :: + + chrT_001 chrT_002 chrT_003 chrT_004 + chrT_001 629 164 88 105 + chrT_002 86 612 175 110 + chrT_003 159 216 437 105 + chrT_004 100 111 146 278 + + the output of parser('example.tsv') would be: + ``[([629, 86, 159, 100, 164, 612, 216, 111, 88, 175, 437, 146, 105, + 110, 105, 278]), 4]`` + :param None resolution: resolution of the experiment in the file; it + will be adjusted to the resolution of the experiment. By default the + file is expected to contain a Hi-C experiment with the same resolution + as the :class:`tadphys.Experiment` created, and no change is made + :param True filter_columns: filter the columns with unexpectedly high + content of low values + :param False silent: does not warn for removed columns + + """ + self.hic_data = read_matrix(hic_data, parser=parser, one=False) + self._ori_size = self.size = self.hic_data[0]['size'] + self._ori_resolution = self.resolution = (data_resolution or + self._ori_resolution) + wanted_resolution = wanted_resolution or self.resolution + self.set_resolution(wanted_resolution, keep_original=False) + self._zeros = [] + for nmatrix in xrange(len(self.hic_data)): + ssize = self.hic_data[nmatrix]['size'] + self._zeros.append({}) + for index in xrange(ssize): + if self.hic_data[nmatrix][index].bads: + self._zeros[nmatrix][index] = self.hic_data[nmatrix][index].bads + self._filtered_cols = True + + def load_norm_data(self, norm_data, parser=None, resolution=None, + normalization='visibility', **kwargs): + """ + Add a normalized Hi-C experiment to the Chromosome object. + + :param None norm_data: whether a file or a list of lists corresponding to + the normalized Hi-C data + :param name: name of the experiment + :param False force: overwrite the experiments loaded under the same + name + :param None parser: a parser function that returns a tuple of lists + representing the data matrix and the length of a row/column. + With the file example.tsv: + + :: + + chrT_001 chrT_002 chrT_003 chrT_004 + chrT_001 12.5 164 8.8 0.5 + chrT_002 8.6 61.2 1.5 1.1 + chrT_003 15.9 21.6 3.7 0.5 + chrT_004 0.0 1.1 1.6 2.8 + + :param None resolution: resolution of the experiment in the file; it + will be adjusted to the resolution of the experiment. By default the + file is expected to contain a Hi-C experiment with the same resolution + as the :class:`tadphys.Experiment` created, and no change is made + :param True filter_columns: filter the columns with unexpectedly high + content of low values + :param False silent: does not warn for removed columns + + """ + self.norm = read_matrix(norm_data, parser=parser, hic=False, one=False) + self._ori_size = self.size = self.norm[0]['size'] + self._ori_resolution = self.resolution = resolution or self._ori_resolution + if not self._zeros: # in case we do not have original Hi-C data + self._zeros = [] + for nmatrix in xrange(len(self.norm)): + ssize = self.norm[nmatrix]['size'] + self._zeros.append({}) + for i in xrange(ssize): + if all([isnan(j) for j in + [self.norm[nmatrix]['matrix'].get(k, float('NaN')) for k in + xrange(i * ssize, + i * ssize + ssize)]]): + self._zeros[nmatrix][i] = None + # remove NaNs, we do not need them as we have zeroes + for nmatrix in xrange(len(self.norm)): + for i in self.norm[nmatrix]['matrix'].keys(): + if isnan(self.norm[nmatrix]['matrix'][i]): + del(self.norm[nmatrix]['matrix'][i]) + self._normalization = normalization + + # this part remains to be fixed, since i dont understand its use + # ALERT + # ALERT ###################################################################################### + # for nmatrix in xrange(len(self.norm)): + # for index in xrange(len(self.norm[nmatrix]['matrix'])): + # print 'la' + # if self.norm[nmatrix]['matrix'][index].bads: + # self._zeros[nmatrix]['matrix'][index] = self.norm[nmatrix]['matrix'][index].bads + # self._filtered_cols = True + + + # def load_tad_def(self, tad_def, index=0, weights=None): + # """ + # Add the Topologically Associated Domains definition detection to Slice + + # :param None tad_def: a file or a dict with pre-computed TADs for this + # experiment + # :param None name: name of the experiment, if None f_name will be used + # :param 0 index: hic_data index to use + # :param None weights: Store information about the weights, corresponding + # to the normalization of the Hi-C data (see TADbit function + # documentation) + + # """ + # tads, norm = parse_tads(tad_def) + # last = max(tads.keys()) + # if not self.size: + # self.size = tads[last]['end'] + # self.tads = tads + # if not self.norm: + # self.norm = weights or norm + # if self.norm: + # self._normalization = 'visibility' + # if self._normalization: + # norms = self.norm[index] + # elif self.hic_data: + # norms = self.hic_data[index] + # else: + # warn("WARNING: raw Hi-C data not available, " + + # "TAD's height fixed to 1") + # norms = None + # diags = [] + # siz = self.size + # sp1 = siz + 1 + # zeros = self._zeros[index] or {} + # if norms: + # for k in xrange(1, siz): + # s_k = siz * k + # diags.append(sum([norms[i * sp1 + s_k] + # if not (i in zeros + # or (i + k) in zeros) else 1. # 1 is the mean + # for i in xrange(siz - k)]) / (siz - k)) + # for tad in tads: + # start, end = (int(tads[tad]['start']) + 1, + # int(tads[tad]['end']) + 1) + # if norms: + # matrix = sum([norms[i + siz * j] + # if not (i in zeros + # or j in zeros) else 1. + # for i in xrange(start - 1, end - 1) + # for j in xrange(i + 1, end - 1)]) + # try: + # if norms: + # height = float(matrix) / sum( + # [diags[i-1] * (end - start - i) + # for i in xrange(1, end - start)]) + # else: + # height = tads[tad].get('height', 1.0) + # except ZeroDivisionError: + # height = 0. + # tads[tad]['height'] = height + + + # def normalize_hic(self, factor=1, iterations=0, max_dev=0.1, silent=False, + # rowsums=None, index=0): + # """ + # Normalize the Hi-C data. This normalization step does the same of + # the :func:`tadphys.tadbit.tadbit` function (default parameters), + + # It fills the Experiment.norm variable with the Hi-C values divided by + # the calculated weight. + + # The weight of a given cell in column i and row j corresponds to the + # square root of the product of the sum of column i by the sum of row + # j. + + # normalization is done according to this formula: + + # .. math:: + + # weight_{(I,J)} = \\frac{\\sum^N_{j=0}\\sum^N_{i=0}(matrix(i,j))} + # {\\sum^N_{i=0}(matrix(i,J)) \\times \\sum^N_{j=0}(matrix(I,j))} + + # with N being the number or rows/columns of the Hi-C matrix in both + # cases. + + # :param 1 factor: final mean number of normalized interactions wanted + # per cell + # :param False silent: does not warn when overwriting weights + # :param None rowsums: input a list of rowsums calculated elsewhere + # :param 0 index: hic_data index to normalize + # """ + + # if not self.hic_data or len(self.hic_data) <= index: + # raise Exception('ERROR: No Hi-C data loaded\n') + # if self.norm and len(self.norm) > index and not silent: + # stderr.write('WARNING: removing previous weights\n') + # size = self.size + # self.bias = iterative(self.hic_data[index], iterations=iterations, + # max_dev=max_dev, bads=self._zeros[index], + # verbose=not silent) + # norm = HiC_data([(i + j * size, float(self.hic_data[index][i, j]) / + # self.bias[i] / + # self.bias[j] * size) + # for i in self.bias for j in self.bias], size) + # if not self.norm: + # self.norm = [norm] + # elif len(self.norm) > index: + # self.norm[index] = norm + # else: + # self.norm.append(norm) + + # # no need to use lists, tuples use less memory + # if factor: + # self._normalization = 'visibility_factor:' + str(factor) + # factor = sum(self.norm[0].values()) / (self.size * self.size * factor) + # for n in self.norm[0]: + # self.norm[0][n] = self.norm[0][n] / factor + # else: + # self._normalization = 'visibility' + + + def get_hic_zscores(self, normalized=True, zscored=True, remove_zeros=True, index=0): + """ + Normalize the Hi-C raw data. The result will be stored into + the private Experiment._zscore list. + + :param True normalized: whether to normalize the result using the + weights (see :func:`normalize_hic`) + :param True zscored: calculate the z-score of the data + :param False remove_zeros: remove null interactions. Dangerous, null + interaction are informative. + :param 0 index: hic_data index or norm index from where to produce the zscores + + """ + values = {} + zeros = {} + if not normalized and (not self.hic_data or len(self.hic_data) <= index): + raise Exception('ERROR: No Hi-C data loaded\n') + if normalized and (not self.norm or len(self.norm) <= index): + raise Exception('ERROR: No normalized data loaded\n') + zscores = {} + if normalized: + ssize = self.size + for i in xrange(self.size): + # zeros are rows or columns having a zero in the diagonal + if i in self._zeros: + continue + for j in xrange(i + 1, ssize): + if j in self._zeros: + continue + if (not self.norm[index]['matrix'].get(i * ssize + j, 0) + and remove_zeros): + zeros[(i, j)] = None + continue + values[(i, j)] = self.norm[index]['matrix'].get(i * ssize + j, 0) + else: + ssize = self.size + for i in xrange(ssize): + if i in self._zeros[index]: + continue + for j in xrange(i + 1, ssize): + if j in self._zeros[index]: + continue + values[(i, j)] = self.hic_data[index]['matrix'].get(i * ssize + j, 0) + # compute Z-score + if zscored: + zscore(values) + for i in xrange(ssize): + if i in self._zeros: + continue + for j in xrange(i + 1, ssize): + if j in self._zeros: + continue + if (i, j) in zeros and remove_zeros: + continue + zscores.setdefault(str(i), {}) + zscores[str(i)][str(j)] = values[(i, j)] + + if len(self._zscores) > index: + self._zscores[index] = zscores + else: + self._zscores.append(zscores) + + def model_region(self, start=1, end=None, n_models=5000, n_keep=1000, + n_cpus=1, verbose=0, keep_all=False, close_bins=1, + outfile=None, config=CONFIG, container=None, + tool='imp',tmp_folder=None,timeout_job=10800, + stages=0, initial_conformation=None, connectivity="FENE", + timesteps_per_k=10000, kfactor=1, adaptation_step=False, + cleanup=True, single_particle_restraints=None, use_HiC=True, + start_seed=1, hide_log=True, remove_rstrn=[], + keep_restart_out_dir=None, + restart_path=False, store_n_steps=10, + useColvars=False): + """ + Generates of three-dimensional models using IMP, for a given segment of + chromosome. + + :param 1 start: first bin to model (bin number) + :param None end: last bin to model (bin number). By default goes to the + last bin. + :param 5000 n_models: number of modes to generate + :param 1000 n_keep: number of models used in the final analysis + (usually the top 20% of the generated models). The models are ranked + according to their objective function value (the lower the better) + :param False keep_all: whether or not to keep the discarded models (if + True, models will be stored under tructuralModels.bad_models) + :param 1 close_bins: number of particles away (i.e. the bin number + difference) a particle pair must be in order to be considered as + neighbors (e.g. 1 means consecutive particles) + :param n_cpus: number of CPUs to use + :param 0 verbose: the information printed can be: nothing (0), the + objective function value the selected models (1), the objective + function value of all the models (2), all the modeling + information (3) + :param None container: restrains particle to be within a given object. Can + only be a 'cylinder', which is, in fact a cylinder of a given height to + which are added hemispherical ends. This cylinder is defined by a radius, + its height (with a height of 0 the cylinder becomes a sphere) and the + force applied to the restraint. E.g. for modeling E. coli genome (2 + micrometers length and 0.5 micrometer of width), these values could be + used: ['cylinder', 250, 1500, 50], and for a typical mammalian nuclei + (6 micrometers diameter): ['cylinder', 3000, 0, 50] + :param CONFIG config: a dictionary containing the standard + parameters used to generate the models. The dictionary should + contain the keys kforce, maxdist, upfreq and lowfreq. + Examples can be seen by doing: + + :: + + from tadphys.imp.CONFIG import CONFIG + + where CONFIG is a dictionarry of dictionnaries to be passed to this + function: + + :: + + CONFIG = { + # use these paramaters with the Hi-C data from: + 'reference' : 'victor corces dataset 2013', + + # Force applied to the restraints inferred to neighbor particles + 'kforce' : 5, + + # Maximum experimental contact distance + 'maxdist' : 600, # OPTIMIZATION: 500-1200 + + # Minimum and maximum thresholds used to decide which experimental values have to be + # included in the computation of restraints. Z-score values bigger than upfreq + # and less that lowfreq will be include, whereas all the others will be rejected + 'upfreq' : 0.3, # OPTIMIZATION: min/max Z-score + + 'lowfreq' : -0.7 # OPTIMIZATION: min/max Z-score + + # How much space (radius in nm) ocupies a nucleotide + 'scale' : 0.005 + } + :param imp tool: use imp for montecarlo simulated annealing or lammps for + molecular dynamics + :param None tmp_folder: for lammps simulation, path to a temporary file + created during the clustering computation. Default will be created + in /tmp/ folder + :param 10800 timeout_job: maximum seconds a job can run in the multiprocessing + of lammps before is killed + :param 0 stages: index of the hic_data/norm data to model. For lammps a list of + indexes is allowed to perform dynamics between stages + :param tadbit initial_conformation: initial structure for lammps dynamics. + 'tadbit' to compute the initial conformation with montecarlo simulated annealing + 'random' to compute the initial conformation as a 3D random walk + {[x],[y],[z]} a dictionary containing lists with x,y,x positions, + e.g an IMPModel or LAMMPSModel object + :param True hide_log: do not generate lammps log information + :param FENE connectivity: use FENE for a fene bond or harmonic for harmonic + potential for neighbours + :param True cleanup: delete lammps folder after completion + :param [] remove_rstrn: list of particles which must not have restrains + :param None keep_restart_out_dir: path to write files to restore LAMMPs + session (binary) + :param False restart_path: path to files to restore LAMMPs session (binary) + :param 10 store_n_steps: Integer with number of steps to be saved if + restart_file != False + :param False useColvars: True if you want the restrains to be loaded by colvars + + :returns: a :class:`tadphys.imp.structuralmodels.StructuralModels` object. + + """ + if isinstance(stages, list) and tool == 'imp': + stderr.write('ERROR: tool imp does not allow dynamics\n') + return + if not self._normalization: + stderr.write('WARNING: not normalized data, should run ' + + 'Experiment.normalize_hic()\n') + if not end: + end = self.size + zscores, values, zeros = self._sub_experiment_zscore(start, end, stages) + if self.hic_data and self.hic_data[0].chromosomes: + coords = [] + tot = 0 + chrs = [] + chrom_offset_start = 1 + chrom_offset_end = 0 + for k, v in self.hic_data[0].chromosomes.iteritems(): + tot += v + if start > tot: + chrom_offset_start = start - tot + if end <= tot: + chrom_offset_end = tot - end + chrs.append(k) + break + if start < tot and end >= tot: + chrs.append(k) + + for k in chrs: + coords.append({'crm' : k, + 'start': 1, + 'end' : self.hic_data[0].chromosomes[k]}) + coords[0]['start'] = chrom_offset_start + coords[-1]['end'] -= chrom_offset_end + + else: + coords = {'crm' : self.crm.name, + 'start': start, + 'end' : end} + zeros = [tuple([i not in zeros_stg for i in xrange(end - start + 1)]) for zeros_stg in zeros] + nloci = end - start + 1 + if verbose: + stderr.write('Preparing to model %s particles\n' % nloci) + if tool=='lammps': + return generate_lammps_models(zscores, self.resolution, nloci, + values=values, n_models=n_models, + outfile=outfile, n_keep=n_keep, n_cpus=n_cpus, + verbose=verbose, first=0, + close_bins=close_bins, config=config, container=container, + coords=coords, zeros=zeros, + tmp_folder=tmp_folder,timeout_job=timeout_job, + initial_conformation='tadbit' if not initial_conformation \ + else initial_conformation, + connectivity=connectivity, + timesteps_per_k=timesteps_per_k, kfactor=kfactor, + adaptation_step=adaptation_step, cleanup=cleanup, + hide_log=hide_log, initial_seed=start_seed, + remove_rstrn=remove_rstrn, restart_path=restart_path, + keep_restart_out_dir=keep_restart_out_dir, + store_n_steps=store_n_steps, + useColvars=useColvars + ) + + + def optimal_imp_parameters(self, start=1, end=None, n_models=500, n_keep=100, + n_cpus=1, upfreq_range=(0, 1, 0.1), close_bins=1, + kbending_range=0.0, + lowfreq_range=(-1, 0, 0.1), + scale_range=[0.01][:], + maxdist_range=(400, 1400, 100), + dcutoff_range=[2][:], + outfile=None, verbose=True, corr='spearman', + off_diag=1, savedata=None, + container=None): + """ + Find the optimal set of parameters to be used for the 3D modeling in + IMP. + + :param 1 start: first bin to model (bin number) + :param None end: last bin to model (bin number). By default goes to the + last bin. + :param 500 n_models: number of modes to generate + :param 100 n_keep: number of models used in the final analysis (usually + the top 20% of the generated models). The models are ranked + according to their objective function value (the lower the better) + :param 1 close_bins: number of particles away (i.e. the bin number + difference) a particle pair must be in order to be considered as + neighbors (e.g. 1 means consecutive particles) + :param n_cpus: number of CPUs to use + :param False verbose: if set to True, information about the distance, + force and Z-score between particles will be printed + :param (-1,0,0.1) lowfreq_range: range of lowfreq values to be + optimized. The last value of the input tuple is the incremental step + for the lowfreq values + :param (0,1,0.1,0.1) upfreq_range: range of upfreq values to be + optimized. The last value of the input tuple is the incremental step + for the upfreq values + :param (400,1400,100) maxdist_range: upper and lower bounds used to + search for the optimal maximum experimental distance. The last value + of the input tuple is the incremental step for maxdist values + :param [0.01] scale_range: upper and lower bounds used to search for + the optimal scale parameter (nm per nucleotide). The last value of + the input tuple is the incremental step for scale parameter values + :param [2] dcutoff_range: upper and lower bounds used to search for + the optimal distance cutoff parameter (distance, in number of beads, + from which to consider 2 beads as being close). The last value of the + input tuple is the incremental step for scale parameter values + :param None cutoff: distance cutoff (nm) to define whether two particles + are in contact or not, default is 2 times resolution, times scale. + :param None container: restrains particle to be within a given object. Can + only be a 'cylinder', which is, in fact a cylinder of a given height to + which are added hemispherical ends. This cylinder is defined by a radius, + its height (with a height of 0 the cylinder becomes a sphere) and the + force applied to the restraint. E.g. for modeling E. coli genome (2 + micrometers length and 0.5 micrometer of width), these values could be + used: ['cylinder', 250, 1500, 50], and for a typical mammalian nuclei + (6 micrometers diameter): ['cylinder', 3000, 0, 50] + :param True verbose: print the results to the standard output + + .. note:: + + Each of the *_range* parameters accept tuples in the form + *(start, end, step)*, or a list with the list of values to test. + + E.g.: + * scale_range=[0.001, 0.005, 0.006] will test these three values. + * scale_range=(0.001, 0.005, 0.001) will test the values 0.001, + 0.002, 0.003, 0.004 and 0.005 + + + :returns: an :class:`tadphys.imp.impoptimizer.IMPoptimizer` object + + """ + if not self._normalization: + stderr.write('WARNING: not normalized data, should run ' + + 'Experiment.normalize_hic()\n') + if not end: + end = self.size + optimizer = IMPoptimizer(self, start, end, n_keep=n_keep, + n_models=n_models, close_bins=close_bins, + container=container) + optimizer.run_grid_search(maxdist_range=maxdist_range, + kbending_range=kbending_range, + upfreq_range=upfreq_range, + lowfreq_range=lowfreq_range, + scale_range=scale_range, + dcutoff_range=dcutoff_range, corr=corr, + n_cpus=n_cpus, verbose=verbose, + off_diag=off_diag, savedata=savedata) + + if outfile: + optimizer.write_result(outfile) + + return optimizer + + + def _sub_experiment_zscore(self, start, end, index=0): + """ + Get the z-score of a sub-region of an experiment. + + TODO: find a nicer way to do this... + + :param start: first bin to model (bin number) + :param end: first bin to model (bin number) + :param 0 index: hic_data index or norm index from where to compute + the zscores. A list is allowed to compute several zscores at the + same time + + :returns: z-score, raw values and zeros of the experiment + """ + if isinstance(index, list): + idx = index + else: + idx = [index] + if not self._normalization or not self._normalization.startswith('visibility'): + stderr.write('WARNING: normalizing according to visibility method\n') + for i in idx: + self.normalize_hic(index=i) + from tadphys import Chromosome + if start < 1: + raise ValueError('ERROR: start should be higher than 0\n') + start -= 1 # things starts at 0 for python. we keep the end coordinate + # at its original value because it is inclusive + siz = self.size + tmp = Chromosome('tmp') + tmp.add_experiment('exp1', resolution=self.resolution, filter_columns=False) + exp = tmp.experiments[0] + tmp_matrix = [] + exp.norm = [] + try: + for id in idx: + matrix = self.get_hic_matrix(index=id) + new_matrix = [[matrix[i][j] for i in xrange(start, end)] + for j in xrange(start, end)] + tmp_matrix.append(new_matrix) + # We want the weights and zeros calculated in the full chromosome + exp.norm.append([self.norm[id][i + siz * j] for i in xrange(start, end) + for j in xrange(start, end)]) + exp.load_hic_data(hic_data=tmp_matrix) + except TypeError: # no Hi-C data provided + for id in idx: + matrix = self.get_hic_matrix(normalized=True,index=id) + new_matrix = [[matrix[i][j] for i in xrange(start, end)] + for j in xrange(start, end)] + tmp_matrix.append(new_matrix) + exp.load_norm_data(norm_data=tmp_matrix) + + # ... but the z-scores in this particular region + vals = [] + exp._zeros = [] + for id in idx: + exp._zeros += [dict([(z - start, None) for z in self._zeros[id] + if start <= z <= end - 1])] + if len(exp._zeros[-1]) == (end - start): + raise Exception('ERROR: no interaction found in selected regions') + exp.get_hic_zscores(index=id) + values = [[float('nan') for _ in xrange(exp.size)] + for _ in xrange(exp.size)] + + for i in xrange(exp.size): + # zeros are rows or columns having a zero in the diagonal + if i in exp._zeros[-1]: + continue + for j in xrange(i + 1, exp.size): + if j in exp._zeros[-1]: + continue + if (not exp.norm[id]['matrix'].get(i * exp.size + j, 0) + or not exp.norm[id]['matrix'].get(i * exp.size + j, 0)): + continue + values[i][j] = exp.norm[id]['matrix'][i * exp.size + j] + values[j][i] = exp.norm[id]['matrix'][i * exp.size + j] + vals.append(values) + return exp._zscores, vals, exp._zeros + + + def write_interaction_pairs(self, fname, normalized=True, zscored=True, + diagonal=False, cutoff=None, header=False, + true_position=False, uniq=True, + remove_zeros=False, focus=None, format='tsv', + index=0): + """ + Creates a tab separated file with all the pairwise interactions. + + :param fname: file name where to write the pairwise interactions + :param True zscored: computes the z-score of the log10(data) + :param True normalized: use the weights to normalize the data + :param None cutoff: if defined, only the zscores above the cutoff will + be writen to the file + :param False uniq: only writes one representent per interacting pair + :param False true_position: if, true writes genomic coordinates, + otherwise, genomic bin. + :param None focus: writes interactions between the start and stop bin + passed to this parameter. + :param 'tsv' format: in which to write the file, can be tab separated + (tsv) or JSON (json) + :param 0 index: hic_data index or norm index + + """ + if (not self._zscores or len(self.norm) < index) and zscored: + self.get_hic_zscores(index=index) + if (not self.norm or len(self.norm) < index) and normalized: + raise Exception('Experiment not normalized.') + # write to file + if isinstance(fname, str): + out = open(fname, 'w') + elif isinstance(fname, file): + out = fname + else: + raise Exception('Not recognize file type\n') + if header: + if format == 'tsv': + out.write('elt1\telt2\t%s\n' % ('zscore' if zscored else + 'normalized hi-c' if normalized + else 'raw hi-c')) + elif format == 'json': + out.write(''' +{ + "metadata": { + "formatVersion" : 3, + %s + "species" : "%s", + "cellType" : "%s", + "experimentType" : "%s", + "identifier" : "%s", + "resolution" : %s, + "chromosome" : "%s", + "start" : %s, + "end" : %s + }, + "interactions": [ + ''' % ('\n'.join(['"%s": "%s",' % (k, self.description[k]) + for k in self.description]), + self.description.get('species', ''), + self.cell_type, + self.exp_type, + self.identifier, + self.resolution, + self.crm.name, + focus[0] * self.resolution if focus else 1, + (focus[1] * self.resolution if focus else + self.resolution * self.size))) + if focus: + start, end = focus[0], focus[1] + 1 + else: + start, end = 0, self.size + for i in xrange(start, end): + if i in self._zeros[index]: + continue + newstart = i if uniq else 0 + for j in xrange(newstart, end): + if j in self._zeros[index]: + continue + if not diagonal and i == j: + continue + if zscored: + try: + if self._zscores[index][str(i)][str(j)] < cutoff: + continue + if self._zscores[index][str(i)][str(j)] == -99: + continue + except KeyError: + continue + val = self._zscores[index][str(i)][str(j)] + elif normalized: + val = self.norm[index][self.size*i+j] + else: + val = self.hic_data[index][self.size*i+j] + if remove_zeros and not val: + continue + if true_position: + if format == 'tsv': + out.write('%s\t%s\t%s\n' % ( + self.resolution * (i + 1), + self.resolution * (j + 1), val)) + elif format == 'json': + out.write('%s,%s,%s,\n' % ( + self.resolution * (i + 1), + self.resolution * (j + 1), val)) + else: + if format == 'tsv': + out.write('%s\t%s\t%s\n' % ( + i + 1 - start, j + 1 - start, val)) + elif format == 'json': + out.write('%s,%s,%s\n' % ( + i + 1 - start, j + 1 - start, val)) + if format == 'json': + out.write(']}\n') + out.close() + + + def get_hic_matrix(self, focus=None, diagonal=True, normalized=False, index=0): + """ + Return the Hi-C matrix. + + :param None focus: if a tuple is passed (start, end), wil return a Hi-C + matrix starting at start, and ending at end (all inclusive). + :param True diagonal: replace the values in the diagonal by one. Used + for the filtering in order to smooth the distribution of mean values + :param False normalized: returns normalized data instead of raw Hi-C + :param 0 index: hic_data index or norm index from where to get the matrix + + :returns: list of lists representing the Hi-C data matrix of the + current experiment + """ + siz = self.size + if normalized: + try: + hic = self.norm[index]['matrix'] + except TypeError: + raise Exception('ERROR: experiment not normalized yet') + else: + hic = self.hic_data[index]['matrix'] + if focus: + start, end = focus + start -= 1 + else: + start = 0 + end = siz + if diagonal: + return [[hic.get(i + siz * j, 0) for i in xrange(start, end)] + for j in xrange(start, end)] + else: + mtrx = [[hic.get(i + siz * j, 0) for i in xrange(start, end)] + for j in xrange(start, end)] + for i in xrange(start, end): + mtrx[i][i] = 1 if mtrx[i][i] else 0 + return mtrx + + + def print_hic_matrix(self, print_it=True, normalized=False, zeros=False, index=0): + """ + Return the Hi-C matrix as string + + :param True print_it: Otherwise, returns the string + :param False normalized: returns normalized data, instead of raw Hi-C + :param False zeros: take into account filtered columns + :param 0 index: hic_data index or norm index from where to print the matrix + :returns: list of lists representing the Hi-C data matrix of the + current experiment + """ + siz = self.size + try: + if normalized: + hic = self.norm[index]['matrix'] + else: + hic = self.hic_data[index]['matrix'] + except TypeError: + raise Exception('ERROR: no hic_data with index ',index) + + if zeros: + out = '\n'.join(['\t'.join( + ['nan' if (i in self._zeros[index] or j in self._zeros[index]) else + str(hic.get(i + siz * j, 0)) for i in xrange(siz)]) + for j in xrange(siz)]) + else: + out = '\n'.join(['\t'.join([str(hic.get(i + siz * j, 0)) + for i in xrange(siz)]) + for j in xrange(siz)]) + if print_it: + print(out) + else: + return out + '\n' + + + # def view(self, tad=None, focus=None, paint_tads=False, axe=None, + # show=True, logarithm=True, normalized=False, relative=True, + # decorate=True, savefig=None, where='both', clim=None, + # cmap='jet', index=0): + # """ + # Visualize the matrix of Hi-C interactions + + # :param None tad: a given TAD in the form: + # :: + + # {'start': start, + # 'end' : end, + # 'brk' : end, + # 'score': score} + + # **Alternatively** a list of the TADs can be passed (all the TADs + # between the first and last one passed will be showed. Thus, passing + # more than two TADs might be superfluous) + # :param None focus: a tuple with the start and end positions of the + # region to visualize + # :param False paint_tads: draw a box around the TADs defined for this + # experiment + # :param None axe: an axe object from matplotlib can be passed in order + # to customize the picture + # :param True show: either to pop-up matplotlib image or not + # :param True logarithm: show the logarithm values + # :param True normalized: show the normalized data (weights might have + # been calculated previously). *Note: white rows/columns may appear in + # the matrix displayed; these rows correspond to filtered rows (see* + # :func:`tadphys.utils.hic_filtering.hic_filtering_for_modelling` *)* + # :param True relative: color scale is relative to the whole matrix of + # data, not only to the region displayed + # :param True decorate: draws color bar, title and axes labels + # :param None savefig: path to a file where to save the image generated; + # if None, the image will be shown using matplotlib GUI (the extension + # of the file name will determine the desired format). + # :param None clim: tuple with minimum and maximum value range for color + # scale. I.e. clim=(-4, 10) + # :param 'jet' cmap: color map from matplotlib. Can also be a + # preconfigured cmap object. + # :param 0 index: hic_data index or norm index + # """ + # if logarithm==True: + # fun = log2 + # elif logarithm: + # fun = logarithm + # else: + # fun = lambda x: x + # size = self.size + # if normalized and not self.norm: + # raise Exception('ERROR: weights not calculated for this ' + + # 'experiment. Run Experiment.normalize_hic\n') + # if tad and focus: + # raise Exception('ERROR: only one of "tad" or "focus" might be set') + # start = end = None + # if focus: + # start, end = focus + # if start == 0: + # stderr.write('WARNING: Hi-C matrix starts at 1, setting ' + + # 'starting point to 1.\n') + # start = 1 + # elif isinstance(tad, dict): + # start = int(tad['start']) + # end = int(tad['end']) + # elif isinstance(tad, list): + # if isinstance(tad[0], dict): + # start = int(sorted(tad, + # key=lambda x: int(x['start']))[0 ]['start']) + # end = int(sorted(tad, + # key=lambda x: int(x['end' ]))[-1]['end' ]) + # elif self.tads: + # start = self.tads[min(self.tads)]['start'] + 1 + # end = self.tads[max(self.tads)]['end' ] + 1 + # else: + # start = 1 + # end = size + # try: + # if normalized: + # hic = self.norm[index] + # else: + # hic = self.hic_data[index] + # except TypeError: + # raise Exception('ERROR: no hic_data with index ',index) + + # if relative and not clim: + # if normalized: + # # find minimum, if value is non-zero... for logarithm + # mini = min([i for i in hic.values() if i]) + # if mini == int(mini): + # vmin = min(hic.values()) + # else: + # vmin = mini + # vmin = fun(vmin or (1 if logarithm else 0)) + # vmax = fun(max(hic.values())) + # else: + # vmin = fun(min(hic.values()) or + # (1 if logarithm else 0)) + # vmax = fun(max(hic.values())) + # elif clim: + # vmin, vmax = clim + # if axe is None: + # plt.figure(figsize=(8, 6)) + # axe = plt.subplot(111) + # if tad or focus: + # if start > -1: + # if normalized: + # matrix = [ + # [hic[i+size*j] + # if (not i in self._zeros[index] + # and not j in self._zeros[index]) else float('nan') + # for i in xrange(int(start) - 1, int(end))] + # for j in xrange(int(start) - 1, int(end))] + # else: + # matrix = [ + # [hic[i+size*j] + # for i in xrange(int(start) - 1, int(end))] + # for j in xrange(int(start) - 1, int(end))] + # elif isinstance(tad, list): + # if normalized: + # stderr.write('WARNING: List passed, not going to be ' + + # 'normalized.\n') + # matrix = tad + # else: + # # TODO: something... matrix not declared... + # pass + # else: + # if normalized: + # matrix = [[hic[i+size*j] + # if (not i in self._zeros[index] + # and not j in self._zeros[index]) else float('nan') + # for i in xrange(size)] + # for j in xrange(size)] + # else: + # matrix = [[hic[i+size*j]\ + # for i in xrange(size)] \ + # for j in xrange(size)] + # if where == 'up': + # for i in xrange(int(end - start)): + # for j in xrange(i, int(end - start)): + # matrix[i][j] = vmin + # alphas = array([0, 0] + [1] * 256 + [0]) + # jet._init() + # jet._lut[:, -1] = alphas + # elif where == 'down': + # for i in xrange(int(end - start)): + # for j in xrange(i + 1): + # matrix[i][j] = vmin + # alphas = array([0, 0] + [1] * 256 + [0]) + # jet._init() + # jet._lut[:,-1] = alphas + + # if isinstance(cmap, str): + # cmap = plt.get_cmap(cmap) + # cmap.set_bad('darkgrey', 1) + # if relative: + # img = axe.imshow(nozero_log_matrix(matrix, fun), origin='lower', vmin=vmin, vmax=vmax, + # interpolation="nearest", cmap=cmap, + # extent=(int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5, + # int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5)) + # else: + # img = axe.imshow(nozero_log_matrix(matrix, fun), origin='lower', + # interpolation="nearest", cmap=cmap, + # extent=(int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5, + # int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5)) + # if decorate: + # cbar = axe.figure.colorbar(img) + # cbar.ax.set_ylabel('%sHi-C %sinteraction count' % ( + # 'Log2 ' * (logarithm==True), 'normalized ' * normalized), rotation=-90) + # axe.set_title(('Chromosome %s experiment %s %s') % ( + # self.crm.name, self.name, + # 'focus: %s-%s' % (start, end) if tad else '')) + # axe.set_xlabel('Genomic bin (resolution: %s)' % (self.resolution)) + # if paint_tads: + # axe.set_ylabel('TAD number') + # else: + # axe.set_ylabel('Genomic bin (resolution: %s)' % ( + # self.resolution)) + # if not paint_tads: + # axe.set_ylim(int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5) + # axe.set_xlim(int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5) + # if show: + # plt.show() + # if savefig: + # tadbit_savefig(savefig) + # return img + # pwidth = 1 + # tads = dict([(t, self.tads[t]) for t in self.tads + # if ((int(self.tads[t]['start']) + 1 >= start + # and int(self.tads[t]['end' ]) + 1 <= end) + # or not start)]) + # for i, tad in tads.iteritems(): + # t_start = int(tad['start']) + .5 + # t_end = int(tad['end']) + 1.5 + # nwidth = float(abs(tad['score'])) / 4 + # if where in ['down', 'both']: + # axe.hlines(t_start, t_start, t_end, colors='k', lw=pwidth) + # if where in ['up', 'both']: + # axe.hlines(t_end , t_start, t_end, colors='k', lw=nwidth) + # if where in ['up', 'both']: + # axe.vlines(t_start, t_start, t_end, colors='k', lw=pwidth) + # if where in ['down', 'both']: + # axe.vlines(t_end , t_start, t_end, colors='k', lw=nwidth) + # pwidth = nwidth + # if tad['score'] < 0: + # for j in xrange(0, int(t_end) - int(t_start), 2): + # axe.plot((t_start , t_start + j), + # (t_end - j, t_end ), color='k') + # axe.plot((t_end , t_end - j), + # (t_start + j, t_start ), color='k') + # axe.set_ylim(int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5) + # axe.set_xlim(int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5) + # if paint_tads: + # ticks = [] + # labels = [] + # for tad, tick in [(t, tads[t]['start'] + (tads[t]['end'] - + # tads[t]['start'] - 1)) + # for t in tads.keys()[::(len(tads)/11 + 1)]]: + # ticks.append(tick) + # labels.append(tad + 1) + # axe.set_yticks(ticks) + # axe.set_yticklabels(labels) + # if show: + # plt.show() + # if savefig: + # tadbit_savefig(savefig) + # return img + + + # def write_tad_borders(self, density=False, savedata=None, normalized=False, index=0): + # """ + # Print a table summarizing the TADs found by tadbit. This function outputs + # something similar to the R function. + + # :param False density: if True, adds a column with the relative + # interaction frequency measured within each TAD (value of 1 means an + # interaction frequency equal to the expectation in the experiment) + # :param None savedata: path to a file where to save the density data + # generated (1 column per step + 1 for particle number). If None, print + # a table. + # :param False normalized: uses normalized data to calculate the density + # :param 0 index: hic_data index or norm index + # """ + # try: + # if normalized and self.norm: + # norms = self.norm[index] + # elif self.hic_data: + # if normalized: + # warn("WARNING: weights not available, using raw data") + # norms = self.hic_data[index] + # else: + # warn("WARNING: raw Hi-C data not available, " + + # "TAD's height fixed to 1") + # norms = None + # except TypeError: + # raise Exception('ERROR: no hic_data with index ',index) + + # zeros = self._zeros[index] or {} + # table = '' + # table += '%s\t%s\t%s\t%s%s\n' % ('#', 'start', 'end', 'score', + # '' if not density else '\tdensity') + # tads = self.tads + # sp1 = self.size + 1 + # diags = [] + # if norms: + # for k in xrange(1, self.size): + # s_k = self.size * k + # diags.append(sum([norms[i * sp1 + s_k] + # if not (i in zeros + # or (i + k) in zeros) else 0. + # for i in xrange( + # self.size - k)]) / (self.size - k)) + # for tad in tads: + # table += '%s\t%s\t%s\t%s%s\n' % ( + # tad, int(tads[tad]['start'] + 1), int(tads[tad]['end'] + 1), + # abs(tads[tad]['score']), '' if not density else + # '\t%s' % (round(float(tads[tad]['height']), 3))) + # if not savedata: + # print table + # return + # if isinstance(savedata, file): + # out = savedata + # else: + # out = open(savedata, 'w') + # out.write(table) + + # def write_json(self, filename, focus=None, normalized=False): + # """ + # Save hic matrix in the json format, read by TADkit. + + # :param filename: location where the file will be written + # :param None focus: if a tuple is passed (start, end), json will contain a Hi-C + # matrix starting at start, and ending at end (all inclusive). + # :para False normalized: use normalized data instead of raw Hi-C + + # """ + # if not self.crm.species: + # warn("WARNING: no species specified in chromosome. TADkit will not be able to interpret the file") + # if not self.crm.name: + # warn("WARNING: no name specified in chromosome. TADkit will not be able to interpret the file") + + # if focus: + # start, end = focus + # size = end-start+1 + # else: + # start = 0 + # end = size = self.size + + # if size > 1200: + # warn("WARNING: this is a very big matrix, consider using focus. TADkit will not be able to render the file") + + # new_hic_data = self.get_hic_matrix(focus=focus, normalized=normalized) + + # chrom_start = [] + # chrom_end = [] + # chrom = [] + # if self.hic_data and self.hic_data[0].chromosomes: + # tot = 0 + # chrs = [] + # chrom_offset_start = start + # chrom_offset_end = 0 + # for k, v in self.hic_data[0].chromosomes.iteritems(): + # tot += v + # if start > tot: + # chrom_offset_start = start - tot + # if end <= tot: + # chrom_offset_end = tot - end + # chrs.append((k,v)) + # break + # if start < tot and end >= tot: + # chrs.append((k,v)) + + # for k, v in chrs: + # chrom.append(k) + # chrom_start.append(0) + # chrom_end.append(v * self.resolution) + # chrom_start[0] = chrom_offset_start * self.resolution + # chrom_end[-1] -= chrom_offset_end * self.resolution + + # else: + # chrom.append(self.crm.name) + # chrom_start.append(start * self.resolution) + # chrom_end.append(end * self.resolution) + + + # descr = {'chromosome' : chrom, + # 'species' : self.crm.species, + # 'resolution' : self.resolution, + # 'chrom_start' : chrom_start, + # 'chrom_end' : chrom_end, + # 'start' : self.resolution, + # 'end' : size * self.resolution} + + # # Fake structural models object to produce json + # sm = StructuralModels(nloci=size, models = [], bad_models = [], experiment=self, resolution=self.resolution, original_data=new_hic_data, description=descr, config={'scale':0.01}) + # sm.write_json(filename=filename) + + # def generate_densities(self): + # """ + # Related to the generation of 3D models. + # In the case of Hi-C data, the density is equal to the number of + # nucleotides in a bin, which is equal to the experiment resolution. + # """ + # dens = {} + # for i in self.size: + # dens[i] = self.resolution + # return dens diff --git a/taddyn/hic_data.py b/build/lib.linux-x86_64-3.6/tadphys/hic_data.py similarity index 100% rename from taddyn/hic_data.py rename to build/lib.linux-x86_64-3.6/tadphys/hic_data.py diff --git a/taddyn/modelling/HIC_CONFIG.py b/build/lib.linux-x86_64-3.6/tadphys/modelling/HIC_CONFIG.py similarity index 100% rename from taddyn/modelling/HIC_CONFIG.py rename to build/lib.linux-x86_64-3.6/tadphys/modelling/HIC_CONFIG.py diff --git a/build/lib.linux-x86_64-3.6/tadphys/modelling/LAMMPS_CONFIG.py b/build/lib.linux-x86_64-3.6/tadphys/modelling/LAMMPS_CONFIG.py new file mode 100644 index 0000000..8af1c60 --- /dev/null +++ b/build/lib.linux-x86_64-3.6/tadphys/modelling/LAMMPS_CONFIG.py @@ -0,0 +1,100 @@ +""" +25 Oct 2016 + + +""" +############################################################################### +# Parameters to implement Kremer&Grest polymer model # +# Reference paper: # +# K. Kremer and G. S. Grest # +# Dynamics of entangled linear polymer melts: A molecular-dynamics simulation # +# J Chem Phys 92, 5057 (1990) # +############################################################################### + + +# units http://lammps.sandia.gov/doc/units.html +units = "lj" + +# atom_style http://lammps.sandia.gov/doc/atom_style.html +atom_style = "angle" + +# boundary conditions http://lammps.sandia.gov/doc/boundary.html +boundary = "p p p" +#boundary = "f f f" + +# mass http://lammps.sandia.gov/doc/mass.html +mass = "* 1.0" + +# neighbor http://lammps.sandia.gov/doc/neighbor.html +neighbor = "3.0 nsq" # Optional for small and low density systems +#neighbor = "0.3 bin" # Standard choice for large (> 10,000 particles) systems +neigh_modify = "every 1 delay 1 check yes" + +# thermo +run = 100 +thermo = 1000 #int(float(run)/100) +#thermo_style custom step temp epair emol press pxx pyy pzz pxy pxz pyz vol + +# Excluded volume term: Purely repulsive Lennard-Jones or Truncated and Shifted Lennard-Jones +################################################################### +# Lennard-Jones 12-6 potential with cutoff (=truncated): # +# potential E=4epsilon[ (sigma/r)^12 - (sigma/r)^6] for r t2: + t1 = pair[1]+1 + t2 = pair[0]+1 + + epsilon = compartmentalization['interactions'][pair][1] + + try: + sigma1 = compartmentalization['radii'][pair[0]] + except: + sigma1 = 0.5 + try: + sigma2 = compartmentalization['radii'][pair[1]] + except: + sigma2 = 0.5 + sigma = sigma1 + sigma2 + + if compartmentalization['interactions'][pair][0] == "attraction": + rc = sigma * 2.5 + if compartmentalization['interactions'][pair][0] == "repulsion": + rc = sigma * 1.12246152962189 + + print("pair_coeff %s %s lj/cut %s %s %s" % (t1,t2,epsilon,sigma,rc)) + lmp.command("pair_coeff %s %s lj/cut %s %s %s" % (t1,t2,epsilon,sigma,rc)) + try: + lmp.command("run %s" % (compartmentalization['runtime'])) + except: + pass + + # Setup the pairs to co-localize using the COLVARS plug-in if loop_extrusion_dynamics: # Start relaxation step - lmp.command("reset_timestep 0") - lmp.command("run %i" % loop_extrusion_dynamics['timesteps_relaxation']) - + try: + lmp.command("reset_timestep 0") + lmp.command("run %i" % loop_extrusion_dynamics['timesteps_relaxation']) + except: + pass + lmp.command("reset_timestep 0") # Start Loop extrusion dynamics if to_dump: lmp.command("undump 1") lmp.command("dump 1 all custom %i %sloop_extrusion_MD_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) - #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id") - - # List of target loops of the form [(loop1_start,loop1_stop),...,(loopN_start,loopN_stop)] - target_loops = read_target_loops_input(loop_extrusion_dynamics['target_loops_input'], - loop_extrusion_dynamics['chrlength'], - loop_extrusion_dynamics['perc_enfor_loops']) # Randomly extract starting point of the extrusion dynamics between start and stop - initial_loops = draw_loop_extrusion_starting_points(target_loops, - loop_extrusion_dynamics['chrlength']) - - # Maximum number of particles to be extruded during the dynamics - maximum_number_of_extruded_particles = get_maximum_number_of_extruded_particles(target_loops, initial_loops) - print("Number of LES",maximum_number_of_extruded_particles) + extruders_positions = [] + nextruders = int(chromosome_particle_numbers[0]/loop_extrusion_dynamics['separation']) + print(nextruders) + for extruder in range(nextruders): + extruders_positions.append(draw_loop_extrusion_starting_point(loop_extrusion_dynamics['chrlength'][0])) + + # Initialise the lifetime of each extruder + extruders_lifetimes = [] + for extruder in range(nextruders): + extruders_lifetimes.append(int(0)) + print(extruders_positions, extruders_lifetimes) + + lmp.command("compute xu all property/atom xu") + lmp.command("compute yu all property/atom yu") + lmp.command("compute zu all property/atom zu") # Loop extrusion steps - for LES in range(1,maximum_number_of_extruded_particles): - - # Loop extrusion steps - - # Update the Lennard-Jones coefficients between extruded particles + for LES in range(int(run_time/loop_extrusion_dynamics['extrusion_time'])): + thermo_style="thermo_style custom step temp epair emol" + + # Update the bond restraint loop_number = 1 - for particle1,particle2 in initial_loops: - + for particle1,particle2 in extruders_positions: print("# fix LE%i all restrain bond %i %i %f %f %f" % (loop_number, particle1, particle2, @@ -1348,15 +1430,38 @@ def run_lammps(kseed, lammps_folder, run_time, loop_extrusion_dynamics['attraction_strength'], loop_extrusion_dynamics['attraction_strength'], loop_extrusion_dynamics['equilibrium_distance'])) - + lmp.command("variable x%i equal c_xu[%i]" % (particle1, particle1)) + lmp.command("variable x%i equal c_xu[%i]" % (particle2, particle2)) + lmp.command("variable y%i equal c_yu[%i]" % (particle1, particle1)) + lmp.command("variable y%i equal c_yu[%i]" % (particle2, particle2)) + lmp.command("variable z%i equal c_zu[%i]" % (particle1, particle1)) + lmp.command("variable z%i equal c_zu[%i]" % (particle2, particle2)) + + lmp.command("variable xLE%i equal v_x%i-v_x%i" % (loop_number, particle1, particle2)) + lmp.command("variable yLE%i equal v_y%i-v_y%i" % (loop_number, particle1, particle2)) + lmp.command("variable zLE%i equal v_z%i-v_z%i" % (loop_number, particle1, particle2)) + lmp.command("variable dist_%i_%i equal sqrt(v_xLE%i*v_xLE%i+v_zLE%i*v_zLE%i+v_zLE%i*v_zLE%i)" % (particle1, + particle2, + loop_number, + loop_number, + loop_number, + loop_number, + loop_number, + loop_number)) + thermo_style += " v_dist_%i_%i" % (particle1, particle2) loop_number += 1 + lmp.command("%s" % thermo_style) # Doing the LES - lmp.command("run %i" % loop_extrusion_dynamics['timesteps_per_loop_extrusion_step']) - + lmp.command("run %i" % loop_extrusion_dynamics['extrusion_time']) + + # update the lifetime of each extruder + for extruder in range(nextruders): + extruders_lifetimes[extruder] = extruders_lifetimes[extruder] + 1 + # Remove the loop extrusion restraint! loop_number = 1 - for particle1,particle2 in initial_loops: + for particle1,particle2 in extruders_positions: print("# unfix LE%i" % (loop_number)) lmp.command("unfix LE%i" % (loop_number)) @@ -1366,65 +1471,65 @@ def run_lammps(kseed, lammps_folder, run_time, # Update the particles involved in the loop extrusion interaction: # decrease the intial_start by one until you get to start # increase the intial_stop by one until you get to stop - for initial_loop, target_loop in zip(initial_loops,target_loops): - - if initial_loop[0] > target_loop[0]: - initial_loop[0] -= 1 - if initial_loop[1] < target_loop[1]: - initial_loop[1] += 1 - - - - #if to_dump: - # lmp.command("undump 1") - # lmp.command("dump 1 all custom %i langevin_dynamics_*.XYZ id xu yu zu" % to_dump) - # lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") - + for extruder in range(len(extruders_positions)): + # If the left part reaches the start of the chromosome -> Stop extruding + if extruders_positions[extruder][0] > 1: + random_number = uniform(0, 1) + if random_number <= loop_extrusion_dynamics['left_extrusion_rate']: + extruders_positions[extruder][0] -= 1 + # If the right part reaches the end of the chromosome -> Stop extruding + if extruders_positions[extruder][1] < chromosome_particle_numbers[0]: + random_number = uniform(0, 1) + if random_number <= loop_extrusion_dynamics['right_extrusion_rate']: + extruders_positions[extruder][1] += 1 + # If the extruder reached its lifetime, put it in another position + if extruders_lifetimes[extruder] == loop_extrusion_dynamics['lifetime']: + extruders_positions[extruder] = draw_loop_extrusion_starting_point(loop_extrusion_dynamics['chrlength'][0]) + # Re-initialise the lifetime of the extruder + extruders_lifetimes[extruder] = 0 + # Check presence of barriers + if loop_extrusion_dynamics['barriers_permeability'] < 1.0: + # If a motor tries to overcome a barrier we stop it with a probability > than the permeability + # If the barrier is on the left of the extruders, which is extruding contrary to the chain index, we have to re-put the extruder forwards + if extruders_positions[extruder][0] in loop_extrusion_dynamics['barriers']: + random_number = uniform(0, 1) + if random_number >= loop_extrusion_dynamics['barriers_permeability']: + extruders_positions[extruder][0] += 1 + # If the barrier is on the left of the extruders, which is extruding with the chain index, we have to re-put the extruder backwards + if extruders_positions[extruder][1] in loop_extrusion_dynamics['barriers']: + random_number = uniform(0, 1) + if random_number >= loop_extrusion_dynamics['barriers_permeability']: + extruders_positions[extruder][1] -= 1 + + print(extruders_positions,extruders_lifetimes) + + ### Put here the creationg of a pickle with the complete trajectory ### + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %sloop_extrusion_MD_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) # Post-processing analysis - if time_dependent_steering_pairs: + # Save coordinates + #for time in range(0,runtime,to_dump): + # xc.append(np.array(read_trajectory_file("%s/loop_extrusion_MD_%s.XYZ" % (lammps_folder, time)))) - if useColvars == True: - copyfile("%sout.colvars.traj" % lammps_folder, "%srestrained_pairs_equilibrium_distance_vs_timestep_from_time_point_%s_to_time_point_%s.txt" % (lammps_folder, str(time_point), str(time_point+1))) - - - os.remove("%sout.colvars.traj" % lammps_folder) - os.remove(time_dependent_steering_pairs['colvar_output']) - for time_point in time_points[0:-1]: - # Compute energy associated to the restraints: something like the IMP objective function - #compute_the_objective_function("%srestrained_pairs_equilibrium_distance_vs_timestep_from_time_point_%s_to_time_point_%s.txt" % (lammps_folder, str(time_point), str(time_point+1)), - # "%sobjective_function_profile_from_time_point_%s_to_time_point_%s.txt" % (lammps_folder, str(time_point), str(time_point+1)), - # time_point, - # time_dependent_steering_pairs['timesteps_per_k_change'][time_point]) - - # Compute the % of satysfied constraints between 2. sigma = 2./sqrt(k) - compute_the_percentage_of_satysfied_restraints("%srestrained_pairs_equilibrium_distance_vs_timestep_from_time_point_%s_to_time_point_%s.txt" % (lammps_folder, str(time_point), str(time_point+1)), - restraints[time_point], - "%spercentage_of_established_restraints_from_time_point_%s_to_time_point_%s.txt" % (lammps_folder, str(time_point), str(time_point+1)), - time_point, - time_dependent_steering_pairs['timesteps_per_k_change'][time_point]) - - for time_point in time_points[0:-1]: - xc.append(np.array(read_trajectory_file("%ssteered_MD_from_time_point_%s_to_time_point_%s.XYZ" % (lammps_folder, time_point, time_point+1)))) - - else: - # Managing the final model - xc.append(np.array(lmp.gather_atoms("x",1,3))) + #xc.append(np.array(lmp.gather_atoms("x",1,3))) lmp.close() result = [] for stg in range(len(xc)): - log_objfun = read_objective_function("%sobj_fun_from_time_point_%s_to_time_point_%s.txt" % (lammps_folder, str(stg), str(stg+1))) + #log_objfun = read_objective_function("%sobj_fun_from_time_point_%s_to_time_point_%s.txt" % (lammps_folder, str(stg), str(stg+1))) + log_objfun = [0.0] for timepoint in range(1,timepoints+1): lammps_model = LAMMPSmodel({'x' : [], - 'y' : [], - 'z' : [], - 'cluster' : 'Singleton', - 'log_objfun' : log_objfun, - 'objfun' : log_objfun[-1], - 'radius' : float(CONFIG.HiC['resolution'] * CONFIG.HiC['scale'])/2, - 'index' : kseed+timepoint, - 'rand_init' : str(kseed+timepoint)}) + 'y' : [], + 'z' : [], + 'cluster' : 'Singleton', + 'log_objfun' : log_objfun, + 'objfun' : log_objfun[-1], + 'radius' : 0.5, #float(CONFIG.HiC['resolution'] * CONFIG.HiC['scale'])/2, + 'index' : kseed+timepoint, + 'rand_init' : str(kseed+timepoint)}) if pbc: store_conformation_with_pbc(xc[stg], lammps_model, confining_environment) @@ -2329,26 +2434,31 @@ def generate_chromosome_rosettes_conformation ( chromosome_particle_numbers , # Checking that the beads are all inside the confining environment and are not overlapping for rosette_pair in list(combinations(final_rosettes,2)): - - for x0,y0,z0 in zip(rosette_pair[0]['x'],rosette_pair[0]['y'],rosette_pair[0]['z']): - particle_inside = check_point_inside_the_confining_environment(x0, y0, z0, - particle_radius, - confining_environment) - - if particle_inside == 0: # 0 means that the particle is outside -> PROBLEM!!! - print("Particle",x0,y0,z0,"is out of the confining environment\n") - break - - for x1,y1,z1 in zip(rosette_pair[1]['x'],rosette_pair[1]['y'],rosette_pair[1]['z']): - particles_overlap = check_particles_overlap(x0,y0,z0,x1,y1,z1,particle_radius) + molecule0 = list(zip(rosette_pair[0]['x'],rosette_pair[0]['y'],rosette_pair[0]['z'])) + molecule1 = list(zip(rosette_pair[1]['x'],rosette_pair[1]['y'],rosette_pair[1]['z'])) + distances = scipy.spatial.distance.cdist(molecule1,molecule0) + print(len(molecule0),len(molecule0[0]),distances.min()) + if distances.min() < particle_radius*2.0*0.95: + particles_overlap = 0 + break - if particles_overlap == 0: # 0 means that the particles are overlapping -> PROBLEM!!! - print("Particle",x0,y0,z0,"and",x1,y1,z1,"overlap\n") + if particles_overlap != 0: + for r in xrange(len(final_rosettes)): + molecule0 = list(zip(final_rosettes[r]['x'],final_rosettes[r]['y'],final_rosettes[r]['z'])) + print(len(molecule0),len(molecule0[0])) + + distances = scipy.spatial.distance.cdist(molecule0,molecule0) + print(distances.min()) + for i in xrange(len(molecule0)): + for j in xrange(i+1,len(molecule0)): + if distances[(i,j)] < particle_radius*2.0*0.95: + particles_overlap = 0 + if particles_overlap == 0: + break + if particles_overlap == 0: break - if particle_inside == 0 or particles_overlap == 0: + if particles_overlap == 0: break - if particle_inside == 0 or particles_overlap == 0: - break # Writing the final_rosettes conformation print("Succesfully generated conformation number %d\n" % (cnt+1)) @@ -2495,9 +2605,12 @@ def generate_rosettes(chromosome_particle_numbers, rosette_radius, particle_radi rosette['z'] = [] # Position of the first particle (x_0, 0.0, 0.0) - rosette['x'].append(rosette_radius * (0.38 + (1 - 0.38) * cos(6*phi) * cos(6*phi)) * cos(phi)) - rosette['y'].append(rosette_radius * (0.38 + (1 - 0.38) * cos(6*phi) * cos(6*phi)) * sin(phi)) - rosette['z'].append(phi / (2.0 * pi)) + k = 6. + x = 0.38 + p = 1.0 + rosette['x'].append(rosette_radius * (x + (1 - x) * cos(k*phi) * cos(k*phi)) * cos(phi)) + rosette['y'].append(rosette_radius * (x + (1 - x) * cos(k*phi) * cos(k*phi)) * sin(phi)) + rosette['z'].append(p * phi / (2.0 * pi)) #print "First bead is in position: %f %f %f" % (rosette['x'][0], rosette['y'][0], rosette['z'][0]) # Building the chain: The rosette is growing along the positive z-axes @@ -2506,8 +2619,8 @@ def generate_rosettes(chromosome_particle_numbers, rosette_radius, particle_radi distance = 0.0 while distance < (particle_radius*2.0): phi = phi + 0.001 - x_tmp = rosette_radius * (0.38 + (1 - 0.38) * cos(6*phi) * cos(6*phi)) * cos(phi) - y_tmp = rosette_radius * (0.38 + (1 - 0.38) * cos(6*phi) * cos(6*phi)) * sin(phi) + x_tmp = rosette_radius * (x + (1 - x) * cos(k*phi) * cos(k*phi)) * cos(phi) + y_tmp = rosette_radius * (x + (1 - x) * cos(k*phi) * cos(k*phi)) * sin(phi) z_tmp = phi / (2.0 * pi) distance = sqrt((x_tmp - rosette['x'][-1])*(x_tmp - rosette['x'][-1]) + (y_tmp - rosette['y'][-1])*(y_tmp - rosette['y'][-1]) + @@ -3463,20 +3576,29 @@ def read_target_loops_input(input_filename, chromosome_length, percentage): ########## -def draw_loop_extrusion_starting_points(target_loops, chromosome_length): - initial_loops = [] +#def draw_loop_extrusion_starting_points(target_loops, chromosome_length): +# initial_loops = [] # Scroll the target loops and draw a point between each start and stop - for target_loop in target_loops: +# for target_loop in target_loops: - random_particle = randint(target_loop[0], target_loop[1]) +# random_particle = randint(target_loop[0], target_loop[1]) - loop = [] - loop.append(random_particle) - loop.append(random_particle+1) +# loop = [] +# loop.append(random_particle) +# loop.append(random_particle+1) + +# initial_loops.append(loop) + +# return initial_loops + +def draw_loop_extrusion_starting_point(chromosome_length): + + # draw a starting point for extrusion along the chromosome + random_particle = randint(1, chromosome_length-1) + + return [random_particle,random_particle+1] - initial_loops.append(loop) - return initial_loops ########## @@ -3704,3 +3826,25 @@ def compute_the_objective_function(input_file_name, infile.close() outfile.close() + + +### get unique list ### + +def get_list(input_list): + + output_list = [] + + for element in input_list: + #print(type(element)) + if isinstance(element, (int)): + output_list.append(element) + if isinstance(element, (list)): + for subelement in element: + output_list.append(subelement) + if isinstance(element, (tuple)): + for subelement in range(element[0],element[1]+1,element[2]): + output_list.append(subelement) + return output_list + +########## +#MPI.Finalize() diff --git a/build/lib.linux-x86_64-3.6/tadphys/modelling/lammpsmodel.py b/build/lib.linux-x86_64-3.6/tadphys/modelling/lammpsmodel.py new file mode 100644 index 0000000..c604e39 --- /dev/null +++ b/build/lib.linux-x86_64-3.6/tadphys/modelling/lammpsmodel.py @@ -0,0 +1,38 @@ +""" +25 Oct 2016 + + +""" +from tadphys.modelling.structuralmodel import StructuralModel + +class LAMMPSmodel(StructuralModel): + """ + A container for the LAMMPS modelling results. The container is a dictionary + with the following keys: + + - rand_init: Random number generator feed (needed for model reproducibility) + - x, y, z: 3D coordinates of each particles. Each represented as a list + + """ + def __str__(self): + try: + return ('LAMMPS model ranked %s (%s particles) with: \n' + + ' - random initial value: %s\n' + + ' - first coordinates:\n'+ + ' X Y Z\n'+ + ' %7s%7s%7s\n'+ + ' %7s%7s%7s\n'+ + ' %7s%7s%7s\n') % ( + self['index'] + 1, + len(self['x']), self['rand_init'], + int(self['x'][0]), int(self['y'][0]), int(self['z'][0]), + int(self['x'][1]), int(self['y'][1]), int(self['z'][1]), + int(self['x'][2]), int(self['y'][2]), int(self['z'][2])) + except IndexError: + return ('LAMMPS model of %s particles with: \n' + + ' - random initial value: %s\n' + + ' - first coordinates:\n'+ + ' X Y Z\n'+ + ' %5s%5s%5s\n') % ( + len(self['x']), self['rand_init'], + self['x'][0], self['y'][0], self['z'][0]) diff --git a/taddyn/modelling/restraints.py b/build/lib.linux-x86_64-3.6/tadphys/modelling/restraints.py similarity index 100% rename from taddyn/modelling/restraints.py rename to build/lib.linux-x86_64-3.6/tadphys/modelling/restraints.py diff --git a/build/lib.linux-x86_64-3.6/tadphys/modelling/structuralmodel.py b/build/lib.linux-x86_64-3.6/tadphys/modelling/structuralmodel.py new file mode 100644 index 0000000..58b74f9 --- /dev/null +++ b/build/lib.linux-x86_64-3.6/tadphys/modelling/structuralmodel.py @@ -0,0 +1,955 @@ +""" +25 Oct 2016 + + +""" +from __future__ import print_function + + +from tadphys.utils.tadmaths import newton_raphson +from tadphys import __version__ as version +from math import sqrt, pi +import hashlib + +try: + basestring +except NameError: + basestring = str + +def model_header(model): + """ + Defines the header to write in output files for a given model + """ + if not 'description' in model: + return '' + outstr = '' + for desc in sorted(model['description']): + outstr += '# %-15s : %s\n' % (desc.upper(), model['description'][desc]) + return outstr + + +class StructuralModel(dict): + """ + A container for the structural modelling results. The container is a dictionary + with the following keys: + + - rand_init: Random number generator feed (needed for model reproducibility) + - x, y, z: 3D coordinates of each particles. Each represented as a list + + """ + def __len__(self): + return len(self['x']) + + def distance(self, part1, part2): + """ + Calculates the distance between one point of the model and an external + coordinate + + :param part1: index of a particle in the model + :param part2: index of a particle in the model + + :returns: distance between one point of the model and an external + coordinate + """ + if part1 == 0 or part2 == 0: + raise Exception('Particle number must be strictly positive\n') + return sqrt((self['x'][part1-1] - self['x'][part2-1])**2 + + (self['y'][part1-1] - self['y'][part2-1])**2 + + (self['z'][part1-1] - self['z'][part2-1])**2) + + + def _square_distance(self, part1, part2): + """ + Calculates the square instance between one point of the model and an + external coordinate + + :param part1: index of a particle in the model + :param part2: index of a particle in the model + + :returns: distance between one point of the model and an external + coordinate + """ + return ((self['x'][part1-1] - self['x'][part2-1])**2 + + (self['y'][part1-1] - self['y'][part2-1])**2 + + (self['z'][part1-1] - self['z'][part2-1])**2) + + + def _square_distance_to(self, part1, part2): + """ + :param part1: index of a particle in the model + :param part2: external coordinate (dict format with x, y, z keys) + + :returns: square distance between one point of the model and an external + coordinate + """ + return ((self['x'][part1] - part2[0])**2 + + (self['y'][part1] - part2[1])**2 + + (self['z'][part1] - part2[2])**2) + + + def center_of_mass(self): + """ + Gives the center of mass of a model + + :returns: the center of mass of a given model + """ + r_x = sum(self['x'])/len(self) + r_y = sum(self['y'])/len(self) + r_z = sum(self['z'])/len(self) + return dict((('x', r_x), ('y', r_y), ('z', r_z))) + + + def radius_of_gyration(self): + """ + Calculates the radius of gyration or gyradius of the model + + Defined as: + + .. math:: + + \sqrt{\\frac{\sum_{i=1}^{N} (x_i-x_{com})^2+(y_i-y_{com})^2+(z_i-z_{com})^2}{N}} + + with: + + * :math:`N` the number of particles in the model + * :math:`com` the center of mass + + :returns: the radius of gyration for the components of the tensor + """ + com = self.center_of_mass() + rog = sqrt(sum(self._square_distance_to(i, + (com['x'], com['y'], com['z'])) + for i in range(len(self))) / len(self)) + return rog + + + def contour(self): + """ + Total length of the model + + :returns: the totals length of the model + """ + dist = 0 + for i in range(1, len(self)): + dist += self.distance(i, i+1) + return dist + + + def longest_axe(self): + """ + Gives the distance between most distant particles of the model + + :returns: the maximum distance between two particles in the model + """ + maxdist = 0 + for i in range(1, len(self)): + for j in range(i + 1, len(self) + 1): + dist = self.distance(i, j) + if dist > maxdist: + maxdist = dist + return maxdist + + + def shortest_axe(self): + """ + Minimum distance between two particles in the model + + :returns: the minimum distance between two particles in the model + """ + mindist = float('inf') + for i in range(1, len(self)): + for j in range(i + 1, len(self) + 1): + dist = self.distance(i, j) + if dist < mindist: + mindist = dist + return mindist + + + def min_max_by_axis(self): + """ + Calculates the minimum and maximum coordinates of the model + + :returns: the minimum and maximum coordinates for each x, y and z axis + """ + return ((min(self['x']), max(self['x'])), + (min(self['y']), max(self['y'])), + (min(self['z']), max(self['z']))) + + + def cube_side(self): + """ + Calculates the side of a cube containing the model. + + :returns: the diagonal length of the cube containing the model + """ + return sqrt((min(self['x']) - max(self['x']))**2 + + (min(self['y']) - max(self['y']))**2 + + (min(self['z']) - max(self['z']))**2) + + + def cube_volume(self): + """ + Calculates the volume of a cube containing the model. + + :returns: the volume of the cube containing the model + """ + return self.cube_side()**3 + + + def inaccessible_particles(self, radius): + """ + Gives the number of loci/particles that are accessible to an object + (i.e. a protein) of a given size. + + :param radius: radius of the object that we want to fit in the model + + :returns: a list of numbers, each being the ID of a particles that would + never be reached by the given object + + TODO: remove this function + + """ + inaccessibles = [] + sphere = generate_sphere_points(100) + for i in range(len(self)): + impossibles = 0 + for xxx, yyy, zzz in sphere: + thing = (xxx * radius + self['x'][i], + yyy * radius + self['y'][i], + zzz * radius + self['z'][i]) + # print form % (k+len(self), thing['x'], thing['y'], thing['z'], + # 0, 0, 0, k+len(self)), + for j in range(len(self)): + if i == j: + continue + # print self._square_distance_to(j, thing), radius + if self._square_distance_to(j, thing) < radius**2: + # print i, j + impossibles += 1 + break + if impossibles == 100: + inaccessibles.append(i + 1) + return inaccessibles + + + # def persistence_length(self, start=1, end=None, return_guess=False): + # """ + # Calculates the persistence length (Lp) of given section of the model. + # Persistence length is calculated according to [Bystricky2004]_ : + + # .. math:: + + # = 2 \\times Lp^2 \\times (\\frac{Lc}{Lp} - 1 + e^{\\frac{-Lc}{Lp}}) + + # with the contour length as :math:`Lc = \\frac{d}{c}` where :math:`d` is + # the genomic dstance in bp and :math:`c` the linear mass density of the + # chromatin (in bp/nm). + + # :param 1 start: start particle from which to calculate the persistence + # length + # :param None end: end particle from which to calculate the persistence + # length. Uses the last particle by default + # :param False return_guess: Computes persistence length using the + # approximation :math:`Lp=\\frac{Lc}{Lp}` + + # :returns: persistence length, or 2 times the Kuhn length + # """ + # clength = float(self.contour()) + # end = end or len(self) + # sq_length = float(self._square_distance(start, end)) + + # guess = sq_length / clength + # if return_guess: + # return guess # incredible! + # kuhn = newton_raphson(guess, clength, sq_length) + # return 2 * kuhn + + + # def accessible_surface(self, radius, nump=100, superradius=200, + # include_edges=True, view_mesh=False, savefig=None, + # write_cmm_file=None, verbose=False, + # chimera_bin='chimera'): + # """ + # Calculates a mesh surface around the model (distance equal to input + # **radius**) and checks if each point of this mesh could be replaced by + # an object (i.e. a protein) of a given **radius** + + # Outer part of the model can be excluded from the estimation of + # accessible surface, as the occupancy outside the model is unknown (see + # superradius option). + + # :param radius: radius of the object we want to fit in the model. + # :param None write_cmm_file: path to file in which to write cmm with the + # colored meshed (red inaccessible points, green accessible points) + # :param 100 nump: number of points to draw around a given particle. This + # number also sets the number of points drawn around edges, as each + # point occupies a given surface (see maths below). *Note that this + # number is considerably lowered by the occupancy of edges, depending + # of the angle formed by the edges surrounding a given particle, only + # 10% to 50% of the ``nump`` will be drawn in fact.* + # :param True include_edges: if False, edges will not be included in the + # calculation of the accessible surface, only particles. Note that + # statistics on particles (like last item returned) will not change, + # and computation time will be significantly decreased. + # :param False view_mesh: launches chimera to display the mesh around the + # model + # :param None savefig: path where to save chimera image + # :param 'chimera' chimera_bin: path to chimera binary to use + # :param False verbose: prints stats about the surface + # :param 200 superradius: radius of an object used to exclude outer + # surface of the model. Superradius must be higher than radius. + + # This function will first define a mesh around the chromatin, + # representing all possible position of the center of the object we want + # to fit. This mesh will be at a distance of *radius* from the chromatin + # strand. All dots in the mesh represents an equal area (*a*), the whole + # surface of the chromatin strand being: :math:`A=n \\times a` (*n* being + # the total number of dots in the mesh). + + # The mesh consists of spheres around particles of the model, and + # cylinders around edges joining particles (no overlap is allowed between + # sphere and cylinders or cylinder and cylinder when they are + # consecutive). + + # If we want that all dots of the mesh representing the surface of the + # chromatin, corresponds to an equal area (:math:`a`) + + # .. math:: + + # a = \\frac{4\pi r^2}{s} = \\frac{2\pi r N_{(d)}}{c} + + # with: + + # * :math:`r` radius of the object to fit (as the input parameter **radius**) + # * :math:`s` number of points in sphere + # * :math:`c` number of points in circle (as the input parameter **nump**) + # * :math:`N_{(d)}` number of circles in an edge of length :math:`d` + + # According to this, when the distance between two particles is equal + # to :math:`2r` (:math:`N=2r`), we would have :math:`s=c`. + + # As : + + # .. math:: + + # 2\pi r = \sqrt{4\pi r^2} \\times \sqrt{\pi} + + # It is fair to state the number of dots represented along a circle as: + + # .. math:: + + # c = \sqrt{s} \\times \sqrt{\pi} + + # Thus the number of circles in an edge of length :math:`d` must be: + + # .. math:: + + # N_{(d)}=\\frac{s}{\sqrt{s}\sqrt{\pi}}\\times\\frac{d}{2r} + + # :returns: a list of *1-* the number of dots in the mesh that could be + # occupied by an object of the given radius *2-* the total number of + # dots in the mesh *3-* the estimated area of the mesh (in square + # micrometers) *4-* the area of the mesh of a virtually straight strand + # of chromatin defined as + # :math:`contour\\times 2\pi r + 4\pi r^2` (also in + # micrometers) *5-* a list of number of (accessibles, inaccessible) for + # each particle (percentage burried can be infered afterwards by + # accessible/(accessible+inaccessible) ) + + # """ + + # points, dots, superdots, points2dots = build_mesh( + # self['x'], self['y'], self['z'], len(self), nump, radius, + # superradius, include_edges) + + # # calculates the number of inaccessible peaces of surface + # if superradius: + # radius2 = (superradius - 4)**2 + # outdot = [] + # for x2, y2, z2 in superdots: + # for j, (x1, y1, z1) in enumerate(points): + # if fast_square_distance(x1, y1, z1, x2, y2, z2) < radius2: + # outdot.append(False) + # break + # else: + # outdot.append(True) + # continue + # points.insert(0, points.pop(j)) + # else: + # outdot = [False] * len(superdots) + + # # calculates the number of inaccessible peaces of surface + # radius2 = (radius - 2)**2 + # grey = (0.6, 0.6, 0.6) + # red = (1, 0, 0) + # green = (0, 1, 0) + # colors = [] + # for i, (x2, y2, z2) in enumerate(dots): + # if outdot[i]: + # colors.append(grey) + # continue + # for j, (x1, y1, z1) in enumerate(points): + # if fast_square_distance(x1, y1, z1, x2, y2, z2) < radius2: + # colors.append(red) + # break + # else: + # colors.append(green) + # continue + # points.insert(0, points.pop(j)) + # possibles = colors.count(green) + + # acc_parts = [] + # for p in sorted(points2dots.keys()): + # acc = 0 + # ina = 0 + # for dot in points2dots[p]: + # if colors[dot]==green: + # acc += 1 + # elif colors[dot]==red: + # ina += 1 + # acc_parts.append((p + 1, acc, ina)) + + # # some stats + # dot_area = 4 * pi * (float(radius) / 1000)**2 / nump + # area = (possibles * dot_area) + # total = (self.contour() / 1000 * 2 * pi * float(radius) / 1000 + 4 * pi + # * (float(radius) / 1000)**2) + # if verbose: + # print((' Accessible surface: %s micrometers^2' + + # '(%s accessible times %s micrometers)') % ( + # round(area, 2), possibles, dot_area)) + # print(' (%s accessible dots of %s total times %s micrometers)' % ( + # possibles, outdot.count(False), round(dot_area, 5))) + # print(' - %s%% of the contour mesh' % ( + # round((float(possibles)/outdot.count(False))*100, 2))) + # print(' - %s%% of a virtual straight chromatin (%s microm^2)' % ( + # round((area/total)*100, 2), round(total, 2))) + + # # write cmm file + # if savefig: + # view_mesh = True + # if write_cmm_file or view_mesh: + # out = '\n' + # form = ('\n') + # for k_2, thing in enumerate(dots): + # out += form % (1 + k_2, thing[0], thing[1], thing[2], + # colors[k_2][0], colors[k_2][1], colors[k_2][2]) + # if superradius: + # for k_3, thing in enumerate(superdots): + # out += form % (1 + k_3 + k_2 + 1, + # thing[0], thing[1], thing[2], + # 0.1, 0.1, 0.1) + # out += '\n' + # if view_mesh: + # out_f = open('/tmp/tmp_mesh.cmm', 'w') + # out_f.write(out) + # out_f.close() + # if write_cmm_file: + # out_f = open(write_cmm_file, 'w') + # out_f.write(out) + # out_f.close() + # if view_mesh: + # chimera_cmd = [ + # 'focus', + # 'bonddisplay never #1', + # 'shape tube #1 radius 15 bandLength 300 segmentSubdivisions 1 followBonds on', + # '~show #1', + # 'set bg_color white', 'windowsize 800 600', + # 'clip yon -500', 'set subdivision 1', 'set depth_cue', + # 'set dc_color black', 'set dc_start 0.5', 'set dc_end 1', + # 'scale 0.8'] + # if savefig: + # if savefig.endswith('.png'): + # chimera_cmd += ['copy file %s png' % (savefig)] + # elif savefig[-4:] in ('.mov', 'webm'): + # chimera_cmd += [ + # 'movie record supersample 1', 'turn y 3 120', + # 'wait 120', 'movie stop', + # 'movie encode output %s' % savefig] + # self.write_cmm('/tmp/') + # chimera_view(['/tmp/tmp_mesh.cmm', + # '/tmp/model.%s.cmm' % (self['rand_init'])], + # chimera_bin=chimera_bin, align=False, + # savefig=savefig, chimera_cmd=chimera_cmd) + + # return (possibles, outdot.count(False), area, total, acc_parts) + + + # def write_cmm(self, directory, color='index', rndname=True, + # model_num=None, filename=None, **kwargs): + # """ + # Save a model in the cmm format, read by Chimera + # (http://www.cgl.ucsf.edu/chimera). + + # **Note:** If none of model_num, models or cluster parameter are set, + # ALL the models will be written. + + # :param directory: location where the file will be written (note: the + # name of the file will be model_1.cmm if model number is 1) + # :param None model_num: the number of the model to save + # :param True rndname: If True, file names will be formatted as: + # model.RND.cmm, where RND is the random number feed used by IMP to + # generate the corresponding model. If False, the format will be: + # model_NUM_RND.cmm where NUM is the rank of the model in terms of + # objective function value + # :param None filename: overide the default file name writing + # :param 'index' color: can be: + + # * a string as: + # * '**index**' to color particles according to their position in the + # model (:func:`tadphys.utils.extraviews.color_residues`) + # * '**tad**' to color particles according to the TAD they belong to + # (:func:`tadphys.utils.extraviews.tad_coloring`) + # * '**border**' to color particles marking borders. Color according to + # their score (:func:`tadphys.utils.extraviews.tad_border_coloring`) + # coloring function like. + # * a function, that takes as argument a model and any other parameter + # passed through the kwargs. + # * a list of (r, g, b) tuples (as long as the number of particles). + # Each r, g, b between 0 and 1. + # :param kwargs: any extra argument will be passed to the coloring + # function + # """ + # if isinstance(color, basestring): + # if color == 'index': + # color = color_residues(self, **kwargs) + # elif color == 'tad': + # if not 'tads' in kwargs: + # raise Exception('ERROR: missing TADs\n ' + + # 'pass an Experiment.tads disctionary\n') + # color = tad_coloring(self, **kwargs) + # elif color == 'border': + # if not 'tads' in kwargs: + # raise Exception('ERROR: missing TADs\n ' + + # 'pass an Experiment.tads disctionary\n') + # color = tad_border_coloring(self, **kwargs) + # else: + # raise NotImplementedError(('%s type of coloring is not yet ' + + # 'implemeted\n') % color) + # elif hasattr(color, '__call__'): # it's a function + # color = color(self, **kwargs) + # elif not isinstance(color, list): + # raise TypeError('one of function, list or string is required\n') + # out = '\n' % (self['rand_init']) + # form = ('\n') + # for i in range(len(self['x'])): + # out += form % (i + 1, + # self['x'][i], self['y'][i], self['z'][i], + # color[i][0], color[i][1], color[i][2], i + 1) + # form = ('\n') + # break_chroms = [1] + # try: + # for beg, end in zip(self['description']['start'],self['description']['end']): + # break_chroms.append((end - beg)/self['description']['resolution']+break_chroms[-1]) + # except: + # pass + # for i in range(1, len(self['x'])): + # if i in break_chroms[1:]: + # continue + # out += form % (i, i + 1) + # out += '\n' + + # if filename: + # out_f = open('%s/%s' % (directory, filename), 'w') + # else: + # if rndname: + # out_f = open('%s/model.%s.cmm' % (directory, + # self['rand_init']), 'w') + # else: + # out_f = open('%s/model_%s_rnd%s.cmm' % ( + # directory, model_num, self['rand_init']), 'w') + # out_f.write(out) + # out_f.close() + + +# def write_xyz_OLD(self, directory, model_num=None, get_path=False, +# rndname=True): +# """ +# Writes a xyz file containing the 3D coordinates of each particle in the +# model. + +# **Note:** If none of model_num, models or cluster parameter are set, +# ALL the models will be written. + +# :param directory: location where the file will be written (note: the +# file name will be model.1.xyz, if the model number is 1) +# :param None model_num: the number of the model to save +# :param True rndname: If True, file names will be formatted as: +# model.RND.xyz, where RND is the random number feed used by IMP to +# generate the corresponding model. If False, the format will be: +# model_NUM_RND.xyz where NUM is the rank of the model in terms of +# objective function value +# :param False get_path: whether to return, or not, the full path where +# the file has been written +# """ +# if rndname: +# path_f = '%s/model.%s.xyz' % (directory, self['rand_init']) +# else: +# path_f = '%s/model_%s_rnd%s.xyz' % (directory, model_num, +# self['rand_init']) +# out = '' +# form = "%12s%12s%12.3f%12.3f%12.3f\n" +# for i in range(len(self['x'])): +# out += form % ('p' + str(i + 1), i + 1, round(self['x'][i], 3), +# round(self['y'][i], 3), round(self['z'][i], 3)) +# out_f = open(path_f, 'w') +# out_f.write(out) +# out_f.close() +# if get_path: +# return path_f +# else: +# return None + + + +# def write_json(self, directory, color='index', rndname=True, +# model_num=None, title=None, filename=None, **kwargs): +# """ +# Save a model in the json format, read by TADkit. + +# **Note:** If none of model_num, models or cluster parameter are set, +# ALL the models will be written. + +# :param directory: location where the file will be written (note: the +# name of the file will be model_1.cmm if model number is 1) +# :param None model_num: the number of the model to save +# :param True rndname: If True, file names will be formatted as: +# model.RND.cmm, where RND is the random number feed used by IMP to +# generate the corresponding model. If False, the format will be: +# model_NUM_RND.cmm where NUM is the rank of the model in terms of +# objective function value +# :param None filename: overide the default file name writing +# :param 'index' color: can be: + +# * a string as: +# * '**index**' to color particles according to their position in the +# model (:func:`tadphys.utils.extraviews.color_residues`) +# * '**tad**' to color particles according to the TAD they belong to +# (:func:`tadphys.utils.extraviews.tad_coloring`) +# * '**border**' to color particles marking borders. Color according to +# their score (:func:`tadphys.utils.extraviews.tad_border_coloring`) +# coloring function like. +# * a function, that takes as argument a model and any other parameter +# passed through the kwargs. +# * a list of (r, g, b) tuples (as long as the number of particles). +# Each r, g, b between 0 and 1. +# :param kwargs: any extra argument will be passed to the coloring +# function +# """ +# if isinstance(color, basestring): +# if color == 'index': +# color = color_residues(self, **kwargs) +# elif color == 'tad': +# if not 'tads' in kwargs: +# raise Exception('ERROR: missing TADs\n ' + +# 'pass an Experiment.tads disctionary\n') +# color = tad_coloring(self, **kwargs) +# elif color == 'border': +# if not 'tads' in kwargs: +# raise Exception('ERROR: missing TADs\n ' + +# 'pass an Experiment.tads disctionary\n') +# color = tad_border_coloring(self, **kwargs) +# else: +# raise NotImplementedError(('%s type of coloring is not yet ' + +# 'implemeted\n') % color) +# elif hasattr(color, '__call__'): # it's a function +# color = color(self, **kwargs) +# elif not isinstance(color, list): +# raise TypeError('one of function, list or string is required\n') +# form = ''' +# { +# "chromatin" : { +# "id" : %(sha)s, +# "title" : "%(title)s", +# "source" : "Tadphys %(version)s", +# "metadata": {%(descr)s}, +# "type" : "tadphys", +# "data": { +# "models": [ +# { %(xyz)s }, +# ], +# "clusters":[%(cluster)s], +# "centroid":[%(centroid)s], +# "restraints": [[][]], +# "chromatinColor" : [ ] +# } +# } +# } +# ''' +# fil = {} +# fil['sha'] = hashlib.new(fil['xyz']).hexdigest() +# fil['title'] = title or "Sample TADbit data" +# fil['version'] = version +# fil['descr'] = ''.join('\n', ',\n'.join([ +# '"%s" : %s' % (k, ('"%s"' % (v)) if isinstance(v, basestring) else v) +# for k, v in list(self.get('description', {}).items())]), '\n') +# fil['xyz'] = ','.join(['[%.4f,%.4f,%.4f]' % (self['x'][i], self['y'][i], +# self['z'][i]) +# for i in range(len(self['x']))]) + + +# if filename: +# out_f = open('%s/%s' % (directory, filename), 'w') +# else: +# if rndname: +# out_f = open('%s/model.%s.cmm' % (directory, +# self['rand_init']), 'w') +# else: +# out_f = open('%s/model_%s_rnd%s.cmm' % ( +# directory, model_num, self['rand_init']), 'w') +# out_f.write(out) +# out_f.close() + + + +# def write_xyz(self, directory, model_num=None, get_path=False, +# rndname=True, filename=None, header=True): +# """ +# Writes a xyz file containing the 3D coordinates of each particle in the +# model. +# Outfile is tab separated column with the bead number being the +# first column, then the genomic coordinate and finally the 3 +# coordinates X, Y and Z + +# **Note:** If none of model_num, models or cluster parameter are set, +# ALL the models will be written. + +# :param directory: location where the file will be written (note: the +# file name will be model.1.xyz, if the model number is 1) +# :param None model_num: the number of the model to save +# :param True rndname: If True, file names will be formatted as: +# model.RND.xyz, where RND is the random number feed used by IMP to +# generate the corresponding model. If False, the format will be: +# model_NUM_RND.xyz where NUM is the rank of the model in terms of +# objective function value +# :param False get_path: whether to return, or not, the full path where +# the file has been written +# :param None filename: overide the default file name writing +# :param True header: write a header describing the experiment from which +# """ +# if filename: +# path_f = '%s/%s' % (directory, filename) +# else: +# if rndname: +# path_f = '%s/model.%s.xyz' % (directory, self['rand_init']) +# else: +# path_f = '%s/model_%s_rnd%s.xyz' % (directory, model_num, +# self['rand_init']) +# out = '' +# if header: +# out += model_header(self) +# form = "%s\t%s\t%.3f\t%.3f\t%.3f\n" +# # TODO: do not use resolution directly -> specific to Hi-C +# chrom_list = self['description']['chromosome'] +# chrom_start = self['description']['start'] +# chrom_end = self['description']['end'] +# if not isinstance(chrom_list, list): +# chrom_list = [chrom_list] +# chrom_start = [chrom_start] +# chrom_end = [chrom_end] + +# chrom_start = [(int(c) // int(self['description']['resolution']) +# if int(c) else 0) +# for c in chrom_start] +# chrom_end = [(int(c) // int(self['description']['resolution']) +# if int(c) else len(self['x'])) +# for c in chrom_end] + +# offset = -chrom_start[0] +# for crm in range(len(chrom_list)): +# for i in range(chrom_start[crm] + offset, chrom_end[crm] + offset): +# out += form % ( +# i + 1, +# '%s:%s-%s' % ( +# chrom_list[crm], +# int(chrom_start[crm] or 0) + +# int(self['description']['resolution']) * (i - offset) + 1, +# int(chrom_start[crm] or 0) + +# int(self['description']['resolution']) * (i + 1 - offset)), +# round(self['x'][i], 3), +# round(self['y'][i], 3), round(self['z'][i], 3)) +# offset += (chrom_end[crm] - chrom_start[crm]) +# out_f = open(path_f, 'w') +# out_f.write(out) +# out_f.close() +# if get_path: +# return path_f +# else: +# return None + + # def write_xyz_babel(self, directory, model_num=None, get_path=False, + # rndname=True, filename=None): + # """ + # Writes a xyz file containing the 3D coordinates of each particle in the + # model using a file format compatible with babel + # (http://openbabel.org/wiki/XYZ_%28format%29). + # Outfile is tab separated column with the bead number being the + # first column, then the genomic coordinate and finally the 3 + # coordinates X, Y and Z + # **Note:** If none of model_num, models or cluster parameter are set, + # ALL the models will be written. + # :param directory: location where the file will be written (note: the + # file name will be model.1.xyz, if the model number is 1) + # :param None model_num: the number of the model to save + # :param True rndname: If True, file names will be formatted as: + # model.RND.xyz, where RND is the random number feed used by IMP to + # generate the corresponding model. If False, the format will be: + # model_NUM_RND.xyz where NUM is the rank of the model in terms of + # objective function value + # :param False get_path: whether to return, or not, the full path where + # the file has been written + # :param None filename: overide the default file name writing + # """ + # if filename: + # path_f = '%s/%s' % (directory, filename) + # else: + # if rndname: + # path_f = '%s/model.%s.xyz' % (directory, self['rand_init']) + # else: + # path_f = '%s/model_%s_rnd%s.xyz' % (directory, model_num, + # self['rand_init']) + # out = '' + # # Write header as number of atoms + # out += str(len(self['x'])) + # # Write comment as type of molecule + # out += "\nDNA\n" + + # form = "%s\t%.3f\t%.3f\t%.3f\n" + # # TODO: do not use resolution directly -> specific to Hi-C + # chrom_list = self['description']['chromosome'] + # chrom_start = self['description']['start'] + # chrom_end = self['description']['end'] + # if not isinstance(chrom_list, list): + # chrom_list = [chrom_list] + # chrom_start = [chrom_start] + # chrom_end = [chrom_end] + # chrom_start = [int(c)/int(self['description']['resolution']) for c in chrom_start] + # chrom_end = [int(c)/int(self['description']['resolution']) for c in chrom_end] + # offset = 0 + # for crm in range(len(chrom_list)): + # for i in range(chrom_start[crm]+offset,chrom_end[crm]+offset): + # out += form % ( + # i + 1, + # '%s:%s-%s' % ( + # chrom_list[crm], + # int(chrom_start[crm] or 0) + + # int(self['description']['resolution']) * (i - offset) + 1, + # int(chrom_start[crm] or 0) + + # int(self['description']['resolution']) * (i + 1 - offset)), + # round(self['x'][i], 3), + # round(self['y'][i], 3), round(self['z'][i], 3)) + # offset += (chrom_end[crm]-chrom_start[crm]) + # out_f = open(path_f, 'w') + # out_f.write(out) + # out_f.close() + # if get_path: + # return path_f + # else: + # return None + + # def view_model(self, tool='chimera', savefig=None, cmd=None, + # center_of_mass=False, gyradius=False, color='index', + # **kwargs): + # """ + # Visualize a selected model in the three dimensions. (either with Chimera + # or through matplotlib). + + # :param model_num: model to visualize + # :param 'chimera' tool: path to the external tool used to visualize the + # model. Can also be 'plot', to use matplotlib. + # :param None savefig: path to a file where to save the image OR movie + # generated (depending on the extension; accepted formats are png, mov + # and webm). if set to None, the image or movie will be shown using + # the default GUI. + # :param 'index' color: can be: + + # * a string as: + # * '**index**' to color particles according to their position in the + # model (:func:`tadphys.utils.extraviews.color_residues`) + # * '**tad**' to color particles according to the TAD they belong to + # (:func:`tadphys.utils.extraviews.tad_coloring`) + # * '**border**' to color particles marking borders. Color according to + # their score (:func:`tadphys.utils.extraviews.tad_border_coloring`) + # coloring function like. + # * a function, that takes as argument a model and any other parameter + # passed through the kwargs. + # * a list of (r, g, b) tuples (as long as the number of particles). + # Each r, g, b between 0 and 1. + # :param False center_of_mass: draws a dot representing the center of + # mass of the model + # :param False gyradius: draws the center of mass of the model as a sphere + # with radius equal to the radius of gyration of the model + # :param None cmd: list of commands to be passed to the viewer. + # The chimera list is: + + # :: + + # focus + # set bg_color white + # windowsize 800 600 + # bonddisplay never #0 + # represent wire + # shape tube #0 radius 5 bandLength 100 segmentSubdivisions 1 followBonds on + # clip yon -500 + # ~label + # set subdivision 1 + # set depth_cue + # set dc_color black + # set dc_start 0.5 + # set dc_end 1 + # scale 0.8 + + # Followed by the movie command to record movies: + + # :: + + # movie record supersample 1 + # turn y 3 120 + # wait 120 + # movie stop + # movie encode output SAVEFIG + + # Or the copy command for images: + + # :: + + # copy file SAVEFIG png + + # Passing as the following list as 'cmd' parameter: + # :: + + # cmd = ['focus', 'set bg_color white', 'windowsize 800 600', + # 'bonddisplay never #0', + # 'shape tube #0 radius 10 bandLength 200 segmentSubdivisions 100 followBonds on', + # 'clip yon -500', '~label', 'set subdivision 1', + # 'set depth_cue', 'set dc_color black', 'set dc_start 0.5', + # 'set dc_end 1', 'scale 0.8'] + + # will return the default image (other commands can be passed to + # modified the final image/movie). + + # :param kwargs: see :func:`tadphys.utils.extraviews.plot_3d_model` or + # :func:`tadphys.utils.extraviews.chimera_view` for other arguments + # to pass to this function + + # """ + # if gyradius: + # gyradius = self.radius_of_gyration() + # center_of_mass = True + # if tool == 'plot': + # x, y, z = self['x'], self['y'], self['z'] + # plot_3d_model(x, y, z, color=color, **kwargs) + # return + # self.write_cmm('/tmp/', color=color, **kwargs) + # chimera_view(['/tmp/model.%s.cmm' % (self['rand_init'])], + # savefig=savefig, chimera_bin=tool, chimera_cmd=cmd, + # center_of_mass=center_of_mass, gyradius=gyradius) diff --git a/build/lib.linux-x86_64-3.6/tadphys/squared_distance_matrix.cpython-36m-x86_64-linux-gnu.so b/build/lib.linux-x86_64-3.6/tadphys/squared_distance_matrix.cpython-36m-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..b960ef26bfcbf972c578ff1bef4832b0e1fcdf7c GIT binary patch literal 17608 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 KJjIL)$p0Viwk`eu literal 0 HcmV?d00001 diff --git a/taddyn/utils/__init__.py b/build/lib.linux-x86_64-3.6/tadphys/utils/__init__.py similarity index 100% rename from taddyn/utils/__init__.py rename to build/lib.linux-x86_64-3.6/tadphys/utils/__init__.py diff --git a/taddyn/utils/extraviews.py b/build/lib.linux-x86_64-3.6/tadphys/utils/extraviews.py similarity index 100% rename from taddyn/utils/extraviews.py rename to build/lib.linux-x86_64-3.6/tadphys/utils/extraviews.py diff --git a/taddyn/utils/hic_filtering.py b/build/lib.linux-x86_64-3.6/tadphys/utils/hic_filtering.py similarity index 100% rename from taddyn/utils/hic_filtering.py rename to build/lib.linux-x86_64-3.6/tadphys/utils/hic_filtering.py diff --git a/taddyn/utils/hic_parser.py b/build/lib.linux-x86_64-3.6/tadphys/utils/hic_parser.py similarity index 100% rename from taddyn/utils/hic_parser.py rename to build/lib.linux-x86_64-3.6/tadphys/utils/hic_parser.py diff --git a/taddyn/utils/maths.py b/build/lib.linux-x86_64-3.6/tadphys/utils/maths.py similarity index 100% rename from taddyn/utils/maths.py rename to build/lib.linux-x86_64-3.6/tadphys/utils/maths.py diff --git a/taddyn/utils/modelAnalysis.py b/build/lib.linux-x86_64-3.6/tadphys/utils/modelAnalysis.py similarity index 100% rename from taddyn/utils/modelAnalysis.py rename to build/lib.linux-x86_64-3.6/tadphys/utils/modelAnalysis.py diff --git a/taddyn/utils/tadmaths.py b/build/lib.linux-x86_64-3.6/tadphys/utils/tadmaths.py similarity index 100% rename from taddyn/utils/tadmaths.py rename to build/lib.linux-x86_64-3.6/tadphys/utils/tadmaths.py diff --git a/build/temp.linux-x86_64-3.6/src/3d-lib/squared_distance_matrix_calculation_py.o b/build/temp.linux-x86_64-3.6/src/3d-lib/squared_distance_matrix_calculation_py.o new file mode 100644 index 0000000000000000000000000000000000000000..7c6ef6e7b052678248bbb6022384a3edd516bb59 GIT binary patch literal 8312 zcmbVRZ){uD6~B(t)=N9vWo$Fh(N}69-Gb*dWlPGR#fg)?fYWAcGCEOsaqXAJs$*yN zGffa{H{4Wva$PEIAJ~_Pual;Y50j?-5etO2FahhP?vIAFA;D;+LMa)8N-(nXyYF86 z=Gh)>NAkP({q8yEciy?@-uqs1bSN?0=J7Bo9(FgY-$|6QxzE=7{k+@H!fY!WF63vl zY^G=xwft1QGdKURHk&VItV}*v)H*YBNczkeSmCnATy_B#+XVdYM8|>(Df9CxOWsjXT-N zBSVB%X_h$9>zwP-=DW0qw`r+-zL3u3k`!J(*N%+43h z4sKO2tx_RZtaH`UGL_9Iodn@Yeah=Q}L~Q8lB%@ z%<1BmOZVbb;H|~wKybsl<-q<8YxVM?Z#nRd=a&Qfp4Q7(L#5Z2q$+P0-VK~QOTE~A zBlb${>#>R0_{84smx;eqx5vXi+X{!y#>1OHRsPTuI98!fU^CO7e$^YVq{Ev=s_mO~ zJ01?|m3Y{vSGz)bWt2??HXq~ufd)rY@5IW_dUjX4-oCf8<2}97>qHGrZnhi?Y#d_u zRNAjB4+MhkZ!ZTnwuj<<>2T=iQ+jHDcvE%Ib4NTJvVz34>C&T9k(&SVvz_-p5ZfPn zAogI)SX$CkD|>bOef{YRUcs@jXoVMEK5}FA-WA<`Mz1EG^CAATZHP}VKjYK;ep|Y7 z|I$SsZ)}1*#KuSL58z_L{?}eiMcviFh<$o!;k6@Oy1f*u#=|S4)%0m!Js$fly}Ts# z?ZK;wzE?|^^zyU5gniM8QxI`B3V_%s>m&BR!515k+2=vJitx& zxczz~<)zZa`xEvRk(MPWZoj8jZ-+ZsUX;;&X}!{Zb0>kQ9ld*z<|W*#SI5KA1ogTSl-hnL z2@8vXV_7P{r@W+Hc_iHB!05r&XMZRF%K<_ZD|wHTr^*-=V?5lOsOY@YpQ!YQ@EFxQ zPy5JQ_u?tNlAx-sT!Gv60HU(bVNw z`HY9Jgo}r#s`XVd_=BU5YA1t?_+Sq=VMx>Mc<`sncNJ`=4aj;NVWJGgZhJ zi&j3Ly>0g{tvj-PMx~lkTPczF^I7)4m+JJrd>auN5Sohrh-=b3xAy z8`k+w5jkdIlNjTgaeok)W5wu1cO*d#l@FJ5xZdLrKGrtm51sT5__b>LfWPy^nwUR& zd~M9%TV6NppKSY)zn6fRzmpUO{GkDVaKP`2EuDGc#g~4^LgeE6+#6$GK})>lwo(Ua ztna1UC&kz_S~9JI>x5VLYscFM{hj4CaeuUJu*2UO_iM45^Y!dbQh!6(ow0MGNj*rvE-@)q+eh>R*L6DTihQy?v44i za(mVvqUh=2NDq0!ZUQ-rmUJI$OSH;U+<(gB{hp_zX{r#<4*LCC_}fK&B^Shfyq(g^ zb8%>OCK%@X9btD1>?pz{j}SMF0@Zf*_DbUjW8S83fWY|~*I?qMk!Ip0hGybr{Pkni z(C6u{O~IpL^o|xdhP`Z^&|2Mi8D^$YysV=UB*e=$w7~r>a8ymBc-b|LAR%5pJFACK zH*E^eYe%Sf*=JTO*Kn+&M)9)i8o)V1JnV)V-e2n>o;oh!$Eo8{<~J{D3FBUNqf}ef zdfDbx_qcJkzQ%cfj%&6zFu%z0#^?Hj(ARjo`r>7uTMf|NpXt|ZR^DuZztaMLzXgsZ zag9=Ma-ZDF@p`?TBYVgo$LsaR_YuNJ32zqXIM=V&;WYQc*n=Fe*WoFFPjkHPN$y>< zE&P|be!V_rJl|@ef3gMsgBJLYTj0NHfxkfbHA{-7%awc=Xz`(CjGESTK3)7+zKnD}Wf&}y7>wew z9hV+lb}(aCV$VPBNLk25aX|qsZQ-=!~%Vg$U#%kmdpTtJ(JC%vI zA)`ge^~6v{@LgF?471E!F< z&BN3k##gU_KM=(8CHh8{qkBzj#4=}?VbI5X>X4C|K4eTKGg__`~TW_3x%W1p1gGiBA9|0j@sp z6h|BJ3kn{lzVx%K;I}Dw(Bllizlskictp|vs)Bz}!R5Ol{HXX*MgI$mKK5M*^i_OG z!J{-L@uwKp>0^;3)S?*ga*_o5?26D@eLj-=rI7y|qgyyslxIs)FI;E#(w@bwD*GX<}o zx^&JcxLo6aq9XtBBXb2juHXRxLU0a4pszmfqJq~?W5%v3INs%J5-HBlSjht{QnU(A zJ1u*bIcKp*I%y?Y=Xtt2+K~2a)55=bQ2z z!QW%EEJCT7F>^F4xx8gYcI}?Hjh}JCsX1*-(ch%a+T{NK9qf@P8Fg*ITR$#MM3h%; zWDE6xscQ~{{kV{*@Bg^ha8U$%F7|A<{ZHLQ!p03_F9)_=jLSya%Y8%Q(q6XxG=RSQ z`7a0s?2)QSJBi^O!dFVa1Vp9QMBa>lR`7q+{I4bBX8ijE ze-sZvvW0$t-26AT;D1u^tA7uHANTWL*Mk4Mg1?u>A>hY(>gJzl!T)WM_+2no#LYj} zf`1V&JtXS$<9*7_pA!7rxpw{XoZwH_A>NbrWX9!ii}<7B1@9K2CmVPCg%`yKO H*Dd=GPe-S= literal 0 HcmV?d00001 diff --git a/dist/TADdyn-0.1-py3.6-linux-x86_64.egg b/dist/TADdyn-0.1-py3.6-linux-x86_64.egg new file mode 100644 index 0000000000000000000000000000000000000000..e9d598c51b12575a83528cd71d7468855ba5ede5 GIT binary patch literal 226036 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

bW95Nar5h&aXbaze4xCOJ}G+?uOipS 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%0AU30=TD0$SC%=rL-K- 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 N;HpAe4-DYI{{ffjY+e8W literal 0 HcmV?d00001 diff --git a/dist/TADphys-0.1-py3.6-linux-x86_64.egg b/dist/TADphys-0.1-py3.6-linux-x86_64.egg new file mode 100644 index 0000000000000000000000000000000000000000..ba99db9a56e0f19277aaecd2332d574f1ba36d9f GIT binary patch literal 228680 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�K~SY6oNC1PFFn!$UZsZ|z-jk%fHx!kQxM$&=8 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 z z-Bw)UU;1L4FDZY--VD%y0x<1JJtcN4%UzdvVX_^LtR4AUsI=(190F{gF-7NR+cSwD z&s4FMWGOx>RUQqgF|EM2$JxEUBP=`dv*5`;TilRj>S0ShTCtJbd|n=;fyXB4OMG1f z1|-Iydtx;y$0s6CoD-1zr`RYUDO(&3LgA6Xh*caNk?f$hlej5m4RljhNx$Cz=<``Z z*?KD%l+;TsTbhuxTAl{|`CN8{U>xRyIR*{ON3F+?4?kF|Zkjbn@VX@cLTvqOAsw7j>AM;BHK z-h}yLq|VQF9MXp8qA!?0o=Rhc>F!B&6lu?FOd9RoTE<}A;xaf+?b%Se1H&790lY`x zuKkR7WI*ko5C^XA7@|CtkIfyinfT$#A3~;$nJO>tXe=yMVDh$RmNSqa1Bk^Ar2!Yx zOSoSaB_QWhmj2EB%1(F{@kK&>5F zjW}|AJb34&E`dX0!1oH9mhyzSw`8Y7Umv=B8RfPHpA`CIg?s^E&QkZuS#-YXnZtdv*DSn zkliK$>=}P7ocq?j%v5zxcF5?O>-IhhCa~OeE>b8@`=KjmJK{>0Qs$1x_JA5bed~5N z+g{;s24Ak_pbqbQ2cnf}_YPkdV0YCAQ0VNy(Ogwat=gG23eif=@`_mt?2_?He2C4* zB#v)&uV@a|OVa3@t9L$Bb^0Wg3nw5UDu7FpRh=7ZbiXFaN^z~Kd$ z87n{;q8|%4j*-A;wfPI^({f%`-g4lHULUZmC)Y;<5G4)Fg{zf2HL%B7VHDQ;G0W5O zTmkW{D2{cNunp@I(KGaiwZJC}AhH7vi!*puzAdc<{`Zm87XnhzC58;wl?&MK5IHor z!MARxtc|`H@)CBdg+npuzmPd{97X9H)lF2jPD wK}RLxRhQB<+QSIpd||M9%LM4T-%hOKe%upfBnb4k`i@2Y9I={2B&$r=X;_TDul|E?MOv^I=1F8S@CWJ?T*cf~JQ@Qpm$7iP zDR?R>1Lri5DJGuO!W5#L61@|#!A-u#piDhtCfftOUGzDhJN08|uO3Q<;8(_f>C%Nt z;zL!u=`z066vWb$oLOJqQ18E

`kw3odS&Dt`9%W}zpE83uQE?xzVGhyHKNqYC2R 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 T2JsB|*96>cSepYgI_Q4@h47y2 literal 0 HcmV?d00001 diff --git a/dist/Tadphys-0.1-py3.6-linux-x86_64.egg b/dist/Tadphys-0.1-py3.6-linux-x86_64.egg new file mode 100644 index 0000000000000000000000000000000000000000..e3e61304d322a0a8cf001b13f9925da2e6cdf1a4 GIT binary patch literal 448747 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

Mq46M)?p(Ah#3k6W8npq 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

bW95Nar5h&aXbaze4xCOJ}G+?uOipS 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%0AU30=TD0$SC%=rL-K- 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 N;HpAe4-DYI{{ffjY+e8W diff --git a/dist/TADphys-0.1-py3.6-linux-x86_64.egg b/dist/TADphys-0.1-py3.6-linux-x86_64.egg index ba99db9a56e0f19277aaecd2332d574f1ba36d9f..3f4ec5fc46381ac5d6178b0096945340f37df368 100644 GIT binary patch delta 36060 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�i!J-#VR5cYG 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 delta 36398 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 diff --git a/setup.py b/setup.py index 3ca23d2..8b69d25 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ def main(): setup( name = 'TADphys', version = '0.1', - author = 'Marco Di Stefano, David Castillo', + author = 'Marco Di Stefano', author_email = 'marco.di.distefano.1985@gmail.com', ext_modules = [squared_distance_matrix_module], packages = ['tadphys', 'tadphys.utils', diff --git a/tadphys/__init__.py~ b/tadphys/__init__.py~ deleted file mode 100644 index b66bc93..0000000 --- a/tadphys/__init__.py~ +++ /dev/null @@ -1,72 +0,0 @@ -from future import standard_library -standard_library.install_aliases() -from os import environ -from subprocess import Popen, PIPE, check_call, CalledProcessError - -from taddyn._version import __version__ - -# ## Check if we have X display http://stackoverflow.com/questions/8257385/automatic-detection-of-display-availability-with-matplotlib -# if not "DISPLAY" in environ: -# import matplotlib -# matplotlib.use('Agg') -# else: -# try: -# check_call('python -c "import matplotlib.pyplot as plt; plt.figure()"', -# shell=True, stdout=PIPE, stderr=PIPE) -# except CalledProcessError: -# import matplotlib -# matplotlib.use('Agg') - -def get_dependencies_version(dico=False): - """ - Check versions of TADdyn and all dependencies, as well and retrieves system - info. May be used to ensure reproducibility. - :returns: string with description of versions installed - """ - versions = {' TADdyn': __version__ + '\n\n'} - - try: - import scipy - versions['scipy'] = scipy.__version__ - except ImportError: - versions['scipy'] = 'Not found' - - try: - import numpy - versions['numpy'] = numpy.__version__ - except ImportError: - versions['numpy'] = 'Not found' - try: - import matplotlib - versions['matplotlib'] = matplotlib.__version__ - except ImportError: - versions['matplotlib'] = 'Not found' - try: - mcl, _ = Popen(['mcl', '--version'], stdout=PIPE, - stderr=PIPE, universal_newlines=True).communicate() - versions['MCL'] = mcl.split()[1] - except: - versions['MCL'] = 'Not found' - - try: - uname, err = Popen(['uname', '-rom'], stdout=PIPE, - stderr=PIPE, universal_newlines=True).communicate() - versions[' Machine'] = uname - except: - versions[' Machine'] = 'Not found' - - if dico: - return versions - else: - return '\n'.join(['%15s : %s' % (k, versions[k]) for k in - sorted(versions.keys())]) - - -from taddyn.chromosome import Chromosome -from taddyn.experiment import Experiment, load_experiment_from_reads -from taddyn.chromosome import load_chromosome -# from taddyn.modelling.structuralmodels import StructuralModels -# from taddyn.modelling.structuralmodels import load_structuralmodels -# from taddyn.utils.hic_parser import load_hic_data_from_reads -# from taddyn.utils.hic_parser import load_hic_data_from_bam -from taddyn.utils.hic_parser import read_matrix diff --git a/tadphys/chromosome.py~ b/tadphys/chromosome.py~ deleted file mode 100644 index ff485dc..0000000 --- a/tadphys/chromosome.py~ +++ /dev/null @@ -1,1009 +0,0 @@ -""" -26 Nov 2012 - -""" - -from string import ascii_lowercase as letters -from copy import deepcopy as copy -from Pickle import load, dump -from random import random -from math import sqrt -from sys import stderr -from os.path import exists -import tadphys -from tadphys.experiment import Experiment -# from tadphys.alignment import Alignment, randomization_test - -try: - import matplotlib.pyplot as plt -except ImportError: - stderr.write('matplotlib not found\n') - - -def load_chromosome(in_f, fast=2): - """ - Load a Chromosome object from a file. A Chromosome object can be saved with - the :func:`Chromosome.save_chromosome` function. - - :param in_f: path to a saved Chromosome object file - :param 2 fast: if fast=2 do not load the Hi-C data (in the case that they - were saved in a separate file see :func:`Chromosome.save_chromosome`). - If fast is equal to 1, the weights will be skipped from load to save - memory. Finally if fast=0, both the weights and Hi-C data will be loaded - - :returns: a Chromosome object - - TODO: remove first try/except type error... this is loading old experiments - """ - dico = load(open(in_f)) - name = '' - crm = Chromosome(dico['name']) - try: - exp_order = dico['experiment_order'] - except KeyError: - exp_order = dico['experiments'].keys() - for name in exp_order: - xpr = Experiment(name, dico['experiments'][name]['resolution'], - no_warn=True) - xpr.tads = dico['experiments'][name]['tads'] - xpr.norm = dico['experiments'][name]['wght'] - xpr.hic_data = dico['experiments'][name]['hi-c'] - xpr.conditions = dico['experiments'][name]['cond'] - xpr.size = dico['experiments'][name]['size'] - xpr._zeros = dico['experiments'][name].get('zero', {}) - try: # new in version post-CSDM13 - xpr.identifier = dico['experiments'][name]['iden'] - xpr.cell_type = dico['experiments'][name]['cell'] - xpr.exp_type = dico['experiments'][name]['expt'] - xpr.enzyme = dico['experiments'][name]['enzy'] - xpr.description = dico['experiments'][name]['desc'] - except KeyError: - xpr.identifier = None - xpr.cell_type = None - xpr.exp_type = None - xpr.enzyme = None - xpr.description = {} - try: - crm.experiments.append(xpr) - except TypeError: - continue - crm.size = dico['size'] - crm.r_size = dico['r_size'] - crm.max_tad_size = dico['max_tad_size'] - crm.forbidden = dico['forbidden'] - crm._centromere = dico['_centromere'] - try: # new in version post-CSDM13 - crm.species = dico['species'] - crm.assembly = dico['assembly'] - crm.description = dico['description'] - except KeyError: - crm.species = None - crm.assembly = None - crm.description = {} - if isinstance(dico['experiments'][name]['hi-c'], str) or fast != int(2): - try: - dicp = load(open(in_f + '_hic')) - for name in dico['experiments']: - crm.get_experiment(name).hic_data = dicp[name]['hi-c'] - if fast != 1: - crm.get_experiment(name).norm = dicp[name]['wght'] - except IOError: - try: - for name in dico['experiments']: - crm.get_experiment(name).hic_data = dico['experiments'][name]['hi-c'] - if fast != 1: - crm.get_experiment(name).norm = dico['experiments'][name]['wght'] - except KeyError: - raise Exception('ERROR: file %s not found\n' % ( - dico['experiments'][name]['hi-c'])) - elif not fast: - stderr.write('WARNING: data not saved correctly for fast loading.\n') - return crm - - -class Chromosome(object): - """ - A Chromosome object designed to deal with Topologically Associating Domains - predictions from different experiments, in different cell types for a given - chromosome of DNA, and to compare them. - - :param name: name of the chromosome (might be a chromosome name for example) - :param None species: species name - :param None assembly: version number of the genomic assembly used - :param None resolutions: list of resolutions corresponding to a list of - experiments passed. - :param None experiment_hic_data: :py:func:`list` of paths to files - containing the Hi-C count matrices corresponding to different experiments - :param None experiment_tads: :py:func:`list` of paths to files - containing the definition of TADs corresponding to different experiments - :param None experiment_names: :py:func:`list` of the names of each - experiment - :param infinite max_tad_size: maximum TAD size allowed. TADs longer than - this value will not be considered, and size of the corresponding - chromosome size will be reduced accordingly - :param 0 chr_len: size of the DNA chromosome in bp. By default it will be - inferred from the distribution of TADs - :param None parser: a parser function that returns a tuple of lists - representing the data matrix and the length of a row/column. With - the file example.tsv: - - :: - - chrT_001 chrT_002 chrT_003 chrT_004 - chrT_001 629 164 88 105 - chrT_002 164 612 175 110 - chrT_003 88 175 437 100 - chrT_004 105 110 100 278 - - the output of parser('example.tsv') would be be: - ``[([629, 164, 88, 105, 164, 612, 175, 110, 88, 175, 437, 100, 105, - 110, 100, 278]), 4]`` - :param None kw_descr: any other argument passed would be stored as - complementary descriptive field. For example:: - - crm = Chromosome('19', species='mus musculus', - subspecies='musculus musculus', - skin_color='black') - print crm - - # Chromosome 19: - # 0 experiment loaded: - # 0 alignment loaded: - # species : mus musculus - # assembly version: UNKNOWN - # subspecies : musculus musculus - # skin_color : black - - *note that these fields may appear in the header of generated out files* - - :return: Chromosome object - - - """ - def __init__(self, name, species=None, assembly=None, - experiment_resolutions=None, experiment_tads=None, - experiment_hic_data=None, experiment_norm_data=None, - experiment_names=None, max_tad_size=float('inf'), - chr_len=0, parser=None, centromere_search=False, - silent=False, **kw_descr): - self.name = name - self.size = self._given_size = self.r_size = chr_len - self.size = ChromosomeSize(self.size) - self.max_tad_size = max_tad_size - self.r_size = RelativeChromosomeSize(self.size) - self.forbidden = {} # only used for TAD alignment randomization - self.experiments = ExperimentList([], self) - self._centromere = None - self.alignment = AlignmentDict() - self.description = kw_descr - self.species = species - self.assembly = assembly - - self._search_centromere = centromere_search - if experiment_tads: - for i, handler in enumerate(experiment_tads or []): - name = experiment_names[i] if experiment_names else None - self.add_experiment(name, experiment_resolutions[i], - tad_def=handler, parser=parser) - if experiment_hic_data: - for i, handler in enumerate(experiment_hic_data or []): - name = experiment_names[i] if experiment_names else None - try: - xpr = self.get_experiment(name) - xpr.load_hic_data(handler, silent=silent) - continue - except: - pass - if isinstance(handler, Experiment): - handler.name = name or handler.name - self.experiments.append(handler) - else: - self.add_experiment(name, experiment_resolutions[i], - hic_data=handler, parser=parser, - silent=silent) - if experiment_norm_data: - for i, handler in enumerate(experiment_norm_data or []): - name = experiment_names[i] if experiment_names else None - try: - xpr = self.get_experiment(name) - xpr.load_norm_data(handler, silent=silent) - continue - except: - pass - if isinstance(handler, Experiment): - handler.name = name or handler.name - self.experiments.append(handler) - else: - self.add_experiment(name, experiment_resolutions[i], - norm_data=handler, parser=parser, - silent=silent) - - def __repr__(self): - outstr = 'Chromosome %s:\n' % self.name - outstr += (' %-2s experiment%s loaded: ' % ( - len(self.experiments), 's' * (len(self.experiments) > 0)) + - ', '.join([e.name for e in self.experiments]) + '\n') - outstr += (' %-2s alignment%s loaded: ' % ( - len(self.alignment), 's' * (len(self.alignment) > 0)) + - ', '.join([a.name for a in self.alignment]) + '\n') - try: # new in version post-CSDM13 - outstr += ' species : %s\n' % (self.species or 'UNKNOWN') - outstr += ' assembly version: %s\n' % (self.assembly or 'UNKNOWN') - for desc in self.description: - outstr += ' %-16s: %s\n' % (desc, self.description[desc]) - except AttributeError: - pass - return outstr - - - def _get_forbidden_region(self, xpr, resized=False): - """ - Find the regions for which there is no information in any of the - experiments. This is used to infer the relative chromosome size. - """ - if not xpr.tads: - return - forbidden = [] - for pos in xpr.tads: - start = float(xpr.tads[pos]['start']) - end = float(xpr.tads[pos]['end']) - diff = end - start - if diff * xpr.resolution > self.max_tad_size: - forbidden += range(int(start), int(end+1)) - xpr.tads[pos]['score'] = -abs(xpr.tads[pos]['score']) - else: - xpr.tads[pos]['score'] = abs(xpr.tads[pos]['score']) - if not self.forbidden: - self.forbidden = dict([(f, None) for f in forbidden]) - else: - self.forbidden = dict([(f, None) for f in - set(forbidden).intersection(self.forbidden)]) - # search for centromere: - if self._search_centromere: - self._find_centromere(xpr) - # add centromere as forbidden region: - if self._centromere: - for pos in xrange(int(self._centromere[0]), - int(self._centromere[1])): - self.forbidden[pos] = 'Centromere' - if not resized: - self.__update_size(xpr) - - - def get_experiment(self, name): - """ - Fetch an Experiment according to its name. - This can also be done directly with Chromosome.experiments[name]. - - :param name: name of the experiment to select - :returns: :class:`tadphys.Experiment` - """ - for exp in self.experiments: - if exp.name == name: - return exp - raise Exception(('ERROR: experiment ' + - '%s not found\n') % (name)) - - - def save_chromosome(self, out_f, fast=True, divide=True, force=False): - """ - Save a Chromosome object to a file (it uses :py:func:`pickle.load` from - the :py:mod:`cPickle`). Once saved, the object can be loaded with - :func:`load_chromosome`. - - :param out_f: path to the file where to store the :py:mod:`cPickle` - object - :param True fast: if True, skip Hi-C data and weights - :param True divide: if True writes two pickles, one with what would - result by using the fast option, and the second with the Hi-C and - weights data. The second file name will be extended by '_hic' (ie: - with out_f='chromosome12.pik' we would obtain chromosome12.pik and - chromosome12.pik_hic). When loaded :func:`load_chromosome` will - automatically search for both files - :param False force: overwrite the existing file - - """ - while exists(out_f) and not force: - out_f += '_' - dico = {'experiments': {}, - 'experiment_order': [xpr.name for xpr in self.experiments]} - if divide: - dicp = {} - for xpr in self.experiments: - dico['experiments'][xpr.name] = { - 'size' : xpr.size, - 'cond' : xpr.conditions, - 'tads' : xpr.tads, - 'resolution': xpr.resolution, - 'hi-c' : None, - 'wght' : None, - 'iden' : xpr.identifier, - 'cell' : xpr.cell_type, - 'expt' : xpr.exp_type, - 'enzy' : xpr.enzyme, - 'desc' : xpr.description, - 'zero' : xpr._zeros - } - if fast: - continue - if divide: - dicp[xpr.name] = { - 'wght': xpr.norm, - 'hi-c': xpr.hic_data} - dico['experiments'][xpr.name]['wght'] = None - dico['experiments'][xpr.name]['hi-c'] = None - else: - dico['experiments'][xpr.name]['wght'] = xpr.norm - dico['experiments'][xpr.name]['hi-c'] = xpr.hic_data - dico['name'] = self.name - dico['size'] = self.size - dico['r_size'] = self.r_size - dico['max_tad_size'] = self.max_tad_size - dico['forbidden'] = self.forbidden - dico['_centromere'] = self._centromere - dico['species'] = self.species - dico['assembly'] = self.assembly - dico['description'] = self.description - out = open(out_f, 'w') - dump(dico, out) - out.close() - if not fast and divide: - out = open(out_f + '_hic', 'w') - dump(dicp, out) - out.close() - - # def align_experiments(self, names=None, verbose=False, randomize=False, - # rnd_method='interpolate', rnd_num=1000, - # get_score=False, **kwargs): - # """ - # Align the predicted boundaries of two different experiments. The - # resulting alignment will be stored in the self.experiment list. - - # :param None names: list of names of the experiments to align. If None, - # align all - # :param experiment1: name of the first experiment to align - # :param experiment2: name of the second experiment to align - # :param -0.1 penalty: penalty for inserting a gap in the alignment - # :param 100000 max_dist: maximum distance between two boundaries - # allowing match (100Kb seems fair with HUMAN chromosomes) - # :param False verbose: if True, print some information about the - # alignments - # :param False randomize: check the alignment quality by comparing - # randomized boundaries over Chromosomes of the same size. This will - # return a extra value, the p-value of accepting that the observed - # alignment is not better than a random alignment - # :param False get_score: returns alignemnt object, alignment score and - # percentage of identity from one side and from the other - # :param interpolate rnd_method: by default uses the interpolation of TAD - # distribution. The alternative method is 'shuffle', where TADs are - # simply shuffled - # :param 1000 rnd_num: number of randomizations to do - # :param reciprocal method: if global, Needleman-Wunsch is used to align - # (see :func:`tadphys.boundary_aligner.globally.needleman_wunsch`); - # if reciprocal, a method based on reciprocal closest boundaries is - # used (see :func:`tadphys.boundary_aligner.reciprocally.reciprocal`) - - # :returns: an alignment object or, if the randomizattion was invoked, - # an alignment object, and a list of statistics that are, the alignment - # score, the probability that observed alignment performs better than - # randoms, the proportion of borders from the first experiment found - # aligned in the second experiment and the proportion of borders from - # the second experiment found aligned in the first experiment. - # Returned calues can be catched like this: - - # ali = crm.align_experiments() - - # or, with randomization test: - - # ali, (score, pval, prop1, prop2) = crm.align_experiments(randomize=True) - - # """ - # if names: - # xpers = ExperimentList([self.get_experiment(n) for n in names], - # self) - # else: - # xpers = self.experiments - # tads = [] - # for xpr in xpers: - # if not xpr.tads: - # raise Exception('No TADs defined, use find_tad function.\n') - # tads.append([xpr.tads[x]['brk'] * xpr.resolution for x in xpr.tads - # if xpr.tads[x]['score'] >= 0]) - # (aligneds, score, perc1, perc2), consensus = align(tads, verbose=verbose, **kwargs) - # name = tuple(sorted([x.name for x in xpers])) - # ali = Alignment(name, aligneds, xpers, consensus, score=score) - # self.alignment[name] = ali - # if verbose: - # print self.alignment[name] - # if not randomize: - # if get_score: - # return ali, score, perc1, perc2 - # else: - # return ali - # p_value = randomization_test(xpers, score=score, rnd_method=rnd_method, - # verbose=verbose, r_size=self.r_size, - # num=rnd_num, **kwargs) - # return ali, (score, p_value, perc1, perc2) - - - def add_experiment(self, name, resolution=None, tad_def=None, hic_data=None, - norm_data=None, replace=False, parser=None, - conditions=None, **kwargs): - """ - Add a Hi-C experiment to Chromosome - - :param name: name of the experiment or of the Experiment object - :param resolution: resolution of the experiment (needed if name is not - an Experiment object) - :param None hic_data: whether a file or a list of lists corresponding to - the Hi-C data - :param None tad_def: a file or a dict with precomputed TADs for this - experiment - :param False replace: overwrite the experiments loaded under the same - name - :param None parser: a parser function that returns a tuple of lists - representing the data matrix and the length of a row/column. With - a file example.tsv containing: - - :: - - chrT_001 chrT_002 chrT_003 chrT_004 - chrT_001 629 164 88 105 - chrT_002 164 612 175 110 - chrT_003 88 175 437 100 - chrT_004 105 110 100 278 - - the output of parser('example.tsv') would be: - ``[([629, 164, 88, 105, 164, 612, 175, 110, 88, 175, 437, 100, 105, - 110, 100, 278]), 4]`` - - """ - if not name: - name = ''.join([letters[int(random() * len(letters))] \ - for _ in xrange(5)]) - stderr.write('WARNING: No name provided, random name ' + - 'generated: %s\n' % (name)) - if name in self.experiments: - if 'hi-c' in self.get_experiment(name) and not replace: - stderr.write( - '''WARNING: Hi-C data already loaded under the name: %s. - This experiment will be kept under %s.\n''' % (name, - name + '_')) - name += '_' - if isinstance(name, Experiment): - self.experiments.append(name) - elif resolution: - self.experiments.append(Experiment( - name, resolution, hic_data=hic_data, norm_data=norm_data, - tad_def=tad_def, parser=parser, conditions=conditions, - **kwargs)) - else: - raise Exception('resolution param is needed\n') - - - # def find_tad(self, experiments, name=None, n_cpus=1, - # verbose=True, max_tad_size="max", heuristic=True, - # batch_mode=False, **kwargs): - # """ - # Call the :func:`tadphys.tadbit.tadbit` function to calculate the - # position of Topologically Associated Domain boundaries - - # :param experiment: A square matrix of interaction counts of Hi-C - # data or a list of such matrices for replicated experiments. The - # counts must be evenly sampled and not normalized. 'experiment' - # can be either a list of lists, a path to a file or a file handler - # :param True normalized: if False simple normalization will be computed, - # as well as a simple column filtering will be applied (remove columns - # where value at the diagonal is null) - # :param 1 n_cpus: The number of CPUs to allocate to TADbit. If - # n_cpus='max' the total number of CPUs will be used - # :param max max_tad_size: an integer defining the maximum size of a - # TAD. Default (auto) defines it as the number of rows/columns - # :param True heuristic: whether to use or not some heuristics - # :param False batch_mode: if True, all the experiments will be - # concatenated into one for the search of TADs. The resulting TADs - # found are stored under the name 'batch' plus a concatenation of the - # experiment names passed (e.g.: if experiments=['exp1', 'exp2'], the - # name would be: 'batch_exp1_exp2'). - - # """ - # experiments = experiments or self.experiments - # if not isinstance(experiments, list): - # experiments = [experiments] - # xprs = [] - # for xpr in experiments: - # if not isinstance(xpr, Experiment): - # xpr = self.get_experiment(xpr) - # xprs.append(xpr) - # # if normalized and (not xpr._zeros or not xpr._normalization): - # # raise Exception('ERROR: Experiments should be normalized, and' + - # # ' filtered first') - # if len(xprs) <= 1 and batch_mode: - # raise Exception('ERROR: batch_mode implies that more than one ' + - # 'experiment is passed') - # if batch_mode: - # matrix = [] - # if not name: - # name = 'batch' - # resolution = xprs[0].resolution - # for xpr in sorted(xprs, key=lambda x: x.name): - # if xpr.resolution != resolution: - # raise Exception('All Experiments must have the same ' + - # 'resolution\n') - # matrix.append(xpr.hic_data[0]) - # if name.startswith('batch'): - # name += '_' + xpr.name - # siz = xprs[0].size - # tmp = reduce(lambda x, y: x.__add__(y, silent=True), xprs) - # tmp.filter_columns(silent=kwargs.get('silent', False)) - # remove = tuple([1 if i in tmp._zeros else 0 - # for i in xrange(siz)]) - # result = tadbit(matrix, - # remove=remove, - # n_cpus=n_cpus, verbose=verbose, - # max_tad_size=max_tad_size, - # no_heuristic=not heuristic, **kwargs) - # xpr = Experiment(name, resolution, hic_data=matrix, - # tad_def=result, **kwargs) - # xpr._zeros = xprs[0]._zeros - # for other in xprs[1:]: - # xpr._zeros = dict([(k, None) for k in - # set(xpr._zeros.keys()).intersection( - # other._zeros.keys())]) - # self.add_experiment(xpr) - # return - # for xpr in xprs: - # result = tadbit( - # xpr.hic_data, - # remove=tuple([1 if i in xpr._zeros else 0 for i in - # xrange(xpr.size)]), - # n_cpus=n_cpus, verbose=verbose, - # max_tad_size=max_tad_size, - # no_heuristic=not heuristic, **kwargs) - # xpr.load_tad_def(result) - # self._get_forbidden_region(xpr) - - def __update_size(self, xpr): - """ - Update the chromosome size and relative size after loading new Hi-C - experiments, unless the Chromosome size was defined by hand. - - """ - if not self._given_size: - self.size = max(xpr.tads[max(xpr.tads)]['end'] * xpr.resolution, - self.size) - self.size = ChromosomeSize(self.size) - self._get_forbidden_region(xpr, resized=True) - - self.r_size = self.size - len(self.forbidden) * xpr.resolution - self.r_size = RelativeChromosomeSize(self.size) - - - # def tad_density_plot(self, name, axe=None, focus=None, extras=None, - # normalized=True, savefig=None, shape='ellipse'): - # """ - # Draw an summary of the TAD found in a given experiment and their density - # in terms of relative Hi-C interaction count. - - # :param name: name of the experiment to visualize - # :param None focus: can pass a tuple (bin_start, bin_stop) to display the - # alignment between these genomic bins - # :param None extras: list of coordinates (genomic bin) where to draw a - # red cross - # :param None ymax: limit the y axis up to a given value - # :param ('grey', ): successive colors for alignment - # :param True normalized: normalized Hi-C count are plotted instead of raw - # data. - # :param 'ellipse' shape: which kind of shape to use as schematic - # representation of TADs. Implemented: 'ellipse', 'rectangle', - # 'triangle' - # :param None savefig: path to a file where to save the image generated; - # if None, the image will be shown using matplotlib GUI (the extension - # of the file name will determine the desired format). - # """ - # if not self.experiments[name].tads: - # raise Exception("TAD borders not found\n") - # _tad_density_plot(self.experiments[name], axe=axe, focus=focus, - # extras=extras, normalized=normalized, - # savefig=savefig, shape=shape) - - - # def visualize(self, names=None, tad=None, focus=None, paint_tads=False, - # axe=None, show=True, logarithm=True, normalized=False, - # relative=True, decorate=True, savefig=None, clim=None, - # scale=(8, 6), cmap='jet'): - # """ - # Visualize the matrix of Hi-C interactions of a given experiment - - # :param None names: name of the experiment to visualize, or list of - # experiment names. If None, all experiments will be shown - # :param None tad: a given TAD in the form: - # :: - - # {'start': start, - # 'end' : end, - # 'brk' : end, - # 'score': score} - - # **Alternatively** a list of the TADs can be passed (all the TADs - # between the first and last one passed will be showed. Thus, passing - # more than two TADs might be superfluous) - # :param None focus: a tuple with the start and end positions of the - # region to visualize - # :param False paint_tads: draw a box around the TADs defined for this - # experiment - # :param None axe: an axe object from matplotlib can be passed in order - # to customize the picture - # :param True show: either to pop-up matplotlib image or not - # :param True logarithm: show the logarithm values - # :param True normalized: show the normalized data (weights might have - # been calculated previously). *Note: white rows/columns may appear in - # the matrix displayed; these rows correspond to filtered rows (see* - # :func:`tadphys.utils.hic_filtering.hic_filtering_for_modelling` *)* - # :param True relative: color scale is relative to the whole matrix of - # data, not only to the region displayed - # :param True decorate: draws color bar, title and axes labels - # :param None savefig: path to a file where to save the image generated; - # if None, the image will be shown using matplotlib GUI (the extension - # of the file name will determine the desired format). - # :param None clim: tuple with minimum and maximum value range for color - # scale. I.e. clim=(-4, 10) - # :param 'jet' cmap: color map from matplotlib. Can also be a - # preconfigured cmap object. - # """ - # if names == None: - # names = [xpr.name for xpr in self.experiments] - # if not isinstance(names, list) and not isinstance(names, tuple): - # names = [names] - # cols = 1 - # rows = 1 - # else: - # sqrtxpr = sqrt(len(names)) - # cols = int(round(sqrtxpr + (0.0 if int(sqrtxpr)==sqrtxpr else .5))) - # rows = int(sqrtxpr+.5) - # notaxe = axe == None - # if not scale: - # scale = (8, 6) - # if notaxe and len(names) != 1: - # fig = plt.figure(figsize=(scale[0] * cols, scale[1] * rows)) - # for i in xrange(rows): - # for j in xrange(cols): - # if i * cols + j >= len(names): - # break - # if notaxe and len(names) != 1: - # axe = fig.add_subplot( - # rows, cols, i * cols + j + 1) - # if (isinstance(names[i * cols + j], tuple) or - # isinstance(names[i * cols + j], list)): - # if not axe: - # fig = plt.figure(figsize=(scale[0] * cols, scale[1] * rows)) - # axe = fig.add_subplot( - # rows, cols, i * cols + j + 1) - # xpr1 = self.get_experiment(names[i * cols + j][0]) - # xpr2 = self.get_experiment(names[i * cols + j][1]) - # img = xpr1.view(tad=tad, focus=focus, paint_tads=paint_tads, - # axe=axe, show=False, logarithm=logarithm, - # normalized=normalized, relative=relative, - # decorate=decorate, savefig=False, - # where='up', clim=clim, cmap=cmap) - # img = xpr2.view(tad=tad, focus=focus, paint_tads=paint_tads, - # axe=axe, show=False, logarithm=logarithm, - # normalized=normalized, relative=relative, - # decorate=False, savefig=False, where='down', - # clim=clim or img.get_clim(), cmap=cmap) - # #axe = axe.twinx() - # #axe.set_aspect('equal',adjustable='box-forced',anchor='NE') - # if decorate: - # plt.text(1.01, .5, - # 'Chromosome %s experiment %s' % ( - # self.name, xpr2.name), - # rotation=-90, va='center', size='large', - # ha='left', transform=axe.transAxes) - # else: - # xper = self.get_experiment(names[i * cols + j]) - # if not xper.hic_data and not xper.norm: - # continue - # xper.view(tad=tad, focus=focus, paint_tads=paint_tads, - # axe=axe, show=False, logarithm=logarithm, - # normalized=normalized, relative=relative, - # decorate=decorate, savefig=False, clim=clim, - # cmap=cmap) - # if savefig: - # tadbit_savefig(savefig) - # if show: - # plt.show() - - - # def get_tad_hic(self, tad, x_name, normed=True, matrix_num=0): - # """ - # Retrieve the Hi-C data matrix corresponding to a given TAD. - - # :param tad: a given TAD (:py:class:`dict`) - # :param x_name: name of the experiment - # :param True normed: if True, normalize the Hi-C data - - # :returns: Hi-C data matrix for the given TAD - # """ - # beg, end = int(tad['start']), int(tad['end']) - # xpr = self.get_experiment(x_name) - # size = xpr.size - # matrix = [[0 for _ in xrange(beg, end)]\ - # for _ in xrange(beg, end)] - # for i, tadi in enumerate(xrange(beg, end)): - # tadi = tadi * size - # for j, tadj in enumerate(xrange(beg, end)): - # if normed: - # matrix[j][i] = xpr.norm[0][tadi + tadj] - # else: - # matrix[j][i] = xpr.hic_data[matrix_num][tadi + tadj] - # return matrix - - - # def iter_tads(self, x_name, normed=True): - # """ - # Iterate over the TADs corresponding to a given experiment. - - # :param x_name: name of the experiment - # :param True normed: normalize Hi-C data returned - - # :yields: Hi-C data corresponding to each TAD - # """ - # if not self.get_experiment(x_name).hic_data: - # raise Exception('No Hi-c data for %s experiment\n' % (x_name)) - # for name, ref in self.get_experiment(x_name).tads.iteritems(): - # yield name, self.get_tad_hic(ref, x_name, normed=normed) - - - # def set_max_tad_size(self, value): - # """ - # Change the maximum size allowed for TADs. It also applies to the - # computed experiments. - - # :param value: an int value (default is 5000000) - # """ - # self.max_tad_size = value - # for xpr in self.experiments: - # for tad in xpr.tads: - # xpr.tads[tad]['brk'] = xpr.tads[tad]['end'] - # if ((xpr.tads[tad]['end'] - xpr.tads[tad]['start']) - # * xpr.resolution) > self.max_tad_size: - # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) - - - # def _find_centromere(self, xpr): - # """ - # Search for the centromere in a chromosome, assuming that - # :class:`Chromosome` corresponds to a real chromosome. - # Add a boundary to all the experiments where the centromere is. - # * A centromere is defined as the largest area where the rows/columns - # of the Hi-C matrix are empty. - # """ - # beg = end = 0 - # size = xpr.size - # try: - # hic = xpr.hic_data[0] - # except TypeError: - # return - # # search for largest empty region of the chromosome - # best = (0, 0, 0) - # pos = 0 - # for pos, raw in enumerate(xrange(0, size * size, size)): - # if sum([hic[i] for i in xrange(raw, raw + size)]) == 0 and not beg: - # beg = float(pos) - # if sum([hic[i] for i in xrange(raw, raw + size)]) != 0 and beg: - # end = float(pos) - # if (end - beg) > best[0]: - # best = ((end - beg), beg, end) - # beg = end = 0 - # # this is for weared cases where centromere is at the end of Hi-C data - # if beg and not end: - # end = float(pos) - # if (end - beg) > best[0]: - # best = ((end - beg), beg, end) - # beg, end = best[1:] - # if not beg or not end: - # return - # tads = xpr.tads - # # if we already have a centromere defined, check if it can be reduced - # if self._centromere: - # if beg > self._centromere[0]: - # # readjust TADs that have been split around the centromere - # for tad in tads: - # if tads[tad]['end'] == self._centromere[0]: - # tads[tad]['end'] = beg - # self._centromere[0] = beg - # if end < self._centromere[1]: - # # readjust TADs that have been split around the centromere - # for tad in tads: - # if tads[tad]['start'] == self._centromere[1]: - # tads[tad]['start'] = end - # self._centromere[1] = end - # else: - # self._centromere = [beg, end] - # # split TADs overlapping with the centromere - # if [True for t in tads.values() \ - # if t['start'] < beg < t['end'] \ - # and t['start'] < end < t['end']]: - # tad = len(tads) + 1 - # plus = 0 - # while tad + plus > 1: - # start = tads[tad - 1 + plus]['start'] - # final = tads[tad - 1 + plus]['end'] - # # centromere found? - # if start < beg < final and start < end < final: - # tads[tad] = copy(tads[tad - 1]) - # tads[tad]['start'] = end - # tads[tad]['score'] = abs(tads[tad]['score']) - # if (tads[tad]['end'] - tads[tad]['start']) \ - # * xpr.resolution > self.max_tad_size: - # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) - # tads[tad]['brk'] = tads[tad]['end'] - # tad -= 1 - # tads[tad] = copy(tads[tad]) - # tads[tad]['score'] = abs(tads[tad]['score']) - # tads[tad]['end'] = beg - # if (tads[tad]['end'] - tads[tad]['start']) \ - # * xpr.resolution > self.max_tad_size: - # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) - # tads[tad]['brk'] = tads[tad]['end'] - # plus = 1 - # else: - # tads[tad] = copy(tads[tad - 1 + plus]) - # tad -= 1 - # # if tad includes centromere but starts in the same point - # elif [True for t in tads.values() \ - # if t['start'] == beg and end < t['end']]: - # tad = len(tads) + 1 - # while tad > 1: - # start = tads[tad - 1]['start'] - # final = tads[tad - 1]['end'] - # # centromere found? - # if start == beg: - # tads[tad] = copy(tads[tad - 1]) - # tads[tad]['start'] = end - # tads[tad]['score'] = abs(tads[tad]['score']) - # if (tads[tad]['end'] - tads[tad]['start']) \ - # * xpr.resolution > self.max_tad_size: - # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) - # else: - # tads[tad] = copy(tads[tad - 1]) - # tad -= 1 - # # if tad includes centromere but ends in the same point - # elif [True for t in tads.values() \ - # if t['end'] == end and beg > t['start']]: - # tad = len(tads) + 1 - # plus = 0 - # while tad + plus > 1: - # start = tads[tad - 1 + plus]['start'] - # final = tads[tad - 1 + plus]['end'] - # # centromere found? - # if final == end: - # tads[tad] = copy(tads[tad - 1]) - # tads[tad]['start'] = beg - # tads[tad]['score'] = abs(tads[tad]['score']) - # if (tads[tad]['end'] - tads[tad]['start']) \ - # * xpr.resolution > self.max_tad_size: - # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) - # tads[tad]['brk'] = tads[tad]['end'] - # tad -= 1 - # tads[tad] = copy(tads[tad]) - # tads[tad]['score'] = abs(tads[tad]['score']) - # tads[tad]['end'] = beg - # if (tads[tad]['end'] - tads[tad]['start']) \ - # * xpr.resolution > self.max_tad_size: - # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) - # tads[tad]['brk'] = tads[tad]['end'] - # plus = 1 - # else: - # tads[tad] = copy(tads[tad - 1 + plus]) - # tad -= 1 - - - -class ExperimentList(list): - """ - Inherited from python built in :py:func:`list`, modified for TADbit - :class:`tadphys.Experiment`. - - Mainly, `getitem`, `setitem`, and `append` were modified in order to - be able to search for experiments by index or by name, and to add - experiments simply using Chromosome.experiments.append(Experiment). - - The whole ExperimentList object is linked to a Chromosome instance - (:class:`tadphys.Chromosome`). - - """ - def __init__(self, thing, crm): - super(ExperimentList, self).__init__(thing) - self.crm = crm - - - def __getitem__(self, i): - try: - return super(ExperimentList, self).__getitem__(i) - except TypeError: - for nam in self: - if nam.name == i: - return nam - raise KeyError('Experiment %s not found\n' % (i)) - - - def __setitem__(self, i, exp): - try: - super(ExperimentList, self).__setitem__(i, exp) - exp.crm = self.crm - self.crm._get_forbidden_region(exp) - except TypeError: - for j, nam in enumerate(self): - if nam.name == i: - exp.crm = self.crm - self[j] = exp - self.crm._get_forbidden_region(exp) - break - else: - exp.crm = self.crm - self.append(exp) - self.crm._get_forbidden_region(exp) - - - def __delitem__(self, i): - try: - super(ExperimentList, self).__delitem__(i) - except TypeError: - for j, nam in enumerate(self): - if nam.name == i: - exp = self.pop(j) - del(exp) - break - else: - raise KeyError('Experiment %s not found\n' % (i)) - - - def append(self, exp): - if exp.name in [e.name for e in self]: - self[exp.name] = exp - self.crm._get_forbidden_region(exp) - else: - super(ExperimentList, self).append(exp) - self.crm._get_forbidden_region(exp) - exp.crm = self.crm - - -class AlignmentDict(dict): - """ - :py:func:`dict` of :class:`tadphys.Alignment` - - Modified getitem, setitem, and append in order to be able to search - alignments by index or by name. - - linked to a :class:`tadphys.Chromosome` - """ - - def __getitem__(self, nam): - try: - return super(AlignmentDict, self).__getitem__(tuple(sorted(nam))) - except KeyError: - for i, key in enumerate(self): - if nam == i: - return self[key] - raise TypeError('Alignment %s not found\n' % i) - - -class ChromosomeSize(int): - """ - Simple class inheriting from integer designed to hold chromosome size in - base pairs - """ - def __init__(self, thing): - super(ChromosomeSize, self).__init__(thing) - - -class RelativeChromosomeSize(int): - """ - Relative Chromosome size in base pairs. Equal to Chromosome size minus - forbidden regions (eg: the centromere) - - Only used for TAD alignment randomization. - """ - def __init__(self, thing): - super(RelativeChromosomeSize, self).__init__(thing) diff --git a/tadphys/experiment.py b/tadphys/experiment.py index 0f81f4a..1d5307a 100644 --- a/tadphys/experiment.py +++ b/tadphys/experiment.py @@ -4,26 +4,22 @@ """ -from copy import deepcopy as copy -from sys import stderr -from warnings import warn -from math import isnan -from numpy import log2, array -#from tadphys import HiC_data -from tadphys.modelling.HIC_CONFIG import CONFIG -from tadphys.utils.hic_parser import read_matrix -from tadphys.utils.extraviews import nicer -from tadphys.utils.tadmaths import zscore, nozero_log_matrix -from tadphys.utils.hic_filtering import hic_filtering_for_modelling -# from tadphys.modelling.structuralmodels import StructuralModels +from copy import deepcopy as copy +from sys import stderr +from warnings import warn +from math import isnan +from numpy import log2, array +from tadphys.modelling.HIC_CONFIG import CONFIG +from tadphys.utils.hic_parser import read_matrix +from tadphys.utils.extraviews import nicer +from tadphys.utils.tadmaths import zscore, nozero_log_matrix +from tadphys.utils.hic_filtering import hic_filtering_for_modelling from collections import OrderedDict try: - from tadphys.modelling.impoptimizer import IMPoptimizer - # from tadphys.modelling.imp_modelling import generate_3d_models from tadphys.modelling.lammps_modelling import generate_lammps_models except ImportError: - stderr.write('IMP not found, check PYTHONPATH\n') + pass try: import matplotlib.pyplot as plt diff --git a/tadphys/experiment.py~ b/tadphys/experiment.py~ deleted file mode 100644 index e8be43a..0000000 --- a/tadphys/experiment.py~ +++ /dev/null @@ -1,1749 +0,0 @@ -""" -20 Feb 2013 - - -""" - -from copy import deepcopy as copy -from sys import stderr -from warnings import warn -from math import isnan -from numpy import log2, array -#from taddyn import HiC_data -from taddyn.modelling.HIC_CONFIG import CONFIG -from taddyn.utils.hic_parser import read_matrix -from taddyn.utils.extraviews import nicer -from taddyn.utils.tadmaths import zscore, nozero_log_matrix -from taddyn.utils.hic_filtering import hic_filtering_for_modelling -# from taddyn.modelling.structuralmodels import StructuralModels -from collections import OrderedDict - -try: - from taddyn.modelling.impoptimizer import IMPoptimizer - # from taddyn.modelling.imp_modelling import generate_3d_models - from taddyn.modelling.lammps_modelling import generate_lammps_models -except ImportError: - stderr.write('IMP not found, check PYTHONPATH\n') - -try: - import matplotlib.pyplot as plt - from matplotlib.cm import jet -except ImportError: - stderr.write('matplotlib not found\n') - - -def load_experiment_from_reads(name, fnam, genome_seq, resolution, - conditions=None, identifier=None, cell_type=None, - enzyme=None, exp_type='Hi-C', **kw_descr): - """ - Loads an experiment object from TADbit-generated read files, that are lists - of pairs of reads mapped to a reference genome. - - :param fnam: tsv file with reads1 and reads2 - :param name: name of the experiment - :param resolution: the resolution of the experiment (size of a bin in - bases) - :param None identifier: some identifier relative to the Hi-C data - :param None cell_type: cell type on which the experiment was done - :param None enzyme: restriction enzyme used in the Hi-C experiment - :param Hi-C exp_type: name of the experiment used (currently only Hi-C is - supported) - :param None conditions: :py:func:`list` of experimental conditions, e.g. - the cell type, the enzyme... (i.e.: ['HindIII', 'cortex', 'treatment']). - This parameter may be used to compare the effect of this conditions on - the TADs - :param None kw_descr: any other argument passed would be stored as - complementary descriptive field. For example:: - - exp = Experiment('k562_rep2', resolution=100000, - identifier='SRX015263', cell_type='K562', - enzyme='HindIII', cylce='synchronized') - print exp - - # Experiment k562_rep2: - # resolution : 100Kb - # TADs : None - # Hi-C rows : None - # normalized : None - # identifier : SRX015263 - # cell type : K562 - # restriction enzyme: HindIII - # cylce : synchronized - - *note that these fields may appear in the header of generated out files* - """ - size = 0 - section_sizes = {} - sections = [] - for crm in genome_seq: - len_crm = int(float(len(genome_seq[crm])) / resolution + 1) - section_sizes[(crm,)] = len_crm - size += len_crm + 1 - sections.extend([(crm, '%04d' % i) for i in xrange(len_crm + 1)]) - imx = HiC_data((), size) - dict_sec = dict([(j, i) for i, j in enumerate(sections)]) - for line in open(fnam): - _, cr1, ps1, _, _, _, _, cr2, ps2, _ = line.split('\t', 9) - ps1 = dict_sec[(cr1, '%04d' % (int(ps1) / resolution))] - ps2 = dict_sec[(cr2, '%04d' % (int(ps2) / resolution))] - imx[ps1 + ps2 * size] += 1 - imx[ps2 + ps1 * size] += 1 - - return Experiment(name, resolution=resolution, hic_data=imx, - conditions=conditions, identifier=identifier, - cell_type=cell_type, enzyme=enzyme, exp_type=exp_type, - **kw_descr) - -class Experiment(object): - """ - Hi-C experiment. - - :param name: name of the experiment - :param resolution: the resolution of the experiment (size of a bin in - bases) - :param None identifier: some identifier relative to the Hi-C data - :param None cell_type: cell type on which the experiment was done - :param None enzyme: restriction enzyme used in the Hi-C experiment - :param Hi-C exp_type: name of the experiment used (currently only Hi-C is - supported) - :param None hic_data: whether a file or a list of lists corresponding to - the Hi-C data - :param None tad_def: a file or a dict with precomputed TADs for this - experiment - :param None parser: a parser function that returns a tuple of lists - representing the data matrix and the length of a row/column. With - the file example.tsv: - - :: - - chrT_001 chrT_002 chrT_003 chrT_004 - chrT_001 629 164 88 105 - chrT_002 164 612 175 110 - chrT_003 88 175 437 100 - chrT_004 105 110 100 278 - - the output of parser('example.tsv') would be be: - ``[([629, 164, 88, 105, 164, 612, 175, 110, 88, 175, 437, 100, 105, - 110, 100, 278]), 4]`` - :param None conditions: :py:func:`list` of experimental conditions, e.g. - the cell type, the enzyme... (i.e.: ['HindIII', 'cortex', 'treatment']). - This parameter may be used to compare the effect of this conditions on - the TADs - :param True filter_columns: filter the columns with unexpectedly high - content of low values - :param None kw_descr: any other argument passed would be stored as - complementary descriptive field. For example:: - - exp = Experiment('k562_rep2', resolution=100000, - identifier='SRX015263', cell_type='K562', - enzyme='HindIII', cylce='synchronized') - print exp - - # Experiment k562_rep2: - # resolution : 100Kb - # TADs : None - # Hi-C rows : None - # normalized : None - # identifier : SRX015263 - # cell type : K562 - # restriction enzyme: HindIII - # cylce : synchronized - - *note that these fields may appear in the header of generated out files* - - TODO: doc conditions - TODO: normalization - """ - - - def __init__(self, name, resolution, hic_data=None, norm_data=None, - tad_def=None, parser=None, no_warn=False, weights=None, - conditions=None, identifier=None, - cell_type=None, enzyme=None, exp_type='Hi-C', **kw_descr): - self.name = name - self.resolution = resolution - self.identifier = identifier - self.cell_type = cell_type - self.enzyme = enzyme - self.description = kw_descr - self.exp_type = exp_type - self.crm = None - self._ori_resolution = resolution - self.hic_data = None - self._ori_hic = None - self._ori_norm = None - self._ori_size = None - self.conditions = sorted(conditions) if conditions else [] - self.size = None - self.tads = {} - self.norm = None - self.bias = None - self._normalization = None - self._filtered_cols = False - self._zeros = [] - self._zscores = [] - if hic_data: - self.load_hic_data(hic_data, parser, **kw_descr) - if norm_data: - self.load_norm_data(norm_data, parser, **kw_descr) - if tad_def: - self.load_tad_def(tad_def, weights=weights) - elif not hic_data and not no_warn and not norm_data: - stderr.write('WARNING: this is an empty shell, no data here.\n') - - - def __repr__(self): - return 'Experiment %s (resolution: %s, TADs: %s, Hi-C rows: %s, normalized: %s)' % ( - self.name, nicer(self.resolution), len(self.tads) or None, - self.size, self._normalization if self._normalization else 'None') - - - def __str__(self): - outstr = 'Experiment %s:\n' % (self.name) - outstr += ' resolution : %s\n' % (nicer(self.resolution)) - outstr += ' TADs : %s\n' % (len(self.tads) or None) - outstr += ' Hi-C rows : %s\n' % (self.size) - outstr += ' normalized : %s\n' % (self._normalization or None) - ukw = 'UNKNOWN' - try: # new in version post-CSDM13 - outstr += ' identifier : %s\n' % (self.identifier or ukw) - outstr += ' cell type : %s\n' % (self.cell_type or ukw) - outstr += ' restriction enzyme: %s\n' % (self.enzyme or ukw) - for desc in self.description: - outstr += ' %-18s: %s\n' % (desc, self.description[desc]) - except AttributeError: - pass - return outstr - - - def __add__(self, other, silent=False): - """ - sum Hi-C data of experiments into a new one. - """ - reso1, reso2 = self.resolution, other.resolution - if self.resolution == other.resolution: - resolution = self.resolution - changed_reso = False - else: - resolution = max(reso1, reso2) - self.set_resolution(resolution) - other.set_resolution(resolution) - if not silent: - stderr.write('WARNING: experiments of different resolution, ' + - 'setting both resolution of %s, and normalizing ' + - 'at this resolution\n' % (resolution)) - norm1 = copy(self.norm) - norm2 = copy(other.norm) - if self._normalization: - self.normalize_hic() - if other._normalization: - other.normalize_hic() - changed_reso = True - if self.hic_data: - new_hicdata = HiC_data([], size=self.size) - for i in self.hic_data[0]: - new_hicdata[i] = self.hic_data[0].get(i) - for i in other.hic_data[0]: - new_hicdata[i] += other.hic_data[0].get(i) - else: - new_hicdata = None - xpr = Experiment(name='%s+%s' % (self.name, other.name), - resolution=resolution, - hic_data=new_hicdata, no_warn=True) - # check if both experiments are normalized with the same method - # and sum both normalized data - if self._normalization != None and other._normalization != None: - if (self._normalization.split('_factor:')[0] == - other._normalization.split('_factor:')[0]): - xpr.norm = [HiC_data([], size=self.size)] - for i in self.norm[0]: - xpr.norm[0][i] = self.norm[0].get(i) - for i in other.norm[0]: - xpr.norm[0][i] += other.norm[0].get(i) - # The final value of the factor should be the sum of each - try: - xpr._normalization = ( - self._normalization.split('_factor:')[0] + - '_factor:' + - str(int(self._normalization.split('_factor:')[1]) + - int(other._normalization.split('_factor:')[1]))) - except IndexError: # no factor there - xpr._normalization = (self._normalization) - elif self.norm or other.norm: - try: - if (self.norm[0] or other.norm[0]) != {}: - if not silent: - raise Exception('ERROR: normalization differs between' + - ' each experiment\n') - else: - if not silent: - stderr.write('WARNING: experiments should be ' + - 'normalized before being summed\n') - except TypeError: - if not silent: - stderr.write('WARNING: experiments should be normalized ' + - 'before being summed\n') - else: - if not silent: - stderr.write('WARNING: experiments should be normalized ' + - 'before being summed\n') - if changed_reso: - self.set_resolution(reso1) - self.norm = norm1 - other.set_resolution(reso2) - other.norm = norm2 - xpr.crm = self.crm - if not xpr.size: - xpr.size = len(xpr.norm[0]) - - def __merge(own, fgn): - "internal function to merge descriptions" - if own == fgn: - return own - return '%s+%s' % (own , fgn) - - xpr.identifier = __merge(self.identifier , other.identifier ) - xpr.cell_type = __merge(self.cell_type , other.cell_type ) - xpr.enzyme = __merge(self.enzyme , other.enzyme ) - xpr.description = __merge(self.description, other.description) - xpr.exp_type = __merge(self.exp_type , other.exp_type ) - - for des in self.description: - if not des in other.description: - continue - xpr.description[des] = __merge(self.description[des], - other.description[des]) - return xpr - - - def __div__(self, other, silent=False): - """ - sum Hi-C data of experiments into a new one. - """ - reso1, reso2 = self.resolution, other.resolution - if self.resolution == other.resolution: - resolution = self.resolution - changed_reso = False - else: - resolution = max(reso1, reso2) - self.set_resolution(resolution) - other.set_resolution(resolution) - if not silent: - stderr.write('WARNING: experiments of different resolution, ' + - 'setting both resolution of %s, and normalizing ' + - 'at this resolution\n' % (resolution)) - norm1 = copy(self.norm) - norm2 = copy(other.norm) - if self._normalization: - self.normalize_hic() - if other._normalization: - other.normalize_hic() - changed_reso = True - if self.hic_data: - new_hicdata = HiC_data([], size=self.size) - for i in self.hic_data[0]: - new_hicdata[i] = self.hic_data[0].get(i) - for i in other.hic_data[0]: - try: - new_hicdata[i] /= other.hic_data[0].get(i) - except ZeroDivisionError: - new_hicdata[i] = float('NaN') - else: - new_hicdata = None - xpr = Experiment(name='%s/%s' % (self.name, other.name), - resolution=resolution, - hic_data=new_hicdata, no_warn=True) - # check if both experiments are normalized with the same method - # and sum both normalized data - if self._normalization != None and other._normalization != None: - if (self._normalization.split('_factor:')[0] == - other._normalization.split('_factor:')[0]): - xpr.norm = [HiC_data([], size=self.size)] - for i in self.norm[0]: - xpr.norm[0][i] = self.norm[0].get(i) - for i in other.norm[0]: - try: - xpr.norm[0][i] /= other.norm[0].get(i) - except ZeroDivisionError: - xpr.norm[0][i] = float('NaN') - # The final value of the factor should be the same of each - try: - xpr._normalization = ( - self._normalization.split('_factor:')[0] + - '_factor:' + - str(int(self._normalization.split('_factor:')[1]) + - int(other._normalization.split('_factor:')[1]))) / 2 - except IndexError: # no factor there - xpr._normalization = (self._normalization) - elif self.norm or other.norm: - try: - if (self.norm[0] or other.norm[0]) != {}: - if not silent: - raise Exception('ERROR: normalization differs between' + - ' each experiment\n') - except TypeError: - pass - if changed_reso: - self.set_resolution(reso1) - self.norm = norm1 - other.set_resolution(reso2) - other.norm = norm2 - xpr.crm = self.crm - if not xpr.size: - xpr.size = len(xpr.norm[0]) - - - - def __merge(own, fgn): - "internal function to merge descriptions" - if own == fgn: - return own - return '%s+%s' % (own , fgn) - - xpr.identifier = __merge(self.identifier , other.identifier ) - xpr.cell_type = __merge(self.cell_type , other.cell_type ) - xpr.enzyme = __merge(self.enzyme , other.enzyme ) - xpr.description = __merge(self.description, other.description) - xpr.exp_type = __merge(self.exp_type , other.exp_type ) - - for des in self.description: - if not des in other.description: - continue - xpr.description[des] = __merge(self.description[des], - other.description[des]) - return xpr - - - - def set_resolution(self, resolution, keep_original=True): - """ - Set a new value for the resolution. Copy the original data into - Experiment._ori_hic and replace the Experiment.hic_data - with the data corresponding to new data - (:func:`taddyn.Chromosome.compare_condition`). - - :param resolution: an integer representing the resolution. This number - must be a multiple of the original resolution, and higher than it - :param True keep_original: either to keep or not the original data - - """ - if resolution < self._ori_resolution: - raise Exception('New resolution might be higher than original.') - if resolution % self._ori_resolution: - raise Exception('New resolution might be a multiple original.\n' + - ' otherwise it is too complicated for me :P') - if resolution == self.resolution: - return - # if we want to go back to original resolution - if resolution == self._ori_resolution: - self.hic_data = self._ori_hic - self.norm = self._ori_norm - self.size = self._ori_size - self.resolution = self._ori_resolution - return - # if current resolution is the original one - if self.resolution == self._ori_resolution: - if self.hic_data: - self._ori_hic = copy(self.hic_data) - if self.norm: - self._ori_norm = self.norm[:] - # change the factor value in normalization description - try: - self._normalization = ( - self._normalization.split('_factor:')[0] + - '_factor:'+ - str(int(self._normalization.split('factor:')[1]) - * (resolution / self.resolution))) - except IndexError: # no factor there - pass - self.resolution = resolution - fact = self.resolution / self._ori_resolution - # super for! - try: - size = len(self._ori_hic[0]) - except TypeError: - size = len(self._ori_norm[0]) - self.size = size / fact - rest = size % fact - if rest: - self.size += 1 - self.hic_data = [HiC_data([], size / fact + (1 if rest else 0))] - self.norm = [HiC_data([], size / fact + (1 if rest else 0))] - def resize(mtrx, copee): - "resize both hic_data and normalized data" - for i in xrange(0, size, fact): - for j in xrange(0, size, fact): - val = 0 - for k in xrange(fact): - if i + k >= size: - break - for l in xrange(fact): - if j + l >= size: - break - val += copee[(i + k) * size + j + l] - if val: - mtrx[i/fact * self.size + j/fact] = val - try: - resize(self.hic_data[0], self._ori_hic[0]) - except TypeError: - pass - try: - resize(self.norm[0], self._ori_norm[0]) - except TypeError: - pass - # we need to recalculate zeros: - if self._filtered_cols: - stderr.write('WARNING: definition of filtered columns lost at ' + - 'this resolution\n') - self._filtered_cols = False - if not keep_original: - del(self._ori_hic) - del(self._ori_norm) - - - def filter_columns(self, silent=False, draw_hist=False, savefig=None, - diagonal=True, perc_zero=90, auto=True, min_count=None, - index=0): - """ - Call filtering function, to remove artifactual columns in a given Hi-C - matrix. This function will detect columns with very low interaction - counts; columns passing through a cell with no interaction in the - diagonal; and columns with NaN values (in this case NaN will be replaced - by zero in the original Hi-C data matrix). Filtered out columns will be - stored in the dictionary Experiment._zeros. - - :param False silent: does not warn for removed columns - :param False draw_hist: shows the distribution of mean values by column - the polynomial fit, and the cut applied. - :param None savefig: path to a file where to save the image generated; - if None, the image will be shown using matplotlib GUI (the extension - of the file name will determine the desired format). - :param True diagonal: remove row/columns with zero in the diagonal - :param 90 perc_zero: maximum percentage of cells with no interactions - allowed. - :param None min_count: minimum number of reads mapped to a bin (recommended - value could be 2500). If set this option overrides the perc_zero - filtering... This option is slightly slower. - :param True auto: if False, only filters based on the given percentage - zeros - :param 0 index: hic_data index to normalize - - """ - try: - data = self.hic_data[index] - ssize = self.hic_data[index]['size'] - except: - data = self.norm[index] - ssize = self.norm[index]['size'] - diagonal = True - self._zeros[index], has_nans = hic_filtering_for_modelling( - data, silent=silent, draw_hist=draw_hist, savefig=savefig, - diagonal=diagonal, perc_zero=perc_zero, auto=auto, - min_count=min_count) - if has_nans: # to make it simple - size2 = ssize**2 - for i in xrange(ssize): - if repr(self.hic_data[index].get(i, 0)) == 'nan': - del(self.hic_data[index][i]) - # Also remove columns where there is no data in the diagonal - # size = self.size - # else: - # self._zeros.update(dict([(i, None) for i in xrange(size) - # if not self.norm[0][i * size + i]])) - self._filtered_cols = True - - - def load_hic_data(self, hic_data, parser=None, wanted_resolution=None, - data_resolution=None, silent=False, **kwargs): - """ - Add a Hi-C experiment to the Chromosome object. - - :param None hic_data: whether a file or a list of lists corresponding to - the Hi-C data - :param name: name of the experiment - :param False force: overwrite the experiments loaded under the same - name - :param None parser: a parser function that returns a tuple of lists - representing the data matrix and the length of a row/column. - With the file example.tsv: - - :: - - chrT_001 chrT_002 chrT_003 chrT_004 - chrT_001 629 164 88 105 - chrT_002 86 612 175 110 - chrT_003 159 216 437 105 - chrT_004 100 111 146 278 - - the output of parser('example.tsv') would be: - ``[([629, 86, 159, 100, 164, 612, 216, 111, 88, 175, 437, 146, 105, - 110, 105, 278]), 4]`` - :param None resolution: resolution of the experiment in the file; it - will be adjusted to the resolution of the experiment. By default the - file is expected to contain a Hi-C experiment with the same resolution - as the :class:`taddyn.Experiment` created, and no change is made - :param True filter_columns: filter the columns with unexpectedly high - content of low values - :param False silent: does not warn for removed columns - - """ - self.hic_data = read_matrix(hic_data, parser=parser, one=False) - self._ori_size = self.size = self.hic_data[0]['size'] - self._ori_resolution = self.resolution = (data_resolution or - self._ori_resolution) - wanted_resolution = wanted_resolution or self.resolution - self.set_resolution(wanted_resolution, keep_original=False) - self._zeros = [] - for nmatrix in xrange(len(self.hic_data)): - ssize = self.hic_data[nmatrix]['size'] - self._zeros.append({}) - for index in xrange(ssize): - if self.hic_data[nmatrix][index].bads: - self._zeros[nmatrix][index] = self.hic_data[nmatrix][index].bads - self._filtered_cols = True - - def load_norm_data(self, norm_data, parser=None, resolution=None, - normalization='visibility', **kwargs): - """ - Add a normalized Hi-C experiment to the Chromosome object. - - :param None norm_data: whether a file or a list of lists corresponding to - the normalized Hi-C data - :param name: name of the experiment - :param False force: overwrite the experiments loaded under the same - name - :param None parser: a parser function that returns a tuple of lists - representing the data matrix and the length of a row/column. - With the file example.tsv: - - :: - - chrT_001 chrT_002 chrT_003 chrT_004 - chrT_001 12.5 164 8.8 0.5 - chrT_002 8.6 61.2 1.5 1.1 - chrT_003 15.9 21.6 3.7 0.5 - chrT_004 0.0 1.1 1.6 2.8 - - :param None resolution: resolution of the experiment in the file; it - will be adjusted to the resolution of the experiment. By default the - file is expected to contain a Hi-C experiment with the same resolution - as the :class:`taddyn.Experiment` created, and no change is made - :param True filter_columns: filter the columns with unexpectedly high - content of low values - :param False silent: does not warn for removed columns - - """ - self.norm = read_matrix(norm_data, parser=parser, hic=False, one=False) - self._ori_size = self.size = self.norm[0]['size'] - self._ori_resolution = self.resolution = resolution or self._ori_resolution - if not self._zeros: # in case we do not have original Hi-C data - self._zeros = [] - for nmatrix in xrange(len(self.norm)): - ssize = self.norm[nmatrix]['size'] - self._zeros.append({}) - for i in xrange(ssize): - if all([isnan(j) for j in - [self.norm[nmatrix]['matrix'].get(k, float('NaN')) for k in - xrange(i * ssize, - i * ssize + ssize)]]): - self._zeros[nmatrix][i] = None - # remove NaNs, we do not need them as we have zeroes - for nmatrix in xrange(len(self.norm)): - for i in self.norm[nmatrix]['matrix'].keys(): - if isnan(self.norm[nmatrix]['matrix'][i]): - del(self.norm[nmatrix]['matrix'][i]) - self._normalization = normalization - - # this part remains to be fixed, since i dont understand its use - # ALERT - # ALERT ###################################################################################### - # for nmatrix in xrange(len(self.norm)): - # for index in xrange(len(self.norm[nmatrix]['matrix'])): - # print 'la' - # if self.norm[nmatrix]['matrix'][index].bads: - # self._zeros[nmatrix]['matrix'][index] = self.norm[nmatrix]['matrix'][index].bads - # self._filtered_cols = True - - - # def load_tad_def(self, tad_def, index=0, weights=None): - # """ - # Add the Topologically Associated Domains definition detection to Slice - - # :param None tad_def: a file or a dict with pre-computed TADs for this - # experiment - # :param None name: name of the experiment, if None f_name will be used - # :param 0 index: hic_data index to use - # :param None weights: Store information about the weights, corresponding - # to the normalization of the Hi-C data (see TADbit function - # documentation) - - # """ - # tads, norm = parse_tads(tad_def) - # last = max(tads.keys()) - # if not self.size: - # self.size = tads[last]['end'] - # self.tads = tads - # if not self.norm: - # self.norm = weights or norm - # if self.norm: - # self._normalization = 'visibility' - # if self._normalization: - # norms = self.norm[index] - # elif self.hic_data: - # norms = self.hic_data[index] - # else: - # warn("WARNING: raw Hi-C data not available, " + - # "TAD's height fixed to 1") - # norms = None - # diags = [] - # siz = self.size - # sp1 = siz + 1 - # zeros = self._zeros[index] or {} - # if norms: - # for k in xrange(1, siz): - # s_k = siz * k - # diags.append(sum([norms[i * sp1 + s_k] - # if not (i in zeros - # or (i + k) in zeros) else 1. # 1 is the mean - # for i in xrange(siz - k)]) / (siz - k)) - # for tad in tads: - # start, end = (int(tads[tad]['start']) + 1, - # int(tads[tad]['end']) + 1) - # if norms: - # matrix = sum([norms[i + siz * j] - # if not (i in zeros - # or j in zeros) else 1. - # for i in xrange(start - 1, end - 1) - # for j in xrange(i + 1, end - 1)]) - # try: - # if norms: - # height = float(matrix) / sum( - # [diags[i-1] * (end - start - i) - # for i in xrange(1, end - start)]) - # else: - # height = tads[tad].get('height', 1.0) - # except ZeroDivisionError: - # height = 0. - # tads[tad]['height'] = height - - - # def normalize_hic(self, factor=1, iterations=0, max_dev=0.1, silent=False, - # rowsums=None, index=0): - # """ - # Normalize the Hi-C data. This normalization step does the same of - # the :func:`taddyn.tadbit.tadbit` function (default parameters), - - # It fills the Experiment.norm variable with the Hi-C values divided by - # the calculated weight. - - # The weight of a given cell in column i and row j corresponds to the - # square root of the product of the sum of column i by the sum of row - # j. - - # normalization is done according to this formula: - - # .. math:: - - # weight_{(I,J)} = \\frac{\\sum^N_{j=0}\\sum^N_{i=0}(matrix(i,j))} - # {\\sum^N_{i=0}(matrix(i,J)) \\times \\sum^N_{j=0}(matrix(I,j))} - - # with N being the number or rows/columns of the Hi-C matrix in both - # cases. - - # :param 1 factor: final mean number of normalized interactions wanted - # per cell - # :param False silent: does not warn when overwriting weights - # :param None rowsums: input a list of rowsums calculated elsewhere - # :param 0 index: hic_data index to normalize - # """ - - # if not self.hic_data or len(self.hic_data) <= index: - # raise Exception('ERROR: No Hi-C data loaded\n') - # if self.norm and len(self.norm) > index and not silent: - # stderr.write('WARNING: removing previous weights\n') - # size = self.size - # self.bias = iterative(self.hic_data[index], iterations=iterations, - # max_dev=max_dev, bads=self._zeros[index], - # verbose=not silent) - # norm = HiC_data([(i + j * size, float(self.hic_data[index][i, j]) / - # self.bias[i] / - # self.bias[j] * size) - # for i in self.bias for j in self.bias], size) - # if not self.norm: - # self.norm = [norm] - # elif len(self.norm) > index: - # self.norm[index] = norm - # else: - # self.norm.append(norm) - - # # no need to use lists, tuples use less memory - # if factor: - # self._normalization = 'visibility_factor:' + str(factor) - # factor = sum(self.norm[0].values()) / (self.size * self.size * factor) - # for n in self.norm[0]: - # self.norm[0][n] = self.norm[0][n] / factor - # else: - # self._normalization = 'visibility' - - - def get_hic_zscores(self, normalized=True, zscored=True, remove_zeros=True, index=0): - """ - Normalize the Hi-C raw data. The result will be stored into - the private Experiment._zscore list. - - :param True normalized: whether to normalize the result using the - weights (see :func:`normalize_hic`) - :param True zscored: calculate the z-score of the data - :param False remove_zeros: remove null interactions. Dangerous, null - interaction are informative. - :param 0 index: hic_data index or norm index from where to produce the zscores - - """ - values = {} - zeros = {} - if not normalized and (not self.hic_data or len(self.hic_data) <= index): - raise Exception('ERROR: No Hi-C data loaded\n') - if normalized and (not self.norm or len(self.norm) <= index): - raise Exception('ERROR: No normalized data loaded\n') - zscores = {} - if normalized: - ssize = self.size - for i in xrange(self.size): - # zeros are rows or columns having a zero in the diagonal - if i in self._zeros: - continue - for j in xrange(i + 1, ssize): - if j in self._zeros: - continue - if (not self.norm[index]['matrix'].get(i * ssize + j, 0) - and remove_zeros): - zeros[(i, j)] = None - continue - values[(i, j)] = self.norm[index]['matrix'].get(i * ssize + j, 0) - else: - ssize = self.size - for i in xrange(ssize): - if i in self._zeros[index]: - continue - for j in xrange(i + 1, ssize): - if j in self._zeros[index]: - continue - values[(i, j)] = self.hic_data[index]['matrix'].get(i * ssize + j, 0) - # compute Z-score - if zscored: - zscore(values) - for i in xrange(ssize): - if i in self._zeros: - continue - for j in xrange(i + 1, ssize): - if j in self._zeros: - continue - if (i, j) in zeros and remove_zeros: - continue - zscores.setdefault(str(i), {}) - zscores[str(i)][str(j)] = values[(i, j)] - - if len(self._zscores) > index: - self._zscores[index] = zscores - else: - self._zscores.append(zscores) - - def model_region(self, start=1, end=None, n_models=5000, n_keep=1000, - n_cpus=1, verbose=0, keep_all=False, close_bins=1, - outfile=None, config=CONFIG, container=None, - tool='imp',tmp_folder=None,timeout_job=10800, - stages=0, initial_conformation=None, connectivity="FENE", - timesteps_per_k=10000, kfactor=1, adaptation_step=False, - cleanup=True, single_particle_restraints=None, use_HiC=True, - start_seed=1, hide_log=True, remove_rstrn=[], - keep_restart_out_dir=None, - restart_path=False, store_n_steps=10, - useColvars=False): - """ - Generates of three-dimensional models using IMP, for a given segment of - chromosome. - - :param 1 start: first bin to model (bin number) - :param None end: last bin to model (bin number). By default goes to the - last bin. - :param 5000 n_models: number of modes to generate - :param 1000 n_keep: number of models used in the final analysis - (usually the top 20% of the generated models). The models are ranked - according to their objective function value (the lower the better) - :param False keep_all: whether or not to keep the discarded models (if - True, models will be stored under tructuralModels.bad_models) - :param 1 close_bins: number of particles away (i.e. the bin number - difference) a particle pair must be in order to be considered as - neighbors (e.g. 1 means consecutive particles) - :param n_cpus: number of CPUs to use - :param 0 verbose: the information printed can be: nothing (0), the - objective function value the selected models (1), the objective - function value of all the models (2), all the modeling - information (3) - :param None container: restrains particle to be within a given object. Can - only be a 'cylinder', which is, in fact a cylinder of a given height to - which are added hemispherical ends. This cylinder is defined by a radius, - its height (with a height of 0 the cylinder becomes a sphere) and the - force applied to the restraint. E.g. for modeling E. coli genome (2 - micrometers length and 0.5 micrometer of width), these values could be - used: ['cylinder', 250, 1500, 50], and for a typical mammalian nuclei - (6 micrometers diameter): ['cylinder', 3000, 0, 50] - :param CONFIG config: a dictionary containing the standard - parameters used to generate the models. The dictionary should - contain the keys kforce, maxdist, upfreq and lowfreq. - Examples can be seen by doing: - - :: - - from taddyn.imp.CONFIG import CONFIG - - where CONFIG is a dictionarry of dictionnaries to be passed to this - function: - - :: - - CONFIG = { - # use these paramaters with the Hi-C data from: - 'reference' : 'victor corces dataset 2013', - - # Force applied to the restraints inferred to neighbor particles - 'kforce' : 5, - - # Maximum experimental contact distance - 'maxdist' : 600, # OPTIMIZATION: 500-1200 - - # Minimum and maximum thresholds used to decide which experimental values have to be - # included in the computation of restraints. Z-score values bigger than upfreq - # and less that lowfreq will be include, whereas all the others will be rejected - 'upfreq' : 0.3, # OPTIMIZATION: min/max Z-score - - 'lowfreq' : -0.7 # OPTIMIZATION: min/max Z-score - - # How much space (radius in nm) ocupies a nucleotide - 'scale' : 0.005 - } - :param imp tool: use imp for montecarlo simulated annealing or lammps for - molecular dynamics - :param None tmp_folder: for lammps simulation, path to a temporary file - created during the clustering computation. Default will be created - in /tmp/ folder - :param 10800 timeout_job: maximum seconds a job can run in the multiprocessing - of lammps before is killed - :param 0 stages: index of the hic_data/norm data to model. For lammps a list of - indexes is allowed to perform dynamics between stages - :param tadbit initial_conformation: initial structure for lammps dynamics. - 'tadbit' to compute the initial conformation with montecarlo simulated annealing - 'random' to compute the initial conformation as a 3D random walk - {[x],[y],[z]} a dictionary containing lists with x,y,x positions, - e.g an IMPModel or LAMMPSModel object - :param True hide_log: do not generate lammps log information - :param FENE connectivity: use FENE for a fene bond or harmonic for harmonic - potential for neighbours - :param True cleanup: delete lammps folder after completion - :param [] remove_rstrn: list of particles which must not have restrains - :param None keep_restart_out_dir: path to write files to restore LAMMPs - session (binary) - :param False restart_path: path to files to restore LAMMPs session (binary) - :param 10 store_n_steps: Integer with number of steps to be saved if - restart_file != False - :param False useColvars: True if you want the restrains to be loaded by colvars - - :returns: a :class:`taddyn.imp.structuralmodels.StructuralModels` object. - - """ - if isinstance(stages, list) and tool == 'imp': - stderr.write('ERROR: tool imp does not allow dynamics\n') - return - if not self._normalization: - stderr.write('WARNING: not normalized data, should run ' + - 'Experiment.normalize_hic()\n') - if not end: - end = self.size - zscores, values, zeros = self._sub_experiment_zscore(start, end, stages) - if self.hic_data and self.hic_data[0].chromosomes: - coords = [] - tot = 0 - chrs = [] - chrom_offset_start = 1 - chrom_offset_end = 0 - for k, v in self.hic_data[0].chromosomes.iteritems(): - tot += v - if start > tot: - chrom_offset_start = start - tot - if end <= tot: - chrom_offset_end = tot - end - chrs.append(k) - break - if start < tot and end >= tot: - chrs.append(k) - - for k in chrs: - coords.append({'crm' : k, - 'start': 1, - 'end' : self.hic_data[0].chromosomes[k]}) - coords[0]['start'] = chrom_offset_start - coords[-1]['end'] -= chrom_offset_end - - else: - coords = {'crm' : self.crm.name, - 'start': start, - 'end' : end} - zeros = [tuple([i not in zeros_stg for i in xrange(end - start + 1)]) for zeros_stg in zeros] - nloci = end - start + 1 - if verbose: - stderr.write('Preparing to model %s particles\n' % nloci) - if tool=='lammps': - return generate_lammps_models(zscores, self.resolution, nloci, - values=values, n_models=n_models, - outfile=outfile, n_keep=n_keep, n_cpus=n_cpus, - verbose=verbose, first=0, - close_bins=close_bins, config=config, container=container, - coords=coords, zeros=zeros, - tmp_folder=tmp_folder,timeout_job=timeout_job, - initial_conformation='tadbit' if not initial_conformation \ - else initial_conformation, - connectivity=connectivity, - timesteps_per_k=timesteps_per_k, kfactor=kfactor, - adaptation_step=adaptation_step, cleanup=cleanup, - hide_log=hide_log, initial_seed=start_seed, - remove_rstrn=remove_rstrn, restart_path=restart_path, - keep_restart_out_dir=keep_restart_out_dir, - store_n_steps=store_n_steps, - useColvars=useColvars - ) - - - def optimal_imp_parameters(self, start=1, end=None, n_models=500, n_keep=100, - n_cpus=1, upfreq_range=(0, 1, 0.1), close_bins=1, - kbending_range=0.0, - lowfreq_range=(-1, 0, 0.1), - scale_range=[0.01][:], - maxdist_range=(400, 1400, 100), - dcutoff_range=[2][:], - outfile=None, verbose=True, corr='spearman', - off_diag=1, savedata=None, - container=None): - """ - Find the optimal set of parameters to be used for the 3D modeling in - IMP. - - :param 1 start: first bin to model (bin number) - :param None end: last bin to model (bin number). By default goes to the - last bin. - :param 500 n_models: number of modes to generate - :param 100 n_keep: number of models used in the final analysis (usually - the top 20% of the generated models). The models are ranked - according to their objective function value (the lower the better) - :param 1 close_bins: number of particles away (i.e. the bin number - difference) a particle pair must be in order to be considered as - neighbors (e.g. 1 means consecutive particles) - :param n_cpus: number of CPUs to use - :param False verbose: if set to True, information about the distance, - force and Z-score between particles will be printed - :param (-1,0,0.1) lowfreq_range: range of lowfreq values to be - optimized. The last value of the input tuple is the incremental step - for the lowfreq values - :param (0,1,0.1,0.1) upfreq_range: range of upfreq values to be - optimized. The last value of the input tuple is the incremental step - for the upfreq values - :param (400,1400,100) maxdist_range: upper and lower bounds used to - search for the optimal maximum experimental distance. The last value - of the input tuple is the incremental step for maxdist values - :param [0.01] scale_range: upper and lower bounds used to search for - the optimal scale parameter (nm per nucleotide). The last value of - the input tuple is the incremental step for scale parameter values - :param [2] dcutoff_range: upper and lower bounds used to search for - the optimal distance cutoff parameter (distance, in number of beads, - from which to consider 2 beads as being close). The last value of the - input tuple is the incremental step for scale parameter values - :param None cutoff: distance cutoff (nm) to define whether two particles - are in contact or not, default is 2 times resolution, times scale. - :param None container: restrains particle to be within a given object. Can - only be a 'cylinder', which is, in fact a cylinder of a given height to - which are added hemispherical ends. This cylinder is defined by a radius, - its height (with a height of 0 the cylinder becomes a sphere) and the - force applied to the restraint. E.g. for modeling E. coli genome (2 - micrometers length and 0.5 micrometer of width), these values could be - used: ['cylinder', 250, 1500, 50], and for a typical mammalian nuclei - (6 micrometers diameter): ['cylinder', 3000, 0, 50] - :param True verbose: print the results to the standard output - - .. note:: - - Each of the *_range* parameters accept tuples in the form - *(start, end, step)*, or a list with the list of values to test. - - E.g.: - * scale_range=[0.001, 0.005, 0.006] will test these three values. - * scale_range=(0.001, 0.005, 0.001) will test the values 0.001, - 0.002, 0.003, 0.004 and 0.005 - - - :returns: an :class:`taddyn.imp.impoptimizer.IMPoptimizer` object - - """ - if not self._normalization: - stderr.write('WARNING: not normalized data, should run ' + - 'Experiment.normalize_hic()\n') - if not end: - end = self.size - optimizer = IMPoptimizer(self, start, end, n_keep=n_keep, - n_models=n_models, close_bins=close_bins, - container=container) - optimizer.run_grid_search(maxdist_range=maxdist_range, - kbending_range=kbending_range, - upfreq_range=upfreq_range, - lowfreq_range=lowfreq_range, - scale_range=scale_range, - dcutoff_range=dcutoff_range, corr=corr, - n_cpus=n_cpus, verbose=verbose, - off_diag=off_diag, savedata=savedata) - - if outfile: - optimizer.write_result(outfile) - - return optimizer - - - def _sub_experiment_zscore(self, start, end, index=0): - """ - Get the z-score of a sub-region of an experiment. - - TODO: find a nicer way to do this... - - :param start: first bin to model (bin number) - :param end: first bin to model (bin number) - :param 0 index: hic_data index or norm index from where to compute - the zscores. A list is allowed to compute several zscores at the - same time - - :returns: z-score, raw values and zeros of the experiment - """ - if isinstance(index, list): - idx = index - else: - idx = [index] - if not self._normalization or not self._normalization.startswith('visibility'): - stderr.write('WARNING: normalizing according to visibility method\n') - for i in idx: - self.normalize_hic(index=i) - from taddyn import Chromosome - if start < 1: - raise ValueError('ERROR: start should be higher than 0\n') - start -= 1 # things starts at 0 for python. we keep the end coordinate - # at its original value because it is inclusive - siz = self.size - tmp = Chromosome('tmp') - tmp.add_experiment('exp1', resolution=self.resolution, filter_columns=False) - exp = tmp.experiments[0] - tmp_matrix = [] - exp.norm = [] - try: - for id in idx: - matrix = self.get_hic_matrix(index=id) - new_matrix = [[matrix[i][j] for i in xrange(start, end)] - for j in xrange(start, end)] - tmp_matrix.append(new_matrix) - # We want the weights and zeros calculated in the full chromosome - exp.norm.append([self.norm[id][i + siz * j] for i in xrange(start, end) - for j in xrange(start, end)]) - exp.load_hic_data(hic_data=tmp_matrix) - except TypeError: # no Hi-C data provided - for id in idx: - matrix = self.get_hic_matrix(normalized=True,index=id) - new_matrix = [[matrix[i][j] for i in xrange(start, end)] - for j in xrange(start, end)] - tmp_matrix.append(new_matrix) - exp.load_norm_data(norm_data=tmp_matrix) - - # ... but the z-scores in this particular region - vals = [] - exp._zeros = [] - for id in idx: - exp._zeros += [dict([(z - start, None) for z in self._zeros[id] - if start <= z <= end - 1])] - if len(exp._zeros[-1]) == (end - start): - raise Exception('ERROR: no interaction found in selected regions') - exp.get_hic_zscores(index=id) - values = [[float('nan') for _ in xrange(exp.size)] - for _ in xrange(exp.size)] - - for i in xrange(exp.size): - # zeros are rows or columns having a zero in the diagonal - if i in exp._zeros[-1]: - continue - for j in xrange(i + 1, exp.size): - if j in exp._zeros[-1]: - continue - if (not exp.norm[id]['matrix'].get(i * exp.size + j, 0) - or not exp.norm[id]['matrix'].get(i * exp.size + j, 0)): - continue - values[i][j] = exp.norm[id]['matrix'][i * exp.size + j] - values[j][i] = exp.norm[id]['matrix'][i * exp.size + j] - vals.append(values) - return exp._zscores, vals, exp._zeros - - - def write_interaction_pairs(self, fname, normalized=True, zscored=True, - diagonal=False, cutoff=None, header=False, - true_position=False, uniq=True, - remove_zeros=False, focus=None, format='tsv', - index=0): - """ - Creates a tab separated file with all the pairwise interactions. - - :param fname: file name where to write the pairwise interactions - :param True zscored: computes the z-score of the log10(data) - :param True normalized: use the weights to normalize the data - :param None cutoff: if defined, only the zscores above the cutoff will - be writen to the file - :param False uniq: only writes one representent per interacting pair - :param False true_position: if, true writes genomic coordinates, - otherwise, genomic bin. - :param None focus: writes interactions between the start and stop bin - passed to this parameter. - :param 'tsv' format: in which to write the file, can be tab separated - (tsv) or JSON (json) - :param 0 index: hic_data index or norm index - - """ - if (not self._zscores or len(self.norm) < index) and zscored: - self.get_hic_zscores(index=index) - if (not self.norm or len(self.norm) < index) and normalized: - raise Exception('Experiment not normalized.') - # write to file - if isinstance(fname, str): - out = open(fname, 'w') - elif isinstance(fname, file): - out = fname - else: - raise Exception('Not recognize file type\n') - if header: - if format == 'tsv': - out.write('elt1\telt2\t%s\n' % ('zscore' if zscored else - 'normalized hi-c' if normalized - else 'raw hi-c')) - elif format == 'json': - out.write(''' -{ - "metadata": { - "formatVersion" : 3, - %s - "species" : "%s", - "cellType" : "%s", - "experimentType" : "%s", - "identifier" : "%s", - "resolution" : %s, - "chromosome" : "%s", - "start" : %s, - "end" : %s - }, - "interactions": [ - ''' % ('\n'.join(['"%s": "%s",' % (k, self.description[k]) - for k in self.description]), - self.description.get('species', ''), - self.cell_type, - self.exp_type, - self.identifier, - self.resolution, - self.crm.name, - focus[0] * self.resolution if focus else 1, - (focus[1] * self.resolution if focus else - self.resolution * self.size))) - if focus: - start, end = focus[0], focus[1] + 1 - else: - start, end = 0, self.size - for i in xrange(start, end): - if i in self._zeros[index]: - continue - newstart = i if uniq else 0 - for j in xrange(newstart, end): - if j in self._zeros[index]: - continue - if not diagonal and i == j: - continue - if zscored: - try: - if self._zscores[index][str(i)][str(j)] < cutoff: - continue - if self._zscores[index][str(i)][str(j)] == -99: - continue - except KeyError: - continue - val = self._zscores[index][str(i)][str(j)] - elif normalized: - val = self.norm[index][self.size*i+j] - else: - val = self.hic_data[index][self.size*i+j] - if remove_zeros and not val: - continue - if true_position: - if format == 'tsv': - out.write('%s\t%s\t%s\n' % ( - self.resolution * (i + 1), - self.resolution * (j + 1), val)) - elif format == 'json': - out.write('%s,%s,%s,\n' % ( - self.resolution * (i + 1), - self.resolution * (j + 1), val)) - else: - if format == 'tsv': - out.write('%s\t%s\t%s\n' % ( - i + 1 - start, j + 1 - start, val)) - elif format == 'json': - out.write('%s,%s,%s\n' % ( - i + 1 - start, j + 1 - start, val)) - if format == 'json': - out.write(']}\n') - out.close() - - - def get_hic_matrix(self, focus=None, diagonal=True, normalized=False, index=0): - """ - Return the Hi-C matrix. - - :param None focus: if a tuple is passed (start, end), wil return a Hi-C - matrix starting at start, and ending at end (all inclusive). - :param True diagonal: replace the values in the diagonal by one. Used - for the filtering in order to smooth the distribution of mean values - :param False normalized: returns normalized data instead of raw Hi-C - :param 0 index: hic_data index or norm index from where to get the matrix - - :returns: list of lists representing the Hi-C data matrix of the - current experiment - """ - siz = self.size - if normalized: - try: - hic = self.norm[index]['matrix'] - except TypeError: - raise Exception('ERROR: experiment not normalized yet') - else: - hic = self.hic_data[index]['matrix'] - if focus: - start, end = focus - start -= 1 - else: - start = 0 - end = siz - if diagonal: - return [[hic.get(i + siz * j, 0) for i in xrange(start, end)] - for j in xrange(start, end)] - else: - mtrx = [[hic.get(i + siz * j, 0) for i in xrange(start, end)] - for j in xrange(start, end)] - for i in xrange(start, end): - mtrx[i][i] = 1 if mtrx[i][i] else 0 - return mtrx - - - def print_hic_matrix(self, print_it=True, normalized=False, zeros=False, index=0): - """ - Return the Hi-C matrix as string - - :param True print_it: Otherwise, returns the string - :param False normalized: returns normalized data, instead of raw Hi-C - :param False zeros: take into account filtered columns - :param 0 index: hic_data index or norm index from where to print the matrix - :returns: list of lists representing the Hi-C data matrix of the - current experiment - """ - siz = self.size - try: - if normalized: - hic = self.norm[index]['matrix'] - else: - hic = self.hic_data[index]['matrix'] - except TypeError: - raise Exception('ERROR: no hic_data with index ',index) - - if zeros: - out = '\n'.join(['\t'.join( - ['nan' if (i in self._zeros[index] or j in self._zeros[index]) else - str(hic.get(i + siz * j, 0)) for i in xrange(siz)]) - for j in xrange(siz)]) - else: - out = '\n'.join(['\t'.join([str(hic.get(i + siz * j, 0)) - for i in xrange(siz)]) - for j in xrange(siz)]) - if print_it: - print(out) - else: - return out + '\n' - - - # def view(self, tad=None, focus=None, paint_tads=False, axe=None, - # show=True, logarithm=True, normalized=False, relative=True, - # decorate=True, savefig=None, where='both', clim=None, - # cmap='jet', index=0): - # """ - # Visualize the matrix of Hi-C interactions - - # :param None tad: a given TAD in the form: - # :: - - # {'start': start, - # 'end' : end, - # 'brk' : end, - # 'score': score} - - # **Alternatively** a list of the TADs can be passed (all the TADs - # between the first and last one passed will be showed. Thus, passing - # more than two TADs might be superfluous) - # :param None focus: a tuple with the start and end positions of the - # region to visualize - # :param False paint_tads: draw a box around the TADs defined for this - # experiment - # :param None axe: an axe object from matplotlib can be passed in order - # to customize the picture - # :param True show: either to pop-up matplotlib image or not - # :param True logarithm: show the logarithm values - # :param True normalized: show the normalized data (weights might have - # been calculated previously). *Note: white rows/columns may appear in - # the matrix displayed; these rows correspond to filtered rows (see* - # :func:`taddyn.utils.hic_filtering.hic_filtering_for_modelling` *)* - # :param True relative: color scale is relative to the whole matrix of - # data, not only to the region displayed - # :param True decorate: draws color bar, title and axes labels - # :param None savefig: path to a file where to save the image generated; - # if None, the image will be shown using matplotlib GUI (the extension - # of the file name will determine the desired format). - # :param None clim: tuple with minimum and maximum value range for color - # scale. I.e. clim=(-4, 10) - # :param 'jet' cmap: color map from matplotlib. Can also be a - # preconfigured cmap object. - # :param 0 index: hic_data index or norm index - # """ - # if logarithm==True: - # fun = log2 - # elif logarithm: - # fun = logarithm - # else: - # fun = lambda x: x - # size = self.size - # if normalized and not self.norm: - # raise Exception('ERROR: weights not calculated for this ' + - # 'experiment. Run Experiment.normalize_hic\n') - # if tad and focus: - # raise Exception('ERROR: only one of "tad" or "focus" might be set') - # start = end = None - # if focus: - # start, end = focus - # if start == 0: - # stderr.write('WARNING: Hi-C matrix starts at 1, setting ' + - # 'starting point to 1.\n') - # start = 1 - # elif isinstance(tad, dict): - # start = int(tad['start']) - # end = int(tad['end']) - # elif isinstance(tad, list): - # if isinstance(tad[0], dict): - # start = int(sorted(tad, - # key=lambda x: int(x['start']))[0 ]['start']) - # end = int(sorted(tad, - # key=lambda x: int(x['end' ]))[-1]['end' ]) - # elif self.tads: - # start = self.tads[min(self.tads)]['start'] + 1 - # end = self.tads[max(self.tads)]['end' ] + 1 - # else: - # start = 1 - # end = size - # try: - # if normalized: - # hic = self.norm[index] - # else: - # hic = self.hic_data[index] - # except TypeError: - # raise Exception('ERROR: no hic_data with index ',index) - - # if relative and not clim: - # if normalized: - # # find minimum, if value is non-zero... for logarithm - # mini = min([i for i in hic.values() if i]) - # if mini == int(mini): - # vmin = min(hic.values()) - # else: - # vmin = mini - # vmin = fun(vmin or (1 if logarithm else 0)) - # vmax = fun(max(hic.values())) - # else: - # vmin = fun(min(hic.values()) or - # (1 if logarithm else 0)) - # vmax = fun(max(hic.values())) - # elif clim: - # vmin, vmax = clim - # if axe is None: - # plt.figure(figsize=(8, 6)) - # axe = plt.subplot(111) - # if tad or focus: - # if start > -1: - # if normalized: - # matrix = [ - # [hic[i+size*j] - # if (not i in self._zeros[index] - # and not j in self._zeros[index]) else float('nan') - # for i in xrange(int(start) - 1, int(end))] - # for j in xrange(int(start) - 1, int(end))] - # else: - # matrix = [ - # [hic[i+size*j] - # for i in xrange(int(start) - 1, int(end))] - # for j in xrange(int(start) - 1, int(end))] - # elif isinstance(tad, list): - # if normalized: - # stderr.write('WARNING: List passed, not going to be ' + - # 'normalized.\n') - # matrix = tad - # else: - # # TODO: something... matrix not declared... - # pass - # else: - # if normalized: - # matrix = [[hic[i+size*j] - # if (not i in self._zeros[index] - # and not j in self._zeros[index]) else float('nan') - # for i in xrange(size)] - # for j in xrange(size)] - # else: - # matrix = [[hic[i+size*j]\ - # for i in xrange(size)] \ - # for j in xrange(size)] - # if where == 'up': - # for i in xrange(int(end - start)): - # for j in xrange(i, int(end - start)): - # matrix[i][j] = vmin - # alphas = array([0, 0] + [1] * 256 + [0]) - # jet._init() - # jet._lut[:, -1] = alphas - # elif where == 'down': - # for i in xrange(int(end - start)): - # for j in xrange(i + 1): - # matrix[i][j] = vmin - # alphas = array([0, 0] + [1] * 256 + [0]) - # jet._init() - # jet._lut[:,-1] = alphas - - # if isinstance(cmap, str): - # cmap = plt.get_cmap(cmap) - # cmap.set_bad('darkgrey', 1) - # if relative: - # img = axe.imshow(nozero_log_matrix(matrix, fun), origin='lower', vmin=vmin, vmax=vmax, - # interpolation="nearest", cmap=cmap, - # extent=(int(start or 1) - 0.5, - # int(start or 1) + len(matrix) - 0.5, - # int(start or 1) - 0.5, - # int(start or 1) + len(matrix) - 0.5)) - # else: - # img = axe.imshow(nozero_log_matrix(matrix, fun), origin='lower', - # interpolation="nearest", cmap=cmap, - # extent=(int(start or 1) - 0.5, - # int(start or 1) + len(matrix) - 0.5, - # int(start or 1) - 0.5, - # int(start or 1) + len(matrix) - 0.5)) - # if decorate: - # cbar = axe.figure.colorbar(img) - # cbar.ax.set_ylabel('%sHi-C %sinteraction count' % ( - # 'Log2 ' * (logarithm==True), 'normalized ' * normalized), rotation=-90) - # axe.set_title(('Chromosome %s experiment %s %s') % ( - # self.crm.name, self.name, - # 'focus: %s-%s' % (start, end) if tad else '')) - # axe.set_xlabel('Genomic bin (resolution: %s)' % (self.resolution)) - # if paint_tads: - # axe.set_ylabel('TAD number') - # else: - # axe.set_ylabel('Genomic bin (resolution: %s)' % ( - # self.resolution)) - # if not paint_tads: - # axe.set_ylim(int(start or 1) - 0.5, - # int(start or 1) + len(matrix) - 0.5) - # axe.set_xlim(int(start or 1) - 0.5, - # int(start or 1) + len(matrix) - 0.5) - # if show: - # plt.show() - # if savefig: - # tadbit_savefig(savefig) - # return img - # pwidth = 1 - # tads = dict([(t, self.tads[t]) for t in self.tads - # if ((int(self.tads[t]['start']) + 1 >= start - # and int(self.tads[t]['end' ]) + 1 <= end) - # or not start)]) - # for i, tad in tads.iteritems(): - # t_start = int(tad['start']) + .5 - # t_end = int(tad['end']) + 1.5 - # nwidth = float(abs(tad['score'])) / 4 - # if where in ['down', 'both']: - # axe.hlines(t_start, t_start, t_end, colors='k', lw=pwidth) - # if where in ['up', 'both']: - # axe.hlines(t_end , t_start, t_end, colors='k', lw=nwidth) - # if where in ['up', 'both']: - # axe.vlines(t_start, t_start, t_end, colors='k', lw=pwidth) - # if where in ['down', 'both']: - # axe.vlines(t_end , t_start, t_end, colors='k', lw=nwidth) - # pwidth = nwidth - # if tad['score'] < 0: - # for j in xrange(0, int(t_end) - int(t_start), 2): - # axe.plot((t_start , t_start + j), - # (t_end - j, t_end ), color='k') - # axe.plot((t_end , t_end - j), - # (t_start + j, t_start ), color='k') - # axe.set_ylim(int(start or 1) - 0.5, - # int(start or 1) + len(matrix) - 0.5) - # axe.set_xlim(int(start or 1) - 0.5, - # int(start or 1) + len(matrix) - 0.5) - # if paint_tads: - # ticks = [] - # labels = [] - # for tad, tick in [(t, tads[t]['start'] + (tads[t]['end'] - - # tads[t]['start'] - 1)) - # for t in tads.keys()[::(len(tads)/11 + 1)]]: - # ticks.append(tick) - # labels.append(tad + 1) - # axe.set_yticks(ticks) - # axe.set_yticklabels(labels) - # if show: - # plt.show() - # if savefig: - # tadbit_savefig(savefig) - # return img - - - # def write_tad_borders(self, density=False, savedata=None, normalized=False, index=0): - # """ - # Print a table summarizing the TADs found by tadbit. This function outputs - # something similar to the R function. - - # :param False density: if True, adds a column with the relative - # interaction frequency measured within each TAD (value of 1 means an - # interaction frequency equal to the expectation in the experiment) - # :param None savedata: path to a file where to save the density data - # generated (1 column per step + 1 for particle number). If None, print - # a table. - # :param False normalized: uses normalized data to calculate the density - # :param 0 index: hic_data index or norm index - # """ - # try: - # if normalized and self.norm: - # norms = self.norm[index] - # elif self.hic_data: - # if normalized: - # warn("WARNING: weights not available, using raw data") - # norms = self.hic_data[index] - # else: - # warn("WARNING: raw Hi-C data not available, " + - # "TAD's height fixed to 1") - # norms = None - # except TypeError: - # raise Exception('ERROR: no hic_data with index ',index) - - # zeros = self._zeros[index] or {} - # table = '' - # table += '%s\t%s\t%s\t%s%s\n' % ('#', 'start', 'end', 'score', - # '' if not density else '\tdensity') - # tads = self.tads - # sp1 = self.size + 1 - # diags = [] - # if norms: - # for k in xrange(1, self.size): - # s_k = self.size * k - # diags.append(sum([norms[i * sp1 + s_k] - # if not (i in zeros - # or (i + k) in zeros) else 0. - # for i in xrange( - # self.size - k)]) / (self.size - k)) - # for tad in tads: - # table += '%s\t%s\t%s\t%s%s\n' % ( - # tad, int(tads[tad]['start'] + 1), int(tads[tad]['end'] + 1), - # abs(tads[tad]['score']), '' if not density else - # '\t%s' % (round(float(tads[tad]['height']), 3))) - # if not savedata: - # print table - # return - # if isinstance(savedata, file): - # out = savedata - # else: - # out = open(savedata, 'w') - # out.write(table) - - # def write_json(self, filename, focus=None, normalized=False): - # """ - # Save hic matrix in the json format, read by TADkit. - - # :param filename: location where the file will be written - # :param None focus: if a tuple is passed (start, end), json will contain a Hi-C - # matrix starting at start, and ending at end (all inclusive). - # :para False normalized: use normalized data instead of raw Hi-C - - # """ - # if not self.crm.species: - # warn("WARNING: no species specified in chromosome. TADkit will not be able to interpret the file") - # if not self.crm.name: - # warn("WARNING: no name specified in chromosome. TADkit will not be able to interpret the file") - - # if focus: - # start, end = focus - # size = end-start+1 - # else: - # start = 0 - # end = size = self.size - - # if size > 1200: - # warn("WARNING: this is a very big matrix, consider using focus. TADkit will not be able to render the file") - - # new_hic_data = self.get_hic_matrix(focus=focus, normalized=normalized) - - # chrom_start = [] - # chrom_end = [] - # chrom = [] - # if self.hic_data and self.hic_data[0].chromosomes: - # tot = 0 - # chrs = [] - # chrom_offset_start = start - # chrom_offset_end = 0 - # for k, v in self.hic_data[0].chromosomes.iteritems(): - # tot += v - # if start > tot: - # chrom_offset_start = start - tot - # if end <= tot: - # chrom_offset_end = tot - end - # chrs.append((k,v)) - # break - # if start < tot and end >= tot: - # chrs.append((k,v)) - - # for k, v in chrs: - # chrom.append(k) - # chrom_start.append(0) - # chrom_end.append(v * self.resolution) - # chrom_start[0] = chrom_offset_start * self.resolution - # chrom_end[-1] -= chrom_offset_end * self.resolution - - # else: - # chrom.append(self.crm.name) - # chrom_start.append(start * self.resolution) - # chrom_end.append(end * self.resolution) - - - # descr = {'chromosome' : chrom, - # 'species' : self.crm.species, - # 'resolution' : self.resolution, - # 'chrom_start' : chrom_start, - # 'chrom_end' : chrom_end, - # 'start' : self.resolution, - # 'end' : size * self.resolution} - - # # Fake structural models object to produce json - # sm = StructuralModels(nloci=size, models = [], bad_models = [], experiment=self, resolution=self.resolution, original_data=new_hic_data, description=descr, config={'scale':0.01}) - # sm.write_json(filename=filename) - - # def generate_densities(self): - # """ - # Related to the generation of 3D models. - # In the case of Hi-C data, the density is equal to the number of - # nucleotides in a bin, which is equal to the experiment resolution. - # """ - # dens = {} - # for i in self.size: - # dens[i] = self.resolution - # return dens From 164e845395e8202f891c8231ebdd6698eb6d94e5 Mon Sep 17 00:00:00 2001 From: MarcoDiS Date: Sun, 24 Jan 2021 18:47:45 +0100 Subject: [PATCH 8/9] Resolved bugs in loop extrusion --- .../tadphys/modelling/LAMMPS_CONFIG.py | 4 +- .../tadphys/modelling/lammps_modelling.py | 72 +++++++++++++----- dist/TADphys-0.1-py3.6-linux-x86_64.egg | Bin 228337 -> 229186 bytes tadphys/modelling/LAMMPS_CONFIG.py | 4 +- tadphys/modelling/lammps_modelling.py | 72 +++++++++++++----- 5 files changed, 112 insertions(+), 40 deletions(-) diff --git a/build/lib.linux-x86_64-3.6/tadphys/modelling/LAMMPS_CONFIG.py b/build/lib.linux-x86_64-3.6/tadphys/modelling/LAMMPS_CONFIG.py index 8af1c60..bd9a687 100644 --- a/build/lib.linux-x86_64-3.6/tadphys/modelling/LAMMPS_CONFIG.py +++ b/build/lib.linux-x86_64-3.6/tadphys/modelling/LAMMPS_CONFIG.py @@ -66,7 +66,9 @@ # set timestep of integrator # ############################## #timestep = 0.01 -timestep = 0.001 +#timestep = 0.012 +timestep = 0.006 +#timestep = 0.001 # HiC Config diff --git a/build/lib.linux-x86_64-3.6/tadphys/modelling/lammps_modelling.py b/build/lib.linux-x86_64-3.6/tadphys/modelling/lammps_modelling.py index a5e4563..1396d95 100644 --- a/build/lib.linux-x86_64-3.6/tadphys/modelling/lammps_modelling.py +++ b/build/lib.linux-x86_64-3.6/tadphys/modelling/lammps_modelling.py @@ -10,7 +10,7 @@ from multiprocessing.dummy import Pool as ThreadPool from functools import partial from math import atan2 -from itertools import combinations, product +from itertools import combinations, product, chain from shutil import copyfile import sys @@ -20,6 +20,7 @@ import multiprocessing from numpy import sin, cos, arccos, sqrt, fabs, pi +from scipy import spatial import numpy as np from mpi4py import MPI from lammps import lammps @@ -998,7 +999,8 @@ def run_lammps(kseed, lammps_folder, run_time, if initial_relaxation: if to_dump: lmp.command("undump 1") - lmp.command("dump 1 all custom %i %sinitial_relaxation_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + lmp.command("dump 1 all custom %i %sinitial_relaxation.XYZ id xu yu zu" % (to_dump,lammps_folder)) + lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") lmp.command("reset_timestep 0") lmp.command("run %i" % initial_relaxation) lmp.command("write_data relaxed_conformation.txt nocoeff") @@ -1392,14 +1394,25 @@ def run_lammps(kseed, lammps_folder, run_time, if to_dump: lmp.command("undump 1") lmp.command("dump 1 all custom %i %sloop_extrusion_MD_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) - + lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append no") + # Randomly extract starting point of the extrusion dynamics between start and stop extruders_positions = [] nextruders = int(chromosome_particle_numbers[0]/loop_extrusion_dynamics['separation']) print(nextruders) for extruder in range(nextruders): - extruders_positions.append(draw_loop_extrusion_starting_point(loop_extrusion_dynamics['chrlength'][0])) + try: + occupied_positions = list(chain(*tmp_extruders_positions)) + except: + occupied_positions = [] + new_positions = draw_loop_extrusion_starting_point(loop_extrusion_dynamics['chrlength'][0]) + while (new_positions[0] in occupied_positions) or (new_positions[1] in occupied_positions) or (new_positions[0] in loop_extrusion_dynamics['barriers']) or (new_positions[1] in loop_extrusion_dynamics['barriers']): + new_positions = draw_loop_extrusion_starting_point(loop_extrusion_dynamics['chrlength'][0]) + extruders_positions.append(new_positions) + tmp_extruders_positions = [extruders_positions[x] for x in range(len(extruders_positions))] + print("Initial extruders' positions",extruders_positions) + # Initialise the lifetime of each extruder extruders_lifetimes = [] for extruder in range(nextruders): @@ -1440,7 +1453,7 @@ def run_lammps(kseed, lammps_folder, run_time, lmp.command("variable xLE%i equal v_x%i-v_x%i" % (loop_number, particle1, particle2)) lmp.command("variable yLE%i equal v_y%i-v_y%i" % (loop_number, particle1, particle2)) lmp.command("variable zLE%i equal v_z%i-v_z%i" % (loop_number, particle1, particle2)) - lmp.command("variable dist_%i_%i equal sqrt(v_xLE%i*v_xLE%i+v_zLE%i*v_zLE%i+v_zLE%i*v_zLE%i)" % (particle1, + lmp.command("variable dist_%i_%i equal sqrt(v_xLE%i*v_xLE%i+v_yLE%i*v_yLE%i+v_zLE%i*v_zLE%i)" % (particle1, particle2, loop_number, loop_number, @@ -1453,7 +1466,8 @@ def run_lammps(kseed, lammps_folder, run_time, lmp.command("%s" % thermo_style) # Doing the LES - lmp.command("run %i" % loop_extrusion_dynamics['extrusion_time']) + #lmp.command("run %i" % loop_extrusion_dynamics['extrusion_time']) + lmp.command("run 0") # update the lifetime of each extruder for extruder in range(nextruders): @@ -1482,11 +1496,26 @@ def run_lammps(kseed, lammps_folder, run_time, random_number = uniform(0, 1) if random_number <= loop_extrusion_dynamics['right_extrusion_rate']: extruders_positions[extruder][1] += 1 - # If the extruder reached its lifetime, put it in another position + + # If the extruder bumps into another extruder bring it back + tmp_extruders_positions = [extruders_positions[x] for x in range(len(extruders_positions)) if x != extruder] + occupied_positions = list(chain(*tmp_extruders_positions)) + print("Extruder positions",extruders_positions[extruder]) + print("Occupied_positions",sorted(occupied_positions)) + if extruders_positions[extruder][0] in occupied_positions: + extruders_positions[extruder][0] += 1 + if extruders_positions[extruder][1] in occupied_positions: + extruders_positions[extruder][1] -= 1 + + # If the extruder reached its lifetime, put it in another position if extruders_lifetimes[extruder] == loop_extrusion_dynamics['lifetime']: extruders_positions[extruder] = draw_loop_extrusion_starting_point(loop_extrusion_dynamics['chrlength'][0]) + while (extruders_positions[extruder][0] in occupied_positions) or (extruders_positions[extruder][1] in occupied_positions) or (extruders_positions[extruder][0] in loop_extrusion_dynamics['barriers']) or (extruders_positions[extruder][1] in loop_extrusion_dynamics['barriers']): + extruders_positions[extruder] = draw_loop_extrusion_starting_point(loop_extrusion_dynamics['chrlength'][0]) # Re-initialise the lifetime of the extruder extruders_lifetimes[extruder] = 0 + print("Extruders' repositioning after lifetime",extruders_positions,extruders_positions[extruder]) + # Check presence of barriers if loop_extrusion_dynamics['barriers_permeability'] < 1.0: # If a motor tries to overcome a barrier we stop it with a probability > than the permeability @@ -1501,7 +1530,8 @@ def run_lammps(kseed, lammps_folder, run_time, if random_number >= loop_extrusion_dynamics['barriers_permeability']: extruders_positions[extruder][1] -= 1 - print(extruders_positions,extruders_lifetimes) + print("Extruders positions at step",LES,extruders_positions) + print("Extruders lifetimes at step",LES,extruders_lifetimes) ### Put here the creationg of a pickle with the complete trajectory ### if to_dump: @@ -2368,7 +2398,8 @@ def generate_chromosome_rosettes_conformation ( chromosome_particle_numbers , rosette_radius=12.0 , particle_radius=0.5 , seed_of_the_random_number_generator=1 , number_of_conformations=1, - outfile = "Initial_rosette_conformation.dat"): + outfile = "Initial_rosette_conformation.dat", + atom_types=1): """ Generates lammps initial conformation file by rosettes conformation @@ -2436,7 +2467,7 @@ def generate_chromosome_rosettes_conformation ( chromosome_particle_numbers , for rosette_pair in list(combinations(final_rosettes,2)): molecule0 = list(zip(rosette_pair[0]['x'],rosette_pair[0]['y'],rosette_pair[0]['z'])) molecule1 = list(zip(rosette_pair[1]['x'],rosette_pair[1]['y'],rosette_pair[1]['z'])) - distances = scipy.spatial.distance.cdist(molecule1,molecule0) + distances = spatial.distance.cdist(molecule1,molecule0) print(len(molecule0),len(molecule0[0]),distances.min()) if distances.min() < particle_radius*2.0*0.95: particles_overlap = 0 @@ -2447,7 +2478,7 @@ def generate_chromosome_rosettes_conformation ( chromosome_particle_numbers , molecule0 = list(zip(final_rosettes[r]['x'],final_rosettes[r]['y'],final_rosettes[r]['z'])) print(len(molecule0),len(molecule0[0])) - distances = scipy.spatial.distance.cdist(molecule0,molecule0) + distances = spatial.distance.cdist(molecule0,molecule0) print(distances.min()) for i in xrange(len(molecule0)): for j in xrange(i+1,len(molecule0)): @@ -2465,7 +2496,8 @@ def generate_chromosome_rosettes_conformation ( chromosome_particle_numbers , write_initial_conformation_file(final_rosettes, chromosome_particle_numbers, confining_environment, - out_file=outfile) + out_file=outfile, + atom_types=atom_types) ########## @@ -2475,7 +2507,8 @@ def generate_chromosome_rosettes_conformation_with_pbc ( chromosome_particle_num rosette_radius=12.0 , particle_radius=0.5 , seed_of_the_random_number_generator=1 , number_of_conformations=1, - outfile = "Initial_rosette_conformation_with_pbc.dat"): + outfile = "Initial_rosette_conformation_with_pbc.dat", + atom_types=1): """ Generates lammps initial conformation file by rosettes conformation @@ -2582,7 +2615,8 @@ def generate_chromosome_rosettes_conformation_with_pbc ( chromosome_particle_num write_initial_conformation_file(final_rosettes, chromosome_particle_numbers, confining_environment, - out_file=outfile) + out_file=outfile, + atom_types=atom_types) ########## @@ -3303,7 +3337,10 @@ def norm(a): def write_initial_conformation_file(chromosomes, chromosome_particle_numbers, confining_environment, - out_file="Initial_conformation.dat"): + out_file="Initial_conformation.dat", + atom_types=1, + angle_types=1, + bond_types=1): # Choosing the appropriate xlo, xhi...etc...depending on the confining environment xlim = [] ylim = [] @@ -3329,7 +3366,7 @@ def write_initial_conformation_file(chromosomes, zlim.append(c) if confining_environment[0] == 'cube': - hside = confining_environment[1] * 0.5 + 1.0 + hside = confining_environment[1] * 0.5 xlim.append(-hside) xlim.append(hside) ylim.append(-hside) @@ -3348,9 +3385,6 @@ def write_initial_conformation_file(chromosomes, zlim.append(hheight) fileout = open(out_file,'w') - angle_types = 1 - bond_types = 1 - atom_types = 1 n_chr=len(chromosomes) n_atoms=0 for n in chromosome_particle_numbers: diff --git a/dist/TADphys-0.1-py3.6-linux-x86_64.egg b/dist/TADphys-0.1-py3.6-linux-x86_64.egg index 3f4ec5fc46381ac5d6178b0096945340f37df368..0d5fde457996bffc2a9756d194d370c30d490f4f 100644 GIT binary patch delta 66192 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 delta 65282 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⋙Yp9zws7BQo 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�Hx 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 than the permeability @@ -1501,7 +1530,8 @@ def run_lammps(kseed, lammps_folder, run_time, if random_number >= loop_extrusion_dynamics['barriers_permeability']: extruders_positions[extruder][1] -= 1 - print(extruders_positions,extruders_lifetimes) + print("Extruders positions at step",LES,extruders_positions) + print("Extruders lifetimes at step",LES,extruders_lifetimes) ### Put here the creationg of a pickle with the complete trajectory ### if to_dump: @@ -2368,7 +2398,8 @@ def generate_chromosome_rosettes_conformation ( chromosome_particle_numbers , rosette_radius=12.0 , particle_radius=0.5 , seed_of_the_random_number_generator=1 , number_of_conformations=1, - outfile = "Initial_rosette_conformation.dat"): + outfile = "Initial_rosette_conformation.dat", + atom_types=1): """ Generates lammps initial conformation file by rosettes conformation @@ -2436,7 +2467,7 @@ def generate_chromosome_rosettes_conformation ( chromosome_particle_numbers , for rosette_pair in list(combinations(final_rosettes,2)): molecule0 = list(zip(rosette_pair[0]['x'],rosette_pair[0]['y'],rosette_pair[0]['z'])) molecule1 = list(zip(rosette_pair[1]['x'],rosette_pair[1]['y'],rosette_pair[1]['z'])) - distances = scipy.spatial.distance.cdist(molecule1,molecule0) + distances = spatial.distance.cdist(molecule1,molecule0) print(len(molecule0),len(molecule0[0]),distances.min()) if distances.min() < particle_radius*2.0*0.95: particles_overlap = 0 @@ -2447,7 +2478,7 @@ def generate_chromosome_rosettes_conformation ( chromosome_particle_numbers , molecule0 = list(zip(final_rosettes[r]['x'],final_rosettes[r]['y'],final_rosettes[r]['z'])) print(len(molecule0),len(molecule0[0])) - distances = scipy.spatial.distance.cdist(molecule0,molecule0) + distances = spatial.distance.cdist(molecule0,molecule0) print(distances.min()) for i in xrange(len(molecule0)): for j in xrange(i+1,len(molecule0)): @@ -2465,7 +2496,8 @@ def generate_chromosome_rosettes_conformation ( chromosome_particle_numbers , write_initial_conformation_file(final_rosettes, chromosome_particle_numbers, confining_environment, - out_file=outfile) + out_file=outfile, + atom_types=atom_types) ########## @@ -2475,7 +2507,8 @@ def generate_chromosome_rosettes_conformation_with_pbc ( chromosome_particle_num rosette_radius=12.0 , particle_radius=0.5 , seed_of_the_random_number_generator=1 , number_of_conformations=1, - outfile = "Initial_rosette_conformation_with_pbc.dat"): + outfile = "Initial_rosette_conformation_with_pbc.dat", + atom_types=1): """ Generates lammps initial conformation file by rosettes conformation @@ -2582,7 +2615,8 @@ def generate_chromosome_rosettes_conformation_with_pbc ( chromosome_particle_num write_initial_conformation_file(final_rosettes, chromosome_particle_numbers, confining_environment, - out_file=outfile) + out_file=outfile, + atom_types=atom_types) ########## @@ -3303,7 +3337,10 @@ def norm(a): def write_initial_conformation_file(chromosomes, chromosome_particle_numbers, confining_environment, - out_file="Initial_conformation.dat"): + out_file="Initial_conformation.dat", + atom_types=1, + angle_types=1, + bond_types=1): # Choosing the appropriate xlo, xhi...etc...depending on the confining environment xlim = [] ylim = [] @@ -3329,7 +3366,7 @@ def write_initial_conformation_file(chromosomes, zlim.append(c) if confining_environment[0] == 'cube': - hside = confining_environment[1] * 0.5 + 1.0 + hside = confining_environment[1] * 0.5 xlim.append(-hside) xlim.append(hside) ylim.append(-hside) @@ -3348,9 +3385,6 @@ def write_initial_conformation_file(chromosomes, zlim.append(hheight) fileout = open(out_file,'w') - angle_types = 1 - bond_types = 1 - atom_types = 1 n_chr=len(chromosomes) n_atoms=0 for n in chromosome_particle_numbers: From aa7133522337892a7e947516d618dcc5879a88be Mon Sep 17 00:00:00 2001 From: MarcoDiS Date: Wed, 27 Jan 2021 20:14:03 +0100 Subject: [PATCH 9/9] MSD calculation in LAMMPS --- .../tadphys/modelling/LAMMPS_CONFIG.py | 5 +- .../tadphys/modelling/lammps_modelling.py | 51 ++++++++++++++++-- dist/TADphys-0.1-py3.6-linux-x86_64.egg | Bin 229186 -> 229838 bytes tadphys/modelling/LAMMPS_CONFIG.py | 5 +- tadphys/modelling/lammps_modelling.py | 51 ++++++++++++++++-- 5 files changed, 98 insertions(+), 14 deletions(-) diff --git a/build/lib.linux-x86_64-3.6/tadphys/modelling/LAMMPS_CONFIG.py b/build/lib.linux-x86_64-3.6/tadphys/modelling/LAMMPS_CONFIG.py index bd9a687..3c0fd76 100644 --- a/build/lib.linux-x86_64-3.6/tadphys/modelling/LAMMPS_CONFIG.py +++ b/build/lib.linux-x86_64-3.6/tadphys/modelling/LAMMPS_CONFIG.py @@ -26,8 +26,9 @@ mass = "* 1.0" # neighbor http://lammps.sandia.gov/doc/neighbor.html -neighbor = "3.0 nsq" # Optional for small and low density systems -#neighbor = "0.3 bin" # Standard choice for large (> 10,000 particles) systems +#neighbor = "3.0 nsq" # Optional for small and low density systems +neighbor = "0.3 bin" # Standard choice for large (> 10,000 particles) systems +#neigh_modify = "every 1 delay 1 check yes page 200000 one 20000" neigh_modify = "every 1 delay 1 check yes" # thermo diff --git a/build/lib.linux-x86_64-3.6/tadphys/modelling/lammps_modelling.py b/build/lib.linux-x86_64-3.6/tadphys/modelling/lammps_modelling.py index 1396d95..1e68b59 100644 --- a/build/lib.linux-x86_64-3.6/tadphys/modelling/lammps_modelling.py +++ b/build/lib.linux-x86_64-3.6/tadphys/modelling/lammps_modelling.py @@ -997,13 +997,54 @@ def run_lammps(kseed, lammps_folder, run_time, print("") if initial_relaxation: + if to_dump: lmp.command("undump 1") lmp.command("dump 1 all custom %i %sinitial_relaxation.XYZ id xu yu zu" % (to_dump,lammps_folder)) lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + if "MSD" in initial_relaxation: + lmp.command("compute MSD all msd") + lmp.command("variable MSD equal c_MSD[4]") + lmp.command("variable dx equal c_MSD[1]") + lmp.command("variable dy equal c_MSD[2]") + lmp.command("variable dz equal c_MSD[3]") + lmp.command("variable step equal step") + lmp.command("fix MSD all print %i \"${step} ${dx} ${dy} ${dz} ${MSD}\" file MSD.txt" % (initial_relaxation["MSD"])) + + if "Distances" in initial_relaxation: + #lmp.command("compute xu all property/atom xu") + #lmp.command("compute yu all property/atom yu") + #lmp.command("compute zu all property/atom zu") + #pair_number = 0 + #for particle1 in range(1,chrlength[0]): + # for particle2 in range(particle1,chrlength[0]): + # pair_number += 1 + # lmp.command("variable x%i equal c_xu[%i]" % (particle1, particle1)) + # lmp.command("variable x%i equal c_xu[%i]" % (particle2, particle2)) + # lmp.command("variable y%i equal c_yu[%i]" % (particle1, particle1)) + # lmp.command("variable y%i equal c_yu[%i]" % (particle2, particle2)) + # lmp.command("variable z%i equal c_zu[%i]" % (particle1, particle1)) + # lmp.command("variable z%i equal c_zu[%i]" % (particle2, particle2)) + + # lmp.command("variable xLE%i equal v_x%i-v_x%i" % (pair_number, particle1, particle2)) + # lmp.command("variable yLE%i equal v_y%i-v_y%i" % (pair_number, particle1, particle2)) + # lmp.command("variable zLE%i equal v_z%i-v_z%i" % (pair_number, particle1, particle2)) + # lmp.command("variable dist_%i_%i equal sqrt(v_xLE%i*v_xLE%i+v_yLE%i*v_yLE%i+v_zLE%i*v_zLE%i)" % (particle1, particle2, pair_number, pair_number, pair_number, pair_number, pair_number, pair_number)) + + lmp.command("compute pairs all property/local patom1 patom2") + lmp.command("compute distances all pair/local dist") + #lmp.command("variable distances equal c_distances[1]") + lmp.command("dump distances all local %i distances.txt c_pairs[1] c_pairs[2] c_distances" % (initial_relaxation["Distances"])) + #lmp.command("fix distances all print %i \"${step} ${distances}\" file distances.txt" % (initial_relaxation["Distances"])) + lmp.command("reset_timestep 0") - lmp.command("run %i" % initial_relaxation) + lmp.command("run %i" % initial_relaxation["relaxation_time"]) lmp.command("write_data relaxed_conformation.txt nocoeff") + if "MSD" in initial_relaxation: + lmp.command("uncompute MSD") + if "distances" in initial_relaxation: + lmp.command("uncompute distances") + lmp.command("undum distances") timepoints = 1 xc = [] @@ -1466,8 +1507,8 @@ def run_lammps(kseed, lammps_folder, run_time, lmp.command("%s" % thermo_style) # Doing the LES - #lmp.command("run %i" % loop_extrusion_dynamics['extrusion_time']) - lmp.command("run 0") + lmp.command("run %i" % loop_extrusion_dynamics['extrusion_time']) + #lmp.command("run 0") # update the lifetime of each extruder for extruder in range(nextruders): @@ -1483,8 +1524,8 @@ def run_lammps(kseed, lammps_folder, run_time, loop_number += 1 # Update the particles involved in the loop extrusion interaction: - # decrease the intial_start by one until you get to start - # increase the intial_stop by one until you get to stop + # decrease the initial_start by one until you get to start + # increase the initial_stop by one until you get to stop for extruder in range(len(extruders_positions)): # If the left part reaches the start of the chromosome -> Stop extruding if extruders_positions[extruder][0] > 1: diff --git a/dist/TADphys-0.1-py3.6-linux-x86_64.egg b/dist/TADphys-0.1-py3.6-linux-x86_64.egg index 0d5fde457996bffc2a9756d194d370c30d490f4f..cf130899c4349d99d667517b3a9e6c38350c1df0 100644 GIT binary patch delta 64667 zcmYJ3Q*175)3$5d#;R?1)wXTh)?M4SZQHhOW7T&1Ki|9aCs%SFnM`Kqn#{(`IrsxV z8-xI_APowJ1_T5I1>{}8(*QpW2Kt{iZG+hX{~sjDLh$@gqaa-Vry!6l|4ZP6)Jpju zq+}EQFSDsVryT2l5#!eM{}oC4=^XiAV6NT+HrZMh_;5&};quH3VvlMTEXd2(!;$`cbs73GPsgqIVk zf8{<}M1o{>B0?nu4c*5=rnI?gk)~eu*FuQ2Mc}g)2*{1$@hewV3!zY^c&OCT1jK00 zwZ$mytY-TUc$10b=Yn_L0N4qSK=h-K-5IWm=^$s##2fdFCwAS;_}RZV&|M&g6jhLb zzyJD0-$I`tf_G+KO?4Wgr;T`GEng3AURgRdrqRexj-+OPaJ4#6K$E~XPhz$YB;x25Bs1S-Ik-+e)U2b2YJ6)z(r#enH&4^$cxFE6ea-T4u2EdcB3LNX;!HWFpRl`$V&-4xa%P6=4l z7{T7mEy=uORA}a2&hqp%8H>g`8V|*ZGKh<6bK!WfYG{*3J;g!MXD-<_@YiEqtO#Rq z<(SvEVc&TTx4GZA{ex1_)|5@H*|B1YC!Us}5GF9}IvAKm%@SgICg~eGN(xbP5C|alAGHlw!y6@@G(?0|%V& zaaQY}gzYDW1*@RhgjS=2jRQfn`e=w%ru$qipK@x!A5x@Bw(@cedBo&B)Ak6Io((NKrJ?4T45&&+6 z$j#8^O625o=474zee52(-NB8)_vBcbnUhRb1{%v@@G^BB zs(5aX2-qSb3opnf6tjZ!FXzmN5bwS}ZiG}Yuyr~3BSFxWaiXFq;YkdGX8QveQQ*&J ztu2-OJM`$yB@Ue4QynQyYZ|4spfP#yGmQ>w~|O~#>)pR2M>D-lCF!LA$q?WWmM zP12AN(FJ6hK`bA}Fq11y2SAsQ%yNg#UEQ^9)=oy_bQ6V@2w4)xz?NCqn?#X3thPXi zxuX#tR0Vr*+zFMu9g-IX%1yZ}L<{=LUDOA9Yg`HE{%*6K9ts@)4m_WRpLQ}gvhS~C zhE3;^Am1|^Ye&(ApSc)oXs1#yfwY#$}zKTVQ*no)}MtGk=Qrr@mEAP$?1MV^l(CgrQN=J4z3p zz=7b5?a|$2e_sB#*&-W~#ldulSE_l)?QSgJ)CAsgnfZC&g;}TH4fwhl+2UBD8L!)z zOq1&sB7){nB>^bX;?gQmi5f87sTrTyoM5=|-jRMm+;PG|B4<9Nq`?sbGuxa8X2v{* zKKU6W3O!<2(Wgqo&9ECsRyq~DpFu1la@Fb@PjxzuT@z0-{!V*(@6$(%Kryu=T;3cH z%7UFL$vwuE*Yeh6SSeVQLLA&J$X3obGH%vru>@J)yzw`v64oz4TreiPho|3|-OCJPsROmpNn9iP{LSiW^LIID)55iR~8{}i0T z-f$8$PaIY>6apPBXFHT2*X$3`#3_i&C-ML%a0+=gGt+`x`4uJk*PzQpBGdN+zxb2h z9rJkKgaZ@sv^X9Es;t;3V zIw%61nPnELoZGC$tUd<>Fb)EPr#vpU`qq9+1c+n;DyToL$YHKE>WpQ(NfX#IkDzKl zPv!}bek;TIDl;)jQ&fcCpioj~(wh|QMN*P@W|W^L+>#}zpGnM(J`TAzTR1olMfK;? zB?X{ySELCUpnAdg`7sB0U%`<_3z1^X>_PJZ*G=9wSG#<$8mG>c>fbK!M-u1sS<^9r zC0bM}3=@rC^U4`Z3^Va20j^ykhrp;8-ltc%t=o5n!m;EQDxE_G)q^X~{uLRdT67NQ zOk`^S-gH(_K2t>SF^890i+}%7M6@@k&vN9ka>kkmDC)@^GDeOaQN|ctgrO^{lA1xf zl1wEC=cDY$T9Ce>4_iXuWf;{lk2ERzI6_zAE6`c#Hv_j&g||h+h!253%NLls1~RCS ze=zWUB|$hRXdX#4iqmUTlrx$r#-6lWM7L~j<-r2>7Z#5<+>S zin0U&tfcnye^6pJubwqpr~DbXug!~PB@NcaE8KWg1(jq|i!U92KnCba3otmY2YHWB zBBpAv-KL4YJd6?s&0_m*1&$5;}S2D(9FiQ!+(kp_tG9y<^r}!zDjp=5{fxv8CG8jn-V0LnqRTdcok!eU$z}NsA zaf`laCvOO_w0&m0iAOSAGXEY7u~Z%E4c_nTXV{LvNm&%nQHr0ZC>nVaff=$~SP0K_ zr%IR^z;686avdFNsreKFuNw@dI(V{06ZuQv8J0iMb9|rvpeT#}5^BobfzDt&SCySH ztSG2`0U#gTVy@s2kfTJ(=-xRus7QeA5Qx4pBe+-bhAZ{q>6tS)gR-xbWH>Lsj`X_( zdnDp@7J28qQ)1RMxUeX$R>&b-9BC5k*-|=8Gl<8iAh7ftx3b4+Q1-AN{e1#MTGFd% z(&mPKOa*jPxN%?suit~m%eK1Tv-h*L+r1n#Trb?+(WMcz7x8?ce7@wz87BZj3?=jl zJ6U_5;I+>VRcp}YfnwX*g$GXXL==1>48)Qh^CF8Y8hnBoM;g;P3WksnVkcZ3$!r^V z{k;vRX7rO+#OD~ex@|&eCh%shlPiI~&OA3nQp(&Zh(qR1J;kt4NA{UiZe%Ga-?zbS z=qBu8d_R9hYL{hjl_jfF1r=c5(Tc!z6F{wi>gF^i;2h!kPDx$(Gt1fo#C>dyXA70qpb~ht1OtiS6dnmWFasd&POWh|pzM=H z_HEC9c!=sG4I#&VnzF_;aUtyXB>Jd*WWL2Rg(wwQ3#{~9{f=F}@YLwU^!P`c$6Soo|4 z^e_sEFAJqIoQcd>a*Cc%W#6CtN$tRh=Rdg#KUh`0FlQ=>sv~f5$K6MzZ*z@w0&X535$}fH3Q^<0o%C2*%GkqmiG+3 zv)DMoX-`1^lOwGzZecLFW4VyJFd{dNu~tbtFHoA0-9B5uB13T4N6#k_@wZqpcjQuR zy~lnEr>PQwGLo@Tw%#~VGhP7t_dE&Y1VW8(tDRCwr4{I2dSic$rPt$astJ&bk9nKR zRvZP2&H)WE2m^pBap#aXc}UzIW7^(GJH=mwGxlO=&HR~xi9TS#u*4vK{Id|;EKD1Q zMt;;=guvrifGc zC8A%(mGz=o4S?h37?dqB3_62C{`Ffqv%t7tU2Q<+BLy&g^?Byxv8x}ewq(*N zTKIu(l?BW!of?fJY?!Qbi+=tk95#!>uQ%^m#fCoy5{2q+56_g>HXo!!D91VV5|ATt z^jiKajKdy_`yw{n{}``_8~U^Xb^V!TtSS^ehJEX+{5vggSmyy>3mf6Q!_Gg?HrXoY zhlwUH?;nhjYxHzU1Y=rypb8c^PTk)D#V*wE=?w5Bq7oRZ|8o~3nY0B3Vk8Vo$*}jM z{Z-hL9(RWpjF~(QBoOR6z=yX$5iv7b6-T%S;5GE_-p^&`%EneZ{`Pfp z3GhQHe`N500c(Pxtd*%3aE{%pScl1NS!X)xjHm>w94G0bD1(PDbR3;~99|QW><}C> z`T^|4X*QuT=&2o=x!=!xV%D8-I%FZ!_P-cn{dUAryCtPxmtowiM}LvQwU^<~I`ePz z<&2t}U(H)zQAjjkChn_>z-NxM6i#fUGa^H3^nX3In4;etV8f(U1s)WegW(HiVMq%4 z%je|*zGV34Df|o2zkDqtS!lj4SH^C40RS&i{)jn+3EK8LfZt#QJZQfB$idmtp{8dN z;gn-2^ix0h>B5fgDHj*EUZ7isNx98y$Hq2y{t_XmAI@lnMzAsdTe|)m(T?dTWzM}{ zKp=;JE>dT3slBXw!*;$uGT|1ZEp9hPbx3hE!u(T|Y5d+f{2)$rA(xG;05DE6CIHM1 z{BNJ-Ld!_6sjji67VuQ7Ei@}+u?)M-VD|bErUy;ni)y*&pNoC94w-lQ5zFvO2flim z{qqrb#Rg6_My%o56Ff$Q&@|4dVe*gUDA+QY%d35B$jKG|JO(cu{si+lIdm6G9FcNL z#NZ1m>vHOTN?U&Dg)NKxm-j~ANdPqDl(GMUlL4oA9(gOpO-FfcMGKT&lnY#RMug6sRbPab z3S3Ljc#r}=p@=;!`q?5ef1^hDs1v@f>Bskpd!{|n7M7=F*e%S7XGb|bA;88xYnR8z zS>5kfv2TVvMPZF5?|A8##v)qST^1{CKBZb@3gT~_3nVT4=KP?~GYmJjJ!aP_jo)dq zuxY-dG)(l5(7hOhFY?It>%xN>H9%*&=V@#<`C2z8N`GKBYac!#-^`+ z+{Ze(ukMbbriZ5H+bq40Ihxz)%tb|cilBPZdn1*b%s+L$VWEiw9^(gqB2sXcDu(=p zK?_wcEZ~oE+u4e*Z=6cW$Aj>9r5=E^Y3f-}^GEtL?StrQrPdx$13)ZQ^1W2=)y;D{ zUNrHmKos(vb8L%qrA`#y`B)j>i2be5pSe^!{dA<$!(N*BTkf^ym^pn%R9T17^Bk(> zwTqp%)-Uqb7SRVhg{s8*LFOgerApZP5Sc`{Dj;n;4Y4@SwU4W?o|4k1Eo_!v>vo#v zYF2fTVeVUnIDEIc1R&Iod$}N^!vrSDz!AipDBMMh#r*;+jgTJg1%YhDixX{cMUplZ z^N7{rj$#yvP@nAt1@RyqnCKH0TJ728JFRm(|%3WQN>PWH+TI#z{5* z6&zV!mF0nBle1wy)O;fkc~4o7#yeACweeccmQ^kk+){;ruTtgYmU9B(dSkUh^<~hR z1R4_49)HRJmxiPQ{0HCy4y=SX1|uwUgnE!Rq~>NTG4U>cG$P{#brBo6H|G#qB~-p7 zg&^)ZIJr|lwHb6`Pc)EmjotUiJ`)(?Ccj1qeiKH-GwE($Qu+k?a+G=36K5~%vAqTK zykX)0CDc2Lb$w`DxLQZIW-dz4T&D6PbIa|ald2i7b6>o_`~Wr1Ab{8${(PO*p#n?* zfYo!&F*=(TeL(9|*fU9+8&=>mT!?No>5)+zN(fuS@o3XZwB(noxe1yfb zV3~RI(y5aSeN_lW`*UXa@_%6DL*HV%*kNB`42=YE(L2y25G~o|$)yz(u?U*ShN5$h zJQs_6Y0Qp;#V543yjDfZk}*DMM&}&?{nq=0Ph}skS(tA;tUwOMQPj)};s3q?N5WBo zGYWPS0!=PV)^eqf{no*EQ&JZtTbMG$eV@`>ijup3R6na9#w#`pv`U>rBc%!xnQ0|s zbuc9RNG_V`eT!w)rLhp1TI(lT3g!IcL)B3^Mx{6eo3?wpgtuUEwK1 zH)v}_O!7f~yJ(VS%4Khmp`A1}bzl;JX2gu++mxGg`#3itqu#8}F>qfVCet`MK~6|R zw$$_lCpW%B=gPEOLqlhs8mt`1`wGk01-jM6{dz{>DXyL)0~@_U6e|o?tt#e}|Db9UxL56MpoJ*2gA7;_G|1iFKX=_1*-0TlXaq?5 z^EmT)+!NwD9!FQ$5b03-9IwrQ+%e&v+dtQNlInNQ3~{YXOgb6qfxii+^HlUB>i1XF zk1~JsoYO^)nD#$BY=Ai` zyTUu=L=EO zD8^@e=0Q?tiilh9o`$pQAz7Q4%Eu&nfwBxTO`}uLYqH%mRHoTikF8&IJ{C0VL&*$$}-bH(2C(j$=J;kaLl0C;?NTSx{)! zG{2VE)noWGEp*^6_IBL!R*!Bh0Yu3Rf+5O|cePy0$v1uw#s)XkX2pbF07dYF z$NW+>S5gy;ffDK>+fXk7cHaY`LW6?ceK?y)5*?|XVxm4jok7y@bojWDr3LEJMO z0E#M1#wl8RbZSne+Qz{b-aKKSwn%~`(hS7HEneMxDlZ~h9BO5P*AU}DPL05dyQHFJ z=YHGK_$)b3`CfYCK5w2Jz`aQV4R$hj#tE3mrA0!T+W3> zO#VYPd5|LRX%rffggB+&tnz33Xs&Z$!QDUJ{QiDN3UPWVRh94! z3i|vS(F9L7iCb|+f>Bf+*|g-LdKMDgK$m@5v%1Ez)rbs&h_W&yfTq~^BqS)+;)iB2 z30AVIEy@8m2xmmbGJR@Op@$k+%yo~~>jjH!wYfYG;OFDg4Y71E4}z6R@TD96@xYX) zZ)S=`WU`EV)JDEr^wD0{L;b*q0HL-C*mN;G474JwKzmN_VykmqEu`)5#gAtTBD{-7 zY}jqDdphTlC%kwq;9q`+c}}HC84Lub3KolO+Q;QD#hekn6I$ta)5A?jc|G7WMX8JBe0(@(EQfG}dj5+k7z*936u?RTeb zuqS;qlmfqN=?S#=rrr>2eE_6v(i?9Krn0aJrNK^%ziN2IX5gT|8a>m$DLDAq+?Lz` zi{+dizVr~w?opA|yJ&3LD|6T0+3emr$(d@+9=B19riZ3YPYw5f{eL*bDAK_YUKNv_ zpp%-b)Sbp+0XPe^6I<0p6Mj`!yvyluar-z-fkV@B_cFbVG%i&v1$-vc8;r)WEoF>w zTqED)5VQtF^tRj`sI%`#GrZv@#8o{Kx(}I&&iOnmyucuN&U3|B@-4{Zdu-WRYJ`e; zW9)J%38bafoig0PtWyd$3D@!+teQ(2EdhI(sWeTD0Fs$|wRpZP`c0Q3U~?|VtN?7~ z!od`p*BLh>NYxCT>`T#-yOB>g-F#U3!^^RjJ3ciVJ5Ljr-R_eM7CT4!Tx!UDmYaDU z#l9Re%iZqCRICw<;sv&^QFyk%esu{OtI(lBW!E8+&U1(v>wQzy`MJ}S%fQ*LVP_QL z!fuZ!fNv35Jzu$0fcfV`V1^mTeibG!oi4;ET5|KLB@6Ey5Dw3vR(k2soxqvJ5<+I1 z`zo^*l~D|m4a8@EjnA;j(w&;lOMwt66aNkoViV1KRC}DTQ}*5bb){|$sL>xWN+mAjPCl1lXkuqfV~t!&v_0I)S8gu*?Sn zf~#nn74j6y3pfX+l)Ne|lBnpQ;I5p8hhEAdY(SU0D%n)SG%Ww(fe_~on}n!V>#Zmu zV5&!X1V(wwd`}ss5Ld&Qq38g80w&`t14Y>ASte6%UIGuBN(3IjrPY3HWf%szPVedl zh{3_Xa~%YM9$6ZJ)5{03UmMyN<7r9-pFkZ`@Y|8l^4bZndGjQ z0Jbdgc~IZ*XJETsK$(1b;ZJP+h+x$K^xEiI&c0H5{gtmTsmuO-$Y2iFgJRoQ${U{9 zN(?)h?za2ku7ruR$HH417 zVZ`BuIGq1$0srzgi6p>FRSPze9SfQ6y zKk2ZY2_I3^NREI*Mm+ddt|W90h>@kZ+|@*;d!HAqESptad!BwVsMh{Yr398yh%J<) zS7jms17WAP4|8J2`M#VgT`nJA?c%Y)530t}tx8{7foaZZGR8Y~@KD^Fap z)aR`3BT|Nu(nf+IS+{^@aBm_*RCh$9!eudEg*Md2+ywiTqyJG4oYpU}aWj3rvN`ih+S$f^#pZ8&Sq&m1Wx?~-Qed8~^a z0V{iGzz|6}U8Yk_4T0_09$wvfPs`u&$bRovbP`pOgb*9GdnFE9>Q~PR|2OmD8d>?f zd9eAlAsLAZn?EPhfL$&Es0R2-Y8$UfA=Vz0sVAqpGND4IdT{NjMzoE061e}MS&u|Z zUk}A(>@D$eAij2 zQ0Ed>-?y0+Zjc)tQ z>-KtnzCPY@UtYea)b070&?{}T)if_Aq?4vOwc!&T=qJhJll9lB*Gt-ifJP4tL9UQEktRRA-JJ13H@s}Zj!zpUQ=1mr4RGSrcypUY-nwVAOBZF1}$r# z%KmngIePh_{dnb+FqY)TJ+nl~%zmaaFVmLmq?;zY7DK5Y%-}d1@grOSzb82 zp(h@{JtWTOkI^QoE%Jf-Rq77va4nH>t+pE;N>$HZle;epLJQvNz)#r6V1S^M$mVr~ z)H{0sbRt9kPy*X8aQ}Sc27@ifL6pORQ5qO^eq|B-+6`E({j~Ia^h}oZSuhEz6w;=Wl&N1e)-qnt2@kAX{xclCK^O2Miq7HTSw}Oeg{{yuaaLIW z1bZBF0D;op=$n>!DB)}IuO-!fenKKps!S>Y*w8^B880-ZZ~{J%L4O?JF6K{3Fv@5R zM4oF-0P<3C8I_*VD&Vq z&(rA)vrCyHM!4!BFuS)4WZy<6q^01~T?EjMREJ>Kf9OP~Kqw6ovy*PEEZ78KJ(5QN z?R-^Ln&McKNeu7khdxFZG%hDAXCRDZ%|Iz2PrO13R9yIO!#|ICzhA08*PHrGD(_9g zXe2d+C+d@@^^n%1EHhnn7sYaE+nDOTOLARHB|xrkY2Nzi_WzyoqIvL`eKV?=Y+Aym z@F)=PR)$QGn7U+`3Z@-hV1w~Y|1kQeMVJ8-l6tscg$zl5XE|onlw%v8!c7WB?gHny zVT$b0&Fw497^GyE;HOQS0pkLm|2;wfL)5*OPk7#5r|lt~xI?AaydU*&)nDiAO&L<{ zVD|NR|86LEP8Ku9sv=Qz;KQjpxps%%*wn3G^$oGKMbB^1wODl%)YJ|!wnYzbF@;(! z9Z>JvRrW}(q2nJG|NFm(p8FXc_Xkcb80PtgM9l)T!wz=;$xa6tz%%-d>|SzwDB&so z&_$Zb@&pAzEQekGyN)abwgiQAsLky+Iau_OGfwp3&YVMIZQ;y`zmV``c|;lHN|(tN z2vG_d$}gUDT!^d@+BFn9iyTd6)^Fd@Sr^;b())ea`F;4k)fNQk`+Yk#{e+y3CYY@q z7F>lR!D9w6>Evbs7G(wAx2z#qr?g{V-Xf(h5Zv$eHY0i}tXd}Al6}zbbn@u&6!&-@ z@RD2iIcYrnY7w*wty zM*gXh({}lm!=$#S(j)1UeMHr2`BoZ^yj z)U#?F3G+=`=st|LoUNy5z^vRHVqz;1Za-#Qm0((zne&qj3QP$ASCNzDLnLtfZNZHn ze6ja=Hi71V(Y1!v5lG1E-!H%~s0%)mTbIEUc$c<0Z&)e5mHG6cbrk`d|+kqV=F}m$kuteU2MJGRzQvR7?qs>vk*(if?W@2z? zR>Rvlb22V96Wbat+v@{5MaF@hanIzDeHHxm5=l8ztmUr@X)z>0pmbR4j5SNS=D`g5 z#kd0CeAN?24iogO*Z-u)35DWhjiohWX2#I~cVZ0wbE+nw%Na*mi=R@jvyL-imt$@I zGmrJq&kQ;E$(tAh1xsYMFC0bizFWl21)Py6pDM=8^^iEwXw2N{NLk1|Oif z0LH*3j~0=pdxnNM7t+`jnnH`Y@OLyuox|`?!Gqc*^UR57Gz!ecnR|T64Od4>X^)*< zuxpx&FoDDoV`Bd+5;sH-9eIgO+;8XSmpji7LFG~177;YY6fSU|3YG_+3K{(Nz4r#V z#}8e5U~kK8&HHnHfj5(`sOfb#NOJinWcT|LU716wM)5U918JH!I*+SjU!K`~=g1KU z*1d8g+{tdd^V^<@*I6#0`S#}-dkay$rSJQj=<|v!uHq;I5By_vAm~cmF-3&LF>O`M zpyuz~H;6{QI5^tAUDwbX|KGQ;vh6+qa}#>{`MEG#0$iG1krcQ*;VM;1 zzW)~LAYIlY`J3i6%k<#IR~hC~nui5(?8R^ZBtb>KCL#-{L9Mi>AsT%{j`S2V)m^7&AKIDB@@u6JUSj$hWr9dY}PcxhhI)<3yJ&R=IHQk zE;$-BmYxdHKz`A5HLw>9>l`rRV$6TlU%m~JEWPUl=jbVJZ2xH1zOF5ZiPLRfIJP;z zd6XcZEL~U^tpwjY?cnDq04K2Ec9dBhgBqSNNy26mj@2 zjtW$cEEus=W?a$_tQkqdaZa?9{S{&)8Vhlm^QkoXbZdcbZ6KRDgqg+ZaUm}tzZ$9i z?dGkE#y|OPHnnaN`c(`7kw>I+p8%6?z{$`G0Ux}vh2@PpZZCW7<6SJJ{3Utz_{0JA zJ_hmg3?GiTDxumm3o5<8#{=AVY41(z@6+;K-k^AU;&V?;7BW7sVix63O&=%uTs?&1 zv|TbuA$gyD0H6U9PyW^;qfV-U3PPXr$Vo6u^~R1PlCgB!@Wu%s*G3b?e~R&bud!_u zDUDRZ8f|W7Zu4R~sz=w>4LPMK5Oau~XT))L+YqyOTxNG`y-5ECa3R!s)x2fUf9(YP zNUxC6FBFjK(y>h%L>BRJqhqk9X3el-I9@yF{k0{WKE3wz`6}MwvPg|)twnjwzY14( zZO%kNsGCMqPn|g-Azv2 zjcx(`jvR$g_Q$lFV$rxdl}9JHM>{U1zMxF_d4xI}&5MgDxHTD&kIXWH>F%x&6~Flo zh_gg!w=N)?FLuu2m<^;;zjm_&eLojsTO09i5vY5cY?KDbKK4Eb_{}a2s}4vfpuuMq zXMv+m#d{4DYmekZowY(^{(R=t*oLj8xHR>3X*p+Q8K2G7onN-#jENw;@})6vsT*2E z1Px($Px!pztruSY3t0l@)RL~D0BaUirsIXBmL{MetE0r0RkmgL6`8POL;J8CI) zrjr;M@h+m-iQRpSd~*DH{oJEw$zx!OH*nk0PhHw44j<86O7zP=sV$YKPq>2HBPSbj z{*4n}j1gkjpJs%>3QC-@o~C}A>!Ik!9RN6}F%ckW;aQD2KUlkcB#krOk3MHQ)Nt&| z7UfYy;*JS*bY_VsfEeGsoT#0O{kyMyiH&93B9y?Glk!B(+wh!}9x`!&+=Z0KC6C0G zmDSi;VaZR&RUtzm;N%LFozu?vcug<+shK38tx{~J1gr+Ws*q!>wpJucvx(MSS|3V*VDN|{Odr>;QOt%ZQH(Dw3X=; zH}Tj)KVA?fh(c!8`=~G^-mxMXNvWLS6L^mtX*!hm?gcP4Z79(;pov|y{rqx<2gec< zKeRD#aS{&Az`_R>WOr0S7rvn z;I*ER3awTSf*b99d!rXE|J2s7ucG*EqYeb35|h(rlB3RjsGOg0->u^v-2gO_DY#DY zuz7WhfE!?D81vmy>;Kze>vD%qC?U1B)GV*7>84SDptf8d>{_rsIfg1cv6!8|=?M!@L+~N|JK{+<9`2|&2oHp_pR=N z5K;?s=UH2a%Er!vM{U+-NfyML){iRf-L7e0%EHl+wP-luN8i&kg90*X1oZCivh2iD zQQD*xm!0lW5KUl@q4y!M3j_qY>2<5e7ns3I>^!Q3$y81Jnf~N%l}Rg~yCRr%phZ0ZA%~U{rIOZ9vc7g@MUopcSt& zFEM)1q6ZCJP<7~Ug#cv8-so=M4T=b1WukHMzM_y}j|nj&oLUN12O6#HyES@JaQ2l> zxHfl|p20A@1Rdyz6biZaL*IN_&HZaxP|Se$4|gCITlBEMCZ>*9Zp>0hW5*tFFb zovOZYWc;cgxB`cexvn7RH<_x=IU$+&JX zWJH@dmEDDO7TjIK*?BNQ9i$m%ZLJoN;TTiS%0{PLAEQN)QG zdJ$fT^}Z}6oDIl=hM+gW5H3t+izp&h&-Dafu@An#SZQ$ zdQ#nD+u`l%w3~Q8|J$WDDenBQLhPb?yycA&vRr=H-NU3=cb#mU0Nf8N~n@ZkJdVc9(9c#Bm4N4AY;lv-xIKxvl$X{ioZY9#bB=H3+@&6s|l@iRBhajM@_n_Yw@Rvo4GThZ_{9ZPm_BWrb`e7LSftL$GL?FTxGM&i^3fDs?g#|tZPKXB#ZExl4CY5WyIoj8$r;gLyj7v1@ zRc_j@q_5uBjlLCvE(;XhhT9PC@4*5A>}!>phm#Fd1EZdw#+P5Syk0n1AY%X+u0No3 zD+t{H_un`0H4q;zka#lbxjPw(N||x;rB4aoPKLv$RobBJ6BF&l(eB>xjD~lJYas}! zoA0fx6KcsGS^ji?Y-vGsWu~uZI75k zHHQ|(>L>tzLOP#_e57)^bNx{R^L{WC1(u|5fwXp$lm3RFimkcOE6B1O5zsAJ0`!#Rz^?TOA?w_X;ev5r;wuqhy*7Nn~s ztzqe(sM+<%iF;#~Dg!BxaNDMWY75qv8ReBg`t7{fs8q-nYMjGRS*SzNr;{7W{+*_N ze+@ClZyZ$nb$eHCV{e2@7X#n~?~c~njZ#{D;?z6YGqruAz3Me)olp#+mM@9C8n*1Q zyXk~vKgrg#S9)>cU}Y@smjA(8dnAO>IRgyc!wD_Q2MRmu(Dh*9yb5KlLDs~gBS6U9 zL^M4v1!jsYroBbL6!(!cbNMI>WvvhXLy3B$?Q+J@eMVPLGVY6uTm+!6{9>E2)H_3# zXP-z-4!tyfoOr0!hfA=b9^UY29&dE{L#2vHm2IY1>?T6TfN3XL_pEuxQMh5)M(eVw z;sI6C=;ZCansu$?XU*;VyMWhwJFwx6`1pRizS4EkPEdRI!ADz+OVqj^(e@&iyUEtm ze7hyw73%(yc9hX`2?qFsIN{RUp8UremQg-5p=G!q$I}^ad-e5ck2)t-`>-to4zM0^ zrys9(#*qhmGPy7dDp9G`y0&DmIX1W7i%rbpJdd)BA+3Td{IRw7_ZRZezK)4P^e-M^ z3Frzq8j-#P6H*K(8AK?si0wbfwTwt^O>xx9RrlCVnxpM*d^Uhm;xbuALR*Ob7aqd9 z8&XMDuSxD9%pmI+tO8?Fl&g8w?ar;wMsn2b=7v5xj>V6Z;R)kSOTjvfqqu7@EDVao zan?TOZnRA1xdmeJg=i-2X>!40(5a>HfE%iJd~Hs&t3lZKyO8v%lt$TdbyGMox65PD zxT8V9tIb>ROD5m|URC4Tadc+#Pd5YrwmfHrScuIKtLTnONIQfJZgfWo><_j!o{gez zX!{$qshab}EW<$l@)qrFV>hI=HHJLnmb4EOye4;Zq;LXX3xqcKSus*&q`Iz$Dq5m0 zQmkj4ggboWWnlAw8&q`-BDBtDi&t&*8GAghE=EJ)t~)>)_=rrg!9Uy_m|d-H$l^vZ z1#MdHQxiC-aJ=ZS$BWWsO|alhFd)uN|ImX{N)0ziI@lO`Cxk&G{p>Jh43ZXK3U3|w zl8e)BSqEnZGpSn4`XiA?iwPVu4(enQ;Ga9xNV%EAdGL83m2=LS4SV zdkLhURRV%$;L1O^r;=uxcsqO%cReygYa#JG73s*aY(lIKYa*vFUu&>#x*MR)8=mSGrHq0xelVXJS>rWoQgZ z-=}etC0ke&tU_(LSro8iPU8;Sq*Hr|M{bxU4yYhgn4hMwD>Ww7kGA5{5UMSo?Dgz= zi&Q&w#^B@Q#Wgn5d(Ej`f7ylU*kDTPq@rM|9iyrb!`;ALb;uiKUKr<*))y&(_;FgF z_kXrY^|7_SH~S%;-_`D$IV?Eyp5lk@ zUZ0zQPnmk2V*wvO2D>+-t=gHGu3l?b<8+!@pq*#+SS;IWQ zbpX_Ya?ew#aojTF3j-Rjk{u!1uBq764cROMs-<_R?XH^I-eB&WT?No=3o}nR-IJbO zi!V?fn=H_q2m9TmO&~G*$}M6}Ptj69oXej%9s~P^mDZ;!@2#{{dzp@;KlI4|nWwA* zDyuul)3m%@eVg&;YLg~fdPfF`vmLVmC%dp*k;6H18nU~^{dDtZ(lFkG!r9O#kKN%S z-14u1EB6#~)2A>k7w?%T$k6i~9j!$%- z$1H zaOTkT3ZpzQHBp9#p+hu~N{*^M9H5*^4;bJ5s*tyr^^kx08Dd_damQ#|Zy}gdka#QL7-G=q9+B zZk{Qgmd&^jt2^pdMyh0|C|@>nE4zJera6Jgep!+FAyi##pNr{hVvcI^DV1M1= zIShu>WjSuXX}fZ;(S3Rvh3D}k&X)~T1iI~xH`hVQaDea$*)+*9@EIVI`w;9b(jh7* zp+pWnBuP;P2}H^5Lp=987ww{p;bq8`Y7?LGCg~7OfQ~aJoL)&Kb(kOvaE8OSEY7r! zM6s(W-r^3}a)k!F6x(!Tk&VMvILb+*)S6HHN!gN%mx1jlsW^_gB=e5-?ftg+L z+X|sw!XDMx-!@xCcQ&TPSL+TYYH?ePW^IxB-!_`vl1+?!tQW5I)cPYv=28q!@aEMg zznexSAnkBb0?74!*x%o0AAku!{}IaFtA`yGAspyNrFAA#H*Mj1JEhO=<8%;HSE{)F>nm?SAoC)jFR`vZ!fa%R(PukzGu3?SIRIq{#9MdwX^}G|eRYljLF`g2eEKY3Os3ECU65_=x=L)kbl)V8X5#%L$n4M z3@TV;5=^K4EP#1CNy5DO;{ChtU;ohlTm0e_?>A2-3+{2s4w(5W8-^3KiXX3W9@d~0 zwt+2D=7K}TJZoV-8`0ge1PA%pfz|reney_%R2Jt$Ppkx8K5ku8i_&}mg<-Cq!ZbMx zEM^YqQl%L6_(3$gj(^i+hA#HSYnuFFyxCPe2a%Ri9B*;=Q2+MuQlQ0ER^4aC=WSC_ z>!^FEtF{hMKD~MW;&tobNuUdr7I{*#@iVD)3UmET%3MLu)A;OQBX%o^oVA);dYU`z z-eZGzz6N_cX^<}{61v%}R8Op6NstHaVVp;v07)v$vTz(RWPjZZ?L7oYY9{n$fVYdI zmGJw};$2d25$^@X#WHg%W9~d%|Xjb$qj zhvfL0FH+c`@#8HlM&erPOP1&+UD0>GCZ5~ z-mEV*y-PrJLi;hACcG%u7%_mQPjMhkS&YB2LN2&j@pBz3|3)evXZ&=z^AxB5&X@2VeoQs zl33gfV!e-A`3We+sABWKclh_$-+{sTW&vg;+FwRt9#Wo*H5r{f$A8`2?sJ}K_f%MxS9t2Ja93X8nOk9X&kez_ik#;#E3WQ!3PS(r zr$>fX^8pnQ%)Nj~ywWK@y;m7JbkL!(K<=~GEW1n=lMxF?BeFyBJjLSDR9&h0I*n#g zBcnC*Z}HI!b`HvuP=E8X7W*rE#BV!v{7@8tzjBi*Zqq=|;*~Y@w;_NZE$;3TYT#Ww z1h~_<)o!<=d^pS-V{d1-EV}JR0uH>BTgfi&F0p~@cM;CN96jjH{=@x6Dp0{oS2Qa9Q4%4AeN zlq$)Tl@`$6j#h2mucZG`zf)CALcfG{DoXo}ef(v@O<+v=5uY%;Sq4vyR3_RVXFtwF z-Or$@eV;}@FMp!haLKxzP6w1qk@+pUj#BX(?Fm#Ru_3VQ;qzm)RY&5Bv0M`%PruP< zJbEND_5A`Bkzd$j6dU_8v_FO~D&6oe0yt#|>8h`ca*6OP!J-O2znZ0cbxQyG=vP3g z+Nh#B5yohpqb^*E>w9!3E(h}jEsBp+1>Ub=G^4#3eSe|6;4ftE=*MIB=vSa1AW%Kp zqOrjQFAEx+<847+Z2lciU^-}&Cg&wc5g=Z=1TUkE`n}uk2z)E)RdK|Pk0nih5c4Jz zn{Z21vCBN4pBx|aSM3aBX&kmMlI!D9GCcn9^7~^^`Y4UY({Oeq3eHF4f=C?2Lw&2c zFb~m>Ab-~Ju#zNR%nzI=6X6A@_g1hF-K23Iu~BkEhi9UTyd2IQLRjXgmc5AagoBbw zsPst!AIx+W)5*P@8_wiDVf-&s?`dmakmRf3$sbOXSl=EbFy9Fy7Oa4!Mp|rLe~9v2 zIvo?y#P9$4&wp^O1qp-sjd-SvAuZ$Q5sXF#tA8jtSE2nx=Ca3aJr`QZn9?HsEq+1E zu#xQ+;PN%f1nfS2R+5;FFl?N0E`qjbfW1#C2$>m^N#jc63N*M7bBIwADVWkK!iw(W zE-_!0*7CPr-pH9kL_363HLOb2?6&qY;rgOw-dO>xqj5{-agx+p{@z3?dk7xFDUqt@CQRbVQl`lX#eqA^7UxG^EoHH{=K-}je@>5^&7k@~#8J`bLQ!>y|AHSwvbz3(eluWL!o7J?w zInzZc%c81#AU14O{b^x`+#^_`j!1p2uSAe_nK1y5WAY3Vp&CtzN}!R@povVT<0_|k zljlOEQxBtBD^MM)0>K?j?cZCEtezNK1wR3`>D+pcVt;Jw6u8#NoyEAQZminY3x7uV z2|YVx=ln{G-upUrS8rJ4D4Bcq9y z4+T-vZZnN8K&bHCrLs5ZGk?n(g9aw{1YC?ZTAmk?o5G!g?5zUXD+Af%APcmoI8Pr7 zVbm#}EOQCut=IF7vQy7T=Ij&)1wHh=)bmI(wduzN1L_8X!s2f)5P$+t=<15p;hQbh ziVLK-vwKfloUywoO>k!tO7#g339MboR|R;Mru39FrB1u#$jPth6@U6jMPV&Zi`zq! znVuD+&S+m>Y`1Trcu;=tT@A#n{ywpB_p@-VqrbaHY@|1uKjd3nsgUd&-Iu-Bzf~zG zx)eUHw&5w_KAs{T7JpH5vIxwYmG*1TPbI5Uy~;Ia_0uy?y&CiSiLc%&+Vs5hw@9K* zXYhU*7PRLo#iKBdYhkp}M6O4)vfq95)ze?UC=~*w;0gj^=dwT=yVkQfGgcz{1e9>H zh>YzJKH6wg+7elCt}aI9Hk`ssd}=vgxX979pV~8`bJjw=#((3Utf(t72ex0U zpkGY`n0jM7D(LI4Y#FfC=`AIj6fszt#_4xCgGF32g{~03Wk---`uXF-+2O<4p&z}6 zv%`n8!~fa?08Pw?vqSw9%}EbuhYx3m52E7_cy@St#(zV@goa749*zbdjs_o&1|N%bpp_AMwFSTdsjkJbMh>~XWy)dpX z_Sm8)TS`isaiM_|!fc{U4 zb{vp27kBN#+G~903PQ!2X_h=P!L*8si@E0L)_*FO7>$Ix(h5O6pv#-(Q?M&ZTAaqV z%;T0xuCf?UN&RkV{bbH+)bADQ^9fu)prrnj^7=LcCH0>c>g&r@VM8~#8VoOyo671x z!}?Uu9tD^`WlIF+y|c$?#R8#WdDaG67b@UYt_%ib@1npL1pj)l+qFQg169j_!J2`= zXMZKDg2_mM$rfTCZb)}KCc0X_Zy0&%p&t6N)~_LsE9geraT@)+cGVq*vp$a9U{?60 zUMTB|NY)a}*9~mFiAVV*1yX)tL9YIBkv~;ghlE@5o(I2pVe6#j&bLmo|Zmn z?f~onm>#;351LNRpcDXYs8mh1!w2}YoCuH1(Ob#oVzOzr(Cq%e7XM9bp??PY zAvpj4PH?_Hf8rYm+)z6TrcuOXsWY`>3k07kBOfEJ|L9xxT071Nj%S=d3%t2sr_nRD z$vfzF+WzDj#&zQbdt&{TboZ*-+GpR#v#r`WQ`^q6-q=0z3X@H`Rn?&ERz+iU;#ie~ z^|ayNw>Hkq-nY)6v3DMkCgEXR)DlJyY zmb!(9{$0munHmzdkFu?J=Zwx-?TXqz;E@T(-A}2$dZP&`GdXR$H~{7I{9yQEn;O3K znb4lPuS>RXHC}e^Q(n!3qxEH*SSyDxPMfU-BJ?R1rE=a-vEt2*ua@1nYI zmS>9cyZ$E5-u-H#ZIpJZ9z>ai>XDeBj{kPe6#6SXuvektcz3UGa$WE1%bylNLg3}SF8FMT2?7QAPG zDNU@5jiPLr#^-V(jUp7hnXIZBmfCQK9Vs<)5Q`tX=8r##AA9g4E)9cZtmhAOTdop# z-Cl9UFn|5$d@gQR zEyG-sWyvrGF*}mCn^|qhL0iX--Q&M5z}9)2I|}f@*?q?ztABKVb|$ex{jbFL zr_|@F@WVcPgRr>XaH8*5^5vHZYy~vnG9i$2xB$Dh^SrO?MPIycihg#5J0HE&pv}0? z-7_dcEF$N3#4U&0D}Tc6x^N5NtR(dgC8!zvSXgTf3zXd;2IrQmxWYmE-_Jk3d;RW* z6LCA|GFhZrhSIwA6>s}7EsZHOOY&LZA?%Egv#)5rV@bE)XaFd?5%mqOi^!+YkrTEi zXA#NPpoO-)n*MZa99XV=xOg=^4qNvL{+WBb13o;7yno!+p?{XW0GZFjux$t4J8Zve za87j~4hjKduUw_F;Lfz!jDuf(ZTYN|)>_-L4Vl_pP43Jeovij|P3KA@Qz^rmH6nkg zA9bRC@Y$(8g^%@R_j;8g%67VyA567=Rp^~K7!w*mMGQ@$CO&SOld7na-WpLQ_>^i# z1+}B&Q9HWZsec`v8tMT)>#7|db*8gY?U33KVH+2{8!-?Qf;f+m?uQ-3VR)Q|}@o8#p4YDwk<8O|k?!BCg}U z2`5*Xbv+krGNYKXG|hw;n^P-iCxdANJ`c&JD+$ zT(|mo<(hK`Q{iC6%fw`*KVM2)9&u{n=%j*GPq+nE-Hoo@yJSh4j1ih}HJG;Bg3F{{ zR<_P(jN8~nQDzjCmQ=H^7JWY?Sr(s9N~$|5)PHGXxHt#gq7f*fbE~EJ3GCwoPh_lj} zsVD3s{Z*qN-&U`KkYOk=9yWmd?;KXdam`s*xL`L>J60-a8=*JoD5r*h*XJo3u z^X`G~-d%CoXaS@8-QNi}Y&m?1xUjk}WKqlVijbwsb-g6RDSyv;-WU(&a0#3cqkqF6 zWi04pVBGo;?@MbG^pFZ;x7Y5lU`Kl7ed&-p)E}h>M4xHxQBY(Dnj?lx(KZ}#+fMHj zTw4?#zpVm@yj#WGW;41NBegJo-z;@!?QN%hz(*mkg-iGRX*fg1(gP70Mzj5P&|rHi3b{JaudyT-4pvTN6; zSr(7bv8~TK575>gwneNX#SbqS8 zLh;`}fGer$$d->uo*d;so@~OkGwDDp#V%+>NjjpXle@i2sc8u^Lw|TVhwR*>p@q1j zdI~KY4L2=mZ;ocy8rn)RPY1hvna5yLOd1u1LMo!j@QZC@AA)_s!m}jzuCvr7kUx@B z<5|;#PdsK$8TO5 z9m!@NAM=<)YcY^r^)wZO>-l-<|Jgsl^#`ZrkEL3JLpoI)qJI%t$pn(Ru|r)Ay&}*G zEB<6uj1Rj(?aKI=EO^?CgP&SwYxAJh>Dv5gU{FW*_dVrTyleru9OwoBi@>T4{iSv~ ze1uB6v5kLiBfnf2{?G>g`ZW!6tNyr)^ML{Gp$7Bw;k`J7(6jp!1ND?09dHBYHtr_$ z+~)~`dhXL5g@2wM`=roQ^Ke0N*B1UM^gJ9lY<1jV&WAt7VZ(!o|G~unVB%lz`QlCd zyEM|*F~&cb+DE^W@to!16&G*l96h9%X7oua9fY;*kA~t}m^4MxWLc5Yc~?`@f3O$& z?1c%g4&!7pvX6R%-#a3Gp4_q~#RZ%XTQy9E2&#O7Ie*rkqPfwIRdc}k>=5e6(Ptu{ zW-i>-(ID1G;PlY0je;#91Th173b@3M~E0O7->O z6;CZs$Bm(Tdr}f*OaWbzG^N%KLWO%F%F?jx>y2C>N7Gx|`y*eAZrQhtHN6O9)&T^h%L7CISbtJO-C)@b?z-NF);}{m@lQdMn&y5- zOh@-kQ+7X)=mmvs;|9kT=4MXnf~7k;%xnDNxJBD5a%m?F)jvkRS#>>tENn(7+cFku@hn9%quWiQe@ zWGxe_t$m*BfcM$I#Jx6%_W2^7jD-0yG%j17U*aXNop#3zTY4GeO@NfVZ$ekg`unYF zi0}N1l`KcRA=z!)hSZy7>6<(8rqDG5)qf9in=eL{Y_fW}Y~Bt!0d|l6(R1_)0Ds+9 zUvG&9PyVdQf)=oL$J-B?X2xbcb^wjBL)JvQ(rpXA4wI~TbpQmmzsPU&*-MTcG?2x! zvIg#S19K>e3~?1}q>=D<|qwE0TjIjVMRI*(dvlJAeAY z3YGf~8B_{v;?WcKS@Rk;eUT3H#WSGwJoC?cqW#sC#VdJ zd{&sR_@+S>_=Yt-&K0eb;xdXf#)*M{4-ssqn1kqckWc5@0JRNQ6<{y7hbNF~G8=y+w^Ps{B68%bPt$Y@g4&|_tk#mK#Jg+`}eE;!;eMbXSa-xb$#&D5hMj24% zRU+?bWVr4NaFibx7Y%9;biau}i)ys-w&-QDV6zAsOMn7U@G_j^Il!EP3W^Zb9Xk|d za2-vOd89H2DMe4@xejD{A%ABuot?1exvDq`BRw5I^SHK>Uz-Mcc|OIQ0-oJzN-JAr8vY=w9BJ(8h_7Vo$ffXCYn5A z?e(9>>i45Gys2wxyzj69TUxe!wBUPiu?d&tz%x=s5J&U0J4~vk^HaC@Qz5zSy2H{f z8z1Z#vSQf!hf|i*QvD7gd~;%TUeoe zrQ|NBD7aydUYJEKI-T4YXx9U@yDiY32WU?MEkG@*iewOA%|d%ff&=fbHMZ-ey+9gx zpmw)}+Vet%Ut8?BHr(9QBTD5#>QJ;uxF9Ks*@_Z}X2!Zp$vx6;i^P(UE?Yt@0) z!E4-wu#da3I)Ae^t)8~HwJ|S(GFy;~3cEn>!YFIAPvnQpZH|=TTU^?N9g?MrM{{^d znbX;Cyfi56C%j$9r(_T1{IasDG3}gR%B#Bj$-W-9!!Ef%N9hAiy0<&1qYhGZu?af00fe85sjwM-W_%}<&QcHR|pwOpByQN zfGtniu7AI5SM=1^OUpahGOK+hcACPXS?UMOjZ4)w&HGGEu$ArLcQ;6?Q8z4e@vLAp z_Sx6`Mm6)-efH7zDMzz{fqgxrl%*oO1hhq~Ar9OgG7MU{KML$J+$fuyU!~C#!aesJ3IVe%K?U!GSEzI2!?Zgsh^p&>S z=J&4iedh)+KD@Nfe?WfamU5w^&4f=o8T9EwL4F9SCR%l>467mF-_p^x-feG1a|n8$ zh8Sn8eygVL*=Y6~7|eb{V_6MD*-orxnu}=~8(+KjSML>V_hmUNUTE{*Z#vVo-k`EE z&wsvPo0(Yj1*~0b;=)T(s^0ZfZKXbI^82)GrI8zi*6ysTqxYn3udivVAiUjY1KW+R zvRVm$(83?I@CPmYK?~oZ7QRCzdv`kY?o{OMHDHHH%~z{f$G3jsv#nP68!CT#(cDT4 zRL@rGpnA5_3)Qoof~cO|?SN_q?meiUUw^FXxq~}<*0`Ey?Zuhjl2h5bykM=`;|G|!w(QkdxGUnT2#Ekj25H<6tfU)TnX$Q>g znFFDxqojc^5u}p~zDCOTvLrKNCh1fXeic%`|6;UAR+uv-?o0953iYH6{YIcCtv$lw zY$=?K%@7t++m;z@$qMT*T_j9w70)b&_vTrL=~bP7wlpYqaGedp$wY<5+T*c1^QZ%N zXSPrW?#>LCqoM&Le^(MmQPIO()Pme)rle}u2(@w7o{}m(Gum&x@I14tz7ZL= z`=R4S;akP3A{}HgPpktz;`Iwm)fM3d6*GCl1S>_~!NoMPX~ z_RDf-q+y&zEJ{<{$R%u&T=2|`=slJ4i^wq**>w_+81BiOe+xe3Ljc}|Q(TT4A}Z&# zPaB)Tf4~Iaoj1nM(Mj%r9A>_t-|Z9N^6pDwL>AlEU15ctzr5-1Swd(5Mu9G;5y*uS4ziZ(>#PeLSl-%&A$4;&u z(j->7e%yi*Fb&v}|GC3IFi)G9*hTzj({D%zPqx;L4K{CsWpLM0fz=K-1nvk2?&x{W zF9XEdyj)%QP8Gf@6n@}^9q>YdpfW**G3$y43)O2OkucEa@<6;$>9*@TG0Rqu z-(C?#c-aNr*)oD^@i@l2l0+I+WFG@at>G$U3ad9@YYx?#gLEIm;-)D3EeD2A&2@(+ znoQz(mc%1tbgBvR4SQNb5OKt$$T4FIdL>1Y1<%Dci_m(3x3<+G%+qq31oZv(e<+Kl zG3FlS-O|$1m&T3x1d#HxA+!>_1 z3P=xIk`hpVh%HH3>2mFrUT6(ge^oFoUiHTB!)?GmEaAVByICrqZD~_w)!?UNJWVMH zJiPUk+u->vcgWF68efQH@cS@5L|6zsCo(W3RWDH==FOgvf~H@Hl>lFuqLT$eW~!2E zsYVd6CQ{OFkoEyP$NVhpul1Imf~qIlt5BAmsc$Y>O&G(254Wx3rpSXVf1@l8S@Xm4 z;KS1Y=I-FbUEvL`av*n*e4OLD^?Kyfkit#+b6&A1lvWy6Cs{$SDJ*h7iQbw?W zxan%|1?69sH;PKgdjSW{A@jR_2s}?~)sqRX_QG7Dw->NNx-d;(f8$%XF1d|JtqQu= zTIV*2XewI{SB>k#pb8V-CS6qIeLc(OF~4Hxgk9$O{N(sJOU8M&NXJpy#$(9m>F_eX zj*i301!x}m<#f>LcD{DLwlDLkzG!*AOi6V0Ivs2h;C&)^ta)>D)3)Kal;VR7mVpAAw*zWNxX6W`dU!-#wqepU3lIwV6+|x?nBqp;2bV#u^ z7)}ndd!YA`)bc*l4qor&u8lH1Rieus2MX^e~u-zoFNSOmDRQ% zFkZjKEj5&w6I~=xvjEDxt3)EDg);Dz7 zla(8q!CFA}fxK9V^}prz=6;7oqYIkU*D>AQZCjVsssSGX(3kb90X2W34>^@MvI7u^ z8AJI^&su6GN22F11py4A=M_XJ0^~2(?tc?H1tZcbr-DrbRlbZ8e_cfi3Bf}Uxf*|u zmkh$1H{vO9M=|ymr(41>7cTUN?3zQ#Gng1Sd)M*`i)?5NrHvB30-TP`0W@LeB{1`H znDi<~m~t>gpQI3h#T$Rt)(8{dieTXUCUHcIT812lx0{yXlZ4OcgIo)4(EaQX^G^?9 z6S=@|Ef6qGMCgEB)Atsj(Py8!&1{J8KJ}XUuy{&3OVVj`^r1yqi{DJ?r!=&J3RZgk ze2tsuPac(Z+NfeW_+3YM&7b4UBG152&+K?DD|@b$OxKt40f>KPAqU?bZ#mw$FZbFuhr+0}^ZqWbQS2Q)m_ypNyO)8IfGO~3LBq56;=5kqCJ+Vr&VXD}o07GcwAw4)j_9F)>|7vQYdJ@F1_ioyAG_3= zqK?@`{z`&$X+?i z8^hA0VXcefQROr#{_;arakKCs5Z77uI}ds}}~K*@=nEUm2Pb-&lvRi9VOB zZWx?fx|)BeAwC>p@dGSwS%3K3A}*x4gtB>A81LmMVu}7?1puoqzt(Qsb&Y!4-g>=7 z;tzG(_1V16xcs_i>Z%a6n)Rxjqpzi?p;PBvCW-QdgViccV08*%M{_$# z0(N^Dx7+O~AHu(*XfEQjlM25&0((1&r&?`XTHk-}tZ(;lly_*EAP^O~3Lm+C`{qmc z-Lk6UvZCT$RmHoCinR!`_DP^kj>_{tyJ+R9Uj>mvKYhaz(w_T&KQAHZ(Et0eb&rRI z{(kb)JnuW_)v}`6vb@?|MYX%~YW3)_#aW^~_LnQq4#kP<7d0;h)+GcrU-D%Yggl<^ z^;v%cC7M$12aTHsFEty$I@BlcHobt!S18@HzFwebwNr?Rx`+LlLdC_YO)F}1@6GeK zZ$Eqj$aBCGR-TZj>-cf@<4pLZITarNWkl;vCbHm(wpyiyas6-#A5p){tI#Ty5e{ap z-a%!(jPPQ#RPma6eJrhl*qK%IYFFM0VkZ>qh=%mC>aX^7`^jXCFZ3r|DsiQkGp_+W zf5CegJhyS&9#fB{<+x-x`tyiA&glPtYCi=!Sbqd1oX!Mnue&Gyxdl1{g`8x&Ztn}B zmO_n!ZZ>1o!~e=+_6>VCc=yj2Z{YLcp*(c_Mf`>5>hSQd`kUL4XI1@xkpWzD;xQ>e7L{EIc*L%O&if!fAy#_w{kWOa0R*DgdrUBqr(!dqpo8MER6M2 zP9yyDRA%usFc*~Zq3i$kuiH_M&f1*lK zvE`!w{bpu&_DzbilH!g?Y>V2Ro!yz;dF<@0Nl3AhIbHY)gtQRpOVEp+1V!E#|0Pk) zUOa-TE$=TJY6r)Ps1$jt&SNQlaTvudI@7+uC}2(VMuBlqIf-{k{J=BFw9ui@>3uRj zk-sOS-TCPbKa1a!(Zl)a1AZ32e*?|!KPD|(_l|k9QrdwqESq*MKa=WvmB~$JQ>RU; zjsF&Nm+SOJESS9}weHIiFvf>K08EXSJhoieaKDIUutmHl?iP0qWxiT#yQ+y+Wsxnm zIFYemHD4*Yis}rv-y1OgL~?-q9)HGBzLUQn~bQ~gbT~mA{r3bD=o(bUaK9%&6 z5q%$>hOTmEwuFJZuFB8ZI=apl>9(f5VwlJV1RSiJ=q{u6WN`~ae}?q5s3n&*HDs^c z8$W!^1nhswzyUf>q$%wyArYdTL);ciN-^qWGL0}Y?E_}cR6GmP^EW!@ ze7&<+Rg}lg*B^aZe`1xw+g%N=dgZP(e#V+rzP6U4%P6og1qT72uxP3vmVBrTEUPOqDtmrL6+X9PlL5*6cK^1ys-DKr8xG>KM+gR$k(2n5pv zhv!f*E#o72UmRM!vjljk{5O&i{Cq7*(F@)I660WaUjx4bB*?+=4&e~vrg?J$>l=Dt z#m-mT)n4Xte`LW+cd2imgiARY61C!KH&A`?yBh2V|lNW_dwev$X zsx#1Pv!c8k$A~fewuBSlwuDhi*E<7<8c;3_7FU)oZnZLpLria)D&G`YV^kjLj(P{W zRk5bpf3@5xBWUQej0tu|6T%Ehzh7jV<|v5%xq#zPvbwux@~I3{eoBOvS*H?7^{ZiI zt7T1o2#j$mWt3DlZ!pw6!t+hL+M%~B;cKEp!SgEw<7OKN;j^MMco{IG?a4y^F@Xy= zhlBXU++NTZnnw0Tpd3tYoc+5GAZ5p0S{iyAf1zhKLz&4V-I7-d;7r~5cCtwlhF-etBY1*W__=_XQXqX?up`-<=5@&{|k#8mX7lWUnhnrtNU-l5Nn zg3;sP7rVAE{M4*uVF2HD`m?MWXiQ-4kxplpRRalwIYv4?S++b8{^Yi~Y?cVmU9*HU ze^-TXJ9=A|n+WsoZRzyKa<@)b`2u9!c1PWc1>Fhz4F6RwWx0&M=9rc`o4My~n z;vt}N7Mqa`oQe-75vG;^0xK{0J3vK7D_~VIeK!Im$62_L2h~6>Gt|D;5lpP~TQP}g z#lde73pznY-gOdXl;dLCV3U*q9&Zaoe;8^pq2j=OjM)?ifli@~%;0IvYy>Z-(=`exLQgpz(%hk7_3>BGtAEG4vzB>P>1#xCYf1jG) zXm6{zbu(1?2eHsxvHP6Jg_BU62^yK80(=bgq#b*XUiH}R!=frBR|!y(Pm$lSeU+z> zPjVA))>46|9iNS8f^~jDUD3eY$?0bfXZhBvItRa|KBO(lph&m!d<~*@JzuXK<4M zhnyyM{?jX`e(Vhqnks?II-5C2YBV2=+tvx)Wwz8CunxmoLuaM=k-&Jjh(FfZ?^`-1 z$J?@sF;iw>8n!cJOs$8(Dwz`DWec1Ejc?hMx&Do+b`5U+k~ak%Zja55f3WPgx*F;! z;UXLp=GU=N(cg?I@J!@&?aY)@69Ar5m?YLxFLW{NgT2D*julTjn@F4{lE*h8IZeI~ z?AeQrCS%uL@4+wR(9w^;&McS2SAYD;6AFZC!#47wEURUnuA8jpC$T%(IC#}N z!&|G~8Ln5~K2cfTbR?HVf0%r#WJep@F`ySURZ6GK(bTTfCa*E)gTi`~<`r!{l&fp7 zU`QJp=@=K)?ij3JGrk1}4e(T>tW{8i2;4O5%;gp+-nFL?DBhKm%_*K7hD>r8G6^9w zwnm27iN2o6L9*Cb6=`Q=%(bR94_p|5b~~coTocvM9p|Jx_T7~+e;*C*QPqWJc_a=^ zjuFC-z5pDn*G&e>I*i%;^PIM^GbJ5|I6Lr-IJ(YiKiYI#+NIf)ln|$^a#oh7i?aBV zR`nEy<~I>!T<5DC4-?6drtvm(nd09moEuo`q-fGfK@ip2>!O z5xyN1#avwZtv^-ia*O$LsUi!J14FdA7U zCVoq!YP|Y1?k-P2*mpPo);h~2E>&^Ft-GH!HuMdjzkoJkflO@Uq?M(gvlT4%Y7<2D zTuNz1U@kH#Vpj_F;qYo+pgC2yeTm(84m(h_H<+irqH@<_a&pgRxqs|;nr24 z46UC%f6AER!6-w^ocDNTtX4Y8s8)!x zYYTlTP5zsrOq-E8E(ZnnAYBE=Ia8jUa!BKgz-F2|ek4Xhgd1x!=sko+h1HeEbrfW*mRhR<&bdm|5_6x}Q*`#%NXdOg_ ze+k+pWcw2z9|ehwyUQ-fX6C6@FiTX*nJK$~J)dEgW`lV_w>aBh?Zs?-GTLA4yBQ`z z>xD&o^p>jlIqKP|Sj>Cci8(UFpU2 zOu+B1c;Qr>7!|wby2Gs9YPM6CR!dxUe+A~WIfk!Z%2yZN5b$v{mOzY5cP(WD_Nc|{ z((v_%kKh0B_RWW%UjI0V4YwRE1RY!ui;l+FN%6NI#brMGmneMpE>jlnzr6dauvg04 zp5g6eqE0Kxfx_%$u<^kR#LuG`$+GMJ5{4pL82$Z!VyA;}_q6;yLrm7io-%5We^3jC z$w>ELd=hrF#Rk>mNP1E%K8O{%?l+8n>~+ZXAb6$^I;{htzkWHd&jvJYigiOXOg4mO zO900s^>i6M#k2(CzjQDiGpJ{X#R&$IxWjkG_yxaZq|e-5P-!WDrTNPTsm=bh9+HT6aWNVAVur4Y z>$g5u+syNN?vFF-ZpVCr+H$~X_HbZ(DR9emC*1j$w5SzuC(6kjO5V)X3LI7S6{_}* zir`%gMcurC^+#Mhpz5mijw>-AZ~?0o>HMTEN=8wB)3r?*V4lZpOFn8JfAPS5!`6L5 z)qP_g{m*UQeU#WM;xv>8qr*kU=e&D)d$M&_eabUDyBXEn)j`g+Z|8#wVI{}&NDtH= zcMH3c9_vQZNu7l^sVj}HB4{9z-bTHb>qonNUheby=$0q@T{{8cScha{c$%G4ggsrEcG@^WV3be~4%0J$DsVhHvGp#XmU?K+d;9__54eIojv2tV?Cw zfU6NI@FQ8&SfF9F^EzM4Kp6RbOhe+bmVp7Y2gBP7j(Xx|m;v1D?X`iv{L?3PplMxm zf9uV5Q+PAQZ(htS`2sie`OjoFNz{i6H!{5^f-IYKNlTv@{`~&U4U{&aadjO(`7cmQ z0|b|Db^{u>cfSGbH3NI0JGW-_0igj1d!aj0o2hL{09-($zn2g90ZxDXh@GTq(+9K# z4nA-x5=q)Z)dM0yRa+i?slA}N7{{}5wp~B)+9eJW7r1fchWGm~p^W1&F1QJtfC^S%5+`8_r*Il)u!5KHD$e5E zI~}HR{yULT|1Y?7h@6aWAK2mpJbJ5n_6q>yj` z004~u005WR`2n*7d!akGj`{(1DG__2J5pzTKV&s`008(j0RTOh;TZuHm!Pf!43{{0 z10R3vy$f_)$8{k1-s^v((P#oq{0TmS1ObpBe*B1nDTxw47G;v6NLrLzqFRlv2GBr% zfcGBAM!VW^48@|H$c7zH#>qM!C-F`kPvT8H8OM|3$>!wjdb2rMuP2+6&FM2IoAo-G zD3i@`GTCfaCuer=y;bkiABv!5=eH)<_3D3n>v!wct*TqMj(2uOQ@^_BmCyWpP5D0* z&%a^#orRzIFMW!_l$63$rWMqpmhu(-sep=ZUm;iwr9x!)7sACzDpHK5qQ#C>M=_iV z7h|bdu`|_4;ekTD*p=!kCQ=D<2Mc?O-Kie3hYHE!-qc>QhYP*MzEmICBZdCrKx!$V zIG7qN4yA_3FIpHb?n~_>dq-g;HA3J0sr~fTQ#yTzQ^WKBYy-z!0ls)+4!>N*?D#Wd@ityRLXZ#>pYElErr-6_6)?i2ziRo_sH^i#v@Gr49*iH6c@Og%Pls(UGf$cr)W9$X?KCoS8J1oUs1ltw% z61xrYud=6@V(7y>;v$9nf(C! zAbiv82ib?<`wH7;ufjLOeu#Y-zKiTNb`QQ;_B#6rd>QMwp-g_F+7+EUrC-Sy`uyzN zqtR&eO&rRTTD>b{X7l;<=K6Zh$Y#u(?NKP-6&{mnJ(#QHO@GUr4Aw)NrTkLaDAq$p zro{3ktL`^*IaUv%vs|nP%}jBsw3tLhdS*#AoJ9 zbzin@)`J-%i+^9gxnV$gmNJWGU0cs%CgyrZX5zbY?Go0ckSP||O|W%de)7tdYd6y8 zp1peU(!0T}} zzIxxKQr^lG&Xr5pUR0+GhEX=E3sD{ZU8rPp>*%RlWq*AI8n2MkmoiW{rsp9c6k5-E zl1@{itCRkEIGrwKin(;U9!;mAu$u+6$I|JI%}hatgwknN&Zg5prx;^UIx^mRYH>4P zU^9yhx^lXZFKt$iRZgEupE@yc8%)RdnA!{A54{<^S`S(I zVy?Vt)jLHm-2kk=TwZi@8hI-RS@@SWOIhOx)UY00yNj1}Dgq?|TbG(D0v>;ZX*`agCc((x>jC3W zfZfQ?LUHQ;ix;k5$S0sM7jM3aNSEC&G4Le(dg158tdt;NV8R?l{seH($NaA-Pm+n<3t~8npHb-BHK16X(l0TfBq8r18FEIs2Xp*dct5& zEw~f}K87G->YC1aYX?|gZIpG?4#Mw{)x&kjCAj8?GJK8ed=#JttxlfYR+m-QpHz4+ z8?cf*$p(i20`Fr(pN`ZH@$Mbf{2Ml0>n_c69ZLr(gFMN5-MD1ihxKJ6pAOXyx@maV zj%EgdAJKo8wOSXHV~hoBhj}*}Ui0nv3kKKmqgc zK0sv1VFGh*@jKY;x1(+R{4EGs-Mg*Sj#L&~;9q}jf`0_ahXp=K-sa5A%I| zgpIwC1S);BHpL@5e#3A1d1PCKUiyaBZw;V*TZQmrwdqncujCa?K|4PROV z!@PeoV-517d}dn%`aiQegmipIE&WYic|DX@YO{a^a~^CA7+>Ls*!X}#zDJ=%PG~>$ z)}Zpb4|rl4(f52}MBfXs?lVf|&#hrTMJ@VGDA)Y%`ts2>efemcz7&2t{*4MyiG31= zNG0OUvtXaXhx!!Y){pRswIH4)rBoiL+R2vTbC?!tc=+}3YrfaQOB(R`F#f%*bT5oB zA$?#Y1?lJQFh~=5E%X}9yKF|J;d2;Mq~o*qB9!K%Q1c!OC?Y=!%uz)ZCKsEt=tRoS%5eD>5ke7e&U8gobU0>9hf|beY&}lH+7uTi0@j?m2w8m zdN3=)B$_+MV1g`}5CW_hF+DJCTgarAmh~m0T-2Y=A3LWrU{r^kxTHl?$8by`Yx{F9J3J!IwQR0w8}^%cUGJS!IJk zduF_?S;(*D7VM-83sKvu>+c`W8pUz&)W_!@9iMUo^l?Ig@dbVE#Hr(tG=$_zjFQZq zJazifT0?)HoSmJ8J{Mi>t);{(sG^O1-ehwk8KO#?M4Kk94G1He@NQz$1m?f6Wfu>l zAg;~Nj@dY5=f@C@Glb6ge0yP1PmjW>YT0w+mbA8FkZBVB{DB7oCrB7QTNViMS z;5IlDdvbA0XJsh8ON<)mk|6J5Wj^gL#Gk%&PHtQ1`QkdPv2@qRlltzLoiPF!MtPs& zNzjk!@AuM0R?HRBvvWW*z25lmpneTIBtsoyqnd*&I7YC-3r(rUjhr0#<4BGjlHF7wc=2&xUN_e6*kIha$($bp6d}#*S+%Eb3d(mmszvnhxhIX(X zqESotYgC4+z{<7rcpVm5I@;& za>J=6XDm4F=<>~yHsh8cO{dGiqLd^zHm#p?r+1pdA!bG&&u+m?0j$sXlq^KvM8-p3 z!hxL8?O^OU8{i6(Kg+}QiG(;OXBhVTO0JkU*P+4lK(cfoFQ!}>IMBe(a=@F~q|blI zu>7X!aLsujxH6Xs+ThICPAJB#Kq?#5Vh->N`9httM5Yfg#IyETdRxj4(=IZ1ILT1+ zBelFR4eeaWBMSha^@({KR5720c}MUG1wm*rGvuD!AS~nEJhN6Nr!XtiU5-(|x&sEs z+JgR~w+rS^0#TehiKOx5?CmLnjzxdV=+@RcwPrC>MCK_|64OQA1~zf3p>!-S_?gM3 z435ttYyrLnxvb)PdI_iiV%K^GDo5;=l|$A6Sphsz(X%v0na(zWA6$0uo%*Bz>~#*k zy<>h_Kc8F5Y!)nM^w}T)&1N9a8C_)BxWYLNOB}hCo?b04E+Fqj#LC_x&**>PO}vt^ zS+Z$O({8p?JY*{Am;&-&LW%2lfk zKai0bAYZSq0A)=V%D|$sGA&yjR#WB#VP4+9Va0Ia>IDQ}q6Jpo+FC#~65aw)mH?Q( z2rUFF9H7!hv0Tb$Da>{_jk14Uwt%K%fiYNeHJgUnf*82aOyiJ&nx?TsSl)vobP7Oi zLfj$7!xpAfvS!W**;y0!PV@;pz%#ZcTbc)2GE>@wg)NN6oZBb@NA%1R4l#K)($qLF z-iFMJmWgBaT$m$PqUaqNWHLT9b~{`%LV{@?ue2GjsbBP8q z+pP;byT!1f+~&GZL%nUo%+2Z)H(g4@2wOL?JXQ|*55husp-G`~9x$PD3>TG7AJ_#V z{5|lPC}wN90i({93wJUG2mi^xg=I(`;>ewyvg|PNLq5oKJ6xZ({GcOs00j_eAs2xSvFrh3%f zYO4o`H?7CK^b`6UPfP2;>rbA)^xhlwpjgJ&eNX4l$?|`vw5mB7G@heqVlUOWj*bBB z+Zxy&#(P?;_j^wDG&-%Vc1Xf84fE@pL8=!0d*9hN88%l0Wj-)Qnx^4;r*y$&gw6=m zOE6^h5Y{JO&DDF6dmwt4hUH6oEuDo0!*Z@3UP~i$TQ=%FD9Mt};Y^#BYgeFL5moabc2jsAyXlMb$@nq zF()c}_G4%3YNf7j)zxZ4fBS6A>b3hjUQ@Zcs%$IEjkpEi%IjNp=R}YND&*2;u^o!- zQ5_VUOx8OkWfRkEJq$cm8Vg)cwquI0H(Va19*0kA5#N`_T~@Qc4^yUDZXI}k;4son z!7=aDS`XX%-}Ru_(#9`tpw^S^_>THsq8+%E2VHk3ZV- zhi$H_KIE7FI06}eOTF5@pAvRIg|VMJJtVs60b~EP+cEXX4eCM*nmh;#xuwlgJqndb z3;UZIjSU0w$5=rlPlFG+{R%b$@#Dr1V#tSRjEaR;J%VgZ8oQyP0uCJ=wkwdt3fxor z6eK7~_}-^7b=87NwWqXbq=htAj@i8$!H!ukQ8sB#lKU6N4`X-?Gs+=B$>+>emjFkjAF<}m{}=ulpTM%|b^j_fLp@*+9nw$| z4bjZN3fIGb#mric;qZv&Vcd!xw7MUsMdQ6#f#<0(o9he(a3YRam~oT3dGD##m@&tKoouUyZ7x;Od3HZq@Ji`~1G77S{au2QlKB zri#B9nNc;Y1=XN0sM`KfH32?;_=PD&6k-O|VfyP<5poj#2B8GKl=~ro>332$|HWJz zAT$m+#^4uM56iOl!_QCUMOWBo{41P) z7ebPtg%!bWBj;>>6`GFwj5t?N+L5FW(WY7Is+2DzH}G+*K9AcEZohN~Szt{wo+tkx zm-3CJn^u4aSA#6Ht+KHJ1#A(pMF$j=ZAM8Wl$5kWtdpc*LM+aM9{61it^^NxTzeqz zu*coay(R5|(1^#K1b5Wq-V5#ykGmIt+%b>458Ry|cfVsBfRH%+x-bUHa4mUTWQdL1 zlAUbdnzo}FA0ht{C&qqAmw+FZzZ-r%OMXv!U8X%iX+KYXqfY2S$94!(CPg}u5t+zz zYEni-ZU~_GgxmzOPY~?`EAPH{zGUxX0DICP0#GQfd$yPa*|+y>|4#R&1b07w?Hq2| zmId7G&>MuHr`Nas;caW_54Eq=xI=@D*0@8nn++PVbrHsTmCB`DHN08Eo$E2P+L^J+ zMVSA$01!AkAbUJ--U7$PY78ZDiNOG;@r)w(3k2Q21jf}jk!n;AUo&!d^5soa-z0|D zT*)!n4|1Pp3Bgw5m&NwWm`NpnuXYi9SvAal56Z(>X?y*lkL9Z&ob#z@PJe@=iyTPo z^GjIPY6Oo>ie*d@&xo~zU8jU_XUn;zCH;s#wp2Za+`WvjvbAXB*$k{DjY4KiFRadF z0YS%5M#X@3pPinq?xpB5FLNcoWa(QuvpPcFHrOMcr1W2|3zf4i5d~y_C*psU5f$SJ zY|Jji9a%WUrD{KUxW#w=SG&#iTo#AgBJDF{>{QssvTBb9kmK3g0Bmj+>Zi|5&sRI# zHeVtpF#k8e4o>=vU%-Mn#^hdL*2~2rFdf9})dPe{si=!a^{|aY#J&M9wO+_u#ys*7 ze(cOt%-eaXpy;_&ho{?rQr*Cnn!p_58F^Z)ms5S$Heorsbv?JfSupc=a+jZh<}NQS zrTSX}0Oj(9aw*l@5@P0;i9ghRY zkO;)pL?D4-kwhpOAt`e$u0_Mq=!oPHq5#IBlt%!dS32!n=(Z zERA=w5YFQyS=r5h!YG*uVS}qa%g=l)@`k2Dk!t%ZqreN0T>0(Zn$GvH2DwghoBlq6 zzG2-04q!FRyLcCizM<6)EGw@ouPIA-qb&AnxHihQ+ChHM{0cxjm{)3tcC^ahSP{M- zVeV+R|MVrTHU^Lt*4d|6QIxstQ&_xDsU2orwQ)Yg5^Fwxm{mUjw&oZUe1h$P@3_^m z8e8q;^%bx+$C#4knZojzUjbJF?a=;-+A*g_f6!E;B-eXk zNenTLQ4H*VQvv4~z(H3WLiR$v;b*$43-^CsL_%}{qvhLKc5k7 z*Mg8kH=h7Vv+Q7PuJU0%3$68m+9aP`?O}bC@5|68ldE0GO|b#u{pLMBhoJ4c*qG!B zkMnsxhhw6P(6xL1MrNv?6= zZTTQi@RMx#4L^*Wy;iT)$NTv>*OxW6?+rgc#Pu@@Kd{=5Hi)hB!(8PjxsQijcy*uXJAm-zTL}H&65ee)oOv$RR-(F)0ozKBm|?R?*zP_O)(!(T zP2e8P7{j7{Giz-c06{KZB~!g?-dJxqx?HiW^@SOE*KOLwJB^v?1PHQoaWHdhAFk(B9B=1cT&>3po@J zg)(iGGR1sW=GPF<$qS_g^>Oc}|G3`pZ$TfuaP`K`S^RhM#O&!)r>5t#E5;*f+WSrC zN>?&gc4gYCSff)dr_fFR#v6_k8Z)BPDhkDYwOxP0Tg$AkXVQ1fG|7^z~&wb*xQhaT@wlqwEI(x-O~&gT;r&1 z(-Gsl9lh;fwhZHk7|1R>&xj`UYpDEg#`O1UQ0on&`k`f&nyw)2@&?j(b+@pH^4u_a zETH%^?p2VmAzn;(f^@khf*et)Y)$Jelt$$~MX`aKM=3#+4iNnQVzxSj<3Jv9 z;%!IVaz{aT+KQ!JSQ6;Kqy0&(?pw=k)k8+^PR=kuZk*B{@V%(as**47o?g~MdHF?0TsMYbN16@~Ituak1WN(<^R`k`2)hH|vE|-^a9;~Z| zF@@Ww{WJCsG-<9#kD1f!`RrODSJ#Y1<4N3w?6xt+VdT9k6m&-yz+;i$q$La17|1Tqih(#nG)r*8}>R#W2=VO2~W*Wd#P#4B zPO7GHhPrXRTrL>@E&9jpq6*TL^5X_a%D@M>(@}gpc_KbH>wGNfNna9M>Q}BE$$2YVrozmaN~4fk4j?bSUv`&0iPfp)%(>( zL4lyhp3opoC&ZAV3{fh@pgJA&s}m%GfMN-vWC@LGogI)Q2}#kQz3uEU+A4!8d=@8Xj(ItG;ceHb^!<*oOFC7FyGc$62U048MJ)5i777Tn+KP+p2Ms ze8b=y29s>u7lZEO!<6bCzhfKVVKxZU zahMI^=DR1IQ!gmtFof@Oj%F~l)u$cwHmwBEus!12*e{SL+ux%MDWrsCV6}_sY-n2} z+X1xoQ!IZ}4I@Mo;CoPf-8gPKgd#%@IU!?BA%~riaW{lb@D6F4Y+pLN1kmc(_HWla zsFo!P@q9*qQ@kVh>75AnL2ab6%16LHL7o6yXQ)h#J<*hYs3HAi zV|u6UqB{X&7+S_}oM~#A`IeSBPPv@mQBv9RN%A}Cgr0J2k2to|j_py$w&2*_#iQ(m z-4^VOg!|u7*kewt#~s@f5dTaAhWC2fHOkI5ggx0%+W$g+Pm$j_^22(g-+3p+1qvOi z>C1mg?EsJMgp6MkbPVEtuqD43yV#K5yV;<0C7k$fYd-C5O?HXLs05z`D3<`wMoWIk zcT~_q@c*XO&G)YMuxGYa_KO1w*xm!SeRMQ-&=dAcPS|DW?JMj{^7!l!SBXj|0sgZC zq!bHnXOtba^6S=KK1zqC>g_Mp#$=vB;}Cxz;|JFiwCw~pg1le)f6nUVF%Dz4&!!16 zc1^(b;70;ltCzx_bLxEEvE6WNHyzu10mkzP!|G#$+h`7LtF|~)$*}r)j1*4w^TX#+ z)^;3I;nA!LW!(7EEpMK;-Zsw{c9$m`tW7}p`=CE2WvhgYi_|K@cE}Frhx#$jJ{f=K z3+{{vt^&+nDLzI=ut!QdduDaO>8~s7UyB}MFWNDvTrWYN3dnt=TIxu{xEtn^!iD_; z_3qr+W1Q!mSd*G=4f0NCr=!*oKe{@+jlDkwqx&|WqH(@&bp%xlsfvRUoeoBHB1VAu z@_@1vH3sua?HJ(4-|{Io$cC_-gd=}{TAOac?=aM|5x>)j-+bB;hjZvfUg5|1G*PKn z_%y_@XIZCYmCsu`Kgy>8m#O^F+n=PvM)HGk5;i_7?0g2W9Oxo&5w08QU?wpZS))alQ?Sp?>jS3%@ zwfgX2U6@p7d+acWJDJ9oruidce1^huaz9J!?s4umSBgaf}UaUcZHT5%w1+-bsr6@deM8fk?i*mz$|pja)~0CU(O zNHfOrY>4gOMrE3_)?q#i-?@Jsf8|Tocq6t57s9fAggUMr|Ls?6Gccy-J($#K{Hkz? z_|m5Vx7<+M2YS2%W~F&H^oRn`TEgER>pXEEh>@PSEm+x%kq<1jZ>P(6zA+YCg}TIy zZ+PqSb}*K;_BCT`%NkpIo7!oOwQH)Y)>_v#wbvSJ-_#b`{o8^Spq77F_kUuw+)+!P zc5peg6E|LJ!e#V%8!UzTJP;$BG4NrrvhfKWBmJ+Q1 zy(tnUa!b}_jDT+me5PGk&fL}5s!`)xc3kvpY!N%nPITj2STk59i1=mO_f|927jsC$ zc;$g}$U0ZuS%mm6mGXbn8s?5JqyC-G9YDtuGX3uPwoaReYATz}yHy`JA0;-7Ti(1k zcFn&%An(>W&QZ2J%?7D=rmYEPh${-@8Wk>PatW_raprB=+Q2zY+G(g)r=j%moo?eT zsKcHXUdZzD`jw}7oNdx=-!rx2))C?2$EkHrR1WbI5HeglNhyEt@RR(wcV67tv$1mv z%{#Y{cOQn-cO_pIM;?jj9mKDl0{f7(Kf+J(N1(3VhUW1-<%#`>fMbug+Ucz%_*6*b z58{B&qqme&La3x>TeU}pGHFk&A&Rxo5Nkoi;*atL$m3m}JTTuXV12joDt{MyKded5 zG=*{s{b>lTVJLs#@dvOL{4{?TKeH6@^llq}XrJG>rEH0{zz+cA58C(-<%@~($+C6r z3>e`py=67m<*w#h(ztOGJ3R(#>g^wFStox8ZOh8*NSAtO&go*?1GsCU)*iDuIjwDJ z9rhS;yTAOpvX!uO>nMNxqZsE2w^d;!`h+NjH3d*!6|H{-an4qr=VuA_6F{SqW)NIM z4K9)I4-pM>!yO-Euo>b`&&JnoDfiUXWBe?Z@HKTwWglj*y&AUmT9JFIPz(z(ABUKz z;XUq3;ZLp}v$}DOMg5aRVN9#@p30we_~6%__WFop`(cXhuPi~1 z-CTq6{fK{PH_6dmu06%xsGWng@_85yXYPqr?EFhw?LzG$l;@-TJiov%Lb{JpU4^*= zbUNtipO5b<)+Zp&g@%6p1f;px;Pay`aelNV&L>;qe6l6ZKNBTtSUvq%8^3?v#_v;9 zm-Fu5l6^7i9Q$#K4LQM#dyb!{nfE;O#&646=_h~qxrTKnwYQ{OqfUSJVt?LK1noc@ z@FKlP1F;_}C+^weoT3l@D}LSs^V5#Y&b@czIx1eSFfUf^Xt%GwPPcg_J;0f?*Z4ha z8rP!RTJ7EZ-B7xp1l(28-;NoeQVEsL(hsqmM%|jS(`WQILHGXHUORl z;(rd}|JTswy~Zcnavk$JHVQhY?c9madc~~DG zld!K2DAv4neDwtT0@(2TuY^kNq^R{}_VeD@g5P~WieG3*vF|}Cb_O>79D3ksNOM`b z*)23L-a>`?A>eEWjjvlL!T!Z9yzhbE~J>e*>w9j3n}W{2G5wTu<2< z+DHO6JxY&zT*q?o>r1{H%H*$PUPwq`@^?E5xk;Q+$U4*MWs7k5nvjUPE+l`Ur0fey zhM-;wym;nlcYWYxOGh=D)I=q;rUEP>nbU9+(~+Wi_$!%i+P{C1^9SCjY!NxfTUV0} zJ+OOO^Y()LwkTA)#u6apQT#by18BpKyO7HIK3#%`NDsqQKki<|3emP`n}ps<0@KhppJr1Cy>h z=21N>sT!9#OQ2Aa@*+t+W*Rae#nw49kM{%|b(Rb-fmmBY?XnnHuG&#sU9<#D3U3YQ zw49LmGHva^v-&apg%@6UmvqiGI_JT8v#C*B@i4+x-CWO<^oe}Q#od2NTfCVRgSRyN zV=vB5&(2Nh!W2@ct=bmb$+~FKszcbB)H+5mrWcX=AoT!BHbX3pd)(2)4H z(TX$H9oXwOF}2lr+8T`QT!i8pC?$?37zm_%+pv(lnA7?t`I3O+=TQJEQ$iI14l1TW z*~8iCIUs!%o$lGbJ%WF|EoQl*wwQ?*$u5%S{l?-qW8MAG3-k2U$J<>{xBDZX#G=Pu zJdRpE=cLh!dd;_b+$qVvxF9GisTG%En&4BhyX$RdrfcUf&d4;!jNB6R)iD`yoh>=j z+uzG&pYPr^pYPQLpLcY%=bc^Zd1u#o-qA&#cXWm49bVq~POpFM)V@a-YZ|W|e*b38 z_ixsG|7K0gzwhPE8Y;m9E}6`KFK(H9H&oKJfODmW9bhxKJ`&RVf*d)@W#n^8_&BJe zN&g@B-4cT7xmqHYbmH|*aUWc2@d+I>VbaQ#>V8t?<3Cm?FIQ33;-dB_r1^HBk}b5LEM1ASrN*c7K>7;Y%(qHRh11AU!U}oth^9BFWC~} z4Ze;}ls8V=D`@tSEn%2af*LruG1=4tapJ^fCx=LREruh@HOSL%^#V%nq?fhRKY$kWr+L(bY6%AGrQLVQk1VkJMjZ_1WsUfV(? znshDARzs-037Xfo%!~G&lNpuPSHR4hWy%EqQxm&4f~rAW&y3~i9!+)Tpzf%JYF>H4 z$aOgRnLB?-&T^A)`sls_taU0YdGRfj>1Imx)It4f?yg+h<6_8ByI@K+>rg7ofXONA zU4jshtwLFRCD5vLS6A}YAqm%3)2e&av{sLZz}*zRdhI*v8o3B+kLZ}UTo8^eRg*?; znO3M`$te`hS5G$j%8wVL$Ckvxky?%JkL63%GuVHtCq)_Wf;rO&rm#9Ue~Lzs_|47F zpExyla{kd%^K+*kUH*w5$AAC!38_^maaLNwXRDWY+YGJuWZE>rc~WdF)oux>f^g}0 z4MiUvWBShQO`H!1;#2YGdH>+tmRlkj9)0Mtk)<_KICTdcq7_YxL0j zF|?*1dOxd>xkY9bO^96^6*Deak!eju&P$Hbtj^n&77JIqKh|NK%uZu7p5n0|gdpQ%K=nP;(T#CLFcg2;@x}r{)hT;uHpe=TRwq`f%f$ksM%AO@ zG8pYhQ&^5Q&RPf;<~UShR_)v@c{;Zqao|>a+>i!OC_6QV<7woO$h6TtcX7A)EER{O zubgi;m{UD%mYhPJo~ucZ?j4eT?&<-=gcFpRy`=%fRxDY-2A1k$LTQ@R?&c{G6&-&c zLeX>dj$p1>hVDb&P|sOqd=_abeWJQwCYOT?-?;-rUn*>xE2P`5zY$M8XzF6H(CjS3 z5bBOgS0w(LUi=mDZG;_#iY%_C!6%KIH`MNFQXZQgGt*YN(SsIbx?p_t(NcL-xAGQ3 zIe63VuV?MI9Mc!2_MTC?9b28)MO%MS(^QAs*G+_ymfq^Y*1MxvTrBI6X&F{MG_#vn zosQzeJgO;-QB_2ZP165ct?ml{#!OQCj$2fKf7F<5PlcdO<$dLJ#%gNbR_YtaH`;I* znEElia{LOSXBta&+_U?%+rFy~-pS#D2IfyfYkF6Q<`<~BWH(M!_a1DA`PF~Pw&THq z#N9!%xfeCtKO0Qt!6CF5~N=Pm$is`Ga)%Ti(tW+r{fP zZ-j3I<>eJ`6W@x=!UE?&bp)Rl%%iePTrE19m2J+;fqC<8`Rzc;_a_C+lgNNPeBV9# z9TS^sFLleb{bm9xAfJBf$@hO$Uj&SjOCsn5nikUS_C0WC(x%9}F7HEeW6hUu+Y#`3 zgjhZduJ+*Dj5t{m4sNZZic!?7?Y>KlI=NXs?>r8I$}#QjA?fKqn~E4hDJA%I{>cxY z{)zwVFP^CC9z~&|pKYC@ruZ*8Y_lGMFU^&^UtcxuuC$-2s!w=%u7`i-w@T$y)Xd?+ zn65tGMutATm@$le&M@0+&i6h+A~fgUPiy`%UE{6yP#qWmgibdFmNzNS|Am12rp$}Ul{kMbr`aLz=!;GDwArUjCEJa=>XF@p^>Dlu@U}VL%I1q>c`rM> z8OmP^a8g+l|sh&b^$?^-=2n~E)M5x&KFdDC-@tR`4GjO>fMP0kQXe$`7NI!5IFt@C z8`wEg%whZsG*IQQfvIkhQsAai6BsQWOcyW7Y z&iFJ&b6!nxA22b#hQ|MZ>3c~_dW%Yw$s4Hv35~T?ZbEyp{}UQtN8^7+;~QxFd!m`iBKQUmEs#7KdD71M_{*3@9T7U>_NpJP$U8x2kzVa@VT6Qtn?7C2 z-K`Ha;f4Fyi&P;ZmsvZC{cefy!FO)*Mk-jz;?sVqJ=sme!1V53!LQSZT{g;_5KL?| ztm=OqbgKIi(dwEt2fz7x$W|&IB!%L0@;hG-2nFMskxfNQ4(pNX!#85uFgU61ax2B{ zgo=8c9>&Nah$-LY3pY|RFH4c?APg2e5|XinlFzx;`BZ1a_P_D(u#J7DwJeAyJ;U+^ zqBQ1O9@uhxkd1V%)H}ptOsMQZbu_6k9_4?K^FMfIqCZCaA31XlzE+1XM47*Zd%!RD zqbd_EtoqfU8bedFUp=v3E{QpcP@Q-ZvsvF~r6t*sQ=MR5! zNn$?TzNS!8029=(1l>>ukstYk&#-#P*AMxU(itu8@5PuhLx}x9`gA$fIvA95(I>kgxb%me!mm$I}E*(1W3aGDGBCbUoZHKYJ-K|a8?>{(LG@4&N`yZ@sV6$6POJ0kX|>mn?blCu z7u1HKbTP;)tkJl3_*R@1ab~0Ug?^p*R(f?3uTN-}icenFd|Mx>yvluls~WyJWL&QF zk{v?K({_xFL$?&$*SKu^f)6Sw@>zZq$EH^c7B~9AHvqnVu3ACvXMVa)i?)Dc3)1ya z-y>KSJBNPM;a^Jn6)UtBHNMnv@k?6`3)KlXl*!Q5YW&j83s)BOo0qO!xN-BswQ7fO zKY8=nD>s@{2 zC1TWW5#P470#q6ZtATG+)+4w`Pv3#{ZL_|(B=HZ<+izP$otJ|0RZfKnM_3}37z|;0 zbOK1KdKghn#fPnoq}tS(9d>61RYj3^8q`nw+H~q~R(`|jGDCKMDs+>1)@kx7*{ME^ zVf$8wE$mo7-r#3`=+bp3{__+cwNd%pPR4Fs4O$_)Tj>^pijPr9->}Cw;`l~wUmJQ; zuKG1)Lw8Uj3@Gt8O(+p@P@?1Nq_1h&QSFs4;WRycR1NA+B2y~RWZA|Lk?@k8`b})< z$*5oqW%#3dIMKm#bRHfx9$G-*R1Bef^ zgb%Sc_#mdaFg=onBr!oGgYe>Sy@MPd5cAu3f$#k>)y0R(Q=)~>E4NR*q}6=TXMTwl zM>cxFjzc)W1E>@cOh4XmGR{K?3}_sn8@;zgD+j6{Cs~MpbLGvFg^$+f8SPP-xDzUx z*_8#A`cAz<8|aAxX`xNzX-{lN9K#hC5t&KxJCUhJ*XLX6L62@szv#8k*_=G})npJx zuFPL(q2Fn7|2i>v+Y2pA)duLeJ<&9F=Ggd^41R=)TQ>! z{GFV$4YHtr_W%Li12b_a5YX5VUGS=PTLBBn?H(kxyn9=# z^;luv10g+Dgid?*0C)nwnG3oO-5vySHk#=jn6&sc)_z&-D;+fv#V{ zvyi=sCLhwGHvnFUqR;Lmk$JhF=EXtesuXaBy6vG<`OlECRX|rq55u$p|CCSeI6iHh zzOi~I(!-I)(kkJFv;{cDdb%oA6IYv-5Le;aUhXej$LbN9Yul`3va7-_yswkCfNv|P zou5<)b_2@<()DJS6zPD2dCrO#X$@r9RWAM$cGujGFA^0CGxP5Qm0mO>p2@1~D=@A_ zWB9Ypv6L{FjX;pzbB%6CZ$qA~H^z~01$03)Wzur>@gPWf*pB4Ug~#DzCp?CkP}~h8 ztRxmhYtn9?H)Im!EV8g%N{psHiF{e#4S8hsxtNztJ(+huMrT$p3TKiT*b6epUaYV2 z3)p!P$hjKJN9SXSmGpsV+xTwIrbyL$u!zh@XqQ)*33!*@;|fNia_puNWZ!B4e~a(7 zjAE|Zsw+U)({_NaYYjBIA&Nc&2OHYoO_Awp?93b{j&M0OpWPW|1@EwuJgkQ zlACKh7I+0WazLN8DXC}yJzwvf%Zkzrf3bK$fZtDC@fG}pW_X9XgRmYp&o)3|>C)|m zK%K0}r@{Clt#a(jSBgzB&EGdgB$#s&-*-ps1((1BQa?S_^!ZVaM2{;gB$1?*(sKkw zz{iG zrn40zrdzuu4W_S70Gm+lAR};W7Xg7c)ec7XLTOz4_SXNyb@M|df4lW!%PLW}s!U;D z2>4)}6_2utlDEsrx#K85Y-bjXi?)`=%$ky-H+-zzQC43zx9cTqMR~;HaOn56_5i*; zTT2&WF#Ybv-dW;K=}w3SX3Qk&ElyU^SM00}%kt!a50sswdX84ep*kFuQ2Tl^fN@VO z0^sTkPPJL(z~TQ6I@%+H>Qdkvd#=&(0cwmVd1Jd>{WPmmrpJ&1-P6zlO{du3&@{Ben74$^Z?mX?LXIA{agb5V zXNta#e(EGR1Jz=DSDWy*ny$xoiU1nO7AIY+64GUSR34&~mI=DpaKM*^a@- zM&%3{rt3}3wc20taJvFV{WmD*fz0L0Kt-*^owvjd*XM!fspiDKj_hje!dI4>)j-N1 z?D^K7s04kc4sN1khrGAyBb29t)I;vmp+S4eQK6hC4wZmtAq~bSXVoEHIzNu$0kC8e zx3tX<=Sc^Kc75uBL7mT}lJ!GdkzQtNrNb2RqxeMG-;gq(K6k1v8DDquF$#v>tNxTo zx9r;W=lBI6`N3a}!mSScJp{4qh3##)U;gNSfCMpdY(}QxPTMR3Ix~a71(v3vdoP-7 zdid{@xpYS@f!DEhTCI_J^rq~>@r6-EfmbcSUDKEDp9Jv`D-R6dxUVyAdbEWde7%6Y zY=W7+iRf~vEFa9_v0Xx~_W;9dNIvDkNCEuUg@Ps%0CZ;RMV-ku;?;1v<-e}H9K znOBanzd;>4$yIxK8=_9T!%3W}p2UA%)GWhqhwHw6(YFxmt~ZkAf;O>&bUF{PNr8;H zyKl+jUanfWs~y*Z^zQ8K+r1VCwV6ZU1JA9V_$%}6!9#Dghl`BqL=FSGTW(ryy({8h zo`#vu`VZaK zlyJTLk>(|2*W|r&HcXT_`DNk~%8KQ@QMnI43Q^}{VB(5gRA8kEdkOv30ht6k0-I0p z&GFqOr)6*6UYyb2CG#Eq=7-SUZGSR&GB5R6H9N&yD##5|<1z|~B+Q7_A%&`VY1_FG z2IfrWD`w->^ZGlI8=L0ABHLy#1E0=2Aq9TE*j{4}8qTeoetI(`OizG;s>)`W7jDOjQ5Y`B^@e(7S2frrRmSP4Zivmk2QnckR}ze2T!c6cZ2rqT+SUL#u* zIgF8ZlWOJDY{ot?#Llr`0`}xKxWlax?GhWZz(x~L8Hgg($ZPZudBlaDz_{AfHacu4 z*PnxHIQkeTR?QF?_bCI4Y`pM!RJe?1u=9*3-fP_9tvV7U^Te!$>D7b*cJdZq-J zip8It-^RaI6~j9OAvT+k*5aeiPtpn&V(c4AYL;s~W~ZZ{&5|cK%D|-UPQ-b^DB+_q z{oqmVWow`=&&cgwkPH$Mg#E(Ub(%|)(+A(yX=|N|ZbUzs0_?>3<(!QM|1eO}?@QXB zA)IV%msV5}HbcWw>1?SxeF{1Ya)v4JigganZ`1zppjxB&7*P2uM(l#{JW&$_;U(Tx z^+k~AcqOA8(;!C#hBb-V4!#@>26I8sm$W_*a)c&gVaoUz3DmBy=`ooSAH8*N-!pPi zps0hAo;g!4P>TC9OylZvc$^Cb^*x?vTd1S6Jm$E_Nr?Y4>=1>;*>s8PWGc+48+Z!e zmHLc?1Oov7$Zs&foY$qNDB*>|#DECx{)pW(mqdp7i8w}@wPBDS?z0PW|n!FzpP)~dHYLDZ{PZ`B{i zs2fJZE!TJNU9MvX1i7%pEFxT}bZbG_)-&9nF}8n{5z?@a=Qw1#5>HC;$u*CLznd}Z zNyvNSYyQN^B@_BJxxC8F7}SXJ)i=&YDTyVM1u=obC_)A$iD;};7%oaCZ*V+I57Tl}+5*XrR$OW&BG zAJ@#CHQ=1f_a^~5ZQsry9_Z=^CL0Sk_3YZ>D1jBp)VFQ6T*x8T9T0>vK`&B>F__eO zV-i$?Q3p?amN9MiIOs>Kl=7>;l2NDQqwU?d5#fgfD1x@HBDikG#Cm^_yO0s@7`DW| z+7RnRJ6%eV(I1iYAO)fNh!JGv`J4zCk$6cm=oY*oOd}tfltsGKWvctf)}yZ~t{}Z) zkL&qd8>z|1M6DKA?ReQGH|8-|vN6HA)9EpTC$w0N-__oC9vrw;Dky~dm z)M`$^?G>C>L4bPpnR{WnER=Cc z%YBtEgkia-)-YU4@gX=vT0N%%=90O6q+T6s^*b0V?1t)G09?xBhTmPu7@*}U0e0Fj zMaKdrbtizQAHojOz!S-S^)=Xp6Jh(f>n7j}EGm2YBe4D%E#vukL2vcSat3I-mVLWg z=FH91vked+!)lEgHvnC`sg5tV+UhdT{N`!rX4LZVwzPG1eQGSzqCHh)m@73^j?3WG zDz=_OUT@_rK5A3r{LR0vXPdS<1xEkY!JWCL6I8pm=*ajrEu<-}_jDTJxAO0t7E!V; z+vIC&?^4IHF|6yKGUMsfP5i*SQe!*$^flUDe*@edh{=5b(Rz2y#9`Z{QIml&+@OujndQ+XXG=I83?_@^0tpi8x7wf^GI-Ue z=+t}vMLTSJ0S6#qavPLhK+M(6gPvPpCFFPKM%4+*bLpf%h4-m$A8sAJWoyT1_m=kw zC@x#g8BalJaYWMGucgCJZdls8lrW=+J6z^_=zmnk8qHv-WE#3d%F>aD!j1@x3v14^f_Xocl&P zUor0x2nG@`owu!3-Kc@)c;|WhS|w&*?sl?4o^QDlvuqcnM;2Rcf24$by0axLhodAc zl-0{H{T!k9=y;eGcs0P9bPQ{9R13Km=h^GJ`7RNx_sZyDb417*k%Y(^qpOTI2`IXu z3G@M*b#AX7g;hmc*ptP!{P{_ouP>{<1_1<>8Y%3f#NvWE;PEBo8NM=*182<}e)RZKw=) z5ry`S`OLYqIpR(bl|RvW!^^kGPji$sLB<~EmX6x(QevEEW|#TBt??tNMlT$V%N!;< zRhLM*=1f^XN?&S#4LC|}kx+f78)dhO(ybm@^x@S5glXE_$?b;>q>7#Sx`LX-=4&Ig zdx?oW1(vT#k@I@%69GOEHL>ADTZOp&6$gE$Pv$Bkg$uaFq z2d!wQ?^C0v5#-+Rt(hcN)IurBUFL^t@KZ4h>2q`eZ4o1;hd*TENh8&EsKRZ^aEnDX z?F|C^{pUj0L-gS9=xyr+UlN@rf-fFF<_N87^Po8(U>XYrJXTsWNUnEBcgiGntT}ti$Tp$Y+X^n&|T-Vo#K@ zO>_7+uyvki2c>4WtCIZ$k$r6_ef75611prE5yVQWAuA*u7yP=GznrUn%Lkmw*8e(L zt5*yYmJkq`!n7}2igAHcRN<%+;osy)C6&($-RP_F^lV`z{9@D@zN)clUi-K#3c{)cZXY9sQD~j9-bbFUp@RVEB3nXuH+cBXJoYW>^d7b!BDstN zxJ?8hQHeI6dkU!bB%9X^m|uZ7rD)usAYVrpIkpP8i)=&@J`U6%p)~hlnDpJa^ZL^N zY+``=QDIH#0i9x^aGc#XVMF0arHQIU#r1}(AuXl_ zMk}orCrYzET_Fi+BrZmp4>8aTybSyh{>;V@`V$T$-bPuto0BN#CfN-14*N$$36hyn zC6cH4hL*XBHQgl~m%fHb5z8oCKNx?7#V&s0Yiw+v)Q2CTUtN*E^x3u-;pdhW!+0-0 zX?fGmM4b?6SeaGG+)PR%UOoOL*6i7{W5+y40se$&sar>nSFa! zdHxgB+|@~+$y1=MLDO?~ibG(_RN}bsyE(e?`Ob0^Slb^uB1xmSy)~)JLAak4asNf39MQ@WY;mE&H9-$sIKpO?+-!DlI-+Y$KG&H~) zI37Ci-|Ne}653-i5F(fEiF!dssij^gaBo&x;3cUnZ{XggkcEjd0mGHFWZ=g?S0_}* zX^n@Ejl>pF4E9}UkPNy5(zMIY5>$P=ZL1{aBNT_=e7i~BzL7E$qZ=a7s*KdB{i*@O z>NH5AAp$*y$V_bLw_(_I9<%V$f-*h%Mt@%=LtPvuyv$pJh{@#;iF-+jq><2}zIH5O zQ=0dpj-BZOzQ25F0N6o?MMB8M z&2w5RrZwb;^eZyJvk`Ec!A9qQxqZTvhV&Qg?D9vQ>q7Rvu8e{vNdJ4n>t$r{UHPpFiMJ+!Q_T;1eK6-@TD7 zR1!`}fat4~cH7Jg^uO1U?%T``X?=v%;v^+-?B=@wY9V^Zi=r=>r!?-f719Sk2HnB$ zgEsth#2FwWcDBkSK7D8=1&azpsE~pecTmCxj@3m3h&&WA%ZXaav_QVt;LgLPUa|{E zUc^<91Wr96#zGrZXZI&Sa|(Z17YDgYML^04(-R<(u`|v9VV80W-Mb0$N{dL>45a|L!WEgg1p+_CbjqUWZ5c<#cfzl6km? z*7oWFW&k&h2}y8!IM~Y&wM60V;WsRKRf@ZQ-jfjo9Qt$U5A{m3Tye$x(5k+|Cb&U2 zTLj^@3p=x`ackWIDcJm_d19su)PHP2X#l)s6__)r{66oX?~%cYRn`$hNOelPy@GyR z4eR&^`_grEXdLOi$SyMiBB@o5K<>%7xWaqmt8pYTI2~WXoWBOus#Bg-U>)u%9zsP)&n8+=5Tw!?A+HKiwSc@T#*rm-C_v=5t;^iMVgQ zZ=woyrhg3@=k&??P1B^`5c;HUea^{W?N%wc*xx4Z;FOQM51{&>4( z<2o}{!><}U9n`e!q>IZd$P{w)mrlrbkvg^l)cCY>bOR}=*uQSWX5??<##oYc#(pxe z5cp*1E-_v;(0SN2E*UdoxdEgVYK}AWXc&%K1@4wqdK+=Bqddvx=5+Ea_ow@5oSI}< zK$+eU2ta<6irWP4&|C;}NyP)p>pQ5E5H7gP zZ7g*9Ji9iuX;tJW(ep)~=BsYwuecoX;vcAhEtIf~Q>Xz80 zp*IyKqJFUul^Pww3<;^vm-9y_b$*h3gY6TND`HE0jqLLKC2Ytm2LrFn-Q{%FcHS|! zEN>nXQ-8j8?zQpCdywfRC@~%PpoW&`0u~KtnVhtmIO7CYxqo=z(go*yhW<5W7{H(F zmI?g0J4SmSL7l% z(DR|=H{d<4$hOWd^DMX2x4cC<7gFtD*(ZoTMTLgvq`JXDy6f`!couN35vxo^VMu*4 z5YMC@)Q_kd$k}ex9BNemCasn$4>7lSE}*ya+T$-0SDYLDp~{1i%BJYA#zRpPJ0x@H zwG@E_UtMG2DEK|yy%DwLe!UQCA?-6DXKHI`qY{I>=F1raKUCaO^BG-Q;=~QUfA0 zOZIlUud~t_weupM>k_q(Y~NlIR-jZ%ja{_g+cpc1)W)zL_q|V5#gfcLopaeiwn7m# zTX4I}4{N@M7NG0(>|nU-IN8uEFJ_3R*56w;?{3)JH1EoO$k8X&qzi6=mtE{6T}Cia z@u#n1Y90jA#K)9K@z6}mZ%#&pn*$j|UoQ|yFD^!yx09xPm`A4Qef`G8wTQr|27L#Ucz%$^pw;9KB@bAJT4%=YJI;8k_& ztrYQ`$#UV^8{fxweUfaW=g`^w?IrGGyVOqEwe{*wl7N8T(#%d$^N_={6kj~$E~%P< z;ra5`=Z6;0SR(>Bb zz3n{zrf6GDYOxr(&PC&Euj?ri%)PbUL(?L`)@@gCXJe#qveN}vj}}m$`XaeJ++_6q z%c$=Gr;C#Bef4u9=PULKIH&#M?t^5~EyvX4$;ClU&Ee3xUx4+%b6pV7T#3J_we;6J zlf|?)My!JACD!VvG0q@#uA+N=`+3$_o3g~Ml2gA`eL1MxvQ{ls{jzdYJgjxvYG|QP zrcXL$<>Q^%jJgf6PWaa363lnRU0^NRb8glepxOq>Q&4cbs=)HpvLf(P{Tx4w}@=VWkb z5P4O4F@523Z&=I?3Uwna$Fmn`&i>3Q&Pd`xpKf^hn-{b009J;un|F~rdp?kl$_Y4} zo6_(dy&^>{%Hj4E66SCykeCha6{5CcyCy`^3l{brGuQ_O0ONuS?SIy1{kgA>TcT_P z8r5|N*;)Ng3$N%KjHd<5jP>A4 z1{3Tqx?@&=%;|#0POVEfzujIkiOVhm|G98k5|w@Ib`=RHTbOrV?wktl>zhpb*4Vz- zuzN6f4?L29tok{LqSZUcl(y-sKjXPoX#i>1>kk*s8iH6L`ZcgciJob_6UCK(c9Lh| ze$nS~`)YI8(5*&h#5E%)881@u%epJux3wwX!jY zY7#eAS1&py4L>8DxXo%{WYI*_!aBXh3K4;g8=eBXJk&_fBKu zOwlTTqS0#LjKHA70mEFbx94D&!C>!{^FwX#^A}QH`(nHD#1;7#qMCVO*)@NUq;9NH zT*pNv6AzVn44LL-892?IjPZBKJ-Xr-Us@rRB5&COx~ZHC$_Nt0!xTs)agK6U$`XpA zqvC92Rr#bJ#f7vby-nfuF5$H7QcMI!4RZ_r5OdHP}fA!#V{)tcxD6?|Jd|P$zGzW|~MW{^XmT zb<8iq5n)3~JxD!hB9{I!1*2)4;`CVu5jI~`8OA9f3_CiHPsq3UQ7~>tp}NE%Zq;Es z=sSH7kPie(#u1yc6A@{jeuUmUnN&lJzt&gai|LAS9fqD|GM8{p4qkiQ%qbLYa!!El ziI~x8Qa#po1WoGo8{(`={2Y9}AzRGqRBMZ=7Wxg30!$?mv~};ro*-}cVcHMbc$~a2 z-1|e|a)^ZgJ}&mVX}$PTQ|+a>r8mCIt%{->*vJ3bdvl@RY3bPg*sJ&ZpZ>+|geWZN z(OKfgl*O-JjWd}U7ob}S?&??YBp+qzr9_r&Ud2}rdVyn_1o7?2S5XT_x~1hsruZhd zhdT817^}%{=)&lFyfg)4440eFp2@3G92^GaA&p7A=7Kz{FH?@37$mmP6m+LW%2{Zc zK%|qb@KJ!^tx+kz$&ZLN=C6tBwhD7Q0W~5EVpLgj0?w6kbJs?t#Ia3{cqMRh&^neP zNm^m>!=XCqGBPBHNxaaa$}VB^_&jV95AyemlgG5 zGm22Cxk5l>=f*fW$*(1+`4a_;v_l!OABAN-_KW)tt5BE6xE=Cgv3f&6)tnc)KvI?a z3*9KG6%6c#r#y@PWglZLqPNsv8Z&I>eN{V`^u$@C=r7RtZb{^V1q7g-LEWzyg+xpP5%2Pj%7S9Xv$K6^0l&Pbf=rNSu z4dyx8mHQ-5tNo-X>E$_65lxaseRo$en||t|C>rM=n#;pam>W?<+L{{9Cv%wMo)+`q z*~5*c6&HJq%?-Lk6wO6H=pgV|5fuGqS2Zt)5iMy@%*$t$DWEN?G@v{(edE1+V#}k)eo3P)y+}BB<%-6Gxvvx5y2}(Y=Ed6UoUnq^d zI@F#`r>)*Sdx1sX4KzwwE#RfnhDBAVRh@F*zQe}qQCe&*dT}yVy3O7M(}htK(a@p; zIr0`|_*d!|dKvc!S=gt2qYeJGTF%3T93iU3o3tha|Vqzou~38&0yWD_AR9EJh)vjGKi5M0BXJo6<6 z6+5)ZP0*E;ETdWfjjH5QLYt9HDzB+9y3wzfKUl0e@r+z4w&VB&~%=2M|jyA8=(vA~GYjo?Lx$p6<1k|nu$k!cf z)a6CGAS|a%{x5J>F=Bn}0wi9j8G`ynOuCF@O}a_>u5L|w-mR{QVfkFVgw&fx7NORV ziaB2&)OyGVV-8eqo@tL1GmLGvAg=c}+c0v}O#K4hE@HeOiTHU$b1e`e-lJt9$wLa^ zq>Miw+l~KBwIb+8(glq3A8W=XX6;JrS%&AAULJm8yqEF`<8G_1q>@m0VPV#xa+`ReDt6Z2h67-F2$wGs65bz*b7djhk(A zUw0^V*rt3LJ0KRMRFtiuF3<`;>LQ|4V4cmHr>G62Y3uQMXg17u3%whtKh*v#WY})~ zObvzQh{}OdD$YsbS@;Q;-)Yt34J(kPD!`s+nVP%deBY)U-bZ7^#F09rQbzR z&Se~Ea^$R<(NxB37hxLDdw8hy`x17{o`|iaHFG~zcQ3Np6qF%PcPp^DZzFfR4D+%>5zWNFk$bqqaJx7yb>CLGlWEepm%KX#LX9TgHTE4(^OtdS<UF0UT~%2?4H(`3fzy$O;& z8R+AsT+?Jb=)DZMv4eRLmf#PZs*4d|PFeP`uIUEk%z-aZd?_mDA?;O*aqH*A;h!II z-Qxzc!KFQ^BO?ky){Rb9A^H@vI~E|37zj+d^%?c&kej)&%+6(@`YPm;!?HB!C(8ho zQ3aH{geT5Ncw45S%a<=*xj3*OznBlz+62*)s@p-&+mAO67Ck=l2=2e2nUps-dfMf# zC7$J{K!lieCExlQ9BEF6TeIMx_UOj*6==TGW07wMyL?VQ86#LDL9Ny5HD`mr&R7@J zs$g4tE|I`zfp1ZtAVm&8Kx;8=o_Io!f7qOfPCbKdr1`;YHl_=5{U^wT)4` z7`Jqg9#0TtPBjLlzOtsaZBbo=Ot-=~lP#k)qbux=Cek}HUe|DaT(ba!&=e{M?D1P9 zu|8zESAe9*a2E24kI@$>#w&${GF#5EkexQCZxsmuBk)6X6c)8P=M(5N6d>h1G@Q%e z4bjFGy=wd^pK4udpml_-MQZQp-mF}xY^BoDP~s$a9D(i6kY-=}ua8lpP>Ul9qMvNU z?;<>)tXyN3u*$nzjY1?jO^0ptSqvN`hM}Fkf3x)cV1N`8oRkU66YKtUcF71H<7Uq7 z_C?uqD3VZIzTovVVX`tS@)6kC>CgB(RU}bU-$18D9~Nf<%4q1rD!XoczkhbK?dGQc ze*CF|l|&2MZ?o2CZ7T6wS1OpV(M-!8gRb5tVFh6`6<0%v;ayGbesYtChfB+hCZZOy zs5Zr^Tq?K=M1uK+C~vTey_IIpcXktc?EGqj*Q$PRS!Tm;+u>+$BB{U-Osm07k@S5L zM1yQF=y>|#-H@$9>79VMdLwpZsl{?E-*8aMcK&QCI<)Ea{o$oAdvsNYwWupvZizMC zcO1H?5^I#AVr#SDkwHjAvaB?6USf>|{_!6!zu*+aTQUbM%2WC~slH-aum>{+rqX`y z=K3YD0lGA#sG(&(Gd2ZY>gcU#Sz#&b#x`Vrf(HVb_LqTd)1~b+N%p8*ivhiG9b`VZ z87e#SxqD_@5Au0rs{u^;L*)kf=5`yb{iWNrB5SS^+`n9TJ4C@*xo<&$8(bG^+@fHFZqP;?MXRsLm|j4ZO|0{wT1(ml*-^0}h+n~k}4 zr$9MF(8D@@)E9BwoNt_*KAcJWVv5NRi~K9Y>zqpK1=%mar)%1*tV>naPRl{A)XTYk zx1Qi^nBRTsCHils#6I8F8(P~GZ3o)OjaXvuX?rxPWV#fe=KiQ>Z)ku))U?LcQtZmyf#KD>5pw3 zF*2(WAewUo8}ldJA9wek`Na2(6R4@xmo%dLtS(O3>VfPS+E@u*-t3ltzP)oKtN!YL zDyc2xrNk{6RAe>(GV|=`d>*-Gz3drpmPh1Eks5XfRGe7cirh_Y`CeOwFBd)x)g`&| z4FtA;yGQ5Pc`jVUa_|h3(K>jpMc{1Md{m!YxVXrEOE41(NJ%$kn}>7`pdmy|JO_I` zYM(E(kSJq{t%^1HY(hdLdo0r(sM}D?Sec?kPYA(IBAKE;o5V$ee@Ev`#j?llC^bd2 zbffhER2_8ZoN!6z`dD%Zd<%2!?N$Qv?{wI`QdrM_l{3D;9=l^X6J&2{xa%xb za9|LkF=Z0kl!t;h5Oz(F6nNFF;KIZ8);zq97IqU zTDVuABc+!w(aIlI*wp{Lw*@9xSL%yMXx|(27NEahSlHE)pf$>b9)VY;|{li zEMW>n!PM_+l3yS{e0aIBIGoc6TH|hd6a4<*(on<(Vv0Bn7(+Z+=^`dfq9j-HjHNQ$ zv0Ty}cL9)@|0I%wm3?0r<0T3&gk!qU1d^!#5`-;VZHf0Fd1aXwUgVOwbE*-rZ9afk6jt|QEw}mf z4jBpNVD)m#LlJKQ?Mx|jzZwk0KgXj9Vqn2SJFe4xHnyE$#@Cckww5oX9@LBwKYf+ zTo0+ZGq-N`w>Bx$tCFWb?_r6PD#N60zj`%MN^LA@u1PS=qZDP7I&2-yiL)Dd?L+C> zz6PHu(hjC`H~j0_)Z!O`7$9P{G%EvNGUo4noq}K66UPN5>L&D?*HLG>XV%3UCkMRR zAh>h`Leq?7rVChjYHe|-;LXDW9B~+>(T!ElFD)=AvhUKdGgu~_k=QwVR%#ur+5x3M z(?hWNxon{Gnn+>+?yHa&M?v?!ugdP}Jv(c?g;%*X_byBYZ@ORmr+~3b0~gFX(l)Pe=9HW*Yd z7gZj8eSv%EYB%t_gTS5Hb*;8`214~QuYqZ;aB@<6!v@E+0}u_GIp z;>|Aju6{nSDjoh#zajlC#i7ktE*)$B)2yv09DakgOeC|~S0EFoZeK*VCPG0mK`<-f z{9(@#f`)729+fy`O0d6XARO+zxCh)r`OgkzmFR%?aGtb>+@umHZ?9pd zcRNUg)-c!G%m};)ABq}^3ar5oRr*v)s8g^=rWR;Kv!$DK#FB@xL#=kibi5P4(}h&E z#nE9A0B6$2#{bT;)3I(mSnM`ij7ypK=e@k?u<&}_@{lv`Ty)TFscq)H8VGvFP>I+} zYL~7$S(7io=|HR6>zKRlfY`wzJDT^psF5lBoM&uBVsx8KM^rE05R!5_lES!+E)Mv1B?4Oxc-y! z<6Q5*c?a@$1Bm~xiSxJ{02?Cc;h!iei02-h5QOXmK>XW77Iy#vg!uFST(WfsQ2fmu z^<}`EoCXZ6#R&|I=f85pzJO}n0g`0@wBWxyc>jy#PYD51a0ih5W5-MPm-}B+=)bsV z8UJ!WX4B`tZ5s0c5CD3z{|$f4BFg`1s^>>jU#da!o&a;eOFIN8x)lN+6k`uS1vRxo zpd$V!YrQ{52k6}sAPJE94FOsifgk~ydwqO^{ac_!FMuQj=n}N%1rUWWyaADU17sjB z-#|9r0II*uoI@xZw*5#H{&BGUC*jAr-hUAm0IFdJ5P&AV0Th3^rg7I&73g4K&L3mS z_Fvp2xPQ4!J^;$UT!TmpSRQ;ZFjrnMFwXztCJ_GRl7JF@0H6N$v(4wD`=nfd!|eY% zQiQ%A;oGnOW>)nDkp9iASNNbVfD8uaLj3<{hE@KTTmKF4e@1-upFBSe|GkC<1W-ZW K*?;`F!Tuk=A&w9L delta 64061 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 V5G2F@1d#g;Km~2%@G 10,000 particles) systems +#neighbor = "3.0 nsq" # Optional for small and low density systems +neighbor = "0.3 bin" # Standard choice for large (> 10,000 particles) systems +#neigh_modify = "every 1 delay 1 check yes page 200000 one 20000" neigh_modify = "every 1 delay 1 check yes" # thermo diff --git a/tadphys/modelling/lammps_modelling.py b/tadphys/modelling/lammps_modelling.py index 1396d95..1e68b59 100644 --- a/tadphys/modelling/lammps_modelling.py +++ b/tadphys/modelling/lammps_modelling.py @@ -997,13 +997,54 @@ def run_lammps(kseed, lammps_folder, run_time, print("") if initial_relaxation: + if to_dump: lmp.command("undump 1") lmp.command("dump 1 all custom %i %sinitial_relaxation.XYZ id xu yu zu" % (to_dump,lammps_folder)) lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + if "MSD" in initial_relaxation: + lmp.command("compute MSD all msd") + lmp.command("variable MSD equal c_MSD[4]") + lmp.command("variable dx equal c_MSD[1]") + lmp.command("variable dy equal c_MSD[2]") + lmp.command("variable dz equal c_MSD[3]") + lmp.command("variable step equal step") + lmp.command("fix MSD all print %i \"${step} ${dx} ${dy} ${dz} ${MSD}\" file MSD.txt" % (initial_relaxation["MSD"])) + + if "Distances" in initial_relaxation: + #lmp.command("compute xu all property/atom xu") + #lmp.command("compute yu all property/atom yu") + #lmp.command("compute zu all property/atom zu") + #pair_number = 0 + #for particle1 in range(1,chrlength[0]): + # for particle2 in range(particle1,chrlength[0]): + # pair_number += 1 + # lmp.command("variable x%i equal c_xu[%i]" % (particle1, particle1)) + # lmp.command("variable x%i equal c_xu[%i]" % (particle2, particle2)) + # lmp.command("variable y%i equal c_yu[%i]" % (particle1, particle1)) + # lmp.command("variable y%i equal c_yu[%i]" % (particle2, particle2)) + # lmp.command("variable z%i equal c_zu[%i]" % (particle1, particle1)) + # lmp.command("variable z%i equal c_zu[%i]" % (particle2, particle2)) + + # lmp.command("variable xLE%i equal v_x%i-v_x%i" % (pair_number, particle1, particle2)) + # lmp.command("variable yLE%i equal v_y%i-v_y%i" % (pair_number, particle1, particle2)) + # lmp.command("variable zLE%i equal v_z%i-v_z%i" % (pair_number, particle1, particle2)) + # lmp.command("variable dist_%i_%i equal sqrt(v_xLE%i*v_xLE%i+v_yLE%i*v_yLE%i+v_zLE%i*v_zLE%i)" % (particle1, particle2, pair_number, pair_number, pair_number, pair_number, pair_number, pair_number)) + + lmp.command("compute pairs all property/local patom1 patom2") + lmp.command("compute distances all pair/local dist") + #lmp.command("variable distances equal c_distances[1]") + lmp.command("dump distances all local %i distances.txt c_pairs[1] c_pairs[2] c_distances" % (initial_relaxation["Distances"])) + #lmp.command("fix distances all print %i \"${step} ${distances}\" file distances.txt" % (initial_relaxation["Distances"])) + lmp.command("reset_timestep 0") - lmp.command("run %i" % initial_relaxation) + lmp.command("run %i" % initial_relaxation["relaxation_time"]) lmp.command("write_data relaxed_conformation.txt nocoeff") + if "MSD" in initial_relaxation: + lmp.command("uncompute MSD") + if "distances" in initial_relaxation: + lmp.command("uncompute distances") + lmp.command("undum distances") timepoints = 1 xc = [] @@ -1466,8 +1507,8 @@ def run_lammps(kseed, lammps_folder, run_time, lmp.command("%s" % thermo_style) # Doing the LES - #lmp.command("run %i" % loop_extrusion_dynamics['extrusion_time']) - lmp.command("run 0") + lmp.command("run %i" % loop_extrusion_dynamics['extrusion_time']) + #lmp.command("run 0") # update the lifetime of each extruder for extruder in range(nextruders): @@ -1483,8 +1524,8 @@ def run_lammps(kseed, lammps_folder, run_time, loop_number += 1 # Update the particles involved in the loop extrusion interaction: - # decrease the intial_start by one until you get to start - # increase the intial_stop by one until you get to stop + # decrease the initial_start by one until you get to start + # increase the initial_stop by one until you get to stop for extruder in range(len(extruders_positions)): # If the left part reaches the start of the chromosome -> Stop extruding if extruders_positions[extruder][0] > 1:

#nO7ojV~qysOX?6Lp*73(fvwI_tE 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�o(RyLdR5|=-k&)nz@rQnb9?AMh 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 literal 0 HcmV?d00001 diff --git a/setup.py b/setup.py index dac2cbf..3ca23d2 100644 --- a/setup.py +++ b/setup.py @@ -3,23 +3,23 @@ def main(): # c++ module to compute the distance matrix of single model - squared_distance_matrix_module = Extension('taddyn.squared_distance_matrix', + squared_distance_matrix_module = Extension('tadphys.squared_distance_matrix', language = "c++", runtime_library_dirs=['3d-lib/'], sources=['src/3d-lib/squared_distance_matrix_calculation_py.c'], extra_compile_args=["-ffast-math"]) setup( - name = 'TADdyn', + name = 'TADphys', version = '0.1', author = 'Marco Di Stefano, David Castillo', author_email = 'marco.di.distefano.1985@gmail.com', ext_modules = [squared_distance_matrix_module], - packages = ['taddyn', 'taddyn.utils', - 'taddyn.modelling'], + packages = ['tadphys', 'tadphys.utils', + 'tadphys.modelling'], platforms = "OS Independent", license = "GPLv3", - description = 'TADdyn is a Python library that allows to model and explore single or time-series 3C-based data.', + description = 'Tadphys is a Python library that allows to model and explore single or time-series 3C-based data.', long_description = (open("README.rst").read()), #url = 'https://github.com/3DGenomes/tadbit', #download_url = 'https://github.com/3DGenomes/tadbit/tarball/master', diff --git a/tadphys/Chromosome_region.py b/tadphys/Chromosome_region.py new file mode 100644 index 0000000..0fbb5d3 --- /dev/null +++ b/tadphys/Chromosome_region.py @@ -0,0 +1,360 @@ +from math import isnan +from sys import stderr + +from taddyn.utils.hic_parser import read_matrix +from taddyn.utils.maths import zscore +from taddyn.modelling.HIC_CONFIG import CONFIG +from taddyn.modelling.lammps_modelling import generate_lammps_models + +class Chromosome_region(object): + """ + Chromosome Region. + + :param resolution: the resolution of the experiment (size of a bin in + bases) + :param None norm_data: whether a file or a list of lists corresponding to + the Hi-C data + """ + + + def __init__(self, crm, resolution, hic=None, size=None, zeros=None): + self.resolution = resolution + self.crm = crm + self.size = size + self.hic = None + self._zeros = zeros + self._zscores = [] + if hic: + self.load_data(hic, resolution=resolution, size=size) + + def load_data(self, hic_mat, resolution=None, size=None): + """ + Add a normalized Hi-C experiment to the Chromosome_region object. + + :param None norm_data: whether a file or a list of lists corresponding to + the normalized Hi-C data + + """ + hic_matrices = read_matrix(hic_mat, resolution=resolution, hic=False, size=size) + self.hic = [self.HiC_data(hic_mat['matrix'],hic_mat['size']) for hic_mat in hic_matrices] + mats_zeros = [hic_mat['masked'] for hic_mat in hic_matrices] + self.size = len(self.hic[0]) + + if not self._zeros: + if sum([len(mat_zero) for mat_zero in mats_zeros]) > 0: + self._zeros = mats_zeros + + def get_hic_matrix(self, focus=None, diagonal=True, index=0): + """ + Return the Hi-C matrix. + + :param None focus: if a tuple is passed (start, end), wil return a Hi-C + matrix starting at start, and ending at end (all inclusive). + :param True diagonal: replace the values in the diagonal by one. Used + for the filtering in order to smooth the distribution of mean values + :param False normalized: returns normalized data instead of raw Hi-C + :param 0 index: hic_data index or norm index from where to get the matrix + + :returns: list of lists representing the Hi-C data matrix of the + current experiment + """ + siz = self.size + hic = self.hic[index] + if focus: + start, end = focus + start -= 1 + else: + start = 0 + end = siz + if diagonal: + return [[hic[i * self.size + j] for i in range(start, end)] + for j in range(start, end)] + else: + mtrx = [[hic[i * self.size + j] for i in range(start, end)] + for j in range(start, end)] + for i in range(start, end): + mtrx[i][i] = 1 if mtrx[i][i] else 0 + return mtrx + + def _sub_experiment_zscore(self, start, end, index=0): + """ + Get the z-score of a sub-region of a Chromosome region. + + :param start: first bin to model (bin number) + :param end: first bin to model (bin number) + :param 0 index: hic_data index or norm index from where to compute + the zscores. A list is allowed to compute several zscores at the + same time + + :returns: z-score, raw values and zeros of the experiment + """ + if isinstance(index, list): + idx = index + else: + idx = [index] + if start < 1: + raise ValueError('ERROR: start should be higher than 0\n') + start -= 1 # things starts at 0 for python. we keep the end coordinate + # at its original value because it is inclusive + tmp_matrix = [] + for id_mat in idx: + matrix = self.get_hic_matrix(index=id_mat) + new_matrix = [[matrix[i][j] for i in range(start, end)] + for j in range(start, end)] + tmp_matrix.append(new_matrix) + + tmp = Chromosome_region(crm=self.crm, + resolution=self.resolution, + hic=tmp_matrix, + size=len(tmp_matrix[0])) + + # ... but the z-scores in this particular region + vals = [] + tmp._zeros = [] + for id_mat in idx: + tmp._zeros += [dict([(z - start, None) for z in self._zeros[id_mat] + if start <= z <= end - 1])] + if len(tmp._zeros[-1]) == (end - start): + raise Exception('ERROR: no interaction found in selected regions') + tmp.get_hic_zscores(index=id_mat) + values = [[float('nan') for _ in range(tmp.size)] + for _ in range(tmp.size)] + for i in range(tmp.size): + # zeros are rows or columns having a zero in the diagonal + if i in tmp._zeros: + continue + for j in range(i + 1, tmp.size): + if j in tmp._zeros: + continue + if (not tmp.hic[id_mat][i * tmp.size + j] + or not tmp.hic[id_mat][i * tmp.size + j]): + continue + values[i][j] = tmp.hic[id_mat][i * tmp.size + j] + values[j][i] = tmp.hic[id_mat][i * tmp.size + j] + vals.append(values) + return tmp._zscores, vals, tmp._zeros + + def get_hic_zscores(self, zscored=True, remove_zeros=True, index=0): + """ + The result will be stored into + the private Experiment._zscore list. + + :param True zscored: calculate the z-score of the data + :param False remove_zeros: remove null interactions. Dangerous, null + interaction are informative. + :param 0 index: hic_data index or norm index from where to produce the zscores + + """ + values = {} + zeros = {} + zscores = {} + + for i in range(self.size): + # zeros are rows or columns having a zero in the diagonal + if i in self._zeros: + continue + for j in range(i + 1, self.size): + if j in self._zeros: + continue + if (not self.hic[index][i * self.size + j] + and remove_zeros): + zeros[(i, j)] = None + continue + values[(i, j)] = self.hic[index][i * self.size + j] + # compute Z-score + if zscored: + zscore(values) + for i in range(self.size): + if i in self._zeros: + continue + for j in range(i + 1, self.size): + if j in self._zeros: + continue + if (i, j) in zeros and remove_zeros: + continue + zscores.setdefault(str(i), {}) + zscores[str(i)][str(j)] = values[(i, j)] + + if len(self._zscores) > index: + self._zscores[index] = zscores + else: + self._zscores.append(zscores) + + def model_region(self, start=1, end=None, n_models=5000, n_keep=1000, + n_cpus=1, verbose=0, close_bins=1, + outfile=None, config=CONFIG, container=None, + tmp_folder=None,timeout_job=10800, + stages=0, initial_conformation=None, connectivity="FENE", + timesteps_per_k=10000, kfactor=1, adaptation_step=False, + cleanup=True, start_seed=1, hide_log=True, remove_rstrn=[], + keep_restart_out_dir=None, restart_path=False, store_n_steps=10, + useColvars=False): + """ + Generates of three-dimensional models using IMP, for a given segment of + chromosome. + + :param 1 start: first bin to model (bin number) + :param None end: last bin to model (bin number). By default goes to the + last bin. + :param 5000 n_models: number of modes to generate + :param 1000 n_keep: number of models used in the final analysis + (usually the top 20% of the generated models). The models are ranked + according to their objective function value (the lower the better) + :param False keep_all: whether or not to keep the discarded models (if + True, models will be stored under tructuralModels.bad_models) + :param 1 close_bins: number of particles away (i.e. the bin number + difference) a particle pair must be in order to be considered as + neighbors (e.g. 1 means consecutive particles) + :param n_cpus: number of CPUs to use + :param 0 verbose: the information printed can be: nothing (0), the + objective function value the selected models (1), the objective + function value of all the models (2), all the modeling + information (3) + :param None container: restrains particle to be within a given object. Can + only be a 'cylinder', which is, in fact a cylinder of a given height to + which are added hemispherical ends. This cylinder is defined by a radius, + its height (with a height of 0 the cylinder becomes a sphere) and the + force applied to the restraint. E.g. for modeling E. coli genome (2 + micrometers length and 0.5 micrometer of width), these values could be + used: ['cylinder', 250, 1500, 50], and for a typical mammalian nuclei + (6 micrometers diameter): ['cylinder', 3000, 0, 50] + :param CONFIG config: a dictionary containing the standard + parameters used to generate the models. The dictionary should + contain the keys kforce, maxdist, upfreq and lowfreq. + Examples can be seen by doing: + + :: + + from taddyn.modelling.HIC_CONFIG import CONFIG + + where CONFIG is a dictionarry of dictionnaries to be passed to this + function: + + :: + + CONFIG = { + # use these paramaters with the Hi-C data from: + 'reference' : 'victor corces dataset 2013', + + # Force applied to the restraints inferred to neighbor particles + 'kforce' : 5, + + # Maximum experimental contact distance + 'maxdist' : 600, # OPTIMIZATION: 500-1200 + + # Minimum and maximum thresholds used to decide which experimental values have to be + # included in the computation of restraints. Z-score values bigger than upfreq + # and less that lowfreq will be include, whereas all the others will be rejected + 'upfreq' : 0.3, # OPTIMIZATION: min/max Z-score + + 'lowfreq' : -0.7 # OPTIMIZATION: min/max Z-score + + # How much space (radius in nm) ocupies a nucleotide + 'scale' : 0.005 + } + :param None tmp_folder: for lammps simulation, path to a temporary file + created during the clustering computation. Default will be created + in /tmp/ folder + :param 10800 timeout_job: maximum seconds a job can run in the multiprocessing + of lammps before is killed + :param 0 stages: index of the hic_data/norm data to model. For lammps a list of + indexes is allowed to perform dynamics between stages + :param None initial_conformation: initial structure for lammps dynamics. + 'random' to compute the initial conformation as a 3D random walk + {[x],[y],[z]} a dictionary containing lists with x,y,x positions, + e.g an IMPModel or LAMMPSModel object + :param True hide_log: do not generate lammps log information + :param FENE connectivity: use FENE for a fene bond or harmonic for harmonic + potential for neighbours + :param True cleanup: delete lammps folder after completion + :param [] remove_rstrn: list of particles which must not have restrains + :param None keep_restart_out_dir: path to write files to restore LAMMPs + session (binary) + :param False restart_path: path to files to restore LAMMPs session (binary) + :param 10 store_n_steps: Integer with number of steps to be saved if + restart_file != False + :param False useColvars: True if you want the restrains to be loaded by colvars + + :returns: a :list of trajectories as dictionaries with x, y, z coordinates. + + """ + if not end: + end = self.size + zscores, values, zeros = self._sub_experiment_zscore(start, end, stages) + coords = {'crm' : self.crm, + 'start': start, + 'end' : end} + allzeros = [True for i in range(end - start + 1)] + for zeros_stg in zeros: + for i in range(end - start + 1): + if i in zeros_stg: + allzeros[i] = False + allzeros = tuple(allzeros) + nloci = end - start + 1 + if verbose: + stderr.write('Preparing to model %s particles\n' % nloci) + + return generate_lammps_models(zscores, self.resolution, nloci, + values=values, n_models=n_models, + outfile=outfile, n_keep=n_keep, n_cpus=n_cpus, + verbose=verbose, first=0, + close_bins=close_bins, config=config, container=container, + coords=coords, zeros=allzeros, + tmp_folder=tmp_folder,timeout_job=timeout_job, + initial_conformation='random' if not initial_conformation \ + else initial_conformation, + connectivity=connectivity, + timesteps_per_k=timesteps_per_k, kfactor=kfactor, + adaptation_step=adaptation_step, cleanup=cleanup, + hide_log=hide_log, initial_seed=start_seed, + remove_rstrn=remove_rstrn, restart_path=restart_path, + keep_restart_out_dir=keep_restart_out_dir, + store_n_steps=store_n_steps, + useColvars=useColvars + ) + class HiC_data(dict): + + def __init__(self, items, size): + self.update(items) + self.__size = size + self._size2 = size**2 + + def __len__(self): + return self.__size + + def __getitem__(self, row_col): + """ + get items + """ + try: + row, col = row_col + pos = row * self.__size + col + if pos > self._size2: + raise IndexError( + 'ERROR: row or column larger than %s' % self.__size) + return self.get(pos, 0) + except TypeError: + if row_col > self._size2: + raise IndexError( + 'ERROR: position %d larger than %s^2' % (row_col, + self.__size)) + return self.get(row_col, 0) + + def __setitem__(self, row_col, val): + """ + set items + """ + try: + row, col = row_col + pos = row * self.__size + col + if pos > self._size2: + print(row, col, pos) + raise IndexError( + 'ERROR: row or column larger than %s' % self.__size) + super().__setitem__(self,pos, val) + except TypeError: + if hasattr(self, '_size2') and row_col > self._size2: + raise IndexError( + 'ERROR: position %d larger than %s^2' % (row_col, + self.__size)) + super().__setitem__(self,row_col, val) diff --git a/tadphys/__init__.py b/tadphys/__init__.py new file mode 100644 index 0000000..e19de3e --- /dev/null +++ b/tadphys/__init__.py @@ -0,0 +1,72 @@ +from future import standard_library +standard_library.install_aliases() +from os import environ +from subprocess import Popen, PIPE, check_call, CalledProcessError + +from tadphys._version import __version__ + +# ## Check if we have X display http://stackoverflow.com/questions/8257385/automatic-detection-of-display-availability-with-matplotlib +# if not "DISPLAY" in environ: +# import matplotlib +# matplotlib.use('Agg') +# else: +# try: +# check_call('python -c "import matplotlib.pyplot as plt; plt.figure()"', +# shell=True, stdout=PIPE, stderr=PIPE) +# except CalledProcessError: +# import matplotlib +# matplotlib.use('Agg') + +def get_dependencies_version(dico=False): + """ + Check versions of TADphys and all dependencies, as well and retrieves system + info. May be used to ensure reproducibility. + :returns: string with description of versions installed + """ + versions = {' TADphys': __version__ + '\n\n'} + + try: + import scipy + versions['scipy'] = scipy.__version__ + except ImportError: + versions['scipy'] = 'Not found' + + try: + import numpy + versions['numpy'] = numpy.__version__ + except ImportError: + versions['numpy'] = 'Not found' + try: + import matplotlib + versions['matplotlib'] = matplotlib.__version__ + except ImportError: + versions['matplotlib'] = 'Not found' + try: + mcl, _ = Popen(['mcl', '--version'], stdout=PIPE, + stderr=PIPE, universal_newlines=True).communicate() + versions['MCL'] = mcl.split()[1] + except: + versions['MCL'] = 'Not found' + + try: + uname, err = Popen(['uname', '-rom'], stdout=PIPE, + stderr=PIPE, universal_newlines=True).communicate() + versions[' Machine'] = uname + except: + versions[' Machine'] = 'Not found' + + if dico: + return versions + else: + return '\n'.join(['%15s : %s' % (k, versions[k]) for k in + sorted(versions.keys())]) + + +from tadphys.chromosome import Chromosome +from tadphys.experiment import Experiment, load_experiment_from_reads +from tadphys.chromosome import load_chromosome +# from taddyn.modelling.structuralmodels import StructuralModels +# from taddyn.modelling.structuralmodels import load_structuralmodels +# from taddyn.utils.hic_parser import load_hic_data_from_reads +# from taddyn.utils.hic_parser import load_hic_data_from_bam +from tadphys.utils.hic_parser import read_matrix diff --git a/taddyn/__init__.pyc b/tadphys/__init__.pyc similarity index 100% rename from taddyn/__init__.pyc rename to tadphys/__init__.pyc diff --git a/taddyn/__init__.py b/tadphys/__init__.py~ similarity index 100% rename from taddyn/__init__.py rename to tadphys/__init__.py~ diff --git a/tadphys/_version.py b/tadphys/_version.py new file mode 100644 index 0000000..3dc1f76 --- /dev/null +++ b/tadphys/_version.py @@ -0,0 +1 @@ +__version__ = "0.1.0" diff --git a/tadphys/chromosome.py b/tadphys/chromosome.py new file mode 100644 index 0000000..186fd28 --- /dev/null +++ b/tadphys/chromosome.py @@ -0,0 +1,1009 @@ +""" +26 Nov 2012 + +""" + +from string import ascii_lowercase as letters +from copy import deepcopy as copy +from pickle import load, dump +from random import random +from math import sqrt +from sys import stderr +from os.path import exists +import tadphys +from tadphys.experiment import Experiment +# from tadphys.alignment import Alignment, randomization_test + +try: + import matplotlib.pyplot as plt +except ImportError: + stderr.write('matplotlib not found\n') + + +def load_chromosome(in_f, fast=2): + """ + Load a Chromosome object from a file. A Chromosome object can be saved with + the :func:`Chromosome.save_chromosome` function. + + :param in_f: path to a saved Chromosome object file + :param 2 fast: if fast=2 do not load the Hi-C data (in the case that they + were saved in a separate file see :func:`Chromosome.save_chromosome`). + If fast is equal to 1, the weights will be skipped from load to save + memory. Finally if fast=0, both the weights and Hi-C data will be loaded + + :returns: a Chromosome object + + TODO: remove first try/except type error... this is loading old experiments + """ + dico = load(open(in_f)) + name = '' + crm = Chromosome(dico['name']) + try: + exp_order = dico['experiment_order'] + except KeyError: + exp_order = dico['experiments'].keys() + for name in exp_order: + xpr = Experiment(name, dico['experiments'][name]['resolution'], + no_warn=True) + xpr.tads = dico['experiments'][name]['tads'] + xpr.norm = dico['experiments'][name]['wght'] + xpr.hic_data = dico['experiments'][name]['hi-c'] + xpr.conditions = dico['experiments'][name]['cond'] + xpr.size = dico['experiments'][name]['size'] + xpr._zeros = dico['experiments'][name].get('zero', {}) + try: # new in version post-CSDM13 + xpr.identifier = dico['experiments'][name]['iden'] + xpr.cell_type = dico['experiments'][name]['cell'] + xpr.exp_type = dico['experiments'][name]['expt'] + xpr.enzyme = dico['experiments'][name]['enzy'] + xpr.description = dico['experiments'][name]['desc'] + except KeyError: + xpr.identifier = None + xpr.cell_type = None + xpr.exp_type = None + xpr.enzyme = None + xpr.description = {} + try: + crm.experiments.append(xpr) + except TypeError: + continue + crm.size = dico['size'] + crm.r_size = dico['r_size'] + crm.max_tad_size = dico['max_tad_size'] + crm.forbidden = dico['forbidden'] + crm._centromere = dico['_centromere'] + try: # new in version post-CSDM13 + crm.species = dico['species'] + crm.assembly = dico['assembly'] + crm.description = dico['description'] + except KeyError: + crm.species = None + crm.assembly = None + crm.description = {} + if isinstance(dico['experiments'][name]['hi-c'], str) or fast != int(2): + try: + dicp = load(open(in_f + '_hic')) + for name in dico['experiments']: + crm.get_experiment(name).hic_data = dicp[name]['hi-c'] + if fast != 1: + crm.get_experiment(name).norm = dicp[name]['wght'] + except IOError: + try: + for name in dico['experiments']: + crm.get_experiment(name).hic_data = dico['experiments'][name]['hi-c'] + if fast != 1: + crm.get_experiment(name).norm = dico['experiments'][name]['wght'] + except KeyError: + raise Exception('ERROR: file %s not found\n' % ( + dico['experiments'][name]['hi-c'])) + elif not fast: + stderr.write('WARNING: data not saved correctly for fast loading.\n') + return crm + + +class Chromosome(object): + """ + A Chromosome object designed to deal with Topologically Associating Domains + predictions from different experiments, in different cell types for a given + chromosome of DNA, and to compare them. + + :param name: name of the chromosome (might be a chromosome name for example) + :param None species: species name + :param None assembly: version number of the genomic assembly used + :param None resolutions: list of resolutions corresponding to a list of + experiments passed. + :param None experiment_hic_data: :py:func:`list` of paths to files + containing the Hi-C count matrices corresponding to different experiments + :param None experiment_tads: :py:func:`list` of paths to files + containing the definition of TADs corresponding to different experiments + :param None experiment_names: :py:func:`list` of the names of each + experiment + :param infinite max_tad_size: maximum TAD size allowed. TADs longer than + this value will not be considered, and size of the corresponding + chromosome size will be reduced accordingly + :param 0 chr_len: size of the DNA chromosome in bp. By default it will be + inferred from the distribution of TADs + :param None parser: a parser function that returns a tuple of lists + representing the data matrix and the length of a row/column. With + the file example.tsv: + + :: + + chrT_001 chrT_002 chrT_003 chrT_004 + chrT_001 629 164 88 105 + chrT_002 164 612 175 110 + chrT_003 88 175 437 100 + chrT_004 105 110 100 278 + + the output of parser('example.tsv') would be be: + ``[([629, 164, 88, 105, 164, 612, 175, 110, 88, 175, 437, 100, 105, + 110, 100, 278]), 4]`` + :param None kw_descr: any other argument passed would be stored as + complementary descriptive field. For example:: + + crm = Chromosome('19', species='mus musculus', + subspecies='musculus musculus', + skin_color='black') + print crm + + # Chromosome 19: + # 0 experiment loaded: + # 0 alignment loaded: + # species : mus musculus + # assembly version: UNKNOWN + # subspecies : musculus musculus + # skin_color : black + + *note that these fields may appear in the header of generated out files* + + :return: Chromosome object + + + """ + def __init__(self, name, species=None, assembly=None, + experiment_resolutions=None, experiment_tads=None, + experiment_hic_data=None, experiment_norm_data=None, + experiment_names=None, max_tad_size=float('inf'), + chr_len=0, parser=None, centromere_search=False, + silent=False, **kw_descr): + self.name = name + self.size = self._given_size = self.r_size = chr_len + self.size = ChromosomeSize(self.size) + self.max_tad_size = max_tad_size + self.r_size = RelativeChromosomeSize(self.size) + self.forbidden = {} # only used for TAD alignment randomization + self.experiments = ExperimentList([], self) + self._centromere = None + self.alignment = AlignmentDict() + self.description = kw_descr + self.species = species + self.assembly = assembly + + self._search_centromere = centromere_search + if experiment_tads: + for i, handler in enumerate(experiment_tads or []): + name = experiment_names[i] if experiment_names else None + self.add_experiment(name, experiment_resolutions[i], + tad_def=handler, parser=parser) + if experiment_hic_data: + for i, handler in enumerate(experiment_hic_data or []): + name = experiment_names[i] if experiment_names else None + try: + xpr = self.get_experiment(name) + xpr.load_hic_data(handler, silent=silent) + continue + except: + pass + if isinstance(handler, Experiment): + handler.name = name or handler.name + self.experiments.append(handler) + else: + self.add_experiment(name, experiment_resolutions[i], + hic_data=handler, parser=parser, + silent=silent) + if experiment_norm_data: + for i, handler in enumerate(experiment_norm_data or []): + name = experiment_names[i] if experiment_names else None + try: + xpr = self.get_experiment(name) + xpr.load_norm_data(handler, silent=silent) + continue + except: + pass + if isinstance(handler, Experiment): + handler.name = name or handler.name + self.experiments.append(handler) + else: + self.add_experiment(name, experiment_resolutions[i], + norm_data=handler, parser=parser, + silent=silent) + + def __repr__(self): + outstr = 'Chromosome %s:\n' % self.name + outstr += (' %-2s experiment%s loaded: ' % ( + len(self.experiments), 's' * (len(self.experiments) > 0)) + + ', '.join([e.name for e in self.experiments]) + '\n') + outstr += (' %-2s alignment%s loaded: ' % ( + len(self.alignment), 's' * (len(self.alignment) > 0)) + + ', '.join([a.name for a in self.alignment]) + '\n') + try: # new in version post-CSDM13 + outstr += ' species : %s\n' % (self.species or 'UNKNOWN') + outstr += ' assembly version: %s\n' % (self.assembly or 'UNKNOWN') + for desc in self.description: + outstr += ' %-16s: %s\n' % (desc, self.description[desc]) + except AttributeError: + pass + return outstr + + + def _get_forbidden_region(self, xpr, resized=False): + """ + Find the regions for which there is no information in any of the + experiments. This is used to infer the relative chromosome size. + """ + if not xpr.tads: + return + forbidden = [] + for pos in xpr.tads: + start = float(xpr.tads[pos]['start']) + end = float(xpr.tads[pos]['end']) + diff = end - start + if diff * xpr.resolution > self.max_tad_size: + forbidden += range(int(start), int(end+1)) + xpr.tads[pos]['score'] = -abs(xpr.tads[pos]['score']) + else: + xpr.tads[pos]['score'] = abs(xpr.tads[pos]['score']) + if not self.forbidden: + self.forbidden = dict([(f, None) for f in forbidden]) + else: + self.forbidden = dict([(f, None) for f in + set(forbidden).intersection(self.forbidden)]) + # search for centromere: + if self._search_centromere: + self._find_centromere(xpr) + # add centromere as forbidden region: + if self._centromere: + for pos in xrange(int(self._centromere[0]), + int(self._centromere[1])): + self.forbidden[pos] = 'Centromere' + if not resized: + self.__update_size(xpr) + + + def get_experiment(self, name): + """ + Fetch an Experiment according to its name. + This can also be done directly with Chromosome.experiments[name]. + + :param name: name of the experiment to select + :returns: :class:`tadphys.Experiment` + """ + for exp in self.experiments: + if exp.name == name: + return exp + raise Exception(('ERROR: experiment ' + + '%s not found\n') % (name)) + + + def save_chromosome(self, out_f, fast=True, divide=True, force=False): + """ + Save a Chromosome object to a file (it uses :py:func:`pickle.load` from + the :py:mod:`cPickle`). Once saved, the object can be loaded with + :func:`load_chromosome`. + + :param out_f: path to the file where to store the :py:mod:`cPickle` + object + :param True fast: if True, skip Hi-C data and weights + :param True divide: if True writes two pickles, one with what would + result by using the fast option, and the second with the Hi-C and + weights data. The second file name will be extended by '_hic' (ie: + with out_f='chromosome12.pik' we would obtain chromosome12.pik and + chromosome12.pik_hic). When loaded :func:`load_chromosome` will + automatically search for both files + :param False force: overwrite the existing file + + """ + while exists(out_f) and not force: + out_f += '_' + dico = {'experiments': {}, + 'experiment_order': [xpr.name for xpr in self.experiments]} + if divide: + dicp = {} + for xpr in self.experiments: + dico['experiments'][xpr.name] = { + 'size' : xpr.size, + 'cond' : xpr.conditions, + 'tads' : xpr.tads, + 'resolution': xpr.resolution, + 'hi-c' : None, + 'wght' : None, + 'iden' : xpr.identifier, + 'cell' : xpr.cell_type, + 'expt' : xpr.exp_type, + 'enzy' : xpr.enzyme, + 'desc' : xpr.description, + 'zero' : xpr._zeros + } + if fast: + continue + if divide: + dicp[xpr.name] = { + 'wght': xpr.norm, + 'hi-c': xpr.hic_data} + dico['experiments'][xpr.name]['wght'] = None + dico['experiments'][xpr.name]['hi-c'] = None + else: + dico['experiments'][xpr.name]['wght'] = xpr.norm + dico['experiments'][xpr.name]['hi-c'] = xpr.hic_data + dico['name'] = self.name + dico['size'] = self.size + dico['r_size'] = self.r_size + dico['max_tad_size'] = self.max_tad_size + dico['forbidden'] = self.forbidden + dico['_centromere'] = self._centromere + dico['species'] = self.species + dico['assembly'] = self.assembly + dico['description'] = self.description + out = open(out_f, 'w') + dump(dico, out) + out.close() + if not fast and divide: + out = open(out_f + '_hic', 'w') + dump(dicp, out) + out.close() + + # def align_experiments(self, names=None, verbose=False, randomize=False, + # rnd_method='interpolate', rnd_num=1000, + # get_score=False, **kwargs): + # """ + # Align the predicted boundaries of two different experiments. The + # resulting alignment will be stored in the self.experiment list. + + # :param None names: list of names of the experiments to align. If None, + # align all + # :param experiment1: name of the first experiment to align + # :param experiment2: name of the second experiment to align + # :param -0.1 penalty: penalty for inserting a gap in the alignment + # :param 100000 max_dist: maximum distance between two boundaries + # allowing match (100Kb seems fair with HUMAN chromosomes) + # :param False verbose: if True, print some information about the + # alignments + # :param False randomize: check the alignment quality by comparing + # randomized boundaries over Chromosomes of the same size. This will + # return a extra value, the p-value of accepting that the observed + # alignment is not better than a random alignment + # :param False get_score: returns alignemnt object, alignment score and + # percentage of identity from one side and from the other + # :param interpolate rnd_method: by default uses the interpolation of TAD + # distribution. The alternative method is 'shuffle', where TADs are + # simply shuffled + # :param 1000 rnd_num: number of randomizations to do + # :param reciprocal method: if global, Needleman-Wunsch is used to align + # (see :func:`tadphys.boundary_aligner.globally.needleman_wunsch`); + # if reciprocal, a method based on reciprocal closest boundaries is + # used (see :func:`tadphys.boundary_aligner.reciprocally.reciprocal`) + + # :returns: an alignment object or, if the randomizattion was invoked, + # an alignment object, and a list of statistics that are, the alignment + # score, the probability that observed alignment performs better than + # randoms, the proportion of borders from the first experiment found + # aligned in the second experiment and the proportion of borders from + # the second experiment found aligned in the first experiment. + # Returned calues can be catched like this: + + # ali = crm.align_experiments() + + # or, with randomization test: + + # ali, (score, pval, prop1, prop2) = crm.align_experiments(randomize=True) + + # """ + # if names: + # xpers = ExperimentList([self.get_experiment(n) for n in names], + # self) + # else: + # xpers = self.experiments + # tads = [] + # for xpr in xpers: + # if not xpr.tads: + # raise Exception('No TADs defined, use find_tad function.\n') + # tads.append([xpr.tads[x]['brk'] * xpr.resolution for x in xpr.tads + # if xpr.tads[x]['score'] >= 0]) + # (aligneds, score, perc1, perc2), consensus = align(tads, verbose=verbose, **kwargs) + # name = tuple(sorted([x.name for x in xpers])) + # ali = Alignment(name, aligneds, xpers, consensus, score=score) + # self.alignment[name] = ali + # if verbose: + # print self.alignment[name] + # if not randomize: + # if get_score: + # return ali, score, perc1, perc2 + # else: + # return ali + # p_value = randomization_test(xpers, score=score, rnd_method=rnd_method, + # verbose=verbose, r_size=self.r_size, + # num=rnd_num, **kwargs) + # return ali, (score, p_value, perc1, perc2) + + + def add_experiment(self, name, resolution=None, tad_def=None, hic_data=None, + norm_data=None, replace=False, parser=None, + conditions=None, **kwargs): + """ + Add a Hi-C experiment to Chromosome + + :param name: name of the experiment or of the Experiment object + :param resolution: resolution of the experiment (needed if name is not + an Experiment object) + :param None hic_data: whether a file or a list of lists corresponding to + the Hi-C data + :param None tad_def: a file or a dict with precomputed TADs for this + experiment + :param False replace: overwrite the experiments loaded under the same + name + :param None parser: a parser function that returns a tuple of lists + representing the data matrix and the length of a row/column. With + a file example.tsv containing: + + :: + + chrT_001 chrT_002 chrT_003 chrT_004 + chrT_001 629 164 88 105 + chrT_002 164 612 175 110 + chrT_003 88 175 437 100 + chrT_004 105 110 100 278 + + the output of parser('example.tsv') would be: + ``[([629, 164, 88, 105, 164, 612, 175, 110, 88, 175, 437, 100, 105, + 110, 100, 278]), 4]`` + + """ + if not name: + name = ''.join([letters[int(random() * len(letters))] \ + for _ in xrange(5)]) + stderr.write('WARNING: No name provided, random name ' + + 'generated: %s\n' % (name)) + if name in self.experiments: + if 'hi-c' in self.get_experiment(name) and not replace: + stderr.write( + '''WARNING: Hi-C data already loaded under the name: %s. + This experiment will be kept under %s.\n''' % (name, + name + '_')) + name += '_' + if isinstance(name, Experiment): + self.experiments.append(name) + elif resolution: + self.experiments.append(Experiment( + name, resolution, hic_data=hic_data, norm_data=norm_data, + tad_def=tad_def, parser=parser, conditions=conditions, + **kwargs)) + else: + raise Exception('resolution param is needed\n') + + + # def find_tad(self, experiments, name=None, n_cpus=1, + # verbose=True, max_tad_size="max", heuristic=True, + # batch_mode=False, **kwargs): + # """ + # Call the :func:`tadphys.tadbit.tadbit` function to calculate the + # position of Topologically Associated Domain boundaries + + # :param experiment: A square matrix of interaction counts of Hi-C + # data or a list of such matrices for replicated experiments. The + # counts must be evenly sampled and not normalized. 'experiment' + # can be either a list of lists, a path to a file or a file handler + # :param True normalized: if False simple normalization will be computed, + # as well as a simple column filtering will be applied (remove columns + # where value at the diagonal is null) + # :param 1 n_cpus: The number of CPUs to allocate to TADbit. If + # n_cpus='max' the total number of CPUs will be used + # :param max max_tad_size: an integer defining the maximum size of a + # TAD. Default (auto) defines it as the number of rows/columns + # :param True heuristic: whether to use or not some heuristics + # :param False batch_mode: if True, all the experiments will be + # concatenated into one for the search of TADs. The resulting TADs + # found are stored under the name 'batch' plus a concatenation of the + # experiment names passed (e.g.: if experiments=['exp1', 'exp2'], the + # name would be: 'batch_exp1_exp2'). + + # """ + # experiments = experiments or self.experiments + # if not isinstance(experiments, list): + # experiments = [experiments] + # xprs = [] + # for xpr in experiments: + # if not isinstance(xpr, Experiment): + # xpr = self.get_experiment(xpr) + # xprs.append(xpr) + # # if normalized and (not xpr._zeros or not xpr._normalization): + # # raise Exception('ERROR: Experiments should be normalized, and' + + # # ' filtered first') + # if len(xprs) <= 1 and batch_mode: + # raise Exception('ERROR: batch_mode implies that more than one ' + + # 'experiment is passed') + # if batch_mode: + # matrix = [] + # if not name: + # name = 'batch' + # resolution = xprs[0].resolution + # for xpr in sorted(xprs, key=lambda x: x.name): + # if xpr.resolution != resolution: + # raise Exception('All Experiments must have the same ' + + # 'resolution\n') + # matrix.append(xpr.hic_data[0]) + # if name.startswith('batch'): + # name += '_' + xpr.name + # siz = xprs[0].size + # tmp = reduce(lambda x, y: x.__add__(y, silent=True), xprs) + # tmp.filter_columns(silent=kwargs.get('silent', False)) + # remove = tuple([1 if i in tmp._zeros else 0 + # for i in xrange(siz)]) + # result = tadbit(matrix, + # remove=remove, + # n_cpus=n_cpus, verbose=verbose, + # max_tad_size=max_tad_size, + # no_heuristic=not heuristic, **kwargs) + # xpr = Experiment(name, resolution, hic_data=matrix, + # tad_def=result, **kwargs) + # xpr._zeros = xprs[0]._zeros + # for other in xprs[1:]: + # xpr._zeros = dict([(k, None) for k in + # set(xpr._zeros.keys()).intersection( + # other._zeros.keys())]) + # self.add_experiment(xpr) + # return + # for xpr in xprs: + # result = tadbit( + # xpr.hic_data, + # remove=tuple([1 if i in xpr._zeros else 0 for i in + # xrange(xpr.size)]), + # n_cpus=n_cpus, verbose=verbose, + # max_tad_size=max_tad_size, + # no_heuristic=not heuristic, **kwargs) + # xpr.load_tad_def(result) + # self._get_forbidden_region(xpr) + + def __update_size(self, xpr): + """ + Update the chromosome size and relative size after loading new Hi-C + experiments, unless the Chromosome size was defined by hand. + + """ + if not self._given_size: + self.size = max(xpr.tads[max(xpr.tads)]['end'] * xpr.resolution, + self.size) + self.size = ChromosomeSize(self.size) + self._get_forbidden_region(xpr, resized=True) + + self.r_size = self.size - len(self.forbidden) * xpr.resolution + self.r_size = RelativeChromosomeSize(self.size) + + + # def tad_density_plot(self, name, axe=None, focus=None, extras=None, + # normalized=True, savefig=None, shape='ellipse'): + # """ + # Draw an summary of the TAD found in a given experiment and their density + # in terms of relative Hi-C interaction count. + + # :param name: name of the experiment to visualize + # :param None focus: can pass a tuple (bin_start, bin_stop) to display the + # alignment between these genomic bins + # :param None extras: list of coordinates (genomic bin) where to draw a + # red cross + # :param None ymax: limit the y axis up to a given value + # :param ('grey', ): successive colors for alignment + # :param True normalized: normalized Hi-C count are plotted instead of raw + # data. + # :param 'ellipse' shape: which kind of shape to use as schematic + # representation of TADs. Implemented: 'ellipse', 'rectangle', + # 'triangle' + # :param None savefig: path to a file where to save the image generated; + # if None, the image will be shown using matplotlib GUI (the extension + # of the file name will determine the desired format). + # """ + # if not self.experiments[name].tads: + # raise Exception("TAD borders not found\n") + # _tad_density_plot(self.experiments[name], axe=axe, focus=focus, + # extras=extras, normalized=normalized, + # savefig=savefig, shape=shape) + + + # def visualize(self, names=None, tad=None, focus=None, paint_tads=False, + # axe=None, show=True, logarithm=True, normalized=False, + # relative=True, decorate=True, savefig=None, clim=None, + # scale=(8, 6), cmap='jet'): + # """ + # Visualize the matrix of Hi-C interactions of a given experiment + + # :param None names: name of the experiment to visualize, or list of + # experiment names. If None, all experiments will be shown + # :param None tad: a given TAD in the form: + # :: + + # {'start': start, + # 'end' : end, + # 'brk' : end, + # 'score': score} + + # **Alternatively** a list of the TADs can be passed (all the TADs + # between the first and last one passed will be showed. Thus, passing + # more than two TADs might be superfluous) + # :param None focus: a tuple with the start and end positions of the + # region to visualize + # :param False paint_tads: draw a box around the TADs defined for this + # experiment + # :param None axe: an axe object from matplotlib can be passed in order + # to customize the picture + # :param True show: either to pop-up matplotlib image or not + # :param True logarithm: show the logarithm values + # :param True normalized: show the normalized data (weights might have + # been calculated previously). *Note: white rows/columns may appear in + # the matrix displayed; these rows correspond to filtered rows (see* + # :func:`tadphys.utils.hic_filtering.hic_filtering_for_modelling` *)* + # :param True relative: color scale is relative to the whole matrix of + # data, not only to the region displayed + # :param True decorate: draws color bar, title and axes labels + # :param None savefig: path to a file where to save the image generated; + # if None, the image will be shown using matplotlib GUI (the extension + # of the file name will determine the desired format). + # :param None clim: tuple with minimum and maximum value range for color + # scale. I.e. clim=(-4, 10) + # :param 'jet' cmap: color map from matplotlib. Can also be a + # preconfigured cmap object. + # """ + # if names == None: + # names = [xpr.name for xpr in self.experiments] + # if not isinstance(names, list) and not isinstance(names, tuple): + # names = [names] + # cols = 1 + # rows = 1 + # else: + # sqrtxpr = sqrt(len(names)) + # cols = int(round(sqrtxpr + (0.0 if int(sqrtxpr)==sqrtxpr else .5))) + # rows = int(sqrtxpr+.5) + # notaxe = axe == None + # if not scale: + # scale = (8, 6) + # if notaxe and len(names) != 1: + # fig = plt.figure(figsize=(scale[0] * cols, scale[1] * rows)) + # for i in xrange(rows): + # for j in xrange(cols): + # if i * cols + j >= len(names): + # break + # if notaxe and len(names) != 1: + # axe = fig.add_subplot( + # rows, cols, i * cols + j + 1) + # if (isinstance(names[i * cols + j], tuple) or + # isinstance(names[i * cols + j], list)): + # if not axe: + # fig = plt.figure(figsize=(scale[0] * cols, scale[1] * rows)) + # axe = fig.add_subplot( + # rows, cols, i * cols + j + 1) + # xpr1 = self.get_experiment(names[i * cols + j][0]) + # xpr2 = self.get_experiment(names[i * cols + j][1]) + # img = xpr1.view(tad=tad, focus=focus, paint_tads=paint_tads, + # axe=axe, show=False, logarithm=logarithm, + # normalized=normalized, relative=relative, + # decorate=decorate, savefig=False, + # where='up', clim=clim, cmap=cmap) + # img = xpr2.view(tad=tad, focus=focus, paint_tads=paint_tads, + # axe=axe, show=False, logarithm=logarithm, + # normalized=normalized, relative=relative, + # decorate=False, savefig=False, where='down', + # clim=clim or img.get_clim(), cmap=cmap) + # #axe = axe.twinx() + # #axe.set_aspect('equal',adjustable='box-forced',anchor='NE') + # if decorate: + # plt.text(1.01, .5, + # 'Chromosome %s experiment %s' % ( + # self.name, xpr2.name), + # rotation=-90, va='center', size='large', + # ha='left', transform=axe.transAxes) + # else: + # xper = self.get_experiment(names[i * cols + j]) + # if not xper.hic_data and not xper.norm: + # continue + # xper.view(tad=tad, focus=focus, paint_tads=paint_tads, + # axe=axe, show=False, logarithm=logarithm, + # normalized=normalized, relative=relative, + # decorate=decorate, savefig=False, clim=clim, + # cmap=cmap) + # if savefig: + # tadbit_savefig(savefig) + # if show: + # plt.show() + + + # def get_tad_hic(self, tad, x_name, normed=True, matrix_num=0): + # """ + # Retrieve the Hi-C data matrix corresponding to a given TAD. + + # :param tad: a given TAD (:py:class:`dict`) + # :param x_name: name of the experiment + # :param True normed: if True, normalize the Hi-C data + + # :returns: Hi-C data matrix for the given TAD + # """ + # beg, end = int(tad['start']), int(tad['end']) + # xpr = self.get_experiment(x_name) + # size = xpr.size + # matrix = [[0 for _ in xrange(beg, end)]\ + # for _ in xrange(beg, end)] + # for i, tadi in enumerate(xrange(beg, end)): + # tadi = tadi * size + # for j, tadj in enumerate(xrange(beg, end)): + # if normed: + # matrix[j][i] = xpr.norm[0][tadi + tadj] + # else: + # matrix[j][i] = xpr.hic_data[matrix_num][tadi + tadj] + # return matrix + + + # def iter_tads(self, x_name, normed=True): + # """ + # Iterate over the TADs corresponding to a given experiment. + + # :param x_name: name of the experiment + # :param True normed: normalize Hi-C data returned + + # :yields: Hi-C data corresponding to each TAD + # """ + # if not self.get_experiment(x_name).hic_data: + # raise Exception('No Hi-c data for %s experiment\n' % (x_name)) + # for name, ref in self.get_experiment(x_name).tads.iteritems(): + # yield name, self.get_tad_hic(ref, x_name, normed=normed) + + + # def set_max_tad_size(self, value): + # """ + # Change the maximum size allowed for TADs. It also applies to the + # computed experiments. + + # :param value: an int value (default is 5000000) + # """ + # self.max_tad_size = value + # for xpr in self.experiments: + # for tad in xpr.tads: + # xpr.tads[tad]['brk'] = xpr.tads[tad]['end'] + # if ((xpr.tads[tad]['end'] - xpr.tads[tad]['start']) + # * xpr.resolution) > self.max_tad_size: + # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) + + + # def _find_centromere(self, xpr): + # """ + # Search for the centromere in a chromosome, assuming that + # :class:`Chromosome` corresponds to a real chromosome. + # Add a boundary to all the experiments where the centromere is. + # * A centromere is defined as the largest area where the rows/columns + # of the Hi-C matrix are empty. + # """ + # beg = end = 0 + # size = xpr.size + # try: + # hic = xpr.hic_data[0] + # except TypeError: + # return + # # search for largest empty region of the chromosome + # best = (0, 0, 0) + # pos = 0 + # for pos, raw in enumerate(xrange(0, size * size, size)): + # if sum([hic[i] for i in xrange(raw, raw + size)]) == 0 and not beg: + # beg = float(pos) + # if sum([hic[i] for i in xrange(raw, raw + size)]) != 0 and beg: + # end = float(pos) + # if (end - beg) > best[0]: + # best = ((end - beg), beg, end) + # beg = end = 0 + # # this is for weared cases where centromere is at the end of Hi-C data + # if beg and not end: + # end = float(pos) + # if (end - beg) > best[0]: + # best = ((end - beg), beg, end) + # beg, end = best[1:] + # if not beg or not end: + # return + # tads = xpr.tads + # # if we already have a centromere defined, check if it can be reduced + # if self._centromere: + # if beg > self._centromere[0]: + # # readjust TADs that have been split around the centromere + # for tad in tads: + # if tads[tad]['end'] == self._centromere[0]: + # tads[tad]['end'] = beg + # self._centromere[0] = beg + # if end < self._centromere[1]: + # # readjust TADs that have been split around the centromere + # for tad in tads: + # if tads[tad]['start'] == self._centromere[1]: + # tads[tad]['start'] = end + # self._centromere[1] = end + # else: + # self._centromere = [beg, end] + # # split TADs overlapping with the centromere + # if [True for t in tads.values() \ + # if t['start'] < beg < t['end'] \ + # and t['start'] < end < t['end']]: + # tad = len(tads) + 1 + # plus = 0 + # while tad + plus > 1: + # start = tads[tad - 1 + plus]['start'] + # final = tads[tad - 1 + plus]['end'] + # # centromere found? + # if start < beg < final and start < end < final: + # tads[tad] = copy(tads[tad - 1]) + # tads[tad]['start'] = end + # tads[tad]['score'] = abs(tads[tad]['score']) + # if (tads[tad]['end'] - tads[tad]['start']) \ + # * xpr.resolution > self.max_tad_size: + # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) + # tads[tad]['brk'] = tads[tad]['end'] + # tad -= 1 + # tads[tad] = copy(tads[tad]) + # tads[tad]['score'] = abs(tads[tad]['score']) + # tads[tad]['end'] = beg + # if (tads[tad]['end'] - tads[tad]['start']) \ + # * xpr.resolution > self.max_tad_size: + # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) + # tads[tad]['brk'] = tads[tad]['end'] + # plus = 1 + # else: + # tads[tad] = copy(tads[tad - 1 + plus]) + # tad -= 1 + # # if tad includes centromere but starts in the same point + # elif [True for t in tads.values() \ + # if t['start'] == beg and end < t['end']]: + # tad = len(tads) + 1 + # while tad > 1: + # start = tads[tad - 1]['start'] + # final = tads[tad - 1]['end'] + # # centromere found? + # if start == beg: + # tads[tad] = copy(tads[tad - 1]) + # tads[tad]['start'] = end + # tads[tad]['score'] = abs(tads[tad]['score']) + # if (tads[tad]['end'] - tads[tad]['start']) \ + # * xpr.resolution > self.max_tad_size: + # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) + # else: + # tads[tad] = copy(tads[tad - 1]) + # tad -= 1 + # # if tad includes centromere but ends in the same point + # elif [True for t in tads.values() \ + # if t['end'] == end and beg > t['start']]: + # tad = len(tads) + 1 + # plus = 0 + # while tad + plus > 1: + # start = tads[tad - 1 + plus]['start'] + # final = tads[tad - 1 + plus]['end'] + # # centromere found? + # if final == end: + # tads[tad] = copy(tads[tad - 1]) + # tads[tad]['start'] = beg + # tads[tad]['score'] = abs(tads[tad]['score']) + # if (tads[tad]['end'] - tads[tad]['start']) \ + # * xpr.resolution > self.max_tad_size: + # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) + # tads[tad]['brk'] = tads[tad]['end'] + # tad -= 1 + # tads[tad] = copy(tads[tad]) + # tads[tad]['score'] = abs(tads[tad]['score']) + # tads[tad]['end'] = beg + # if (tads[tad]['end'] - tads[tad]['start']) \ + # * xpr.resolution > self.max_tad_size: + # xpr.tads[tad]['score'] = -abs(xpr.tads[tad]['score']) + # tads[tad]['brk'] = tads[tad]['end'] + # plus = 1 + # else: + # tads[tad] = copy(tads[tad - 1 + plus]) + # tad -= 1 + + + +class ExperimentList(list): + """ + Inherited from python built in :py:func:`list`, modified for TADbit + :class:`tadphys.Experiment`. + + Mainly, `getitem`, `setitem`, and `append` were modified in order to + be able to search for experiments by index or by name, and to add + experiments simply using Chromosome.experiments.append(Experiment). + + The whole ExperimentList object is linked to a Chromosome instance + (:class:`tadphys.Chromosome`). + + """ + def __init__(self, thing, crm): + super(ExperimentList, self).__init__(thing) + self.crm = crm + + + def __getitem__(self, i): + try: + return super(ExperimentList, self).__getitem__(i) + except TypeError: + for nam in self: + if nam.name == i: + return nam + raise KeyError('Experiment %s not found\n' % (i)) + + + def __setitem__(self, i, exp): + try: + super(ExperimentList, self).__setitem__(i, exp) + exp.crm = self.crm + self.crm._get_forbidden_region(exp) + except TypeError: + for j, nam in enumerate(self): + if nam.name == i: + exp.crm = self.crm + self[j] = exp + self.crm._get_forbidden_region(exp) + break + else: + exp.crm = self.crm + self.append(exp) + self.crm._get_forbidden_region(exp) + + + def __delitem__(self, i): + try: + super(ExperimentList, self).__delitem__(i) + except TypeError: + for j, nam in enumerate(self): + if nam.name == i: + exp = self.pop(j) + del(exp) + break + else: + raise KeyError('Experiment %s not found\n' % (i)) + + + def append(self, exp): + if exp.name in [e.name for e in self]: + self[exp.name] = exp + self.crm._get_forbidden_region(exp) + else: + super(ExperimentList, self).append(exp) + self.crm._get_forbidden_region(exp) + exp.crm = self.crm + + +class AlignmentDict(dict): + """ + :py:func:`dict` of :class:`tadphys.Alignment` + + Modified getitem, setitem, and append in order to be able to search + alignments by index or by name. + + linked to a :class:`tadphys.Chromosome` + """ + + def __getitem__(self, nam): + try: + return super(AlignmentDict, self).__getitem__(tuple(sorted(nam))) + except KeyError: + for i, key in enumerate(self): + if nam == i: + return self[key] + raise TypeError('Alignment %s not found\n' % i) + + +class ChromosomeSize(int): + """ + Simple class inheriting from integer designed to hold chromosome size in + base pairs + """ + def __init__(self, thing): + super(ChromosomeSize, self).__init__(thing) + + +class RelativeChromosomeSize(int): + """ + Relative Chromosome size in base pairs. Equal to Chromosome size minus + forbidden regions (eg: the centromere) + + Only used for TAD alignment randomization. + """ + def __init__(self, thing): + super(RelativeChromosomeSize, self).__init__(thing) diff --git a/taddyn/chromosome.py b/tadphys/chromosome.py~ similarity index 98% rename from taddyn/chromosome.py rename to tadphys/chromosome.py~ index 96e01c5..ff485dc 100644 --- a/taddyn/chromosome.py +++ b/tadphys/chromosome.py~ @@ -5,14 +5,14 @@ from string import ascii_lowercase as letters from copy import deepcopy as copy -from cPickle import load, dump +from Pickle import load, dump from random import random from math import sqrt from sys import stderr from os.path import exists -import taddyn -from taddyn.experiment import Experiment -# from taddyn.alignment import Alignment, randomization_test +import tadphys +from tadphys.experiment import Experiment +# from tadphys.alignment import Alignment, randomization_test try: import matplotlib.pyplot as plt @@ -276,7 +276,7 @@ def get_experiment(self, name): This can also be done directly with Chromosome.experiments[name]. :param name: name of the experiment to select - :returns: :class:`taddyn.Experiment` + :returns: :class:`tadphys.Experiment` """ for exp in self.experiments: if exp.name == name: @@ -379,9 +379,9 @@ def save_chromosome(self, out_f, fast=True, divide=True, force=False): # simply shuffled # :param 1000 rnd_num: number of randomizations to do # :param reciprocal method: if global, Needleman-Wunsch is used to align - # (see :func:`taddyn.boundary_aligner.globally.needleman_wunsch`); + # (see :func:`tadphys.boundary_aligner.globally.needleman_wunsch`); # if reciprocal, a method based on reciprocal closest boundaries is - # used (see :func:`taddyn.boundary_aligner.reciprocally.reciprocal`) + # used (see :func:`tadphys.boundary_aligner.reciprocally.reciprocal`) # :returns: an alignment object or, if the randomizattion was invoked, # an alignment object, and a list of statistics that are, the alignment @@ -485,7 +485,7 @@ def add_experiment(self, name, resolution=None, tad_def=None, hic_data=None, # verbose=True, max_tad_size="max", heuristic=True, # batch_mode=False, **kwargs): # """ - # Call the :func:`taddyn.tadbit.tadbit` function to calculate the + # Call the :func:`tadphys.tadbit.tadbit` function to calculate the # position of Topologically Associated Domain boundaries # :param experiment: A square matrix of interaction counts of Hi-C @@ -639,7 +639,7 @@ def __update_size(self, xpr): # :param True normalized: show the normalized data (weights might have # been calculated previously). *Note: white rows/columns may appear in # the matrix displayed; these rows correspond to filtered rows (see* - # :func:`taddyn.utils.hic_filtering.hic_filtering_for_modelling` *)* + # :func:`tadphys.utils.hic_filtering.hic_filtering_for_modelling` *)* # :param True relative: color scale is relative to the whole matrix of # data, not only to the region displayed # :param True decorate: draws color bar, title and axes labels @@ -903,14 +903,14 @@ def __update_size(self, xpr): class ExperimentList(list): """ Inherited from python built in :py:func:`list`, modified for TADbit - :class:`taddyn.Experiment`. + :class:`tadphys.Experiment`. Mainly, `getitem`, `setitem`, and `append` were modified in order to be able to search for experiments by index or by name, and to add experiments simply using Chromosome.experiments.append(Experiment). The whole ExperimentList object is linked to a Chromosome instance - (:class:`taddyn.Chromosome`). + (:class:`tadphys.Chromosome`). """ def __init__(self, thing, crm): @@ -971,12 +971,12 @@ def append(self, exp): class AlignmentDict(dict): """ - :py:func:`dict` of :class:`taddyn.Alignment` + :py:func:`dict` of :class:`tadphys.Alignment` Modified getitem, setitem, and append in order to be able to search alignments by index or by name. - linked to a :class:`taddyn.Chromosome` + linked to a :class:`tadphys.Chromosome` """ def __getitem__(self, nam): diff --git a/tadphys/experiment.py b/tadphys/experiment.py new file mode 100644 index 0000000..0f81f4a --- /dev/null +++ b/tadphys/experiment.py @@ -0,0 +1,1749 @@ +""" +20 Feb 2013 + + +""" + +from copy import deepcopy as copy +from sys import stderr +from warnings import warn +from math import isnan +from numpy import log2, array +#from tadphys import HiC_data +from tadphys.modelling.HIC_CONFIG import CONFIG +from tadphys.utils.hic_parser import read_matrix +from tadphys.utils.extraviews import nicer +from tadphys.utils.tadmaths import zscore, nozero_log_matrix +from tadphys.utils.hic_filtering import hic_filtering_for_modelling +# from tadphys.modelling.structuralmodels import StructuralModels +from collections import OrderedDict + +try: + from tadphys.modelling.impoptimizer import IMPoptimizer + # from tadphys.modelling.imp_modelling import generate_3d_models + from tadphys.modelling.lammps_modelling import generate_lammps_models +except ImportError: + stderr.write('IMP not found, check PYTHONPATH\n') + +try: + import matplotlib.pyplot as plt + from matplotlib.cm import jet +except ImportError: + stderr.write('matplotlib not found\n') + + +def load_experiment_from_reads(name, fnam, genome_seq, resolution, + conditions=None, identifier=None, cell_type=None, + enzyme=None, exp_type='Hi-C', **kw_descr): + """ + Loads an experiment object from TADbit-generated read files, that are lists + of pairs of reads mapped to a reference genome. + + :param fnam: tsv file with reads1 and reads2 + :param name: name of the experiment + :param resolution: the resolution of the experiment (size of a bin in + bases) + :param None identifier: some identifier relative to the Hi-C data + :param None cell_type: cell type on which the experiment was done + :param None enzyme: restriction enzyme used in the Hi-C experiment + :param Hi-C exp_type: name of the experiment used (currently only Hi-C is + supported) + :param None conditions: :py:func:`list` of experimental conditions, e.g. + the cell type, the enzyme... (i.e.: ['HindIII', 'cortex', 'treatment']). + This parameter may be used to compare the effect of this conditions on + the TADs + :param None kw_descr: any other argument passed would be stored as + complementary descriptive field. For example:: + + exp = Experiment('k562_rep2', resolution=100000, + identifier='SRX015263', cell_type='K562', + enzyme='HindIII', cylce='synchronized') + print exp + + # Experiment k562_rep2: + # resolution : 100Kb + # TADs : None + # Hi-C rows : None + # normalized : None + # identifier : SRX015263 + # cell type : K562 + # restriction enzyme: HindIII + # cylce : synchronized + + *note that these fields may appear in the header of generated out files* + """ + size = 0 + section_sizes = {} + sections = [] + for crm in genome_seq: + len_crm = int(float(len(genome_seq[crm])) / resolution + 1) + section_sizes[(crm,)] = len_crm + size += len_crm + 1 + sections.extend([(crm, '%04d' % i) for i in xrange(len_crm + 1)]) + imx = HiC_data((), size) + dict_sec = dict([(j, i) for i, j in enumerate(sections)]) + for line in open(fnam): + _, cr1, ps1, _, _, _, _, cr2, ps2, _ = line.split('\t', 9) + ps1 = dict_sec[(cr1, '%04d' % (int(ps1) / resolution))] + ps2 = dict_sec[(cr2, '%04d' % (int(ps2) / resolution))] + imx[ps1 + ps2 * size] += 1 + imx[ps2 + ps1 * size] += 1 + + return Experiment(name, resolution=resolution, hic_data=imx, + conditions=conditions, identifier=identifier, + cell_type=cell_type, enzyme=enzyme, exp_type=exp_type, + **kw_descr) + +class Experiment(object): + """ + Hi-C experiment. + + :param name: name of the experiment + :param resolution: the resolution of the experiment (size of a bin in + bases) + :param None identifier: some identifier relative to the Hi-C data + :param None cell_type: cell type on which the experiment was done + :param None enzyme: restriction enzyme used in the Hi-C experiment + :param Hi-C exp_type: name of the experiment used (currently only Hi-C is + supported) + :param None hic_data: whether a file or a list of lists corresponding to + the Hi-C data + :param None tad_def: a file or a dict with precomputed TADs for this + experiment + :param None parser: a parser function that returns a tuple of lists + representing the data matrix and the length of a row/column. With + the file example.tsv: + + :: + + chrT_001 chrT_002 chrT_003 chrT_004 + chrT_001 629 164 88 105 + chrT_002 164 612 175 110 + chrT_003 88 175 437 100 + chrT_004 105 110 100 278 + + the output of parser('example.tsv') would be be: + ``[([629, 164, 88, 105, 164, 612, 175, 110, 88, 175, 437, 100, 105, + 110, 100, 278]), 4]`` + :param None conditions: :py:func:`list` of experimental conditions, e.g. + the cell type, the enzyme... (i.e.: ['HindIII', 'cortex', 'treatment']). + This parameter may be used to compare the effect of this conditions on + the TADs + :param True filter_columns: filter the columns with unexpectedly high + content of low values + :param None kw_descr: any other argument passed would be stored as + complementary descriptive field. For example:: + + exp = Experiment('k562_rep2', resolution=100000, + identifier='SRX015263', cell_type='K562', + enzyme='HindIII', cylce='synchronized') + print exp + + # Experiment k562_rep2: + # resolution : 100Kb + # TADs : None + # Hi-C rows : None + # normalized : None + # identifier : SRX015263 + # cell type : K562 + # restriction enzyme: HindIII + # cylce : synchronized + + *note that these fields may appear in the header of generated out files* + + TODO: doc conditions + TODO: normalization + """ + + + def __init__(self, name, resolution, hic_data=None, norm_data=None, + tad_def=None, parser=None, no_warn=False, weights=None, + conditions=None, identifier=None, + cell_type=None, enzyme=None, exp_type='Hi-C', **kw_descr): + self.name = name + self.resolution = resolution + self.identifier = identifier + self.cell_type = cell_type + self.enzyme = enzyme + self.description = kw_descr + self.exp_type = exp_type + self.crm = None + self._ori_resolution = resolution + self.hic_data = None + self._ori_hic = None + self._ori_norm = None + self._ori_size = None + self.conditions = sorted(conditions) if conditions else [] + self.size = None + self.tads = {} + self.norm = None + self.bias = None + self._normalization = None + self._filtered_cols = False + self._zeros = [] + self._zscores = [] + if hic_data: + self.load_hic_data(hic_data, parser, **kw_descr) + if norm_data: + self.load_norm_data(norm_data, parser, **kw_descr) + if tad_def: + self.load_tad_def(tad_def, weights=weights) + elif not hic_data and not no_warn and not norm_data: + stderr.write('WARNING: this is an empty shell, no data here.\n') + + + def __repr__(self): + return 'Experiment %s (resolution: %s, TADs: %s, Hi-C rows: %s, normalized: %s)' % ( + self.name, nicer(self.resolution), len(self.tads) or None, + self.size, self._normalization if self._normalization else 'None') + + + def __str__(self): + outstr = 'Experiment %s:\n' % (self.name) + outstr += ' resolution : %s\n' % (nicer(self.resolution)) + outstr += ' TADs : %s\n' % (len(self.tads) or None) + outstr += ' Hi-C rows : %s\n' % (self.size) + outstr += ' normalized : %s\n' % (self._normalization or None) + ukw = 'UNKNOWN' + try: # new in version post-CSDM13 + outstr += ' identifier : %s\n' % (self.identifier or ukw) + outstr += ' cell type : %s\n' % (self.cell_type or ukw) + outstr += ' restriction enzyme: %s\n' % (self.enzyme or ukw) + for desc in self.description: + outstr += ' %-18s: %s\n' % (desc, self.description[desc]) + except AttributeError: + pass + return outstr + + + def __add__(self, other, silent=False): + """ + sum Hi-C data of experiments into a new one. + """ + reso1, reso2 = self.resolution, other.resolution + if self.resolution == other.resolution: + resolution = self.resolution + changed_reso = False + else: + resolution = max(reso1, reso2) + self.set_resolution(resolution) + other.set_resolution(resolution) + if not silent: + stderr.write('WARNING: experiments of different resolution, ' + + 'setting both resolution of %s, and normalizing ' + + 'at this resolution\n' % (resolution)) + norm1 = copy(self.norm) + norm2 = copy(other.norm) + if self._normalization: + self.normalize_hic() + if other._normalization: + other.normalize_hic() + changed_reso = True + if self.hic_data: + new_hicdata = HiC_data([], size=self.size) + for i in self.hic_data[0]: + new_hicdata[i] = self.hic_data[0].get(i) + for i in other.hic_data[0]: + new_hicdata[i] += other.hic_data[0].get(i) + else: + new_hicdata = None + xpr = Experiment(name='%s+%s' % (self.name, other.name), + resolution=resolution, + hic_data=new_hicdata, no_warn=True) + # check if both experiments are normalized with the same method + # and sum both normalized data + if self._normalization != None and other._normalization != None: + if (self._normalization.split('_factor:')[0] == + other._normalization.split('_factor:')[0]): + xpr.norm = [HiC_data([], size=self.size)] + for i in self.norm[0]: + xpr.norm[0][i] = self.norm[0].get(i) + for i in other.norm[0]: + xpr.norm[0][i] += other.norm[0].get(i) + # The final value of the factor should be the sum of each + try: + xpr._normalization = ( + self._normalization.split('_factor:')[0] + + '_factor:' + + str(int(self._normalization.split('_factor:')[1]) + + int(other._normalization.split('_factor:')[1]))) + except IndexError: # no factor there + xpr._normalization = (self._normalization) + elif self.norm or other.norm: + try: + if (self.norm[0] or other.norm[0]) != {}: + if not silent: + raise Exception('ERROR: normalization differs between' + + ' each experiment\n') + else: + if not silent: + stderr.write('WARNING: experiments should be ' + + 'normalized before being summed\n') + except TypeError: + if not silent: + stderr.write('WARNING: experiments should be normalized ' + + 'before being summed\n') + else: + if not silent: + stderr.write('WARNING: experiments should be normalized ' + + 'before being summed\n') + if changed_reso: + self.set_resolution(reso1) + self.norm = norm1 + other.set_resolution(reso2) + other.norm = norm2 + xpr.crm = self.crm + if not xpr.size: + xpr.size = len(xpr.norm[0]) + + def __merge(own, fgn): + "internal function to merge descriptions" + if own == fgn: + return own + return '%s+%s' % (own , fgn) + + xpr.identifier = __merge(self.identifier , other.identifier ) + xpr.cell_type = __merge(self.cell_type , other.cell_type ) + xpr.enzyme = __merge(self.enzyme , other.enzyme ) + xpr.description = __merge(self.description, other.description) + xpr.exp_type = __merge(self.exp_type , other.exp_type ) + + for des in self.description: + if not des in other.description: + continue + xpr.description[des] = __merge(self.description[des], + other.description[des]) + return xpr + + + def __div__(self, other, silent=False): + """ + sum Hi-C data of experiments into a new one. + """ + reso1, reso2 = self.resolution, other.resolution + if self.resolution == other.resolution: + resolution = self.resolution + changed_reso = False + else: + resolution = max(reso1, reso2) + self.set_resolution(resolution) + other.set_resolution(resolution) + if not silent: + stderr.write('WARNING: experiments of different resolution, ' + + 'setting both resolution of %s, and normalizing ' + + 'at this resolution\n' % (resolution)) + norm1 = copy(self.norm) + norm2 = copy(other.norm) + if self._normalization: + self.normalize_hic() + if other._normalization: + other.normalize_hic() + changed_reso = True + if self.hic_data: + new_hicdata = HiC_data([], size=self.size) + for i in self.hic_data[0]: + new_hicdata[i] = self.hic_data[0].get(i) + for i in other.hic_data[0]: + try: + new_hicdata[i] /= other.hic_data[0].get(i) + except ZeroDivisionError: + new_hicdata[i] = float('NaN') + else: + new_hicdata = None + xpr = Experiment(name='%s/%s' % (self.name, other.name), + resolution=resolution, + hic_data=new_hicdata, no_warn=True) + # check if both experiments are normalized with the same method + # and sum both normalized data + if self._normalization != None and other._normalization != None: + if (self._normalization.split('_factor:')[0] == + other._normalization.split('_factor:')[0]): + xpr.norm = [HiC_data([], size=self.size)] + for i in self.norm[0]: + xpr.norm[0][i] = self.norm[0].get(i) + for i in other.norm[0]: + try: + xpr.norm[0][i] /= other.norm[0].get(i) + except ZeroDivisionError: + xpr.norm[0][i] = float('NaN') + # The final value of the factor should be the same of each + try: + xpr._normalization = ( + self._normalization.split('_factor:')[0] + + '_factor:' + + str(int(self._normalization.split('_factor:')[1]) + + int(other._normalization.split('_factor:')[1]))) / 2 + except IndexError: # no factor there + xpr._normalization = (self._normalization) + elif self.norm or other.norm: + try: + if (self.norm[0] or other.norm[0]) != {}: + if not silent: + raise Exception('ERROR: normalization differs between' + + ' each experiment\n') + except TypeError: + pass + if changed_reso: + self.set_resolution(reso1) + self.norm = norm1 + other.set_resolution(reso2) + other.norm = norm2 + xpr.crm = self.crm + if not xpr.size: + xpr.size = len(xpr.norm[0]) + + + + def __merge(own, fgn): + "internal function to merge descriptions" + if own == fgn: + return own + return '%s+%s' % (own , fgn) + + xpr.identifier = __merge(self.identifier , other.identifier ) + xpr.cell_type = __merge(self.cell_type , other.cell_type ) + xpr.enzyme = __merge(self.enzyme , other.enzyme ) + xpr.description = __merge(self.description, other.description) + xpr.exp_type = __merge(self.exp_type , other.exp_type ) + + for des in self.description: + if not des in other.description: + continue + xpr.description[des] = __merge(self.description[des], + other.description[des]) + return xpr + + + + def set_resolution(self, resolution, keep_original=True): + """ + Set a new value for the resolution. Copy the original data into + Experiment._ori_hic and replace the Experiment.hic_data + with the data corresponding to new data + (:func:`tadphys.Chromosome.compare_condition`). + + :param resolution: an integer representing the resolution. This number + must be a multiple of the original resolution, and higher than it + :param True keep_original: either to keep or not the original data + + """ + if resolution < self._ori_resolution: + raise Exception('New resolution might be higher than original.') + if resolution % self._ori_resolution: + raise Exception('New resolution might be a multiple original.\n' + + ' otherwise it is too complicated for me :P') + if resolution == self.resolution: + return + # if we want to go back to original resolution + if resolution == self._ori_resolution: + self.hic_data = self._ori_hic + self.norm = self._ori_norm + self.size = self._ori_size + self.resolution = self._ori_resolution + return + # if current resolution is the original one + if self.resolution == self._ori_resolution: + if self.hic_data: + self._ori_hic = copy(self.hic_data) + if self.norm: + self._ori_norm = self.norm[:] + # change the factor value in normalization description + try: + self._normalization = ( + self._normalization.split('_factor:')[0] + + '_factor:'+ + str(int(self._normalization.split('factor:')[1]) + * (resolution / self.resolution))) + except IndexError: # no factor there + pass + self.resolution = resolution + fact = self.resolution / self._ori_resolution + # super for! + try: + size = len(self._ori_hic[0]) + except TypeError: + size = len(self._ori_norm[0]) + self.size = size / fact + rest = size % fact + if rest: + self.size += 1 + self.hic_data = [HiC_data([], size / fact + (1 if rest else 0))] + self.norm = [HiC_data([], size / fact + (1 if rest else 0))] + def resize(mtrx, copee): + "resize both hic_data and normalized data" + for i in xrange(0, size, fact): + for j in xrange(0, size, fact): + val = 0 + for k in xrange(fact): + if i + k >= size: + break + for l in xrange(fact): + if j + l >= size: + break + val += copee[(i + k) * size + j + l] + if val: + mtrx[i/fact * self.size + j/fact] = val + try: + resize(self.hic_data[0], self._ori_hic[0]) + except TypeError: + pass + try: + resize(self.norm[0], self._ori_norm[0]) + except TypeError: + pass + # we need to recalculate zeros: + if self._filtered_cols: + stderr.write('WARNING: definition of filtered columns lost at ' + + 'this resolution\n') + self._filtered_cols = False + if not keep_original: + del(self._ori_hic) + del(self._ori_norm) + + + def filter_columns(self, silent=False, draw_hist=False, savefig=None, + diagonal=True, perc_zero=90, auto=True, min_count=None, + index=0): + """ + Call filtering function, to remove artifactual columns in a given Hi-C + matrix. This function will detect columns with very low interaction + counts; columns passing through a cell with no interaction in the + diagonal; and columns with NaN values (in this case NaN will be replaced + by zero in the original Hi-C data matrix). Filtered out columns will be + stored in the dictionary Experiment._zeros. + + :param False silent: does not warn for removed columns + :param False draw_hist: shows the distribution of mean values by column + the polynomial fit, and the cut applied. + :param None savefig: path to a file where to save the image generated; + if None, the image will be shown using matplotlib GUI (the extension + of the file name will determine the desired format). + :param True diagonal: remove row/columns with zero in the diagonal + :param 90 perc_zero: maximum percentage of cells with no interactions + allowed. + :param None min_count: minimum number of reads mapped to a bin (recommended + value could be 2500). If set this option overrides the perc_zero + filtering... This option is slightly slower. + :param True auto: if False, only filters based on the given percentage + zeros + :param 0 index: hic_data index to normalize + + """ + try: + data = self.hic_data[index] + ssize = self.hic_data[index]['size'] + except: + data = self.norm[index] + ssize = self.norm[index]['size'] + diagonal = True + self._zeros[index], has_nans = hic_filtering_for_modelling( + data, silent=silent, draw_hist=draw_hist, savefig=savefig, + diagonal=diagonal, perc_zero=perc_zero, auto=auto, + min_count=min_count) + if has_nans: # to make it simple + size2 = ssize**2 + for i in xrange(ssize): + if repr(self.hic_data[index].get(i, 0)) == 'nan': + del(self.hic_data[index][i]) + # Also remove columns where there is no data in the diagonal + # size = self.size + # else: + # self._zeros.update(dict([(i, None) for i in xrange(size) + # if not self.norm[0][i * size + i]])) + self._filtered_cols = True + + + def load_hic_data(self, hic_data, parser=None, wanted_resolution=None, + data_resolution=None, silent=False, **kwargs): + """ + Add a Hi-C experiment to the Chromosome object. + + :param None hic_data: whether a file or a list of lists corresponding to + the Hi-C data + :param name: name of the experiment + :param False force: overwrite the experiments loaded under the same + name + :param None parser: a parser function that returns a tuple of lists + representing the data matrix and the length of a row/column. + With the file example.tsv: + + :: + + chrT_001 chrT_002 chrT_003 chrT_004 + chrT_001 629 164 88 105 + chrT_002 86 612 175 110 + chrT_003 159 216 437 105 + chrT_004 100 111 146 278 + + the output of parser('example.tsv') would be: + ``[([629, 86, 159, 100, 164, 612, 216, 111, 88, 175, 437, 146, 105, + 110, 105, 278]), 4]`` + :param None resolution: resolution of the experiment in the file; it + will be adjusted to the resolution of the experiment. By default the + file is expected to contain a Hi-C experiment with the same resolution + as the :class:`tadphys.Experiment` created, and no change is made + :param True filter_columns: filter the columns with unexpectedly high + content of low values + :param False silent: does not warn for removed columns + + """ + self.hic_data = read_matrix(hic_data, parser=parser, one=False) + self._ori_size = self.size = self.hic_data[0]['size'] + self._ori_resolution = self.resolution = (data_resolution or + self._ori_resolution) + wanted_resolution = wanted_resolution or self.resolution + self.set_resolution(wanted_resolution, keep_original=False) + self._zeros = [] + for nmatrix in xrange(len(self.hic_data)): + ssize = self.hic_data[nmatrix]['size'] + self._zeros.append({}) + for index in xrange(ssize): + if self.hic_data[nmatrix][index].bads: + self._zeros[nmatrix][index] = self.hic_data[nmatrix][index].bads + self._filtered_cols = True + + def load_norm_data(self, norm_data, parser=None, resolution=None, + normalization='visibility', **kwargs): + """ + Add a normalized Hi-C experiment to the Chromosome object. + + :param None norm_data: whether a file or a list of lists corresponding to + the normalized Hi-C data + :param name: name of the experiment + :param False force: overwrite the experiments loaded under the same + name + :param None parser: a parser function that returns a tuple of lists + representing the data matrix and the length of a row/column. + With the file example.tsv: + + :: + + chrT_001 chrT_002 chrT_003 chrT_004 + chrT_001 12.5 164 8.8 0.5 + chrT_002 8.6 61.2 1.5 1.1 + chrT_003 15.9 21.6 3.7 0.5 + chrT_004 0.0 1.1 1.6 2.8 + + :param None resolution: resolution of the experiment in the file; it + will be adjusted to the resolution of the experiment. By default the + file is expected to contain a Hi-C experiment with the same resolution + as the :class:`tadphys.Experiment` created, and no change is made + :param True filter_columns: filter the columns with unexpectedly high + content of low values + :param False silent: does not warn for removed columns + + """ + self.norm = read_matrix(norm_data, parser=parser, hic=False, one=False) + self._ori_size = self.size = self.norm[0]['size'] + self._ori_resolution = self.resolution = resolution or self._ori_resolution + if not self._zeros: # in case we do not have original Hi-C data + self._zeros = [] + for nmatrix in xrange(len(self.norm)): + ssize = self.norm[nmatrix]['size'] + self._zeros.append({}) + for i in xrange(ssize): + if all([isnan(j) for j in + [self.norm[nmatrix]['matrix'].get(k, float('NaN')) for k in + xrange(i * ssize, + i * ssize + ssize)]]): + self._zeros[nmatrix][i] = None + # remove NaNs, we do not need them as we have zeroes + for nmatrix in xrange(len(self.norm)): + for i in self.norm[nmatrix]['matrix'].keys(): + if isnan(self.norm[nmatrix]['matrix'][i]): + del(self.norm[nmatrix]['matrix'][i]) + self._normalization = normalization + + # this part remains to be fixed, since i dont understand its use + # ALERT + # ALERT ###################################################################################### + # for nmatrix in xrange(len(self.norm)): + # for index in xrange(len(self.norm[nmatrix]['matrix'])): + # print 'la' + # if self.norm[nmatrix]['matrix'][index].bads: + # self._zeros[nmatrix]['matrix'][index] = self.norm[nmatrix]['matrix'][index].bads + # self._filtered_cols = True + + + # def load_tad_def(self, tad_def, index=0, weights=None): + # """ + # Add the Topologically Associated Domains definition detection to Slice + + # :param None tad_def: a file or a dict with pre-computed TADs for this + # experiment + # :param None name: name of the experiment, if None f_name will be used + # :param 0 index: hic_data index to use + # :param None weights: Store information about the weights, corresponding + # to the normalization of the Hi-C data (see TADbit function + # documentation) + + # """ + # tads, norm = parse_tads(tad_def) + # last = max(tads.keys()) + # if not self.size: + # self.size = tads[last]['end'] + # self.tads = tads + # if not self.norm: + # self.norm = weights or norm + # if self.norm: + # self._normalization = 'visibility' + # if self._normalization: + # norms = self.norm[index] + # elif self.hic_data: + # norms = self.hic_data[index] + # else: + # warn("WARNING: raw Hi-C data not available, " + + # "TAD's height fixed to 1") + # norms = None + # diags = [] + # siz = self.size + # sp1 = siz + 1 + # zeros = self._zeros[index] or {} + # if norms: + # for k in xrange(1, siz): + # s_k = siz * k + # diags.append(sum([norms[i * sp1 + s_k] + # if not (i in zeros + # or (i + k) in zeros) else 1. # 1 is the mean + # for i in xrange(siz - k)]) / (siz - k)) + # for tad in tads: + # start, end = (int(tads[tad]['start']) + 1, + # int(tads[tad]['end']) + 1) + # if norms: + # matrix = sum([norms[i + siz * j] + # if not (i in zeros + # or j in zeros) else 1. + # for i in xrange(start - 1, end - 1) + # for j in xrange(i + 1, end - 1)]) + # try: + # if norms: + # height = float(matrix) / sum( + # [diags[i-1] * (end - start - i) + # for i in xrange(1, end - start)]) + # else: + # height = tads[tad].get('height', 1.0) + # except ZeroDivisionError: + # height = 0. + # tads[tad]['height'] = height + + + # def normalize_hic(self, factor=1, iterations=0, max_dev=0.1, silent=False, + # rowsums=None, index=0): + # """ + # Normalize the Hi-C data. This normalization step does the same of + # the :func:`tadphys.tadbit.tadbit` function (default parameters), + + # It fills the Experiment.norm variable with the Hi-C values divided by + # the calculated weight. + + # The weight of a given cell in column i and row j corresponds to the + # square root of the product of the sum of column i by the sum of row + # j. + + # normalization is done according to this formula: + + # .. math:: + + # weight_{(I,J)} = \\frac{\\sum^N_{j=0}\\sum^N_{i=0}(matrix(i,j))} + # {\\sum^N_{i=0}(matrix(i,J)) \\times \\sum^N_{j=0}(matrix(I,j))} + + # with N being the number or rows/columns of the Hi-C matrix in both + # cases. + + # :param 1 factor: final mean number of normalized interactions wanted + # per cell + # :param False silent: does not warn when overwriting weights + # :param None rowsums: input a list of rowsums calculated elsewhere + # :param 0 index: hic_data index to normalize + # """ + + # if not self.hic_data or len(self.hic_data) <= index: + # raise Exception('ERROR: No Hi-C data loaded\n') + # if self.norm and len(self.norm) > index and not silent: + # stderr.write('WARNING: removing previous weights\n') + # size = self.size + # self.bias = iterative(self.hic_data[index], iterations=iterations, + # max_dev=max_dev, bads=self._zeros[index], + # verbose=not silent) + # norm = HiC_data([(i + j * size, float(self.hic_data[index][i, j]) / + # self.bias[i] / + # self.bias[j] * size) + # for i in self.bias for j in self.bias], size) + # if not self.norm: + # self.norm = [norm] + # elif len(self.norm) > index: + # self.norm[index] = norm + # else: + # self.norm.append(norm) + + # # no need to use lists, tuples use less memory + # if factor: + # self._normalization = 'visibility_factor:' + str(factor) + # factor = sum(self.norm[0].values()) / (self.size * self.size * factor) + # for n in self.norm[0]: + # self.norm[0][n] = self.norm[0][n] / factor + # else: + # self._normalization = 'visibility' + + + def get_hic_zscores(self, normalized=True, zscored=True, remove_zeros=True, index=0): + """ + Normalize the Hi-C raw data. The result will be stored into + the private Experiment._zscore list. + + :param True normalized: whether to normalize the result using the + weights (see :func:`normalize_hic`) + :param True zscored: calculate the z-score of the data + :param False remove_zeros: remove null interactions. Dangerous, null + interaction are informative. + :param 0 index: hic_data index or norm index from where to produce the zscores + + """ + values = {} + zeros = {} + if not normalized and (not self.hic_data or len(self.hic_data) <= index): + raise Exception('ERROR: No Hi-C data loaded\n') + if normalized and (not self.norm or len(self.norm) <= index): + raise Exception('ERROR: No normalized data loaded\n') + zscores = {} + if normalized: + ssize = self.size + for i in xrange(self.size): + # zeros are rows or columns having a zero in the diagonal + if i in self._zeros: + continue + for j in xrange(i + 1, ssize): + if j in self._zeros: + continue + if (not self.norm[index]['matrix'].get(i * ssize + j, 0) + and remove_zeros): + zeros[(i, j)] = None + continue + values[(i, j)] = self.norm[index]['matrix'].get(i * ssize + j, 0) + else: + ssize = self.size + for i in xrange(ssize): + if i in self._zeros[index]: + continue + for j in xrange(i + 1, ssize): + if j in self._zeros[index]: + continue + values[(i, j)] = self.hic_data[index]['matrix'].get(i * ssize + j, 0) + # compute Z-score + if zscored: + zscore(values) + for i in xrange(ssize): + if i in self._zeros: + continue + for j in xrange(i + 1, ssize): + if j in self._zeros: + continue + if (i, j) in zeros and remove_zeros: + continue + zscores.setdefault(str(i), {}) + zscores[str(i)][str(j)] = values[(i, j)] + + if len(self._zscores) > index: + self._zscores[index] = zscores + else: + self._zscores.append(zscores) + + def model_region(self, start=1, end=None, n_models=5000, n_keep=1000, + n_cpus=1, verbose=0, keep_all=False, close_bins=1, + outfile=None, config=CONFIG, container=None, + tool='imp',tmp_folder=None,timeout_job=10800, + stages=0, initial_conformation=None, connectivity="FENE", + timesteps_per_k=10000, kfactor=1, adaptation_step=False, + cleanup=True, single_particle_restraints=None, use_HiC=True, + start_seed=1, hide_log=True, remove_rstrn=[], + keep_restart_out_dir=None, + restart_path=False, store_n_steps=10, + useColvars=False): + """ + Generates of three-dimensional models using IMP, for a given segment of + chromosome. + + :param 1 start: first bin to model (bin number) + :param None end: last bin to model (bin number). By default goes to the + last bin. + :param 5000 n_models: number of modes to generate + :param 1000 n_keep: number of models used in the final analysis + (usually the top 20% of the generated models). The models are ranked + according to their objective function value (the lower the better) + :param False keep_all: whether or not to keep the discarded models (if + True, models will be stored under tructuralModels.bad_models) + :param 1 close_bins: number of particles away (i.e. the bin number + difference) a particle pair must be in order to be considered as + neighbors (e.g. 1 means consecutive particles) + :param n_cpus: number of CPUs to use + :param 0 verbose: the information printed can be: nothing (0), the + objective function value the selected models (1), the objective + function value of all the models (2), all the modeling + information (3) + :param None container: restrains particle to be within a given object. Can + only be a 'cylinder', which is, in fact a cylinder of a given height to + which are added hemispherical ends. This cylinder is defined by a radius, + its height (with a height of 0 the cylinder becomes a sphere) and the + force applied to the restraint. E.g. for modeling E. coli genome (2 + micrometers length and 0.5 micrometer of width), these values could be + used: ['cylinder', 250, 1500, 50], and for a typical mammalian nuclei + (6 micrometers diameter): ['cylinder', 3000, 0, 50] + :param CONFIG config: a dictionary containing the standard + parameters used to generate the models. The dictionary should + contain the keys kforce, maxdist, upfreq and lowfreq. + Examples can be seen by doing: + + :: + + from tadphys.imp.CONFIG import CONFIG + + where CONFIG is a dictionarry of dictionnaries to be passed to this + function: + + :: + + CONFIG = { + # use these paramaters with the Hi-C data from: + 'reference' : 'victor corces dataset 2013', + + # Force applied to the restraints inferred to neighbor particles + 'kforce' : 5, + + # Maximum experimental contact distance + 'maxdist' : 600, # OPTIMIZATION: 500-1200 + + # Minimum and maximum thresholds used to decide which experimental values have to be + # included in the computation of restraints. Z-score values bigger than upfreq + # and less that lowfreq will be include, whereas all the others will be rejected + 'upfreq' : 0.3, # OPTIMIZATION: min/max Z-score + + 'lowfreq' : -0.7 # OPTIMIZATION: min/max Z-score + + # How much space (radius in nm) ocupies a nucleotide + 'scale' : 0.005 + } + :param imp tool: use imp for montecarlo simulated annealing or lammps for + molecular dynamics + :param None tmp_folder: for lammps simulation, path to a temporary file + created during the clustering computation. Default will be created + in /tmp/ folder + :param 10800 timeout_job: maximum seconds a job can run in the multiprocessing + of lammps before is killed + :param 0 stages: index of the hic_data/norm data to model. For lammps a list of + indexes is allowed to perform dynamics between stages + :param tadbit initial_conformation: initial structure for lammps dynamics. + 'tadbit' to compute the initial conformation with montecarlo simulated annealing + 'random' to compute the initial conformation as a 3D random walk + {[x],[y],[z]} a dictionary containing lists with x,y,x positions, + e.g an IMPModel or LAMMPSModel object + :param True hide_log: do not generate lammps log information + :param FENE connectivity: use FENE for a fene bond or harmonic for harmonic + potential for neighbours + :param True cleanup: delete lammps folder after completion + :param [] remove_rstrn: list of particles which must not have restrains + :param None keep_restart_out_dir: path to write files to restore LAMMPs + session (binary) + :param False restart_path: path to files to restore LAMMPs session (binary) + :param 10 store_n_steps: Integer with number of steps to be saved if + restart_file != False + :param False useColvars: True if you want the restrains to be loaded by colvars + + :returns: a :class:`tadphys.imp.structuralmodels.StructuralModels` object. + + """ + if isinstance(stages, list) and tool == 'imp': + stderr.write('ERROR: tool imp does not allow dynamics\n') + return + if not self._normalization: + stderr.write('WARNING: not normalized data, should run ' + + 'Experiment.normalize_hic()\n') + if not end: + end = self.size + zscores, values, zeros = self._sub_experiment_zscore(start, end, stages) + if self.hic_data and self.hic_data[0].chromosomes: + coords = [] + tot = 0 + chrs = [] + chrom_offset_start = 1 + chrom_offset_end = 0 + for k, v in self.hic_data[0].chromosomes.iteritems(): + tot += v + if start > tot: + chrom_offset_start = start - tot + if end <= tot: + chrom_offset_end = tot - end + chrs.append(k) + break + if start < tot and end >= tot: + chrs.append(k) + + for k in chrs: + coords.append({'crm' : k, + 'start': 1, + 'end' : self.hic_data[0].chromosomes[k]}) + coords[0]['start'] = chrom_offset_start + coords[-1]['end'] -= chrom_offset_end + + else: + coords = {'crm' : self.crm.name, + 'start': start, + 'end' : end} + zeros = [tuple([i not in zeros_stg for i in xrange(end - start + 1)]) for zeros_stg in zeros] + nloci = end - start + 1 + if verbose: + stderr.write('Preparing to model %s particles\n' % nloci) + if tool=='lammps': + return generate_lammps_models(zscores, self.resolution, nloci, + values=values, n_models=n_models, + outfile=outfile, n_keep=n_keep, n_cpus=n_cpus, + verbose=verbose, first=0, + close_bins=close_bins, config=config, container=container, + coords=coords, zeros=zeros, + tmp_folder=tmp_folder,timeout_job=timeout_job, + initial_conformation='tadbit' if not initial_conformation \ + else initial_conformation, + connectivity=connectivity, + timesteps_per_k=timesteps_per_k, kfactor=kfactor, + adaptation_step=adaptation_step, cleanup=cleanup, + hide_log=hide_log, initial_seed=start_seed, + remove_rstrn=remove_rstrn, restart_path=restart_path, + keep_restart_out_dir=keep_restart_out_dir, + store_n_steps=store_n_steps, + useColvars=useColvars + ) + + + def optimal_imp_parameters(self, start=1, end=None, n_models=500, n_keep=100, + n_cpus=1, upfreq_range=(0, 1, 0.1), close_bins=1, + kbending_range=0.0, + lowfreq_range=(-1, 0, 0.1), + scale_range=[0.01][:], + maxdist_range=(400, 1400, 100), + dcutoff_range=[2][:], + outfile=None, verbose=True, corr='spearman', + off_diag=1, savedata=None, + container=None): + """ + Find the optimal set of parameters to be used for the 3D modeling in + IMP. + + :param 1 start: first bin to model (bin number) + :param None end: last bin to model (bin number). By default goes to the + last bin. + :param 500 n_models: number of modes to generate + :param 100 n_keep: number of models used in the final analysis (usually + the top 20% of the generated models). The models are ranked + according to their objective function value (the lower the better) + :param 1 close_bins: number of particles away (i.e. the bin number + difference) a particle pair must be in order to be considered as + neighbors (e.g. 1 means consecutive particles) + :param n_cpus: number of CPUs to use + :param False verbose: if set to True, information about the distance, + force and Z-score between particles will be printed + :param (-1,0,0.1) lowfreq_range: range of lowfreq values to be + optimized. The last value of the input tuple is the incremental step + for the lowfreq values + :param (0,1,0.1,0.1) upfreq_range: range of upfreq values to be + optimized. The last value of the input tuple is the incremental step + for the upfreq values + :param (400,1400,100) maxdist_range: upper and lower bounds used to + search for the optimal maximum experimental distance. The last value + of the input tuple is the incremental step for maxdist values + :param [0.01] scale_range: upper and lower bounds used to search for + the optimal scale parameter (nm per nucleotide). The last value of + the input tuple is the incremental step for scale parameter values + :param [2] dcutoff_range: upper and lower bounds used to search for + the optimal distance cutoff parameter (distance, in number of beads, + from which to consider 2 beads as being close). The last value of the + input tuple is the incremental step for scale parameter values + :param None cutoff: distance cutoff (nm) to define whether two particles + are in contact or not, default is 2 times resolution, times scale. + :param None container: restrains particle to be within a given object. Can + only be a 'cylinder', which is, in fact a cylinder of a given height to + which are added hemispherical ends. This cylinder is defined by a radius, + its height (with a height of 0 the cylinder becomes a sphere) and the + force applied to the restraint. E.g. for modeling E. coli genome (2 + micrometers length and 0.5 micrometer of width), these values could be + used: ['cylinder', 250, 1500, 50], and for a typical mammalian nuclei + (6 micrometers diameter): ['cylinder', 3000, 0, 50] + :param True verbose: print the results to the standard output + + .. note:: + + Each of the *_range* parameters accept tuples in the form + *(start, end, step)*, or a list with the list of values to test. + + E.g.: + * scale_range=[0.001, 0.005, 0.006] will test these three values. + * scale_range=(0.001, 0.005, 0.001) will test the values 0.001, + 0.002, 0.003, 0.004 and 0.005 + + + :returns: an :class:`tadphys.imp.impoptimizer.IMPoptimizer` object + + """ + if not self._normalization: + stderr.write('WARNING: not normalized data, should run ' + + 'Experiment.normalize_hic()\n') + if not end: + end = self.size + optimizer = IMPoptimizer(self, start, end, n_keep=n_keep, + n_models=n_models, close_bins=close_bins, + container=container) + optimizer.run_grid_search(maxdist_range=maxdist_range, + kbending_range=kbending_range, + upfreq_range=upfreq_range, + lowfreq_range=lowfreq_range, + scale_range=scale_range, + dcutoff_range=dcutoff_range, corr=corr, + n_cpus=n_cpus, verbose=verbose, + off_diag=off_diag, savedata=savedata) + + if outfile: + optimizer.write_result(outfile) + + return optimizer + + + def _sub_experiment_zscore(self, start, end, index=0): + """ + Get the z-score of a sub-region of an experiment. + + TODO: find a nicer way to do this... + + :param start: first bin to model (bin number) + :param end: first bin to model (bin number) + :param 0 index: hic_data index or norm index from where to compute + the zscores. A list is allowed to compute several zscores at the + same time + + :returns: z-score, raw values and zeros of the experiment + """ + if isinstance(index, list): + idx = index + else: + idx = [index] + if not self._normalization or not self._normalization.startswith('visibility'): + stderr.write('WARNING: normalizing according to visibility method\n') + for i in idx: + self.normalize_hic(index=i) + from tadphys import Chromosome + if start < 1: + raise ValueError('ERROR: start should be higher than 0\n') + start -= 1 # things starts at 0 for python. we keep the end coordinate + # at its original value because it is inclusive + siz = self.size + tmp = Chromosome('tmp') + tmp.add_experiment('exp1', resolution=self.resolution, filter_columns=False) + exp = tmp.experiments[0] + tmp_matrix = [] + exp.norm = [] + try: + for id in idx: + matrix = self.get_hic_matrix(index=id) + new_matrix = [[matrix[i][j] for i in xrange(start, end)] + for j in xrange(start, end)] + tmp_matrix.append(new_matrix) + # We want the weights and zeros calculated in the full chromosome + exp.norm.append([self.norm[id][i + siz * j] for i in xrange(start, end) + for j in xrange(start, end)]) + exp.load_hic_data(hic_data=tmp_matrix) + except TypeError: # no Hi-C data provided + for id in idx: + matrix = self.get_hic_matrix(normalized=True,index=id) + new_matrix = [[matrix[i][j] for i in xrange(start, end)] + for j in xrange(start, end)] + tmp_matrix.append(new_matrix) + exp.load_norm_data(norm_data=tmp_matrix) + + # ... but the z-scores in this particular region + vals = [] + exp._zeros = [] + for id in idx: + exp._zeros += [dict([(z - start, None) for z in self._zeros[id] + if start <= z <= end - 1])] + if len(exp._zeros[-1]) == (end - start): + raise Exception('ERROR: no interaction found in selected regions') + exp.get_hic_zscores(index=id) + values = [[float('nan') for _ in xrange(exp.size)] + for _ in xrange(exp.size)] + + for i in xrange(exp.size): + # zeros are rows or columns having a zero in the diagonal + if i in exp._zeros[-1]: + continue + for j in xrange(i + 1, exp.size): + if j in exp._zeros[-1]: + continue + if (not exp.norm[id]['matrix'].get(i * exp.size + j, 0) + or not exp.norm[id]['matrix'].get(i * exp.size + j, 0)): + continue + values[i][j] = exp.norm[id]['matrix'][i * exp.size + j] + values[j][i] = exp.norm[id]['matrix'][i * exp.size + j] + vals.append(values) + return exp._zscores, vals, exp._zeros + + + def write_interaction_pairs(self, fname, normalized=True, zscored=True, + diagonal=False, cutoff=None, header=False, + true_position=False, uniq=True, + remove_zeros=False, focus=None, format='tsv', + index=0): + """ + Creates a tab separated file with all the pairwise interactions. + + :param fname: file name where to write the pairwise interactions + :param True zscored: computes the z-score of the log10(data) + :param True normalized: use the weights to normalize the data + :param None cutoff: if defined, only the zscores above the cutoff will + be writen to the file + :param False uniq: only writes one representent per interacting pair + :param False true_position: if, true writes genomic coordinates, + otherwise, genomic bin. + :param None focus: writes interactions between the start and stop bin + passed to this parameter. + :param 'tsv' format: in which to write the file, can be tab separated + (tsv) or JSON (json) + :param 0 index: hic_data index or norm index + + """ + if (not self._zscores or len(self.norm) < index) and zscored: + self.get_hic_zscores(index=index) + if (not self.norm or len(self.norm) < index) and normalized: + raise Exception('Experiment not normalized.') + # write to file + if isinstance(fname, str): + out = open(fname, 'w') + elif isinstance(fname, file): + out = fname + else: + raise Exception('Not recognize file type\n') + if header: + if format == 'tsv': + out.write('elt1\telt2\t%s\n' % ('zscore' if zscored else + 'normalized hi-c' if normalized + else 'raw hi-c')) + elif format == 'json': + out.write(''' +{ + "metadata": { + "formatVersion" : 3, + %s + "species" : "%s", + "cellType" : "%s", + "experimentType" : "%s", + "identifier" : "%s", + "resolution" : %s, + "chromosome" : "%s", + "start" : %s, + "end" : %s + }, + "interactions": [ + ''' % ('\n'.join(['"%s": "%s",' % (k, self.description[k]) + for k in self.description]), + self.description.get('species', ''), + self.cell_type, + self.exp_type, + self.identifier, + self.resolution, + self.crm.name, + focus[0] * self.resolution if focus else 1, + (focus[1] * self.resolution if focus else + self.resolution * self.size))) + if focus: + start, end = focus[0], focus[1] + 1 + else: + start, end = 0, self.size + for i in xrange(start, end): + if i in self._zeros[index]: + continue + newstart = i if uniq else 0 + for j in xrange(newstart, end): + if j in self._zeros[index]: + continue + if not diagonal and i == j: + continue + if zscored: + try: + if self._zscores[index][str(i)][str(j)] < cutoff: + continue + if self._zscores[index][str(i)][str(j)] == -99: + continue + except KeyError: + continue + val = self._zscores[index][str(i)][str(j)] + elif normalized: + val = self.norm[index][self.size*i+j] + else: + val = self.hic_data[index][self.size*i+j] + if remove_zeros and not val: + continue + if true_position: + if format == 'tsv': + out.write('%s\t%s\t%s\n' % ( + self.resolution * (i + 1), + self.resolution * (j + 1), val)) + elif format == 'json': + out.write('%s,%s,%s,\n' % ( + self.resolution * (i + 1), + self.resolution * (j + 1), val)) + else: + if format == 'tsv': + out.write('%s\t%s\t%s\n' % ( + i + 1 - start, j + 1 - start, val)) + elif format == 'json': + out.write('%s,%s,%s\n' % ( + i + 1 - start, j + 1 - start, val)) + if format == 'json': + out.write(']}\n') + out.close() + + + def get_hic_matrix(self, focus=None, diagonal=True, normalized=False, index=0): + """ + Return the Hi-C matrix. + + :param None focus: if a tuple is passed (start, end), wil return a Hi-C + matrix starting at start, and ending at end (all inclusive). + :param True diagonal: replace the values in the diagonal by one. Used + for the filtering in order to smooth the distribution of mean values + :param False normalized: returns normalized data instead of raw Hi-C + :param 0 index: hic_data index or norm index from where to get the matrix + + :returns: list of lists representing the Hi-C data matrix of the + current experiment + """ + siz = self.size + if normalized: + try: + hic = self.norm[index]['matrix'] + except TypeError: + raise Exception('ERROR: experiment not normalized yet') + else: + hic = self.hic_data[index]['matrix'] + if focus: + start, end = focus + start -= 1 + else: + start = 0 + end = siz + if diagonal: + return [[hic.get(i + siz * j, 0) for i in xrange(start, end)] + for j in xrange(start, end)] + else: + mtrx = [[hic.get(i + siz * j, 0) for i in xrange(start, end)] + for j in xrange(start, end)] + for i in xrange(start, end): + mtrx[i][i] = 1 if mtrx[i][i] else 0 + return mtrx + + + def print_hic_matrix(self, print_it=True, normalized=False, zeros=False, index=0): + """ + Return the Hi-C matrix as string + + :param True print_it: Otherwise, returns the string + :param False normalized: returns normalized data, instead of raw Hi-C + :param False zeros: take into account filtered columns + :param 0 index: hic_data index or norm index from where to print the matrix + :returns: list of lists representing the Hi-C data matrix of the + current experiment + """ + siz = self.size + try: + if normalized: + hic = self.norm[index]['matrix'] + else: + hic = self.hic_data[index]['matrix'] + except TypeError: + raise Exception('ERROR: no hic_data with index ',index) + + if zeros: + out = '\n'.join(['\t'.join( + ['nan' if (i in self._zeros[index] or j in self._zeros[index]) else + str(hic.get(i + siz * j, 0)) for i in xrange(siz)]) + for j in xrange(siz)]) + else: + out = '\n'.join(['\t'.join([str(hic.get(i + siz * j, 0)) + for i in xrange(siz)]) + for j in xrange(siz)]) + if print_it: + print(out) + else: + return out + '\n' + + + # def view(self, tad=None, focus=None, paint_tads=False, axe=None, + # show=True, logarithm=True, normalized=False, relative=True, + # decorate=True, savefig=None, where='both', clim=None, + # cmap='jet', index=0): + # """ + # Visualize the matrix of Hi-C interactions + + # :param None tad: a given TAD in the form: + # :: + + # {'start': start, + # 'end' : end, + # 'brk' : end, + # 'score': score} + + # **Alternatively** a list of the TADs can be passed (all the TADs + # between the first and last one passed will be showed. Thus, passing + # more than two TADs might be superfluous) + # :param None focus: a tuple with the start and end positions of the + # region to visualize + # :param False paint_tads: draw a box around the TADs defined for this + # experiment + # :param None axe: an axe object from matplotlib can be passed in order + # to customize the picture + # :param True show: either to pop-up matplotlib image or not + # :param True logarithm: show the logarithm values + # :param True normalized: show the normalized data (weights might have + # been calculated previously). *Note: white rows/columns may appear in + # the matrix displayed; these rows correspond to filtered rows (see* + # :func:`tadphys.utils.hic_filtering.hic_filtering_for_modelling` *)* + # :param True relative: color scale is relative to the whole matrix of + # data, not only to the region displayed + # :param True decorate: draws color bar, title and axes labels + # :param None savefig: path to a file where to save the image generated; + # if None, the image will be shown using matplotlib GUI (the extension + # of the file name will determine the desired format). + # :param None clim: tuple with minimum and maximum value range for color + # scale. I.e. clim=(-4, 10) + # :param 'jet' cmap: color map from matplotlib. Can also be a + # preconfigured cmap object. + # :param 0 index: hic_data index or norm index + # """ + # if logarithm==True: + # fun = log2 + # elif logarithm: + # fun = logarithm + # else: + # fun = lambda x: x + # size = self.size + # if normalized and not self.norm: + # raise Exception('ERROR: weights not calculated for this ' + + # 'experiment. Run Experiment.normalize_hic\n') + # if tad and focus: + # raise Exception('ERROR: only one of "tad" or "focus" might be set') + # start = end = None + # if focus: + # start, end = focus + # if start == 0: + # stderr.write('WARNING: Hi-C matrix starts at 1, setting ' + + # 'starting point to 1.\n') + # start = 1 + # elif isinstance(tad, dict): + # start = int(tad['start']) + # end = int(tad['end']) + # elif isinstance(tad, list): + # if isinstance(tad[0], dict): + # start = int(sorted(tad, + # key=lambda x: int(x['start']))[0 ]['start']) + # end = int(sorted(tad, + # key=lambda x: int(x['end' ]))[-1]['end' ]) + # elif self.tads: + # start = self.tads[min(self.tads)]['start'] + 1 + # end = self.tads[max(self.tads)]['end' ] + 1 + # else: + # start = 1 + # end = size + # try: + # if normalized: + # hic = self.norm[index] + # else: + # hic = self.hic_data[index] + # except TypeError: + # raise Exception('ERROR: no hic_data with index ',index) + + # if relative and not clim: + # if normalized: + # # find minimum, if value is non-zero... for logarithm + # mini = min([i for i in hic.values() if i]) + # if mini == int(mini): + # vmin = min(hic.values()) + # else: + # vmin = mini + # vmin = fun(vmin or (1 if logarithm else 0)) + # vmax = fun(max(hic.values())) + # else: + # vmin = fun(min(hic.values()) or + # (1 if logarithm else 0)) + # vmax = fun(max(hic.values())) + # elif clim: + # vmin, vmax = clim + # if axe is None: + # plt.figure(figsize=(8, 6)) + # axe = plt.subplot(111) + # if tad or focus: + # if start > -1: + # if normalized: + # matrix = [ + # [hic[i+size*j] + # if (not i in self._zeros[index] + # and not j in self._zeros[index]) else float('nan') + # for i in xrange(int(start) - 1, int(end))] + # for j in xrange(int(start) - 1, int(end))] + # else: + # matrix = [ + # [hic[i+size*j] + # for i in xrange(int(start) - 1, int(end))] + # for j in xrange(int(start) - 1, int(end))] + # elif isinstance(tad, list): + # if normalized: + # stderr.write('WARNING: List passed, not going to be ' + + # 'normalized.\n') + # matrix = tad + # else: + # # TODO: something... matrix not declared... + # pass + # else: + # if normalized: + # matrix = [[hic[i+size*j] + # if (not i in self._zeros[index] + # and not j in self._zeros[index]) else float('nan') + # for i in xrange(size)] + # for j in xrange(size)] + # else: + # matrix = [[hic[i+size*j]\ + # for i in xrange(size)] \ + # for j in xrange(size)] + # if where == 'up': + # for i in xrange(int(end - start)): + # for j in xrange(i, int(end - start)): + # matrix[i][j] = vmin + # alphas = array([0, 0] + [1] * 256 + [0]) + # jet._init() + # jet._lut[:, -1] = alphas + # elif where == 'down': + # for i in xrange(int(end - start)): + # for j in xrange(i + 1): + # matrix[i][j] = vmin + # alphas = array([0, 0] + [1] * 256 + [0]) + # jet._init() + # jet._lut[:,-1] = alphas + + # if isinstance(cmap, str): + # cmap = plt.get_cmap(cmap) + # cmap.set_bad('darkgrey', 1) + # if relative: + # img = axe.imshow(nozero_log_matrix(matrix, fun), origin='lower', vmin=vmin, vmax=vmax, + # interpolation="nearest", cmap=cmap, + # extent=(int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5, + # int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5)) + # else: + # img = axe.imshow(nozero_log_matrix(matrix, fun), origin='lower', + # interpolation="nearest", cmap=cmap, + # extent=(int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5, + # int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5)) + # if decorate: + # cbar = axe.figure.colorbar(img) + # cbar.ax.set_ylabel('%sHi-C %sinteraction count' % ( + # 'Log2 ' * (logarithm==True), 'normalized ' * normalized), rotation=-90) + # axe.set_title(('Chromosome %s experiment %s %s') % ( + # self.crm.name, self.name, + # 'focus: %s-%s' % (start, end) if tad else '')) + # axe.set_xlabel('Genomic bin (resolution: %s)' % (self.resolution)) + # if paint_tads: + # axe.set_ylabel('TAD number') + # else: + # axe.set_ylabel('Genomic bin (resolution: %s)' % ( + # self.resolution)) + # if not paint_tads: + # axe.set_ylim(int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5) + # axe.set_xlim(int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5) + # if show: + # plt.show() + # if savefig: + # tadbit_savefig(savefig) + # return img + # pwidth = 1 + # tads = dict([(t, self.tads[t]) for t in self.tads + # if ((int(self.tads[t]['start']) + 1 >= start + # and int(self.tads[t]['end' ]) + 1 <= end) + # or not start)]) + # for i, tad in tads.iteritems(): + # t_start = int(tad['start']) + .5 + # t_end = int(tad['end']) + 1.5 + # nwidth = float(abs(tad['score'])) / 4 + # if where in ['down', 'both']: + # axe.hlines(t_start, t_start, t_end, colors='k', lw=pwidth) + # if where in ['up', 'both']: + # axe.hlines(t_end , t_start, t_end, colors='k', lw=nwidth) + # if where in ['up', 'both']: + # axe.vlines(t_start, t_start, t_end, colors='k', lw=pwidth) + # if where in ['down', 'both']: + # axe.vlines(t_end , t_start, t_end, colors='k', lw=nwidth) + # pwidth = nwidth + # if tad['score'] < 0: + # for j in xrange(0, int(t_end) - int(t_start), 2): + # axe.plot((t_start , t_start + j), + # (t_end - j, t_end ), color='k') + # axe.plot((t_end , t_end - j), + # (t_start + j, t_start ), color='k') + # axe.set_ylim(int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5) + # axe.set_xlim(int(start or 1) - 0.5, + # int(start or 1) + len(matrix) - 0.5) + # if paint_tads: + # ticks = [] + # labels = [] + # for tad, tick in [(t, tads[t]['start'] + (tads[t]['end'] - + # tads[t]['start'] - 1)) + # for t in tads.keys()[::(len(tads)/11 + 1)]]: + # ticks.append(tick) + # labels.append(tad + 1) + # axe.set_yticks(ticks) + # axe.set_yticklabels(labels) + # if show: + # plt.show() + # if savefig: + # tadbit_savefig(savefig) + # return img + + + # def write_tad_borders(self, density=False, savedata=None, normalized=False, index=0): + # """ + # Print a table summarizing the TADs found by tadbit. This function outputs + # something similar to the R function. + + # :param False density: if True, adds a column with the relative + # interaction frequency measured within each TAD (value of 1 means an + # interaction frequency equal to the expectation in the experiment) + # :param None savedata: path to a file where to save the density data + # generated (1 column per step + 1 for particle number). If None, print + # a table. + # :param False normalized: uses normalized data to calculate the density + # :param 0 index: hic_data index or norm index + # """ + # try: + # if normalized and self.norm: + # norms = self.norm[index] + # elif self.hic_data: + # if normalized: + # warn("WARNING: weights not available, using raw data") + # norms = self.hic_data[index] + # else: + # warn("WARNING: raw Hi-C data not available, " + + # "TAD's height fixed to 1") + # norms = None + # except TypeError: + # raise Exception('ERROR: no hic_data with index ',index) + + # zeros = self._zeros[index] or {} + # table = '' + # table += '%s\t%s\t%s\t%s%s\n' % ('#', 'start', 'end', 'score', + # '' if not density else '\tdensity') + # tads = self.tads + # sp1 = self.size + 1 + # diags = [] + # if norms: + # for k in xrange(1, self.size): + # s_k = self.size * k + # diags.append(sum([norms[i * sp1 + s_k] + # if not (i in zeros + # or (i + k) in zeros) else 0. + # for i in xrange( + # self.size - k)]) / (self.size - k)) + # for tad in tads: + # table += '%s\t%s\t%s\t%s%s\n' % ( + # tad, int(tads[tad]['start'] + 1), int(tads[tad]['end'] + 1), + # abs(tads[tad]['score']), '' if not density else + # '\t%s' % (round(float(tads[tad]['height']), 3))) + # if not savedata: + # print table + # return + # if isinstance(savedata, file): + # out = savedata + # else: + # out = open(savedata, 'w') + # out.write(table) + + # def write_json(self, filename, focus=None, normalized=False): + # """ + # Save hic matrix in the json format, read by TADkit. + + # :param filename: location where the file will be written + # :param None focus: if a tuple is passed (start, end), json will contain a Hi-C + # matrix starting at start, and ending at end (all inclusive). + # :para False normalized: use normalized data instead of raw Hi-C + + # """ + # if not self.crm.species: + # warn("WARNING: no species specified in chromosome. TADkit will not be able to interpret the file") + # if not self.crm.name: + # warn("WARNING: no name specified in chromosome. TADkit will not be able to interpret the file") + + # if focus: + # start, end = focus + # size = end-start+1 + # else: + # start = 0 + # end = size = self.size + + # if size > 1200: + # warn("WARNING: this is a very big matrix, consider using focus. TADkit will not be able to render the file") + + # new_hic_data = self.get_hic_matrix(focus=focus, normalized=normalized) + + # chrom_start = [] + # chrom_end = [] + # chrom = [] + # if self.hic_data and self.hic_data[0].chromosomes: + # tot = 0 + # chrs = [] + # chrom_offset_start = start + # chrom_offset_end = 0 + # for k, v in self.hic_data[0].chromosomes.iteritems(): + # tot += v + # if start > tot: + # chrom_offset_start = start - tot + # if end <= tot: + # chrom_offset_end = tot - end + # chrs.append((k,v)) + # break + # if start < tot and end >= tot: + # chrs.append((k,v)) + + # for k, v in chrs: + # chrom.append(k) + # chrom_start.append(0) + # chrom_end.append(v * self.resolution) + # chrom_start[0] = chrom_offset_start * self.resolution + # chrom_end[-1] -= chrom_offset_end * self.resolution + + # else: + # chrom.append(self.crm.name) + # chrom_start.append(start * self.resolution) + # chrom_end.append(end * self.resolution) + + + # descr = {'chromosome' : chrom, + # 'species' : self.crm.species, + # 'resolution' : self.resolution, + # 'chrom_start' : chrom_start, + # 'chrom_end' : chrom_end, + # 'start' : self.resolution, + # 'end' : size * self.resolution} + + # # Fake structural models object to produce json + # sm = StructuralModels(nloci=size, models = [], bad_models = [], experiment=self, resolution=self.resolution, original_data=new_hic_data, description=descr, config={'scale':0.01}) + # sm.write_json(filename=filename) + + # def generate_densities(self): + # """ + # Related to the generation of 3D models. + # In the case of Hi-C data, the density is equal to the number of + # nucleotides in a bin, which is equal to the experiment resolution. + # """ + # dens = {} + # for i in self.size: + # dens[i] = self.resolution + # return dens diff --git a/taddyn/experiment.py b/tadphys/experiment.py~ similarity index 100% rename from taddyn/experiment.py rename to tadphys/experiment.py~ diff --git a/tadphys/hic_data.py b/tadphys/hic_data.py new file mode 100644 index 0000000..e69de29 diff --git a/tadphys/modelling/HIC_CONFIG.py b/tadphys/modelling/HIC_CONFIG.py new file mode 100644 index 0000000..d0485d7 --- /dev/null +++ b/tadphys/modelling/HIC_CONFIG.py @@ -0,0 +1,46 @@ +""" +07 Feb 2013 + + +""" + +# GENERAL +######### + +CONFIG = { + # use these paramaters with the Hi-C data from: + 'reference' : 'example dataset', + + # Force applied to the restraints inferred to neighbor particles + 'kforce' : 5, + + # How much space (in nm) ocupies a nucleotide + 'scale' : 0.01, + + # Strength of the bending interaction + 'kbending' : 0.0, # OPTIMIZATION: + + # Maximum experimental contact distance + 'maxdist' : 600, # OPTIMIZATION: 500-1200 + + # Minimum thresholds used to decide which experimental values have to be + # included in the computation of restraints. Z-score values bigger than upfreq + # and less that lowfreq will be include, whereas all the others will be rejected + 'lowfreq' : -0.7, # OPTIMIZATION: min/max Z-score + + # Maximum thresholds used to decide which experimental values have to be + # included in the computation of restraints. Z-score values bigger than upfreq + # and less that lowfreq will be include, whereas all the others will be rejected + 'upfreq' : 0.3 # OPTIMIZATION: min/max Z-score + + } + + +# MonteCarlo optimizer parameters +################################# +# number of iterations +NROUNDS = 10000 +# number of MonteCarlo steps per round +STEPS = 1 +# number of local steps per round +LSTEPS = 5 diff --git a/tadphys/modelling/LAMMPS_CONFIG.py b/tadphys/modelling/LAMMPS_CONFIG.py new file mode 100644 index 0000000..8af1c60 --- /dev/null +++ b/tadphys/modelling/LAMMPS_CONFIG.py @@ -0,0 +1,100 @@ +""" +25 Oct 2016 + + +""" +############################################################################### +# Parameters to implement Kremer&Grest polymer model # +# Reference paper: # +# K. Kremer and G. S. Grest # +# Dynamics of entangled linear polymer melts: A molecular-dynamics simulation # +# J Chem Phys 92, 5057 (1990) # +############################################################################### + + +# units http://lammps.sandia.gov/doc/units.html +units = "lj" + +# atom_style http://lammps.sandia.gov/doc/atom_style.html +atom_style = "angle" + +# boundary conditions http://lammps.sandia.gov/doc/boundary.html +boundary = "p p p" +#boundary = "f f f" + +# mass http://lammps.sandia.gov/doc/mass.html +mass = "* 1.0" + +# neighbor http://lammps.sandia.gov/doc/neighbor.html +neighbor = "3.0 nsq" # Optional for small and low density systems +#neighbor = "0.3 bin" # Standard choice for large (> 10,000 particles) systems +neigh_modify = "every 1 delay 1 check yes" + +# thermo +run = 100 +thermo = 1000 #int(float(run)/100) +#thermo_style custom step temp epair emol press pxx pyy pzz pxy pxz pyz vol + +# Excluded volume term: Purely repulsive Lennard-Jones or Truncated and Shifted Lennard-Jones +################################################################### +# Lennard-Jones 12-6 potential with cutoff (=truncated): # +# potential E=4epsilon[ (sigma/r)^12 - (sigma/r)^6] for r tot: + chrom_offset_start = start - tot + if end <= tot: + chrom_offset_end = tot - end + chrs.append(k) + break + if start < tot and end >= tot: + chrs.append(k) + + for k in chrs: + self.coords.append({'crm' : k, + 'start': 1, + 'end' : experiment.hic_data[0].chromosomes[k]}) + self.coords[0]['start'] = chrom_offset_start + self.coords[-1]['end'] -= chrom_offset_end + + else: + self.coords = {'crm' : experiment.crm.name, + 'start': start, + 'end' : end} + + self.tool = tool + self.tmp_folder = tmp_folder + self.single_particle_restraints = single_particle_restraints + + # For clarity, the order in which the optimized parameters are managed should be + # always the same: scale, kbending, maxdist, lowfreq, upfreq + self.scale_range = [] + self.kbending_range = [] + self.maxdist_range = [] + self.lowfreq_range = [] + self.upfreq_range = [] + + self.dcutoff_range = [] + + self.container = container + self.results = {} + + + def run_grid_search(self, + scale_range=0.01, + kbending_range=0.0, + maxdist_range=(400, 1500, 100), + lowfreq_range=(-1, 0, 0.1), + upfreq_range=(0, 1, 0.1), + dcutoff_range=None, + corr='spearman', off_diag=1, + savedata=None, n_cpus=1, verbose=True, + use_HiC=True, use_confining_environment=True, + use_excluded_volume=True, kforce=5, + ev_kforce=5, timeout_job=300, + connectivity="FENE", hide_log=True, + kfactor=1, cleanup=False, + initial_conformation=None, + remove_rstrn=[], initial_seed=0, + keep_restart_out_dir=None, + restart_path=False, store_n_steps=10, + useColvars=False): + """ + This function calculates the correlation between the models generated + by IMP and the input data for the four main IMP parameters (scale, + kbending, maxdist, lowfreq and upfreq) in the given ranges of values. + The range can be expressed as a list. + + :param n_cpus: number of CPUs to use + :param 0.01 scale_range: upper and lower bounds used to search for + the optimal scale parameter (unit nm per nucleotide). The last value of + the input tuple is the incremental step for scale parameter values + :param (0,2.0,0.5) kbending_range: values of the bending rigidity + strength to enforce in the models + :param (400,1400,100) maxdist_range: upper and lower bounds + used to search for the optimal maximum experimental distance. + The last value of the input tuple is the incremental step for maxdist + values + :param (-1,0,0.1) lowfreq_range: range of lowfreq values to be + optimized. The last value of the input tuple is the incremental + step for the lowfreq values. To be precise "freq" refers to the + Z-score. + :param (0,1,0.1) upfreq_range: range of upfreq values to be optimized. + The last value of the input tuple is the incremental step for the + upfreq values. To be precise "freq" refers to the Z-score. + :param 2 dcutoff_range: upper and lower bounds used to search for + the optimal distance cutoff parameter (in nm). The last value of the + input tuple is the incremental step for scale parameter values + :param None savedata: concatenate all generated models into a dictionary + and save it into a file named by this argument + :param True verbose: print the results to the standard output + :param True hide_log: do not generate lammps log information + :param FENE connectivity: use FENE for a fene bond or harmonic for harmonic + potential for neighbours + :param 1 kfactor: Factor by which multiply the adjusted (square root) values + of the ZScores before feeding them to LAMMPS. Used to decrease + maximum values bellow 1. E.j.: kfactor=0.1 + :param True cleanup: delete lammps folder after completion + :param tadbit initial_conformation: initial structure for lammps dynamics. + 'tadbit' to compute the initial conformation with montecarlo simulated annealing + 'random' to compute the initial conformation as a 3D random walk + {[x],[y],[z]} a dictionary containing lists with x,y,x positions, + e.g an IMPModel or LAMMPSModel object + :param [] remove_rstrn: list of particles which must not have restrains + :param 0 initial_seed: Initial random seed for modelling. + :param None keep_restart_out_dir: recover stopped computation + :param False restart_path: path to files to restore LAMMPs session (binary) + :param 10 store_n_steps: Integer with number of steps to be saved if + restart_file != False + :param False useColvars: True if you want the restrains to be loaded by colvars + + """ + if verbose: + stderr.write('Optimizing %s particles\n' % self.nloci) + + # These commands transform the ranges defined in input as tuples + # in list of values to use in the grid search of the best parameters + # scale + if isinstance(scale_range, tuple): + scale_step = scale_range[2] + scale_arange = np.arange(scale_range[0], + scale_range[1] + scale_step / 2, + scale_step) + else: + if isinstance(scale_range, (float, int)): + scale_range = [scale_range] + scale_arange = scale_range + # kbending + if isinstance(kbending_range, tuple): + kbending_step = kbending_range[2] + kbending_arange = np.arange(kbending_range[0], + kbending_range[1] + kbending_step / 2, + kbending_step) + else: + if isinstance(kbending_range, (float, int)): + kbending_range = [kbending_range] + kbending_arange = kbending_range + # maxdist + if isinstance(maxdist_range, tuple): + maxdist_step = maxdist_range[2] + maxdist_arange = range(maxdist_range[0], + maxdist_range[1] + maxdist_step, + maxdist_step) + else: + if isinstance(maxdist_range, (float, int)): + maxdist_range = [maxdist_range] + maxdist_arange = maxdist_range + # lowfreq + if isinstance(lowfreq_range, tuple): + lowfreq_step = lowfreq_range[2] + lowfreq_arange = np.arange(lowfreq_range[0], + lowfreq_range[1] + lowfreq_step / 2, + lowfreq_step) + else: + if isinstance(lowfreq_range, (float, int)): + lowfreq_range = [lowfreq_range] + lowfreq_arange = lowfreq_range + # upfreq + if isinstance(upfreq_range, tuple): + upfreq_step = upfreq_range[2] + upfreq_arange = np.arange(upfreq_range[0], + upfreq_range[1] + upfreq_step / 2, + upfreq_step) + else: + if isinstance(upfreq_range, (float, int)): + upfreq_range = [upfreq_range] + upfreq_arange = upfreq_range + # dcutoff + if isinstance(dcutoff_range, tuple): + dcutoff_step = dcutoff_range[2] + dcutoff_arange = np.arange(dcutoff_range[0], + dcutoff_range[1] + dcutoff_step / 2, + dcutoff_step) + else: + if isinstance(dcutoff_range, (float, int)): + dcutoff_range = [dcutoff_range] + dcutoff_arange = dcutoff_range + + # These commands round all the values in the ranges defined as input + # scale + if not self.scale_range: + self.scale_range = [my_round(i) for i in scale_arange ] + else: + self.scale_range = sorted([my_round(i) for i in scale_arange + if not my_round(i) in self.scale_range] + + self.scale_range) + # scale + if not self.kbending_range: + self.kbending_range = [my_round(i) for i in kbending_arange] + else: + self.kbending_range = sorted([my_round(i) for i in kbending_arange + if not my_round(i) in self.kbending_range] + + self.kbending_range) + # maxdist + if not self.maxdist_range: + self.maxdist_range = [my_round(i) for i in maxdist_arange] + else: + self.maxdist_range = sorted([my_round(i) for i in maxdist_arange + if not my_round(i) in self.maxdist_range] + + self.maxdist_range) + # lowfreq + if not self.lowfreq_range: + self.lowfreq_range = [my_round(i) for i in lowfreq_arange] + else: + self.lowfreq_range = sorted([my_round(i) for i in lowfreq_arange + if not my_round(i) in self.lowfreq_range] + + self.lowfreq_range) + # upfreq + if not self.upfreq_range: + self.upfreq_range = [my_round(i) for i in upfreq_arange ] + else: + self.upfreq_range = sorted([my_round(i) for i in upfreq_arange + if not my_round(i) in self.upfreq_range] + + self.upfreq_range) + # dcutoff + if not self.dcutoff_range: + if dcutoff_arange is None or len(dcutoff_arange) == 0: + self.dcutoff_range = [int(2 * self.resolution * float(sc)) for sc in self.scale_range] + dcutoff_arange = self.dcutoff_range + else: + self.dcutoff_range = [my_round(i) for i in dcutoff_arange] + else: + self.dcutoff_range = sorted([my_round(i) for i in dcutoff_arange + if not my_round(i) in self.dcutoff_range] + + self.dcutoff_range) + + # These commands perform the grid search of the best parameters + models = {} + count = 0 + if verbose: + stderr.write(' %-4s%-5s\t%-8s\t%-7s\t%-7s\t%-6s\t%-7s\t%-11s\n' % ( + "num","scale","kbending","maxdist","lowfreq","upfreq","dcutoff","correlation")) + #print scale_arange, kbending_arange, maxdist_arange, lowfreq_arange, upfreq_arange, dcutoff_arange + parameters_sets = itertools.product([my_round(i) for i in scale_arange ], + [my_round(i) for i in kbending_arange], + [my_round(i) for i in maxdist_arange ], + [my_round(i) for i in lowfreq_arange ], + [my_round(i) for i in upfreq_arange ]) + + + #for (scale, maxdist, upfreq, lowfreq, kbending) in zip([my_round(i) for i in scale_arange ], + for (scale, kbending, maxdist, lowfreq, upfreq) in parameters_sets: + #print (scale, kbending, maxdist, lowfreq, upfreq) + + # This check whether this optimization has been already done for this set of parameters + if (scale, kbending, maxdist, lowfreq, upfreq) in [tuple(k[:5]) for k in self.results]: + k = [k for k in self.results + if (scale, kbending, maxdist, lowfreq, upfreq) == tuple(k[:5]) + ][0] + result = self.results[(scale, kbending, maxdist, lowfreq, upfreq, k[-1])] + if verbose: + verb = ' %-5s\t%-8s\t%-7s\t%-7s\t%-6s\t%-7s\n' % ( + 'xx', scale, kbending, maxdist, lowfreq, upfreq, k[-1]) + + if verbose == 2: + stderr.write(verb + str(round(result, 4)) + '\n') + else: + print(verb + str(round(result, 4))) + continue + + config_tmp = {'kforce' : float(kforce), + 'ev_kforce': float(ev_kforce), + 'scale' : float(scale), + 'kbending' : float(kbending), + #'lowrdist' : 1.0, # This parameters is fixed to XXX + 'lowrdist' : 100, + 'maxdist' : int(maxdist), + 'lowfreq' : float(lowfreq), + 'upfreq' : float(upfreq)} + + try: + count += 1 + avg_result = dict((i,0) for i in dcutoff_arange) + for i in xrange(len(self.zscores)): + if self.tool=='lammps': + tdm = generate_lammps_models(self.zscores, self.resolution, self.nloci, + values=self.values, n_models=self.n_models, + n_keep=self.n_keep, + n_cpus=n_cpus, connectivity=connectivity, + verbose=verbose, first=0,coords = self.coords, + close_bins=self.close_bins, config=config_tmp, + container=self.container, zeros=self.zeros, + tmp_folder=self.tmp_folder,timeout_job=timeout_job, + hide_log=hide_log, + keep_restart_out_dir=keep_restart_out_dir, kfactor=kfactor, + cleanup=cleanup, initial_conformation='random' if not initial_conformation \ + else initial_conformation, + restart_path=restart_path, remove_rstrn=remove_rstrn, + initial_seed=initial_seed, store_n_steps=store_n_steps, + useColvars=useColvars) + else: + raise Exception(('ERROR: Tool must be lammps')) + + result = 0 + matrices = get_contact_matrix(tdm, + #cutoff=[int(dc * self.resolution * float(scale)) for dc in dcutoff_arange]) + cutoff=[int(dc) for dc in dcutoff_arange]) + for m in matrices: + cut = int(m**0.5) + sub_result = correlate_with_real_data(tdm, cutoff=cut, corr=corr, + off_diag=off_diag, + contact_matrix=matrices[m])[0] + + avg_result[cut] += sub_result + + # Update nmodels with the ones that really finished + if self.n_models != len(tdm): + print('WARNING: not all models produced: step %s, nmodels=%s' %(i+1, len(tdm))) + self.n_models = len(tdm) + + except ValueError: + _, e, _ = sys.exc_info() + print(' SKIPPING: %s' % e) + result = 0 + cutoff = my_round(dcutoff_arange[0]) + for ct,m in enumerate(avg_result): + + result = avg_result[m]/len(self.zscores) + + cutoff = int(m) + + if verbose: + verb = ' %-4s%-5s\t%-8s\t%-7s\t%-7s\t%-6s\t%-7s' % ( + count+ct, scale, kbending, maxdist, lowfreq, upfreq, cutoff) + if verbose == 2: + stderr.write(verb + str(round(result, 4)) + '\n') + else: + print(verb + str(round(result, 4))) + + count += ct + # Store the correlation for the TADdyn parameters set + self.results[(scale, kbending, maxdist, lowfreq, upfreq, cutoff)] = result + + if savedata and result: + models[(scale, kbending, maxdist, lowfreq, upfreq, cutoff)] = tdm + + if savedata: + out = open(savedata, 'w') + dump(models, out) + out.close() + + self.kbending_range.sort( key=float) + self.scale_range.sort( key=float) + self.maxdist_range.sort(key=float) + self.lowfreq_range.sort(key=float) + self.upfreq_range.sort( key=float) + self.dcutoff_range.sort(key=float) + + + def load_grid_search_OLD(self, filenames, corr='spearman', off_diag=1, + verbose=True, n_cpus=1): + """ + Loads one file or a list of files containing pre-calculated Structural + Models (keep_models parameter used). And correlate each set of models + with real data. Useful to run different correlation on the same data + avoiding to re-calculate each time the models. + + :param filenames: either a path to a file or a list of paths. + :param spearman corr: correlation coefficient to use + 'param 1 off_diag: + :param True verbose: print the results to the standard output + + """ + if isinstance(filenames, str): + filenames = [filenames] + models = {} + for filename in filenames: + inf = open(filename) + models.update(load(inf)) + inf.close() + count = 0 + pool = mu.Pool(n_cpus, maxtasksperchild=1) + jobs = {} + for scale, maxdist, upfreq, lowfreq, dcutoff in models: + svd = models[(scale, maxdist, upfreq, lowfreq, dcutoff)] + jobs[(scale, maxdist, upfreq, lowfreq, dcutoff)] = pool.apply_async( + _mu_correlate, args=(svd, corr, off_diag, + scale, maxdist, upfreq, lowfreq, dcutoff, + verbose, count)) + count += 1 + pool.close() + pool.join() + for scale, maxdist, upfreq, lowfreq, dcutoff in models: + self.results[(scale, maxdist, upfreq, lowfreq, dcutoff)] = \ + jobs[(scale, maxdist, upfreq, lowfreq, dcutoff)].get() + if not scale in self.scale_range: + self.scale_range.append(scale) + if not maxdist in self.maxdist_range: + self.maxdist_range.append(maxdist) + if not lowfreq in self.lowfreq_range: + self.lowfreq_range.append(lowfreq) + if not upfreq in self.upfreq_range: + self.upfreq_range.append(upfreq) + if not dcutoff in self.dcutoff_range: + self.dcutoff_range.append(dcutoff) + self.scale_range.sort( key=float) + self.maxdist_range.sort(key=float) + self.lowfreq_range.sort(key=float) + self.upfreq_range.sort( key=float) + self.dcutoff_range.sort(key=float) + + + def load_grid_search(self, filenames, corr='spearman', off_diag=1, + verbose=True, n_cpus=1): + """ + Loads one file or a list of files containing pre-calculated Structural + Models (keep_models parameter used). And correlate each set of models + with real data. Useful to run different correlation on the same data + avoiding to re-calculate each time the models. + + :param filenames: either a path to a file or a list of paths. + :param spearman corr: correlation coefficient to use + 'param 1 off_diag: + :param True verbose: print the results to the standard output + + """ + if isinstance(filenames, str): + filenames = [filenames] + models = {} + for filename in filenames: + inf = open(filename) + models.update(load(inf)) + inf.close() + count = 0 + pool = mu.Pool(n_cpus, maxtasksperchild=1) + jobs = {} + for scale, kbending, maxdist, lowfreq, upfreq, dcutoff in models: + svd = models[(scale, kbending, maxdist, lowfreq, upfreq, dcutoff)] + jobs[(scale, kbending, maxdist, lowfreq, upfreq, dcutoff)] = pool.apply_async( + _mu_correlate, args=(svd, corr, off_diag, + scale, kbending, maxdist, lowfreq, upfreq, dcutoff, + verbose, count)) + count += 1 + pool.close() + pool.join() + for scale, kbending, maxdist, lowfreq, upfreq, dcutoff in models: + self.results[(scale, kbending, maxdist, lowfreq, upfreq, dcutoff)] = \ + jobs[(scale, kbending, maxdist, lowfreq, upfreq, dcutoff)].get() + if not scale in self.scale_range: + self.scale_range.append(scale) + if not kbending in self.kbending_range: + self.kbending_range.append(kbending) + if not maxdist in self.maxdist_range: + self.maxdist_range.append(maxdist) + if not lowfreq in self.lowfreq_range: + self.lowfreq_range.append(lowfreq) + if not upfreq in self.upfreq_range: + self.upfreq_range.append(upfreq) + if not dcutoff in self.dcutoff_range: + self.dcutoff_range.append(dcutoff) + self.scale_range.sort( key=float) + self.kbending_range.sort(key=float) + self.maxdist_range.sort(key=float) + self.lowfreq_range.sort(key=float) + self.upfreq_range.sort( key=float) + self.dcutoff_range.sort(key=float) + + + def get_best_parameters_dict(self, reference=None, with_corr=False): + """ + :param None reference: a description of the dataset optimized + :param False with_corr: if True, returns also the correlation value + + :returns: a dict that can be used for modelling, see config parameter in + :func:`taddyn.experiment.Experiment.model_region` + + """ + if not self.results: + stderr.write('WARNING: no optimization done yet\n') + return + best = ((float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan')), 0.0) + kbending = 0 + try: + for (scale, maxdist, upfreq, lowfreq, kbending, cutoff), val in self.results.iteritems(): + if val > best[-1]: + best = ((scale, maxdist, upfreq, lowfreq, kbending, cutoff), val) + except ValueError: + for (scale, maxdist, upfreq, lowfreq, cutoff), val in self.results.iteritems(): + if val > best[-1]: + best = ((scale, maxdist, upfreq, lowfreq, kbending, cutoff), val) + + if with_corr: + #print best + return (dict((('scale' , float(best[0][0])), + ('kbending' , float(best[0][1])), + ('maxdist' , float(best[0][2])), + ('lowfreq' , float(best[0][3])), + ('upfreq' , float(best[0][4])), + ('dcutoff' , float(best[0][5])), + ('reference', reference or ''), ('kforce', 5))), + best[-1]) + else: + return dict((('scale' , float(best[0][0])), + ('kbending' , float(best[0][1])), + ('maxdist' , float(best[0][2])), + ('lowfreq' , float(best[0][3])), + ('upfreq' , float(best[0][4])), + ('dcutoff' , float(best[0][5])), + ('reference', reference or ''), ('kforce', 5))) + + + def plot_2d_OLD(self, axes=('scale', 'maxdist', 'upfreq', 'lowfreq'), + show_best=0, skip=None, savefig=None,clim=None): + """ + A grid of heatmaps representing the result of the optimization. + + :param 'scale','maxdist','upfreq','lowfreq' axes: list of axes to be + represented in the plot. The order will define which parameter will + be placed on the x, y, z or w axe. + :param 0 show_best: number of best correlation values to highlight in + the plot + :param None skip: if passed (as a dictionary), fix a given axe, + e.g.: {'scale': 0.001, 'maxdist': 500} + :param None savefig: path to a file where to save the image generated; + if None, the image will be shown using matplotlib GUI (the extension + of the file name will determine the desired format). + + """ + results = self._result_to_array() + plot_2d_optimization_result((('scale', 'maxdist', 'upfreq', 'lowfreq'), + ([float(i) for i in self.scale_range], + [float(i) for i in self.maxdist_range], + [float(i) for i in self.upfreq_range], + [float(i) for i in self.lowfreq_range]), + results), axes=axes, dcutoff=self.dcutoff_range, show_best=show_best, + skip=skip, savefig=savefig,clim=clim) + + def plot_2d(self, axes=('scale', 'kbending', 'maxdist', 'lowfreq', 'upfreq'), dcutoff=None, + show_best=0, skip=None, savefig=None,clim=None): + """ + A grid of heatmaps representing the result of the optimization. + + :param 'scale','kbending','maxdist','lowfreq','upfreq' axes: list of + axes to be represented in the plot. The order will define which + parameter will be placed on the x, y, z or w axe. + :param 0 show_best: number of best correlation values to highlight in + the plot + :param None skip: if passed (as a dictionary), fix a given axe, + e.g.: {'scale': 0.001, 'maxdist': 500} + :param None savefig: path to a file where to save the image generated; + if None, the image will be shown using matplotlib GUI (the extension + of the file name will determine the desired format). + """ + + # Case in which there is more than 1 distance cutoff (dcutoff) + cut = self.get_best_parameters_dict()['dcutoff'] + + results = self._result_to_array() + plot_2d_optimization_result((('scale', 'kbending', 'maxdist', 'lowfreq', 'upfreq'), + ([float(i) for i in self.scale_range], + [float(i) for i in self.kbending_range], + [float(i) for i in self.maxdist_range], + [float(i) for i in self.lowfreq_range], + [float(i) for i in self.upfreq_range]), + results), dcutoff=cut, axes=axes, show_best=show_best, + skip=skip, savefig=savefig,clim=clim) + + + + def plot_3d_OLD(self, axes=('scale', 'maxdist', 'upfreq', 'lowfreq')): + """ + A grid of heatmaps representing the result of the optimization. + + :param 'scale','maxdist','upfreq','lowfreq' axes: tuple of axes to be + represented in the plot. The order will define which parameter will + be placed on the x, y, z or w axe. + + """ + results = self._result_to_array() + plot_3d_optimization_result((('scale', 'maxdist', 'upfreq', 'lowfreq'), + ([float(i) for i in self.scale_range], + [float(i) for i in self.maxdist_range], + [float(i) for i in self.upfreq_range], + [float(i) for i in self.lowfreq_range]), + results), axes=axes) + + + + def _result_to_array_OLD(self): + # This auxiliary method organizes the results of the grid optimization in a + # Numerical array to be passed to the plot_2d_OLD and plot_3d functions above + + results = np.empty((len(self.scale_range), len(self.maxdist_range), + len(self.upfreq_range), len(self.lowfreq_range))) + + for w, scale in enumerate(self.scale_range): + for x, maxdist in enumerate(self.maxdist_range): + for y, upfreq in enumerate(self.upfreq_range): + for z, lowfreq in enumerate(self.lowfreq_range): + try: + cut = [c for c in self.dcutoff_range + if (scale, maxdist, upfreq, lowfreq, c) + in self.results][0] + except IndexError: + results[w, x, y, z] = float('nan') + continue + # + try: + results[w, x, y, z] = self.results[ + (scale, maxdist, upfreq, lowfreq, cut)] + except KeyError: + results[w, x, y, z] = float('nan') + return results + + + + def _result_to_array(self): + # This auxiliary method organizes the results of the grid optimization in a + # Numerical array to be passed to the plot_2d and plot_3d functions above + + results = np.zeros((len(self.scale_range), len(self.kbending_range), len(self.maxdist_range), + len(self.lowfreq_range), len(self.upfreq_range))) + #print results + #print self.lowfreq_range + + for v, scale in enumerate(self.scale_range): + for w, kbending in enumerate(self.kbending_range): + for x, maxdist in enumerate(self.maxdist_range): + for y, lowfreq in enumerate(self.lowfreq_range): + for z, upfreq in enumerate(self.upfreq_range): + + # Case in which there is more than 1 distance cutoff (dcutoff) + try: + cut = [c for c in self.dcutoff_range + if (scale, kbending, maxdist, lowfreq, upfreq, c) + in self.results][0] + except IndexError: + results[v, w, x, y, z] = float('nan') + continue + + # + try: + results[v, w, x, y, z] = self.results[ + (scale, kbending, maxdist, lowfreq, upfreq, cut)] + except KeyError: + results[v, w, x, y, z] = float('nan') + + """ + for i in xrange(len(self.scale_range)): + for j in xrange(len(self.kbending_range)): + for k in xrange(len(self.maxdist_range)): + for l in xrange(len(self.lowfreq_range)): + for m in xrange(len(self.upfreq_range)): + print "Correlation",self.scale_range[i],self.kbending_range[j],\ + self.maxdist_range[k],self.lowfreq_range[l],self.upfreq_range[m],\ + results[i][j][k][l][m] + exit(1) + """ + return results + + + + def write_result(self, f_name): + """ + This function writes a log file of all the values tested for each + parameter, and the resulting correlation value. + + This file can be used to load or merge data a posteriori using + the function taddyn.modelling.impoptimizer.IMPoptimizer.load_from_file + + :param f_name: file name with the absolute path + """ + out = open(f_name, 'w') + out.write(('## n_models: %s n_keep: %s ' + + 'close_bins: %s\n') % (self.n_models, + self.n_keep, self.close_bins)) + out.write('# scale\tkbending\tmax_dist\tlow_freq\tup_freq\tdcutoff\tcorrelation\n') + + parameters_sets = itertools.product(*[[my_round(i) for i in self.scale_range ], + [my_round(i) for i in self.kbending_range], + [my_round(i) for i in self.maxdist_range ], + [my_round(i) for i in self.lowfreq_range ], + [my_round(i) for i in self.upfreq_range ]]) + for (scale, kbending, maxdist, lowfreq, upfreq) in parameters_sets: + try: + cut = sorted( + [int(c) for c in self.dcutoff_range + if (scale, kbending, maxdist, lowfreq, upfreq, int(c)) + in self.results], + key=lambda x: self.results[ + (scale, kbending, maxdist, lowfreq, upfreq, x)]) + except IndexError: + print('Missing dcutoff', (scale, kbending, maxdist, lowfreq, upfreq)) + continue + + for c in cut: + try: + result = self.results[(scale, kbending, maxdist, lowfreq, upfreq, c)] + out.write(' %-5s\t%-8s\t%-8s\t%-8s\t%-7s\t%-7s\t%-11s\n' % ( + scale, kbending, maxdist, lowfreq, upfreq, c, result)) + except KeyError: + print('KeyError', (scale, kbending, maxdist, lowfreq, upfreq, c, result)) + continue + out.close() + + + def load_from_file_OLD(self, f_name): + """ + Loads the optimized parameters from a file generated with the function: + taddyn.modelling.impoptimizer.IMPoptimizer.write_result. + This function does not overwrite the parameters that were already + loaded or calculated. + + :param f_name: file name with the absolute path + """ + for line in open(f_name): + # Check same parameters + if line.startswith('##'): + n_models, _, n_keep, _, close_bins = line.split()[2:] + if ([int(n_models), int(n_keep), int(close_bins)] + != + [self.n_models, self.n_keep, self.close_bins]): + raise Exception('Parameters does in %s not match: %s\n%s' %( + f_name, + [int(n_models), int(n_keep), int(close_bins)], + [self.n_models, self.n_keep, self.close_bins])) + if line.startswith('#'): + continue + + # OLD format before May 2017 without kbending parameter + scale, maxdist, upfreq, lowfreq, dcutoff, result = line.split() + # Setting the kbending to 0.0 for to be compatible with the new version + kbending = 0.0 + scale, kbending, maxdist, lowfreq, upfreq, dcutoff = ( + float(scale), float(kbending), int(maxdist), float(lowfreq), float(upfreq), + float(dcutoff)) + scale = my_round(scale, val=5) + kbending = my_round(kbending) + maxdist = my_round(maxdist) + lowfreq = my_round(lowfreq) + upfreq = my_round(upfreq) + dcutoff = my_round(dcutoff) + + self.results[(scale, kbending, maxdist, lowfreq, upfreq, dcutoff)] = float(result) + if not scale in self.scale_range: + self.scale_range.append(scale) + if not kbending in self.kbending_range: + self.kbending_range.append(kbending) + if not maxdist in self.maxdist_range: + self.maxdist_range.append(maxdist) + if not lowfreq in self.lowfreq_range: + self.lowfreq_range.append(lowfreq) + if not upfreq in self.upfreq_range: + self.upfreq_range.append(upfreq) + if not dcutoff in self.dcutoff_range: + self.dcutoff_range.append(dcutoff) + + self.scale_range.sort( key=float) + self.kbending_range.sort(key=float) + self.maxdist_range.sort( key=float) + self.lowfreq_range.sort( key=float) + self.upfreq_range.sort( key=float) + self.dcutoff_range.sort( key=float) + + + + def load_from_file(self, f_name): + """ + Loads the optimized parameters from a file generated with the function: + taddyn.modelling.impoptimizer.IMPoptimizer.write_result. + This function does not overwrite the parameters that were already + loaded or calculated. + + :param f_name: file name with the absolute path + """ + for line in open(f_name): + # Check same parameters + if line.startswith('##'): + n_models, _, n_keep, _, close_bins = line.split()[2:] + if ([int(n_models), int(n_keep), int(close_bins)] + != + [self.n_models, self.n_keep, self.close_bins]): + raise Exception('Parameters does in %s not match: %s\n%s' %( + f_name, + [int(n_models), int(n_keep), int(close_bins)], + [self.n_models, self.n_keep, self.close_bins])) + if line.startswith('#'): + continue + scale, kbending, maxdist, lowfreq, upfreq, dcutoff, result = line.split() + scale, kbending, maxdist, lowfreq, upfreq, dcutoff = ( + float(scale), float(kbending), int(maxdist), float(lowfreq), float(upfreq), + float(dcutoff)) + scale = my_round(scale, val=5) + kbending = my_round(kbending) + maxdist = my_round(maxdist) + lowfreq = my_round(lowfreq) + upfreq = my_round(upfreq) + dcutoff = my_round(dcutoff) + self.results[(scale, kbending, maxdist, lowfreq, upfreq, dcutoff)] = float(result) + if not scale in self.scale_range: + self.scale_range.append(scale) + if not kbending in self.kbending_range: + self.kbending_range.append(kbending) + if not maxdist in self.maxdist_range: + self.maxdist_range.append(maxdist) + if not lowfreq in self.lowfreq_range: + self.lowfreq_range.append(lowfreq) + if not upfreq in self.upfreq_range: + self.upfreq_range.append(upfreq) + if not dcutoff in self.dcutoff_range: + self.dcutoff_range.append(dcutoff) + self.scale_range.sort( key=float) + self.kbending_range.sort(key=float) + self.maxdist_range.sort( key=float) + self.lowfreq_range.sort( key=float) + self.upfreq_range.sort( key=float) + self.dcutoff_range.sort( key=float) + + + +def my_round(num, val=4): + num = round(float(num), val) + return str(int(num) if num == int(num) else num) + + + +# def _mu_correlate(svd, corr, off_diag, scale, kbending, maxdist, lowfreq, upfreq, +# dcutoff, verbose, count): +# tdm = StructuralModels( +# nloci=svd['nloci'], models=svd['models'], +# bad_models=svd['bad_models'], +# resolution=svd['resolution'], +# original_data=svd['original_data'], +# clusters=svd['clusters'], config=svd['config'], +# zscores=svd['zscore']) +# try: +# result = correlate_with_real_data(tdm, +# cutoff=dcutoff, corr=corr, +# off_diag=off_diag)[0] +# if verbose: +# verb = ' %-5s\t%-8s\t%-7s\t%-8s\t%-8s\t%-7s\n' % ( +# scale, kbending, maxdist, lowfreq, upfreq, dcutoff) +# if verbose == 2: +# stderr.write(verb + str(result) + '\n') +# else: +# print verb + str(result) +# except Exception, e: +# print 'ERROR %s' % e +# return result diff --git a/tadphys/modelling/lammps_modelling.py b/tadphys/modelling/lammps_modelling.py new file mode 100644 index 0000000..a5e4563 --- /dev/null +++ b/tadphys/modelling/lammps_modelling.py @@ -0,0 +1,3850 @@ +""" +16 Mar 2019 + + +""" +from string import ascii_uppercase as uc, ascii_lowercase as lc +from os.path import exists +from random import uniform, randint, seed, random, sample, shuffle +from pickle import load, dump +from multiprocessing.dummy import Pool as ThreadPool +from functools import partial +from math import atan2 +from itertools import combinations, product +from shutil import copyfile + +import sys +import copy +import os +import shutil +import multiprocessing + +from numpy import sin, cos, arccos, sqrt, fabs, pi +import numpy as np +from mpi4py import MPI +from lammps import lammps + +from tadphys.modelling import LAMMPS_CONFIG as CONFIG +from tadphys.modelling.lammpsmodel import LAMMPSmodel +from tadphys.modelling.restraints import HiCBasedRestraints + +class InitalConformationError(Exception): + """ + Exception to handle failed initial conformation. + """ + pass + +def abortable_worker(func, *args, **kwargs): + timeout = kwargs.get('timeout', None) + failedSeedLog = kwargs.get('failedSeedLog', None) + p = ThreadPool(1) + res = p.apply_async(func, args=args) + try: + out = res.get(timeout) # Wait timeout seconds for func to complete. + return out + except multiprocessing.TimeoutError: + print("Model took more than %s seconds to complete ... canceling" % str(timeout)) + p.terminate() + raise + except: + print("Unknown error with process") + if failedSeedLog != None: + failedSeedLog, k = failedSeedLog + with open(failedSeedLog, 'a') as f: + f.write('%s\t%s\n' %(k, 'Failed')) + p.terminate() + raise + +def generate_lammps_models(zscores, resolution, nloci, start=1, n_models=5000, + n_keep=1000, close_bins=1, n_cpus=1, + verbose=0, outfile=None, config=None, + values=None, coords=None, zeros=None, + first=None, container=None,tmp_folder=None,timeout_job=10800, + initial_conformation=None, connectivity="FENE", + timesteps_per_k=10000,keep_restart_out_dir=None, + kfactor=1, adaptation_step=False, cleanup=False, + hide_log=True, remove_rstrn=[], initial_seed=0, + restart_path=False, store_n_steps=10, + useColvars=False): + """ + This function generates three-dimensional models starting from Hi-C data. + The final analysis will be performed on the n_keep top models. + + :param zscores: the dictionary of the Z-score values calculated from the + Hi-C pairwise interactions + :param resolution: number of nucleotides per Hi-C bin. This will be the + number of nucleotides in each model's particle + :param nloci: number of particles to model (may not all be present in + zscores) + :param None coords: a dictionary like: + :: + + {'crm' : '19', + 'start': 14637, + 'end' : 15689} + + :param 5000 n_models: number of models to generate + :param 1000 n_keep: number of models used in the final analysis (usually + the top 20% of the generated models). The models are ranked according to + their objective function value (the lower the better) + :param 1 close_bins: number of particles away (i.e. the bin number + difference) a particle pair must be in order to be considered as + neighbors (e.g. 1 means consecutive particles) + :param n_cpus: number of CPUs to use + :param False verbose: if set to True, information about the distance, force + and Z-score between particles will be printed. If verbose is 0.5 than + constraints will be printed only for the first model calculated. + :param None values: the normalized Hi-C data in a list of lists (equivalent + to a square matrix) + :param None config: a dictionary containing the standard + parameters used to generate the models. The dictionary should contain + the keys kforce, lowrdist, maxdist, upfreq and lowfreq. Examples can be + seen by doing: + + :: + + from tadphys.modelling.HIC_CONFIG import HIC_CONFIG + + where CONFIG is a dictionary of dictionaries to be passed to this function: + + :: + + CONFIG = { + 'dmel_01': { + # Paramaters for the Hi-C dataset from: + 'reference' : 'victor corces dataset 2013', + + # Force applied to the restraints inferred to neighbor particles + 'kforce' : 5, + + # Space occupied by a nucleotide (nm) + 'scale' : 0.005 + + # Strength of the bending interaction + 'kbending' : 0.0, # OPTIMIZATION: + + # Maximum experimental contact distance + 'maxdist' : 600, # OPTIMIZATION: 500-1200 + + # Minimum thresholds used to decide which experimental values have to be + # included in the computation of restraints. Z-score values bigger than upfreq + # and less that lowfreq will be include, whereas all the others will be rejected + 'lowfreq' : -0.7 # OPTIMIZATION: min/max Z-score + + # Maximum threshold used to decide which experimental values have to be + # included in the computation of restraints. Z-score values greater than upfreq + # and less than lowfreq will be included, while all the others will be rejected + 'upfreq' : 0.3 # OPTIMIZATION: min/max Z-score + + } + } + :param None first: particle number at which model should start + :param None container: restrains particle to be within a given object. Can + only be a 'cylinder', which is, in fact a cylinder of a given height to + which are added hemispherical ends. This cylinder is defined by a radius, + its height (with a height of 0 the cylinder becomes a sphere) and the + force applied to the restraint. E.g. for modeling E. coli genome (2 + micrometers length and 0.5 micrometer of width), these values could be + used: ['cylinder', 250, 1500, 50], and for a typical mammalian nuclei + (6 micrometers diameter): ['cylinder', 3000, 0, 50] + :param None tmp_folder: path to a temporary file created during + the clustering computation. Default will be created in /tmp/ folder + :param 10800 timeout_job: maximum seconds a job can run in the multiprocessing + of lammps before is killed + :param initial_conformation: lammps input data file with the particles initial conformation. + :param True hide_log: do not generate lammps log information + :param FENE connectivity: use FENE for a fene bond or harmonic for harmonic + potential for neighbours + :param None keep_restart_out_dir: path to write files to restore LAMMPs + session (binary) + :param True cleanup: delete lammps folder after completion + :param [] remove_rstrn: list of particles which must not have restrains + :param 0 initial_seed: Initial random seed for modelling. + :param False restart_path: path to files to restore LAMMPs session (binary) + :param 10 store_n_steps: Integer with number of steps to be saved if + restart_file != False + :param False useColvars: True if you want the restrains to be loaded by colvars + + :returns: a Tadphys models dictionary + """ + + if not tmp_folder: + tmp_folder = '/tmp/tadphys_tmp_%s/' % ( + ''.join([(uc + lc)[int(random() * 52)] for _ in range(4)])) + else: + if tmp_folder[-1] != '/': + tmp_folder += '/' + randk = ''.join([(uc + lc)[int(random() * 52)] for _ in range(4)]) + tmp_folder = '%s%s/' %(tmp_folder, randk) + while os.path.exists(tmp_folder): + randk = ''.join([(uc + lc)[int(random() * 52)] for _ in range(4)]) + tmp_folder = '%s%s/' %(tmp_folder[:-1], randk) + if not os.path.exists(tmp_folder): + os.makedirs(tmp_folder) + + # Setup CONFIG + if isinstance(config, dict): + CONFIG.HiC.update(config) + elif config: + raise Exception('ERROR: "config" must be a dictionary') + + global RADIUS + + #RADIUS = float(resolution * CONFIG['scale']) / 2 + RADIUS = 0.5 + CONFIG.HiC['resolution'] = resolution + CONFIG.HiC['maxdist'] = CONFIG.HiC['maxdist'] / (float(resolution * CONFIG.HiC['scale'])) + + global LOCI + if first is None: + first = min([int(j) for i in zscores[0] for j in zscores[0][i]] + + [int(i) for i in zscores[0]]) + LOCI = list(range(first, nloci + first)) + LOCI = 20000 + + # random inital number + global START + START = start + # verbose + global VERBOSE + VERBOSE = verbose + #VERBOSE = 3 + + HiCRestraints = [HiCBasedRestraints(nloci,RADIUS,CONFIG.HiC,resolution, zs, + chromosomes=coords, close_bins=close_bins,first=first, + remove_rstrn=remove_rstrn) for zs in zscores] + + run_time = 1000 + + colvars = 'colvars.dat' + + steering_pairs = None + time_dependent_steering_pairs = None + if len(HiCRestraints) > 1: + time_dependent_steering_pairs = { + 'colvar_input' : HiCRestraints, + 'colvar_output' : colvars, + 'chrlength' : nloci, + 'binsize' : resolution, + 'timesteps_per_k_change' : [float(timesteps_per_k)]*6, + 'k_factor' : kfactor, + 'perc_enfor_contacts' : 100., + 'colvar_dump_freq' : int(timesteps_per_k/100), + 'adaptation_step' : adaptation_step, + } + if not initial_conformation: + initial_conformation = 'random' + else: + steering_pairs = { + 'colvar_input': HiCRestraints[0], + 'colvar_output': colvars, + 'binsize': resolution, + 'timesteps_per_k' : timesteps_per_k, + 'k_factor' : kfactor, + 'colvar_dump_freq' : int(timesteps_per_k/100), + 'timesteps_relaxation' : int(timesteps_per_k*10) + } + if not initial_conformation: + initial_conformation = 'random' + + if not container: + container = ['cube',1000.0] # http://lammps.sandia.gov/threads/msg48683.html + + ini_sm_model = None + sm_diameter = 1 + if initial_conformation != 'random': + if isinstance(initial_conformation, dict): + sm = [initial_conformation] + sm[0]['x'] = sm[0]['x'][0:nloci] + sm[0]['y'] = sm[0]['y'][0:nloci] + sm[0]['z'] = sm[0]['z'][0:nloci] + sm_diameter = float(resolution * CONFIG.HiC['scale']) + for single_m in sm: + for i in range(len(single_m['x'])): + single_m['x'][i] /= sm_diameter + single_m['y'][i] /= sm_diameter + single_m['z'][i] /= sm_diameter + cm0 = single_m.center_of_mass() + for i in range(len(single_m['x'])): + single_m['x'][i] -= cm0['x'] + single_m['y'][i] -= cm0['y'] + single_m['z'][i] -= cm0['z'] + ini_sm_model = [[single_sm.copy()] for single_sm in sm] + + models, ini_model = lammps_simulate(lammps_folder=tmp_folder, + run_time=run_time, + initial_conformation=ini_sm_model, + connectivity=connectivity, + steering_pairs=steering_pairs, + time_dependent_steering_pairs=time_dependent_steering_pairs, + initial_seed=initial_seed, + n_models=n_keep, + n_keep=n_keep, + n_cpus=n_cpus, + keep_restart_out_dir=keep_restart_out_dir, + confining_environment=container, + timeout_job=timeout_job, + cleanup=cleanup, to_dump=int(timesteps_per_k/100.), + hide_log=hide_log, + chromosome_particle_numbers=chromosome_particle_numbers, + restart_path=restart_path, + store_n_steps=store_n_steps, + useColvars=useColvars) +# for i, m in enumerate(models.values()): +# m['index'] = i + if outfile: + if exists(outfile): + old_models, _ = load(open(outfile)) + else: + old_models, _ = {}, {} + models.update(old_models) + out = open(outfile, 'w') + dump((models), out) + out.close() + else: + stages = {} + trajectories = {} + timepoints = None + if len(HiCRestraints)>1: + timepoints = time_dependent_steering_pairs['colvar_dump_freq'] + nbr_produced_models = len(models)//(timepoints*(len(HiCRestraints)-1)) + stages[0] = [i for i in range(nbr_produced_models)] + + for sm_id, single_m in enumerate(ini_model): + for i in range(len(single_m['x'])): + single_m['x'][i] *= sm_diameter + single_m['y'][i] *= sm_diameter + single_m['z'][i] *= sm_diameter + + lammps_model = LAMMPSmodel({ 'x' : single_m['x'], + 'y' : single_m['y'], + 'z' : single_m['z'], + 'index' : sm_id+1+initial_seed, + 'cluster' : 'Singleton', + 'objfun' : single_m['objfun'] if 'objfun' in single_m else 0, + 'log_objfun' : single_m['log_objfun'] if 'log_objfun' in single_m else [], + 'radius' : float(CONFIG.HiC['resolution'] * \ + CONFIG.HiC['scale'])/2, + 'rand_init' : str(sm_id+1+initial_seed)}) + + models[sm_id] = lammps_model + for timepoint in range((len(HiCRestraints)-1)*timepoints): + stages[timepoint+1] = [(t+nbr_produced_models+timepoint*nbr_produced_models) + for t in range(nbr_produced_models)] + for traj in range(nbr_produced_models): + trajectories[traj] = [stages[t][traj] for t in range(timepoints+1)] + + model_ensemble = { + 'loci': len(LOCI), + 'models': models, + 'resolution': resolution, + 'original_data': values if len(HiCRestraints)>1 else values[0], + 'zscores': zscores, + 'config': CONFIG.HiC, + 'zeros': zeros, + 'restraints': HiCRestraints[0]._get_restraints(), + 'stages': stages, + 'trajectories': trajectories, + 'models_per_step': timepoints + } + + return model_ensemble +# Initialize the lammps simulation with standard polymer physics based +# interactions: chain connectivity (FENE) ; excluded volume (WLC) ; and +# bending rigidity (KP) +def init_lammps_run(lmp, initial_conformation, + neighbor=CONFIG.neighbor, + hide_log=True, + chromosome_particle_numbers=None, + connectivity="FENE", + restart_file=False): + + """ + Initialise the parameters for the computation in lammps job + + :param lmp: lammps instance object. + :param initial_conformation: lammps input data file with the particles initial conformation. + :param CONFIG.neighbor neighbor: see LAMMPS_CONFIG.py. + :param True hide_log: do not generate lammps log information + :param FENE connectivity: use FENE for a fene bond or harmonic for harmonic + potential for neighbours + :param False restart_file: path to file to restore LAMMPs session (binary) + + """ + + if hide_log: + lmp.command("log none") + #os.remove("log.lammps") + + ####################################################### + # Box and units (use LJ units and period boundaries) # + ####################################################### + lmp.command("units %s" % CONFIG.units) + lmp.command("atom_style %s" % CONFIG.atom_style) #with stiffness + lmp.command("boundary %s" % CONFIG.boundary) + """ + try: + lmp.command("communicate multi") + except: + pass + """ + + ########################## + # READ "start" data file # + ########################## + if restart_file == False : + lmp.command("read_data %s" % initial_conformation) + else: + restart_time = int(restart_file.split('/')[-1].split('_')[4][:-8]) + print('Previous unfinished LAMMPS steps found') + print('Loaded %s file' %restart_file) + lmp.command("read_restart %s" % restart_file) + lmp.command("reset_timestep %i" % restart_time) + + lmp.command("mass %s" % CONFIG.mass) + + ################################################################## + # Pair interactions require lists of neighbours to be calculated # + ################################################################## + lmp.command("neighbor %s" % neighbor) + lmp.command("neigh_modify %s" % CONFIG.neigh_modify) + + ############################################################## + # Sample thermodynamic info (temperature, energy, pressure) # + ############################################################## + lmp.command("thermo %i" % CONFIG.thermo) + + ############################### + # Stiffness term # + # E = K * (1+cos(theta)), K>0 # + ############################### + lmp.command("angle_style %s" % CONFIG.angle_style) # Write function for kinks + lmp.command("angle_coeff * %f" % CONFIG.persistence_length) + + ################################################################### + # Pair interaction between non-bonded atoms # + # # + # Lennard-Jones 12-6 potential with cutoff: # + # potential E=4epsilon[ (sigma/r)^12 - (sigma/r)^6] for r timepoints) for ks in kseeds]): + # kseeds.append(rnd) + + #pool = ProcessPool(max_workers=n_cpus, max_tasks=n_cpus) + pool = multiprocessing.Pool(processes=n_cpus, maxtasksperchild=n_cpus) + + results = [] + def collect_result(result): + results.append((result[0], result[1], result[2])) + + initial_models = initial_conformation + if not initial_models: + initial_models = [] + + jobs = {} + for k_id, k in enumerate(kseeds): + k_folder = lammps_folder + 'lammps_' + str(k) + '/' + failedSeedLog = None + # First we check if the modelling fails with this seed + if restart_path != False: + restart_file = restart_path + 'lammps_' + str(k) + '/' + failedSeedLog = restart_file + 'runLog.txt' + if os.path.exists(failedSeedLog): + with open(failedSeedLog, 'r') as f: + for line in f: + prevRun = line.split() + # add number of models done so dont repeat same seed + if prevRun[1] == 'Failed': + k = int(prevRun[0]) + n_models + k_folder = lammps_folder + 'lammps_' + str(k) + '/' + + #print "#RandomSeed: %s" % k + keep_restart_out_dir2 = None + if keep_restart_out_dir != None: + keep_restart_out_dir2 = keep_restart_out_dir + 'lammps_' + str(k) + '/' + if not os.path.exists(keep_restart_out_dir2): + os.makedirs(keep_restart_out_dir2) + model_path = False + if restart_path != False: + # check presence of previously finished jobs + model_path = restart_path + 'lammps_' + str(k) + '/finishedModel_%s.pickle' %k + # define restart file by checking for finished jobs or last step + if model_path != False and os.path.exists(model_path): + with open(model_path, "rb") as input_file: + m = load(input_file) + results.append((m[0], m[1])) + else: + if restart_path != False: + restart_file = restart_path + 'lammps_' + str(k) + '/' + dirfiles = os.listdir(restart_file) + # check for last k and step + maxi = (0, 0, '') + for f in dirfiles: + if f.startswith('restart_kincrease_'): + kincrease = int(f.split('_')[2]) + step = int(f.split('_')[-1][:-8]) + if kincrease > maxi[0]: + maxi = (kincrease, step, f) + elif kincrease == maxi[0] and step > maxi[1]: + maxi = (kincrease, step, f) + # In case there is no restart file at all + if maxi[2] == '': + #print('Could not find a LAMMPS restart file') + # will check later if we have a path or a file + getIniConf = True + #restart_file = False + else: + restart_file = restart_file + maxi[2] + getIniConf = False + else: + restart_file = False + getIniConf = True + + ini_conf = None + if not os.path.exists(k_folder): + os.makedirs(k_folder) + if initial_conformation and getIniConf == True: + ini_conf = '%sinitial_conformation.dat' % k_folder + write_initial_conformation_file(initial_conformation[k_id], + chromosome_particle_numbers, + confining_environment, + out_file=ini_conf) + # jobs[k] = run_lammps(k, k_folder, run_time, + # initial_conformation, connectivity, + # neighbor, + # tethering, minimize, + # compress_with_pbc, compress_without_pbc, + # confining_environment, + # steering_pairs, + # time_dependent_steering_pairs, + # loop_extrusion_dynamics, + # to_dump, pbc,) + # jobs[k] = pool.schedule(run_lammps, + jobs[k] = partial(abortable_worker, run_lammps, timeout=timeout_job, + failedSeedLog=[failedSeedLog, k]) + pool.apply_async(jobs[k], + args=(k, k_folder, run_time, + ini_conf, connectivity, + neighbor, + tethering, minimize, + compress_with_pbc, compress_without_pbc, + initial_relaxation, + confining_environment, + steering_pairs, + time_dependent_steering_pairs, + compartmentalization, + loop_extrusion_dynamics, + to_dump, pbc, hide_log, + chromosome_particle_numbers, + keep_restart_out_dir2, + restart_file, + model_path, + store_n_steps, + useColvars,), callback=collect_result) + # , timeout=timeout_job) + pool.close() + pool.join() + +# for k in kseeds: +# try: +# #results.append((k, jobs[k])) +# results.append((k, jobs[k].result())) +# except TimeoutError: +# print "Model took more than %s seconds to complete ... canceling" % str(timeout_job) +# jobs[k].cancel() +# except Exception as error: +# print "Function raised %s" % error +# jobs[k].cancel() + + models = {} + initial_models = [] + ############ WARNING ############ + # PENDING TO ADD THE STORAGE OF INITIAL MODELS # + if timepoints > 1: + for t in range(timepoints): + time_models = [] + for res in results: + (k,restarr,init_conf) = res + time_models.append(restarr[t]) + for i, m in enumerate(time_models[:n_keep]): + models[i+t*len(time_models[:n_keep])+n_keep] = m + #for i, (_, m) in enumerate( + # sorted(time_models.items(), key=lambda x: x[1]['objfun'])[:n_keep]): + # models[i+t+1] = m + + else: + for i, (_, m, im) in enumerate( + sorted(results, key=lambda x: x[1][0]['objfun'])[:n_keep]): + models[i] = m[0] + if not initial_conformation: + initial_models += [im] + + if cleanup: + for k in kseeds: + k_folder = lammps_folder + '/lammps_' + str(k) + '/' + if os.path.exists(k_folder): + shutil.rmtree(k_folder) + + return models, initial_models + + + +# This performs the dynamics: I should add here: The steered dynamics (Irene and Hi-C based) ; +# The loop extrusion dynamics ; the binders based dynamics (Marenduzzo and Nicodemi)...etc... +def run_lammps(kseed, lammps_folder, run_time, + initial_conformation=None, connectivity="FENE", + neighbor=CONFIG.neighbor, + tethering=False, minimize=True, + compress_with_pbc=None, compress_without_pbc=None, + initial_relaxation=None, + confining_environment=None, + steering_pairs=None, + time_dependent_steering_pairs=None, + compartmentalization=None, + loop_extrusion_dynamics=None, + to_dump=10000, pbc=False, + hide_log=True, + chromosome_particle_numbers=None, + keep_restart_out_dir2=None, + restart_file=False, + model_path=False, + store_n_steps=10, + useColvars=False): + """ + Generates one lammps model + + :param kseed: Random number to identify the model. + :param initial_conformation_folder: folder where to store lammps input + data file with the particles initial conformation. + http://lammps.sandia.gov/doc/2001/data_format.html + :param FENE connectivity: use FENE for a fene bond or harmonic for harmonic + potential for neighbours (see init_lammps_run) + :param run_time: # of timesteps. + :param None initial_conformation: path to initial conformation file or None + for random walk initial start. + :param CONFIG.neighbor neighbor: see LAMMPS_CONFIG.py. + :param False tethering: whether to apply tethering command or not. + :param True minimize: whether to apply minimize command or not. + :param None compress_with_pbc: whether to apply the compression dynamics in case of a + system with cubic confinement and pbc. This compression step is usually apply + to obtain a system with the desired particle density. The input have to be a list + of three elements: + 0 - XXX; + 1 - XXX; + 2 - The compression simulation time span (in timesteps). + e.g. compress_with_pbc=[0.01, 0.01, 100000] + :param None compress_without_pbc: whether to apply the compression dynamics in case of a + system with spherical confinement. This compression step is usually apply to obtain a + system with the desired particle density. The simulation shrinks/expands the initial + sphere to a sphere of the desired radius using many short runs. In each short run the + radius is reduced by 0.1 box units. The input have to be a list of three elements: + 0 - Initial radius; + 1 - Final desired radius; + 2 - The time span (in timesteps) of each short compression run. + e.g. compress_without_pbc=[300, 100, 100] + :param None steering_pairs: particles contacts file from colvars fix + http://lammps.sandia.gov/doc/PDF/colvars-refman-lammps.pdf. + steering_pairs = { 'colvar_input' : "ENST00000540866.2chr7_clean_enMatch.txt", + 'colvar_output' : "colvar_list.txt", + 'kappa_vs_genomic_distance' : "kappa_vs_genomic_distance.txt", + 'chrlength' : 3182, + 'copies' : ['A'], + 'binsize' : 50000, + 'number_of_kincrease' : 1000, + 'timesteps_per_k' : 1000, + 'timesteps_relaxation' : 100000, + 'perc_enfor_contacts' : 10 + } + + :param None loop_extrusion_dynamics: dictionary with all the info to perform loop + extrusion dynamics. + loop_extrusion_dynamics = { 'target_loops_input' : "target_loops.txt", + 'loop_extrusion_steps_output' : "loop_extrusion_steps.txt", + 'attraction_strength' : 4.0, + 'equilibrium_distance' : 1.0, + 'chrlength' : 3182, + 'copies' : ['A'], + 'timesteps_per_loop_extrusion_step' : 1000, + 'timesteps_relaxation' : 100000, + 'perc_enfor_loops' : 10 + } + + Should at least contain Chromosome, loci1, loci2 as 1st, 2nd and 3rd column + :param None keep_restart_out_dir2: path to write files to restore LAMMPs + session (binary) + :param False restart_file: path to file to restore LAMMPs session (binary) + :param False model_path: path to/for pickle with finished model (name included) + :param 10 store_n_steps: Integer with number of steps to be saved if + restart_file != False + :param False useColvars: True if you want the restrains to be loaded by colvars + :returns: a LAMMPSModel object + + """ + + + lmp = lammps(cmdargs=['-screen','none','-log',lammps_folder+'log.lammps','-nocite']) + me = MPI.COMM_WORLD.Get_rank() + nprocs = MPI.COMM_WORLD.Get_size() + # check if we have a restart file or a path to which restart + if restart_file == False: + doRestart = False + saveRestart = False + elif os.path.isdir(restart_file): + doRestart = False + saveRestart = True + else: + doRestart = True + saveRestart = True + if not initial_conformation and doRestart == False: + initial_conformation = lammps_folder+'initial_conformation.dat' + generate_chromosome_random_walks_conformation ([len(LOCI)], + outfile=initial_conformation, + seed_of_the_random_number_generator=kseed, + confining_environment=confining_environment) + + # Just prepared the steps recovery for steering pairs + if steering_pairs and doRestart == True: + init_lammps_run(lmp, initial_conformation, + neighbor=neighbor, + hide_log=hide_log, + connectivity=connectivity, + restart_file=restart_file) + else: + init_lammps_run(lmp, initial_conformation, + neighbor=neighbor, + hide_log=hide_log, + chromosome_particle_numbers=chromosome_particle_numbers, + connectivity=connectivity) + + lmp.command("dump 1 all custom %i %slangevin_dynamics_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + # ########################################################## + # # Generate RESTART file, SPECIAL format, not a .txt file # + # # Useful if simulation crashes + # Prepared an optimisation for steering pairs, but not for the rest# + # ########################################################## + # create lammps restart files every x steps. 1000 is ok + # There was the doubt of using text format session info (which allows use in other computers) + # but since the binary can be converted later and this: "Because a data file is in text format, + # if you use a data file written out by this command to restart a simulation, the initial state + # of the new run will be slightly different than the final state of the old run (when the file + # was written) which was represented internally by LAMMPS in binary format. A new simulation + # which reads the data file will thus typically diverge from a simulation that continued + # in the original input script." will continue with binary. To convert use restart2data + #if keep_restart_out_dir2: + # lmp.command("restart %i %s/relaxation_%i_*.restart" % (keep_restart_step, keep_restart_out_dir2, kseed)) + + + ####################################################### + # Set up fixes # + # use NVE ensemble # + # Langevin integrator Tstart Tstop 1/friction rndseed # + # => sampling NVT ensamble # + ####################################################### + # Define the langevin dynamics integrator + lmp.command("fix 1 all nve") + lmp.command("fix 2 all langevin 1.0 1.0 2.0 %i" % kseed) + + # Define the tethering to the center of the confining environment + if tethering: + lmp.command("fix 3 all spring tether 50.0 0.0 0.0 0.0 0.0") + + # Do a minimization step to prevent particles + # clashes in the initial conformation + if minimize: + + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %sminimization_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + print("Performing minimization run...") + lmp.command("minimize 1.0e-4 1.0e-6 100000 100000") + + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %slangevin_dynamics_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + if compress_with_pbc: + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %scompress_with_pbc_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + # Re-setting the initial timestep to 0 + lmp.command("reset_timestep 0") + + lmp.command("unfix 1") + lmp.command("unfix 2") + + # default as in PLoS Comp Biol Di Stefano et al. 2013 compress_with_pbc = [0.01, 0.01, 100000] + lmp.command("fix 1 all nph iso %s %s 2.0" % (compress_with_pbc[0], + compress_with_pbc[1])) + lmp.command("fix 2 all langevin 1.0 1.0 2.0 %i" % kseed) + print("run %i" % compress_with_pbc[2]) + lmp.command("run %i" % compress_with_pbc[2]) + + lmp.command("unfix 1") + lmp.command("unfix 2") + + lmp.command("fix 1 all nve") + lmp.command("fix 2 all langevin 1.0 1.0 2.0 %i" % kseed) + + # Here We have to re-define the confining environment + print("# Previous particle density (nparticles/volume)", lmp.get_natoms()/(confining_environment[1]**3)) + confining_environment[1] = lmp.extract_global("boxxhi",1) - lmp.extract_global("boxxlo",1) + print("") + print("# New cubic box dimensions after isotropic compression") + print(lmp.extract_global("boxxlo",1), lmp.extract_global("boxxhi",1)) + print(lmp.extract_global("boxylo",1), lmp.extract_global("boxyhi",1)) + print(lmp.extract_global("boxzlo",1), lmp.extract_global("boxzhi",1)) + print("# New confining environment", confining_environment) + print("# New particle density (nparticles/volume)", lmp.get_natoms()/(confining_environment[1]**3)) + print("") + + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %slangevin_dynamics_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + if compress_without_pbc: + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %scompress_without_pbc_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + # Re-setting the initial timestep to 0 + lmp.command("reset_timestep 0") + + # default as in Sci Rep Di Stefano et al. 2016 + # compress_without_pbc = [initial_radius, final_radius, timesteps_per_minirun] + # = [350, 161.74, 100] + radius = compress_without_pbc[0] + while radius > compress_without_pbc[1]: + + print("New radius %f" % radius) + if radius != compress_without_pbc[0]: + lmp.command("region sphere delete") + + lmp.command("region sphere sphere 0.0 0.0 0.0 %f units box side in" % radius) + + # Performing the simulation + lmp.command("fix 5 all wall/region sphere lj126 1.0 1.0 1.12246152962189") + lmp.command("run %i" % compress_without_pbc[2]) + + radius -= 0.1 + + # Here we have to re-define the confining environment + volume = 4.*np.pi/3.0*(compress_without_pbc[0]**3) + print("# Previous particle density (nparticles/volume)", lmp.get_natoms()/volume) + confining_environment[1] = compress_without_pbc[1] + print("") + volume = 4.*np.pi/3.0*(compress_without_pbc[1]**3) + print("# New particle density (nparticles/volume)", lmp.get_natoms()/volume) + print("") + + if initial_relaxation: + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %sinitial_relaxation_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + lmp.command("reset_timestep 0") + lmp.command("run %i" % initial_relaxation) + lmp.command("write_data relaxed_conformation.txt nocoeff") + + timepoints = 1 + xc = [] + # Setup the pairs to co-localize using the COLVARS plug-in + if steering_pairs: + + if doRestart == False: + # Start relaxation step + lmp.command("reset_timestep 0") # cambiar para punto ionicial + lmp.command("run %i" % steering_pairs['timesteps_relaxation']) + lmp.command("reset_timestep %i" % 0) + + # Start Steered Langevin dynamics + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %ssteered_MD_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id") + + if 'number_of_kincrease' in steering_pairs: + nbr_kincr = steering_pairs['number_of_kincrease'] + else: + nbr_kincr = 1 + + if doRestart == True: + restart_k_increase = int(restart_file.split('/')[-1].split('_')[2]) + restart_time = int(restart_file.split('/')[-1].split('_')[4][:-8]) + + #steering_pairs['colvar_output'] = os.path.dirname(os.path.abspath(steering_pairs['colvar_output'])) + '/' + str(kseed) + '_'+ os.path.basename(steering_pairs['colvar_output']) + steering_pairs['colvar_output'] = lammps_folder+os.path.basename(steering_pairs['colvar_output']) + for kincrease in range(nbr_kincr): + # Write the file containing the pairs to constraint + # steering_pairs should be a dictionary with: + # Avoid to repeat calculations in case of restart + if (doRestart == True) and (kincrease < restart_k_increase): + continue + + if useColvars == True: + + generate_colvars_list(steering_pairs, kincrease+1) + + # Adding the colvar option + #print "fix 4 all colvars %s output %s" % (steering_pairs['colvar_output'],lammps_folder) + lmp.command("fix 4 all colvars %s output %sout" % (steering_pairs['colvar_output'],lammps_folder)) + + if to_dump: + # lmp.command("thermo_style custom step temp epair emol") + lmp.command("thermo_style custom step temp epair emol pe ke etotal f_4") + lmp.command("thermo_modify norm no flush yes") + lmp.command("variable step equal step") + lmp.command("variable objfun equal f_4") + lmp.command('''fix 5 all print %s "${step} ${objfun}" file "%sobj_fun_from_time_point_%s_to_time_point_%s.txt" screen "no" title "#Timestep Objective_Function"''' % (steering_pairs['colvar_dump_freq'],lammps_folder,str(0), str(1))) + + # will load the bonds directly into LAMMPS + else: + bond_list = generate_bond_list(steering_pairs) + for bond in bond_list: + lmp.command(bond) + + if to_dump: + lmp.command("thermo_style custom step temp etotal") + lmp.command("thermo_modify norm no flush yes") + lmp.command("variable step equal step") + lmp.command("variable objfun equal etotal") + lmp.command('''fix 5 all print %s "${step} ${objfun}" file "%sobj_fun_from_time_point_%s_to_time_point_%s.txt" screen "no" title "#Timestep Objective_Function"''' % (steering_pairs['colvar_dump_freq'],lammps_folder,str(0), str(1))) + #lmp.command("reset_timestep %i" % 0) + resettime = 0 + runtime = steering_pairs['timesteps_per_k'] + if (doRestart == True) and (kincrease == restart_k_increase): + resettime = restart_time + runtime = steering_pairs['timesteps_per_k'] - restart_time + + # Create 10 restarts with name restart_kincrease_%s_time_%s.restart every + if saveRestart == True: + if os.path.isdir(restart_file): + restart_file_new = restart_file + 'restart_kincrease_%s_time_*.restart' %(kincrease) + else: + restart_file_new = '/'.join(restart_file.split('/')[:-1]) + '/restart_kincrease_%s_time_*.restart' %(kincrease) + #print(restart_file_new) + lmp.command("restart %i %s" %(int(steering_pairs['timesteps_per_k']/store_n_steps), restart_file_new)) + + #lmp.command("reset_timestep %i" % resettime) + lmp.command("run %i" % runtime) + + # Setup the pairs to co-localize using the COLVARS plug-in + if time_dependent_steering_pairs: + timepoints = time_dependent_steering_pairs['colvar_dump_freq'] + + #if exists("objective_function_profile.txt"): + # os.remove("objective_function_profile.txt") + + #print "# Getting the time dependent steering pairs!" + time_dependent_restraints = get_time_dependent_colvars_list(time_dependent_steering_pairs) + time_points = sorted(time_dependent_restraints.keys()) + print("#Time_points",time_points) + sys.stdout.flush() + + time_dependent_steering_pairs['colvar_output'] = lammps_folder+os.path.basename(time_dependent_steering_pairs['colvar_output']) + # Performing the adaptation step from initial conformation to Tadphys excluded volume + if time_dependent_steering_pairs['adaptation_step']: + restraints = {} + for time_point in time_points[0:1]: + lmp.command("reset_timestep %i" % 0) + # Change to_dump with some way to load the conformations you want to store + # This Adaptation could be discarded in the trajectory files. + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %sadapting_MD_from_initial_conformation_to_Tadphys_at_time_point_%s.XYZ id xu yu zu" % (to_dump, lammps_folder, time_point)) + lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + restraints[time_point] = {} + print("# Step %s - %s" % (time_point, time_point)) + sys.stdout.flush() + for pair in list(time_dependent_restraints[time_point].keys()): + # Strategy changing gradually the spring constant and the equilibrium distance + # Case 1: The restraint is present at time point 0 and time point 1: + if pair in time_dependent_restraints[time_point]: + # Case A: The restrainttype is the same at time point 0 and time point 1 -> + # The spring force changes, and the equilibrium distance is the one at time_point+1 + restraints[time_point][pair] = [ + # Restraint type + [time_dependent_restraints[time_point][pair][0]], + # Initial spring constant + [time_dependent_restraints[time_point][pair][1]*time_dependent_steering_pairs['k_factor']], + # Final spring constant + [time_dependent_restraints[time_point][pair][1]*time_dependent_steering_pairs['k_factor']], + # Initial equilibrium distance + [time_dependent_restraints[time_point][pair][2]], + # Final equilibrium distance + [time_dependent_restraints[time_point][pair][2]], + # Number of timesteps for the gradual change + [int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point]*0.1)]] + if useColvars == True: + generate_time_dependent_colvars_list(restraints[time_point], time_dependent_steering_pairs['colvar_output'], time_dependent_steering_pairs['colvar_dump_freq']) + copyfile(time_dependent_steering_pairs['colvar_output'], + "colvar_list_from_time_point_%s_to_time_point_%s.txt" % + (str(time_point), str(time_point))) + lmp.command("velocity all create 1.0 %s" % kseed) + # Adding the colvar option and perfoming the steering + if time_point != time_points[0]: + lmp.command("unfix 4") + print("#fix 4 all colvars %s" % time_dependent_steering_pairs['colvar_output']) + sys.stdout.flush() + lmp.command("fix 4 all colvars %s tstat 2 output %sout" % (time_dependent_steering_pairs['colvar_output'],lammps_folder)) + else: + bond_list = generate_time_dependent_bond_list(restraints[time_point]) + for bond in bond_list: + lmp.command(bond) + + lmp.command("run %i" % int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point]*0.1)) + + # Time dependent steering + restraints = {} + #for i in xrange(time_points[0],time_points[-1]): + for time_point in time_points[0:-1]: + lmp.command("reset_timestep %i" % 0) + # Change to_dump with some way to load the conformations you want to store + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %ssteered_MD_from_time_point_%s_to_time_point_%s.XYZ id xu yu zu" % (to_dump, lammps_folder, time_point, time_point+1)) + lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + restraints[time_point] = {} + print("# Step %s - %s" % (time_point, time_point+1)) + sys.stdout.flush() + # Compute the current distance between any two particles + xc_tmp = np.array(lmp.gather_atoms("x",1,3)) + current_distances = compute_particles_distance(xc_tmp) + + for pair in set(list(time_dependent_restraints[time_point].keys())+list(time_dependent_restraints[time_point+1].keys())): + r = 0 + + # Strategy changing gradually the spring constant + # Case 1: The restraint is present at time point 0 and time point 1: + if pair in time_dependent_restraints[time_point] and pair in time_dependent_restraints[time_point+1]: + # Case A: The restrainttype is the same at time point 0 and time point 1 -> + # The spring force changes, and the equilibrium distance is the one at time_point+1 + if time_dependent_restraints[time_point][pair][0] == time_dependent_restraints[time_point+1][pair][0]: + r += 1 + restraints[time_point][pair] = [ + # Restraint type + [time_dependent_restraints[time_point+1][pair][0]], + # Initial spring constant + [time_dependent_restraints[time_point][pair][1] *time_dependent_steering_pairs['k_factor']], + # Final spring constant + [time_dependent_restraints[time_point+1][pair][1]*time_dependent_steering_pairs['k_factor']], + # Initial equilibrium distance + [time_dependent_restraints[time_point][pair][2]], + # Final equilibrium distance + [time_dependent_restraints[time_point+1][pair][2]], + # Number of timesteps for the gradual change + [int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point])]] + # Case B: The restrainttype is different between time point 0 and time point 1 + if time_dependent_restraints[time_point][pair][0] != time_dependent_restraints[time_point+1][pair][0]: + # Case a: The restrainttype is "Harmonic" at time point 0 + # and "LowerBoundHarmonic" at time point 1 + if time_dependent_restraints[time_point][pair][0] == "Harmonic": + r += 1 + restraints[time_point][pair] = [ + # Restraint type + [time_dependent_restraints[time_point][pair][0], time_dependent_restraints[time_point+1][pair][0]], + # Initial spring constant + [time_dependent_restraints[time_point][pair][1]*time_dependent_steering_pairs['k_factor'], 0.0], + # Final spring constant + [0.0, time_dependent_restraints[time_point+1][pair][1]*time_dependent_steering_pairs['k_factor']], + # Initial equilibrium distance + [time_dependent_restraints[time_point][pair][2], time_dependent_restraints[time_point][pair][2]], + # Final equilibrium distance + [time_dependent_restraints[time_point+1][pair][2], time_dependent_restraints[time_point+1][pair][2]], + # Number of timesteps for the gradual change + #[int(time_dependent_steering_pairs['timesteps_per_k_change']), int(time_dependent_steering_pairs['timesteps_per_k_change'])]] + [int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point]), int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point])]] + # Case b: The restrainttype is "LowerBoundHarmonic" at time point 0 + # and "Harmonic" at time point 1 + if time_dependent_restraints[time_point][pair][0] == "HarmonicLowerBound": + r += 1 + restraints[time_point][pair] = [ + # Restraint type + [time_dependent_restraints[time_point][pair][0], time_dependent_restraints[time_point+1][pair][0]], + # Initial spring constant + [time_dependent_restraints[time_point][pair][1]*time_dependent_steering_pairs['k_factor'], 0.0], + # Final spring constant + [0.0, time_dependent_restraints[time_point+1][pair][1]*time_dependent_steering_pairs['k_factor']], + # Initial equilibrium distance + [time_dependent_restraints[time_point][pair][2], time_dependent_restraints[time_point][pair][2]], + # Final equilibrium distance + [time_dependent_restraints[time_point+1][pair][2], time_dependent_restraints[time_point+1][pair][2]], + # Number of timesteps for the gradual change + #[int(time_dependent_steering_pairs['timesteps_per_k_change']), int(time_dependent_steering_pairs['timesteps_per_k_change'])]] + [int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point]), int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point])]] + + # Case 2: The restraint is not present at time point 0, but it is at time point 1: + elif pair not in time_dependent_restraints[time_point] and pair in time_dependent_restraints[time_point+1]: + # List content: restraint_type,kforce,distance + r += 1 + restraints[time_point][pair] = [ + # Restraint type -> Is the one at time point time_point+1 + [time_dependent_restraints[time_point+1][pair][0]], + # Initial spring constant + [0.0], + # Final spring constant + [time_dependent_restraints[time_point+1][pair][1]*time_dependent_steering_pairs['k_factor']], + # Initial equilibrium distance + [time_dependent_restraints[time_point+1][pair][2]], + # Final equilibrium distance + [time_dependent_restraints[time_point+1][pair][2]], + # Number of timesteps for the gradual change + [int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point])]] + + # Case 3: The restraint is present at time point 0, but it is not at time point 1: + elif pair in time_dependent_restraints[time_point] and pair not in time_dependent_restraints[time_point+1]: + # List content: restraint_type,kforce,distance + r += 1 + restraints[time_point][pair] = [ + # Restraint type -> Is the one at time point time_point + [time_dependent_restraints[time_point][pair][0]], + # Initial spring constant + [time_dependent_restraints[time_point][pair][1]*time_dependent_steering_pairs['k_factor']], + # Final spring constant + [0.0], + # Initial equilibrium distance + [time_dependent_restraints[time_point][pair][2]], + # Final equilibrium distance + [time_dependent_restraints[time_point][pair][2]], + # Number of timesteps for the gradual change + [int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point])]] + + #current_distances[pair], + else: + print("#ERROR None of the previous conditions is matched!") + if pair in time_dependent_restraints[time_point]: + print("# Pair %s at timepoint %s %s " % (pair, time_point, time_dependent_restraints[time_point][pair])) + if pair in time_dependent_restraints[time_point+1]: + print("# Pair %s at timepoint %s %s " % (pair, time_point+1, time_dependent_restraints[time_point+1][pair])) + continue + + if r > 1: + print("#ERROR Two of the previous conditions are matched!") + + #if pair in time_dependent_restraints[time_point]: + # print "# Pair %s at timepoint %s %s " % (pair, time_point, time_dependent_restraints[time_point][pair]) + #else: + # print "# Pair %s at timepoint %s None" % (pair, time_point) + + #if pair in time_dependent_restraints[time_point+1]: + # print "# Pair %s at timepoint %s %s " % (pair, time_point+1, time_dependent_restraints[time_point+1][pair]) + #else: + # print "# Pair %s at timepoint %s None" % (pair, time_point+1) + #print restraints[pair] + #print "" + lmp.command("velocity all create 1.0 %s" % kseed) + if useColvars == True: + generate_time_dependent_colvars_list(restraints[time_point], time_dependent_steering_pairs['colvar_output'], time_dependent_steering_pairs['colvar_dump_freq']) + copyfile(time_dependent_steering_pairs['colvar_output'], + "%scolvar_list_from_time_point_%s_to_time_point_%s.txt" % + (lammps_folder, str(time_point), str(time_point+1))) + # Adding the colvar option and perfoming the steering + if time_point != time_points[0]: + lmp.command("unfix 4") + print("#fix 4 all colvars %s" % time_dependent_steering_pairs['colvar_output']) + sys.stdout.flush() + lmp.command("fix 4 all colvars %s tstat 2 output %sout" % (time_dependent_steering_pairs['colvar_output'],lammps_folder)) + if to_dump: + lmp.command("thermo_style custom step temp epair emol pe ke etotal f_4") + lmp.command("thermo_modify norm no flush yes") + lmp.command("variable step equal step") + lmp.command("variable objfun equal f_4") + lmp.command('''fix 5 all print %s "${step} ${objfun}" file "%sobj_fun_from_time_point_%s_to_time_point_%s.txt" screen "no" title "#Timestep Objective_Function"''' % (time_dependent_steering_pairs['colvar_dump_freq'],lammps_folder,str(time_point), str(time_point+1))) + else: + bond_list = generate_time_dependent_bond_list(restraints[time_point]) + for bond in bond_list: + lmp.command(bond) + if to_dump: + lmp.command("thermo_style custom step temp epair emol pe ke etotal") + lmp.command("thermo_modify norm no flush yes") + lmp.command("variable step equal step") + lmp.command("variable objfun equal etotal") + lmp.command('''fix 5 all print %s "${step} ${objfun}" file "%sobj_fun_from_time_point_%s_to_time_point_%s.txt" screen "no" title "#Timestep Objective_Function"''' % (time_dependent_steering_pairs['colvar_dump_freq'],lammps_folder,str(time_point), str(time_point+1))) + + lmp.command("run %i" % int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point])) + + if time_point > 0: + + if exists("%sout.colvars.traj.BAK" % lammps_folder): + + copyfile("%sout.colvars.traj.BAK" % lammps_folder, "%srestrained_pairs_equilibrium_distance_vs_timestep_from_time_point_%s_to_time_point_%s.txt" % (lammps_folder, str(time_point-1), str(time_point))) + + os.remove("%sout.colvars.traj.BAK" % lammps_folder) + + # Set interactions for chromosome compartmentalization + if compartmentalization: + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %scompartmentalization_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + + # First we have to partition the genome in the defined compartments + for group in compartmentalization['partition']: + list_of_particles = get_list(compartmentalization['partition'][group]) + for atom in list_of_particles: + #print("set atom %s type %s" % (atom,group+1)) + lmp.command("set atom %s type %s" % (atom,group+1)) + + # Second we have to define the type of interactions + for pair in compartmentalization['interactions']: + #pair_coeff t1 t2 epsilon sigma rc + t1 = pair[0]+1 + t2 = pair[1]+1 + if t1 > t2: + t1 = pair[1]+1 + t2 = pair[0]+1 + + epsilon = compartmentalization['interactions'][pair][1] + + try: + sigma1 = compartmentalization['radii'][pair[0]] + except: + sigma1 = 0.5 + try: + sigma2 = compartmentalization['radii'][pair[1]] + except: + sigma2 = 0.5 + sigma = sigma1 + sigma2 + + if compartmentalization['interactions'][pair][0] == "attraction": + rc = sigma * 2.5 + if compartmentalization['interactions'][pair][0] == "repulsion": + rc = sigma * 1.12246152962189 + + print("pair_coeff %s %s lj/cut %s %s %s" % (t1,t2,epsilon,sigma,rc)) + lmp.command("pair_coeff %s %s lj/cut %s %s %s" % (t1,t2,epsilon,sigma,rc)) + try: + lmp.command("run %s" % (compartmentalization['runtime'])) + except: + pass + + + # Setup the pairs to co-localize using the COLVARS plug-in + if loop_extrusion_dynamics: + + # Start relaxation step + try: + lmp.command("reset_timestep 0") + lmp.command("run %i" % loop_extrusion_dynamics['timesteps_relaxation']) + except: + pass + + lmp.command("reset_timestep 0") + # Start Loop extrusion dynamics + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %sloop_extrusion_MD_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + + # Randomly extract starting point of the extrusion dynamics between start and stop + extruders_positions = [] + nextruders = int(chromosome_particle_numbers[0]/loop_extrusion_dynamics['separation']) + print(nextruders) + for extruder in range(nextruders): + extruders_positions.append(draw_loop_extrusion_starting_point(loop_extrusion_dynamics['chrlength'][0])) + + # Initialise the lifetime of each extruder + extruders_lifetimes = [] + for extruder in range(nextruders): + extruders_lifetimes.append(int(0)) + print(extruders_positions, extruders_lifetimes) + + lmp.command("compute xu all property/atom xu") + lmp.command("compute yu all property/atom yu") + lmp.command("compute zu all property/atom zu") + + # Loop extrusion steps + for LES in range(int(run_time/loop_extrusion_dynamics['extrusion_time'])): + thermo_style="thermo_style custom step temp epair emol" + + # Update the bond restraint + loop_number = 1 + for particle1,particle2 in extruders_positions: + print("# fix LE%i all restrain bond %i %i %f %f %f" % (loop_number, + particle1, + particle2, + loop_extrusion_dynamics['attraction_strength'], + loop_extrusion_dynamics['attraction_strength'], + loop_extrusion_dynamics['equilibrium_distance'])) + + lmp.command("fix LE%i all restrain bond %i %i %f %f %f" % (loop_number, + particle1, + particle2, + loop_extrusion_dynamics['attraction_strength'], + loop_extrusion_dynamics['attraction_strength'], + loop_extrusion_dynamics['equilibrium_distance'])) + lmp.command("variable x%i equal c_xu[%i]" % (particle1, particle1)) + lmp.command("variable x%i equal c_xu[%i]" % (particle2, particle2)) + lmp.command("variable y%i equal c_yu[%i]" % (particle1, particle1)) + lmp.command("variable y%i equal c_yu[%i]" % (particle2, particle2)) + lmp.command("variable z%i equal c_zu[%i]" % (particle1, particle1)) + lmp.command("variable z%i equal c_zu[%i]" % (particle2, particle2)) + + lmp.command("variable xLE%i equal v_x%i-v_x%i" % (loop_number, particle1, particle2)) + lmp.command("variable yLE%i equal v_y%i-v_y%i" % (loop_number, particle1, particle2)) + lmp.command("variable zLE%i equal v_z%i-v_z%i" % (loop_number, particle1, particle2)) + lmp.command("variable dist_%i_%i equal sqrt(v_xLE%i*v_xLE%i+v_zLE%i*v_zLE%i+v_zLE%i*v_zLE%i)" % (particle1, + particle2, + loop_number, + loop_number, + loop_number, + loop_number, + loop_number, + loop_number)) + thermo_style += " v_dist_%i_%i" % (particle1, particle2) + loop_number += 1 + + lmp.command("%s" % thermo_style) + # Doing the LES + lmp.command("run %i" % loop_extrusion_dynamics['extrusion_time']) + + # update the lifetime of each extruder + for extruder in range(nextruders): + extruders_lifetimes[extruder] = extruders_lifetimes[extruder] + 1 + + # Remove the loop extrusion restraint! + loop_number = 1 + for particle1,particle2 in extruders_positions: + + print("# unfix LE%i" % (loop_number)) + lmp.command("unfix LE%i" % (loop_number)) + + loop_number += 1 + + # Update the particles involved in the loop extrusion interaction: + # decrease the intial_start by one until you get to start + # increase the intial_stop by one until you get to stop + for extruder in range(len(extruders_positions)): + # If the left part reaches the start of the chromosome -> Stop extruding + if extruders_positions[extruder][0] > 1: + random_number = uniform(0, 1) + if random_number <= loop_extrusion_dynamics['left_extrusion_rate']: + extruders_positions[extruder][0] -= 1 + # If the right part reaches the end of the chromosome -> Stop extruding + if extruders_positions[extruder][1] < chromosome_particle_numbers[0]: + random_number = uniform(0, 1) + if random_number <= loop_extrusion_dynamics['right_extrusion_rate']: + extruders_positions[extruder][1] += 1 + # If the extruder reached its lifetime, put it in another position + if extruders_lifetimes[extruder] == loop_extrusion_dynamics['lifetime']: + extruders_positions[extruder] = draw_loop_extrusion_starting_point(loop_extrusion_dynamics['chrlength'][0]) + # Re-initialise the lifetime of the extruder + extruders_lifetimes[extruder] = 0 + # Check presence of barriers + if loop_extrusion_dynamics['barriers_permeability'] < 1.0: + # If a motor tries to overcome a barrier we stop it with a probability > than the permeability + # If the barrier is on the left of the extruders, which is extruding contrary to the chain index, we have to re-put the extruder forwards + if extruders_positions[extruder][0] in loop_extrusion_dynamics['barriers']: + random_number = uniform(0, 1) + if random_number >= loop_extrusion_dynamics['barriers_permeability']: + extruders_positions[extruder][0] += 1 + # If the barrier is on the left of the extruders, which is extruding with the chain index, we have to re-put the extruder backwards + if extruders_positions[extruder][1] in loop_extrusion_dynamics['barriers']: + random_number = uniform(0, 1) + if random_number >= loop_extrusion_dynamics['barriers_permeability']: + extruders_positions[extruder][1] -= 1 + + print(extruders_positions,extruders_lifetimes) + + ### Put here the creationg of a pickle with the complete trajectory ### + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %sloop_extrusion_MD_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + # Post-processing analysis + # Save coordinates + #for time in range(0,runtime,to_dump): + # xc.append(np.array(read_trajectory_file("%s/loop_extrusion_MD_%s.XYZ" % (lammps_folder, time)))) + + #xc.append(np.array(lmp.gather_atoms("x",1,3))) + + lmp.close() + + result = [] + for stg in range(len(xc)): + #log_objfun = read_objective_function("%sobj_fun_from_time_point_%s_to_time_point_%s.txt" % (lammps_folder, str(stg), str(stg+1))) + log_objfun = [0.0] + for timepoint in range(1,timepoints+1): + lammps_model = LAMMPSmodel({'x' : [], + 'y' : [], + 'z' : [], + 'cluster' : 'Singleton', + 'log_objfun' : log_objfun, + 'objfun' : log_objfun[-1], + 'radius' : 0.5, #float(CONFIG.HiC['resolution'] * CONFIG.HiC['scale'])/2, + 'index' : kseed+timepoint, + 'rand_init' : str(kseed+timepoint)}) + + if pbc: + store_conformation_with_pbc(xc[stg], lammps_model, confining_environment) + else: + skip_first = 0 + if time_dependent_steering_pairs: + skip_first = 1 + for i in range((timepoint-1+skip_first)*len(LOCI)*3,(timepoint+skip_first)*len(LOCI)*3,3): + lammps_model['x'].append(xc[stg][i]*float(CONFIG.HiC['resolution'] * CONFIG.HiC['scale'])) + lammps_model['y'].append(xc[stg][i+1]*float(CONFIG.HiC['resolution'] * CONFIG.HiC['scale'])) + lammps_model['z'].append(xc[stg][i+2]*float(CONFIG.HiC['resolution'] * CONFIG.HiC['scale'])) + result.append(lammps_model) + + #os.remove("%slog.cite" % lammps_folder) + # safe finished model + if model_path != False: + with open(model_path, "wb") as output_file: + dump((kseed,result), output_file) + ################### Special case for clusters with disk quota + # Remove the saved steps + if saveRestart == True: + if os.path.isdir(restart_file): + restart_path = restart_file + else: + restart_path = '/'.join(restart_file.split('/')[:-1]) + '/' + for pathfile in os.listdir(restart_path): + if pathfile.startswith('restart'): + os.remove(restart_path + pathfile) + ################################################################## + # Load initial conformation and return it + init_conf = read_conformation_file(initial_conformation) + + return (kseed, result, init_conf) + +def read_trajectory_file(fname): + + coords=[] + fhandler = open(fname) + line = next(fhandler) + try: + while True: + if line.startswith('ITEM: TIMESTEP'): + while not line.startswith('ITEM: ATOMS'): + line = next(fhandler) + if line.startswith('ITEM: ATOMS'): + line = next(fhandler) + line = line.strip() + if len(line) == 0: + continue + line_vals = line.split() + coords += [float(line_vals[1]),float(line_vals[2]),float(line_vals[3])] + line = next(fhandler) + except StopIteration: + pass + fhandler.close() + + return coords + +def read_conformation_file(fname): + + mod={'x':[], 'y':[], 'z':[]} + fhandler = open(fname) + line = next(fhandler) + try: + while True: + if line.startswith('LAMMPS input data file'): + while not line.startswith(' Atoms'): + line = next(fhandler) + if line.startswith(' Atoms'): + line = next(fhandler) + while len(line.strip()) == 0: + line = next(fhandler) + line = line.strip() + line_vals = line.split() + mod['x'].append(float(line_vals[3])) + mod['y'].append(float(line_vals[4])) + mod['z'].append(float(line_vals[5])) + line = next(fhandler) + if len(line.strip()) == 0: + break + except StopIteration: + pass + fhandler.close() + + return mod + +########## Part to perform the restrained dynamics ########## +# I should add here: The steered dynamics (Irene's and Hi-C based models) ; +# The loop extrusion dynamics ; the binders based dynamics (Marenduzzo and Nicodemi)...etc... + +def linecount(filename): + """ + Count valid lines of input colvars file + + :param filename: input colvars file. + + :returns: number of valid contact lines + + """ + + k = 0 + tfp = open(filename) + for i, line in enumerate(tfp): + + if line.startswith('#'): + continue + cols_vals = line.split() + if cols_vals[1] == cols_vals[2]: + continue + k += 1 + + return k + +########## + +def generate_colvars_list(steering_pairs, + kincrease=0, + colvars_header='# collective variable: monitor distances\n\ncolvarsTrajFrequency 1000 # output every 1000 steps\ncolvarsRestartFrequency 10000000\n', + colvars_template=''' + +colvar { + name %s + # %s %s %i + distance { + group1 { + atomNumbers %i + } + group2 { + atomNumbers %i + } + } +}''', + colvars_tail = ''' + +harmonic { + name h_pot_%s + colvars %s + centers %s + forceConstant %f +}\n''', colvars_harmonic_lower_bound_tail = ''' + +harmonicWalls { + name hlb_pot_%s + colvars %s + lowerWalls %s + forceConstant %f + lowerWallConstant 1.0 +}\n''' + ): + + """ + Generates lammps colvars file http://lammps.sandia.gov/doc/PDF/colvars-refman-lammps.pdf + + :param dict steering_pairs: dictionary containing all the information to write down the + the input file for the colvars implementation + :param exisiting_template colvars_header: header template for colvars file. + :param exisiting_template colvars_template: contact template for colvars file. + :param exisiting_template colvars_tail: tail template for colvars file. + + """ + + # Getting the input + # XXXThe target_pairs could be also a list as the one in output of get_HiCbased_restraintsXXX + target_pairs = steering_pairs['colvar_input'] + outfile = steering_pairs['colvar_output'] + if 'kappa_vs_genomic_distance' in steering_pairs: + kappa_vs_genomic_distance = steering_pairs['kappa_vs_genomic_distance'] + if 'chrlength' in steering_pairs: + chrlength = steering_pairs['chrlength'] + else: + chrlength = 0 + if 'copies' in steering_pairs: + copies = steering_pairs['copies'] + else: + copies = ['A'] + kbin = 10000000 + binsize = steering_pairs['binsize'] + if 'percentage_enforced_contacts' in steering_pairs: + percentage_enforced_contacts = steering_pairs['perc_enfor_contacts'] + else: + percentage_enforced_contacts = 100 + + # Here we extract from all the restraints only + # a random sub-sample of percentage_enforced_contacts/100*totcolvars + rand_lines = [] + i=0 + j=0 + if isinstance(target_pairs, str): + totcolvars = linecount(target_pairs) + ncolvars = int(totcolvars*(float(percentage_enforced_contacts)/100)) + + #print "Number of enforced contacts = %i over %i" % (ncolvars,totcolvars) + rand_positions = sample(list(range(totcolvars)), ncolvars) + rand_positions = sorted(rand_positions) + + tfp = open(target_pairs) + with open(target_pairs) as f: + for line in f: + line = line.strip() + if j >= ncolvars: + break + if line.startswith('#'): + continue + + cols_vals = line.split() + # Avoid to enforce restraints between the same bin + if cols_vals[1] == cols_vals[2]: + continue + + if i == rand_positions[j]: + rand_lines.append(line) + j += 1 + i += 1 + tfp.close() + elif isinstance(target_pairs, HiCBasedRestraints): + + rand_lines = target_pairs.get_hicbased_restraints() + totcolvars = len(rand_lines) + ncolvars = int(totcolvars*(float(percentage_enforced_contacts)/100)) + + #print "Number of enforced contacts = %i over %i" % (ncolvars,totcolvars) + rand_positions = sample(list(range(totcolvars)), ncolvars) + rand_positions = sorted(rand_positions) + + + else: + print("Unknown target_pairs") + return + + + + #print rand_lines + + seqdists = {} + poffset=0 + outf = open(outfile,'w') + outf.write(colvars_header) + for copy_nbr in copies: + i = 1 + for line in rand_lines: + if isinstance(target_pairs, str): + cols_vals = line.split() + else: + cols_vals = ['chr'] + line + + #print cols_vals + + if isinstance(target_pairs, HiCBasedRestraints) and cols_vals[3] != "Harmonic" and cols_vals[3] != "HarmonicLowerBound": + continue + + part1_start = int(cols_vals[1])*binsize + part1_end = (int(cols_vals[1])+1)*binsize + #print part1_start, part1_end + + part2_start = int(cols_vals[2])*binsize + part2_end = (int(cols_vals[2])+1)*binsize + #print part2_start, part2_end + + name = str(i)+copy_nbr + seqdist = abs(part1_start-part2_start) + #print seqdist + + region1 = cols_vals[0] + '_' + str(part1_start) + '_' + str(part1_end) + region2 = cols_vals[0] + '_' + str(part2_start) + '_' + str(part2_end) + + particle1 = int(cols_vals[1]) + 1 + poffset + particle2 = int(cols_vals[2]) + 1 + poffset + + seqdists[name] = seqdist + + outf.write(colvars_template % (name,region1,region2,seqdist,particle1,particle2)) + + if isinstance(target_pairs, HiCBasedRestraints): + # If the spring constant is zero we avoid to add the restraint! + if cols_vals[4] == 0.0: + continue + + centre = cols_vals[5] + kappa = cols_vals[4]*steering_pairs['k_factor'] + + if cols_vals[3] == "Harmonic": + outf.write(colvars_tail % (name,name,centre,kappa)) + + if cols_vals[3] == "HarmonicLowerBound": + outf.write(colvars_harmonic_lower_bound_tail % (name,name,centre,kappa)) + + i += 1 + poffset += chrlength + + outf.flush() + + #=========================================================================== + # if isinstance(target_pairs, HiCBasedRestraints): + # for copy_nbr in copies: + # i = 1 + # for line in rand_lines: + # cols_vals = line + # + # if cols_vals[3] == 0.0: + # continue + # + # name = str(i)+copy_nbr + # + # centre = cols_vals[4] + # kappa = cols_vals[3] + # + # if cols_vals[2] == "Harmonic": + # outf.write(colvars_tail % (name,name,centre,kappa)) + # + # elif cols_vals[2] == "HarmonicLowerBound": + # outf.write(colvars_harmonic_lower_bound_tail % (name,name,centre,kappa)) + # + # + # + # i += 1 + # poffset += chrlength + # + # outf.flush() + #=========================================================================== + + if 'kappa_vs_genomic_distance' in steering_pairs: + + kappa_values = {} + with open(kappa_vs_genomic_distance) as kgd: + for line in kgd: + line_vals = line.split() + kappa_values[int(line_vals[0])] = float(line_vals[1]) + + for seqd in set(seqdists.values()): + kappa = 0 + if seqd in kappa_values: + kappa = kappa_values[seqd]*kincrease + else: + for kappa_key in sorted(kappa_values, key=int): + if int(kappa_key) > seqd: + break + kappa = kappa_values[kappa_key]*kincrease + centres='' + names='' + for seq_name in seqdists: + if seqdists[seq_name] == seqd: + centres += ' 1.0' + names += ' '+seq_name + + outf.write(colvars_tail % (str(seqd),names,centres,kappa)) + + outf.flush() + + outf.close() + + +def generate_bond_list(steering_pairs): + + """ + Generates lammps bond commands + + :param dict steering_pairs: dictionary containing all the information to write down the + the input file for the bonds + """ + + # Getting the input + # The target_pairs could be also a list as the one in output of get_HiCbased_restraintsXXX + target_pairs = steering_pairs['colvar_input'] + if 'kappa_vs_genomic_distance' in steering_pairs: + kappa_vs_genomic_distance = steering_pairs['kappa_vs_genomic_distance'] + if 'chrlength' in steering_pairs: + chrlength = steering_pairs['chrlength'] + else: + chrlength = 0 + if 'copies' in steering_pairs: + copies = steering_pairs['copies'] + else: + copies = ['A'] + kbin = 10000000 + binsize = steering_pairs['binsize'] + if 'percentage_enforced_contacts' in steering_pairs: + percentage_enforced_contacts = steering_pairs['perc_enfor_contacts'] + else: + percentage_enforced_contacts = 100 + + # Here we extract from all the restraints only + # a random sub-sample of percentage_enforced_contacts/100*totcolvars + rand_lines = [] + i=0 + j=0 + if isinstance(target_pairs, str): + totcolvars = linecount(target_pairs) + ncolvars = int(totcolvars*(float(percentage_enforced_contacts)/100)) + + #print "Number of enforced contacts = %i over %i" % (ncolvars,totcolvars) + rand_positions = sample(list(range(totcolvars)), ncolvars) + rand_positions = sorted(rand_positions) + + tfp = open(target_pairs) + with open(target_pairs) as f: + for line in f: + line = line.strip() + if j >= ncolvars: + break + if line.startswith('#'): + continue + + cols_vals = line.split() + # Avoid to enforce restraints between the same bin + if cols_vals[1] == cols_vals[2]: + continue + + if i == rand_positions[j]: + rand_lines.append(line) + j += 1 + i += 1 + tfp.close() + elif isinstance(target_pairs, HiCBasedRestraints): + + rand_lines = target_pairs.get_hicbased_restraints() + totcolvars = len(rand_lines) + ncolvars = int(totcolvars*(float(percentage_enforced_contacts)/100)) + + #print "Number of enforced contacts = %i over %i" % (ncolvars,totcolvars) + rand_positions = sample(list(range(totcolvars)), ncolvars) + rand_positions = sorted(rand_positions) + + + else: + print("Unknown target_pairs") + return + + + + #print rand_lines + + seqdists = {} + poffset=0 + outf = [] #### a list + for copy_nbr in copies: + i = 1 + for line in rand_lines: + if isinstance(target_pairs, str): + cols_vals = line.split() + else: + cols_vals = ['chr'] + line + + #print cols_vals + + if isinstance(target_pairs, HiCBasedRestraints) and cols_vals[3] != "Harmonic" and cols_vals[3] != "HarmonicLowerBound": + continue + + part1_start = int(cols_vals[1])*binsize + part1_end = (int(cols_vals[1])+1)*binsize + #print part1_start, part1_end + + part2_start = int(cols_vals[2])*binsize + part2_end = (int(cols_vals[2])+1)*binsize + #print part2_start, part2_end + + name = str(i)+copy_nbr + seqdist = abs(part1_start-part2_start) + #print seqdist + + region1 = cols_vals[0] + '_' + str(part1_start) + '_' + str(part1_end) + region2 = cols_vals[0] + '_' + str(part2_start) + '_' + str(part2_end) + + particle1 = int(cols_vals[1]) + 1 + poffset + particle2 = int(cols_vals[2]) + 1 + poffset + + seqdists[name] = seqdist + + + if isinstance(target_pairs, HiCBasedRestraints): + # If the spring constant is zero we avoid to add the restraint! + if cols_vals[4] == 0.0: + continue + + centre = cols_vals[5] + kappa = cols_vals[4]*steering_pairs['k_factor'] + + bondType = None + if cols_vals[3] == "Harmonic": + bondType = 'bond' + elif cols_vals[3] == "HarmonicLowerBound": + bondType = 'lbound' + + if bondType: + outf.append('fix %s all restrain %s %d %d %f %f %f %f' %( + name, bondType, particle1, particle2, 0, kappa, + centre, centre)) + + + i += 1 + poffset += chrlength + + return outf + +########## + +def generate_time_dependent_bond_list(steering_pairs): + + + """ + Generates lammps bond commands + + :param dict steering_pairs: dictionary containing all the information to write down the + the input file for the bonds + """ + + outf = [] #### a list + # Defining the particle pairs + for pair in steering_pairs: + + #print steering_pairs[pair] + sys.stdout.flush() + for i in range(len(steering_pairs[pair][0])): + name = "%s_%s_%s" % (i, int(pair[0])+1, int(pair[1])+1) + seqdist = abs(int(pair[1])-int(pair[0])) + particle1 = int(pair[0])+1 + particle2 = int(pair[1])+1 + + restraint_type = steering_pairs[pair][0][i] + kappa_start = steering_pairs[pair][1][i] + kappa_stop = steering_pairs[pair][2][i] + centre_start = steering_pairs[pair][3][i] + centre_stop = steering_pairs[pair][4][i] + timesteps_per_k_change = steering_pairs[pair][5][i] + + bonType = None + if restraint_type == "Harmonic": + bonType = 'bond' + elif restraint_type == "HarmonicLowerBound": + bonType = 'lbound' + + if bonType: + outf.append('fix %s all restrain %s %d %d %f %f %f %f' %( + name, bonType, particle1, particle2, kappa_start, kappa_stop, + centre_start, centre_stop)) + return outf + +########## + +def generate_time_dependent_colvars_list(steering_pairs, + outfile, + colvar_dump_freq, + colvars_header='# collective variable: monitor distances\n\ncolvarsTrajFrequency %i # output every %i steps\ncolvarsRestartFrequency 1000000\n', + colvars_template=''' + +colvar { + name %s + # %s %s %i + width 1.0 + distance { + group1 { + atomNumbers %i + } + group2 { + atomNumbers %i + } + } +}''', + colvars_harmonic_tail = ''' + +harmonic { + name h_pot_%s + colvars %s + forceConstant %f + targetForceConstant %f + centers %s + targetCenters %s + targetNumSteps %s + outputEnergy yes +}\n''', + colvars_harmonic_lower_bound_tail = ''' +harmonicBound { + name hlb_pot_%s + colvars %s + forceConstant %f + targetForceConstant %f + centers %f + targetCenters %f + targetNumSteps %s + outputEnergy yes +}\n''' + ): + + + """ + harmonicWalls { + name hlb_pot_%s + colvars %s + forceConstant %f # This is the force constant at time_point + targetForceConstant %f # This is the force constant at time_point+1 + centers %f # This is the equilibrium distance at time_point+1 + targetCenters %f # This is the equilibrium distance at time_point+1 + targetNumSteps %d # This is the number of timesteps between time_point and time_point+1 + outputEnergy yes + }\n''', + + + colvars_harmonic_lower_bound_tail = ''' + + harmonicBound { + name hlb_pot_%s + colvars %s + forceConstant %f # This is the force constant at time_point + targetForceConstant %f # This is the force constant at time_point+1 + centers %f # This is the equilibrium distance at time_point+1 + targetCenters %f # This is the equilibrium distance at time_point+1 + targetNumSteps %d # This is the number of timesteps between time_point and time_point+1 + outputEnergy yes + }\n''', + + Generates lammps colvars file http://lammps.sandia.gov/doc/PDF/colvars-refman-lammps.pdf + + :param dict steering_pairs: dictionary containing all the information to write down the + the input file for the colvars implementation + :param exisiting_template colvars_header: header template for colvars file. + :param exisiting_template colvars_template: contact template for colvars file. + :param exisiting_template colvars_tail: tail template for colvars file. + + """ + + #restraints[pair] = [time_dependent_restraints[time_point+1][pair][0], # Restraint type -> Is the one at time point time_point+1 + #time_dependent_restraints[time_point][pair][1]*10., # Initial spring constant + #time_dependent_restraints[time_point+1][pair][1]*10., # Final spring constant + #time_dependent_restraints[time_point][pair][2], # Initial equilibrium distance + #time_dependent_restraints[time_point+1][pair][2], # Final equilibrium distance + #int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point])] # Number of timesteps for the gradual change + + outf = open(outfile,'w') + #tfreq=10000 + #for pair in steering_pairs: + # if len(steering_pairs[pair][5]) >= 1: + # tfreq = int(steering_pairs[pair][5][0]/100) + # break + + tfreq = colvar_dump_freq + outf.write(colvars_header % (tfreq, tfreq)) + # Defining the particle pairs + for pair in steering_pairs: + + #print steering_pairs[pair] + sys.stdout.flush() + for i in range(len(steering_pairs[pair][0])): + name = "%s_%s_%s" % (i, int(pair[0])+1, int(pair[1])+1) + seqdist = abs(int(pair[1])-int(pair[0])) + region1 = "particle_%s" % (int(pair[0])+1) + region2 = "particle_%s" % (int(pair[1])+1) + + outf.write(colvars_template % (name,region1,region2,seqdist,int(pair[0])+1,int(pair[1])+1)) + + restraint_type = steering_pairs[pair][0][i] + kappa_start = steering_pairs[pair][1][i] + kappa_stop = steering_pairs[pair][2][i] + centre_start = steering_pairs[pair][3][i] + centre_stop = steering_pairs[pair][4][i] + timesteps_per_k_change = steering_pairs[pair][5][i] + + if restraint_type == "Harmonic": + outf.write(colvars_harmonic_tail % (name,name,kappa_start,kappa_stop,centre_start,centre_stop,timesteps_per_k_change)) + + if restraint_type == "HarmonicLowerBound": + outf.write(colvars_harmonic_lower_bound_tail % (name,name,kappa_start,kappa_stop,centre_start,centre_stop,timesteps_per_k_change)) + + + + + outf.flush() + + outf.close() + +########## + +def get_time_dependent_colvars_list(time_dependent_steering_pairs): + + """ + Generates lammps colvars file http://lammps.sandia.gov/doc/PDF/colvars-refman-lammps.pdf + + :param dict time_dependent_steering_pairs: dictionary containing all the information to write down the + the input file for the colvars implementation + """ + + # Getting the input + # XXXThe target_pairs_file could be also a list as the one in output of get_HiCbased_restraintsXXX + target_pairs = time_dependent_steering_pairs['colvar_input'] + outfile = time_dependent_steering_pairs['colvar_output'] + if 'chrlength' in time_dependent_steering_pairs: + chrlength = time_dependent_steering_pairs['chrlength'] + binsize = time_dependent_steering_pairs['binsize'] + if 'percentage_enforced_contacts' in time_dependent_steering_pairs: + percentage_enforced_contacts = time_dependent_steering_pairs['perc_enfor_contacts'] + else: + percentage_enforced_contacts = 100 + + # HiCbasedRestraints is a list of restraints returned by this function. + # Each entry of the list is a list of 5 elements describing the details of the restraint: + # 0 - particle_i + # 1 - particle_j + # 2 - type_of_restraint = Harmonic or HarmonicLowerBound or HarmonicUpperBound + # 3 - the kforce of the restraint + # 4 - the equilibrium (or maximum or minimum respectively) distance associated to the restraint + + # Here we extract from all the restraints only a random sub-sample + # of percentage_enforced_contacts/100*totcolvars + rand_lines = [] + i=0 + j=0 + if isinstance(target_pairs, str): + time_dependent_restraints = {} + totcolvars = linecount(target_pairs) + ncolvars = int(totcolvars*(float(percentage_enforced_contacts)/100)) + + #print "Number of enforced contacts = %i over %i" % (ncolvars,totcolvars) + rand_positions = sample(list(range(totcolvars)), ncolvars) + rand_positions = sorted(rand_positions) + + with open(target_pairs) as f: + for line in f: + line = line.strip() + if j >= ncolvars: + break + if line.startswith('#') or line == "": + continue + + # Line format: timepoint,particle1,particle2,restraint_type,kforce,distance + cols_vals = line.split() + + if int(cols_vals[1]) < int(cols_vals[2]): + pair = (int(cols_vals[1]), int(cols_vals[2])) + else: + pair = (int(cols_vals[2]), int(cols_vals[1])) + + try: + if pair in time_dependent_restraints[int(cols_vals[0])]: + print("WARNING: Check your restraint list! pair %s is repeated in time point %s!" % (pair, int(cols_vals[0]))) + # List content: restraint_type,kforce,distance + time_dependent_restraints[int(cols_vals[0])][pair] = [cols_vals[3], + float(cols_vals[4]), + float(cols_vals[5])] + except: + time_dependent_restraints[int(cols_vals[0])] = {} + # List content: restraint_type,kforce,distance + time_dependent_restraints[int(cols_vals[0])][pair] = [cols_vals[3], + float(cols_vals[4]), + float(cols_vals[5])] + if i == rand_positions[j]: + rand_lines.append(line) + j += 1 + i += 1 + elif isinstance(target_pairs, list): + time_dependent_restraints = dict((i,{}) for i in range(len(target_pairs))) + for time_point, HiCR in enumerate(target_pairs): + rand_lines = HiCR.get_hicbased_restraints() + totcolvars = len(rand_lines) + ncolvars = int(totcolvars*(float(percentage_enforced_contacts)/100)) + + #print "Number of enforced contacts = %i over %i" % (ncolvars,totcolvars) + rand_positions = sample(list(range(totcolvars)), ncolvars) + rand_positions = sorted(rand_positions) + + for cols_vals in rand_lines: + + if cols_vals[2] != "Harmonic" and cols_vals[2] != "HarmonicLowerBound": + continue + if int(cols_vals[0]) < int(cols_vals[1]): + pair = (int(cols_vals[0]), int(cols_vals[1])) + else: + pair = (int(cols_vals[1]), int(cols_vals[0])) + + if pair in time_dependent_restraints[time_point]: + print("WARNING: Check your restraint list! pair %s is repeated in time point %s!" % (pair, time_point)) + # List content: restraint_type,kforce,distance + time_dependent_restraints[time_point][pair] = [cols_vals[2], + float(cols_vals[3]), + float(cols_vals[4])] + + else: + print("Unknown target_pairs") + return + +# for time_point in sorted(time_dependent_restraints.keys()): +# for pair in time_dependent_restraints[time_point]: +# print "#Time_dependent_restraints", time_point,pair, time_dependent_restraints[time_point][pair] + return time_dependent_restraints + +### TODO Add the option to add also spheres of different radii (e.g. to simulate nucleoli) +########## Part to generate the initial conformation ########## +def generate_chromosome_random_walks_conformation ( chromosome_particle_numbers , + confining_environment=['sphere',100.] , + particle_radius=0.5 , + seed_of_the_random_number_generator=1 , + number_of_conformations=1, + outfile="Initial_random_walk_conformation.dat", + pbc=False, + center=True): + """ + Generates lammps initial conformation file by random walks + + :param chromosome_particle_numbers: list with the number of particles of each chromosome. + :param ['sphere',100.] confining_environment: dictionary with the confining environment of the conformation + Possible confining environments: + ['cube',edge_width] + ['sphere',radius] + ['ellipsoid',x-semiaxes, y-semiaxes, z-semiaxes] + ['cylinder', basal radius, height] + :param 0.5 particle_radius: Radius of each particle. + :param 1 seed_of_the_random_number_generator: random seed. + :param 1 number_of_conformations: copies of the conformation. + :param outfile: file where to store resulting initial conformation file + + """ + seed(seed_of_the_random_number_generator) + + # This allows to organize the largest chromosomes first. + # This is to get a better acceptance of the chromosome positioning. + chromosome_particle_numbers = [int(x) for x in chromosome_particle_numbers] + chromosome_particle_numbers.sort(key=int,reverse=True) + + for cnt in range(number_of_conformations): + + final_random_walks = generate_random_walks(chromosome_particle_numbers, + particle_radius, + confining_environment, + pbc=pbc, + center=center) + + # Writing the final_random_walks conformation + #print "Succesfully generated conformation number %d\n" % (cnt+1) + write_initial_conformation_file(final_random_walks, + chromosome_particle_numbers, + confining_environment, + out_file=outfile) + +########## + +def generate_chromosome_rosettes_conformation ( chromosome_particle_numbers , + fractional_radial_positions=None, + confining_environment=['sphere',100.] , + rosette_radius=12.0 , particle_radius=0.5 , + seed_of_the_random_number_generator=1 , + number_of_conformations=1, + outfile = "Initial_rosette_conformation.dat"): + """ + Generates lammps initial conformation file by rosettes conformation + + :param chromosome_particle_numbers: list with the number of particles of each chromosome. + :param None fractional_radial_positions: list with fractional radial positions for all the chromosomes. + :param ['sphere',100.] confining_environment: dictionary with the confining environment of the conformation + Possible confining environments: + ['cube',edge_width] + ['sphere',radius] + ['ellipsoid',x-semiaxes, y-semiaxes, z-semiaxes] + ['cylinder', basal radius, height] + :param 0.5 particle_radius: Radius of each particle. + :param 1 seed_of_the_random_number_generator: random seed. + :param 1 number_of_conformations: copies of the conformation. + :param outfile: file where to store resulting initial conformation file + + """ + seed(seed_of_the_random_number_generator) + + # This allows to organize the largest chromosomes first. + # This is to get a better acceptance of the chromosome positioning. + chromosome_particle_numbers = [int(x) for x in chromosome_particle_numbers] + chromosome_particle_numbers.sort(key=int,reverse=True) + + initial_rosettes , rosettes_lengths = generate_rosettes(chromosome_particle_numbers, + rosette_radius, + particle_radius) + print(rosettes_lengths) + + + # Constructing the rosettes conformations + for cnt in range(number_of_conformations): + + particle_inside = 0 # 0 means a particle is outside + particles_overlap = 0 # 0 means two particles are overlapping + while particle_inside == 0 or particles_overlap == 0: + particle_inside = 1 + particles_overlap = 1 + segments_P1 = [] + segments_P0 = [] + side = 0 + init_rosettes = copy.deepcopy(initial_rosettes) + + # Guess of the initial segment conformation: + # 1 - each rod is placed inside the confining evironment + # in a random position and with random orientation + # 2 - possible clashes between generated rods are checked + if fractional_radial_positions: + if len(fractional_radial_positions) != len(chromosome_particle_numbers): + print("Please provide the desired fractional radial positions for all the chromosomes") + sys.exit() + segments_P1 , segments_P0 = generate_rods_biased_conformation(rosettes_lengths, rosette_radius, + confining_environment, + fractional_radial_positions, + max_number_of_temptative=100000) + else: + segments_P1 , segments_P0 = generate_rods_random_conformation(rosettes_lengths, rosette_radius, + confining_environment, + max_number_of_temptative=100000) + + # Roto-translation of the rosettes according to the segment position and orientation + final_rosettes = rosettes_rototranslation(init_rosettes, segments_P1, segments_P0) + + # Checking that the beads are all inside the confining environment and are not overlapping + for rosette_pair in list(combinations(final_rosettes,2)): + molecule0 = list(zip(rosette_pair[0]['x'],rosette_pair[0]['y'],rosette_pair[0]['z'])) + molecule1 = list(zip(rosette_pair[1]['x'],rosette_pair[1]['y'],rosette_pair[1]['z'])) + distances = scipy.spatial.distance.cdist(molecule1,molecule0) + print(len(molecule0),len(molecule0[0]),distances.min()) + if distances.min() < particle_radius*2.0*0.95: + particles_overlap = 0 + break + + if particles_overlap != 0: + for r in xrange(len(final_rosettes)): + molecule0 = list(zip(final_rosettes[r]['x'],final_rosettes[r]['y'],final_rosettes[r]['z'])) + print(len(molecule0),len(molecule0[0])) + + distances = scipy.spatial.distance.cdist(molecule0,molecule0) + print(distances.min()) + for i in xrange(len(molecule0)): + for j in xrange(i+1,len(molecule0)): + if distances[(i,j)] < particle_radius*2.0*0.95: + particles_overlap = 0 + if particles_overlap == 0: + break + if particles_overlap == 0: + break + if particles_overlap == 0: + break + + # Writing the final_rosettes conformation + print("Succesfully generated conformation number %d\n" % (cnt+1)) + write_initial_conformation_file(final_rosettes, + chromosome_particle_numbers, + confining_environment, + out_file=outfile) + +########## + +def generate_chromosome_rosettes_conformation_with_pbc ( chromosome_particle_numbers , + fractional_radial_positions=None, + confining_environment=['cube',100.] , + rosette_radius=12.0 , particle_radius=0.5 , + seed_of_the_random_number_generator=1 , + number_of_conformations=1, + outfile = "Initial_rosette_conformation_with_pbc.dat"): + """ + Generates lammps initial conformation file by rosettes conformation + + :param chromosome_particle_numbers: list with the number of particles of each chromosome. + :param None fractional_radial_positions: list with fractional radial positions for all the chromosomes. + :param ['cube',100.] confining_environment: dictionary with the confining environment of the conformation + Possible confining environments: + ['cube',edge_width] + :param 0.5 particle_radius: Radius of each particle. + :param 1 seed_of_the_random_number_generator: random seed. + :param 1 number_of_conformations: copies of the conformation. + :param outfile: file where to store resulting initial conformation file + + """ + seed(seed_of_the_random_number_generator) + + # This allows to organize the largest chromosomes first. + # This is to get a better acceptance of the chromosome positioning. + chromosome_particle_numbers = [int(x) for x in chromosome_particle_numbers] + chromosome_particle_numbers.sort(key=int,reverse=True) + + initial_rosettes , rosettes_lengths = generate_rosettes(chromosome_particle_numbers, + rosette_radius, + particle_radius) + print(rosettes_lengths) + + + # Constructing the rosettes conformations + for cnt in range(number_of_conformations): + + particles_overlap = 0 # 0 means two particles are overlapping + while particles_overlap == 0: + particles_overlap = 1 + segments_P1 = [] + segments_P0 = [] + side = 0 + init_rosettes = copy.deepcopy(initial_rosettes) + + # Guess of the initial segment conformation: + # 1 - each rod is placed in a random position and with random orientation + # 2 - possible clashes between generated rods are checked taking into account pbc + segments_P1 , segments_P0 = generate_rods_random_conformation_with_pbc ( + rosettes_lengths, + rosette_radius, + confining_environment, + max_number_of_temptative=100000) + + # Roto-translation of the rosettes according to the segment position and orientation + final_rosettes = rosettes_rototranslation(init_rosettes, segments_P1, segments_P0) + + # Checking that the beads once folded inside the simulation box (for pbc) are not overlapping + folded_rosettes = copy.deepcopy(final_rosettes) + for r in range(len(folded_rosettes)): + particle = 0 + for x, y, z in zip(folded_rosettes[r]['x'],folded_rosettes[r]['y'],folded_rosettes[r]['z']): + #inside_1 = check_point_inside_the_confining_environment(x, y, z, + # particle_radius, + # confining_environment) + #if inside_1 == 0: + # print inside_1, r, particle, x, y, z + + while x > (confining_environment[1]*0.5): + x -= confining_environment[1] + while x < -(confining_environment[1]*0.5): + x += confining_environment[1] + + while y > (confining_environment[1]*0.5): + y -= confining_environment[1] + while y < -(confining_environment[1]*0.5): + y += confining_environment[1] + + while z > (confining_environment[1]*0.5): + z -= confining_environment[1] + while z < -(confining_environment[1]*0.5): + z += confining_environment[1] + + #inside_2 = check_point_inside_the_confining_environment(x, y, z, + # particle_radius, + # confining_environment) + #if inside_2 == 1 and inside_1 == 0: + # print inside_2, r, particle, x, y, z + folded_rosettes[r]['x'][particle] = x + folded_rosettes[r]['y'][particle] = y + folded_rosettes[r]['z'][particle] = z + particle += 1 + + for rosette_pair in list(combinations(folded_rosettes,2)): + + for x0,y0,z0 in zip(rosette_pair[0]['x'],rosette_pair[0]['y'],rosette_pair[0]['z']): + for x1,y1,z1 in zip(rosette_pair[1]['x'],rosette_pair[1]['y'],rosette_pair[1]['z']): + + particles_overlap = check_particles_overlap(x0,y0,z0,x1,y1,z1,particle_radius) + + if particles_overlap == 0: # 0 means that the particles are overlapping -> PROBLEM!!! + print("Particle",x0,y0,z0,"and",x1,y1,z1,"overlap\n") + break + if particles_overlap == 0: + break + if particles_overlap == 0: + break + + # Writing the final_rosettes conformation + print("Succesfully generated conformation number %d\n" % (cnt+1)) + write_initial_conformation_file(final_rosettes, + chromosome_particle_numbers, + confining_environment, + out_file=outfile) + +########## + +def generate_rosettes(chromosome_particle_numbers, rosette_radius, particle_radius): + # Genaration of the rosettes + # XXXA. Rosa publicationXXX + # List to contain the rosettes and the rosettes lengths + rosettes = [] + rosettes_lengths = [] + + for number_of_particles in chromosome_particle_numbers: + + # Variable to build the chain + phi = 0.0 + + # Dictory of lists to contain the rosette + rosette = {} + rosette['x'] = [] + rosette['y'] = [] + rosette['z'] = [] + + # Position of the first particle (x_0, 0.0, 0.0) + k = 6. + x = 0.38 + p = 1.0 + rosette['x'].append(rosette_radius * (x + (1 - x) * cos(k*phi) * cos(k*phi)) * cos(phi)) + rosette['y'].append(rosette_radius * (x + (1 - x) * cos(k*phi) * cos(k*phi)) * sin(phi)) + rosette['z'].append(p * phi / (2.0 * pi)) + #print "First bead is in position: %f %f %f" % (rosette['x'][0], rosette['y'][0], rosette['z'][0]) + + # Building the chain: The rosette is growing along the positive z-axes + for particle in range(1,number_of_particles): + + distance = 0.0 + while distance < (particle_radius*2.0): + phi = phi + 0.001 + x_tmp = rosette_radius * (x + (1 - x) * cos(k*phi) * cos(k*phi)) * cos(phi) + y_tmp = rosette_radius * (x + (1 - x) * cos(k*phi) * cos(k*phi)) * sin(phi) + z_tmp = phi / (2.0 * pi) + distance = sqrt((x_tmp - rosette['x'][-1])*(x_tmp - rosette['x'][-1]) + + (y_tmp - rosette['y'][-1])*(y_tmp - rosette['y'][-1]) + + (z_tmp - rosette['z'][-1])*(z_tmp - rosette['z'][-1])) + + rosette['x'].append(x_tmp) + rosette['y'].append(y_tmp) + rosette['z'].append(z_tmp) + if distance > ((particle_radius*2.0)*1.2): + print("%f %d %d %d" % (distance, particle-1, particle)) + + rosettes.append(rosette) + rosettes_lengths.append(rosette['z'][-1]-rosette['z'][0]) + + return rosettes , rosettes_lengths + +########## + +def generate_rods_biased_conformation(rosettes_lengths, rosette_radius, + confining_environment, + fractional_radial_positions, + max_number_of_temptative=100000): + # Construction of the rods initial conformation + segments_P0 = [] + segments_P1 = [] + + if confining_environment[0] != 'sphere': + print("ERROR: Biased chromosome positioning is currently implemented") + print("only for spherical confinement. If you need other shapes, please") + print("contact the developers") + + for length , target_radial_position in zip(rosettes_lengths,fractional_radial_positions): + tentative = 0 + clashes = 0 # 0 means that there is an clash -> PROBLEM + best_radial_position = 1.0 + best_radial_distance = 1.0 + best_segment_P0 = [] + best_segment_P1 = [] + + # Positioning the rods + while tentative < 100000 and best_radial_distance > 0.00005: + + print("Length = %f" % length) + + print("Trying to position terminus 0") + segment_P0_tmp = [] + segment_P0_tmp = draw_point_inside_the_confining_environment(confining_environment, + rosette_radius) + print("Successfully positioned terminus 0: %f %f %f" % (segment_P0_tmp[0], segment_P0_tmp[1], segment_P0_tmp[2])) + + print("Trying to position terminus 1") + segment_P1_tmp = [] + segment_P1_tmp = draw_second_extreme_of_a_segment_inside_the_confining_environment(segment_P0_tmp[0], + segment_P0_tmp[1], + segment_P0_tmp[2], + length, + rosette_radius, + confining_environment) + print("Successfully positioned terminus 1: %f %f %f" % (segment_P1_tmp[0], segment_P1_tmp[1], segment_P1_tmp[2])) + + # Check clashes with the previously positioned rods + clashes = 1 + for segment_P1,segment_P0 in zip(segments_P1,segments_P0): + clashes = check_segments_clashes(segment_P1, + segment_P0, + segment_P1_tmp, + segment_P0_tmp, + rosette_radius) + if clashes == 0: + break + + if clashes == 1: + # Check whether the midpoint of the segment is close to the target radial position + segment_midpoint = [] + segment_midpoint.append((segment_P0_tmp[0] + segment_P1_tmp[0])*0.5) + segment_midpoint.append((segment_P0_tmp[1] + segment_P1_tmp[1])*0.5) + segment_midpoint.append((segment_P0_tmp[2] + segment_P1_tmp[2])*0.5) + + radial_position = sqrt( ( segment_midpoint[0] * segment_midpoint[0] + + segment_midpoint[1] * segment_midpoint[1] + + segment_midpoint[2] * segment_midpoint[2] ) / + (confining_environment[1]*confining_environment[1])) + + radial_distance = fabs(radial_position-target_radial_position) + + print(radial_position , target_radial_position , radial_distance , best_radial_distance , tentative) + + # If the midpoint of the segment is closer to the target radial position than the + # previous guesses. Store the points as the best guesses! + if radial_distance < best_radial_distance: + best_radial_distance = radial_distance + best_radial_position = radial_position + best_tentative = tentative+1 # The variable tentative starts from 0 + + best_segment_P0 = [] + best_segment_P1 = [] + for component_P0 , component_P1 in zip(segment_P0_tmp,segment_P1_tmp): + best_segment_P0.append(component_P0) + best_segment_P1.append(component_P1) + + tentative = tentative + 1 + + if best_segment_P0 == []: + print("Valid placement not found for chromosome rosette after %d tentatives" % tentative) + sys.exit() + + print("Successfully positioned chromosome of length %lf at tentative %d of %d tentatives" % (length, best_tentative, tentative)) + segments_P0.append(best_segment_P0) + segments_P1.append(best_segment_P1) + + print("Successfully generated rod conformation!") + return segments_P1 , segments_P0 + +########## + +def generate_rods_random_conformation(rosettes_lengths, rosette_radius, + confining_environment, + max_number_of_temptative=100000): + # Construction of the rods initial conformation + segments_P0 = [] + segments_P1 = [] + + for length in rosettes_lengths: + tentative = 0 + clashes = 0 + # Random positioning of the rods + while tentative < 100000 and clashes == 0: + + tentative += 1 + clashes = 1 + #print "Length = %f" % length + + print("Trying to position terminus 0") + #pick uniformly within the confining environment using the rejection method + first_point = [] + first_point = draw_point_inside_the_confining_environment(confining_environment, + rosette_radius) + + print("Successfully positioned terminus 0: %f %f %f" % (first_point[0], first_point[1], first_point[2])) + + print("Trying to position terminus 1") + #pick from P0 another point one the sphere of radius length inside the confining environment + last_point = [] + last_point = draw_second_extreme_of_a_segment_inside_the_confining_environment(first_point[0], + first_point[1], + first_point[2], + length, + rosette_radius, + confining_environment) + + print("Successfully positioned terminus 1: %f %f %f" % (last_point[0], last_point[1], last_point[2])) + + # Check clashes with the previously positioned rods + clashes = 1 + for segment_P1,segment_P0 in zip(segments_P1,segments_P0): + clashes = check_segments_clashes(segment_P1, + segment_P0, + last_point, + first_point, + rosette_radius) + if clashes == 0: + break + + #print clashes + print("Successfully positioned chromosome of length %lf at tentative %d\n" % (length, tentative)) + segments_P1.append(last_point) + segments_P0.append(first_point) + + print("Successfully generated rod conformation!") + return segments_P1 , segments_P0 + +########## + +def generate_rods_random_conformation_with_pbc(rosettes_lengths, rosette_radius, + confining_environment, + max_number_of_temptative=100000): + + # Construction of the rods initial conformation + segments_P0 = [] + segments_P1 = [] + + for length in rosettes_lengths: + tentative = 0 + clashes = 0 + # Random positioning of the rods + while tentative < 100000 and clashes == 0: + + tentative += 1 + clashes = 1 + #print "Length = %f" % length + + print("Trying to position terminus 0") + #pick uniformly within the confining environment using the rejection method + first_point = [] + first_point = draw_point_inside_the_confining_environment(confining_environment, + rosette_radius) + + print("Successfully positioned terminus 0: %f %f %f" % (first_point[0], first_point[1], first_point[2])) + + print("Trying to position terminus 1") + #pick from P0 another point one the sphere of radius length inside the confining environment + last_point = [] + last_point = draw_second_extreme_of_a_segment(first_point[0], + first_point[1], + first_point[2], + length, + rosette_radius) + + print(last_point) + # Check clashes with the previously positioned rods + for segment_P1,segment_P0 in zip(segments_P1,segments_P0): + clashes = check_segments_clashes_with_pbc(segment_P1, + segment_P0, + last_point, + first_point, + rosette_radius, + confining_environment) + if clashes == 0: + break + + #print clashes + print("Successfully positioned chromosome of length %lf at tentative %d\n" % (length, tentative)) + segments_P1.append(last_point) + segments_P0.append(first_point) + + print("Successfully generated rod conformation!") + return segments_P1 , segments_P0 + +########## + +def generate_random_walks(chromosome_particle_numbers, + particle_radius, + confining_environment, + center, + pbc=False): + # Construction of the random walks initial conformation + random_walks = [] + + for number_of_particles in chromosome_particle_numbers: + #print "Trying to position random walk" + random_walk = {} + random_walk['x'] = [] + random_walk['y'] = [] + random_walk['z'] = [] + + + #print "Positioning first particle" + particle_overlap = 0 + while particle_overlap == 0: + particle_overlap = 1 + first_particle = [] + first_particle = draw_point_inside_the_confining_environment(confining_environment, + particle_radius) + + # Check if the particle is overlapping with any other particle in the system + for rand_walk in random_walks: + if pbc: + particle_overlap = check_particle_vs_all_overlap(first_particle[0], + first_particle[1], + first_particle[2], + rand_walk, + 2.0*particle_radius) + else: + particle_overlap = check_particle_vs_all_overlap(first_particle[0], + first_particle[1], + first_particle[2], + rand_walk, + 2.0*particle_radius) + + if particle_overlap == 0: + break + + random_walk['x'].append(first_particle[0]) + random_walk['y'].append(first_particle[1]) + random_walk['z'].append(first_particle[2]) + + for particle in range(1,number_of_particles): + #print "Positioning particle %d" % (particle+1) + particle_overlap = 0 # 0 means that there is an overlap -> PROBLEM + overlapCounter = -1 + maxIter = 1000 + while particle_overlap == 0: + overlapCounter += 1 + if overlapCounter > maxIter: + # raise error so log file is created to avoid k_seed + errorName = 'ERROR: Initial conformation non ending loop' + raise InitalConformationError(errorName) + particle_overlap = 1 + new_particle = [] + if pbc: + new_particle = draw_second_extreme_of_a_segment( + random_walk['x'][-1], + random_walk['y'][-1], + random_walk['z'][-1], + 2.0*particle_radius, + 2.0*particle_radius) + else: + new_particle = draw_second_extreme_of_a_segment_inside_the_confining_environment( + random_walk['x'][-1], + random_walk['y'][-1], + random_walk['z'][-1], + 2.0*particle_radius, + 2.0*particle_radius, + confining_environment) + + # Check if the particle is overlapping with any other particle in the system + for rand_walk in random_walks: + particle_overlap = check_particle_vs_all_overlap(new_particle[0], + new_particle[1], + new_particle[2], + rand_walk, + 2.0*particle_radius) + if particle_overlap == 0: + break + if particle_overlap == 0: + continue + + # The current random walk is not yet in the list above + particle_overlap = check_particle_vs_all_overlap(new_particle[0], + new_particle[1], + new_particle[2], + random_walk, + 2.0*particle_radius) + if particle_overlap == 0: + continue + + random_walk['x'].append(new_particle[0]) + random_walk['y'].append(new_particle[1]) + random_walk['z'].append(new_particle[2]) + + #print "Successfully positioned random walk of %d particles" % number_of_particles + random_walks.append(random_walk) + + #print "Successfully generated random walk conformation!" + if center: + for random_walk in random_walks: + x_com, y_com, z_com = (0.0,0.0,0.0) + cnt = 0 + for (x,y,z) in zip(random_walk['x'],random_walk['y'],random_walk['z']): + x_com += x + y_com += y + z_com += z + cnt += 1 + x_com, y_com, z_com = (x_com/cnt,y_com/cnt,z_com/cnt) + + for i in range(len(random_walk['x'])): + random_walk['x'][i] -= x_com + random_walk['y'][i] -= y_com + random_walk['z'][i] -= z_com + + x_com, y_com, z_com = (0.0,0.0,0.0) + cnt = 0 + for (x,y,z) in zip(random_walk['x'],random_walk['y'],random_walk['z']): + x_com += x + y_com += y + z_com += z + cnt += 1 + x_com, y_com, z_com = (x_com/cnt,y_com/cnt,z_com/cnt) + + return random_walks + +########## + +def check_particle_vs_all_overlap(x,y,z,chromosome,overlap_radius): + particle_overlap = 1 + + for x0, y0, z0 in zip(chromosome['x'],chromosome['y'],chromosome['z']): + particle_overlap = check_particles_overlap(x0,y0,z0,x,y,z,overlap_radius) + if particle_overlap == 0: + return particle_overlap + + return particle_overlap + +########## + +def draw_second_extreme_of_a_segment_inside_the_confining_environment(x0, y0, z0, + segment_length, + object_radius, + confining_environment): + inside = 0 + while inside == 0: + particle = [] + temp_theta = arccos(2.0*random()-1.0) + temp_phi = 2*pi*random() + particle.append(x0 + segment_length * cos(temp_phi) * sin(temp_theta)) + particle.append(y0 + segment_length * sin(temp_phi) * sin(temp_theta)) + particle.append(z0 + segment_length * cos(temp_theta)) + # Check if the particle is inside the confining_environment + inside = check_point_inside_the_confining_environment(particle[0], + particle[1], + particle[2], + object_radius, + confining_environment) + + return particle + +########## + +def draw_second_extreme_of_a_segment(x0, y0, z0, + segment_length, + object_radius): + particle = [] + temp_theta = arccos(2.0*random()-1.0) + temp_phi = 2*pi*random() + particle.append(x0 + segment_length * cos(temp_phi) * sin(temp_theta)) + particle.append(y0 + segment_length * sin(temp_phi) * sin(temp_theta)) + particle.append(z0 + segment_length * cos(temp_theta)) + + return particle + +########## + +def draw_point_inside_the_confining_environment(confining_environment, object_radius): + #pick a point uniformly within the confining environment using the rejection method + + if confining_environment[0] == 'cube': + dimension_x = confining_environment[1] * 0.5 + dimension_y = confining_environment[1] * 0.5 + dimension_z = confining_environment[1] * 0.5 + if len(confining_environment) > 2: + print("# WARNING: Defined a cubical confining environment with reduntant paramenters.") + print("# Only 2 are needed the identifier and the side") + + if confining_environment[0] == 'sphere': + dimension_x = confining_environment[1] + dimension_y = confining_environment[1] + dimension_z = confining_environment[1] + if len(confining_environment) > 2: + print("# WARNING: Defined a spherical confining environment with reduntant paramenters.") + print("# Only 2 are needed the identifier and the radius") + + if confining_environment[0] == 'ellipsoid': + if len(confining_environment) < 4: + print("# ERROR: Defined an ellipsoidal confining environment without the necessary paramenters.") + print("# 4 are needed the identifier, the x-semiaxes, the y-semiaxes, and the z-semiaxes") + sys.exit() + dimension_x = confining_environment[1] + dimension_y = confining_environment[2] + dimension_z = confining_environment[3] + + if confining_environment[0] == 'cylinder': + if len(confining_environment) < 3: + print("# WARNING: Defined a cylindrical confining environment without the necessary paramenters.") + print("# 3 are needed the identifier, the basal radius, and the height") + sys.exit() + dimension_x = confining_environment[1] + dimension_y = confining_environment[1] + dimension_z = confining_environment[2] + + inside = 0 + while inside == 0: + particle = [] + particle.append((2.0*random()-1.0)*(dimension_x - object_radius)) + particle.append((2.0*random()-1.0)*(dimension_y - object_radius)) + particle.append((2.0*random()-1.0)*(dimension_z - object_radius)) + # Check if the particle is inside the confining_environment + inside = check_point_inside_the_confining_environment(particle[0], + particle[1], + particle[2], + object_radius, + confining_environment) + + return particle + +########## + +def check_point_inside_the_confining_environment(Px, Py, Pz, + object_radius, + confining_environment): + # The shapes are all centered in the origin + # - sphere : radius r + # - cube : side + # - cylinder : basal radius , height + # - ellipsoid : semi-axes a , b , c ; + + if confining_environment[0] == 'sphere': + radius = confining_environment[1] - object_radius + if ((Px*Px)/(radius*radius) + (Py*Py)/(radius*radius) + (Pz*Pz)/(radius*radius)) < 1.0 : return 1 + + if confining_environment[0] == 'ellipsoid': + a = confining_environment[1] - object_radius + b = confining_environment[2] - object_radius + c = confining_environment[3] - object_radius + if ((Px*Px)/(a*a) + (Py*Py)/(b*b) + (Pz*Pz)/(c*c)) < 1.0 : return 1 + + if confining_environment[0] == 'cube': + hside = confining_environment[1] * 0.5 - object_radius + if (((Px*Px)/(hside*hside)) < 1.0) and (((Py*Py)/(hside*hside)) < 1.0) and (((Pz*Pz)/(hside*hside)) < 1.0) : return 1 + + if confining_environment[0] == 'cylinder': + radius = confining_environment[1] - object_radius + half_height = confining_environment[2]*0.5 - object_radius + if (((Px*Px)/(radius*radius) + (Py*Py)/(radius*radius)) < 1.0) and (((Pz*Pz)/(half_height*half_height)) < 1.0): return 1 + + return 0 + +########## + +def check_segments_clashes(s1_P1, s1_P0, s2_P1, s2_P0, rosette_radius): + + # Check steric clashes without periodic boundary conditions + if distance_between_segments(s1_P1, s1_P0, s2_P1, s2_P0) < 2.0*rosette_radius: + # print "Clash between segments",s1_P1,s1_P0,"and",s2_P1_tmp,s2_P0_tmp,"at distance", distance + return 0 + + return 1 + +########## + +def check_segments_clashes_with_pbc(s1_P1, s1_P0, s2_P1, s2_P0, + rosette_radius, + confining_environment): + + # Check steric clashes with periodic boundary conditions + if distance_between_segments(s1_P1, s1_P0, s2_P1, s2_P0) < 2.0*rosette_radius: + # print "Clash between segments",s1_P1,s1_P0,"and",s2_P1_tmp,s2_P0_tmp,"at distance", distance + return 0 + + return 1 + +########## + +def distance_between_segments(s1_P1, s1_P0, s2_P1, s2_P0): + + # Inspiration: http://softsurfer.com/Archive/algorithm_0106/algorithm_0106.htm + # Copyright 2001, softSurfer (www.softsurfer.com) + # This code may be freely used and modified for any purpose + # providing that this copyright notice is included with it. + # SoftSurfer makes no warranty for this code, and cannot be held + # liable for any real or imagined damage resulting from its use. + # Users of this code must verify correctness for their application. + + u = [] + v = [] + w = [] + dP = [] + + for c_s1_P1,c_s1_P0,c_s2_P1,c_s2_P0 in zip(s1_P1, s1_P0, s2_P1, s2_P0): + u.append(c_s1_P1 - c_s1_P0) + v.append(c_s2_P1 - c_s2_P0) + w.append(c_s1_P0 - c_s2_P0) + + a = scalar_product(u, u) + b = scalar_product(u, v) + c = scalar_product(v, v) + d = scalar_product(u, w) + e = scalar_product(v, w) + + D = a*c - b*b + sD = tD = D + + if D < (1.0e-7): + # Segments almost parallel + sN = 0.0 + sD = 1.0 + tN = e + tD = c + else: + # Get the closest points on the infinite lines + sN = (b*e - c*d) + tN = (a*e - b*d) + if (sN < 0.0): + # sc < 0 => the s=0 edge is visible + sN = 0.0 + tN = e + tD = c + elif sN > sD: # sc > 1 => the s=1 edge is visible + sN = sD + tN = e + b + tD = c + + if tN < 0.0: # tc < 0 => the t=0 edge is visible + tN = 0.0 + # Recompute sc for this edge + if -d < 0.0: + sN = 0.0 + elif -d > a: + sN = sD + else: + sN = -d + sD = a + + elif tN > tD: # tc > 1 => the t=1 edge is visible + tN = tD + # Recompute sc for this edge + if (-d + b) < 0.0: + sN = 0 + elif (-d + b) > a: + sN = sD; + else: + sN = (-d + b) + sD = a + + # Finally do the division to get sc and tc + if abs(sN) < (1.0e-7): + sc = 0.0 + else: + sc = sN / sD + + if abs(tN) < (1.0e-7): + tc = 0.0 + else: + tc = tN / tD + + # Get the difference of the two closest points + for i in range(len(w)): + dP.append(w[i] + ( sc * u[i] ) - ( tc * v[i] )) # = S1(sc) - S2(tc) + + return norm(dP) # return the closest distance + +########## + +def rosettes_rototranslation(rosettes, segments_P1, segments_P0): + + for i in range(len(segments_P1)): + vector = [] + theta = [] + + for component_P1 , component_P0 in zip(segments_P1[i], segments_P0[i]): + vector.append(component_P1-component_P0) + + # Rotation Angles + theta.append(atan2(vector[1],vector[2])) + + x_temp_2 = vector[0] + y_temp_2 = cos(theta[0]) * vector[1] - sin(theta[0]) * vector[2] + z_temp_2 = sin(theta[0]) * vector[1] + cos(theta[0]) * vector[2] + theta.append(atan2(x_temp_2,z_temp_2)) + + x_temp_1 = cos(theta[1]) * x_temp_2 - sin(theta[1]) * z_temp_2 + y_temp_1 = y_temp_2 + z_temp_1 = sin(theta[1]) * x_temp_2 + cos(theta[1]) * z_temp_2 + + if(z_temp_1 < 0.0): + z_temp_1 = -z_temp_1 + theta.append(pi) + else: + theta.append(0.0) + #print x_temp_1 , y_temp_1 , z_temp_1 + + # Chromosome roto-translations + for particle in range(len(rosettes[i]['x'])): + + x_temp_2 = rosettes[i]['x'][particle] + y_temp_2 = cos(theta[2]) * rosettes[i]['y'][particle] + sin(theta[2]) * rosettes[i]['z'][particle] + z_temp_2 = - sin(theta[2]) * rosettes[i]['y'][particle] + cos(theta[2]) * rosettes[i]['z'][particle] + + x_temp_1 = cos(theta[1]) * x_temp_2 + sin(theta[1]) * z_temp_2 + y_temp_1 = y_temp_2 + z_temp_1 = - sin(theta[1]) * x_temp_2 + cos(theta[1]) * z_temp_2 + + x = x_temp_1; + y = cos(theta[0]) * y_temp_1 + sin(theta[0]) * z_temp_1; + z = - sin(theta[0]) * y_temp_1 + cos(theta[0]) * z_temp_1; + + # Chromosome translations + rosettes[i]['x'][particle] = segments_P0[i][0] + x; + rosettes[i]['y'][particle] = segments_P0[i][1] + y; + rosettes[i]['z'][particle] = segments_P0[i][2] + z; + return rosettes + +########## + +def scalar_product(a, b): + + scalar = 0.0 + for c_a,c_b in zip(a,b): + scalar = scalar + c_a*c_b + + return scalar + +########## + +def norm(a): + + return sqrt(scalar_product(a, a)) + +########## + +def write_initial_conformation_file(chromosomes, + chromosome_particle_numbers, + confining_environment, + out_file="Initial_conformation.dat"): + # Choosing the appropriate xlo, xhi...etc...depending on the confining environment + xlim = [] + ylim = [] + zlim = [] + if confining_environment[0] == 'sphere': + radius = confining_environment[1] + 1.0 + xlim.append(-radius) + xlim.append(radius) + ylim.append(-radius) + ylim.append(radius) + zlim.append(-radius) + zlim.append(radius) + + if confining_environment[0] == 'ellipsoid': + a = confining_environment[1] + 1.0 + b = confining_environment[2] + 1.0 + c = confining_environment[3] + 1.0 + xlim.append(-a) + xlim.append(a) + ylim.append(-b) + ylim.append(b) + zlim.append(-c) + zlim.append(c) + + if confining_environment[0] == 'cube': + hside = confining_environment[1] * 0.5 + 1.0 + xlim.append(-hside) + xlim.append(hside) + ylim.append(-hside) + ylim.append(hside) + zlim.append(-hside) + zlim.append(hside) + + if confining_environment[0] == 'cylinder': + radius = confining_environment[1] + 1.0 + hheight = confining_environment[2] * 0.5 + 1.0 + xlim.append(-radius) + xlim.append(radius) + ylim.append(-radius) + ylim.append(radius) + zlim.append(-hheight) + zlim.append(hheight) + + fileout = open(out_file,'w') + angle_types = 1 + bond_types = 1 + atom_types = 1 + n_chr=len(chromosomes) + n_atoms=0 + for n in chromosome_particle_numbers: + n_atoms+=n + + fileout.write("LAMMPS input data file \n\n") + fileout.write("%9d atoms\n" % (n_atoms)) + fileout.write("%9d bonds\n" % (n_atoms-n_chr)) + fileout.write("%9d angles\n\n" % (n_atoms-2*n_chr)) + fileout.write("%9s atom types\n" % atom_types) + fileout.write("%9s bond types\n" % bond_types) + fileout.write("%9s angle types\n\n" % angle_types) + fileout.write("%6.3lf %6.3lf xlo xhi\n" % (xlim[0], xlim[1])) + fileout.write("%6.3lf %6.3lf ylo yhi\n" % (ylim[0], ylim[1])) + fileout.write("%6.3lf %6.3lf zlo zhi\n" % (zlim[0], zlim[1])) + + fileout.write("\n Atoms \n\n") + particle_number = 1 + for chromosome in chromosomes: + for x,y,z in zip(chromosome['x'],chromosome['y'],chromosome['z']): + fileout.write("%-8d %s %s %7.4lf %7.4lf %7.4lf\n" % (particle_number, "1", "1", x, y, z)) + particle_number += 1 + + # for(i = 0; i < N_NUCL; i++) + # { + # k++; + # fileout.write("%5d %s %s %7.4lf %7.4lf %7.4lf \n", k, "1", "1", P[i][0], P[i][1], P[i][2]); + # } + + fileout.write("\n Bonds \n\n") + bond_number = 1 + first_particle_index = 1 + for chromosome in chromosomes: + for i in range(len(chromosome['x'])-1): + fileout.write("%-4d %s %4d %4d\n" % (bond_number, "1", first_particle_index, first_particle_index+1)) + bond_number += 1 + first_particle_index += 1 + first_particle_index += 1 # I have to go to the end of the chromosome! + + fileout.write("\n Angles \n\n") + angle_number = 1 + first_particle_index = 1 + for chromosome in chromosomes: + for i in range(len(chromosome['x'])-2): + fileout.write("%-4d %s %5d %5d %5d\n" % (angle_number, "1", first_particle_index, first_particle_index+1, first_particle_index+2)) + angle_number += 1 + first_particle_index += 1 + first_particle_index += 2 # I have to go to the end of the chromosome! + + fileout.close() + +########## + +def distance(x0,y0,z0,x1,y1,z1): + return sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1)+(z0-z1)*(z0-z1)) + +########## + +def check_particles_overlap(x0,y0,z0,x1,y1,z1,overlap_radius): + if distance(x0,y0,z0,x1,y1,z1) < overlap_radius: + #print "Particle %f %f %f and particle %f %f %f are overlapping\n" % (x0,y0,z0,x1,y1,z1) + return 0 + return 1 + +########## + +def store_conformation_with_pbc(xc, result, confining_environment): + # Reconstruct the different molecules and store them separatelly + ix , iy , iz = (0, 0, 0) + ix_tmp, iy_tmp, iz_tmp = (0, 0, 0) + x_tmp , y_tmp , z_tmp = (0, 0, 0) + + molecule_number = 0 # We start to count from molecule number 0 + + particles = [] + particles.append({}) + particles[molecule_number]['x'] = [] + particles[molecule_number]['y'] = [] + particles[molecule_number]['z'] = [] + + particle_counts = [] + particle_counts.append({}) # Initializing the particle counts for the first molecule + + max_bond_length = (1.5*1.5) # This is the default polymer-based bond length + + for i in range(0,len(xc),3): + particle = int(i/3) + + x = xc[i] + ix * confining_environment[1] + y = xc[i+1] + iy * confining_environment[1] + z = xc[i+2] + iz * confining_environment[1] + + # A - Check whether the molecule is broken because of pbc + # or if we are changing molecule + if particle > 0: + + # Compute the bond_length + bond_length = (particles[molecule_number]['x'][-1] - x)* \ + (particles[molecule_number]['x'][-1] - x)+ \ + (particles[molecule_number]['y'][-1] - y)* \ + (particles[molecule_number]['y'][-1] - y)+ \ + (particles[molecule_number]['z'][-1] - z)* \ + (particles[molecule_number]['z'][-1] - z) + + # Check whether the bond is too long. This could mean: + # 1 - Same molecule disjoint by pbc + # 2 - Different molecules + if bond_length > max_bond_length: + min_bond_length = bond_length + x_tmp , y_tmp , z_tmp = (x, y, z) + + # Check if we are in case 1: the same molecule continues + # in a nearby box + indeces_sets = product([-1, 0, 1], + [-1, 0, 1], + [-1, 0, 1]) + + for (l, m, n) in indeces_sets: + # Avoid to check again the same periodic copy + if (l, m, n) == (0, 0, 0): + continue + + # Propose a new particle position + x = xc[i] + (ix + l) * confining_environment[1] + y = xc[i+1] + (iy + m) * confining_environment[1] + z = xc[i+2] + (iz + n) * confining_environment[1] + + # Check the new bond length + bond_length = (particles[molecule_number]['x'][-1] - x)* \ + (particles[molecule_number]['x'][-1] - x)+ \ + (particles[molecule_number]['y'][-1] - y)* \ + (particles[molecule_number]['y'][-1] - y)+ \ + (particles[molecule_number]['z'][-1] - z)* \ + (particles[molecule_number]['z'][-1] - z) + + # Store the periodic copy with the minimum bond length + if bond_length < min_bond_length: + #print bond_length + x_tmp , y_tmp , z_tmp = (x , y , z ) + ix_tmp, iy_tmp, iz_tmp = (ix+l, iy+m, iz+n) + min_bond_length = bond_length + + # If the minimum bond length is yet too large + # we are dealing with case 2 + if min_bond_length > 10.: + # Start another molecule + molecule_number += 1 + + particles.append({}) + particles[molecule_number]['x'] = [] + particles[molecule_number]['y'] = [] + particles[molecule_number]['z'] = [] + + + particle_counts.append({}) # Initializing the particle counts for the new molecule + + # If the minimum bond length is sufficiently short + # we are dealing with case 2 + ix, iy, iz = (ix_tmp, iy_tmp, iz_tmp) + x , y , z = (x_tmp , y_tmp , z_tmp) + + # To fullfill point B (see below), we have to count how many + # particle we have of each molecule for each triplet + # (ix, iy, iz) + try: + particle_counts[molecule_number][(ix, iy, iz)] += 1.0 + except: + particle_counts[molecule_number][(ix, iy, iz)] = 0.0 + particle_counts[molecule_number][(ix, iy, iz)] += 1.0 + + particles[molecule_number]['x'].append(x) + particles[molecule_number]['y'].append(y) + particles[molecule_number]['z'].append(z) + + # B - Store in the final arrays each molecule in the periodic copy + # with more particle in the primary cell (0, 0, 0) + for molecule in range(molecule_number+1): + max_number = 0 + # Get the periodic box with more particles + for (l, m, n) in particle_counts[molecule]: + if particle_counts[molecule][(l, m, n)] > max_number: + ix, iy, iz = (l, m, n) + max_number = particle_counts[molecule][(l, m, n)] + + # Translate the molecule to include the largest portion of particles + # in the (0, 0, 0) image + for (x, y, z) in zip(particles[molecule]['x'],particles[molecule]['y'],particles[molecule]['z']): + x = x - ix * confining_environment[1] + y = y - iy * confining_environment[1] + z = z - iz * confining_environment[1] + + result['x'].append(x) + result['y'].append(y) + result['z'].append(z) + + +##### Loop extrusion dynamics functions ##### +def read_target_loops_input(input_filename, chromosome_length, percentage): + # Open input file + fp_input = open(input_filename, "r") + + loops = [] + target_loops = [] + # Get each loop per line and fill the output list of loops + for line in fp_input.readlines(): + + if line.startswith('#'): + continue + + splitted = line.strip().split() + loop = [] + loop.append(int(splitted[1])) + loop.append(int(splitted[2])) + + loops.append(loop) + + #ntarget_loops = int(len(loops)*percentage/100.) + ntarget_loops = int(len(loops)) + shuffle(loops) + target_loops = loops[0:ntarget_loops] + + return target_loops + +########## + +#def draw_loop_extrusion_starting_points(target_loops, chromosome_length): +# initial_loops = [] + # Scroll the target loops and draw a point between each start and stop +# for target_loop in target_loops: + +# random_particle = randint(target_loop[0], target_loop[1]) + +# loop = [] +# loop.append(random_particle) +# loop.append(random_particle+1) + +# initial_loops.append(loop) + +# return initial_loops + +def draw_loop_extrusion_starting_point(chromosome_length): + + # draw a starting point for extrusion along the chromosome + random_particle = randint(1, chromosome_length-1) + + return [random_particle,random_particle+1] + + + +########## + +def get_maximum_number_of_extruded_particles(target_loops, initial_loops): + # The maximum is the maximum sequence distance between a target start/stop particle of a loop + # and the initial random start/stop of a loop + maximum = 0 + + for target_loop,initial_loop in zip(target_loops,initial_loops): + #print initial_loop,target_loop + + l = abs(target_loop[0]-initial_loop[0])+1 + if l > maximum: + maximum = l + + l = abs(target_loop[1]-initial_loop[1])+1 + if l > maximum: + maximum = l + + return maximum + +########## + +def compute_particles_distance(xc): + + particles = [] + distances = {} + + # Getting the coordiantes of the particles + for i in range(0,len(xc),3): + x = xc[i] + y = xc[i+1] + z = xc[i+2] + particles.append((x, y, z)) + + # Checking whether the restraints are satisfied + for pair in combinations(range(len(particles)), 2): + dist = distance(particles[pair[0]][0], + particles[pair[0]][1], + particles[pair[0]][2], + particles[pair[1]][0], + particles[pair[1]][1], + particles[pair[1]][2]) + distances[pair] = dist + + return distances + +########## + +def compute_the_percentage_of_satysfied_restraints(input_file_name, + restraints, + output_file_name, + time_point, + timesteps_per_k_change): + + ### Change this function to use a posteriori the out.colvars.traj file similar to the obj funct calculation ### + infile = open(input_file_name , "r") + outfile = open(output_file_name, "w") + if os.path.getsize(output_file_name) == 0: + outfile.write("#%s %s %s %s\n" % ("timestep","satisfied", "satisfiedharm", "satisfiedharmLowBound")) + + #restraints[pair] = [time_dependent_restraints[time_point+1][pair][0], # Restraint type -> Is the one at time point time_point+1 + #time_dependent_restraints[time_point][pair][1]*10., # Initial spring constant + #time_dependent_restraints[time_point+1][pair][1]*10., # Final spring constant + #time_dependent_restraints[time_point][pair][2], # Initial equilibrium distance + #time_dependent_restraints[time_point+1][pair][2], # Final equilibrium distance + #int(time_dependent_steering_pairs['timesteps_per_k_change']*0.5)] # Number of timesteps for the gradual change + + # Write statistics on the restraints + nharm = 0 + nharmLowBound = 0 + ntot = 0 + for pair in restraints: + for i in range(len(restraints[pair][0])): + if restraints[pair][0][i] == "Harmonic": + nharm += 1 + ntot += 1 + if restraints[pair][0][i] == "HarmonicLowerBound": + nharmLowBound += 1 + ntot += 1 + outfile.write("#NumOfRestraints = %s , Harmonic = %s , HarmonicLowerBound = %s\n" % (ntot, nharm, nharmLowBound)) + + # Memorizing the restraint + restraints_parameters = {} + for pair in restraints: + for i in range(len(restraints[pair][0])): + #E_hlb_pot_p_106_189 + if restraints[pair][0][i] == "Harmonic": + name = "E_h_pot_%d_%d_%d" % (i, int(pair[0])+1, int(pair[1])+1) + if restraints[pair][0][i] == "HarmonicLowerBound": + name ="E_hlb_pot_%d_%d_%d" % (i, int(pair[0])+1, int(pair[1])+1) + restraints_parameters[name] = [restraints[pair][0][i], + restraints[pair][1][i], + restraints[pair][2][i], + restraints[pair][3][i], + restraints[pair][4][i], + restraints[pair][5][i]] + #print restraints_parameters + + # Checking whether the restraints are satisfied + columns_to_consider = {} + for line in infile.readlines(): + nsatisfied = 0. + nsatisfiedharm = 0. + nsatisfiedharmLowBound = 0. + ntot = 0. + ntotharm = 0. + ntotharmLowBound = 0. + + line = line.strip().split() + + # Checking which columns contain the pairwise distance + if line[0][0] == "#": + for column in range(2,len(line)): + # Get the columns with the distances + if "_pot_" not in line[column]: + columns_to_consider[column-1] = line[column] + #print columns_to_consider + else: + for column in range(1,len(line)): + if column in columns_to_consider: + if column >= len(line): + continue + dist = float(line[column]) + + # Get which restraints are between the 2 particles + for name in ["E_h_pot_"+columns_to_consider[column], "E_hlb_pot_"+columns_to_consider[column]]: + if name not in restraints_parameters: + #print "Restraint %s not present" % name + continue + else: + pass + #print name, restraints_parameters[name] + + restrainttype = restraints_parameters[name][0] + restraintd0 = float(restraints_parameters[name][3]) + float(line[0])/float(restraints_parameters[name][5])*(float(restraints_parameters[name][4]) - float(restraints_parameters[name][3])) + restraintk = float(restraints_parameters[name][1]) + float(line[0])/float(restraints_parameters[name][5])*(float(restraints_parameters[name][2]) - float(restraints_parameters[name][1])) + sqrt_k = sqrt(restraintk) + limit1 = restraintd0 - 2./sqrt_k + limit2 = restraintd0 + 2./sqrt_k + + if restrainttype == "Harmonic": + if dist >= limit1 and dist <= limit2: + nsatisfied += 1.0 + nsatisfiedharm += 1.0 + #print "#ESTABLISHED",time_point,name,restraints_parameters[name],limit1,dist,limit2 + else: + pass + #print "#NOESTABLISHED",time_point,name,restraints_parameters[name],limit1,dist,limit2 + ntotharm += 1.0 + if restrainttype == "HarmonicLowerBound": + if dist >= restraintd0: + nsatisfied += 1.0 + nsatisfiedharmLowBound += 1.0 + #print "#ESTABLISHED",time_point,name,restraints_parameters[name],dist,restraintd0 + else: + pass + #print "#NOESTABLISHED",time_point,name,restraints_parameters[name],dist,restraintd0 + ntotharmLowBound += 1.0 + ntot += 1.0 + #print int(line[0])+(time_point)*timesteps_per_k_change, nsatisfied, ntot, nsatisfiedharm, ntotharm, nsatisfiedharmLowBound, ntotharmLowBound + if ntotharm == 0.: + ntotharm = 1.0 + if ntotharmLowBound == 0.: + ntotharmLowBound = 1.0 + + + outfile.write("%d %lf %lf %lf\n" % (int(line[0])+(time_point)*timesteps_per_k_change, nsatisfied/ntot*100., nsatisfiedharm/ntotharm*100., nsatisfiedharmLowBound/ntotharmLowBound*100.)) + infile.close() + outfile.close() + +########## + +def read_objective_function(fname): + + obj_func=[] + fhandler = open(fname) + line = next(fhandler) + try: + while True: + if line.startswith('#'): + line = next(fhandler) + continue + line = line.strip() + if len(line) == 0: + continue + line_vals = line.split() + obj_func.append(float(line_vals[1])) + line = next(fhandler) + except StopIteration: + pass + fhandler.close() + + return obj_func +########## + +def compute_the_objective_function(input_file_name, + output_file_name, + time_point, + timesteps_per_k_change): + + + infile = open(input_file_name , "r") + outfile = open(output_file_name, "w") + if os.path.getsize(output_file_name) == 0: + outfile.write("#Timestep obj_funct\n") + + columns_to_consider = [] + + # Checking which columns contain the energies to sum + for line in infile.readlines(): + line = line.strip().split() + + # Checking which columns contain the energies to sum + if line[0][0] == "#": + for column in range(len(line)): + if "_pot_" in line[column]: + columns_to_consider.append(column-1) + else: + obj_funct = 0.0 + for column in columns_to_consider: + if column < len(line): + obj_funct += float(line[column]) + outfile.write("%d %s\n" % (int(line[0])+timesteps_per_k_change*(time_point), obj_funct)) + + infile.close() + outfile.close() + + +### get unique list ### + +def get_list(input_list): + + output_list = [] + + for element in input_list: + #print(type(element)) + if isinstance(element, (int)): + output_list.append(element) + if isinstance(element, (list)): + for subelement in element: + output_list.append(subelement) + if isinstance(element, (tuple)): + for subelement in range(element[0],element[1]+1,element[2]): + output_list.append(subelement) + return output_list + +########## +#MPI.Finalize() diff --git a/tadphys/modelling/lammps_modelling.py~ b/tadphys/modelling/lammps_modelling.py~ new file mode 100644 index 0000000..3cf7459 --- /dev/null +++ b/tadphys/modelling/lammps_modelling.py~ @@ -0,0 +1,3850 @@ +""" +16 Mar 2019 + + +""" +from string import ascii_uppercase as uc, ascii_lowercase as lc +from os.path import exists +from random import uniform, randint, seed, random, sample, shuffle +from pickle import load, dump +from multiprocessing.dummy import Pool as ThreadPool +from functools import partial +from math import atan2 +from itertools import combinations, product +from shutil import copyfile + +import sys +import copy +import os +import shutil +import multiprocessing + +from numpy import sin, cos, arccos, sqrt, fabs, pi +import numpy as np +from mpi4py import MPI +from lammps import lammps + +from tadphys.modelling import LAMMPS_CONFIG as CONFIG +from tadphys.modelling.lammpsmodel import LAMMPSmodel +from tadphys.modelling.restraints import HiCBasedRestraints + +class InitalConformationError(Exception): + """ + Exception to handle failed initial conformation. + """ + pass + +def abortable_worker(func, *args, **kwargs): + timeout = kwargs.get('timeout', None) + failedSeedLog = kwargs.get('failedSeedLog', None) + p = ThreadPool(1) + res = p.apply_async(func, args=args) + try: + out = res.get(timeout) # Wait timeout seconds for func to complete. + return out + except multiprocessing.TimeoutError: + print("Model took more than %s seconds to complete ... canceling" % str(timeout)) + p.terminate() + raise + except: + print("Unknown error with process") + if failedSeedLog != None: + failedSeedLog, k = failedSeedLog + with open(failedSeedLog, 'a') as f: + f.write('%s\t%s\n' %(k, 'Failed')) + p.terminate() + raise + +def generate_lammps_models(zscores, resolution, nloci, start=1, n_models=5000, + n_keep=1000, close_bins=1, n_cpus=1, + verbose=0, outfile=None, config=None, + values=None, coords=None, zeros=None, + first=None, container=None,tmp_folder=None,timeout_job=10800, + initial_conformation=None, connectivity="FENE", + timesteps_per_k=10000,keep_restart_out_dir=None, + kfactor=1, adaptation_step=False, cleanup=False, + hide_log=True, remove_rstrn=[], initial_seed=0, + restart_path=False, store_n_steps=10, + useColvars=False): + """ + This function generates three-dimensional models starting from Hi-C data. + The final analysis will be performed on the n_keep top models. + + :param zscores: the dictionary of the Z-score values calculated from the + Hi-C pairwise interactions + :param resolution: number of nucleotides per Hi-C bin. This will be the + number of nucleotides in each model's particle + :param nloci: number of particles to model (may not all be present in + zscores) + :param None coords: a dictionary like: + :: + + {'crm' : '19', + 'start': 14637, + 'end' : 15689} + + :param 5000 n_models: number of models to generate + :param 1000 n_keep: number of models used in the final analysis (usually + the top 20% of the generated models). The models are ranked according to + their objective function value (the lower the better) + :param 1 close_bins: number of particles away (i.e. the bin number + difference) a particle pair must be in order to be considered as + neighbors (e.g. 1 means consecutive particles) + :param n_cpus: number of CPUs to use + :param False verbose: if set to True, information about the distance, force + and Z-score between particles will be printed. If verbose is 0.5 than + constraints will be printed only for the first model calculated. + :param None values: the normalized Hi-C data in a list of lists (equivalent + to a square matrix) + :param None config: a dictionary containing the standard + parameters used to generate the models. The dictionary should contain + the keys kforce, lowrdist, maxdist, upfreq and lowfreq. Examples can be + seen by doing: + + :: + + from tadphys.modelling.HIC_CONFIG import HIC_CONFIG + + where CONFIG is a dictionary of dictionaries to be passed to this function: + + :: + + CONFIG = { + 'dmel_01': { + # Paramaters for the Hi-C dataset from: + 'reference' : 'victor corces dataset 2013', + + # Force applied to the restraints inferred to neighbor particles + 'kforce' : 5, + + # Space occupied by a nucleotide (nm) + 'scale' : 0.005 + + # Strength of the bending interaction + 'kbending' : 0.0, # OPTIMIZATION: + + # Maximum experimental contact distance + 'maxdist' : 600, # OPTIMIZATION: 500-1200 + + # Minimum thresholds used to decide which experimental values have to be + # included in the computation of restraints. Z-score values bigger than upfreq + # and less that lowfreq will be include, whereas all the others will be rejected + 'lowfreq' : -0.7 # OPTIMIZATION: min/max Z-score + + # Maximum threshold used to decide which experimental values have to be + # included in the computation of restraints. Z-score values greater than upfreq + # and less than lowfreq will be included, while all the others will be rejected + 'upfreq' : 0.3 # OPTIMIZATION: min/max Z-score + + } + } + :param None first: particle number at which model should start + :param None container: restrains particle to be within a given object. Can + only be a 'cylinder', which is, in fact a cylinder of a given height to + which are added hemispherical ends. This cylinder is defined by a radius, + its height (with a height of 0 the cylinder becomes a sphere) and the + force applied to the restraint. E.g. for modeling E. coli genome (2 + micrometers length and 0.5 micrometer of width), these values could be + used: ['cylinder', 250, 1500, 50], and for a typical mammalian nuclei + (6 micrometers diameter): ['cylinder', 3000, 0, 50] + :param None tmp_folder: path to a temporary file created during + the clustering computation. Default will be created in /tmp/ folder + :param 10800 timeout_job: maximum seconds a job can run in the multiprocessing + of lammps before is killed + :param initial_conformation: lammps input data file with the particles initial conformation. + :param True hide_log: do not generate lammps log information + :param FENE connectivity: use FENE for a fene bond or harmonic for harmonic + potential for neighbours + :param None keep_restart_out_dir: path to write files to restore LAMMPs + session (binary) + :param True cleanup: delete lammps folder after completion + :param [] remove_rstrn: list of particles which must not have restrains + :param 0 initial_seed: Initial random seed for modelling. + :param False restart_path: path to files to restore LAMMPs session (binary) + :param 10 store_n_steps: Integer with number of steps to be saved if + restart_file != False + :param False useColvars: True if you want the restrains to be loaded by colvars + + :returns: a Tadphys models dictionary + """ + + if not tmp_folder: + tmp_folder = '/tmp/tadphys_tmp_%s/' % ( + ''.join([(uc + lc)[int(random() * 52)] for _ in range(4)])) + else: + if tmp_folder[-1] != '/': + tmp_folder += '/' + randk = ''.join([(uc + lc)[int(random() * 52)] for _ in range(4)]) + tmp_folder = '%s%s/' %(tmp_folder, randk) + while os.path.exists(tmp_folder): + randk = ''.join([(uc + lc)[int(random() * 52)] for _ in range(4)]) + tmp_folder = '%s%s/' %(tmp_folder[:-1], randk) + if not os.path.exists(tmp_folder): + os.makedirs(tmp_folder) + + # Setup CONFIG + if isinstance(config, dict): + CONFIG.HiC.update(config) + elif config: + raise Exception('ERROR: "config" must be a dictionary') + + global RADIUS + + #RADIUS = float(resolution * CONFIG['scale']) / 2 + RADIUS = 0.5 + CONFIG.HiC['resolution'] = resolution + CONFIG.HiC['maxdist'] = CONFIG.HiC['maxdist'] / (float(resolution * CONFIG.HiC['scale'])) + + global LOCI + if first is None: + first = min([int(j) for i in zscores[0] for j in zscores[0][i]] + + [int(i) for i in zscores[0]]) + LOCI = list(range(first, nloci + first)) + LOCI = 20000 + + # random inital number + global START + START = start + # verbose + global VERBOSE + VERBOSE = verbose + #VERBOSE = 3 + + HiCRestraints = [HiCBasedRestraints(nloci,RADIUS,CONFIG.HiC,resolution, zs, + chromosomes=coords, close_bins=close_bins,first=first, + remove_rstrn=remove_rstrn) for zs in zscores] + + run_time = 1000 + + colvars = 'colvars.dat' + + steering_pairs = None + time_dependent_steering_pairs = None + if len(HiCRestraints) > 1: + time_dependent_steering_pairs = { + 'colvar_input' : HiCRestraints, + 'colvar_output' : colvars, + 'chrlength' : nloci, + 'binsize' : resolution, + 'timesteps_per_k_change' : [float(timesteps_per_k)]*6, + 'k_factor' : kfactor, + 'perc_enfor_contacts' : 100., + 'colvar_dump_freq' : int(timesteps_per_k/100), + 'adaptation_step' : adaptation_step, + } + if not initial_conformation: + initial_conformation = 'random' + else: + steering_pairs = { + 'colvar_input': HiCRestraints[0], + 'colvar_output': colvars, + 'binsize': resolution, + 'timesteps_per_k' : timesteps_per_k, + 'k_factor' : kfactor, + 'colvar_dump_freq' : int(timesteps_per_k/100), + 'timesteps_relaxation' : int(timesteps_per_k*10) + } + if not initial_conformation: + initial_conformation = 'random' + + if not container: + container = ['cube',1000.0] # http://lammps.sandia.gov/threads/msg48683.html + + ini_sm_model = None + sm_diameter = 1 + if initial_conformation != 'random': + if isinstance(initial_conformation, dict): + sm = [initial_conformation] + sm[0]['x'] = sm[0]['x'][0:nloci] + sm[0]['y'] = sm[0]['y'][0:nloci] + sm[0]['z'] = sm[0]['z'][0:nloci] + sm_diameter = float(resolution * CONFIG.HiC['scale']) + for single_m in sm: + for i in range(len(single_m['x'])): + single_m['x'][i] /= sm_diameter + single_m['y'][i] /= sm_diameter + single_m['z'][i] /= sm_diameter + cm0 = single_m.center_of_mass() + for i in range(len(single_m['x'])): + single_m['x'][i] -= cm0['x'] + single_m['y'][i] -= cm0['y'] + single_m['z'][i] -= cm0['z'] + ini_sm_model = [[single_sm.copy()] for single_sm in sm] + + models, ini_model = lammps_simulate(lammps_folder=tmp_folder, + run_time=run_time, + initial_conformation=ini_sm_model, + connectivity=connectivity, + steering_pairs=steering_pairs, + time_dependent_steering_pairs=time_dependent_steering_pairs, + initial_seed=initial_seed, + n_models=n_keep, + n_keep=n_keep, + n_cpus=n_cpus, + keep_restart_out_dir=keep_restart_out_dir, + confining_environment=container, + timeout_job=timeout_job, + cleanup=cleanup, to_dump=int(timesteps_per_k/100.), + hide_log=hide_log, + chromosome_particle_numbers=chromosome_particle_numbers, + restart_path=restart_path, + store_n_steps=store_n_steps, + useColvars=useColvars) +# for i, m in enumerate(models.values()): +# m['index'] = i + if outfile: + if exists(outfile): + old_models, _ = load(open(outfile)) + else: + old_models, _ = {}, {} + models.update(old_models) + out = open(outfile, 'w') + dump((models), out) + out.close() + else: + stages = {} + trajectories = {} + timepoints = None + if len(HiCRestraints)>1: + timepoints = time_dependent_steering_pairs['colvar_dump_freq'] + nbr_produced_models = len(models)//(timepoints*(len(HiCRestraints)-1)) + stages[0] = [i for i in range(nbr_produced_models)] + + for sm_id, single_m in enumerate(ini_model): + for i in range(len(single_m['x'])): + single_m['x'][i] *= sm_diameter + single_m['y'][i] *= sm_diameter + single_m['z'][i] *= sm_diameter + + lammps_model = LAMMPSmodel({ 'x' : single_m['x'], + 'y' : single_m['y'], + 'z' : single_m['z'], + 'index' : sm_id+1+initial_seed, + 'cluster' : 'Singleton', + 'objfun' : single_m['objfun'] if 'objfun' in single_m else 0, + 'log_objfun' : single_m['log_objfun'] if 'log_objfun' in single_m else [], + 'radius' : float(CONFIG.HiC['resolution'] * \ + CONFIG.HiC['scale'])/2, + 'rand_init' : str(sm_id+1+initial_seed)}) + + models[sm_id] = lammps_model + for timepoint in range((len(HiCRestraints)-1)*timepoints): + stages[timepoint+1] = [(t+nbr_produced_models+timepoint*nbr_produced_models) + for t in range(nbr_produced_models)] + for traj in range(nbr_produced_models): + trajectories[traj] = [stages[t][traj] for t in range(timepoints+1)] + + model_ensemble = { + 'loci': len(LOCI), + 'models': models, + 'resolution': resolution, + 'original_data': values if len(HiCRestraints)>1 else values[0], + 'zscores': zscores, + 'config': CONFIG.HiC, + 'zeros': zeros, + 'restraints': HiCRestraints[0]._get_restraints(), + 'stages': stages, + 'trajectories': trajectories, + 'models_per_step': timepoints + } + + return model_ensemble +# Initialize the lammps simulation with standard polymer physics based +# interactions: chain connectivity (FENE) ; excluded volume (WLC) ; and +# bending rigidity (KP) +def init_lammps_run(lmp, initial_conformation, + neighbor=CONFIG.neighbor, + hide_log=True, + chromosome_particle_numbers=None, + connectivity="FENE", + restart_file=False): + + """ + Initialise the parameters for the computation in lammps job + + :param lmp: lammps instance object. + :param initial_conformation: lammps input data file with the particles initial conformation. + :param CONFIG.neighbor neighbor: see LAMMPS_CONFIG.py. + :param True hide_log: do not generate lammps log information + :param FENE connectivity: use FENE for a fene bond or harmonic for harmonic + potential for neighbours + :param False restart_file: path to file to restore LAMMPs session (binary) + + """ + + if hide_log: + lmp.command("log none") + #os.remove("log.lammps") + + ####################################################### + # Box and units (use LJ units and period boundaries) # + ####################################################### + lmp.command("units %s" % CONFIG.units) + lmp.command("atom_style %s" % CONFIG.atom_style) #with stiffness + lmp.command("boundary %s" % CONFIG.boundary) + """ + try: + lmp.command("communicate multi") + except: + pass + """ + + ########################## + # READ "start" data file # + ########################## + if restart_file == False : + lmp.command("read_data %s" % initial_conformation) + else: + restart_time = int(restart_file.split('/')[-1].split('_')[4][:-8]) + print('Previous unfinished LAMMPS steps found') + print('Loaded %s file' %restart_file) + lmp.command("read_restart %s" % restart_file) + lmp.command("reset_timestep %i" % restart_time) + + lmp.command("mass %s" % CONFIG.mass) + + ################################################################## + # Pair interactions require lists of neighbours to be calculated # + ################################################################## + lmp.command("neighbor %s" % neighbor) + lmp.command("neigh_modify %s" % CONFIG.neigh_modify) + + ############################################################## + # Sample thermodynamic info (temperature, energy, pressure) # + ############################################################## + lmp.command("thermo %i" % CONFIG.thermo) + + ############################### + # Stiffness term # + # E = K * (1+cos(theta)), K>0 # + ############################### + lmp.command("angle_style %s" % CONFIG.angle_style) # Write function for kinks + lmp.command("angle_coeff * %f" % CONFIG.persistence_length) + + ################################################################### + # Pair interaction between non-bonded atoms # + # # + # Lennard-Jones 12-6 potential with cutoff: # + # potential E=4epsilon[ (sigma/r)^12 - (sigma/r)^6] for r timepoints) for ks in kseeds]): + # kseeds.append(rnd) + + #pool = ProcessPool(max_workers=n_cpus, max_tasks=n_cpus) + pool = multiprocessing.Pool(processes=n_cpus, maxtasksperchild=n_cpus) + + results = [] + def collect_result(result): + results.append((result[0], result[1], result[2])) + + initial_models = initial_conformation + if not initial_models: + initial_models = [] + + jobs = {} + for k_id, k in enumerate(kseeds): + k_folder = lammps_folder + 'lammps_' + str(k) + '/' + failedSeedLog = None + # First we check if the modelling fails with this seed + if restart_path != False: + restart_file = restart_path + 'lammps_' + str(k) + '/' + failedSeedLog = restart_file + 'runLog.txt' + if os.path.exists(failedSeedLog): + with open(failedSeedLog, 'r') as f: + for line in f: + prevRun = line.split() + # add number of models done so dont repeat same seed + if prevRun[1] == 'Failed': + k = int(prevRun[0]) + n_models + k_folder = lammps_folder + 'lammps_' + str(k) + '/' + + #print "#RandomSeed: %s" % k + keep_restart_out_dir2 = None + if keep_restart_out_dir != None: + keep_restart_out_dir2 = keep_restart_out_dir + 'lammps_' + str(k) + '/' + if not os.path.exists(keep_restart_out_dir2): + os.makedirs(keep_restart_out_dir2) + model_path = False + if restart_path != False: + # check presence of previously finished jobs + model_path = restart_path + 'lammps_' + str(k) + '/finishedModel_%s.pickle' %k + # define restart file by checking for finished jobs or last step + if model_path != False and os.path.exists(model_path): + with open(model_path, "rb") as input_file: + m = load(input_file) + results.append((m[0], m[1])) + else: + if restart_path != False: + restart_file = restart_path + 'lammps_' + str(k) + '/' + dirfiles = os.listdir(restart_file) + # check for last k and step + maxi = (0, 0, '') + for f in dirfiles: + if f.startswith('restart_kincrease_'): + kincrease = int(f.split('_')[2]) + step = int(f.split('_')[-1][:-8]) + if kincrease > maxi[0]: + maxi = (kincrease, step, f) + elif kincrease == maxi[0] and step > maxi[1]: + maxi = (kincrease, step, f) + # In case there is no restart file at all + if maxi[2] == '': + #print('Could not find a LAMMPS restart file') + # will check later if we have a path or a file + getIniConf = True + #restart_file = False + else: + restart_file = restart_file + maxi[2] + getIniConf = False + else: + restart_file = False + getIniConf = True + + ini_conf = None + if not os.path.exists(k_folder): + os.makedirs(k_folder) + if initial_conformation and getIniConf == True: + ini_conf = '%sinitial_conformation.dat' % k_folder + write_initial_conformation_file(initial_conformation[k_id], + chromosome_particle_numbers, + confining_environment, + out_file=ini_conf) + # jobs[k] = run_lammps(k, k_folder, run_time, + # initial_conformation, connectivity, + # neighbor, + # tethering, minimize, + # compress_with_pbc, compress_without_pbc, + # confining_environment, + # steering_pairs, + # time_dependent_steering_pairs, + # loop_extrusion_dynamics, + # to_dump, pbc,) + # jobs[k] = pool.schedule(run_lammps, + jobs[k] = partial(abortable_worker, run_lammps, timeout=timeout_job, + failedSeedLog=[failedSeedLog, k]) + pool.apply_async(jobs[k], + args=(k, k_folder, run_time, + ini_conf, connectivity, + neighbor, + tethering, minimize, + compress_with_pbc, compress_without_pbc, + initial_relaxation, + confining_environment, + steering_pairs, + time_dependent_steering_pairs, + compartmentalization, + loop_extrusion_dynamics, + to_dump, pbc, hide_log, + chromosome_particle_numbers, + keep_restart_out_dir2, + restart_file, + model_path, + store_n_steps, + useColvars,), callback=collect_result) + # , timeout=timeout_job) + pool.close() + pool.join() + +# for k in kseeds: +# try: +# #results.append((k, jobs[k])) +# results.append((k, jobs[k].result())) +# except TimeoutError: +# print "Model took more than %s seconds to complete ... canceling" % str(timeout_job) +# jobs[k].cancel() +# except Exception as error: +# print "Function raised %s" % error +# jobs[k].cancel() + + models = {} + initial_models = [] + ############ WARNING ############ + # PENDING TO ADD THE STORAGE OF INITIAL MODELS # + if timepoints > 1: + for t in range(timepoints): + time_models = [] + for res in results: + (k,restarr,init_conf) = res + time_models.append(restarr[t]) + for i, m in enumerate(time_models[:n_keep]): + models[i+t*len(time_models[:n_keep])+n_keep] = m + #for i, (_, m) in enumerate( + # sorted(time_models.items(), key=lambda x: x[1]['objfun'])[:n_keep]): + # models[i+t+1] = m + + else: + for i, (_, m, im) in enumerate( + sorted(results, key=lambda x: x[1][0]['objfun'])[:n_keep]): + models[i] = m[0] + if not initial_conformation: + initial_models += [im] + + if cleanup: + for k in kseeds: + k_folder = lammps_folder + '/lammps_' + str(k) + '/' + if os.path.exists(k_folder): + shutil.rmtree(k_folder) + + return models, initial_models + + + +# This performs the dynamics: I should add here: The steered dynamics (Irene and Hi-C based) ; +# The loop extrusion dynamics ; the binders based dynamics (Marenduzzo and Nicodemi)...etc... +def run_lammps(kseed, lammps_folder, run_time, + initial_conformation=None, connectivity="FENE", + neighbor=CONFIG.neighbor, + tethering=False, minimize=True, + compress_with_pbc=None, compress_without_pbc=None, + initial_relaxation=None, + confining_environment=None, + steering_pairs=None, + time_dependent_steering_pairs=None, + compartmentalization=None, + loop_extrusion_dynamics=None, + to_dump=10000, pbc=False, + hide_log=True, + chromosome_particle_numbers=None, + keep_restart_out_dir2=None, + restart_file=False, + model_path=False, + store_n_steps=10, + useColvars=False): + """ + Generates one lammps model + + :param kseed: Random number to identify the model. + :param initial_conformation_folder: folder where to store lammps input + data file with the particles initial conformation. + http://lammps.sandia.gov/doc/2001/data_format.html + :param FENE connectivity: use FENE for a fene bond or harmonic for harmonic + potential for neighbours (see init_lammps_run) + :param run_time: # of timesteps. + :param None initial_conformation: path to initial conformation file or None + for random walk initial start. + :param CONFIG.neighbor neighbor: see LAMMPS_CONFIG.py. + :param False tethering: whether to apply tethering command or not. + :param True minimize: whether to apply minimize command or not. + :param None compress_with_pbc: whether to apply the compression dynamics in case of a + system with cubic confinement and pbc. This compression step is usually apply + to obtain a system with the desired particle density. The input have to be a list + of three elements: + 0 - XXX; + 1 - XXX; + 2 - The compression simulation time span (in timesteps). + e.g. compress_with_pbc=[0.01, 0.01, 100000] + :param None compress_without_pbc: whether to apply the compression dynamics in case of a + system with spherical confinement. This compression step is usually apply to obtain a + system with the desired particle density. The simulation shrinks/expands the initial + sphere to a sphere of the desired radius using many short runs. In each short run the + radius is reduced by 0.1 box units. The input have to be a list of three elements: + 0 - Initial radius; + 1 - Final desired radius; + 2 - The time span (in timesteps) of each short compression run. + e.g. compress_without_pbc=[300, 100, 100] + :param None steering_pairs: particles contacts file from colvars fix + http://lammps.sandia.gov/doc/PDF/colvars-refman-lammps.pdf. + steering_pairs = { 'colvar_input' : "ENST00000540866.2chr7_clean_enMatch.txt", + 'colvar_output' : "colvar_list.txt", + 'kappa_vs_genomic_distance' : "kappa_vs_genomic_distance.txt", + 'chrlength' : 3182, + 'copies' : ['A'], + 'binsize' : 50000, + 'number_of_kincrease' : 1000, + 'timesteps_per_k' : 1000, + 'timesteps_relaxation' : 100000, + 'perc_enfor_contacts' : 10 + } + + :param None loop_extrusion_dynamics: dictionary with all the info to perform loop + extrusion dynamics. + loop_extrusion_dynamics = { 'target_loops_input' : "target_loops.txt", + 'loop_extrusion_steps_output' : "loop_extrusion_steps.txt", + 'attraction_strength' : 4.0, + 'equilibrium_distance' : 1.0, + 'chrlength' : 3182, + 'copies' : ['A'], + 'timesteps_per_loop_extrusion_step' : 1000, + 'timesteps_relaxation' : 100000, + 'perc_enfor_loops' : 10 + } + + Should at least contain Chromosome, loci1, loci2 as 1st, 2nd and 3rd column + :param None keep_restart_out_dir2: path to write files to restore LAMMPs + session (binary) + :param False restart_file: path to file to restore LAMMPs session (binary) + :param False model_path: path to/for pickle with finished model (name included) + :param 10 store_n_steps: Integer with number of steps to be saved if + restart_file != False + :param False useColvars: True if you want the restrains to be loaded by colvars + :returns: a LAMMPSModel object + + """ + + + lmp = lammps(cmdargs=['-package','omp','4','-suffix','omp','-screen','none','-log',lammps_folder+'log.lammps','-nocite']) + me = MPI.COMM_WORLD.Get_rank() + nprocs = MPI.COMM_WORLD.Get_size() + # check if we have a restart file or a path to which restart + if restart_file == False: + doRestart = False + saveRestart = False + elif os.path.isdir(restart_file): + doRestart = False + saveRestart = True + else: + doRestart = True + saveRestart = True + if not initial_conformation and doRestart == False: + initial_conformation = lammps_folder+'initial_conformation.dat' + generate_chromosome_random_walks_conformation ([len(LOCI)], + outfile=initial_conformation, + seed_of_the_random_number_generator=kseed, + confining_environment=confining_environment) + + # Just prepared the steps recovery for steering pairs + if steering_pairs and doRestart == True: + init_lammps_run(lmp, initial_conformation, + neighbor=neighbor, + hide_log=hide_log, + connectivity=connectivity, + restart_file=restart_file) + else: + init_lammps_run(lmp, initial_conformation, + neighbor=neighbor, + hide_log=hide_log, + chromosome_particle_numbers=chromosome_particle_numbers, + connectivity=connectivity) + + lmp.command("dump 1 all custom %i %slangevin_dynamics_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + # ########################################################## + # # Generate RESTART file, SPECIAL format, not a .txt file # + # # Useful if simulation crashes + # Prepared an optimisation for steering pairs, but not for the rest# + # ########################################################## + # create lammps restart files every x steps. 1000 is ok + # There was the doubt of using text format session info (which allows use in other computers) + # but since the binary can be converted later and this: "Because a data file is in text format, + # if you use a data file written out by this command to restart a simulation, the initial state + # of the new run will be slightly different than the final state of the old run (when the file + # was written) which was represented internally by LAMMPS in binary format. A new simulation + # which reads the data file will thus typically diverge from a simulation that continued + # in the original input script." will continue with binary. To convert use restart2data + #if keep_restart_out_dir2: + # lmp.command("restart %i %s/relaxation_%i_*.restart" % (keep_restart_step, keep_restart_out_dir2, kseed)) + + + ####################################################### + # Set up fixes # + # use NVE ensemble # + # Langevin integrator Tstart Tstop 1/friction rndseed # + # => sampling NVT ensamble # + ####################################################### + # Define the langevin dynamics integrator + lmp.command("fix 1 all nve") + lmp.command("fix 2 all langevin 1.0 1.0 2.0 %i" % kseed) + + # Define the tethering to the center of the confining environment + if tethering: + lmp.command("fix 3 all spring tether 50.0 0.0 0.0 0.0 0.0") + + # Do a minimization step to prevent particles + # clashes in the initial conformation + if minimize: + + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %sminimization_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + print("Performing minimization run...") + lmp.command("minimize 1.0e-4 1.0e-6 100000 100000") + + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %slangevin_dynamics_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + if compress_with_pbc: + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %scompress_with_pbc_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + # Re-setting the initial timestep to 0 + lmp.command("reset_timestep 0") + + lmp.command("unfix 1") + lmp.command("unfix 2") + + # default as in PLoS Comp Biol Di Stefano et al. 2013 compress_with_pbc = [0.01, 0.01, 100000] + lmp.command("fix 1 all nph iso %s %s 2.0" % (compress_with_pbc[0], + compress_with_pbc[1])) + lmp.command("fix 2 all langevin 1.0 1.0 2.0 %i" % kseed) + print("run %i" % compress_with_pbc[2]) + lmp.command("run %i" % compress_with_pbc[2]) + + lmp.command("unfix 1") + lmp.command("unfix 2") + + lmp.command("fix 1 all nve") + lmp.command("fix 2 all langevin 1.0 1.0 2.0 %i" % kseed) + + # Here We have to re-define the confining environment + print("# Previous particle density (nparticles/volume)", lmp.get_natoms()/(confining_environment[1]**3)) + confining_environment[1] = lmp.extract_global("boxxhi",1) - lmp.extract_global("boxxlo",1) + print("") + print("# New cubic box dimensions after isotropic compression") + print(lmp.extract_global("boxxlo",1), lmp.extract_global("boxxhi",1)) + print(lmp.extract_global("boxylo",1), lmp.extract_global("boxyhi",1)) + print(lmp.extract_global("boxzlo",1), lmp.extract_global("boxzhi",1)) + print("# New confining environment", confining_environment) + print("# New particle density (nparticles/volume)", lmp.get_natoms()/(confining_environment[1]**3)) + print("") + + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %slangevin_dynamics_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + if compress_without_pbc: + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %scompress_without_pbc_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + # Re-setting the initial timestep to 0 + lmp.command("reset_timestep 0") + + # default as in Sci Rep Di Stefano et al. 2016 + # compress_without_pbc = [initial_radius, final_radius, timesteps_per_minirun] + # = [350, 161.74, 100] + radius = compress_without_pbc[0] + while radius > compress_without_pbc[1]: + + print("New radius %f" % radius) + if radius != compress_without_pbc[0]: + lmp.command("region sphere delete") + + lmp.command("region sphere sphere 0.0 0.0 0.0 %f units box side in" % radius) + + # Performing the simulation + lmp.command("fix 5 all wall/region sphere lj126 1.0 1.0 1.12246152962189") + lmp.command("run %i" % compress_without_pbc[2]) + + radius -= 0.1 + + # Here we have to re-define the confining environment + volume = 4.*np.pi/3.0*(compress_without_pbc[0]**3) + print("# Previous particle density (nparticles/volume)", lmp.get_natoms()/volume) + confining_environment[1] = compress_without_pbc[1] + print("") + volume = 4.*np.pi/3.0*(compress_without_pbc[1]**3) + print("# New particle density (nparticles/volume)", lmp.get_natoms()/volume) + print("") + + if initial_relaxation: + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %sinitial_relaxation_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + lmp.command("reset_timestep 0") + lmp.command("run %i" % initial_relaxation) + lmp.command("write_data relaxed_conformation.txt nocoeff") + + timepoints = 1 + xc = [] + # Setup the pairs to co-localize using the COLVARS plug-in + if steering_pairs: + + if doRestart == False: + # Start relaxation step + lmp.command("reset_timestep 0") # cambiar para punto ionicial + lmp.command("run %i" % steering_pairs['timesteps_relaxation']) + lmp.command("reset_timestep %i" % 0) + + # Start Steered Langevin dynamics + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %ssteered_MD_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + #lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id") + + if 'number_of_kincrease' in steering_pairs: + nbr_kincr = steering_pairs['number_of_kincrease'] + else: + nbr_kincr = 1 + + if doRestart == True: + restart_k_increase = int(restart_file.split('/')[-1].split('_')[2]) + restart_time = int(restart_file.split('/')[-1].split('_')[4][:-8]) + + #steering_pairs['colvar_output'] = os.path.dirname(os.path.abspath(steering_pairs['colvar_output'])) + '/' + str(kseed) + '_'+ os.path.basename(steering_pairs['colvar_output']) + steering_pairs['colvar_output'] = lammps_folder+os.path.basename(steering_pairs['colvar_output']) + for kincrease in range(nbr_kincr): + # Write the file containing the pairs to constraint + # steering_pairs should be a dictionary with: + # Avoid to repeat calculations in case of restart + if (doRestart == True) and (kincrease < restart_k_increase): + continue + + if useColvars == True: + + generate_colvars_list(steering_pairs, kincrease+1) + + # Adding the colvar option + #print "fix 4 all colvars %s output %s" % (steering_pairs['colvar_output'],lammps_folder) + lmp.command("fix 4 all colvars %s output %sout" % (steering_pairs['colvar_output'],lammps_folder)) + + if to_dump: + # lmp.command("thermo_style custom step temp epair emol") + lmp.command("thermo_style custom step temp epair emol pe ke etotal f_4") + lmp.command("thermo_modify norm no flush yes") + lmp.command("variable step equal step") + lmp.command("variable objfun equal f_4") + lmp.command('''fix 5 all print %s "${step} ${objfun}" file "%sobj_fun_from_time_point_%s_to_time_point_%s.txt" screen "no" title "#Timestep Objective_Function"''' % (steering_pairs['colvar_dump_freq'],lammps_folder,str(0), str(1))) + + # will load the bonds directly into LAMMPS + else: + bond_list = generate_bond_list(steering_pairs) + for bond in bond_list: + lmp.command(bond) + + if to_dump: + lmp.command("thermo_style custom step temp etotal") + lmp.command("thermo_modify norm no flush yes") + lmp.command("variable step equal step") + lmp.command("variable objfun equal etotal") + lmp.command('''fix 5 all print %s "${step} ${objfun}" file "%sobj_fun_from_time_point_%s_to_time_point_%s.txt" screen "no" title "#Timestep Objective_Function"''' % (steering_pairs['colvar_dump_freq'],lammps_folder,str(0), str(1))) + #lmp.command("reset_timestep %i" % 0) + resettime = 0 + runtime = steering_pairs['timesteps_per_k'] + if (doRestart == True) and (kincrease == restart_k_increase): + resettime = restart_time + runtime = steering_pairs['timesteps_per_k'] - restart_time + + # Create 10 restarts with name restart_kincrease_%s_time_%s.restart every + if saveRestart == True: + if os.path.isdir(restart_file): + restart_file_new = restart_file + 'restart_kincrease_%s_time_*.restart' %(kincrease) + else: + restart_file_new = '/'.join(restart_file.split('/')[:-1]) + '/restart_kincrease_%s_time_*.restart' %(kincrease) + #print(restart_file_new) + lmp.command("restart %i %s" %(int(steering_pairs['timesteps_per_k']/store_n_steps), restart_file_new)) + + #lmp.command("reset_timestep %i" % resettime) + lmp.command("run %i" % runtime) + + # Setup the pairs to co-localize using the COLVARS plug-in + if time_dependent_steering_pairs: + timepoints = time_dependent_steering_pairs['colvar_dump_freq'] + + #if exists("objective_function_profile.txt"): + # os.remove("objective_function_profile.txt") + + #print "# Getting the time dependent steering pairs!" + time_dependent_restraints = get_time_dependent_colvars_list(time_dependent_steering_pairs) + time_points = sorted(time_dependent_restraints.keys()) + print("#Time_points",time_points) + sys.stdout.flush() + + time_dependent_steering_pairs['colvar_output'] = lammps_folder+os.path.basename(time_dependent_steering_pairs['colvar_output']) + # Performing the adaptation step from initial conformation to Tadphys excluded volume + if time_dependent_steering_pairs['adaptation_step']: + restraints = {} + for time_point in time_points[0:1]: + lmp.command("reset_timestep %i" % 0) + # Change to_dump with some way to load the conformations you want to store + # This Adaptation could be discarded in the trajectory files. + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %sadapting_MD_from_initial_conformation_to_Tadphys_at_time_point_%s.XYZ id xu yu zu" % (to_dump, lammps_folder, time_point)) + lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + restraints[time_point] = {} + print("# Step %s - %s" % (time_point, time_point)) + sys.stdout.flush() + for pair in list(time_dependent_restraints[time_point].keys()): + # Strategy changing gradually the spring constant and the equilibrium distance + # Case 1: The restraint is present at time point 0 and time point 1: + if pair in time_dependent_restraints[time_point]: + # Case A: The restrainttype is the same at time point 0 and time point 1 -> + # The spring force changes, and the equilibrium distance is the one at time_point+1 + restraints[time_point][pair] = [ + # Restraint type + [time_dependent_restraints[time_point][pair][0]], + # Initial spring constant + [time_dependent_restraints[time_point][pair][1]*time_dependent_steering_pairs['k_factor']], + # Final spring constant + [time_dependent_restraints[time_point][pair][1]*time_dependent_steering_pairs['k_factor']], + # Initial equilibrium distance + [time_dependent_restraints[time_point][pair][2]], + # Final equilibrium distance + [time_dependent_restraints[time_point][pair][2]], + # Number of timesteps for the gradual change + [int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point]*0.1)]] + if useColvars == True: + generate_time_dependent_colvars_list(restraints[time_point], time_dependent_steering_pairs['colvar_output'], time_dependent_steering_pairs['colvar_dump_freq']) + copyfile(time_dependent_steering_pairs['colvar_output'], + "colvar_list_from_time_point_%s_to_time_point_%s.txt" % + (str(time_point), str(time_point))) + lmp.command("velocity all create 1.0 %s" % kseed) + # Adding the colvar option and perfoming the steering + if time_point != time_points[0]: + lmp.command("unfix 4") + print("#fix 4 all colvars %s" % time_dependent_steering_pairs['colvar_output']) + sys.stdout.flush() + lmp.command("fix 4 all colvars %s tstat 2 output %sout" % (time_dependent_steering_pairs['colvar_output'],lammps_folder)) + else: + bond_list = generate_time_dependent_bond_list(restraints[time_point]) + for bond in bond_list: + lmp.command(bond) + + lmp.command("run %i" % int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point]*0.1)) + + # Time dependent steering + restraints = {} + #for i in xrange(time_points[0],time_points[-1]): + for time_point in time_points[0:-1]: + lmp.command("reset_timestep %i" % 0) + # Change to_dump with some way to load the conformations you want to store + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %ssteered_MD_from_time_point_%s_to_time_point_%s.XYZ id xu yu zu" % (to_dump, lammps_folder, time_point, time_point+1)) + lmp.command("dump_modify 1 format line \"%d %.5f %.5f %.5f\" sort id append yes") + + restraints[time_point] = {} + print("# Step %s - %s" % (time_point, time_point+1)) + sys.stdout.flush() + # Compute the current distance between any two particles + xc_tmp = np.array(lmp.gather_atoms("x",1,3)) + current_distances = compute_particles_distance(xc_tmp) + + for pair in set(list(time_dependent_restraints[time_point].keys())+list(time_dependent_restraints[time_point+1].keys())): + r = 0 + + # Strategy changing gradually the spring constant + # Case 1: The restraint is present at time point 0 and time point 1: + if pair in time_dependent_restraints[time_point] and pair in time_dependent_restraints[time_point+1]: + # Case A: The restrainttype is the same at time point 0 and time point 1 -> + # The spring force changes, and the equilibrium distance is the one at time_point+1 + if time_dependent_restraints[time_point][pair][0] == time_dependent_restraints[time_point+1][pair][0]: + r += 1 + restraints[time_point][pair] = [ + # Restraint type + [time_dependent_restraints[time_point+1][pair][0]], + # Initial spring constant + [time_dependent_restraints[time_point][pair][1] *time_dependent_steering_pairs['k_factor']], + # Final spring constant + [time_dependent_restraints[time_point+1][pair][1]*time_dependent_steering_pairs['k_factor']], + # Initial equilibrium distance + [time_dependent_restraints[time_point][pair][2]], + # Final equilibrium distance + [time_dependent_restraints[time_point+1][pair][2]], + # Number of timesteps for the gradual change + [int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point])]] + # Case B: The restrainttype is different between time point 0 and time point 1 + if time_dependent_restraints[time_point][pair][0] != time_dependent_restraints[time_point+1][pair][0]: + # Case a: The restrainttype is "Harmonic" at time point 0 + # and "LowerBoundHarmonic" at time point 1 + if time_dependent_restraints[time_point][pair][0] == "Harmonic": + r += 1 + restraints[time_point][pair] = [ + # Restraint type + [time_dependent_restraints[time_point][pair][0], time_dependent_restraints[time_point+1][pair][0]], + # Initial spring constant + [time_dependent_restraints[time_point][pair][1]*time_dependent_steering_pairs['k_factor'], 0.0], + # Final spring constant + [0.0, time_dependent_restraints[time_point+1][pair][1]*time_dependent_steering_pairs['k_factor']], + # Initial equilibrium distance + [time_dependent_restraints[time_point][pair][2], time_dependent_restraints[time_point][pair][2]], + # Final equilibrium distance + [time_dependent_restraints[time_point+1][pair][2], time_dependent_restraints[time_point+1][pair][2]], + # Number of timesteps for the gradual change + #[int(time_dependent_steering_pairs['timesteps_per_k_change']), int(time_dependent_steering_pairs['timesteps_per_k_change'])]] + [int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point]), int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point])]] + # Case b: The restrainttype is "LowerBoundHarmonic" at time point 0 + # and "Harmonic" at time point 1 + if time_dependent_restraints[time_point][pair][0] == "HarmonicLowerBound": + r += 1 + restraints[time_point][pair] = [ + # Restraint type + [time_dependent_restraints[time_point][pair][0], time_dependent_restraints[time_point+1][pair][0]], + # Initial spring constant + [time_dependent_restraints[time_point][pair][1]*time_dependent_steering_pairs['k_factor'], 0.0], + # Final spring constant + [0.0, time_dependent_restraints[time_point+1][pair][1]*time_dependent_steering_pairs['k_factor']], + # Initial equilibrium distance + [time_dependent_restraints[time_point][pair][2], time_dependent_restraints[time_point][pair][2]], + # Final equilibrium distance + [time_dependent_restraints[time_point+1][pair][2], time_dependent_restraints[time_point+1][pair][2]], + # Number of timesteps for the gradual change + #[int(time_dependent_steering_pairs['timesteps_per_k_change']), int(time_dependent_steering_pairs['timesteps_per_k_change'])]] + [int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point]), int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point])]] + + # Case 2: The restraint is not present at time point 0, but it is at time point 1: + elif pair not in time_dependent_restraints[time_point] and pair in time_dependent_restraints[time_point+1]: + # List content: restraint_type,kforce,distance + r += 1 + restraints[time_point][pair] = [ + # Restraint type -> Is the one at time point time_point+1 + [time_dependent_restraints[time_point+1][pair][0]], + # Initial spring constant + [0.0], + # Final spring constant + [time_dependent_restraints[time_point+1][pair][1]*time_dependent_steering_pairs['k_factor']], + # Initial equilibrium distance + [time_dependent_restraints[time_point+1][pair][2]], + # Final equilibrium distance + [time_dependent_restraints[time_point+1][pair][2]], + # Number of timesteps for the gradual change + [int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point])]] + + # Case 3: The restraint is present at time point 0, but it is not at time point 1: + elif pair in time_dependent_restraints[time_point] and pair not in time_dependent_restraints[time_point+1]: + # List content: restraint_type,kforce,distance + r += 1 + restraints[time_point][pair] = [ + # Restraint type -> Is the one at time point time_point + [time_dependent_restraints[time_point][pair][0]], + # Initial spring constant + [time_dependent_restraints[time_point][pair][1]*time_dependent_steering_pairs['k_factor']], + # Final spring constant + [0.0], + # Initial equilibrium distance + [time_dependent_restraints[time_point][pair][2]], + # Final equilibrium distance + [time_dependent_restraints[time_point][pair][2]], + # Number of timesteps for the gradual change + [int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point])]] + + #current_distances[pair], + else: + print("#ERROR None of the previous conditions is matched!") + if pair in time_dependent_restraints[time_point]: + print("# Pair %s at timepoint %s %s " % (pair, time_point, time_dependent_restraints[time_point][pair])) + if pair in time_dependent_restraints[time_point+1]: + print("# Pair %s at timepoint %s %s " % (pair, time_point+1, time_dependent_restraints[time_point+1][pair])) + continue + + if r > 1: + print("#ERROR Two of the previous conditions are matched!") + + #if pair in time_dependent_restraints[time_point]: + # print "# Pair %s at timepoint %s %s " % (pair, time_point, time_dependent_restraints[time_point][pair]) + #else: + # print "# Pair %s at timepoint %s None" % (pair, time_point) + + #if pair in time_dependent_restraints[time_point+1]: + # print "# Pair %s at timepoint %s %s " % (pair, time_point+1, time_dependent_restraints[time_point+1][pair]) + #else: + # print "# Pair %s at timepoint %s None" % (pair, time_point+1) + #print restraints[pair] + #print "" + lmp.command("velocity all create 1.0 %s" % kseed) + if useColvars == True: + generate_time_dependent_colvars_list(restraints[time_point], time_dependent_steering_pairs['colvar_output'], time_dependent_steering_pairs['colvar_dump_freq']) + copyfile(time_dependent_steering_pairs['colvar_output'], + "%scolvar_list_from_time_point_%s_to_time_point_%s.txt" % + (lammps_folder, str(time_point), str(time_point+1))) + # Adding the colvar option and perfoming the steering + if time_point != time_points[0]: + lmp.command("unfix 4") + print("#fix 4 all colvars %s" % time_dependent_steering_pairs['colvar_output']) + sys.stdout.flush() + lmp.command("fix 4 all colvars %s tstat 2 output %sout" % (time_dependent_steering_pairs['colvar_output'],lammps_folder)) + if to_dump: + lmp.command("thermo_style custom step temp epair emol pe ke etotal f_4") + lmp.command("thermo_modify norm no flush yes") + lmp.command("variable step equal step") + lmp.command("variable objfun equal f_4") + lmp.command('''fix 5 all print %s "${step} ${objfun}" file "%sobj_fun_from_time_point_%s_to_time_point_%s.txt" screen "no" title "#Timestep Objective_Function"''' % (time_dependent_steering_pairs['colvar_dump_freq'],lammps_folder,str(time_point), str(time_point+1))) + else: + bond_list = generate_time_dependent_bond_list(restraints[time_point]) + for bond in bond_list: + lmp.command(bond) + if to_dump: + lmp.command("thermo_style custom step temp epair emol pe ke etotal") + lmp.command("thermo_modify norm no flush yes") + lmp.command("variable step equal step") + lmp.command("variable objfun equal etotal") + lmp.command('''fix 5 all print %s "${step} ${objfun}" file "%sobj_fun_from_time_point_%s_to_time_point_%s.txt" screen "no" title "#Timestep Objective_Function"''' % (time_dependent_steering_pairs['colvar_dump_freq'],lammps_folder,str(time_point), str(time_point+1))) + + lmp.command("run %i" % int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point])) + + if time_point > 0: + + if exists("%sout.colvars.traj.BAK" % lammps_folder): + + copyfile("%sout.colvars.traj.BAK" % lammps_folder, "%srestrained_pairs_equilibrium_distance_vs_timestep_from_time_point_%s_to_time_point_%s.txt" % (lammps_folder, str(time_point-1), str(time_point))) + + os.remove("%sout.colvars.traj.BAK" % lammps_folder) + + # Set interactions for chromosome compartmentalization + if compartmentalization: + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %scompartmentalization_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + + # First we have to partition the genome in the defined compartments + for group in compartmentalization['partition']: + list_of_particles = get_list(compartmentalization['partition'][group]) + for atom in list_of_particles: + #print("set atom %s type %s" % (atom,group+1)) + lmp.command("set atom %s type %s" % (atom,group+1)) + + # Second we have to define the type of interactions + for pair in compartmentalization['interactions']: + #pair_coeff t1 t2 epsilon sigma rc + t1 = pair[0]+1 + t2 = pair[1]+1 + if t1 > t2: + t1 = pair[1]+1 + t2 = pair[0]+1 + + epsilon = compartmentalization['interactions'][pair][1] + + try: + sigma1 = compartmentalization['radii'][pair[0]] + except: + sigma1 = 0.5 + try: + sigma2 = compartmentalization['radii'][pair[1]] + except: + sigma2 = 0.5 + sigma = sigma1 + sigma2 + + if compartmentalization['interactions'][pair][0] == "attraction": + rc = sigma * 2.5 + if compartmentalization['interactions'][pair][0] == "repulsion": + rc = sigma * 1.12246152962189 + + print("pair_coeff %s %s lj/cut %s %s %s" % (t1,t2,epsilon,sigma,rc)) + lmp.command("pair_coeff %s %s lj/cut %s %s %s" % (t1,t2,epsilon,sigma,rc)) + try: + lmp.command("run %s" % (compartmentalization['runtime'])) + except: + pass + + + # Setup the pairs to co-localize using the COLVARS plug-in + if loop_extrusion_dynamics: + + # Start relaxation step + try: + lmp.command("reset_timestep 0") + lmp.command("run %i" % loop_extrusion_dynamics['timesteps_relaxation']) + except: + pass + + lmp.command("reset_timestep 0") + # Start Loop extrusion dynamics + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %sloop_extrusion_MD_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + + # Randomly extract starting point of the extrusion dynamics between start and stop + extruders_positions = [] + nextruders = int(chromosome_particle_numbers[0]/loop_extrusion_dynamics['separation']) + print(nextruders) + for extruder in range(nextruders): + extruders_positions.append(draw_loop_extrusion_starting_point(loop_extrusion_dynamics['chrlength'][0])) + + # Initialise the lifetime of each extruder + extruders_lifetimes = [] + for extruder in range(nextruders): + extruders_lifetimes.append(int(0)) + print(extruders_positions, extruders_lifetimes) + + lmp.command("compute xu all property/atom xu") + lmp.command("compute yu all property/atom yu") + lmp.command("compute zu all property/atom zu") + + # Loop extrusion steps + for LES in range(int(run_time/loop_extrusion_dynamics['extrusion_time'])): + thermo_style="thermo_style custom step temp epair emol" + + # Update the bond restraint + loop_number = 1 + for particle1,particle2 in extruders_positions: + print("# fix LE%i all restrain bond %i %i %f %f %f" % (loop_number, + particle1, + particle2, + loop_extrusion_dynamics['attraction_strength'], + loop_extrusion_dynamics['attraction_strength'], + loop_extrusion_dynamics['equilibrium_distance'])) + + lmp.command("fix LE%i all restrain bond %i %i %f %f %f" % (loop_number, + particle1, + particle2, + loop_extrusion_dynamics['attraction_strength'], + loop_extrusion_dynamics['attraction_strength'], + loop_extrusion_dynamics['equilibrium_distance'])) + lmp.command("variable x%i equal c_xu[%i]" % (particle1, particle1)) + lmp.command("variable x%i equal c_xu[%i]" % (particle2, particle2)) + lmp.command("variable y%i equal c_yu[%i]" % (particle1, particle1)) + lmp.command("variable y%i equal c_yu[%i]" % (particle2, particle2)) + lmp.command("variable z%i equal c_zu[%i]" % (particle1, particle1)) + lmp.command("variable z%i equal c_zu[%i]" % (particle2, particle2)) + + lmp.command("variable xLE%i equal v_x%i-v_x%i" % (loop_number, particle1, particle2)) + lmp.command("variable yLE%i equal v_y%i-v_y%i" % (loop_number, particle1, particle2)) + lmp.command("variable zLE%i equal v_z%i-v_z%i" % (loop_number, particle1, particle2)) + lmp.command("variable dist_%i_%i equal sqrt(v_xLE%i*v_xLE%i+v_zLE%i*v_zLE%i+v_zLE%i*v_zLE%i)" % (particle1, + particle2, + loop_number, + loop_number, + loop_number, + loop_number, + loop_number, + loop_number)) + thermo_style += " v_dist_%i_%i" % (particle1, particle2) + loop_number += 1 + + lmp.command("%s" % thermo_style) + # Doing the LES + lmp.command("run %i" % loop_extrusion_dynamics['extrusion_time']) + + # update the lifetime of each extruder + for extruder in range(nextruders): + extruders_lifetimes[extruder] = extruders_lifetimes[extruder] + 1 + + # Remove the loop extrusion restraint! + loop_number = 1 + for particle1,particle2 in extruders_positions: + + print("# unfix LE%i" % (loop_number)) + lmp.command("unfix LE%i" % (loop_number)) + + loop_number += 1 + + # Update the particles involved in the loop extrusion interaction: + # decrease the intial_start by one until you get to start + # increase the intial_stop by one until you get to stop + for extruder in range(len(extruders_positions)): + # If the left part reaches the start of the chromosome -> Stop extruding + if extruders_positions[extruder][0] > 1: + random_number = uniform(0, 1) + if random_number <= loop_extrusion_dynamics['left_extrusion_rate']: + extruders_positions[extruder][0] -= 1 + # If the right part reaches the end of the chromosome -> Stop extruding + if extruders_positions[extruder][1] < chromosome_particle_numbers[0]: + random_number = uniform(0, 1) + if random_number <= loop_extrusion_dynamics['right_extrusion_rate']: + extruders_positions[extruder][1] += 1 + # If the extruder reached its lifetime, put it in another position + if extruders_lifetimes[extruder] == loop_extrusion_dynamics['lifetime']: + extruders_positions[extruder] = draw_loop_extrusion_starting_point(loop_extrusion_dynamics['chrlength'][0]) + # Re-initialise the lifetime of the extruder + extruders_lifetimes[extruder] = 0 + # Check presence of barriers + if loop_extrusion_dynamics['barriers_permeability'] < 1.0: + # If a motor tries to overcome a barrier we stop it with a probability > than the permeability + # If the barrier is on the left of the extruders, which is extruding contrary to the chain index, we have to re-put the extruder forwards + if extruders_positions[extruder][0] in loop_extrusion_dynamics['barriers']: + random_number = uniform(0, 1) + if random_number >= loop_extrusion_dynamics['barriers_permeability']: + extruders_positions[extruder][0] += 1 + # If the barrier is on the left of the extruders, which is extruding with the chain index, we have to re-put the extruder backwards + if extruders_positions[extruder][1] in loop_extrusion_dynamics['barriers']: + random_number = uniform(0, 1) + if random_number >= loop_extrusion_dynamics['barriers_permeability']: + extruders_positions[extruder][1] -= 1 + + print(extruders_positions,extruders_lifetimes) + + ### Put here the creationg of a pickle with the complete trajectory ### + if to_dump: + lmp.command("undump 1") + lmp.command("dump 1 all custom %i %sloop_extrusion_MD_*.XYZ id xu yu zu" % (to_dump,lammps_folder)) + # Post-processing analysis + # Save coordinates + #for time in range(0,runtime,to_dump): + # xc.append(np.array(read_trajectory_file("%s/loop_extrusion_MD_%s.XYZ" % (lammps_folder, time)))) + + #xc.append(np.array(lmp.gather_atoms("x",1,3))) + + lmp.close() + + result = [] + for stg in range(len(xc)): + #log_objfun = read_objective_function("%sobj_fun_from_time_point_%s_to_time_point_%s.txt" % (lammps_folder, str(stg), str(stg+1))) + log_objfun = [0.0] + for timepoint in range(1,timepoints+1): + lammps_model = LAMMPSmodel({'x' : [], + 'y' : [], + 'z' : [], + 'cluster' : 'Singleton', + 'log_objfun' : log_objfun, + 'objfun' : log_objfun[-1], + 'radius' : 0.5, #float(CONFIG.HiC['resolution'] * CONFIG.HiC['scale'])/2, + 'index' : kseed+timepoint, + 'rand_init' : str(kseed+timepoint)}) + + if pbc: + store_conformation_with_pbc(xc[stg], lammps_model, confining_environment) + else: + skip_first = 0 + if time_dependent_steering_pairs: + skip_first = 1 + for i in range((timepoint-1+skip_first)*len(LOCI)*3,(timepoint+skip_first)*len(LOCI)*3,3): + lammps_model['x'].append(xc[stg][i]*float(CONFIG.HiC['resolution'] * CONFIG.HiC['scale'])) + lammps_model['y'].append(xc[stg][i+1]*float(CONFIG.HiC['resolution'] * CONFIG.HiC['scale'])) + lammps_model['z'].append(xc[stg][i+2]*float(CONFIG.HiC['resolution'] * CONFIG.HiC['scale'])) + result.append(lammps_model) + + #os.remove("%slog.cite" % lammps_folder) + # safe finished model + if model_path != False: + with open(model_path, "wb") as output_file: + dump((kseed,result), output_file) + ################### Special case for clusters with disk quota + # Remove the saved steps + if saveRestart == True: + if os.path.isdir(restart_file): + restart_path = restart_file + else: + restart_path = '/'.join(restart_file.split('/')[:-1]) + '/' + for pathfile in os.listdir(restart_path): + if pathfile.startswith('restart'): + os.remove(restart_path + pathfile) + ################################################################## + # Load initial conformation and return it + init_conf = read_conformation_file(initial_conformation) + + return (kseed, result, init_conf) + +def read_trajectory_file(fname): + + coords=[] + fhandler = open(fname) + line = next(fhandler) + try: + while True: + if line.startswith('ITEM: TIMESTEP'): + while not line.startswith('ITEM: ATOMS'): + line = next(fhandler) + if line.startswith('ITEM: ATOMS'): + line = next(fhandler) + line = line.strip() + if len(line) == 0: + continue + line_vals = line.split() + coords += [float(line_vals[1]),float(line_vals[2]),float(line_vals[3])] + line = next(fhandler) + except StopIteration: + pass + fhandler.close() + + return coords + +def read_conformation_file(fname): + + mod={'x':[], 'y':[], 'z':[]} + fhandler = open(fname) + line = next(fhandler) + try: + while True: + if line.startswith('LAMMPS input data file'): + while not line.startswith(' Atoms'): + line = next(fhandler) + if line.startswith(' Atoms'): + line = next(fhandler) + while len(line.strip()) == 0: + line = next(fhandler) + line = line.strip() + line_vals = line.split() + mod['x'].append(float(line_vals[3])) + mod['y'].append(float(line_vals[4])) + mod['z'].append(float(line_vals[5])) + line = next(fhandler) + if len(line.strip()) == 0: + break + except StopIteration: + pass + fhandler.close() + + return mod + +########## Part to perform the restrained dynamics ########## +# I should add here: The steered dynamics (Irene's and Hi-C based models) ; +# The loop extrusion dynamics ; the binders based dynamics (Marenduzzo and Nicodemi)...etc... + +def linecount(filename): + """ + Count valid lines of input colvars file + + :param filename: input colvars file. + + :returns: number of valid contact lines + + """ + + k = 0 + tfp = open(filename) + for i, line in enumerate(tfp): + + if line.startswith('#'): + continue + cols_vals = line.split() + if cols_vals[1] == cols_vals[2]: + continue + k += 1 + + return k + +########## + +def generate_colvars_list(steering_pairs, + kincrease=0, + colvars_header='# collective variable: monitor distances\n\ncolvarsTrajFrequency 1000 # output every 1000 steps\ncolvarsRestartFrequency 10000000\n', + colvars_template=''' + +colvar { + name %s + # %s %s %i + distance { + group1 { + atomNumbers %i + } + group2 { + atomNumbers %i + } + } +}''', + colvars_tail = ''' + +harmonic { + name h_pot_%s + colvars %s + centers %s + forceConstant %f +}\n''', colvars_harmonic_lower_bound_tail = ''' + +harmonicWalls { + name hlb_pot_%s + colvars %s + lowerWalls %s + forceConstant %f + lowerWallConstant 1.0 +}\n''' + ): + + """ + Generates lammps colvars file http://lammps.sandia.gov/doc/PDF/colvars-refman-lammps.pdf + + :param dict steering_pairs: dictionary containing all the information to write down the + the input file for the colvars implementation + :param exisiting_template colvars_header: header template for colvars file. + :param exisiting_template colvars_template: contact template for colvars file. + :param exisiting_template colvars_tail: tail template for colvars file. + + """ + + # Getting the input + # XXXThe target_pairs could be also a list as the one in output of get_HiCbased_restraintsXXX + target_pairs = steering_pairs['colvar_input'] + outfile = steering_pairs['colvar_output'] + if 'kappa_vs_genomic_distance' in steering_pairs: + kappa_vs_genomic_distance = steering_pairs['kappa_vs_genomic_distance'] + if 'chrlength' in steering_pairs: + chrlength = steering_pairs['chrlength'] + else: + chrlength = 0 + if 'copies' in steering_pairs: + copies = steering_pairs['copies'] + else: + copies = ['A'] + kbin = 10000000 + binsize = steering_pairs['binsize'] + if 'percentage_enforced_contacts' in steering_pairs: + percentage_enforced_contacts = steering_pairs['perc_enfor_contacts'] + else: + percentage_enforced_contacts = 100 + + # Here we extract from all the restraints only + # a random sub-sample of percentage_enforced_contacts/100*totcolvars + rand_lines = [] + i=0 + j=0 + if isinstance(target_pairs, str): + totcolvars = linecount(target_pairs) + ncolvars = int(totcolvars*(float(percentage_enforced_contacts)/100)) + + #print "Number of enforced contacts = %i over %i" % (ncolvars,totcolvars) + rand_positions = sample(list(range(totcolvars)), ncolvars) + rand_positions = sorted(rand_positions) + + tfp = open(target_pairs) + with open(target_pairs) as f: + for line in f: + line = line.strip() + if j >= ncolvars: + break + if line.startswith('#'): + continue + + cols_vals = line.split() + # Avoid to enforce restraints between the same bin + if cols_vals[1] == cols_vals[2]: + continue + + if i == rand_positions[j]: + rand_lines.append(line) + j += 1 + i += 1 + tfp.close() + elif isinstance(target_pairs, HiCBasedRestraints): + + rand_lines = target_pairs.get_hicbased_restraints() + totcolvars = len(rand_lines) + ncolvars = int(totcolvars*(float(percentage_enforced_contacts)/100)) + + #print "Number of enforced contacts = %i over %i" % (ncolvars,totcolvars) + rand_positions = sample(list(range(totcolvars)), ncolvars) + rand_positions = sorted(rand_positions) + + + else: + print("Unknown target_pairs") + return + + + + #print rand_lines + + seqdists = {} + poffset=0 + outf = open(outfile,'w') + outf.write(colvars_header) + for copy_nbr in copies: + i = 1 + for line in rand_lines: + if isinstance(target_pairs, str): + cols_vals = line.split() + else: + cols_vals = ['chr'] + line + + #print cols_vals + + if isinstance(target_pairs, HiCBasedRestraints) and cols_vals[3] != "Harmonic" and cols_vals[3] != "HarmonicLowerBound": + continue + + part1_start = int(cols_vals[1])*binsize + part1_end = (int(cols_vals[1])+1)*binsize + #print part1_start, part1_end + + part2_start = int(cols_vals[2])*binsize + part2_end = (int(cols_vals[2])+1)*binsize + #print part2_start, part2_end + + name = str(i)+copy_nbr + seqdist = abs(part1_start-part2_start) + #print seqdist + + region1 = cols_vals[0] + '_' + str(part1_start) + '_' + str(part1_end) + region2 = cols_vals[0] + '_' + str(part2_start) + '_' + str(part2_end) + + particle1 = int(cols_vals[1]) + 1 + poffset + particle2 = int(cols_vals[2]) + 1 + poffset + + seqdists[name] = seqdist + + outf.write(colvars_template % (name,region1,region2,seqdist,particle1,particle2)) + + if isinstance(target_pairs, HiCBasedRestraints): + # If the spring constant is zero we avoid to add the restraint! + if cols_vals[4] == 0.0: + continue + + centre = cols_vals[5] + kappa = cols_vals[4]*steering_pairs['k_factor'] + + if cols_vals[3] == "Harmonic": + outf.write(colvars_tail % (name,name,centre,kappa)) + + if cols_vals[3] == "HarmonicLowerBound": + outf.write(colvars_harmonic_lower_bound_tail % (name,name,centre,kappa)) + + i += 1 + poffset += chrlength + + outf.flush() + + #=========================================================================== + # if isinstance(target_pairs, HiCBasedRestraints): + # for copy_nbr in copies: + # i = 1 + # for line in rand_lines: + # cols_vals = line + # + # if cols_vals[3] == 0.0: + # continue + # + # name = str(i)+copy_nbr + # + # centre = cols_vals[4] + # kappa = cols_vals[3] + # + # if cols_vals[2] == "Harmonic": + # outf.write(colvars_tail % (name,name,centre,kappa)) + # + # elif cols_vals[2] == "HarmonicLowerBound": + # outf.write(colvars_harmonic_lower_bound_tail % (name,name,centre,kappa)) + # + # + # + # i += 1 + # poffset += chrlength + # + # outf.flush() + #=========================================================================== + + if 'kappa_vs_genomic_distance' in steering_pairs: + + kappa_values = {} + with open(kappa_vs_genomic_distance) as kgd: + for line in kgd: + line_vals = line.split() + kappa_values[int(line_vals[0])] = float(line_vals[1]) + + for seqd in set(seqdists.values()): + kappa = 0 + if seqd in kappa_values: + kappa = kappa_values[seqd]*kincrease + else: + for kappa_key in sorted(kappa_values, key=int): + if int(kappa_key) > seqd: + break + kappa = kappa_values[kappa_key]*kincrease + centres='' + names='' + for seq_name in seqdists: + if seqdists[seq_name] == seqd: + centres += ' 1.0' + names += ' '+seq_name + + outf.write(colvars_tail % (str(seqd),names,centres,kappa)) + + outf.flush() + + outf.close() + + +def generate_bond_list(steering_pairs): + + """ + Generates lammps bond commands + + :param dict steering_pairs: dictionary containing all the information to write down the + the input file for the bonds + """ + + # Getting the input + # The target_pairs could be also a list as the one in output of get_HiCbased_restraintsXXX + target_pairs = steering_pairs['colvar_input'] + if 'kappa_vs_genomic_distance' in steering_pairs: + kappa_vs_genomic_distance = steering_pairs['kappa_vs_genomic_distance'] + if 'chrlength' in steering_pairs: + chrlength = steering_pairs['chrlength'] + else: + chrlength = 0 + if 'copies' in steering_pairs: + copies = steering_pairs['copies'] + else: + copies = ['A'] + kbin = 10000000 + binsize = steering_pairs['binsize'] + if 'percentage_enforced_contacts' in steering_pairs: + percentage_enforced_contacts = steering_pairs['perc_enfor_contacts'] + else: + percentage_enforced_contacts = 100 + + # Here we extract from all the restraints only + # a random sub-sample of percentage_enforced_contacts/100*totcolvars + rand_lines = [] + i=0 + j=0 + if isinstance(target_pairs, str): + totcolvars = linecount(target_pairs) + ncolvars = int(totcolvars*(float(percentage_enforced_contacts)/100)) + + #print "Number of enforced contacts = %i over %i" % (ncolvars,totcolvars) + rand_positions = sample(list(range(totcolvars)), ncolvars) + rand_positions = sorted(rand_positions) + + tfp = open(target_pairs) + with open(target_pairs) as f: + for line in f: + line = line.strip() + if j >= ncolvars: + break + if line.startswith('#'): + continue + + cols_vals = line.split() + # Avoid to enforce restraints between the same bin + if cols_vals[1] == cols_vals[2]: + continue + + if i == rand_positions[j]: + rand_lines.append(line) + j += 1 + i += 1 + tfp.close() + elif isinstance(target_pairs, HiCBasedRestraints): + + rand_lines = target_pairs.get_hicbased_restraints() + totcolvars = len(rand_lines) + ncolvars = int(totcolvars*(float(percentage_enforced_contacts)/100)) + + #print "Number of enforced contacts = %i over %i" % (ncolvars,totcolvars) + rand_positions = sample(list(range(totcolvars)), ncolvars) + rand_positions = sorted(rand_positions) + + + else: + print("Unknown target_pairs") + return + + + + #print rand_lines + + seqdists = {} + poffset=0 + outf = [] #### a list + for copy_nbr in copies: + i = 1 + for line in rand_lines: + if isinstance(target_pairs, str): + cols_vals = line.split() + else: + cols_vals = ['chr'] + line + + #print cols_vals + + if isinstance(target_pairs, HiCBasedRestraints) and cols_vals[3] != "Harmonic" and cols_vals[3] != "HarmonicLowerBound": + continue + + part1_start = int(cols_vals[1])*binsize + part1_end = (int(cols_vals[1])+1)*binsize + #print part1_start, part1_end + + part2_start = int(cols_vals[2])*binsize + part2_end = (int(cols_vals[2])+1)*binsize + #print part2_start, part2_end + + name = str(i)+copy_nbr + seqdist = abs(part1_start-part2_start) + #print seqdist + + region1 = cols_vals[0] + '_' + str(part1_start) + '_' + str(part1_end) + region2 = cols_vals[0] + '_' + str(part2_start) + '_' + str(part2_end) + + particle1 = int(cols_vals[1]) + 1 + poffset + particle2 = int(cols_vals[2]) + 1 + poffset + + seqdists[name] = seqdist + + + if isinstance(target_pairs, HiCBasedRestraints): + # If the spring constant is zero we avoid to add the restraint! + if cols_vals[4] == 0.0: + continue + + centre = cols_vals[5] + kappa = cols_vals[4]*steering_pairs['k_factor'] + + bondType = None + if cols_vals[3] == "Harmonic": + bondType = 'bond' + elif cols_vals[3] == "HarmonicLowerBound": + bondType = 'lbound' + + if bondType: + outf.append('fix %s all restrain %s %d %d %f %f %f %f' %( + name, bondType, particle1, particle2, 0, kappa, + centre, centre)) + + + i += 1 + poffset += chrlength + + return outf + +########## + +def generate_time_dependent_bond_list(steering_pairs): + + + """ + Generates lammps bond commands + + :param dict steering_pairs: dictionary containing all the information to write down the + the input file for the bonds + """ + + outf = [] #### a list + # Defining the particle pairs + for pair in steering_pairs: + + #print steering_pairs[pair] + sys.stdout.flush() + for i in range(len(steering_pairs[pair][0])): + name = "%s_%s_%s" % (i, int(pair[0])+1, int(pair[1])+1) + seqdist = abs(int(pair[1])-int(pair[0])) + particle1 = int(pair[0])+1 + particle2 = int(pair[1])+1 + + restraint_type = steering_pairs[pair][0][i] + kappa_start = steering_pairs[pair][1][i] + kappa_stop = steering_pairs[pair][2][i] + centre_start = steering_pairs[pair][3][i] + centre_stop = steering_pairs[pair][4][i] + timesteps_per_k_change = steering_pairs[pair][5][i] + + bonType = None + if restraint_type == "Harmonic": + bonType = 'bond' + elif restraint_type == "HarmonicLowerBound": + bonType = 'lbound' + + if bonType: + outf.append('fix %s all restrain %s %d %d %f %f %f %f' %( + name, bonType, particle1, particle2, kappa_start, kappa_stop, + centre_start, centre_stop)) + return outf + +########## + +def generate_time_dependent_colvars_list(steering_pairs, + outfile, + colvar_dump_freq, + colvars_header='# collective variable: monitor distances\n\ncolvarsTrajFrequency %i # output every %i steps\ncolvarsRestartFrequency 1000000\n', + colvars_template=''' + +colvar { + name %s + # %s %s %i + width 1.0 + distance { + group1 { + atomNumbers %i + } + group2 { + atomNumbers %i + } + } +}''', + colvars_harmonic_tail = ''' + +harmonic { + name h_pot_%s + colvars %s + forceConstant %f + targetForceConstant %f + centers %s + targetCenters %s + targetNumSteps %s + outputEnergy yes +}\n''', + colvars_harmonic_lower_bound_tail = ''' +harmonicBound { + name hlb_pot_%s + colvars %s + forceConstant %f + targetForceConstant %f + centers %f + targetCenters %f + targetNumSteps %s + outputEnergy yes +}\n''' + ): + + + """ + harmonicWalls { + name hlb_pot_%s + colvars %s + forceConstant %f # This is the force constant at time_point + targetForceConstant %f # This is the force constant at time_point+1 + centers %f # This is the equilibrium distance at time_point+1 + targetCenters %f # This is the equilibrium distance at time_point+1 + targetNumSteps %d # This is the number of timesteps between time_point and time_point+1 + outputEnergy yes + }\n''', + + + colvars_harmonic_lower_bound_tail = ''' + + harmonicBound { + name hlb_pot_%s + colvars %s + forceConstant %f # This is the force constant at time_point + targetForceConstant %f # This is the force constant at time_point+1 + centers %f # This is the equilibrium distance at time_point+1 + targetCenters %f # This is the equilibrium distance at time_point+1 + targetNumSteps %d # This is the number of timesteps between time_point and time_point+1 + outputEnergy yes + }\n''', + + Generates lammps colvars file http://lammps.sandia.gov/doc/PDF/colvars-refman-lammps.pdf + + :param dict steering_pairs: dictionary containing all the information to write down the + the input file for the colvars implementation + :param exisiting_template colvars_header: header template for colvars file. + :param exisiting_template colvars_template: contact template for colvars file. + :param exisiting_template colvars_tail: tail template for colvars file. + + """ + + #restraints[pair] = [time_dependent_restraints[time_point+1][pair][0], # Restraint type -> Is the one at time point time_point+1 + #time_dependent_restraints[time_point][pair][1]*10., # Initial spring constant + #time_dependent_restraints[time_point+1][pair][1]*10., # Final spring constant + #time_dependent_restraints[time_point][pair][2], # Initial equilibrium distance + #time_dependent_restraints[time_point+1][pair][2], # Final equilibrium distance + #int(time_dependent_steering_pairs['timesteps_per_k_change'][time_point])] # Number of timesteps for the gradual change + + outf = open(outfile,'w') + #tfreq=10000 + #for pair in steering_pairs: + # if len(steering_pairs[pair][5]) >= 1: + # tfreq = int(steering_pairs[pair][5][0]/100) + # break + + tfreq = colvar_dump_freq + outf.write(colvars_header % (tfreq, tfreq)) + # Defining the particle pairs + for pair in steering_pairs: + + #print steering_pairs[pair] + sys.stdout.flush() + for i in range(len(steering_pairs[pair][0])): + name = "%s_%s_%s" % (i, int(pair[0])+1, int(pair[1])+1) + seqdist = abs(int(pair[1])-int(pair[0])) + region1 = "particle_%s" % (int(pair[0])+1) + region2 = "particle_%s" % (int(pair[1])+1) + + outf.write(colvars_template % (name,region1,region2,seqdist,int(pair[0])+1,int(pair[1])+1)) + + restraint_type = steering_pairs[pair][0][i] + kappa_start = steering_pairs[pair][1][i] + kappa_stop = steering_pairs[pair][2][i] + centre_start = steering_pairs[pair][3][i] + centre_stop = steering_pairs[pair][4][i] + timesteps_per_k_change = steering_pairs[pair][5][i] + + if restraint_type == "Harmonic": + outf.write(colvars_harmonic_tail % (name,name,kappa_start,kappa_stop,centre_start,centre_stop,timesteps_per_k_change)) + + if restraint_type == "HarmonicLowerBound": + outf.write(colvars_harmonic_lower_bound_tail % (name,name,kappa_start,kappa_stop,centre_start,centre_stop,timesteps_per_k_change)) + + + + + outf.flush() + + outf.close() + +########## + +def get_time_dependent_colvars_list(time_dependent_steering_pairs): + + """ + Generates lammps colvars file http://lammps.sandia.gov/doc/PDF/colvars-refman-lammps.pdf + + :param dict time_dependent_steering_pairs: dictionary containing all the information to write down the + the input file for the colvars implementation + """ + + # Getting the input + # XXXThe target_pairs_file could be also a list as the one in output of get_HiCbased_restraintsXXX + target_pairs = time_dependent_steering_pairs['colvar_input'] + outfile = time_dependent_steering_pairs['colvar_output'] + if 'chrlength' in time_dependent_steering_pairs: + chrlength = time_dependent_steering_pairs['chrlength'] + binsize = time_dependent_steering_pairs['binsize'] + if 'percentage_enforced_contacts' in time_dependent_steering_pairs: + percentage_enforced_contacts = time_dependent_steering_pairs['perc_enfor_contacts'] + else: + percentage_enforced_contacts = 100 + + # HiCbasedRestraints is a list of restraints returned by this function. + # Each entry of the list is a list of 5 elements describing the details of the restraint: + # 0 - particle_i + # 1 - particle_j + # 2 - type_of_restraint = Harmonic or HarmonicLowerBound or HarmonicUpperBound + # 3 - the kforce of the restraint + # 4 - the equilibrium (or maximum or minimum respectively) distance associated to the restraint + + # Here we extract from all the restraints only a random sub-sample + # of percentage_enforced_contacts/100*totcolvars + rand_lines = [] + i=0 + j=0 + if isinstance(target_pairs, str): + time_dependent_restraints = {} + totcolvars = linecount(target_pairs) + ncolvars = int(totcolvars*(float(percentage_enforced_contacts)/100)) + + #print "Number of enforced contacts = %i over %i" % (ncolvars,totcolvars) + rand_positions = sample(list(range(totcolvars)), ncolvars) + rand_positions = sorted(rand_positions) + + with open(target_pairs) as f: + for line in f: + line = line.strip() + if j >= ncolvars: + break + if line.startswith('#') or line == "": + continue + + # Line format: timepoint,particle1,particle2,restraint_type,kforce,distance + cols_vals = line.split() + + if int(cols_vals[1]) < int(cols_vals[2]): + pair = (int(cols_vals[1]), int(cols_vals[2])) + else: + pair = (int(cols_vals[2]), int(cols_vals[1])) + + try: + if pair in time_dependent_restraints[int(cols_vals[0])]: + print("WARNING: Check your restraint list! pair %s is repeated in time point %s!" % (pair, int(cols_vals[0]))) + # List content: restraint_type,kforce,distance + time_dependent_restraints[int(cols_vals[0])][pair] = [cols_vals[3], + float(cols_vals[4]), + float(cols_vals[5])] + except: + time_dependent_restraints[int(cols_vals[0])] = {} + # List content: restraint_type,kforce,distance + time_dependent_restraints[int(cols_vals[0])][pair] = [cols_vals[3], + float(cols_vals[4]), + float(cols_vals[5])] + if i == rand_positions[j]: + rand_lines.append(line) + j += 1 + i += 1 + elif isinstance(target_pairs, list): + time_dependent_restraints = dict((i,{}) for i in range(len(target_pairs))) + for time_point, HiCR in enumerate(target_pairs): + rand_lines = HiCR.get_hicbased_restraints() + totcolvars = len(rand_lines) + ncolvars = int(totcolvars*(float(percentage_enforced_contacts)/100)) + + #print "Number of enforced contacts = %i over %i" % (ncolvars,totcolvars) + rand_positions = sample(list(range(totcolvars)), ncolvars) + rand_positions = sorted(rand_positions) + + for cols_vals in rand_lines: + + if cols_vals[2] != "Harmonic" and cols_vals[2] != "HarmonicLowerBound": + continue + if int(cols_vals[0]) < int(cols_vals[1]): + pair = (int(cols_vals[0]), int(cols_vals[1])) + else: + pair = (int(cols_vals[1]), int(cols_vals[0])) + + if pair in time_dependent_restraints[time_point]: + print("WARNING: Check your restraint list! pair %s is repeated in time point %s!" % (pair, time_point)) + # List content: restraint_type,kforce,distance + time_dependent_restraints[time_point][pair] = [cols_vals[2], + float(cols_vals[3]), + float(cols_vals[4])] + + else: + print("Unknown target_pairs") + return + +# for time_point in sorted(time_dependent_restraints.keys()): +# for pair in time_dependent_restraints[time_point]: +# print "#Time_dependent_restraints", time_point,pair, time_dependent_restraints[time_point][pair] + return time_dependent_restraints + +### TODO Add the option to add also spheres of different radii (e.g. to simulate nucleoli) +########## Part to generate the initial conformation ########## +def generate_chromosome_random_walks_conformation ( chromosome_particle_numbers , + confining_environment=['sphere',100.] , + particle_radius=0.5 , + seed_of_the_random_number_generator=1 , + number_of_conformations=1, + outfile="Initial_random_walk_conformation.dat", + pbc=False, + center=True): + """ + Generates lammps initial conformation file by random walks + + :param chromosome_particle_numbers: list with the number of particles of each chromosome. + :param ['sphere',100.] confining_environment: dictionary with the confining environment of the conformation + Possible confining environments: + ['cube',edge_width] + ['sphere',radius] + ['ellipsoid',x-semiaxes, y-semiaxes, z-semiaxes] + ['cylinder', basal radius, height] + :param 0.5 particle_radius: Radius of each particle. + :param 1 seed_of_the_random_number_generator: random seed. + :param 1 number_of_conformations: copies of the conformation. + :param outfile: file where to store resulting initial conformation file + + """ + seed(seed_of_the_random_number_generator) + + # This allows to organize the largest chromosomes first. + # This is to get a better acceptance of the chromosome positioning. + chromosome_particle_numbers = [int(x) for x in chromosome_particle_numbers] + chromosome_particle_numbers.sort(key=int,reverse=True) + + for cnt in range(number_of_conformations): + + final_random_walks = generate_random_walks(chromosome_particle_numbers, + particle_radius, + confining_environment, + pbc=pbc, + center=center) + + # Writing the final_random_walks conformation + #print "Succesfully generated conformation number %d\n" % (cnt+1) + write_initial_conformation_file(final_random_walks, + chromosome_particle_numbers, + confining_environment, + out_file=outfile) + +########## + +def generate_chromosome_rosettes_conformation ( chromosome_particle_numbers , + fractional_radial_positions=None, + confining_environment=['sphere',100.] , + rosette_radius=12.0 , particle_radius=0.5 , + seed_of_the_random_number_generator=1 , + number_of_conformations=1, + outfile = "Initial_rosette_conformation.dat"): + """ + Generates lammps initial conformation file by rosettes conformation + + :param chromosome_particle_numbers: list with the number of particles of each chromosome. + :param None fractional_radial_positions: list with fractional radial positions for all the chromosomes. + :param ['sphere',100.] confining_environment: dictionary with the confining environment of the conformation + Possible confining environments: + ['cube',edge_width] + ['sphere',radius] + ['ellipsoid',x-semiaxes, y-semiaxes, z-semiaxes] + ['cylinder', basal radius, height] + :param 0.5 particle_radius: Radius of each particle. + :param 1 seed_of_the_random_number_generator: random seed. + :param 1 number_of_conformations: copies of the conformation. + :param outfile: file where to store resulting initial conformation file + + """ + seed(seed_of_the_random_number_generator) + + # This allows to organize the largest chromosomes first. + # This is to get a better acceptance of the chromosome positioning. + chromosome_particle_numbers = [int(x) for x in chromosome_particle_numbers] + chromosome_particle_numbers.sort(key=int,reverse=True) + + initial_rosettes , rosettes_lengths = generate_rosettes(chromosome_particle_numbers, + rosette_radius, + particle_radius) + print(rosettes_lengths) + + + # Constructing the rosettes conformations + for cnt in range(number_of_conformations): + + particle_inside = 0 # 0 means a particle is outside + particles_overlap = 0 # 0 means two particles are overlapping + while particle_inside == 0 or particles_overlap == 0: + particle_inside = 1 + particles_overlap = 1 + segments_P1 = [] + segments_P0 = [] + side = 0 + init_rosettes = copy.deepcopy(initial_rosettes) + + # Guess of the initial segment conformation: + # 1 - each rod is placed inside the confining evironment + # in a random position and with random orientation + # 2 - possible clashes between generated rods are checked + if fractional_radial_positions: + if len(fractional_radial_positions) != len(chromosome_particle_numbers): + print("Please provide the desired fractional radial positions for all the chromosomes") + sys.exit() + segments_P1 , segments_P0 = generate_rods_biased_conformation(rosettes_lengths, rosette_radius, + confining_environment, + fractional_radial_positions, + max_number_of_temptative=100000) + else: + segments_P1 , segments_P0 = generate_rods_random_conformation(rosettes_lengths, rosette_radius, + confining_environment, + max_number_of_temptative=100000) + + # Roto-translation of the rosettes according to the segment position and orientation + final_rosettes = rosettes_rototranslation(init_rosettes, segments_P1, segments_P0) + + # Checking that the beads are all inside the confining environment and are not overlapping + for rosette_pair in list(combinations(final_rosettes,2)): + molecule0 = list(zip(rosette_pair[0]['x'],rosette_pair[0]['y'],rosette_pair[0]['z'])) + molecule1 = list(zip(rosette_pair[1]['x'],rosette_pair[1]['y'],rosette_pair[1]['z'])) + distances = scipy.spatial.distance.cdist(molecule1,molecule0) + print(len(molecule0),len(molecule0[0]),distances.min()) + if distances.min() < particle_radius*2.0*0.95: + particles_overlap = 0 + break + + if particles_overlap != 0: + for r in xrange(len(final_rosettes)): + molecule0 = list(zip(final_rosettes[r]['x'],final_rosettes[r]['y'],final_rosettes[r]['z'])) + print(len(molecule0),len(molecule0[0])) + + distances = scipy.spatial.distance.cdist(molecule0,molecule0) + print(distances.min()) + for i in xrange(len(molecule0)): + for j in xrange(i+1,len(molecule0)): + if distances[(i,j)] < particle_radius*2.0*0.95: + particles_overlap = 0 + if particles_overlap == 0: + break + if particles_overlap == 0: + break + if particles_overlap == 0: + break + + # Writing the final_rosettes conformation + print("Succesfully generated conformation number %d\n" % (cnt+1)) + write_initial_conformation_file(final_rosettes, + chromosome_particle_numbers, + confining_environment, + out_file=outfile) + +########## + +def generate_chromosome_rosettes_conformation_with_pbc ( chromosome_particle_numbers , + fractional_radial_positions=None, + confining_environment=['cube',100.] , + rosette_radius=12.0 , particle_radius=0.5 , + seed_of_the_random_number_generator=1 , + number_of_conformations=1, + outfile = "Initial_rosette_conformation_with_pbc.dat"): + """ + Generates lammps initial conformation file by rosettes conformation + + :param chromosome_particle_numbers: list with the number of particles of each chromosome. + :param None fractional_radial_positions: list with fractional radial positions for all the chromosomes. + :param ['cube',100.] confining_environment: dictionary with the confining environment of the conformation + Possible confining environments: + ['cube',edge_width] + :param 0.5 particle_radius: Radius of each particle. + :param 1 seed_of_the_random_number_generator: random seed. + :param 1 number_of_conformations: copies of the conformation. + :param outfile: file where to store resulting initial conformation file + + """ + seed(seed_of_the_random_number_generator) + + # This allows to organize the largest chromosomes first. + # This is to get a better acceptance of the chromosome positioning. + chromosome_particle_numbers = [int(x) for x in chromosome_particle_numbers] + chromosome_particle_numbers.sort(key=int,reverse=True) + + initial_rosettes , rosettes_lengths = generate_rosettes(chromosome_particle_numbers, + rosette_radius, + particle_radius) + print(rosettes_lengths) + + + # Constructing the rosettes conformations + for cnt in range(number_of_conformations): + + particles_overlap = 0 # 0 means two particles are overlapping + while particles_overlap == 0: + particles_overlap = 1 + segments_P1 = [] + segments_P0 = [] + side = 0 + init_rosettes = copy.deepcopy(initial_rosettes) + + # Guess of the initial segment conformation: + # 1 - each rod is placed in a random position and with random orientation + # 2 - possible clashes between generated rods are checked taking into account pbc + segments_P1 , segments_P0 = generate_rods_random_conformation_with_pbc ( + rosettes_lengths, + rosette_radius, + confining_environment, + max_number_of_temptative=100000) + + # Roto-translation of the rosettes according to the segment position and orientation + final_rosettes = rosettes_rototranslation(init_rosettes, segments_P1, segments_P0) + + # Checking that the beads once folded inside the simulation box (for pbc) are not overlapping + folded_rosettes = copy.deepcopy(final_rosettes) + for r in range(len(folded_rosettes)): + particle = 0 + for x, y, z in zip(folded_rosettes[r]['x'],folded_rosettes[r]['y'],folded_rosettes[r]['z']): + #inside_1 = check_point_inside_the_confining_environment(x, y, z, + # particle_radius, + # confining_environment) + #if inside_1 == 0: + # print inside_1, r, particle, x, y, z + + while x > (confining_environment[1]*0.5): + x -= confining_environment[1] + while x < -(confining_environment[1]*0.5): + x += confining_environment[1] + + while y > (confining_environment[1]*0.5): + y -= confining_environment[1] + while y < -(confining_environment[1]*0.5): + y += confining_environment[1] + + while z > (confining_environment[1]*0.5): + z -= confining_environment[1] + while z < -(confining_environment[1]*0.5): + z += confining_environment[1] + + #inside_2 = check_point_inside_the_confining_environment(x, y, z, + # particle_radius, + # confining_environment) + #if inside_2 == 1 and inside_1 == 0: + # print inside_2, r, particle, x, y, z + folded_rosettes[r]['x'][particle] = x + folded_rosettes[r]['y'][particle] = y + folded_rosettes[r]['z'][particle] = z + particle += 1 + + for rosette_pair in list(combinations(folded_rosettes,2)): + + for x0,y0,z0 in zip(rosette_pair[0]['x'],rosette_pair[0]['y'],rosette_pair[0]['z']): + for x1,y1,z1 in zip(rosette_pair[1]['x'],rosette_pair[1]['y'],rosette_pair[1]['z']): + + particles_overlap = check_particles_overlap(x0,y0,z0,x1,y1,z1,particle_radius) + + if particles_overlap == 0: # 0 means that the particles are overlapping -> PROBLEM!!! + print("Particle",x0,y0,z0,"and",x1,y1,z1,"overlap\n") + break + if particles_overlap == 0: + break + if particles_overlap == 0: + break + + # Writing the final_rosettes conformation + print("Succesfully generated conformation number %d\n" % (cnt+1)) + write_initial_conformation_file(final_rosettes, + chromosome_particle_numbers, + confining_environment, + out_file=outfile) + +########## + +def generate_rosettes(chromosome_particle_numbers, rosette_radius, particle_radius): + # Genaration of the rosettes + # XXXA. Rosa publicationXXX + # List to contain the rosettes and the rosettes lengths + rosettes = [] + rosettes_lengths = [] + + for number_of_particles in chromosome_particle_numbers: + + # Variable to build the chain + phi = 0.0 + + # Dictory of lists to contain the rosette + rosette = {} + rosette['x'] = [] + rosette['y'] = [] + rosette['z'] = [] + + # Position of the first particle (x_0, 0.0, 0.0) + k = 6. + x = 0.38 + p = 1.0 + rosette['x'].append(rosette_radius * (x + (1 - x) * cos(k*phi) * cos(k*phi)) * cos(phi)) + rosette['y'].append(rosette_radius * (x + (1 - x) * cos(k*phi) * cos(k*phi)) * sin(phi)) + rosette['z'].append(p * phi / (2.0 * pi)) + #print "First bead is in position: %f %f %f" % (rosette['x'][0], rosette['y'][0], rosette['z'][0]) + + # Building the chain: The rosette is growing along the positive z-axes + for particle in range(1,number_of_particles): + + distance = 0.0 + while distance < (particle_radius*2.0): + phi = phi + 0.001 + x_tmp = rosette_radius * (x + (1 - x) * cos(k*phi) * cos(k*phi)) * cos(phi) + y_tmp = rosette_radius * (x + (1 - x) * cos(k*phi) * cos(k*phi)) * sin(phi) + z_tmp = phi / (2.0 * pi) + distance = sqrt((x_tmp - rosette['x'][-1])*(x_tmp - rosette['x'][-1]) + + (y_tmp - rosette['y'][-1])*(y_tmp - rosette['y'][-1]) + + (z_tmp - rosette['z'][-1])*(z_tmp - rosette['z'][-1])) + + rosette['x'].append(x_tmp) + rosette['y'].append(y_tmp) + rosette['z'].append(z_tmp) + if distance > ((particle_radius*2.0)*1.2): + print("%f %d %d %d" % (distance, particle-1, particle)) + + rosettes.append(rosette) + rosettes_lengths.append(rosette['z'][-1]-rosette['z'][0]) + + return rosettes , rosettes_lengths + +########## + +def generate_rods_biased_conformation(rosettes_lengths, rosette_radius, + confining_environment, + fractional_radial_positions, + max_number_of_temptative=100000): + # Construction of the rods initial conformation + segments_P0 = [] + segments_P1 = [] + + if confining_environment[0] != 'sphere': + print("ERROR: Biased chromosome positioning is currently implemented") + print("only for spherical confinement. If you need other shapes, please") + print("contact the developers") + + for length , target_radial_position in zip(rosettes_lengths,fractional_radial_positions): + tentative = 0 + clashes = 0 # 0 means that there is an clash -> PROBLEM + best_radial_position = 1.0 + best_radial_distance = 1.0 + best_segment_P0 = [] + best_segment_P1 = [] + + # Positioning the rods + while tentative < 100000 and best_radial_distance > 0.00005: + + print("Length = %f" % length) + + print("Trying to position terminus 0") + segment_P0_tmp = [] + segment_P0_tmp = draw_point_inside_the_confining_environment(confining_environment, + rosette_radius) + print("Successfully positioned terminus 0: %f %f %f" % (segment_P0_tmp[0], segment_P0_tmp[1], segment_P0_tmp[2])) + + print("Trying to position terminus 1") + segment_P1_tmp = [] + segment_P1_tmp = draw_second_extreme_of_a_segment_inside_the_confining_environment(segment_P0_tmp[0], + segment_P0_tmp[1], + segment_P0_tmp[2], + length, + rosette_radius, + confining_environment) + print("Successfully positioned terminus 1: %f %f %f" % (segment_P1_tmp[0], segment_P1_tmp[1], segment_P1_tmp[2])) + + # Check clashes with the previously positioned rods + clashes = 1 + for segment_P1,segment_P0 in zip(segments_P1,segments_P0): + clashes = check_segments_clashes(segment_P1, + segment_P0, + segment_P1_tmp, + segment_P0_tmp, + rosette_radius) + if clashes == 0: + break + + if clashes == 1: + # Check whether the midpoint of the segment is close to the target radial position + segment_midpoint = [] + segment_midpoint.append((segment_P0_tmp[0] + segment_P1_tmp[0])*0.5) + segment_midpoint.append((segment_P0_tmp[1] + segment_P1_tmp[1])*0.5) + segment_midpoint.append((segment_P0_tmp[2] + segment_P1_tmp[2])*0.5) + + radial_position = sqrt( ( segment_midpoint[0] * segment_midpoint[0] + + segment_midpoint[1] * segment_midpoint[1] + + segment_midpoint[2] * segment_midpoint[2] ) / + (confining_environment[1]*confining_environment[1])) + + radial_distance = fabs(radial_position-target_radial_position) + + print(radial_position , target_radial_position , radial_distance , best_radial_distance , tentative) + + # If the midpoint of the segment is closer to the target radial position than the + # previous guesses. Store the points as the best guesses! + if radial_distance < best_radial_distance: + best_radial_distance = radial_distance + best_radial_position = radial_position + best_tentative = tentative+1 # The variable tentative starts from 0 + + best_segment_P0 = [] + best_segment_P1 = [] + for component_P0 , component_P1 in zip(segment_P0_tmp,segment_P1_tmp): + best_segment_P0.append(component_P0) + best_segment_P1.append(component_P1) + + tentative = tentative + 1 + + if best_segment_P0 == []: + print("Valid placement not found for chromosome rosette after %d tentatives" % tentative) + sys.exit() + + print("Successfully positioned chromosome of length %lf at tentative %d of %d tentatives" % (length, best_tentative, tentative)) + segments_P0.append(best_segment_P0) + segments_P1.append(best_segment_P1) + + print("Successfully generated rod conformation!") + return segments_P1 , segments_P0 + +########## + +def generate_rods_random_conformation(rosettes_lengths, rosette_radius, + confining_environment, + max_number_of_temptative=100000): + # Construction of the rods initial conformation + segments_P0 = [] + segments_P1 = [] + + for length in rosettes_lengths: + tentative = 0 + clashes = 0 + # Random positioning of the rods + while tentative < 100000 and clashes == 0: + + tentative += 1 + clashes = 1 + #print "Length = %f" % length + + print("Trying to position terminus 0") + #pick uniformly within the confining environment using the rejection method + first_point = [] + first_point = draw_point_inside_the_confining_environment(confining_environment, + rosette_radius) + + print("Successfully positioned terminus 0: %f %f %f" % (first_point[0], first_point[1], first_point[2])) + + print("Trying to position terminus 1") + #pick from P0 another point one the sphere of radius length inside the confining environment + last_point = [] + last_point = draw_second_extreme_of_a_segment_inside_the_confining_environment(first_point[0], + first_point[1], + first_point[2], + length, + rosette_radius, + confining_environment) + + print("Successfully positioned terminus 1: %f %f %f" % (last_point[0], last_point[1], last_point[2])) + + # Check clashes with the previously positioned rods + clashes = 1 + for segment_P1,segment_P0 in zip(segments_P1,segments_P0): + clashes = check_segments_clashes(segment_P1, + segment_P0, + last_point, + first_point, + rosette_radius) + if clashes == 0: + break + + #print clashes + print("Successfully positioned chromosome of length %lf at tentative %d\n" % (length, tentative)) + segments_P1.append(last_point) + segments_P0.append(first_point) + + print("Successfully generated rod conformation!") + return segments_P1 , segments_P0 + +########## + +def generate_rods_random_conformation_with_pbc(rosettes_lengths, rosette_radius, + confining_environment, + max_number_of_temptative=100000): + + # Construction of the rods initial conformation + segments_P0 = [] + segments_P1 = [] + + for length in rosettes_lengths: + tentative = 0 + clashes = 0 + # Random positioning of the rods + while tentative < 100000 and clashes == 0: + + tentative += 1 + clashes = 1 + #print "Length = %f" % length + + print("Trying to position terminus 0") + #pick uniformly within the confining environment using the rejection method + first_point = [] + first_point = draw_point_inside_the_confining_environment(confining_environment, + rosette_radius) + + print("Successfully positioned terminus 0: %f %f %f" % (first_point[0], first_point[1], first_point[2])) + + print("Trying to position terminus 1") + #pick from P0 another point one the sphere of radius length inside the confining environment + last_point = [] + last_point = draw_second_extreme_of_a_segment(first_point[0], + first_point[1], + first_point[2], + length, + rosette_radius) + + print(last_point) + # Check clashes with the previously positioned rods + for segment_P1,segment_P0 in zip(segments_P1,segments_P0): + clashes = check_segments_clashes_with_pbc(segment_P1, + segment_P0, + last_point, + first_point, + rosette_radius, + confining_environment) + if clashes == 0: + break + + #print clashes + print("Successfully positioned chromosome of length %lf at tentative %d\n" % (length, tentative)) + segments_P1.append(last_point) + segments_P0.append(first_point) + + print("Successfully generated rod conformation!") + return segments_P1 , segments_P0 + +########## + +def generate_random_walks(chromosome_particle_numbers, + particle_radius, + confining_environment, + center, + pbc=False): + # Construction of the random walks initial conformation + random_walks = [] + + for number_of_particles in chromosome_particle_numbers: + #print "Trying to position random walk" + random_walk = {} + random_walk['x'] = [] + random_walk['y'] = [] + random_walk['z'] = [] + + + #print "Positioning first particle" + particle_overlap = 0 + while particle_overlap == 0: + particle_overlap = 1 + first_particle = [] + first_particle = draw_point_inside_the_confining_environment(confining_environment, + particle_radius) + + # Check if the particle is overlapping with any other particle in the system + for rand_walk in random_walks: + if pbc: + particle_overlap = check_particle_vs_all_overlap(first_particle[0], + first_particle[1], + first_particle[2], + rand_walk, + 2.0*particle_radius) + else: + particle_overlap = check_particle_vs_all_overlap(first_particle[0], + first_particle[1], + first_particle[2], + rand_walk, + 2.0*particle_radius) + + if particle_overlap == 0: + break + + random_walk['x'].append(first_particle[0]) + random_walk['y'].append(first_particle[1]) + random_walk['z'].append(first_particle[2]) + + for particle in range(1,number_of_particles): + #print "Positioning particle %d" % (particle+1) + particle_overlap = 0 # 0 means that there is an overlap -> PROBLEM + overlapCounter = -1 + maxIter = 1000 + while particle_overlap == 0: + overlapCounter += 1 + if overlapCounter > maxIter: + # raise error so log file is created to avoid k_seed + errorName = 'ERROR: Initial conformation non ending loop' + raise InitalConformationError(errorName) + particle_overlap = 1 + new_particle = [] + if pbc: + new_particle = draw_second_extreme_of_a_segment( + random_walk['x'][-1], + random_walk['y'][-1], + random_walk['z'][-1], + 2.0*particle_radius, + 2.0*particle_radius) + else: + new_particle = draw_second_extreme_of_a_segment_inside_the_confining_environment( + random_walk['x'][-1], + random_walk['y'][-1], + random_walk['z'][-1], + 2.0*particle_radius, + 2.0*particle_radius, + confining_environment) + + # Check if the particle is overlapping with any other particle in the system + for rand_walk in random_walks: + particle_overlap = check_particle_vs_all_overlap(new_particle[0], + new_particle[1], + new_particle[2], + rand_walk, + 2.0*particle_radius) + if particle_overlap == 0: + break + if particle_overlap == 0: + continue + + # The current random walk is not yet in the list above + particle_overlap = check_particle_vs_all_overlap(new_particle[0], + new_particle[1], + new_particle[2], + random_walk, + 2.0*particle_radius) + if particle_overlap == 0: + continue + + random_walk['x'].append(new_particle[0]) + random_walk['y'].append(new_particle[1]) + random_walk['z'].append(new_particle[2]) + + #print "Successfully positioned random walk of %d particles" % number_of_particles + random_walks.append(random_walk) + + #print "Successfully generated random walk conformation!" + if center: + for random_walk in random_walks: + x_com, y_com, z_com = (0.0,0.0,0.0) + cnt = 0 + for (x,y,z) in zip(random_walk['x'],random_walk['y'],random_walk['z']): + x_com += x + y_com += y + z_com += z + cnt += 1 + x_com, y_com, z_com = (x_com/cnt,y_com/cnt,z_com/cnt) + + for i in range(len(random_walk['x'])): + random_walk['x'][i] -= x_com + random_walk['y'][i] -= y_com + random_walk['z'][i] -= z_com + + x_com, y_com, z_com = (0.0,0.0,0.0) + cnt = 0 + for (x,y,z) in zip(random_walk['x'],random_walk['y'],random_walk['z']): + x_com += x + y_com += y + z_com += z + cnt += 1 + x_com, y_com, z_com = (x_com/cnt,y_com/cnt,z_com/cnt) + + return random_walks + +########## + +def check_particle_vs_all_overlap(x,y,z,chromosome,overlap_radius): + particle_overlap = 1 + + for x0, y0, z0 in zip(chromosome['x'],chromosome['y'],chromosome['z']): + particle_overlap = check_particles_overlap(x0,y0,z0,x,y,z,overlap_radius) + if particle_overlap == 0: + return particle_overlap + + return particle_overlap + +########## + +def draw_second_extreme_of_a_segment_inside_the_confining_environment(x0, y0, z0, + segment_length, + object_radius, + confining_environment): + inside = 0 + while inside == 0: + particle = [] + temp_theta = arccos(2.0*random()-1.0) + temp_phi = 2*pi*random() + particle.append(x0 + segment_length * cos(temp_phi) * sin(temp_theta)) + particle.append(y0 + segment_length * sin(temp_phi) * sin(temp_theta)) + particle.append(z0 + segment_length * cos(temp_theta)) + # Check if the particle is inside the confining_environment + inside = check_point_inside_the_confining_environment(particle[0], + particle[1], + particle[2], + object_radius, + confining_environment) + + return particle + +########## + +def draw_second_extreme_of_a_segment(x0, y0, z0, + segment_length, + object_radius): + particle = [] + temp_theta = arccos(2.0*random()-1.0) + temp_phi = 2*pi*random() + particle.append(x0 + segment_length * cos(temp_phi) * sin(temp_theta)) + particle.append(y0 + segment_length * sin(temp_phi) * sin(temp_theta)) + particle.append(z0 + segment_length * cos(temp_theta)) + + return particle + +########## + +def draw_point_inside_the_confining_environment(confining_environment, object_radius): + #pick a point uniformly within the confining environment using the rejection method + + if confining_environment[0] == 'cube': + dimension_x = confining_environment[1] * 0.5 + dimension_y = confining_environment[1] * 0.5 + dimension_z = confining_environment[1] * 0.5 + if len(confining_environment) > 2: + print("# WARNING: Defined a cubical confining environment with reduntant paramenters.") + print("# Only 2 are needed the identifier and the side") + + if confining_environment[0] == 'sphere': + dimension_x = confining_environment[1] + dimension_y = confining_environment[1] + dimension_z = confining_environment[1] + if len(confining_environment) > 2: + print("# WARNING: Defined a spherical confining environment with reduntant paramenters.") + print("# Only 2 are needed the identifier and the radius") + + if confining_environment[0] == 'ellipsoid': + if len(confining_environment) < 4: + print("# ERROR: Defined an ellipsoidal confining environment without the necessary paramenters.") + print("# 4 are needed the identifier, the x-semiaxes, the y-semiaxes, and the z-semiaxes") + sys.exit() + dimension_x = confining_environment[1] + dimension_y = confining_environment[2] + dimension_z = confining_environment[3] + + if confining_environment[0] == 'cylinder': + if len(confining_environment) < 3: + print("# WARNING: Defined a cylindrical confining environment without the necessary paramenters.") + print("# 3 are needed the identifier, the basal radius, and the height") + sys.exit() + dimension_x = confining_environment[1] + dimension_y = confining_environment[1] + dimension_z = confining_environment[2] + + inside = 0 + while inside == 0: + particle = [] + particle.append((2.0*random()-1.0)*(dimension_x - object_radius)) + particle.append((2.0*random()-1.0)*(dimension_y - object_radius)) + particle.append((2.0*random()-1.0)*(dimension_z - object_radius)) + # Check if the particle is inside the confining_environment + inside = check_point_inside_the_confining_environment(particle[0], + particle[1], + particle[2], + object_radius, + confining_environment) + + return particle + +########## + +def check_point_inside_the_confining_environment(Px, Py, Pz, + object_radius, + confining_environment): + # The shapes are all centered in the origin + # - sphere : radius r + # - cube : side + # - cylinder : basal radius , height + # - ellipsoid : semi-axes a , b , c ; + + if confining_environment[0] == 'sphere': + radius = confining_environment[1] - object_radius + if ((Px*Px)/(radius*radius) + (Py*Py)/(radius*radius) + (Pz*Pz)/(radius*radius)) < 1.0 : return 1 + + if confining_environment[0] == 'ellipsoid': + a = confining_environment[1] - object_radius + b = confining_environment[2] - object_radius + c = confining_environment[3] - object_radius + if ((Px*Px)/(a*a) + (Py*Py)/(b*b) + (Pz*Pz)/(c*c)) < 1.0 : return 1 + + if confining_environment[0] == 'cube': + hside = confining_environment[1] * 0.5 - object_radius + if (((Px*Px)/(hside*hside)) < 1.0) and (((Py*Py)/(hside*hside)) < 1.0) and (((Pz*Pz)/(hside*hside)) < 1.0) : return 1 + + if confining_environment[0] == 'cylinder': + radius = confining_environment[1] - object_radius + half_height = confining_environment[2]*0.5 - object_radius + if (((Px*Px)/(radius*radius) + (Py*Py)/(radius*radius)) < 1.0) and (((Pz*Pz)/(half_height*half_height)) < 1.0): return 1 + + return 0 + +########## + +def check_segments_clashes(s1_P1, s1_P0, s2_P1, s2_P0, rosette_radius): + + # Check steric clashes without periodic boundary conditions + if distance_between_segments(s1_P1, s1_P0, s2_P1, s2_P0) < 2.0*rosette_radius: + # print "Clash between segments",s1_P1,s1_P0,"and",s2_P1_tmp,s2_P0_tmp,"at distance", distance + return 0 + + return 1 + +########## + +def check_segments_clashes_with_pbc(s1_P1, s1_P0, s2_P1, s2_P0, + rosette_radius, + confining_environment): + + # Check steric clashes with periodic boundary conditions + if distance_between_segments(s1_P1, s1_P0, s2_P1, s2_P0) < 2.0*rosette_radius: + # print "Clash between segments",s1_P1,s1_P0,"and",s2_P1_tmp,s2_P0_tmp,"at distance", distance + return 0 + + return 1 + +########## + +def distance_between_segments(s1_P1, s1_P0, s2_P1, s2_P0): + + # Inspiration: http://softsurfer.com/Archive/algorithm_0106/algorithm_0106.htm + # Copyright 2001, softSurfer (www.softsurfer.com) + # This code may be freely used and modified for any purpose + # providing that this copyright notice is included with it. + # SoftSurfer makes no warranty for this code, and cannot be held + # liable for any real or imagined damage resulting from its use. + # Users of this code must verify correctness for their application. + + u = [] + v = [] + w = [] + dP = [] + + for c_s1_P1,c_s1_P0,c_s2_P1,c_s2_P0 in zip(s1_P1, s1_P0, s2_P1, s2_P0): + u.append(c_s1_P1 - c_s1_P0) + v.append(c_s2_P1 - c_s2_P0) + w.append(c_s1_P0 - c_s2_P0) + + a = scalar_product(u, u) + b = scalar_product(u, v) + c = scalar_product(v, v) + d = scalar_product(u, w) + e = scalar_product(v, w) + + D = a*c - b*b + sD = tD = D + + if D < (1.0e-7): + # Segments almost parallel + sN = 0.0 + sD = 1.0 + tN = e + tD = c + else: + # Get the closest points on the infinite lines + sN = (b*e - c*d) + tN = (a*e - b*d) + if (sN < 0.0): + # sc < 0 => the s=0 edge is visible + sN = 0.0 + tN = e + tD = c + elif sN > sD: # sc > 1 => the s=1 edge is visible + sN = sD + tN = e + b + tD = c + + if tN < 0.0: # tc < 0 => the t=0 edge is visible + tN = 0.0 + # Recompute sc for this edge + if -d < 0.0: + sN = 0.0 + elif -d > a: + sN = sD + else: + sN = -d + sD = a + + elif tN > tD: # tc > 1 => the t=1 edge is visible + tN = tD + # Recompute sc for this edge + if (-d + b) < 0.0: + sN = 0 + elif (-d + b) > a: + sN = sD; + else: + sN = (-d + b) + sD = a + + # Finally do the division to get sc and tc + if abs(sN) < (1.0e-7): + sc = 0.0 + else: + sc = sN / sD + + if abs(tN) < (1.0e-7): + tc = 0.0 + else: + tc = tN / tD + + # Get the difference of the two closest points + for i in range(len(w)): + dP.append(w[i] + ( sc * u[i] ) - ( tc * v[i] )) # = S1(sc) - S2(tc) + + return norm(dP) # return the closest distance + +########## + +def rosettes_rototranslation(rosettes, segments_P1, segments_P0): + + for i in range(len(segments_P1)): + vector = [] + theta = [] + + for component_P1 , component_P0 in zip(segments_P1[i], segments_P0[i]): + vector.append(component_P1-component_P0) + + # Rotation Angles + theta.append(atan2(vector[1],vector[2])) + + x_temp_2 = vector[0] + y_temp_2 = cos(theta[0]) * vector[1] - sin(theta[0]) * vector[2] + z_temp_2 = sin(theta[0]) * vector[1] + cos(theta[0]) * vector[2] + theta.append(atan2(x_temp_2,z_temp_2)) + + x_temp_1 = cos(theta[1]) * x_temp_2 - sin(theta[1]) * z_temp_2 + y_temp_1 = y_temp_2 + z_temp_1 = sin(theta[1]) * x_temp_2 + cos(theta[1]) * z_temp_2 + + if(z_temp_1 < 0.0): + z_temp_1 = -z_temp_1 + theta.append(pi) + else: + theta.append(0.0) + #print x_temp_1 , y_temp_1 , z_temp_1 + + # Chromosome roto-translations + for particle in range(len(rosettes[i]['x'])): + + x_temp_2 = rosettes[i]['x'][particle] + y_temp_2 = cos(theta[2]) * rosettes[i]['y'][particle] + sin(theta[2]) * rosettes[i]['z'][particle] + z_temp_2 = - sin(theta[2]) * rosettes[i]['y'][particle] + cos(theta[2]) * rosettes[i]['z'][particle] + + x_temp_1 = cos(theta[1]) * x_temp_2 + sin(theta[1]) * z_temp_2 + y_temp_1 = y_temp_2 + z_temp_1 = - sin(theta[1]) * x_temp_2 + cos(theta[1]) * z_temp_2 + + x = x_temp_1; + y = cos(theta[0]) * y_temp_1 + sin(theta[0]) * z_temp_1; + z = - sin(theta[0]) * y_temp_1 + cos(theta[0]) * z_temp_1; + + # Chromosome translations + rosettes[i]['x'][particle] = segments_P0[i][0] + x; + rosettes[i]['y'][particle] = segments_P0[i][1] + y; + rosettes[i]['z'][particle] = segments_P0[i][2] + z; + return rosettes + +########## + +def scalar_product(a, b): + + scalar = 0.0 + for c_a,c_b in zip(a,b): + scalar = scalar + c_a*c_b + + return scalar + +########## + +def norm(a): + + return sqrt(scalar_product(a, a)) + +########## + +def write_initial_conformation_file(chromosomes, + chromosome_particle_numbers, + confining_environment, + out_file="Initial_conformation.dat"): + # Choosing the appropriate xlo, xhi...etc...depending on the confining environment + xlim = [] + ylim = [] + zlim = [] + if confining_environment[0] == 'sphere': + radius = confining_environment[1] + 1.0 + xlim.append(-radius) + xlim.append(radius) + ylim.append(-radius) + ylim.append(radius) + zlim.append(-radius) + zlim.append(radius) + + if confining_environment[0] == 'ellipsoid': + a = confining_environment[1] + 1.0 + b = confining_environment[2] + 1.0 + c = confining_environment[3] + 1.0 + xlim.append(-a) + xlim.append(a) + ylim.append(-b) + ylim.append(b) + zlim.append(-c) + zlim.append(c) + + if confining_environment[0] == 'cube': + hside = confining_environment[1] * 0.5 + 1.0 + xlim.append(-hside) + xlim.append(hside) + ylim.append(-hside) + ylim.append(hside) + zlim.append(-hside) + zlim.append(hside) + + if confining_environment[0] == 'cylinder': + radius = confining_environment[1] + 1.0 + hheight = confining_environment[2] * 0.5 + 1.0 + xlim.append(-radius) + xlim.append(radius) + ylim.append(-radius) + ylim.append(radius) + zlim.append(-hheight) + zlim.append(hheight) + + fileout = open(out_file,'w') + angle_types = 1 + bond_types = 1 + atom_types = 1 + n_chr=len(chromosomes) + n_atoms=0 + for n in chromosome_particle_numbers: + n_atoms+=n + + fileout.write("LAMMPS input data file \n\n") + fileout.write("%9d atoms\n" % (n_atoms)) + fileout.write("%9d bonds\n" % (n_atoms-n_chr)) + fileout.write("%9d angles\n\n" % (n_atoms-2*n_chr)) + fileout.write("%9s atom types\n" % atom_types) + fileout.write("%9s bond types\n" % bond_types) + fileout.write("%9s angle types\n\n" % angle_types) + fileout.write("%6.3lf %6.3lf xlo xhi\n" % (xlim[0], xlim[1])) + fileout.write("%6.3lf %6.3lf ylo yhi\n" % (ylim[0], ylim[1])) + fileout.write("%6.3lf %6.3lf zlo zhi\n" % (zlim[0], zlim[1])) + + fileout.write("\n Atoms \n\n") + particle_number = 1 + for chromosome in chromosomes: + for x,y,z in zip(chromosome['x'],chromosome['y'],chromosome['z']): + fileout.write("%-8d %s %s %7.4lf %7.4lf %7.4lf\n" % (particle_number, "1", "1", x, y, z)) + particle_number += 1 + + # for(i = 0; i < N_NUCL; i++) + # { + # k++; + # fileout.write("%5d %s %s %7.4lf %7.4lf %7.4lf \n", k, "1", "1", P[i][0], P[i][1], P[i][2]); + # } + + fileout.write("\n Bonds \n\n") + bond_number = 1 + first_particle_index = 1 + for chromosome in chromosomes: + for i in range(len(chromosome['x'])-1): + fileout.write("%-4d %s %4d %4d\n" % (bond_number, "1", first_particle_index, first_particle_index+1)) + bond_number += 1 + first_particle_index += 1 + first_particle_index += 1 # I have to go to the end of the chromosome! + + fileout.write("\n Angles \n\n") + angle_number = 1 + first_particle_index = 1 + for chromosome in chromosomes: + for i in range(len(chromosome['x'])-2): + fileout.write("%-4d %s %5d %5d %5d\n" % (angle_number, "1", first_particle_index, first_particle_index+1, first_particle_index+2)) + angle_number += 1 + first_particle_index += 1 + first_particle_index += 2 # I have to go to the end of the chromosome! + + fileout.close() + +########## + +def distance(x0,y0,z0,x1,y1,z1): + return sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1)+(z0-z1)*(z0-z1)) + +########## + +def check_particles_overlap(x0,y0,z0,x1,y1,z1,overlap_radius): + if distance(x0,y0,z0,x1,y1,z1) < overlap_radius: + #print "Particle %f %f %f and particle %f %f %f are overlapping\n" % (x0,y0,z0,x1,y1,z1) + return 0 + return 1 + +########## + +def store_conformation_with_pbc(xc, result, confining_environment): + # Reconstruct the different molecules and store them separatelly + ix , iy , iz = (0, 0, 0) + ix_tmp, iy_tmp, iz_tmp = (0, 0, 0) + x_tmp , y_tmp , z_tmp = (0, 0, 0) + + molecule_number = 0 # We start to count from molecule number 0 + + particles = [] + particles.append({}) + particles[molecule_number]['x'] = [] + particles[molecule_number]['y'] = [] + particles[molecule_number]['z'] = [] + + particle_counts = [] + particle_counts.append({}) # Initializing the particle counts for the first molecule + + max_bond_length = (1.5*1.5) # This is the default polymer-based bond length + + for i in range(0,len(xc),3): + particle = int(i/3) + + x = xc[i] + ix * confining_environment[1] + y = xc[i+1] + iy * confining_environment[1] + z = xc[i+2] + iz * confining_environment[1] + + # A - Check whether the molecule is broken because of pbc + # or if we are changing molecule + if particle > 0: + + # Compute the bond_length + bond_length = (particles[molecule_number]['x'][-1] - x)* \ + (particles[molecule_number]['x'][-1] - x)+ \ + (particles[molecule_number]['y'][-1] - y)* \ + (particles[molecule_number]['y'][-1] - y)+ \ + (particles[molecule_number]['z'][-1] - z)* \ + (particles[molecule_number]['z'][-1] - z) + + # Check whether the bond is too long. This could mean: + # 1 - Same molecule disjoint by pbc + # 2 - Different molecules + if bond_length > max_bond_length: + min_bond_length = bond_length + x_tmp , y_tmp , z_tmp = (x, y, z) + + # Check if we are in case 1: the same molecule continues + # in a nearby box + indeces_sets = product([-1, 0, 1], + [-1, 0, 1], + [-1, 0, 1]) + + for (l, m, n) in indeces_sets: + # Avoid to check again the same periodic copy + if (l, m, n) == (0, 0, 0): + continue + + # Propose a new particle position + x = xc[i] + (ix + l) * confining_environment[1] + y = xc[i+1] + (iy + m) * confining_environment[1] + z = xc[i+2] + (iz + n) * confining_environment[1] + + # Check the new bond length + bond_length = (particles[molecule_number]['x'][-1] - x)* \ + (particles[molecule_number]['x'][-1] - x)+ \ + (particles[molecule_number]['y'][-1] - y)* \ + (particles[molecule_number]['y'][-1] - y)+ \ + (particles[molecule_number]['z'][-1] - z)* \ + (particles[molecule_number]['z'][-1] - z) + + # Store the periodic copy with the minimum bond length + if bond_length < min_bond_length: + #print bond_length + x_tmp , y_tmp , z_tmp = (x , y , z ) + ix_tmp, iy_tmp, iz_tmp = (ix+l, iy+m, iz+n) + min_bond_length = bond_length + + # If the minimum bond length is yet too large + # we are dealing with case 2 + if min_bond_length > 10.: + # Start another molecule + molecule_number += 1 + + particles.append({}) + particles[molecule_number]['x'] = [] + particles[molecule_number]['y'] = [] + particles[molecule_number]['z'] = [] + + + particle_counts.append({}) # Initializing the particle counts for the new molecule + + # If the minimum bond length is sufficiently short + # we are dealing with case 2 + ix, iy, iz = (ix_tmp, iy_tmp, iz_tmp) + x , y , z = (x_tmp , y_tmp , z_tmp) + + # To fullfill point B (see below), we have to count how many + # particle we have of each molecule for each triplet + # (ix, iy, iz) + try: + particle_counts[molecule_number][(ix, iy, iz)] += 1.0 + except: + particle_counts[molecule_number][(ix, iy, iz)] = 0.0 + particle_counts[molecule_number][(ix, iy, iz)] += 1.0 + + particles[molecule_number]['x'].append(x) + particles[molecule_number]['y'].append(y) + particles[molecule_number]['z'].append(z) + + # B - Store in the final arrays each molecule in the periodic copy + # with more particle in the primary cell (0, 0, 0) + for molecule in range(molecule_number+1): + max_number = 0 + # Get the periodic box with more particles + for (l, m, n) in particle_counts[molecule]: + if particle_counts[molecule][(l, m, n)] > max_number: + ix, iy, iz = (l, m, n) + max_number = particle_counts[molecule][(l, m, n)] + + # Translate the molecule to include the largest portion of particles + # in the (0, 0, 0) image + for (x, y, z) in zip(particles[molecule]['x'],particles[molecule]['y'],particles[molecule]['z']): + x = x - ix * confining_environment[1] + y = y - iy * confining_environment[1] + z = z - iz * confining_environment[1] + + result['x'].append(x) + result['y'].append(y) + result['z'].append(z) + + +##### Loop extrusion dynamics functions ##### +def read_target_loops_input(input_filename, chromosome_length, percentage): + # Open input file + fp_input = open(input_filename, "r") + + loops = [] + target_loops = [] + # Get each loop per line and fill the output list of loops + for line in fp_input.readlines(): + + if line.startswith('#'): + continue + + splitted = line.strip().split() + loop = [] + loop.append(int(splitted[1])) + loop.append(int(splitted[2])) + + loops.append(loop) + + #ntarget_loops = int(len(loops)*percentage/100.) + ntarget_loops = int(len(loops)) + shuffle(loops) + target_loops = loops[0:ntarget_loops] + + return target_loops + +########## + +#def draw_loop_extrusion_starting_points(target_loops, chromosome_length): +# initial_loops = [] + # Scroll the target loops and draw a point between each start and stop +# for target_loop in target_loops: + +# random_particle = randint(target_loop[0], target_loop[1]) + +# loop = [] +# loop.append(random_particle) +# loop.append(random_particle+1) + +# initial_loops.append(loop) + +# return initial_loops + +def draw_loop_extrusion_starting_point(chromosome_length): + + # draw a starting point for extrusion along the chromosome + random_particle = randint(1, chromosome_length-1) + + return [random_particle,random_particle+1] + + + +########## + +def get_maximum_number_of_extruded_particles(target_loops, initial_loops): + # The maximum is the maximum sequence distance between a target start/stop particle of a loop + # and the initial random start/stop of a loop + maximum = 0 + + for target_loop,initial_loop in zip(target_loops,initial_loops): + #print initial_loop,target_loop + + l = abs(target_loop[0]-initial_loop[0])+1 + if l > maximum: + maximum = l + + l = abs(target_loop[1]-initial_loop[1])+1 + if l > maximum: + maximum = l + + return maximum + +########## + +def compute_particles_distance(xc): + + particles = [] + distances = {} + + # Getting the coordiantes of the particles + for i in range(0,len(xc),3): + x = xc[i] + y = xc[i+1] + z = xc[i+2] + particles.append((x, y, z)) + + # Checking whether the restraints are satisfied + for pair in combinations(range(len(particles)), 2): + dist = distance(particles[pair[0]][0], + particles[pair[0]][1], + particles[pair[0]][2], + particles[pair[1]][0], + particles[pair[1]][1], + particles[pair[1]][2]) + distances[pair] = dist + + return distances + +########## + +def compute_the_percentage_of_satysfied_restraints(input_file_name, + restraints, + output_file_name, + time_point, + timesteps_per_k_change): + + ### Change this function to use a posteriori the out.colvars.traj file similar to the obj funct calculation ### + infile = open(input_file_name , "r") + outfile = open(output_file_name, "w") + if os.path.getsize(output_file_name) == 0: + outfile.write("#%s %s %s %s\n" % ("timestep","satisfied", "satisfiedharm", "satisfiedharmLowBound")) + + #restraints[pair] = [time_dependent_restraints[time_point+1][pair][0], # Restraint type -> Is the one at time point time_point+1 + #time_dependent_restraints[time_point][pair][1]*10., # Initial spring constant + #time_dependent_restraints[time_point+1][pair][1]*10., # Final spring constant + #time_dependent_restraints[time_point][pair][2], # Initial equilibrium distance + #time_dependent_restraints[time_point+1][pair][2], # Final equilibrium distance + #int(time_dependent_steering_pairs['timesteps_per_k_change']*0.5)] # Number of timesteps for the gradual change + + # Write statistics on the restraints + nharm = 0 + nharmLowBound = 0 + ntot = 0 + for pair in restraints: + for i in range(len(restraints[pair][0])): + if restraints[pair][0][i] == "Harmonic": + nharm += 1 + ntot += 1 + if restraints[pair][0][i] == "HarmonicLowerBound": + nharmLowBound += 1 + ntot += 1 + outfile.write("#NumOfRestraints = %s , Harmonic = %s , HarmonicLowerBound = %s\n" % (ntot, nharm, nharmLowBound)) + + # Memorizing the restraint + restraints_parameters = {} + for pair in restraints: + for i in range(len(restraints[pair][0])): + #E_hlb_pot_p_106_189 + if restraints[pair][0][i] == "Harmonic": + name = "E_h_pot_%d_%d_%d" % (i, int(pair[0])+1, int(pair[1])+1) + if restraints[pair][0][i] == "HarmonicLowerBound": + name ="E_hlb_pot_%d_%d_%d" % (i, int(pair[0])+1, int(pair[1])+1) + restraints_parameters[name] = [restraints[pair][0][i], + restraints[pair][1][i], + restraints[pair][2][i], + restraints[pair][3][i], + restraints[pair][4][i], + restraints[pair][5][i]] + #print restraints_parameters + + # Checking whether the restraints are satisfied + columns_to_consider = {} + for line in infile.readlines(): + nsatisfied = 0. + nsatisfiedharm = 0. + nsatisfiedharmLowBound = 0. + ntot = 0. + ntotharm = 0. + ntotharmLowBound = 0. + + line = line.strip().split() + + # Checking which columns contain the pairwise distance + if line[0][0] == "#": + for column in range(2,len(line)): + # Get the columns with the distances + if "_pot_" not in line[column]: + columns_to_consider[column-1] = line[column] + #print columns_to_consider + else: + for column in range(1,len(line)): + if column in columns_to_consider: + if column >= len(line): + continue + dist = float(line[column]) + + # Get which restraints are between the 2 particles + for name in ["E_h_pot_"+columns_to_consider[column], "E_hlb_pot_"+columns_to_consider[column]]: + if name not in restraints_parameters: + #print "Restraint %s not present" % name + continue + else: + pass + #print name, restraints_parameters[name] + + restrainttype = restraints_parameters[name][0] + restraintd0 = float(restraints_parameters[name][3]) + float(line[0])/float(restraints_parameters[name][5])*(float(restraints_parameters[name][4]) - float(restraints_parameters[name][3])) + restraintk = float(restraints_parameters[name][1]) + float(line[0])/float(restraints_parameters[name][5])*(float(restraints_parameters[name][2]) - float(restraints_parameters[name][1])) + sqrt_k = sqrt(restraintk) + limit1 = restraintd0 - 2./sqrt_k + limit2 = restraintd0 + 2./sqrt_k + + if restrainttype == "Harmonic": + if dist >= limit1 and dist <= limit2: + nsatisfied += 1.0 + nsatisfiedharm += 1.0 + #print "#ESTABLISHED",time_point,name,restraints_parameters[name],limit1,dist,limit2 + else: + pass + #print "#NOESTABLISHED",time_point,name,restraints_parameters[name],limit1,dist,limit2 + ntotharm += 1.0 + if restrainttype == "HarmonicLowerBound": + if dist >= restraintd0: + nsatisfied += 1.0 + nsatisfiedharmLowBound += 1.0 + #print "#ESTABLISHED",time_point,name,restraints_parameters[name],dist,restraintd0 + else: + pass + #print "#NOESTABLISHED",time_point,name,restraints_parameters[name],dist,restraintd0 + ntotharmLowBound += 1.0 + ntot += 1.0 + #print int(line[0])+(time_point)*timesteps_per_k_change, nsatisfied, ntot, nsatisfiedharm, ntotharm, nsatisfiedharmLowBound, ntotharmLowBound + if ntotharm == 0.: + ntotharm = 1.0 + if ntotharmLowBound == 0.: + ntotharmLowBound = 1.0 + + + outfile.write("%d %lf %lf %lf\n" % (int(line[0])+(time_point)*timesteps_per_k_change, nsatisfied/ntot*100., nsatisfiedharm/ntotharm*100., nsatisfiedharmLowBound/ntotharmLowBound*100.)) + infile.close() + outfile.close() + +########## + +def read_objective_function(fname): + + obj_func=[] + fhandler = open(fname) + line = next(fhandler) + try: + while True: + if line.startswith('#'): + line = next(fhandler) + continue + line = line.strip() + if len(line) == 0: + continue + line_vals = line.split() + obj_func.append(float(line_vals[1])) + line = next(fhandler) + except StopIteration: + pass + fhandler.close() + + return obj_func +########## + +def compute_the_objective_function(input_file_name, + output_file_name, + time_point, + timesteps_per_k_change): + + + infile = open(input_file_name , "r") + outfile = open(output_file_name, "w") + if os.path.getsize(output_file_name) == 0: + outfile.write("#Timestep obj_funct\n") + + columns_to_consider = [] + + # Checking which columns contain the energies to sum + for line in infile.readlines(): + line = line.strip().split() + + # Checking which columns contain the energies to sum + if line[0][0] == "#": + for column in range(len(line)): + if "_pot_" in line[column]: + columns_to_consider.append(column-1) + else: + obj_funct = 0.0 + for column in columns_to_consider: + if column < len(line): + obj_funct += float(line[column]) + outfile.write("%d %s\n" % (int(line[0])+timesteps_per_k_change*(time_point), obj_funct)) + + infile.close() + outfile.close() + + +### get unique list ### + +def get_list(input_list): + + output_list = [] + + for element in input_list: + #print(type(element)) + if isinstance(element, (int)): + output_list.append(element) + if isinstance(element, (list)): + for subelement in element: + output_list.append(subelement) + if isinstance(element, (tuple)): + for subelement in range(element[0],element[1]+1,element[2]): + output_list.append(subelement) + return output_list + +########## +#MPI.Finalize() diff --git a/tadphys/modelling/lammpsmodel.py b/tadphys/modelling/lammpsmodel.py new file mode 100644 index 0000000..c604e39 --- /dev/null +++ b/tadphys/modelling/lammpsmodel.py @@ -0,0 +1,38 @@ +""" +25 Oct 2016 + + +""" +from tadphys.modelling.structuralmodel import StructuralModel + +class LAMMPSmodel(StructuralModel): + """ + A container for the LAMMPS modelling results. The container is a dictionary + with the following keys: + + - rand_init: Random number generator feed (needed for model reproducibility) + - x, y, z: 3D coordinates of each particles. Each represented as a list + + """ + def __str__(self): + try: + return ('LAMMPS model ranked %s (%s particles) with: \n' + + ' - random initial value: %s\n' + + ' - first coordinates:\n'+ + ' X Y Z\n'+ + ' %7s%7s%7s\n'+ + ' %7s%7s%7s\n'+ + ' %7s%7s%7s\n') % ( + self['index'] + 1, + len(self['x']), self['rand_init'], + int(self['x'][0]), int(self['y'][0]), int(self['z'][0]), + int(self['x'][1]), int(self['y'][1]), int(self['z'][1]), + int(self['x'][2]), int(self['y'][2]), int(self['z'][2])) + except IndexError: + return ('LAMMPS model of %s particles with: \n' + + ' - random initial value: %s\n' + + ' - first coordinates:\n'+ + ' X Y Z\n'+ + ' %5s%5s%5s\n') % ( + len(self['x']), self['rand_init'], + self['x'][0], self['y'][0], self['z'][0]) diff --git a/taddyn/modelling/lammpsmodel.py b/tadphys/modelling/lammpsmodel.py~ similarity index 100% rename from taddyn/modelling/lammpsmodel.py rename to tadphys/modelling/lammpsmodel.py~ diff --git a/tadphys/modelling/restraints.py b/tadphys/modelling/restraints.py new file mode 100644 index 0000000..88215a9 --- /dev/null +++ b/tadphys/modelling/restraints.py @@ -0,0 +1,321 @@ +from math import fabs, pow as power +from collections import OrderedDict + +from scipy import polyfit + +class HiCBasedRestraints(object): + + """ + This class contains distance restraints based on Hi-C zscores. + + :param nloci: number of particles to model (may not all be present in + zscores) + :param particle_radius: radius of each particle in the model. + :param None config: a dictionary containing the standard + parameters used to generate the models. The dictionary should contain + the keys kforce, lowrdist, maxdist, upfreq and lowfreq. Examples can be + seen by doing: + + :: + + from taddyn.modelling.CONFIG import CONFIG + + where CONFIG is a dictionary of dictionaries to be passed to this function: + + :: + + CONFIG = { + 'dmel_01': { + # Paramaters for the Hi-C dataset from: + 'reference' : 'victor corces dataset 2013', + + # Force applied to the restraints inferred to neighbor particles + 'kforce' : 5, + + # Space occupied by a nucleotide (nm) + 'scale' : 0.005 + + # Strength of the bending interaction + 'kbending' : 0.0, # OPTIMIZATION: + + # Maximum experimental contact distance + 'maxdist' : 600, # OPTIMIZATION: 500-1200 + + # Minimum thresholds used to decide which experimental values have to be + # included in the computation of restraints. Z-score values bigger than upfreq + # and less that lowfreq will be include, whereas all the others will be rejected + 'lowfreq' : -0.7 # OPTIMIZATION: min/max Z-score + + # Maximum threshold used to decide which experimental values have to be + # included in the computation of restraints. Z-score values greater than upfreq + # and less than lowfreq will be included, while all the others will be rejected + 'upfreq' : 0.3 # OPTIMIZATION: min/max Z-score + + } + } + :param resolution: number of nucleotides per Hi-C bin. This will be the + number of nucleotides in each model's particle + :param zscores: the dictionary of the Z-score values calculated from the + Hi-C pairwise interactions + :param 1 close_bins: number of particles away (i.e. the bin number + difference) a particle pair must be in order to be considered as + neighbors (e.g. 1 means consecutive particles) + :param None first: particle number at which model should start (0 should be + used inside TADbit) + :param None remove_rstrn: list of particles which must not have restrains + + + """ + def __init__(self, nloci, particle_radius,CONFIG,resolution,zscores, + chromosomes, close_bins=1,first=None, min_seqdist=0, + remove_rstrn=[]): + + self.particle_radius = particle_radius + self.nloci = nloci + self.CONFIG = CONFIG + self.resolution = resolution + self.nnkforce = CONFIG['kforce'] + self.min_seqdist = min_seqdist + self.chromosomes = OrderedDict() + self.remove_rstrn = remove_rstrn + if chromosomes: + if isinstance(chromosomes,dict): + self.chromosomes[chromosomes['crm']] = chromosomes['end'] - chromosomes['start'] + 1 + else: + tot = 0 + for k in chromosomes: + tot += k['end'] - k['start'] + 1 + self.chromosomes[k['crm']] = tot + else: + self.chromosomes['UNKNOWN'] = nloci + + self.CONFIG['lowrdist'] = self.particle_radius * 2. + + if self.CONFIG['lowrdist'] > self.CONFIG['maxdist']: + raise TADbitModelingOutOfBound( + ('ERROR: we must prevent you from doing this for the safe of our ' + + 'universe...\nIn this case, maxdist must be higher than %s\n' + + ' -> resolution times scale -- %s*%s)') % ( + self.CONFIG['lowrdist'], self.resolution, self.CONFIG['scale'])) + + # print 'config:', self.CONFIG + # get SLOPE and regression for all particles of the z-score data + + zsc_vals = [zscores[i][j] for i in zscores for j in zscores[i] + if abs(int(i) - int(j)) > 1] # condition is to avoid + # taking into account selfies + # and neighbors + self.SLOPE, self.INTERCEPT = polyfit([min(zsc_vals), max(zsc_vals)], + [self.CONFIG['maxdist'], self.CONFIG['lowrdist']], 1) + #print "#SLOPE = %f ; INTERCEPT = %f" % (self.SLOPE, self.INTERCEPT) + #print "#maxdist = %f ; lowrdist = %f" % (self.CONFIG['maxdist'], self.CONFIG['lowrdist']) + # get SLOPE and regression for neighbors of the z-score data + xarray = [zscores[i][j] for i in zscores for j in zscores[i] + if abs(int(i) - int(j)) <= (close_bins + 1)] + yarray = [self.particle_radius * 2 for _ in range(len(xarray))] + try: + self.NSLOPE, self.NINTERCEPT = polyfit(xarray, yarray, 1) + except TypeError: + self.NSLOPE, self.NINTERCEPT = 0.0, self.particle_radius * 2 + + # if z-scores are generated outside TADbit they may not start at zero + if first == None: + first = min([int(j) for i in zscores for j in zscores[i]] + + [int(i) for i in zscores]) + self.LOCI = list(range(first, nloci + first)) + + # Z-scores + + self.PDIST = zscores + + def get_hicbased_restraints(self): + + # HiCbasedRestraints is a list of restraints returned by this function. + # Each entry of the list is a list of 5 elements describing the details of the restraint: + # 0 - particle_i + # 1 - particle_j + # 2 - type_of_restraint = Harmonic or HarmonicLowerBound or HarmonicUpperBound + # 3 - the kforce of the restraint + # 4 - the equilibrium (or maximum or minimum respectively) distance associated to the restraint + + HiCbasedRestraints = [] + nlocis = list(sorted(set(range(self.nloci)) - set(self.remove_rstrn))) + for ni, i in enumerate(nlocis): + chr1 = [k for k,v in list(self.chromosomes.items()) if v > i][0] + for j in nlocis[ni+1:]: + chr2 = [k for k,v in list(self.chromosomes.items()) if v > j][0] + # Compute the sequence separation (in particles) depending on it the restraint changes + seqdist = abs(j - i) + + # 1 - CASE OF TWO CONSECUTIVE LOCI (NEAREST NEIGHBOR PARTICLES) + if seqdist == 1 and seqdist > self.min_seqdist: + if chr1 != chr2: + continue + RestraintType, dist = self.get_nearest_neighbors_restraint_distance(self.particle_radius, i, j) + kforce = self.nnkforce + + # 2 - CASE OF 2 SECOND NEAREST NEIGHBORS SEQDIST = 2 + if seqdist == 2 and seqdist > self.min_seqdist: + if chr1 != chr2: + continue + RestraintType, dist = self.get_second_nearest_neighbors_restraint_distance(self.particle_radius, i, j) + kforce = self.nnkforce + + # 3 - CASE OF TWO NON-CONSECUTIVE PARTICLES SEQDIST > 2 + if seqdist > 2 and seqdist > self.min_seqdist: + + #CASES OF TWO NON-CONSECUTIVE PARTICLES SEQDIST > 2 + RestraintType, kforce, dist = self.get_long_range_restraints_kforce_and_distance(i, j) + if RestraintType == "None": + #print "No HiC-based restraint between particles %d and %d" % (i,j) + continue + + HiCbasedRestraints.append([i, j, RestraintType, kforce, dist]) + + return HiCbasedRestraints + + + + #Functions to add restraints: HarmonicRestraints , HarmonicUpperBoundRestraints , HarmonicLowerBoundRestraints + #addNearestNeighborsRestraint , addSecondNearestNeighborsRestraint , addLongRangeRestraints + def get_nearest_neighbors_restraint_distance(self, particle_radius, i, j): + x=str(i) + y=str(j) + + if x in self.PDIST and y in self.PDIST[x] and self.PDIST[x][y] > self.CONFIG['upfreq']: + # When p1 and p2 have a contact propensity larger that upfreq + # their spatial proximity and a partial overlap between them is enforced + # The equilibrium distance of the spring is inferred from the 3C based Z-score + RestraintType = "NeighborHarmonic" + dist = distance(self.PDIST[x][y],self.NSLOPE,self.NINTERCEPT) + #print "Distance = ", dist + else: + # When p1 and p2 have a contact propensity lower than upfreq they are simply connected to each other + #p1 = model['particles'].get_particle(i) + #p2 = model['particles'].get_particle(j) + #dist = p1.get_value(model['radius']) + p2.get_value(model['radius']) + RestraintType = "NeighborHarmonicUpperBound" + + dist = 2.0 * particle_radius + return RestraintType , dist + + def get_second_nearest_neighbors_restraint_distance(self, particle_radius, i, j): + # IMP COMMAND: Consider the particles i, j and the particle between i and j + #p1 = model['particles'].get_particle(i) + #p2 = model['particles'].get_particle(j) + #pmiddle = model['particles'].get_particle(j-1) + + # The equilibrium distance is the sum of the radii of particles p1 and p2, and of the diameter of particle pmiddle + RestraintType = "HarmonicUpperBound" + dist = 4.0 * particle_radius + #dist = p1.get_value(model['radius']) + p2.get_value(model['radius']) + 2.0 * pmiddle.get_value(model['radius']) + #print p1.get_value(model['radius']) , p2.get_value(model['radius']) , pmiddle.get_value(model['radius']) + + #print RestraintType , dist + return RestraintType , dist + + def get_long_range_restraints_kforce_and_distance(self, i, j): + x = str(i) + y = str(j) + + Zscore = float('nan') + + # For non consecutive particles the kforce is a function of the *C based Zscore + # First we define the The kforce of the harmonic restraint. It is different for 3 scenarios... + + RestraintType = "None" + kforce = 0.0 + dist = 0.0 + + # 1 - If the Z-score between i and j is defined + if x in self.PDIST and y in self.PDIST[x]: + # Get the Zscore between particles p1 and p2 + Zscore = self.PDIST[x][y] + kforce = k_force(Zscore) + + # 2 - If the Z-score is defined only for particle i (In the Hi-C matrix you could encounter zero values next to very high entries) + elif x in self.PDIST: + prevy = str(j - 1) + posty = str(j + 1) + # The Zscore is compute as the average of the Z-scores of p2 nearest neighbor particles with p1 + Zscore = (self.PDIST[x].get(prevy, self.PDIST[x].get(posty, float('nan'))) + + self.PDIST[x].get(posty, self.PDIST[x].get(prevy, float('nan')))) / 2 + kforce = 0.5 * k_force(Zscore) + + # 3 - If the Z-score is defined only for particle j + else: + prevx = str(i - 1) + postx = str(i + 1) + prevx = prevx if prevx in self.PDIST else postx + postx = postx if postx in self.PDIST else prevx + try: + Zscore = (self.PDIST[prevx].get(y, self.PDIST[postx].get(y, float('nan'))) + + self.PDIST[postx].get(y, self.PDIST[prevx].get(y, float('nan')))) / 2 + # For non consecutive particles the kforce is a function of the *C based Zscore + except KeyError: + pass + kforce = 0.5 * k_force(Zscore) + + + # If the ZSCORE > UPFREQ the spatial proximity of particles p1 and p2 is favoured + if Zscore > self.CONFIG['upfreq']: + RestraintType = "Harmonic" + dist = distance(Zscore, self.SLOPE, self.INTERCEPT) + + # If the ZSCORE < LOWFREQ the particles p1 and p2 are restrained to be far from each other. + elif Zscore < self.CONFIG['lowfreq']: + RestraintType = "HarmonicLowerBound" + dist = distance(Zscore, self.SLOPE, self.INTERCEPT) + + #if RestraintType != "None": + # print i, j, Zscore, RestraintType, kforce, dist + return RestraintType, kforce, dist + + # This is a function need for TADkit? + def _get_restraints(self): + """ + Same function as addAllHarmonic but just to get restraints + """ + restraint_names = {'None' : None, + 'Harmonic' : 'a', + 'NeighborHarmonic' : 'n', + 'HarmonicUpperBound' : 'u', + 'NeighborHarmonicUpperBound' : 'u', + 'HarmonicLowerBound' : 'l'} + + #model = {'radius' : IMP.FloatKey("radius"), + # 'model' : Model(), + # 'restraints' : None, # 2.6.1 compat + # 'particles' : None} + + # set container + #try: + # model['restraints'] = IMP.RestraintSet(model['model']) # 2.6.1 compat + #except: + # pass + + #model['particles'] = ListSingletonContainer(IMP.core.create_xyzr_particles( + # model['model'], len(LOCI), RADIUS, 100000)) + + restraints = {} + for i, j, RestraintType, kforce, dist in self.get_hicbased_restraints(): + restraints[tuple(sorted((i, j)))] = restraint_names[RestraintType], dist, kforce + return restraints + +#Function to translate the Zscore value into distances and kforce values +def distance(Zscore, slope, intercept): + """ + Function mapping the Z-scores into distances for neighbor and non-neighbor fragments (slope, intercept) are different + """ + #print slope, intercept + return (slope * Zscore) + intercept + +def k_force(Zscore): + """ + Function to assign to each restraint a force proportional to the underlying + experimental value. + """ + return power(fabs(Zscore), 0.5) + +class TADbitModelingOutOfBound(Exception): + pass diff --git a/tadphys/modelling/structuralmodel.py b/tadphys/modelling/structuralmodel.py new file mode 100644 index 0000000..58b74f9 --- /dev/null +++ b/tadphys/modelling/structuralmodel.py @@ -0,0 +1,955 @@ +""" +25 Oct 2016 + + +""" +from __future__ import print_function + + +from tadphys.utils.tadmaths import newton_raphson +from tadphys import __version__ as version +from math import sqrt, pi +import hashlib + +try: + basestring +except NameError: + basestring = str + +def model_header(model): + """ + Defines the header to write in output files for a given model + """ + if not 'description' in model: + return '' + outstr = '' + for desc in sorted(model['description']): + outstr += '# %-15s : %s\n' % (desc.upper(), model['description'][desc]) + return outstr + + +class StructuralModel(dict): + """ + A container for the structural modelling results. The container is a dictionary + with the following keys: + + - rand_init: Random number generator feed (needed for model reproducibility) + - x, y, z: 3D coordinates of each particles. Each represented as a list + + """ + def __len__(self): + return len(self['x']) + + def distance(self, part1, part2): + """ + Calculates the distance between one point of the model and an external + coordinate + + :param part1: index of a particle in the model + :param part2: index of a particle in the model + + :returns: distance between one point of the model and an external + coordinate + """ + if part1 == 0 or part2 == 0: + raise Exception('Particle number must be strictly positive\n') + return sqrt((self['x'][part1-1] - self['x'][part2-1])**2 + + (self['y'][part1-1] - self['y'][part2-1])**2 + + (self['z'][part1-1] - self['z'][part2-1])**2) + + + def _square_distance(self, part1, part2): + """ + Calculates the square instance between one point of the model and an + external coordinate + + :param part1: index of a particle in the model + :param part2: index of a particle in the model + + :returns: distance between one point of the model and an external + coordinate + """ + return ((self['x'][part1-1] - self['x'][part2-1])**2 + + (self['y'][part1-1] - self['y'][part2-1])**2 + + (self['z'][part1-1] - self['z'][part2-1])**2) + + + def _square_distance_to(self, part1, part2): + """ + :param part1: index of a particle in the model + :param part2: external coordinate (dict format with x, y, z keys) + + :returns: square distance between one point of the model and an external + coordinate + """ + return ((self['x'][part1] - part2[0])**2 + + (self['y'][part1] - part2[1])**2 + + (self['z'][part1] - part2[2])**2) + + + def center_of_mass(self): + """ + Gives the center of mass of a model + + :returns: the center of mass of a given model + """ + r_x = sum(self['x'])/len(self) + r_y = sum(self['y'])/len(self) + r_z = sum(self['z'])/len(self) + return dict((('x', r_x), ('y', r_y), ('z', r_z))) + + + def radius_of_gyration(self): + """ + Calculates the radius of gyration or gyradius of the model + + Defined as: + + .. math:: + + \sqrt{\\frac{\sum_{i=1}^{N} (x_i-x_{com})^2+(y_i-y_{com})^2+(z_i-z_{com})^2}{N}} + + with: + + * :math:`N` the number of particles in the model + * :math:`com` the center of mass + + :returns: the radius of gyration for the components of the tensor + """ + com = self.center_of_mass() + rog = sqrt(sum(self._square_distance_to(i, + (com['x'], com['y'], com['z'])) + for i in range(len(self))) / len(self)) + return rog + + + def contour(self): + """ + Total length of the model + + :returns: the totals length of the model + """ + dist = 0 + for i in range(1, len(self)): + dist += self.distance(i, i+1) + return dist + + + def longest_axe(self): + """ + Gives the distance between most distant particles of the model + + :returns: the maximum distance between two particles in the model + """ + maxdist = 0 + for i in range(1, len(self)): + for j in range(i + 1, len(self) + 1): + dist = self.distance(i, j) + if dist > maxdist: + maxdist = dist + return maxdist + + + def shortest_axe(self): + """ + Minimum distance between two particles in the model + + :returns: the minimum distance between two particles in the model + """ + mindist = float('inf') + for i in range(1, len(self)): + for j in range(i + 1, len(self) + 1): + dist = self.distance(i, j) + if dist < mindist: + mindist = dist + return mindist + + + def min_max_by_axis(self): + """ + Calculates the minimum and maximum coordinates of the model + + :returns: the minimum and maximum coordinates for each x, y and z axis + """ + return ((min(self['x']), max(self['x'])), + (min(self['y']), max(self['y'])), + (min(self['z']), max(self['z']))) + + + def cube_side(self): + """ + Calculates the side of a cube containing the model. + + :returns: the diagonal length of the cube containing the model + """ + return sqrt((min(self['x']) - max(self['x']))**2 + + (min(self['y']) - max(self['y']))**2 + + (min(self['z']) - max(self['z']))**2) + + + def cube_volume(self): + """ + Calculates the volume of a cube containing the model. + + :returns: the volume of the cube containing the model + """ + return self.cube_side()**3 + + + def inaccessible_particles(self, radius): + """ + Gives the number of loci/particles that are accessible to an object + (i.e. a protein) of a given size. + + :param radius: radius of the object that we want to fit in the model + + :returns: a list of numbers, each being the ID of a particles that would + never be reached by the given object + + TODO: remove this function + + """ + inaccessibles = [] + sphere = generate_sphere_points(100) + for i in range(len(self)): + impossibles = 0 + for xxx, yyy, zzz in sphere: + thing = (xxx * radius + self['x'][i], + yyy * radius + self['y'][i], + zzz * radius + self['z'][i]) + # print form % (k+len(self), thing['x'], thing['y'], thing['z'], + # 0, 0, 0, k+len(self)), + for j in range(len(self)): + if i == j: + continue + # print self._square_distance_to(j, thing), radius + if self._square_distance_to(j, thing) < radius**2: + # print i, j + impossibles += 1 + break + if impossibles == 100: + inaccessibles.append(i + 1) + return inaccessibles + + + # def persistence_length(self, start=1, end=None, return_guess=False): + # """ + # Calculates the persistence length (Lp) of given section of the model. + # Persistence length is calculated according to [Bystricky2004]_ : + + # .. math:: + + # = 2 \\times Lp^2 \\times (\\frac{Lc}{Lp} - 1 + e^{\\frac{-Lc}{Lp}}) + + # with the contour length as :math:`Lc = \\frac{d}{c}` where :math:`d` is + # the genomic dstance in bp and :math:`c` the linear mass density of the + # chromatin (in bp/nm). + + # :param 1 start: start particle from which to calculate the persistence + # length + # :param None end: end particle from which to calculate the persistence + # length. Uses the last particle by default + # :param False return_guess: Computes persistence length using the + # approximation :math:`Lp=\\frac{Lc}{Lp}` + + # :returns: persistence length, or 2 times the Kuhn length + # """ + # clength = float(self.contour()) + # end = end or len(self) + # sq_length = float(self._square_distance(start, end)) + + # guess = sq_length / clength + # if return_guess: + # return guess # incredible! + # kuhn = newton_raphson(guess, clength, sq_length) + # return 2 * kuhn + + + # def accessible_surface(self, radius, nump=100, superradius=200, + # include_edges=True, view_mesh=False, savefig=None, + # write_cmm_file=None, verbose=False, + # chimera_bin='chimera'): + # """ + # Calculates a mesh surface around the model (distance equal to input + # **radius**) and checks if each point of this mesh could be replaced by + # an object (i.e. a protein) of a given **radius** + + # Outer part of the model can be excluded from the estimation of + # accessible surface, as the occupancy outside the model is unknown (see + # superradius option). + + # :param radius: radius of the object we want to fit in the model. + # :param None write_cmm_file: path to file in which to write cmm with the + # colored meshed (red inaccessible points, green accessible points) + # :param 100 nump: number of points to draw around a given particle. This + # number also sets the number of points drawn around edges, as each + # point occupies a given surface (see maths below). *Note that this + # number is considerably lowered by the occupancy of edges, depending + # of the angle formed by the edges surrounding a given particle, only + # 10% to 50% of the ``nump`` will be drawn in fact.* + # :param True include_edges: if False, edges will not be included in the + # calculation of the accessible surface, only particles. Note that + # statistics on particles (like last item returned) will not change, + # and computation time will be significantly decreased. + # :param False view_mesh: launches chimera to display the mesh around the + # model + # :param None savefig: path where to save chimera image + # :param 'chimera' chimera_bin: path to chimera binary to use + # :param False verbose: prints stats about the surface + # :param 200 superradius: radius of an object used to exclude outer + # surface of the model. Superradius must be higher than radius. + + # This function will first define a mesh around the chromatin, + # representing all possible position of the center of the object we want + # to fit. This mesh will be at a distance of *radius* from the chromatin + # strand. All dots in the mesh represents an equal area (*a*), the whole + # surface of the chromatin strand being: :math:`A=n \\times a` (*n* being + # the total number of dots in the mesh). + + # The mesh consists of spheres around particles of the model, and + # cylinders around edges joining particles (no overlap is allowed between + # sphere and cylinders or cylinder and cylinder when they are + # consecutive). + + # If we want that all dots of the mesh representing the surface of the + # chromatin, corresponds to an equal area (:math:`a`) + + # .. math:: + + # a = \\frac{4\pi r^2}{s} = \\frac{2\pi r N_{(d)}}{c} + + # with: + + # * :math:`r` radius of the object to fit (as the input parameter **radius**) + # * :math:`s` number of points in sphere + # * :math:`c` number of points in circle (as the input parameter **nump**) + # * :math:`N_{(d)}` number of circles in an edge of length :math:`d` + + # According to this, when the distance between two particles is equal + # to :math:`2r` (:math:`N=2r`), we would have :math:`s=c`. + + # As : + + # .. math:: + + # 2\pi r = \sqrt{4\pi r^2} \\times \sqrt{\pi} + + # It is fair to state the number of dots represented along a circle as: + + # .. math:: + + # c = \sqrt{s} \\times \sqrt{\pi} + + # Thus the number of circles in an edge of length :math:`d` must be: + + # .. math:: + + # N_{(d)}=\\frac{s}{\sqrt{s}\sqrt{\pi}}\\times\\frac{d}{2r} + + # :returns: a list of *1-* the number of dots in the mesh that could be + # occupied by an object of the given radius *2-* the total number of + # dots in the mesh *3-* the estimated area of the mesh (in square + # micrometers) *4-* the area of the mesh of a virtually straight strand + # of chromatin defined as + # :math:`contour\\times 2\pi r + 4\pi r^2` (also in + # micrometers) *5-* a list of number of (accessibles, inaccessible) for + # each particle (percentage burried can be infered afterwards by + # accessible/(accessible+inaccessible) ) + + # """ + + # points, dots, superdots, points2dots = build_mesh( + # self['x'], self['y'], self['z'], len(self), nump, radius, + # superradius, include_edges) + + # # calculates the number of inaccessible peaces of surface + # if superradius: + # radius2 = (superradius - 4)**2 + # outdot = [] + # for x2, y2, z2 in superdots: + # for j, (x1, y1, z1) in enumerate(points): + # if fast_square_distance(x1, y1, z1, x2, y2, z2) < radius2: + # outdot.append(False) + # break + # else: + # outdot.append(True) + # continue + # points.insert(0, points.pop(j)) + # else: + # outdot = [False] * len(superdots) + + # # calculates the number of inaccessible peaces of surface + # radius2 = (radius - 2)**2 + # grey = (0.6, 0.6, 0.6) + # red = (1, 0, 0) + # green = (0, 1, 0) + # colors = [] + # for i, (x2, y2, z2) in enumerate(dots): + # if outdot[i]: + # colors.append(grey) + # continue + # for j, (x1, y1, z1) in enumerate(points): + # if fast_square_distance(x1, y1, z1, x2, y2, z2) < radius2: + # colors.append(red) + # break + # else: + # colors.append(green) + # continue + # points.insert(0, points.pop(j)) + # possibles = colors.count(green) + + # acc_parts = [] + # for p in sorted(points2dots.keys()): + # acc = 0 + # ina = 0 + # for dot in points2dots[p]: + # if colors[dot]==green: + # acc += 1 + # elif colors[dot]==red: + # ina += 1 + # acc_parts.append((p + 1, acc, ina)) + + # # some stats + # dot_area = 4 * pi * (float(radius) / 1000)**2 / nump + # area = (possibles * dot_area) + # total = (self.contour() / 1000 * 2 * pi * float(radius) / 1000 + 4 * pi + # * (float(radius) / 1000)**2) + # if verbose: + # print((' Accessible surface: %s micrometers^2' + + # '(%s accessible times %s micrometers)') % ( + # round(area, 2), possibles, dot_area)) + # print(' (%s accessible dots of %s total times %s micrometers)' % ( + # possibles, outdot.count(False), round(dot_area, 5))) + # print(' - %s%% of the contour mesh' % ( + # round((float(possibles)/outdot.count(False))*100, 2))) + # print(' - %s%% of a virtual straight chromatin (%s microm^2)' % ( + # round((area/total)*100, 2), round(total, 2))) + + # # write cmm file + # if savefig: + # view_mesh = True + # if write_cmm_file or view_mesh: + # out = '\n' + # form = ('\n') + # for k_2, thing in enumerate(dots): + # out += form % (1 + k_2, thing[0], thing[1], thing[2], + # colors[k_2][0], colors[k_2][1], colors[k_2][2]) + # if superradius: + # for k_3, thing in enumerate(superdots): + # out += form % (1 + k_3 + k_2 + 1, + # thing[0], thing[1], thing[2], + # 0.1, 0.1, 0.1) + # out += '\n' + # if view_mesh: + # out_f = open('/tmp/tmp_mesh.cmm', 'w') + # out_f.write(out) + # out_f.close() + # if write_cmm_file: + # out_f = open(write_cmm_file, 'w') + # out_f.write(out) + # out_f.close() + # if view_mesh: + # chimera_cmd = [ + # 'focus', + # 'bonddisplay never #1', + # 'shape tube #1 radius 15 bandLength 300 segmentSubdivisions 1 followBonds on', + # '~show #1', + # 'set bg_color white', 'windowsize 800 600', + # 'clip yon -500', 'set subdivision 1', 'set depth_cue', + # 'set dc_color black', 'set dc_start 0.5', 'set dc_end 1', + # 'scale 0.8'] + # if savefig: + # if savefig.endswith('.png'): + # chimera_cmd += ['copy file %s png' % (savefig)] + # elif savefig[-4:] in ('.mov', 'webm'): + # chimera_cmd += [ + # 'movie record supersample 1', 'turn y 3 120', + # 'wait 120', 'movie stop', + # 'movie encode output %s' % savefig] + # self.write_cmm('/tmp/') + # chimera_view(['/tmp/tmp_mesh.cmm', + # '/tmp/model.%s.cmm' % (self['rand_init'])], + # chimera_bin=chimera_bin, align=False, + # savefig=savefig, chimera_cmd=chimera_cmd) + + # return (possibles, outdot.count(False), area, total, acc_parts) + + + # def write_cmm(self, directory, color='index', rndname=True, + # model_num=None, filename=None, **kwargs): + # """ + # Save a model in the cmm format, read by Chimera + # (http://www.cgl.ucsf.edu/chimera). + + # **Note:** If none of model_num, models or cluster parameter are set, + # ALL the models will be written. + + # :param directory: location where the file will be written (note: the + # name of the file will be model_1.cmm if model number is 1) + # :param None model_num: the number of the model to save + # :param True rndname: If True, file names will be formatted as: + # model.RND.cmm, where RND is the random number feed used by IMP to + # generate the corresponding model. If False, the format will be: + # model_NUM_RND.cmm where NUM is the rank of the model in terms of + # objective function value + # :param None filename: overide the default file name writing + # :param 'index' color: can be: + + # * a string as: + # * '**index**' to color particles according to their position in the + # model (:func:`tadphys.utils.extraviews.color_residues`) + # * '**tad**' to color particles according to the TAD they belong to + # (:func:`tadphys.utils.extraviews.tad_coloring`) + # * '**border**' to color particles marking borders. Color according to + # their score (:func:`tadphys.utils.extraviews.tad_border_coloring`) + # coloring function like. + # * a function, that takes as argument a model and any other parameter + # passed through the kwargs. + # * a list of (r, g, b) tuples (as long as the number of particles). + # Each r, g, b between 0 and 1. + # :param kwargs: any extra argument will be passed to the coloring + # function + # """ + # if isinstance(color, basestring): + # if color == 'index': + # color = color_residues(self, **kwargs) + # elif color == 'tad': + # if not 'tads' in kwargs: + # raise Exception('ERROR: missing TADs\n ' + + # 'pass an Experiment.tads disctionary\n') + # color = tad_coloring(self, **kwargs) + # elif color == 'border': + # if not 'tads' in kwargs: + # raise Exception('ERROR: missing TADs\n ' + + # 'pass an Experiment.tads disctionary\n') + # color = tad_border_coloring(self, **kwargs) + # else: + # raise NotImplementedError(('%s type of coloring is not yet ' + + # 'implemeted\n') % color) + # elif hasattr(color, '__call__'): # it's a function + # color = color(self, **kwargs) + # elif not isinstance(color, list): + # raise TypeError('one of function, list or string is required\n') + # out = '\n' % (self['rand_init']) + # form = ('\n') + # for i in range(len(self['x'])): + # out += form % (i + 1, + # self['x'][i], self['y'][i], self['z'][i], + # color[i][0], color[i][1], color[i][2], i + 1) + # form = ('\n') + # break_chroms = [1] + # try: + # for beg, end in zip(self['description']['start'],self['description']['end']): + # break_chroms.append((end - beg)/self['description']['resolution']+break_chroms[-1]) + # except: + # pass + # for i in range(1, len(self['x'])): + # if i in break_chroms[1:]: + # continue + # out += form % (i, i + 1) + # out += '\n' + + # if filename: + # out_f = open('%s/%s' % (directory, filename), 'w') + # else: + # if rndname: + # out_f = open('%s/model.%s.cmm' % (directory, + # self['rand_init']), 'w') + # else: + # out_f = open('%s/model_%s_rnd%s.cmm' % ( + # directory, model_num, self['rand_init']), 'w') + # out_f.write(out) + # out_f.close() + + +# def write_xyz_OLD(self, directory, model_num=None, get_path=False, +# rndname=True): +# """ +# Writes a xyz file containing the 3D coordinates of each particle in the +# model. + +# **Note:** If none of model_num, models or cluster parameter are set, +# ALL the models will be written. + +# :param directory: location where the file will be written (note: the +# file name will be model.1.xyz, if the model number is 1) +# :param None model_num: the number of the model to save +# :param True rndname: If True, file names will be formatted as: +# model.RND.xyz, where RND is the random number feed used by IMP to +# generate the corresponding model. If False, the format will be: +# model_NUM_RND.xyz where NUM is the rank of the model in terms of +# objective function value +# :param False get_path: whether to return, or not, the full path where +# the file has been written +# """ +# if rndname: +# path_f = '%s/model.%s.xyz' % (directory, self['rand_init']) +# else: +# path_f = '%s/model_%s_rnd%s.xyz' % (directory, model_num, +# self['rand_init']) +# out = '' +# form = "%12s%12s%12.3f%12.3f%12.3f\n" +# for i in range(len(self['x'])): +# out += form % ('p' + str(i + 1), i + 1, round(self['x'][i], 3), +# round(self['y'][i], 3), round(self['z'][i], 3)) +# out_f = open(path_f, 'w') +# out_f.write(out) +# out_f.close() +# if get_path: +# return path_f +# else: +# return None + + + +# def write_json(self, directory, color='index', rndname=True, +# model_num=None, title=None, filename=None, **kwargs): +# """ +# Save a model in the json format, read by TADkit. + +# **Note:** If none of model_num, models or cluster parameter are set, +# ALL the models will be written. + +# :param directory: location where the file will be written (note: the +# name of the file will be model_1.cmm if model number is 1) +# :param None model_num: the number of the model to save +# :param True rndname: If True, file names will be formatted as: +# model.RND.cmm, where RND is the random number feed used by IMP to +# generate the corresponding model. If False, the format will be: +# model_NUM_RND.cmm where NUM is the rank of the model in terms of +# objective function value +# :param None filename: overide the default file name writing +# :param 'index' color: can be: + +# * a string as: +# * '**index**' to color particles according to their position in the +# model (:func:`tadphys.utils.extraviews.color_residues`) +# * '**tad**' to color particles according to the TAD they belong to +# (:func:`tadphys.utils.extraviews.tad_coloring`) +# * '**border**' to color particles marking borders. Color according to +# their score (:func:`tadphys.utils.extraviews.tad_border_coloring`) +# coloring function like. +# * a function, that takes as argument a model and any other parameter +# passed through the kwargs. +# * a list of (r, g, b) tuples (as long as the number of particles). +# Each r, g, b between 0 and 1. +# :param kwargs: any extra argument will be passed to the coloring +# function +# """ +# if isinstance(color, basestring): +# if color == 'index': +# color = color_residues(self, **kwargs) +# elif color == 'tad': +# if not 'tads' in kwargs: +# raise Exception('ERROR: missing TADs\n ' + +# 'pass an Experiment.tads disctionary\n') +# color = tad_coloring(self, **kwargs) +# elif color == 'border': +# if not 'tads' in kwargs: +# raise Exception('ERROR: missing TADs\n ' + +# 'pass an Experiment.tads disctionary\n') +# color = tad_border_coloring(self, **kwargs) +# else: +# raise NotImplementedError(('%s type of coloring is not yet ' + +# 'implemeted\n') % color) +# elif hasattr(color, '__call__'): # it's a function +# color = color(self, **kwargs) +# elif not isinstance(color, list): +# raise TypeError('one of function, list or string is required\n') +# form = ''' +# { +# "chromatin" : { +# "id" : %(sha)s, +# "title" : "%(title)s", +# "source" : "Tadphys %(version)s", +# "metadata": {%(descr)s}, +# "type" : "tadphys", +# "data": { +# "models": [ +# { %(xyz)s }, +# ], +# "clusters":[%(cluster)s], +# "centroid":[%(centroid)s], +# "restraints": [[][]], +# "chromatinColor" : [ ] +# } +# } +# } +# ''' +# fil = {} +# fil['sha'] = hashlib.new(fil['xyz']).hexdigest() +# fil['title'] = title or "Sample TADbit data" +# fil['version'] = version +# fil['descr'] = ''.join('\n', ',\n'.join([ +# '"%s" : %s' % (k, ('"%s"' % (v)) if isinstance(v, basestring) else v) +# for k, v in list(self.get('description', {}).items())]), '\n') +# fil['xyz'] = ','.join(['[%.4f,%.4f,%.4f]' % (self['x'][i], self['y'][i], +# self['z'][i]) +# for i in range(len(self['x']))]) + + +# if filename: +# out_f = open('%s/%s' % (directory, filename), 'w') +# else: +# if rndname: +# out_f = open('%s/model.%s.cmm' % (directory, +# self['rand_init']), 'w') +# else: +# out_f = open('%s/model_%s_rnd%s.cmm' % ( +# directory, model_num, self['rand_init']), 'w') +# out_f.write(out) +# out_f.close() + + + +# def write_xyz(self, directory, model_num=None, get_path=False, +# rndname=True, filename=None, header=True): +# """ +# Writes a xyz file containing the 3D coordinates of each particle in the +# model. +# Outfile is tab separated column with the bead number being the +# first column, then the genomic coordinate and finally the 3 +# coordinates X, Y and Z + +# **Note:** If none of model_num, models or cluster parameter are set, +# ALL the models will be written. + +# :param directory: location where the file will be written (note: the +# file name will be model.1.xyz, if the model number is 1) +# :param None model_num: the number of the model to save +# :param True rndname: If True, file names will be formatted as: +# model.RND.xyz, where RND is the random number feed used by IMP to +# generate the corresponding model. If False, the format will be: +# model_NUM_RND.xyz where NUM is the rank of the model in terms of +# objective function value +# :param False get_path: whether to return, or not, the full path where +# the file has been written +# :param None filename: overide the default file name writing +# :param True header: write a header describing the experiment from which +# """ +# if filename: +# path_f = '%s/%s' % (directory, filename) +# else: +# if rndname: +# path_f = '%s/model.%s.xyz' % (directory, self['rand_init']) +# else: +# path_f = '%s/model_%s_rnd%s.xyz' % (directory, model_num, +# self['rand_init']) +# out = '' +# if header: +# out += model_header(self) +# form = "%s\t%s\t%.3f\t%.3f\t%.3f\n" +# # TODO: do not use resolution directly -> specific to Hi-C +# chrom_list = self['description']['chromosome'] +# chrom_start = self['description']['start'] +# chrom_end = self['description']['end'] +# if not isinstance(chrom_list, list): +# chrom_list = [chrom_list] +# chrom_start = [chrom_start] +# chrom_end = [chrom_end] + +# chrom_start = [(int(c) // int(self['description']['resolution']) +# if int(c) else 0) +# for c in chrom_start] +# chrom_end = [(int(c) // int(self['description']['resolution']) +# if int(c) else len(self['x'])) +# for c in chrom_end] + +# offset = -chrom_start[0] +# for crm in range(len(chrom_list)): +# for i in range(chrom_start[crm] + offset, chrom_end[crm] + offset): +# out += form % ( +# i + 1, +# '%s:%s-%s' % ( +# chrom_list[crm], +# int(chrom_start[crm] or 0) + +# int(self['description']['resolution']) * (i - offset) + 1, +# int(chrom_start[crm] or 0) + +# int(self['description']['resolution']) * (i + 1 - offset)), +# round(self['x'][i], 3), +# round(self['y'][i], 3), round(self['z'][i], 3)) +# offset += (chrom_end[crm] - chrom_start[crm]) +# out_f = open(path_f, 'w') +# out_f.write(out) +# out_f.close() +# if get_path: +# return path_f +# else: +# return None + + # def write_xyz_babel(self, directory, model_num=None, get_path=False, + # rndname=True, filename=None): + # """ + # Writes a xyz file containing the 3D coordinates of each particle in the + # model using a file format compatible with babel + # (http://openbabel.org/wiki/XYZ_%28format%29). + # Outfile is tab separated column with the bead number being the + # first column, then the genomic coordinate and finally the 3 + # coordinates X, Y and Z + # **Note:** If none of model_num, models or cluster parameter are set, + # ALL the models will be written. + # :param directory: location where the file will be written (note: the + # file name will be model.1.xyz, if the model number is 1) + # :param None model_num: the number of the model to save + # :param True rndname: If True, file names will be formatted as: + # model.RND.xyz, where RND is the random number feed used by IMP to + # generate the corresponding model. If False, the format will be: + # model_NUM_RND.xyz where NUM is the rank of the model in terms of + # objective function value + # :param False get_path: whether to return, or not, the full path where + # the file has been written + # :param None filename: overide the default file name writing + # """ + # if filename: + # path_f = '%s/%s' % (directory, filename) + # else: + # if rndname: + # path_f = '%s/model.%s.xyz' % (directory, self['rand_init']) + # else: + # path_f = '%s/model_%s_rnd%s.xyz' % (directory, model_num, + # self['rand_init']) + # out = '' + # # Write header as number of atoms + # out += str(len(self['x'])) + # # Write comment as type of molecule + # out += "\nDNA\n" + + # form = "%s\t%.3f\t%.3f\t%.3f\n" + # # TODO: do not use resolution directly -> specific to Hi-C + # chrom_list = self['description']['chromosome'] + # chrom_start = self['description']['start'] + # chrom_end = self['description']['end'] + # if not isinstance(chrom_list, list): + # chrom_list = [chrom_list] + # chrom_start = [chrom_start] + # chrom_end = [chrom_end] + # chrom_start = [int(c)/int(self['description']['resolution']) for c in chrom_start] + # chrom_end = [int(c)/int(self['description']['resolution']) for c in chrom_end] + # offset = 0 + # for crm in range(len(chrom_list)): + # for i in range(chrom_start[crm]+offset,chrom_end[crm]+offset): + # out += form % ( + # i + 1, + # '%s:%s-%s' % ( + # chrom_list[crm], + # int(chrom_start[crm] or 0) + + # int(self['description']['resolution']) * (i - offset) + 1, + # int(chrom_start[crm] or 0) + + # int(self['description']['resolution']) * (i + 1 - offset)), + # round(self['x'][i], 3), + # round(self['y'][i], 3), round(self['z'][i], 3)) + # offset += (chrom_end[crm]-chrom_start[crm]) + # out_f = open(path_f, 'w') + # out_f.write(out) + # out_f.close() + # if get_path: + # return path_f + # else: + # return None + + # def view_model(self, tool='chimera', savefig=None, cmd=None, + # center_of_mass=False, gyradius=False, color='index', + # **kwargs): + # """ + # Visualize a selected model in the three dimensions. (either with Chimera + # or through matplotlib). + + # :param model_num: model to visualize + # :param 'chimera' tool: path to the external tool used to visualize the + # model. Can also be 'plot', to use matplotlib. + # :param None savefig: path to a file where to save the image OR movie + # generated (depending on the extension; accepted formats are png, mov + # and webm). if set to None, the image or movie will be shown using + # the default GUI. + # :param 'index' color: can be: + + # * a string as: + # * '**index**' to color particles according to their position in the + # model (:func:`tadphys.utils.extraviews.color_residues`) + # * '**tad**' to color particles according to the TAD they belong to + # (:func:`tadphys.utils.extraviews.tad_coloring`) + # * '**border**' to color particles marking borders. Color according to + # their score (:func:`tadphys.utils.extraviews.tad_border_coloring`) + # coloring function like. + # * a function, that takes as argument a model and any other parameter + # passed through the kwargs. + # * a list of (r, g, b) tuples (as long as the number of particles). + # Each r, g, b between 0 and 1. + # :param False center_of_mass: draws a dot representing the center of + # mass of the model + # :param False gyradius: draws the center of mass of the model as a sphere + # with radius equal to the radius of gyration of the model + # :param None cmd: list of commands to be passed to the viewer. + # The chimera list is: + + # :: + + # focus + # set bg_color white + # windowsize 800 600 + # bonddisplay never #0 + # represent wire + # shape tube #0 radius 5 bandLength 100 segmentSubdivisions 1 followBonds on + # clip yon -500 + # ~label + # set subdivision 1 + # set depth_cue + # set dc_color black + # set dc_start 0.5 + # set dc_end 1 + # scale 0.8 + + # Followed by the movie command to record movies: + + # :: + + # movie record supersample 1 + # turn y 3 120 + # wait 120 + # movie stop + # movie encode output SAVEFIG + + # Or the copy command for images: + + # :: + + # copy file SAVEFIG png + + # Passing as the following list as 'cmd' parameter: + # :: + + # cmd = ['focus', 'set bg_color white', 'windowsize 800 600', + # 'bonddisplay never #0', + # 'shape tube #0 radius 10 bandLength 200 segmentSubdivisions 100 followBonds on', + # 'clip yon -500', '~label', 'set subdivision 1', + # 'set depth_cue', 'set dc_color black', 'set dc_start 0.5', + # 'set dc_end 1', 'scale 0.8'] + + # will return the default image (other commands can be passed to + # modified the final image/movie). + + # :param kwargs: see :func:`tadphys.utils.extraviews.plot_3d_model` or + # :func:`tadphys.utils.extraviews.chimera_view` for other arguments + # to pass to this function + + # """ + # if gyradius: + # gyradius = self.radius_of_gyration() + # center_of_mass = True + # if tool == 'plot': + # x, y, z = self['x'], self['y'], self['z'] + # plot_3d_model(x, y, z, color=color, **kwargs) + # return + # self.write_cmm('/tmp/', color=color, **kwargs) + # chimera_view(['/tmp/model.%s.cmm' % (self['rand_init'])], + # savefig=savefig, chimera_bin=tool, chimera_cmd=cmd, + # center_of_mass=center_of_mass, gyradius=gyradius) diff --git a/taddyn/modelling/structuralmodel.py b/tadphys/modelling/structuralmodel.py~ similarity index 100% rename from taddyn/modelling/structuralmodel.py rename to tadphys/modelling/structuralmodel.py~ diff --git a/tadphys/utils/__init__.py b/tadphys/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tadphys/utils/extraviews.py b/tadphys/utils/extraviews.py new file mode 100644 index 0000000..6f9e25f --- /dev/null +++ b/tadphys/utils/extraviews.py @@ -0,0 +1,314 @@ +""" +06 Aug 2013 +""" + +from warnings import warn +from subprocess import Popen +from itertools import product + +import numpy as np + +try: + from matplotlib.ticker import MultipleLocator + from matplotlib import pyplot as plt + from mpl_toolkits.mplot3d import Axes3D +except ImportError: + warn('matplotlib not found\n') + +def my_round(num, val=4): + num = round(float(num), val) + return str(int(num) if num == int(num) else num) + + +def nicer(res, sep=' ', comma='', allowed_decimals=0): + """ + writes resolution number for human beings. + :param ' ' sep: character between number and unit (e.g. default: '125 kb') + :param '' comma: character to separate groups of thousands + :param 0 allowed_decimals: if 1 '1900 kb' would be written as '1.9 Mb' + """ + format = lambda x: '{:,g}'.format(x).replace(',', comma) + + if not res: + return format(res) + sep + 'b' + if not res % 10**(9 - allowed_decimals): + return format(res / 10.**9) + sep + 'Gb' + if not res % 10**(6 - allowed_decimals): + return format(res / 10.**6) + sep + 'Mb' + if not res % 10**(3 - allowed_decimals): + return format(res / 10.**3) + sep + 'kb' + return format(res) + sep + 'b' + + +def tadbit_savefig(savefig): + try: + form = savefig[-4:].split('.')[1] + except IndexError: # no dot in file name + warn('WARNING: file extension not found saving in png') + form = 'png' + if not form in ['png', 'pdf', 'ps', 'eps', 'svg']: + raise NotImplementedError('File extension must be one of %s' %( + ['png', 'pdf', 'ps', 'eps', 'svg'])) + plt.savefig(savefig, format=form) + + +def plot_2d_optimization_result(result, + axes=('scale', 'kbending', 'maxdist', 'lowfreq', + 'upfreq'), + dcutoff=None, show_best=0, skip=None, + savefig=None,clim=None, cmap='inferno'): + + """ + A grid of heatmaps representing the result of the optimization. In the optimization + up to 5 parameters can be optimized: 'scale', 'kbending', 'maxdist', 'lowfreq', and 'upfreq'. + The maps will be divided in different pages depending on the 'scale' and 'kbending' values. + In each page there will be different maps depending the 'maxdist' values. + Each map has 'upfreq' values along the x-axes, and 'lowfreq' values along the y-axes. + + :param result: 3D numpy array contating the computed correlation values + :param 'scale','kbending','maxdist','lowfreq','upfreq' axes: tuple of axes + to represent. The order is important here. It will define which parameter + will be placed respectively on the v, w, z, y, or x axes. + :param 0 show_best: number of best correlation value to highlight in the heatmaps. + The best correlation is highlithed by default + :param None skip: a dict can be passed here in order to fix a given parameter value, + e.g.: {'scale': 0.001, 'kbending': 30, 'maxdist': 500} will represent all the + correlation values at fixed 'scale', 'kbending', and 'maxdist' values, + respectively equal to 0.001, 30, and 500. + :param None dcutoff: The distance cutoff (dcutoff) used to compute the contact matrix + in the models. + :param None savefig: path to a file where to save the generated image. + If None, the image will be displayed using matplotlib GUI. NOTE: the extension + of the file name will automatically determine the desired format. + :param None clim: color scale. If None, the max and min values of the input are used. + :param inferno cmap: matplotlib colormap + + """ + + from mpl_toolkits.axes_grid1 import AxesGrid + import matplotlib.patches as patches + + ori_axes, axes_range, result = result + + # Commands for compatibility with the OLD version: + #print axes_range + if len(axes_range) == 4: + tmp_axes_range = axes_range + tmp_axes_range[1] = [0.0] # kbending !!!New option!!! + len_kbending_range = 1 + for i in xrange(len(ori_axes)): + if ori_axes[i] == 'scale': + tmp_axes_range[0] = axes_range[i] # scale + len_scale_range = len(axes_range[i]) + scale_index = i + if ori_axes[i] == 'maxdist': + tmp_axes_range[2] = axes_range[i] # maxdist + len_maxdist_range = len(axes_range[i]) + maxdist_index = i + if ori_axes[i] == 'lowfreq': + tmp_axes_range[3] = axes_range[i] # lowfreq + len_lowfreq_range = len(axes_range[i]) + lowfreq_index = i + if ori_axes[i] == 'upfreq': + tmp_axes_range[4] = axes_range[i] # upfreq + len_upfreq_range = len(axes_range[i]) + upfreq_index = i + #print axes_range + + tmp_result = np.empty((len_scale_range , len_kbending_range, len_maxdist_range, + len_lowfreq_range, len_upfreq_range)) + + indeces_sets = product(list(range(len(axes_range[0]))), + list(range(len(axes_range[1]))), + list(range(len(axes_range[2]))), + list(range(len(axes_range[3])))) + + for indeces_set in indeces_sets: + tmp_indeces_set = [0, 0, 0, 0, 0] + tmp_indeces_set[0] = indeces_set[scale_index] # scale + tmp_indeces_set[1] = 0 # kbending + tmp_indeces_set[2] = indeces_set[maxdist_index] # maxdist + tmp_indeces_set[3] = indeces_set[lowfreq_index] # lowfreq + tmp_indeces_set[4]= indeces_set[upfreq_index] # upfreq + tmp_result[tmp_indeces_set] = result[indeces_set] + + ori_axes = ('scale', 'kbending', 'maxdist', 'lowfreq', 'upfreq') + axes_range = tmp_axes_range + result = tmp_result + + trans = [ori_axes.index(a) for a in axes] + axes_range = [axes_range[i] for i in trans] + # transpose results + result = result.transpose(trans) + # set NaNs + result = np.ma.array(result, mask=np.isnan(result)) + cmap = plt.get_cmap(cmap) + cmap.set_bad('w', 1.) + + # defines axes + if clim: + vmin=clim[0] + vmax=clim[1] + else: + vmin = result.min() + vmax = result.max() + + round_decs = 6 + # Here we round the values in axes_range and pass from the + # 5 parameters to the cartesian axes names. + vax = [my_round(i, round_decs) for i in axes_range[0]] # scale + wax = [my_round(i, round_decs) for i in axes_range[1]] # kbending + zax = [my_round(i, round_decs) for i in axes_range[2]] # maxdist + yax = [my_round(i, round_decs) for i in axes_range[3]] # lowfreq + xax = [my_round(i, round_decs) for i in axes_range[4]] # upfreq + + # This part marks the set of best correlations that the + # user wants to be highlighted in the plot + vax_range = list(range(len(vax)))[::-1] # scale + wax_range = list(range(len(wax)))[::-1] # kbending + zax_range = list(range(len(zax))) # maxdist + yax_range = list(range(len(yax))) # lowfreq + xax_range = list(range(len(xax))) # upfreq + indeces_sets = product(vax_range, wax_range, + zax_range, yax_range, + xax_range) + + sort_result = sorted([(result[indeces_set],vax[indeces_set[0]],wax[indeces_set[1]], + zax[indeces_set[2]],yax[indeces_set[3]],xax[indeces_set[4]]) + for indeces_set in indeces_sets if str(result[indeces_set]) != '--'], + key=lambda x: x[0], reverse=True)[:show_best+1] + + # This part allows the user to "skip" some parameters to show. + # This means to fix the value of certain parameters. + skip = {} if not skip else skip + for i, parameter in enumerate(axes): + if not parameter in skip: + continue + if i == 0: + vax_range = [vax.index(skip[parameter])] + elif i == 1: + wax_range = [wax.index(skip[parameter])] + elif i == 2: + zax_range = [zax.index(skip[parameter])] + else: + raise Exception(('ERROR: skip keys must be one of the three first' + + ' keywords passed as axes parameter')) + + # best number of rows/columns + ncols = len(zax_range) + nrows = len(vax_range) * len(wax_range) + + # width and height of each heatmap. These dimensions of each heatmap + # depend on the number of values on the x-axes, len(xax), related to + # 'upfreq', and on the y-axes, len(yax), related to 'lowfreq'. width and + # height are also multiplied by the ncols, that is the number of + # heatmaps per row (one for each value of 'maxdist'), and nrows, that is + # the number of heatmaps per column (one for each combination of 'scale' and + # 'kbending' values). + width = max(4, (float(ncols) * len(xax)) / 3) + height = max(3, (float(nrows) * len(yax)) / 3) + #print 4,float(ncols)*len(xax) / 3,width + #print 3,float(nrows)*len(yax) / 3,height + # Definition of the heatmap object + heatmap = plt.figure(figsize=(width, height)) + + # Here we define the grid of heatmaps. + grid = AxesGrid(heatmap, [.2, .2, .6, .5], + nrows_ncols = (nrows + 1, ncols + 1), + axes_pad = 0.0, + label_mode = "1", + share_all = False, + cbar_location="right", + cbar_mode="single", + # cbar_size="%s%%" % (20./ width), + cbar_pad="30%", + ) + cell = ncols + used = [] + + for row in product(vax_range,wax_range): + cell+=1 + + for column in zax_range: + used.append(cell) + # Setting the values in the heatmap + im = grid[cell].imshow(result[row[0], row[1], column, :, :], + interpolation="nearest", origin='lower', + vmin=vmin, vmax=vmax, cmap=cmap) + + # Setting the ticks of the heatmap + grid[cell].tick_params(axis='both', direction='out', top=False, + right=False, left=False, bottom=False) + + for j, best in enumerate(sort_result[:-1], 1): + if best[1] == vax[row[0]] and best[2] == wax[row[1]] and best[3] == zax[column]: + #print j, best, vax[row[0]], wax[row[1]], zax[column] + grid[cell].text(xax.index(best[5]), yax.index(best[4]), str(j), + {'ha':'center', 'va':'center'}, size=8) + + if row[0] == vax_range[0] and row[1] == wax_range[0]: + rect = patches.Rectangle((-0.5, len(yax)-0.5), len(xax), 1.5, + facecolor='grey', alpha=0.5) + rect.set_clip_on(False) + grid[cell].add_patch(rect) + # Set up label in the heatmap (for maxdist) + if column == 0: + #print "Cell number",cell + grid[cell].text(- (len(xax) / 2 + 0.5), len(yax)+0.25, + axes[2], + {'ha':'center', 'va':'center'}, size=8) + + grid[cell].text(len(xax) / 2. - 0.5, len(yax)+0.25, + str(my_round(zax[column], round_decs)), + {'ha':'center', 'va':'center'}, size=8) + + cell += 1 + + rect = patches.Rectangle((len(xax)-.5, -0.5), 2.5, len(yax), + facecolor='grey', alpha=0.5) + # Define the rectangles for + #print dcutoff + rect.set_clip_on(False) + grid[cell-1].add_patch(rect) + grid[cell-1].text(len(xax) + 1.0, len(yax) / 2., + str(my_round(vax[row[0]], round_decs)) + '\n' + + str(my_round(wax[row[1]], round_decs)) + '\n' + + str(my_round(dcutoff, round_decs)), + {'ha':'center', 'va':'center'}, + rotation=90, size=8) + + grid[cell-1].text(len(xax) - 0.2, len(yax) + 1.2, + axes[0] + '\n' + axes[1] + '\ndcutoff', + {'ha':'left', 'va':'center'}, + rotation=90, size=8) + + # + for i in range(cell+1): + if not i in used: + grid[i].set_visible(False) + + # This affects the axes of all the heatmaps, because the flag set share_all + # is set equal to True. + # grid.axes_llc.set_ylim(-0.5, len(yax)+1) + + grid.axes_llc.set_xticks(list(range(0, len(xax), 2))) + grid.axes_llc.set_yticks(list(range(0, len(yax), 2))) + grid.axes_llc.set_xticklabels([my_round(i, round_decs) for i in xax][::2], size=9) + grid.axes_llc.set_yticklabels([my_round(i, round_decs) for i in yax][::2], size=9) + grid.axes_llc.set_xlabel(axes[4], size=9) + grid.axes_llc.set_ylabel(axes[3], size=9) + + # Color bar settings + grid.cbar_axes[0].colorbar(im) + grid.cbar_axes[0].set_ylabel('Correlation value', size=9) + grid.cbar_axes[0].tick_params(labelsize=9) + + title = 'Optimal parameters\n' + heatmap.suptitle(title, size=12) + + #plt.tight_layout() + if savefig: + tadbit_savefig(savefig) + else: + plt.show() + diff --git a/tadphys/utils/hic_filtering.py b/tadphys/utils/hic_filtering.py new file mode 100644 index 0000000..a096e1c --- /dev/null +++ b/tadphys/utils/hic_filtering.py @@ -0,0 +1,445 @@ +""" +06 Aug 2013 +""" +from __future__ import print_function # (at top of module) +from warnings import warn +from sys import stderr +from re import sub + + +import numpy as np + +try: + from matplotlib import pyplot as plt +except ImportError: + warn('matplotlib not found\n') + + +def get_r2 (fun, X, Y, *args): + sstot = sum([(Y[i]-np.mean(Y))**2 for i in xrange(len(Y))]) + sserr = sum([(Y[i] - fun(X[i], *args))**2 for i in xrange(len(Y))]) + return 1 - sserr/sstot + + +def filter_by_mean(matrx, draw_hist=False, silent=False, bads=None): + """ + fits the distribution of Hi-C interaction count by column in the matrix to + a polynomial. Then searches for the first possible + """ + nbins = 100 + if not bads: + bads = {} + # get sum of columns + cols = [] + size = len(matrx) + for c in sorted([[matrx.get(i+j*size, 0) for j in xrange(size) if not j in bads] + for i in xrange(size) if not i in bads], key=sum): + cols.append(sum(c)) + cols = np.array(cols) + if draw_hist: + plt.figure(figsize=(9, 9)) + try: + percentile = np.percentile(cols, 5) + except IndexError: + warn('WARNING: no columns to filter out') + return bads + # mad = np.median([abs(median - c ) for c in cols]) + best =(None, None, None, None) + # bin the sum of columns + xmin = min(cols) + xmax = max(cols) + y = np.linspace(xmin, xmax, nbins) + hist = np.digitize(cols, y) + x = [sum(hist == i) for i in range(1, nbins + 1)] + if draw_hist: + hist = plt.hist(cols, bins=100, alpha=.3, color='grey') + xp = range(0, int(cols[-1])) + # check if the binning is correct + # we want at list half of the bins with some data + try: + cnt = 0 + while list(x).count(0) > len(x)/2: + cnt += 1 + cols = cols[:-1] + xmin = min(cols) + xmax = max(cols) + y = np.linspace(xmin, xmax, nbins) + hist = np.digitize(cols, y) + x = [sum(hist == i) for i in range(1, nbins + 1)] + if draw_hist: + plt.clf() + hist = plt.hist(cols, bins=100, alpha=.3, color='grey') + xp = range(0, int(cols[-1])) + if cnt > 10000: + raise ValueError + # find best polynomial fit in a given range + for order in range(6, 18): + z = np.polyfit(y, x, order) + zp = np.polyder(z, m=1) + roots = np.roots(np.polyder(z)) + # check that we are concave down, otherwise take next root + pente = np.polyval(zp, abs(roots[-2] - roots[-1]) / 2 + roots[-1]) + if pente > 0: + root = roots[-1] + else: + root = roots[-2] + # root must be higher than zero + if root <= 0: + continue + # and lower than the median + if root >= percentile: + continue + p = np.poly1d(z) + R2 = get_r2(p, x, y) + # try to avoid very large orders by weigthing negatively their fit + if order > 13: + R2 -= float(order)/30 + if best[0] < R2: + best = (R2, order, p, z, root) + try: + p, z, root = best[2:] + if draw_hist: + xlims = plt.xlim() + ylims = plt.ylim() + a = plt.plot(xp, p(xp), "--", color='k') + b = plt.vlines(root, 0, plt.ylim()[1], colors='r', linestyles='dashed') + # c = plt.vlines(median - mad * 1.5, 0, 110, colors='g', + # linestyles='dashed') + try: + plt.legend(a+[b], ['polyfit \n%s' % ( + ''.join([sub('e([-+][0-9]+)', 'e^{\\1}', + '$%s%.1fx^%s$' % ('+' if j>0 else '', j, + '{' + str(i) + '}')) + for i, j in enumerate(list(p)[::-1])])), + 'first solution of polynomial derivation'], + fontsize='x-small') + except TypeError: + plt.legend(a+[b], ['polyfit \n%s' % ( + ''.join([sub('e([-+][0-9]+)', 'e^{\\1}', + '$%s%.1fx^%s$' % ('+' if j>0 else '', j, + '{' + str(i) + '}')) + for i, j in enumerate(list(p)[::-1])])), + 'first solution of polynomial derivation']) + # plt.legend(a+[b]+[c], ['polyfit \n{}'.format ( + # ''.join([sub('e([-+][0-9]+)', 'e^{\\1}', + # '${}{:.1}x^{}$'.format ('+' if j>0 else '', j, + # '{' + str(i) + '}')) + # for i, j in enumerate(list(p)[::-1])])), + # 'first solution of polynomial derivation', + # 'median - (1.5 * median absolute deviation)'], + # fontsize='x-small') + plt.ylim([0, ylims[1]]) + plt.xlim(xlims) + plt.xlabel('Sum of interactions') + plt.xlabel('Number of columns with a given value') + plt.show() + # label as bad the columns with sums lower than the root + for i, col in enumerate([[matrx.get(i+j*size, 0) + for j in xrange(size)] + for i in xrange(size)]): + if sum(col) < root: + bads[i] = sum(col) + # now stored in Experiment._zeros, used for getting more accurate z-scores + if bads and not silent: + stderr.write(('\nWARNING: removing columns having less than %s ' + + 'counts:\n %s\n') % ( + round(root, 3), ' '.join( + ['%5s'%str(i + 1) + (''if (j + 1) % 20 else '\n') + for j, i in enumerate(sorted(bads.keys()))]))) + except: + if not silent: + stderr.write('WARNING: Too many zeroes to filter columns.' + + ' SKIPPING...\n') + if draw_hist: + plt.xlabel('Sum of interactions') + plt.xlabel('Number of columns with a given value') + plt.show() + except ValueError: + if not silent: + stderr.write('WARNING: Too few data to filter columns based on ' + + 'mean value.\n') + if draw_hist: + plt.close('all') + return bads + + +def filter_by_zero_count(matrx, perc_zero, min_count=None, silent=True): + """ + :param matrx: Hi-C matrix of a given experiment + :param perc: percentage of cells with no count allowed to consider a column + as valid. + :param None min_count: minimum number of reads mapped to a bin (recommended + value could be 2500). If set this option overrides the perc_zero + filtering... This option is slightly slower. + + :returns: a dicitionary, which has as keys the index of the filtered out + columns. + """ + bads = {} + size = len(matrx) + if min_count is None: + cols = [size for i in xrange(size)] + for k in matrx: + cols[k / size] -= 1 + min_val = int(size * float(perc_zero) / 100) + else: + if matrx.symmetricized: + min_count *= 2 + cols = [0 for i in xrange(size)] + for k, v in matrx.iteritems(): # linear representation of the matrix + cols[k / size] += v + min_val = size - min_count + if min_count is None: + check = lambda x: x > min_val + else: + check = lambda x: x < min_count + for i, col in enumerate(cols): + if check(col): + bads[i] = True + if bads and not silent: + if min_count is None: + stderr.write(('\nWARNING: removing columns having more than %s ' + + 'zeroes:\n %s\n') % ( + min_val, ' '.join( + ['%5s' % str(i + 1) + (''if (j + 1) % 20 else '\n') + for j, i in enumerate(sorted(bads.keys()))]))) + else: + stderr.write(('\nWARNING: removing columns having less than %s ' + + 'counts:\n %s\n') % ( + int(size - min_val), ' '.join( + ['%5s' % str(i + 1) + (''if (j + 1) % 20 else '\n') + for j, i in enumerate(sorted(bads.keys()))]))) + return bads + + +def hic_filtering_for_modelling(matrx, silent=False, perc_zero=90, auto=True, + min_count=None, draw_hist=False, + diagonal=True): + """ + Call filtering function, to remove artifactual columns in a given Hi-C + matrix. This function will detect columns with very low interaction + counts; and columns with NaN values (in this case NaN will be replaced + by zero in the original Hi-C data matrix). Filtered out columns will be + stored in the dictionary Experiment._zeros. + + :param matrx: Hi-C matrix of a given experiment + :param False silent: does not warn for removed columns + + :param True diagonal: remove row/columns with zero in the diagonal + :param 90 perc_zero: maximum percentage of cells with no interactions + allowed. + :param None min_count: minimum number of reads mapped to a bin (recommended + value could be 2500). If set this option overrides the perc_zero + filtering... This option is slightly slower. + :param True auto: if False, only filters based on the given percentage + zeros + + :returns: the indexes of the columns not to be considered for the + calculation of the z-score + """ + bads = filter_by_zero_count(matrx, perc_zero, min_count=min_count, silent=silent) + if auto: + bads.update(filter_by_mean(matrx, draw_hist=draw_hist, silent=silent, + bads=bads)) + # also removes rows or columns containing a NaN + has_nans = False + for i in xrange(len(matrx)): + if matrx.get(i + i * len(matrx), 0) == 0 and diagonal: + if not i in bads: + bads[i] = None + elif repr(sum([matrx.get(i + j * len(matrx), 0) + for j in xrange(len(matrx))])) == 'nan': + has_nans = True + if not i in bads: + bads[i] = None + return bads, has_nans + + +def _best_window_size(sorted_prc, size, beg, end, verbose=False): + """ + Search for best window size. + Between given begin and end percentiles of the distribution of cis interactions + searches for a window size (number of bins) where all median values are between + median * stddev and median * stddev of the global measure. + + :param sorted_prc: list of percentages of cis interactions by bins, sorted + by the total interactions in the corresponding bins. + :param size: total number of bins + :param beg: starting position of the region with expected 'normal' behavior + of the cis-percentage + :param end: last position of the region with expected 'normal' behavior + of the cis-percentage + :param False verbose: print running information + + :returns: window size + """ + if verbose: + print (' -> defining window in number of bins to average values of\n' + ' percentage of cis interactions') + nwins = min((1000, size / 10)) + if nwins < 100: + warn('WARNING: matrix probably too small to automatically filter out bins\n') + win_size = 0 + prevn = 0 + count = 0 + # iterate over possible window sizes (use logspace to gain some time) + for n in np.logspace(1, 4, num=100): + n = int(n) + if n == prevn: + continue + prevn = n + + tmp_std = [] + tmp_med = [] + for k in xrange(int(size * beg), int(size * end), + (int(size * end) - int(size * beg)) / nwins): + vals = sorted_prc[k:k + n] + tmp_std.append(np.std(vals)) + tmp_med.append(np.median(vals)) + med_mid = np.median([tmp_med[i] for i in xrange(nwins)]) + results = [m - s < med_mid < m + s + for m, s in zip(tmp_med, tmp_std)] + + # if verbose: + # print ' -', n, med_mid, sum(results) + if all(results): + if not count: + win_size = n + count += 1 + if count == 10: + break + else: + count = 0 + + if verbose: + print(' * first window size with stable median of cis-percentage: %d' % (win_size)) + return win_size + + +def filter_by_cis_percentage(cisprc, beg=0.3, end=0.8, sigma=2, verbose=False, + size=None, min_perc=None, max_perc=None): + """ + Define artifactual columns with either too low or too high counts of + interactions by compraing their percentage of cis interactions + (inter-chromosomal). + + :param cisprc: dictionary with counts of cis-percentage by bin number. + Values of the dictionary are tuple with,m as first element the number + of cis interactions and as second element the total number of + interactions. + :param 0.3 beg: proportion of bins to be considered as possibly having low + counts + :param 0.8 end: proportion of bins to be considered as possibly having high + counts + :param 2 sigma: number of standard deviations used to define lower and upper + ranges in the varaition of the percentage of cis interactions + :param None size: size of the genome, inumber of bins (otherwise inferred + from cisprc dictionary) + :param None sevefig: path to save image of the distribution of cis + percentages and total counts by bin. + + :returns: dictionary of bins to be filtered out (with either too low or too + high counts of interactions). + """ + sorted_sum, indices = zip(*sorted((cisprc[i][1], i) for i in cisprc)) + + sorted_prc = [float(cisprc[i][0]) / cisprc[i][1] for i in indices] + + size = (max(indices) + 1) if not size else size + + win_size = _best_window_size(sorted_prc, size, beg, end, verbose=verbose) + + # define confidance bands, compute median plus/minus one standard deviation + errors_pos = [] + errors_neg = [] + for k in xrange(0, size, 1): + vals = sorted_prc[k:k+win_size] + std = np.std(vals) + med = np.median(vals) + errors_pos.append(med + std * sigma) + errors_neg.append(med - std * sigma) + + # calculate median and variation of median plus/minus one standard deviation + # for values between percentile 10 and 90 of the distribution of the + # percentage of cis interactions + # - for median plus one standard deviation + std_err_pos = np.std (errors_pos[int(size * beg):int(size * end)]) + med_err_pos = np.median(errors_pos[int(size * beg):int(size * end)]) + # - for median minus one standard deviation + std_err_neg = np.std (errors_neg[int(size * beg):int(size * end)]) + med_err_neg = np.median(errors_neg[int(size * beg):int(size * end)]) + + # define cutoffs, values of cis percentage plus 1 stddev should be between + # the general median +/- 2 stddev of the distribution of the cis percentage + # plus 1 stddev. Same on the side of median cis percentage minus 1 stddev + beg_pos = med_err_pos - std_err_pos * sigma + end_pos = med_err_pos + std_err_pos * sigma + beg_neg = med_err_neg - std_err_neg * sigma + end_neg = med_err_neg + std_err_neg * sigma + + cutoffL = None + passed = 0 + consecutive = 10 + for cutoffL, (p, n) in enumerate(zip(errors_pos, errors_neg)): + # print '%6.4f %6.4f %6.4f %6.4f %6.4f %6.4f' % (beg_pos, p, end_pos, beg_neg, n, end_neg) + if (beg_pos < p < end_pos) and (beg_neg < n < end_neg): + if passed >= consecutive: + break + passed += 1 + else: + passed = 0 + else: + raise Exception('ERROR: left cutoff not found!!!') + cutoffL -= consecutive # rescale, we asked for XX consecutive + + # right + cutoffR = None + passed = 0 + for cutoffR, (p, n) in enumerate(zip(errors_pos, errors_neg)[::-1]): + cutoffR = size - cutoffR + # print '%6.4f %6.4f %6.4f %6.4f %6.4f %6.4f' % (beg_pos, p, end_pos, beg_neg, n, end_neg) + if (beg_pos < p < end_pos) and (beg_neg < n < end_neg): + if passed >= consecutive: + break + passed += 1 + else: + passed = 0 + else: + raise Exception('ERROR: right cutoff not found!!!') + cutoffR += consecutive # rescale, we asked for XX consecutive + + if min_perc: + cutoffL = min_perc / 100. * size + if max_perc: + cutoffR = max_perc / 100. * size + + min_count = sorted_sum[int(cutoffL)] + try: + max_count = sorted_sum[int(cutoffR)] + except IndexError: # all good + max_count = sorted_sum[-1] + 1 + + if verbose: + print(' * Lower cutoff applied until bin number: %d' % (cutoffL)) + print(' * too few interactions defined as less than %9d interactions' % (min_count)) + print(' * Upper cutoff applied until bin number: %d' % (cutoffR)) + print(' * too much interactions defined as more than %9d interactions' % (max_count)) + + # plot + + badcol = {} + countL = 0 + countZ = 0 + countU = 0 + for c in xrange(size): + if cisprc.get(c, [0, 0])[1] < min_count: + badcol[c] = cisprc.get(c, [0, 0])[1] + countL += 1 + if not c in cisprc: + countZ += 1 + elif cisprc[c][1] > max_count: # don't need get here, already cought in previous condition + badcol[c] = cisprc.get(c, [0, 0])[1] + countU += 1 + print(' => %d BAD bins (%d/%d/%d null/low/high counts) of %d (%.1f%%)' % (len(badcol), countZ, countL, countU, size, float(len(badcol)) / size * 100)) + + return badcol diff --git a/tadphys/utils/hic_parser.py b/tadphys/utils/hic_parser.py new file mode 100644 index 0000000..c5e597c --- /dev/null +++ b/tadphys/utils/hic_parser.py @@ -0,0 +1,391 @@ +from __future__ import print_function + +from future import standard_library +from builtins import next +standard_library.install_aliases() +from sys import stderr +from io import IOBase +from collections import OrderedDict +from warnings import warn +from math import sqrt, isnan + +import numpy as np + +try: + file_types = file, IOBase +except NameError: + file_types = (IOBase,) + +try: + basestring +except NameError: + basestring = str + +HIC_DATA = True + + +class AutoReadFail(Exception): + """ + Exception to handle failed autoreader. + """ + pass + + +def is_asymmetric(matrix): + """ + Helper functions for the autoreader. + """ + maxn = len(matrix) + for i in range(maxn): + maxi = matrix[i] # slightly more efficient + for j in range(i+1, maxn): + if maxi[j] != matrix[j][i]: + if isnan(maxi[j]) and isnan(matrix[j][i]): + continue + return True + return False + +def symmetrize_dico(hic): + """ + Make an HiC_data object symmetric by summing two halves of the matrix + """ + ncol = len(hic) + for i in xrange(ncol): + incol = i * ncol + for j in xrange(i, ncol): + p1 = incol + j + p2 = j * ncol + i + val = hic.get(p1, 0) + hic.get(p2, 0) + if val: + hic[p1] = hic[p2] = val + + +def symmetrize(matrix): + """ + Make a matrix symmetric by summing two halves of the matrix + """ + maxn = len(matrix) + for i in range(maxn): + for j in range(i, maxn): + matrix[i][j] = matrix[j][i] = matrix[i][j] + matrix[j][i] + +def __read_file_header(f): + """ + Read file header, inside first commented lines of a file + + :returns masked dict, chromsomes orderedDict, crm, beg, end, resolution: + """ + masked = {} + chromosomes = OrderedDict() + crm, beg, end, reso = None, None, None, None + fpos = f.tell() + for line in f: + if line[0] != '#': + break + fpos += len(line) + if line.startswith('# MASKED'): + try: + masked = dict([(int(n), True) for n in line.split()[-1].split(',')]) + except ValueError: # nothing here + pass + elif line.startswith('# CRM'): + _, _, crm, size = line.split() + chromosomes[crm] = int(size) + elif 'resolution:' in line: + _, coords, reso = line.split() + try: + crm, pos = coords.split(':') + beg, end = list(map(int, pos.split('-'))) + except ValueError: + crm = coords + beg, end = None, None + reso = int(reso.split(':')[1]) + f.seek(fpos) + if crm == 'full': + crm = None + return masked, chromosomes, crm, beg, end, reso + + +def abc_reader(f): + """ + Read matrix stored in 3 column format (bin1, bin2, value) + + :param f: an iterable (typically an open file). + + :returns: An iterator to be converted in dictionary, matrix size, raw_names + as list of tuples (chr, pos), dictionary of masked bins, and boolean + reporter of symetric transformation + """ + masked, chroms, crm, beg, end, reso = __read_file_header(f) # TODO rest of it not used here + sections = {} + size = 0 + for c in chroms: + sections[c] = size + size += chroms[c] // reso + 1 + if beg: + header = [(crm, '%d-%d' % (l * reso + 1, (l + 1) * reso)) + for l in range(beg, end)] + else: + header = [(c, '%d-%d' % (l * reso + 1, (l + 1) * reso)) + for c in chroms + for l in range(sections[c], sections[c] + chroms[c] // reso + 1)] + num = int if HIC_DATA else float + offset = (beg or 0) * (1 + size) + def _disect(x): + a, b, v = x.split() + return (int(a) + int(b) * size + offset, num(v)) + items = tuple(_disect(line) for line in f) + return items, size, header, masked, False + + +def __is_abc(f): + """ + Only works for matrices with more than 3 bins + """ + fpos = f.tell() + count = 0 + for line in f: + if line.startswith('#'): + continue + count += 1 + if len(line.split()) != 3: + f.seek(fpos) + return False + if count > 3: + f.seek(fpos) + return True + f.seek(fpos) + return False + +def autoreader(f): + """ + Auto-detect matrix format of HiC data file. + + :param f: an iterable (typically an open file). + + :returns: An iterator to be converted in dictionary, matrix size, raw_names + as list of tuples (chr, pos), dictionary of masked bins, and boolean + reporter of symetric transformation + """ + masked = __read_file_header(f)[0] # TODO rest of it not used here + + # Skip initial comment lines and read in the whole file + # as a list of lists. + line = next(f) + items = [line.split()] + [line.split() for line in f] + + # Count the number of elements per line after the first. + # Wrapping in a set is a trick to make sure that every line + # has the same number of elements. + S = set([len(line) for line in items[1:]]) + ncol = S.pop() + # If the set 'S' is not empty, at least two lines have a + # different number of items. + if S: + raise AutoReadFail('ERROR: unequal column number') + + # free little memory + del(S) + + nrow = len(items) + # Auto-detect the format, there are only 4 cases. + if ncol == nrow: + try: + _ = [float(item) for item in items[0] + if not item.lower() in ['na', 'nan']] + # Case 1: pure number matrix. + header = False + trim = 0 + except ValueError: + # Case 2: matrix with row and column names. + header = True + trim = 1 + warn('WARNING: found header') + else: + if len(items[0]) == len(items[1]): + # Case 3: matrix with row information. + header = False + trim = ncol - nrow + # warn('WARNING: found %d colum(s) of row names' % trim) + else: + # Case 4: matrix with header and row information. + header = True + trim = ncol - nrow + 1 + warn('WARNING: found header and %d colum(s) of row names' % trim) + # Remove header line if needed. + if header and not trim: + header = items.pop(0) + nrow -= 1 + elif not trim: + header = list(range(1, nrow + 1)) + elif not header: + header = [tuple([a for a in line[:trim]]) for line in items] + else: + del(items[0]) + nrow -= 1 + header = [tuple([a for a in line[:trim]]) for line in items] + # Get the numeric values and remove extra columns + num = int if HIC_DATA else float + try: + items = [[num(a) for a in line[trim:]] for line in items] + except ValueError: + if not HIC_DATA: + raise AutoReadFail('ERROR: non numeric values') + try: + # Dekker data 2009, uses integer but puts a comma... + items = [[int(float(a)+.5) for a in line[trim:]] for line in items] + warn('WARNING: non integer values') + except ValueError: + try: + # Some data may contain 'NaN' or 'NA' + items = [ + [0 if a.lower() in ['na', 'nan'] + else int(float(a)+.5) for a in line[trim:]] + for line in items] + warn('WARNING: NA or NaN founds, set to zero') + except ValueError: + raise AutoReadFail('ERROR: non numeric values') + + # Check that the matrix is square. + ncol -= trim + if ncol != nrow: + raise AutoReadFail('ERROR: non square matrix') + + symmetricized = False + if is_asymmetric(items): + warn('WARNING: matrix not symmetric: summing cell_ij with cell_ji') + symmetrize(items) + symmetricized = True + return (((i + j * ncol, a) for i, line in enumerate(items) + for j, a in enumerate(line) if a), + ncol, header, masked, symmetricized) + + +def _header_to_section(header, resolution): + """ + converts row-names of the form 'chr12\t1000-2000' into sections, suitable + to create HiC_data objects. Also creates chromosomes, from the reads + """ + sections = {} + chromosomes = None + if (isinstance(header, list) + and isinstance(header[0], tuple) + and len(header[0]) > 1): + chromosomes = OrderedDict() + for i, h in enumerate(header): + if '-' in h[1]: + a, b = list(map(int, h[1].split('-'))) + if resolution==1: + resolution = abs(b - a) + 1 + elif resolution != abs(b - a) + 1: + raise Exception('ERROR: found different resolution, ' + + 'check headers') + else: + a = int(h[1]) + if resolution==1 and i: + resolution = abs(a - b) + 1 + elif resolution == 1: + b = a + sections[(h[0], a // resolution)] = i + chromosomes.setdefault(h[0], 0) + chromosomes[h[0]] += 1 + return chromosomes, sections, resolution + + +def read_matrix(things, parser=None, hic=True, resolution=1, size=None, + **kwargs): + """ + Read and checks a matrix from a file (using + :func:`taddyn.utils.hic_parser.autoreader`) or a list. + + :param things: might be either a file name, a file handler or a list of + list (all with same length) + :param None parser: a parser function that returns a tuple of lists + representing the data matrix, + with this file example.tsv: + :: + + chrT_001 chrT_002 chrT_003 chrT_004 + chrT_001 629 164 88 105 + chrT_002 86 612 175 110 + chrT_003 159 216 437 105 + chrT_004 100 111 146 278 + + the output of parser('example.tsv') might be: + ``([629, 86, 159, 100, 164, 612, 216, 111, 88, 175, 437, 146, 105, 110, + 105, 278])`` + + :param 1 resolution: resolution of the matrix + :param True hic: if False, assumes that files contains normalized data + :param None size: size of the square matrix, needed if we read a dictionary + :returns: the corresponding matrix concatenated into a huge list, also + returns number or rows + + """ + global HIC_DATA + HIC_DATA = hic + if not isinstance(things, list): + things = [things] + matrices = [] + for thing in things: + if isinstance(thing, dict): + HiC_data = {'matrix':thing, 'size': size, 'masked':{}} + matrices.append(HiC_data) + elif isinstance(thing, file_types): + parser = parser or (abc_reader if __is_abc(thing) else autoreader) + matrix, size, header, masked, sym = parser(thing) + thing.close() + _, _, resolution = _header_to_section(header,resolution) + matrix = dict((pos, val) for pos, val in matrix) + HiC_data = {'matrix':matrix, 'size': size, 'masked':masked} + matrices.append(HiC_data) + elif isinstance(thing, basestring): + try: + with open(thing) as f_thing: + parser = parser or (abc_reader if __is_abc(f_thing) else autoreader) + matrix, size, header, masked, sym = parser(f_thing) + except IOError: + if len(thing.split('\n')) > 1: + parser = parser or (abc_reader if __is_abc(thing.split('\n')) else autoreader) + matrix, size, header, masked, sym = parser(thing.split('\n')) + else: + raise IOError('\n ERROR: file %s not found\n' % thing) + _, _, resolution = _header_to_section(header, resolution) + matrix = dict((pos, val) for pos, val in matrix) + HiC_data = {'matrix':matrix, 'size': size, 'masked':masked} + matrices.append(HiC_data) + elif isinstance(thing, list): + if all([len(thing)==len(l) for l in thing]): + size = len(thing) + matrix = dict((i + j * size, v) for i, l in enumerate(thing) + for j, v in enumerate(l) if v) + else: + raise Exception('must be list of lists, all with same length.') + HiC_data = {'matrix':matrix, 'size': size, 'masked':{}} + matrices.append(HiC_data) + elif isinstance(thing, tuple): + # case we know what we are doing and passing directly list of tuples + matrix = thing + siz = sqrt(len(thing)) + if int(siz) != siz: + raise AttributeError('ERROR: matrix should be square.\n') + size = int(siz) + matrix = dict((pos, val) for pos, val in matrix) + HiC_data = {'matrix':matrix, 'size': size, 'masked':{}} + matrices.append(HiC_data) + elif isinstance(thing, (np.ndarray, np.generic) ): + try: + row, col = thing.shape + if row != col: + raise Exception('matrix needs to be square.') + sqrt_matrix = thing.reshape(-1).tolist()[0] + size = row + matrix = dict((i + j * size, v) for i, l in enumerate(sqrt_matrix) + for j, v in enumerate(l) if v) + except Exception as exc: + print('Error found:', exc) + HiC_data = {'matrix':matrix, 'size': size, 'masked':{}} + matrices.append(HiC_data) + else: + raise Exception('Unable to read this file or whatever it is :)') + return matrices diff --git a/tadphys/utils/maths.py b/tadphys/utils/maths.py new file mode 100644 index 0000000..b204501 --- /dev/null +++ b/tadphys/utils/maths.py @@ -0,0 +1,88 @@ +from math import log10 +import numpy as np + +def transform(val): + with np.errstate(divide='ignore'): + return np.log10(val) + + +def nozero_log(values): + # Set the virtual minimum of the matrix to half the non-null real minimum + minv = float(min([v for v in list(values.values()) if v])) / 2 + # if minv > 1: + # warn('WARNING: probable problem with normalization, check.\n') + # minv /= 2 # TODO: something better + logminv = transform(minv) + for i in values: + try: + values[i] = transform(values[i]) + except ValueError: + values[i] = logminv + + +def nozero_log_list(values): + # Set the virtual minimum of the matrix to half the non-null real minimum + try: + if not np.isfinite(transform(0)): + raise Exception() + minv = 0. + except: + try: + minv = float(min([v for v in values if v])) / 2 + except ValueError: + minv = 1 + # if minv > 1: + # warn('WARNING: probable problem with normalization, check.\n') + # minv /= 2 # TODO: something better + logminv = transform(minv) + return [transform(v) if v else logminv for v in values] + + +def nozero_log_matrix(values, transformation): + # Set the virtual minimum of the matrix to half the non-null real minimum + try: + if not np.isfinite(transform(0)): + raise Exception() + minv = 0. + except: + try: + minv = float(min([v for l in values for v in l + if v and not np.isnan(v)])) / 2 + except ValueError: + minv = 1 + logminv = transformation(minv) + return [[transformation(v) if v else logminv for v in l] for l in values] + + +def zscore(values): + """ + Calculates the log10, Z-score of a given list of values. + + .. note:: + + _______________________/___ + / + / + / + / + / + / + / + / + / + / + / + / + / score + ___/_________________________________ + / + + """ + # get the log trasnform values + nozero_log(values) + mean_v = np.mean(list(values.values())) + std_v = np.std (list(values.values())) + # replace values by z-score + for i in values: + values[i] = (values[i] - mean_v) / std_v + diff --git a/tadphys/utils/modelAnalysis.py b/tadphys/utils/modelAnalysis.py new file mode 100644 index 0000000..375f73c --- /dev/null +++ b/tadphys/utils/modelAnalysis.py @@ -0,0 +1,195 @@ +from taddyn.squared_distance_matrix import squared_distance_matrix_calculation_wrapper +from scipy.stats import spearmanr, pearsonr, chisquare +from taddyn.utils.tadmaths import calinski_harabasz, nozero_log_list +from itertools import combinations +from pickle import load, dump, HIGHEST_PROTOCOL + + +def get_contact_matrix(tdm, + stage=None, cutoff=None, + show_bad_columns=True): + """ + Returns a matrix with the number of interactions observed below a given + cutoff distance. + + :param tdm: Dictionary with TADdyn output model info + :param None stage: compute the contact matrix only for the models in + stage number 'stage' + :param None cutoff: distance cutoff (nm) to define whether two particles + are in contact or not, default is 2 times resolution, times scale. + Cutoff can also be a list of values, in wich case the returned object + will be a dictionnary of matrices (keys being square cutoffs) + :param True show_bad_columns: show bad columns in contact map + + :returns: matrix frequency of interaction + """ + + if stage > -1 and stage in tdm['stages']: + models = [m for m in tdm['stages'][stage]] + else: + models = tdm['models'].keys() + if not cutoff: + cutoff = [int(2 * tdm['resolution'] * tdm['config']['scale'])] + #cutoff = [int(2)] # * tdm.resolution * tdm.config['scale'])] + cutoff_list = True + if not isinstance(cutoff, list): + cutoff = [cutoff] + cutoff_list = False + cutoff.sort(reverse=True) + cutoff = [c**2 for c in cutoff] + matrix = dict([(c, [[0. for _ in xrange(tdm['loci'])] + for _ in xrange(tdm['loci'])]) for c in cutoff]) + # remove (or not) interactions from bad columns + if show_bad_columns: + wloci = [i for i in xrange(tdm['loci']) if tdm['zeros'][0][i]] + else: + wloci = [i for i in xrange(tdm['loci'])] + models = [tdm['models'][mdl] for mdl in tdm['models']] + + frac = 1.0 / len(models) + #print "#Frac",frac + + all_matrix = [] + for model in models: + #print model + squared_distance_matrix = squared_distance_matrix_calculation_wrapper( + model['x'], model['y'], model['z'], tdm['loci']) + #print model, len(x), len(y), len(z) + for c in cutoff: + #print "#Cutoff",c + for i, j in combinations(wloci, 2): + if squared_distance_matrix[i][j] <= c: + matrix[c][i][j] += frac # * 100 + matrix[c][j][i] += frac # * 100 + + if cutoff_list: + return matrix + return matrix.values()[0] + + +def correlate_with_real_data(tdm, models=None, cluster=None, + stage=None, index=0, + dynamics=False, cutoff=None, + off_diag=1, plot=False, axe=None, savefig=None, + corr='spearman', midplot='hexbin', + log_corr=True, contact_matrix=None, + cmap='viridis', show_bad_columns=True): + """ + Plots the result of a correlation between a given group of models and + original Hi-C data. + + :param tdm: Dictionary with TADdyn output model info + :param None models: if None (default) the correlation will be computed + using all the models. A list of numbers corresponding to a given set + of models can be passed + :param None cluster: compute the correlation only for the models in the + cluster number 'cluster' + :param None dynamics: compute the correlation for all the stages + :param None cutoff: distance cutoff (nm) to define whether two particles + are in contact or not, default is 2 times resolution, times scale. + :param None savefig: path to a file where to save the image generated; + if None, the image will be shown using matplotlib GUI (the extension + of the file name will determine the desired format). + :param False plot: to display the plot + :param True log_corr: log plot for correlation + :param None axe: a matplotlib.axes.Axes object to define the plot + appearance + :param None contact_matrix: input a contact matrix instead of computing + it from the models + :param 'viridis' cmap: The Colormap instance + :param True show_bad_columns: Wether to hide or not bad columns in the + contact map + + :returns: correlation coefficient rho, between the two + matrices. A rho value greater than 0.7 indicates a very good + correlation + """ + if dynamics: + if not savefig: + raise Exception('ERROR: dynamics should only be called ' + + 'with savefig option.\n') + return + if not isdir(savefig): + raise Exception('ERROR: savefig should ' + + 'be a folder with dynamics option.\n') + return + elif stage is not None and stage not in tdm['stages']: + raise Exception('ERROR: stage ' + + 'not found in stages.\n') + return + if not cutoff: + cutoff = int(2 * tdm['resolution'] * tdm['config']['scale']) + if contact_matrix: + all_original_data = [0] + all_model_matrix = [contact_matrix] + else: + if dynamics: + all_model_matrix = [] + all_original_data = [] + for st in range(0,int((len(tdm['stages'])-1)/tdm['models_per_step'])+1): + all_original_data.append(st) + all_model_matrix.append(get_contact_matrix(tdm, stage=int(st*tdm['models_per_step']), cutoff=cutoff, show_bad_columns=show_bad_columns)) + elif stage is not None: + all_original_data = [index] + all_model_matrix = [get_contact_matrix(tdm, stage=stage,cutoff=cutoff)] + else: + all_original_data = [index] + all_model_matrix = [get_contact_matrix(tdm, models=models, cluster=cluster, + cutoff=cutoff, show_bad_columns=show_bad_columns)] + correl = {} + for model_matrix, od in zip(all_model_matrix,all_original_data): + oridata = [] + moddata = [] + if len(model_matrix) == 0: + correl[od] = 'Nan' + continue + if dynamics: + original_data = tdm['original_data'][od] + elif stage is not None or len(tdm['stages']) > 0: + original_data = tdm['original_data'][od] + else: + original_data = tdm['original_data'] + for i in xrange(len(original_data)): + for j in xrange(i + off_diag, len(original_data)): + if not original_data[i][j] > 0: + continue + oridata.append(original_data[i][j]) + moddata.append(model_matrix[i][j]) + if corr == 'spearman': + correl[od] = spearmanr(moddata, oridata) + elif corr == 'pearson': + correl[od] = pearsonr(moddata, oridata) + elif corr == 'logpearson': + correl[od] = pearsonr(nozero_log_list(moddata), nozero_log_list(oridata)) + elif corr == 'chi2': + tmpcorr = chisquare(array(moddata), array(oridata)) + tmpcorr = 1. / tmpcorr[0], tmpcorr[1] + correl[od] = tmpcorr + else: + raise NotImplementedError('ERROR: %s not implemented, must be one ' + + 'of spearman, pearson or frobenius\n') + if len(correl) < 2: + return correl[next(iter(correl))] + return correl + + +def save_models(models, outfile, minimal=(), convertToDict=True): + """ + Saves all the models in pickle format (python object written to disk). + :param path_f: path where to save the pickle file + :param () minimal: list of items to exclude from save. Options: + - 'restraints': used for modeling common to all models + - 'zscores': used generate restraints common to all models + - 'original_data': used generate Z-scores common to all models + - 'log_objfun': generated during modeling model specific + :param True convertToDict: Convert LAMMPSmodel object to dictionary + of dictionaries. Needed to convert to TADbit format without installing + TADdyn + """ + + if convertToDict == True: + models['models'] = dict((mod, dict(models['models'][mod])) + for mod in models['models']) + out = open(outfile, 'wb') + dump(models, out, HIGHEST_PROTOCOL) + out.close() \ No newline at end of file diff --git a/tadphys/utils/tadmaths.py b/tadphys/utils/tadmaths.py new file mode 100644 index 0000000..714ccc5 --- /dev/null +++ b/tadphys/utils/tadmaths.py @@ -0,0 +1,230 @@ +""" +06 Aug 2013 + + +""" + +from bisect import bisect_left +from itertools import combinations +from math import log10, exp +from warnings import warn +import numpy as np + + +def mad(arr): + """ Median Absolute Deviation: a "Robust" version of standard deviation. + Indices variability of the sample. + https://en.wikipedia.org/wiki/Median_absolute_deviation + """ + if not isinstance(arr, np.ndarray): + arr = np.array(arr) + arr = np.ma.array(arr).compressed() # should be faster to not use masked arrays. + med = np.median(arr) + return np.median(np.abs(arr - med)) + +def right_double_mad(arr): + """ Double Median Absolute Deviation: a 'Robust' version of standard deviation. + Indices variability of the sample. + http://eurekastatistics.com/using-the-median-absolute-deviation-to-find-outliers + """ + if not isinstance(arr, np.ndarray): + arr = np.array(arr) + arr = np.ma.array(arr).compressed() # should be faster to not use masked arrays. + med = np.median(arr) + right_mad = np.median(np.abs(arr[arr > med] - med)) + return right_mad + +def newton_raphson (guess, contour, sq_length, jmax=2000, xacc=1e-12): + """ + Newton-Raphson method as defined in: + http://www.maths.tcd.ie/~ryan/TeachingArchive/161/teaching/newton-raphson.c.html + used to search for the persistence length of a given model. + + :param guess: starting value + :param contour: of the model + :param sq_length: square of the distance between first and last particle + :param 100 jmax: number of tries + :param 1e-12 xacc: precision of the optimization + + :returns: persistence length + """ + for _ in xrange(1, jmax): + contour_guess = contour / guess + expcx = exp(-contour_guess) - 1 + # function + fx = 2 * pow(guess, 2) * (contour_guess + expcx) - sq_length + # derivative + df = 2 * contour * expcx + 4 * guess * (expcx + contour_guess) + + dx = -fx / df + if abs(dx) < xacc: + # print ("found root after %d attempts, at %f\n" % (j, x)) + return guess + guess += dx + raise Exception("ERROR: exceeded max tries no root\n") + + +class Interpolate(object): + """ + Simple linear interpolation, to be used when the one from scipy is not + available. + """ + def __init__(self, x_list, y_list): + for i, (x, y) in enumerate(zip(x_list, x_list[1:])): + if y - x < 0: + raise ValueError("x must be in strictly ascending") + if y - x == 0 and i >= len(x_list)-2: + x_list = x_list[:-1] + y_list = y_list[:-1] + if any(y - x <= 0 for x, y in zip(x_list, x_list[1:])): + raise ValueError("x must be in strictly ascending") + x_list = self.x_list = map(float, x_list) + y_list = self.y_list = map(float, y_list) + intervals = zip(x_list, x_list[1:], y_list, y_list[1:]) + self.slopes = [(y2 - y1)/(x2 - x1) for x1, x2, y1, y2 in intervals] + + def __call__(self, x): + i = bisect_left(self.x_list, x) - 1 + return self.y_list[i] + self.slopes[i] * (x - self.x_list[i]) + + +def transform(val): + return log10(val) + +def nozero_log(values): + # Set the virtual minimum of the matrix to half the non-null real minimum + minv = float(min([v for v in values.values() if v])) / 2 + # if minv > 1: + # warn('WARNING: probable problem with normalization, check.\n') + # minv /= 2 # TODO: something better + logminv = transform(minv) + for i in values: + try: + values[i] = transform(values[i]) + except ValueError: + values[i] = logminv + +def nozero_log_list(values): + # Set the virtual minimum of the matrix to half the non-null real minimum + try: + transform(0) + minv = 0. + except: + try: + minv = float(min([v for v in values if v])) / 2 + except ValueError: + minv = 1 + # if minv > 1: + # warn('WARNING: probable problem with normalization, check.\n') + # minv /= 2 # TODO: something better + logminv = transform(minv) + return [transform(v) if v else logminv for v in values] + +def nozero_log_matrix(values, transformation): + # Set the virtual minimum of the matrix to half the non-null real minimum + try: + transform(0) + minv = 0. + except: + try: + minv = float(min([v for l in values for v in l + if v and not np.isnan(v)])) / 2 + except ValueError: + minv = 1 + logminv = transformation(minv) + return [[transformation(v) if v else logminv for v in l] for l in values] + + +def zscore(values): + """ + Calculates the log10, Z-score of a given list of values. + + .. note:: + + _______________________/___ + / + / + / + / + / + / + / + / + / + / + / + / + / score + ___/_________________________________ + / + + """ + # get the log trasnform values + nozero_log(values) + mean_v = np.mean(values.values()) + std_v = np.std (values.values()) + # replace values by z-score + for i in values: + values[i] = (values[i] - mean_v) / std_v + + +def calinski_harabasz(scores, clusters): + """ + Implementation of the CH score [CalinskiHarabasz1974]_, that has shown to be + one the most accurate way to compare clustering methods + [MilliganCooper1985]_ [Tibshirani2001]_. + + The CH score is: + + .. math:: + + CH(k) = \\frac{B(k) / (k-1)}{W(k)/(n - k)} + + Where :math:`B(k)` and :math:`W(k)` are the between and within cluster sums + of squares, with :math:`k` clusters, and :math:`n` the total number of + elements (models in this case). + + :param scores: a dict with, as keys, a tuple with a pair of models; and, as + value, the distance between these models. + :param clusters: a dict with, as key, the cluster number, and as value a + list of models + :param nmodels: total number of models + + :returns: the CH score + """ + cluster_list = [c for c in clusters if len(clusters[c]) > 1] + if len(cluster_list) <= 1: + return 0.0 + nmodels = sum([len(clusters[c]) for c in cluster_list]) + + between_cluster = (sum([sum([sum([scores[(md1, md2)]**2 + for md1 in clusters[cl1]]) + for md2 in clusters[cl2]]) + / (len(clusters[cl1]) * len(clusters[cl2])) + for cl1, cl2 in combinations(cluster_list, 2)]) + / ((len(cluster_list) - 1.0) / 2)) + + within_cluster = (sum([sum([scores[(md1, md2)]**2 + for md1, md2 in combinations(clusters[cls], 2)]) + / (len(clusters[cls]) * (len(clusters[cls]) - 1.0) / 2) + for cls in cluster_list])) + + return ((between_cluster / (len(cluster_list) - 1)) + / + (within_cluster / (nmodels - len(cluster_list)))) + + + +def mean_none(values): + """ + Calculates the mean of a list of values without taking into account the None + + :param values: list of values + + :returns: the mean value + """ + values = [i for i in values if i !=None] + if values: + return float(sum(values)) / len(values) + else: + return None diff --git a/test/compartmentalization.py b/test/compartmentalization.py new file mode 100644 index 0000000..d2612d3 --- /dev/null +++ b/test/compartmentalization.py @@ -0,0 +1,47 @@ +#awk -v nc=3 'BEGIN{print (10143*3000/(30*30*30)/0.00441745*nc)^(1/3); print nc*10143}' + +from tadphys.modelling.lammps_modelling import run_lammps + +# From 52795 to 58989 both included +#nparticles = int(90702639/1000) +chrlength=20000000 +nparticles = int(chrlength/1000) +nchrs = 1 +chromosome_particle_numbers=[nparticles]*nchrs +print(chrlength,nparticles, nchrs, chromosome_particle_numbers) + +density=0.015 +side = (nparticles*1000*nchrs/(14*14*14)/density)**(1./3.) + +print("%d Chromosomes of length %d in a cube of side %s" % (nchrs, nparticles, side)) + +epsilon = XXXepsilonXXX +compartmentalization = { + 'partition' : { 1 : [( 1,1000,1),(2001,3000,1),(4001,5000,1),(6001,7000,1),(8001,9000,1),(10001,11000,1),(12001,13000,1),(14001,15000,1),(16001,17000,1),(18001,19000,1)], + 2 : [(1001,2000,1),(3001,4000,1),(5001,6000,1),(7001,8000,1),(9001,10000,1),(11001,12000,1),(13001,14000,1),(15001,16000,1),(17001,18000,1),(19001,2000,1)]}, + 'radii' : { 1 : 0.5, + 2 : 0.5}, + 'interactions' : {(1,1):["attraction",float(epsilon)], + (2,2):["attraction",float(epsilon)], + (1,2):["repulsion" ,1.0]}, + 'runtime' : 1000000, +} + +r = 1 + +#At the new coarse-graining, 14nm~1kb: What should be the size of a single bead? +for replica in range(r, r+1,1): + initial_conformation = "../../0_generate_initial_conformation/Initial_rosette_conformation_with_pbc_replica_1.dat" + + run_lammps(initial_conformation=initial_conformation, + minimize = True, + tethering = False, + compartmentalization = compartmentalization, + kseed = int(replica), + to_dump = 10000, + pbc=True, + run_time = 0, + lammps_folder = "./", + chromosome_particle_numbers = [20000], + confining_environment = ['cube', 80.618] + ) diff --git a/test/compartmentalization.sh b/test/compartmentalization.sh new file mode 100644 index 0000000..d9b078a --- /dev/null +++ b/test/compartmentalization.sh @@ -0,0 +1,12 @@ +for epsilon in $(seq 0.0 0.1 1.0); +do + + mkdir -p epsilon_${epsilon}kBT + cd epsilon_${epsilon}kBT + pwd + + sed "s/XXXepsilonXXX/${epsilon}/g" ../compartmentalization.py | python > output_${epsilon}kBT.log & + + cd .. + +done From f89fd70372ce0579b387a41c3ee33b2aee022133 Mon Sep 17 00:00:00 2001 From: MarcoDiS Date: Wed, 20 Jan 2021 09:47:47 +0100 Subject: [PATCH 5/9] Creation of TADphys --- test/loop_extrusion.py | 77 ++++++++++++++++++++++++++++++++++++++++++ test/loop_extrusion.sh | 29 ++++++++++++++++ test/relaxation.py | 52 ++++++++++++++++++++++++++++ test/relaxation.sh | 13 +++++++ 4 files changed, 171 insertions(+) create mode 100644 test/loop_extrusion.py create mode 100644 test/loop_extrusion.sh create mode 100644 test/relaxation.py create mode 100644 test/relaxation.sh diff --git a/test/loop_extrusion.py b/test/loop_extrusion.py new file mode 100644 index 0000000..55905f0 --- /dev/null +++ b/test/loop_extrusion.py @@ -0,0 +1,77 @@ +#awk -v nc=3 'BEGIN{print (10143*3000/(30*30*30)/0.00441745*nc)^(1/3); print nc*10143}' + +from tadphys.modelling.lammps_modelling import run_lammps + +# From 52795 to 58989 both included +#nparticles = int(90702639/1000) +chrlength=20000000 +nparticles = int(chrlength/1000) +nchrs = 1 +chromosome_particle_numbers=[nparticles]*nchrs +print(chrlength,nparticles, nchrs, chromosome_particle_numbers) + +density=0.015 +side = (nparticles*1000*nchrs/(14*14*14)/density)**(1./3.) + +print("%d Chromosomes of length %d in a cube of side %s" % (nchrs, nparticles, side)) + +#loop_extrusion_dynamics = { 'separation' : 1000000/2700000*1000, + # in kb: typical separation between extruding factors. From DOI:https://doi.org/10.7554/eLife.40164 + #For cohesin, we previously estimated the fraction of cohesin complexes that are relatively stably + #associated with chromatin (~20–25 min residence time in mESC G1) and thus presumably topologi- + #cally engaged to be ~40% in G1 (Hansen et al., 2017). If we take this as the upper bound of puta- + #tively ‘loop-extruding’ cohesin complexes, we can similarly calculate the upper limit on the density + #of extruding cohesin molecules as ~5.3 per Mb assuming cohesin exists as a monomeric ring or ~2.7 + #per Mb if cohesin forms dimers (Figure 1G; full details on calculation in Materials and methods). This + #corresponds to a genomic distance between extruding cohesins of ~186–372 kb in mESCs, which + #approximately matches computational estimates (Fudenberg et al., 2016; Gassler et al., 2017). We + #envision that these numbers will be useful starting points for constraining and parameterizing models + #of 3D genome organization and we discuss some limitations of these estimates below.1 +# 'lifetime' : 600, + # in kb: segment extruded before detouching from the fiber. From DOI:https://doi.org/10.7554/eLife.40164 + #20-25min Cohesin residence time in mESC G1 and an extrusion velocity of 1kb/s -> 20*60*1kb=1200kb in total -> 600kb because it is two-sided! +# 'right_extrusion_rate' : 1, +# 'left_extrusion_rate' : 1, +# 'extrusion_time' : 100, # in integration times <- to change for tau_LJ +# 'barriers' : XXXbarriersXXX, + # barriers position in kb along the chromatin +# 'barriers_permeability' : 0.0, + # When 0 the extruder is always blocked! +# 'chrlength' : [20000], + # chromosome lengths +# 'attraction_strength' : 300.0, +# 'equilibrium_distance' : 0.0, +# } + +loop_extrusion_dynamics = { 'separation' : 1000000/2700000*1000, + 'lifetime' : 600, + 'right_extrusion_rate' : 1, + 'left_extrusion_rate' : 1, + 'extrusion_time' : 1000, + 'barriers' : XXXbarriersXXX, + 'barriers_permeability' : 0.0, + 'chrlength' : [20000], + 'attraction_strength' : 300.0, + 'equilibrium_distance' : 1.0, + } + +r = 1 + +#At the new coarse-graining, 14nm~1kb: What should be the size of a single bead? +for replica in range(r, r+1,1): + initial_conformation = "../../0_generate_initial_conformation/Initial_rosette_conformation_with_pbc_replica_1.dat" + + run_lammps(initial_conformation=initial_conformation, + minimize = True, + tethering = False, + initial_relaxation = 0, # The initial relaxation dynamics will be done after minimization and eventual compression + loop_extrusion_dynamics = loop_extrusion_dynamics, + kseed = int(replica), + to_dump = 1000, + pbc=True, + run_time = 1000000, + lammps_folder = "./", + chromosome_particle_numbers = [20000], + confining_environment = ['cube', 80.618], + hide_log = False + ) diff --git a/test/loop_extrusion.sh b/test/loop_extrusion.sh new file mode 100644 index 0000000..6109746 --- /dev/null +++ b/test/loop_extrusion.sh @@ -0,0 +1,29 @@ +chrlength=20000 + +#for nextruders in $(seq 1 10 100); +#do +for nbarriers in 1 ; # 10 20 30 40 50 60 70 80 90 100; +do + #dir=nextruders_${nextruders}_nbarriers_${nbarriers} + dir=nbarriers_${nbarriers} + + if [[ -d $dir ]]; + then + continue + fi + + echo $nbarriers + + barriers=$(awk -v cl=$chrlength -v nb=${nbarriers} 'BEGIN{printf("["); db=int(cl/(nb)); for(i=db/2;i0) printf("%d,", int(i)); printf("%d]",cl-db/2)}') + echo $barriers + + mkdir -p ${dir} + cd $dir + pwd + + sed -e "s/XXXnextrudersXXX/${nextruders}/g" -e "s/XXXbarriersXXX/${barriers}/g" ../loop_extrusion.py > loop_extrusion_${nbarriers}.py + python loop_extrusion_${nbarriers}.py > output_nbarriers_${nbarriers}.log & + cd .. + +done # Close cycle over barriers +#done # Close cycle over extruders diff --git a/test/relaxation.py b/test/relaxation.py new file mode 100644 index 0000000..08b2172 --- /dev/null +++ b/test/relaxation.py @@ -0,0 +1,52 @@ +#awk -v nc=3 'BEGIN{print (10143*3000/(30*30*30)/0.00441745*nc)^(1/3); print nc*10143}' +from os import rename + +from tadphys.modelling.lammps_modelling import run_lammps + +# From 52795 to 58989 both included +#nparticles = int(90702639/1000) +chrlength=20000000 +nparticles = int(chrlength/1000) +nchrs = 1 +chromosome_particle_numbers=[nparticles]*nchrs +print(chrlength,nparticles, nchrs, chromosome_particle_numbers) + +density=0.015 +side = (nparticles*1000*nchrs/(14*14*14)/density)**(1./3.) + + +print("%d Chromosomes of length %d in a cube of side %s" % (nchrs, nparticles, side)) + +replica = XXXreplicaXXX + +#At the new coarse-graining, 14nm~1kb: What should be the size of a single bead? +initial_conformation = "../../0_generate_initial_conformation/Initial_rosette_conformation_with_pbc_replica_%s.dat" % (replica) + +run_lammps(initial_conformation=initial_conformation, + minimize = True, + initial_relaxation = 10000000, + kseed = int(replica), + to_dump = 10000000, + pbc=True, + run_time = 0, + lammps_folder = "./", + chromosome_particle_numbers = [20000], + confining_environment = ['cube', 80.618], + hide_log=False + ) + +rename('relaxed_conformation.txt','relaxed_conformation_part1.txt') +rename('initial_relaxation_10000000.txt','initial_relaxation_10000000_part1.txt') + +run_lammps(initial_conformation="relaxed_conformation_part1.txt", + minimize = False, + initial_relaxation = 100000000, + kseed = int(replica), + to_dump = 1000, + pbc=True, + run_time = 0, + lammps_folder = "./", + chromosome_particle_numbers = [20000], + confining_environment = ['cube', 80.618], + hide_log=False + ) diff --git a/test/relaxation.sh b/test/relaxation.sh new file mode 100644 index 0000000..8c97316 --- /dev/null +++ b/test/relaxation.sh @@ -0,0 +1,13 @@ +# 0 - Relaxation run of 10MLN steps to try obliterating the initial rosettes; +# 1 - Relaxation run of 100MLN steps saving every 1000 steps. + +for replica in $(seq 2 1 2); +do + replicadir=replica_${replica} + mkdir -p ${replicadir} + cd ${replicadir} + sed -e "s/XXXreplicaXXX/${replica}/g" ../relaxation.py > relaxation_replica_${replica}.py + mpirun -np 16 python relaxation_replica_${replica}.py > output_replica_${replica}.log & + cd .. +done # Close cycle over replica + From 69fac6334822503bc777853542eab75b7209cad8 Mon Sep 17 00:00:00 2001 From: MarcoDiS Date: Wed, 20 Jan 2021 10:07:21 +0100 Subject: [PATCH 6/9] README update --- README.rst | 40 +++++++++++++--------------------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/README.rst b/README.rst index 892c8bd..3326aa7 100644 --- a/README.rst +++ b/README.rst @@ -16,22 +16,11 @@ Documentation | 1 - Download lammps | git clone -b stable https://github.com/lammps/lammps.git mylammps - | 2 - Download the colvar modified version - | git clone https://github.com/david-castillo/colvars - - | 3 - Update the user-defined colvars library - | ./colvars/update-colvars-code.sh ./mylammps/ - - | 4 - Compile colvars library - | cd ./mylammps/lib/colvars - | make -f Makefile.g++ - - | 5 - Install lammps as a shared library + | 2 - Install lammps as a shared library | cd ../../src/ - | include "-DLAMMPS_EXCEPTIONS" in the LMP_INC line in src/MAKE/Makefile.serial - | make yes-user-colvars + | include "-DLAMMPS_EXCEPTIONS" in the LMP_INC line in src/MAKE/Makefile.mpi | make yes-molecule - | make serial mode=shlib + | make mpi mode=shlib | make install-python | cd ../../ @@ -40,35 +29,32 @@ Documentation | conda install -y scipy # scientific computing in python | conda install -y numpy # scientific computing in python | conda install -y matplotlib # to produce plots - | conda install -y jupyter # this notebook :) | conda install -y -c https://conda.anaconda.org/bcbio pysam # to deal with SAM/BAM files - | conda install -y -c https://conda.anaconda.org/salilab imp # for 3D modeling - | conda install -y -c bioconda mcl # for clustering -**Install TADdyn** - | 1 - Download TADdyn from the Github repository - | git clone https://github.com/david-castillo/TADbit.git -b TADdyn TADdyn +**Install TADphys** + | 1 - Download TADphys from the Github repository + | git clone https://github.com/MarcoDiS/TADphys.git -b TADphys TADphys - | 2 - Install TADdyn - | cd TADdyn + | 2 - Install TADphys + | cd TADphys | python setup.py install | cd .. **Try TADdyn** - | cd test/Sox2 - | python test_TADdyn_on_Sox2.py + | cd test/ + | python test_TADphys.py Citation ******** -Please, cite this article if you use TADdyn. +Please, cite this article if you use TADphys. Marco Di Stefano, Ralph Stadhouders, Irene Farabella, David Castillo, François Serra, Thomas Graf, Marc A. Marti-Renom. **Dynamic simulations of transcriptional control during cell reprogramming reveal spatial chromatin caging.** *bioRxiv* 642009; `doi: https://doi.org/10.1101/642009`_ -Methods implemented in TADdyn +Methods implemented in TADphys ----------------------------- -In the actual implementation, TADdyn relies on TADbit for the preparation of the 3C-based datasets from mapping to normalization, +In the actual implementation, TADphys relies on TADbit for the models' analysis and on LAMMPS [Plimpton]_ for the implementation of the simulations. Bibliography From b9c3edb0e84a07fb41811f0eeb1eded54d21149c Mon Sep 17 00:00:00 2001 From: MarcoDiS Date: Wed, 20 Jan 2021 10:23:44 +0100 Subject: [PATCH 7/9] Start removing IMP dependency --- TADphys.egg-info/PKG-INFO | 42 +- .../tadphys/experiment.py | 26 +- dist/TADdyn-0.1-py3.6-linux-x86_64.egg | Bin 226036 -> 0 bytes dist/TADphys-0.1-py3.6-linux-x86_64.egg | Bin 228680 -> 228337 bytes setup.py | 2 +- tadphys/__init__.py~ | 72 - tadphys/chromosome.py~ | 1009 ---------- tadphys/experiment.py | 26 +- tadphys/experiment.py~ | 1749 ----------------- 9 files changed, 37 insertions(+), 2889 deletions(-) delete mode 100644 dist/TADdyn-0.1-py3.6-linux-x86_64.egg delete mode 100644 tadphys/__init__.py~ delete mode 100644 tadphys/chromosome.py~ delete mode 100644 tadphys/experiment.py~ diff --git a/TADphys.egg-info/PKG-INFO b/TADphys.egg-info/PKG-INFO index 4dde880..51910e4 100644 --- a/TADphys.egg-info/PKG-INFO +++ b/TADphys.egg-info/PKG-INFO @@ -3,7 +3,7 @@ Name: TADphys Version: 0.1 Summary: Tadphys is a Python library that allows to model and explore single or time-series 3C-based data. Home-page: UNKNOWN -Author: Marco Di Stefano, David Castillo +Author: Marco Di Stefano Author-email: marco.di.distefano.1985@gmail.com License: GPLv3 Description: @@ -24,22 +24,11 @@ Description: | 1 - Download lammps | git clone -b stable https://github.com/lammps/lammps.git mylammps - | 2 - Download the colvar modified version - | git clone https://github.com/david-castillo/colvars - - | 3 - Update the user-defined colvars library - | ./colvars/update-colvars-code.sh ./mylammps/ - - | 4 - Compile colvars library - | cd ./mylammps/lib/colvars - | make -f Makefile.g++ - - | 5 - Install lammps as a shared library + | 2 - Install lammps as a shared library | cd ../../src/ - | include "-DLAMMPS_EXCEPTIONS" in the LMP_INC line in src/MAKE/Makefile.serial - | make yes-user-colvars + | include "-DLAMMPS_EXCEPTIONS" in the LMP_INC line in src/MAKE/Makefile.mpi | make yes-molecule - | make serial mode=shlib + | make mpi mode=shlib | make install-python | cd ../../ @@ -48,35 +37,32 @@ Description: | conda install -y scipy # scientific computing in python | conda install -y numpy # scientific computing in python | conda install -y matplotlib # to produce plots - | conda install -y jupyter # this notebook :) | conda install -y -c https://conda.anaconda.org/bcbio pysam # to deal with SAM/BAM files - | conda install -y -c https://conda.anaconda.org/salilab imp # for 3D modeling - | conda install -y -c bioconda mcl # for clustering - **Install TADdyn** - | 1 - Download TADdyn from the Github repository - | git clone https://github.com/david-castillo/TADbit.git -b TADdyn TADdyn + **Install TADphys** + | 1 - Download TADphys from the Github repository + | git clone https://github.com/MarcoDiS/TADphys.git -b TADphys TADphys - | 2 - Install TADdyn - | cd TADdyn + | 2 - Install TADphys + | cd TADphys | python setup.py install | cd .. **Try TADdyn** - | cd test/Sox2 - | python test_TADdyn_on_Sox2.py + | cd test/ + | python test_TADphys.py Citation ******** - Please, cite this article if you use TADdyn. + Please, cite this article if you use TADphys. Marco Di Stefano, Ralph Stadhouders, Irene Farabella, David Castillo, François Serra, Thomas Graf, Marc A. Marti-Renom. **Dynamic simulations of transcriptional control during cell reprogramming reveal spatial chromatin caging.** *bioRxiv* 642009; `doi: https://doi.org/10.1101/642009`_ - Methods implemented in TADdyn + Methods implemented in TADphys ----------------------------- - In the actual implementation, TADdyn relies on TADbit for the preparation of the 3C-based datasets from mapping to normalization, + In the actual implementation, TADphys relies on TADbit for the models' analysis and on LAMMPS [Plimpton]_ for the implementation of the simulations. Bibliography diff --git a/build/lib.linux-x86_64-3.6/tadphys/experiment.py b/build/lib.linux-x86_64-3.6/tadphys/experiment.py index 0f81f4a..1d5307a 100644 --- a/build/lib.linux-x86_64-3.6/tadphys/experiment.py +++ b/build/lib.linux-x86_64-3.6/tadphys/experiment.py @@ -4,26 +4,22 @@ """ -from copy import deepcopy as copy -from sys import stderr -from warnings import warn -from math import isnan -from numpy import log2, array -#from tadphys import HiC_data -from tadphys.modelling.HIC_CONFIG import CONFIG -from tadphys.utils.hic_parser import read_matrix -from tadphys.utils.extraviews import nicer -from tadphys.utils.tadmaths import zscore, nozero_log_matrix -from tadphys.utils.hic_filtering import hic_filtering_for_modelling -# from tadphys.modelling.structuralmodels import StructuralModels +from copy import deepcopy as copy +from sys import stderr +from warnings import warn +from math import isnan +from numpy import log2, array +from tadphys.modelling.HIC_CONFIG import CONFIG +from tadphys.utils.hic_parser import read_matrix +from tadphys.utils.extraviews import nicer +from tadphys.utils.tadmaths import zscore, nozero_log_matrix +from tadphys.utils.hic_filtering import hic_filtering_for_modelling from collections import OrderedDict try: - from tadphys.modelling.impoptimizer import IMPoptimizer - # from tadphys.modelling.imp_modelling import generate_3d_models from tadphys.modelling.lammps_modelling import generate_lammps_models except ImportError: - stderr.write('IMP not found, check PYTHONPATH\n') + pass try: import matplotlib.pyplot as plt diff --git a/dist/TADdyn-0.1-py3.6-linux-x86_64.egg b/dist/TADdyn-0.1-py3.6-linux-x86_64.egg deleted file mode 100644 index e9d598c51b12575a83528cd71d7468855ba5ede5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226036 zcmZU(V~{98x24^-ZQHhO+qP}nw)?bg+wMMX+qS#symP;pxp%%F8C6kHD{|+q$Q3J| zN(E_P5EK9a00@8p3tA<&C!Y^XPym2cSO5UTe@{il#c3tw#N_D}r2p%tM*Y`rlMUf# zSKjd~piq{EvoYK4p20wGtJLyvDPqyKpP{{3WK%~%k$|!d?}KkBub93yK8a?nA;+da zgdok6zxVLI>(Fx;S31LZU~WsJaFI`RU-B}Ga;I!_fI+jYM#~9FtVXgHh50fzA%s-y zutobKl7Q%0iq%DVLA{`02?KtEJ@Ko$xn%C(-jAmX! zJh@HJ0)nYcpa7pvUzgwSl&f_D@Ys{(uuQcjg~h>JPD!V%a4QmIF7qXb1NBG%HJM3% ziaI=UAip+N$iljN89!Y&M@);AZe&Iongse`m1-U95gQwk^GL0>3h(ojs1u32nxWJG8JnuoHA8Y7Zmh9 zMH<&J$~44|xxxJ3j_DU}-0`&cX?)W%mKr`G`#&q6H*UJ_Z4KK=%GJkFm~%Re=n)-U z`NDv#A&DMBV2+~Wa_93mWtDeJz(3(I&8MJVaX}DBeBkg&R484No3)1Rj$0GZj|Cr5 zb0OhwkfAd-+~D>3z@Iu*G7>)wYB@IE!IL|sP^=?24nodLXSi+zp6wibd^zvR1@`Sq zUUmnQeguZ#{wu?|x``6TndCWnAVW!>i|T!OeOSACy?uE+fz1-P%N9I6-F)Qw=6*9> zn6NuN7fXbnVZ$avy(?Q_Bj-3fo$88O4;<;;f;ydaUI*}Qk>9Lm5ln=FYR${Qr)uW= zg%492KH+dyx9Hl{iy^iS6dK8~qOChh@1u1ESAxG78&p%cUafO0Jq20YB^@99+mt5` zjvOY|hj6P>W-du%Io-p22Yc~299uRchiUB{O4n~Pm)sZp-ot_jtD<`2LTQZ;qS>P6 zXmcPyTH2+PYe;d-KOuGk$pht&iv}Wj>hYrQ3=yVE5^ThUOaar5o-bj?+fgcfH<*ZN zQ&efGyjGyEh3jngdkUTl{A;yUng({wR8&_*XTc^Or8N#8et^H}qmZl2`%!#xt@?nf z!4rD(&6X!!4Y#Ori%yavOJ!3{2uC%Is|qf%6P+V#i#Ze-9Co_qMf~pAh&?V^8*;8( z&tCnz;GF2-bo*Y0G@K`8Y$HYO5?>Z(IS~tMBRMNvujtaKrbA>e;g#5A%nTU72TH|N zSevENG1NJF%tK~6Qf~ftR*Tj{f9w1$4dmMy720*JLeu;V*Sd8L<_VtihMi~5LI+R}(qZ)9p_(ysJc3Cx zB3Dz4S_62tq&5(t4o{jia2KLax092bZqJR2MEgp~dQpzi4L@S#isUMu9XApL;vQwH z=@llvr$eA+t`eX7ebo3`R!lur8`h2^`d&1S{`61+2mc-0s)mM9kyKpTp%G?t5Yg)x z$4_$$vrgDbTdveddk-lzFWI1I&fu4h;X>kX83&KvL*AXNA<`4d}g&z z`S;mY0^deZG#0{$TrGzI4}!lKjXx0SFkK}!PvwkTb0caN{BT4OrKMuk+Yjr>i@x)z z*&FFO&$h%FM*B+f`TQFsN77^Tp5C>_A3))M_;P7COE(W7001^H0Kk9T`v3T{vb?I2 zu&6Sfi-(JE(x%)H1A@rzC%r7mTM$)`f*`%so~P**sqQ}ZODTyDuU+&;iimH+5$EAT zTuaxwNoSTR;R6NHD&OPvnJbfO%}jmes0qJLudiNA`sI5m_~guHZAL04`<5{juU4p9 zYr%xys30;oJQjSpJPTMRe`Q1IE05nYQ2~%>VrVLam_q^BpZUg>pb5=8TQYGP6{+cH zUx!gqa|9r@NIdT^Mu5g)0NwKd!kx||(n4aRL&gNbDO^W+q!fdN#2DprE>*>h$o?}pp4T(E47!c7U^EV@&lI{!<$LZy~j$jAX_1B0U|AERB?Gr2GU8o#eE%THji-a1{Ywi=Dg^x3|6)SK zzolaT6T29in0VUJ3tKqZ+uA$Z+nVY-nVMVL+tE3A9%Ea^Z?->wenGJb8hEZAK9h{M zGF$*{UR~J*kYWE>_dB~lh(vkg*8`| zBD3zV`TI)DjCc+R`6;h%une7%@?)xJ}P~c|W z9Vucv;#K3UTeq61cvzmjB3P;9MRMB^`~-hzJ(Os521gH7{FHzuik;A z8U2m3Kv*kt#>_gbbL8|6W_#2Mc_N|3?TjdgZ#VF zlz6Zw>y9h=Qu7l;P^Pxb2->?1UN91vggY{jd~_1GdS8$gUzMqY4_2ZKl$uZ}RUGcN zYUJ5Pf-B)~ce!sSJSo~vHd%Bn0uqgwum|@IoZ>k{c+Za@jSxm&@7j#(A@}}Hh1a&- z`Hs|EYXr8jDc6FN`Vo_^Z#h=`vS-nadNeW6kKVFus(Wcnp_cR(x~7(Cq<3nOofLwq ztq3F;{xBU=OSOQRN}i1Qfm|5@FNhYBfq!v#SOFx(Y$KXm<1{je0sdfWgh|#Q+Cekp zhnnoEZ?{AIbzFMAS>~k1f}fq~Mu3g=PA)bv8#thMX0$$lH9qwbDjW!EwP4r6dLWwm z-jL#itQraeJp&2wo4uBL3T5Wz$j4e@n#W{Evj}7FV3A$FRw)>&h(~HSw4_-eZAPjz zk_9*9&4LaAi??_j4h)nCPyibQ^u7&nRGp<$1*A*UGGE8)apSPY?7E`rAe=HZ>bJE41k}**9`GtIQGQF1s?2y zKQc7C9nQ^sH({Lm2i6Z@DY}H>Eu>w=7?`vs&e4c!>3TIcWz#}vOUU*^d}c3xjhzqI zX@6#sIDqdB566zTpw%&W#an}yBsJZDol1cqhHuc0q5ut1_f)n`aiyg{8o}GTbMG+F zu&5ea3lgBF66k3^|3L^KW3Q!D6v1XzZZf=;%BrX;`Co zbdm4I$|$NVonHUn$IlX6`xnt9qL$x}ttX=@DzV3xi^&Vc{bYkkbhw<^{1v$X-wn<=&%5wSmP#@oQ z1jY}rd9bk*A;1GQw*E9Wiq+;q{527R3}o$mdvck$FZG3eM8aKNP<@ij;SQFS#1MQB z0qEvZSRg(jf}B@ z6^v`(9gbltO>od=0SJ2qpd?sRCacVp0Vi>!GMTvq<}$G*znDXN*yPGOLb8ETwAr=< z0xI#j!sw90-d&t@TS}miuc1uev#UISqeWb+Zk`|*-=5NjIu4!k{}S*4fSlohwZdf9 zf#r7$G_+)H4(BZ{AiV0xhy-_NtJ=wFya=Y&7ChBvy8S)_GPea$Bp}|EtN@tSWM!`LZS`ym0rP2r&KeDdlL_xHKn{OABmp zt{g6Iv($KPqs0zS_wvjOO=tvKt+^64bV&HTPA|enxztqnr1*r=uTJE ziwpQV2M^nC#JKi6+Y^WBd)i!EJJxj+*Sf?eVsLm7-`Ers8)4O$Uf}P%&Ox$1_*%Vb18!rsPX{{-Acmi zVf21ZQAGo-K|1iP&9mKzEq7;4$*k%~U3e2C`5Kz#ftW!N9KtI52w1|`Hbq+fR4!8l z7F&I@%xXK8cVw$8P`nd_{c}w%d=>e>NZaGX)XGC+Zl#*V+CK3tUIg9$-3|(`q9Os2 zIo?RtZ;fNY4J|D3&(C&JR^pL~SHuGA`ugKUidHNepuhb<|EAT|)`|xZ#s@UPfKDV@ zNaOG4r8Vxf*}}m9t;7&8SjLzo*!EHV)z-w!b7?*s&Q;d_EKlK*XYgXkidv+R0)WB& zd&z!lX2SMoEzn&|xW2elxxsdS#5Rv>$Ex#f@BwA{vqCI&GW=v_1Rs7-3#ftGKz|GI z5%P!tW)ONQL(M-8jU;txKXU(rHQBnJHZRiVYL56paoB9?T|ynwA5IMXc)y%6R%Q_x zwkleQN1w+TF+-cZfxs{y16%72MP&TTcugR|QKlp-mo%`}1{uMFyj6CV5Pj90NCza^ zcFTFKyc5q5Xv~MCD!^iu+$BaaxS2DPOVeLtGpPGSB4pPsy(0s;N!rPP^lMcXfBbcce zC@)4kXtA-tDxx(e1GBnU+b#;Kjn0g_vjE~IQy5u!J0V{487$kd+4}Bem3v@C9K1AS*-r z4G5bT++whKfNBPcOLl}_jCSzKGR=gTnu9G@Eu;Spi(NabMk^$p-UQE@7n~M&aY@E- zI0~*iYi6L!r3ZbpU>)&1f4}!@R`flLOMG>$x2!{6OcW*ZQc%xiGo_#=i;0%SIE+<2 z8?Hz@SQqH0WIZW`U?DQ>yOKcaM*A|+7G_LiTfl5k#Cp&s1%!y=11N1Y5p1Gb{HcJ+ zcnraw1Z(>G^#B?X+59<@XnNLYn)n^aB1$Y6q&LEXGrmr#as3aJO!z>7WjMxQQS`g? zE$V?+S+dt0lF7!Xg$?v7pGb3#wBvEp@w@chDmwjwb)Sxob9`E^k}pMMXXbQ$I;G;6 zAc~8DNgr%|NOe?gX^*I$f=a*iQ|Mft)+BH|g+*?sa`9wiAu}JHrcCjqfzQI3 zgK_Hkji_yqfqA4MXimox}IV}b+T5jQ8Bn&8{|vu#)n=irlPfaX;0|GmS$XjVCQKmIGzeMsx!n- zqu=fOKqi&%l^wwo5$1POJSs_z@IzH*nkpy`N|%nD#&6JA@2cVotPh1|v(sxOCM!aybNz%-m6`PElCz3u9QQVf{d;hM zDQuQOw>=d`X$85DkhZ7~)OHKm4PnGIxzZ--x0N%-_xm2!ulvFEU|?u13=(C(jDc_< zm?``L1EDDNeCR#m+LO=60M__xZ|cm|!QXz*Kk~(Wx$&il#2xs#r*A|xF=R__49Vd3 z`7Jafvj?$I0CUlIrK9KqqvR#OVu zF`|gL4NM_!)zt=9O1k4!Po1wJD;R|h6F%;e0TmOmtC?!Hh8@=aWyNhfL;xNu^h0ct zv4Do9A}b|JkO;ECkxcoXlx>@C0L2UTY=D^JlfK7t;&zcE3D>QZu(wSx37~*nVE{Ke zPbfz2?bBqOJp4S9l9V>1?dL{;rI6PH7mUEj|xyggo3g! zxk!n(qb-XZp80l^E5O);rF@$JCk2`o6V&s#-o5Y0-#44Nqf z#7r&=Pj*KYYIqB6yglWux{4q}|1r{IR5})?zx8_mUO!KyhUFQ4lc9TTZoZvvX)@AS zd&M2Stly!;>vP);_|5uc^7qRXNvT!ZpwC=qR5up2035%rW?r`y7Ubsv8{&FdvR`sj z?d#aDGy<0>Dh~- z=d(83s82p{{kHSz#@x1R#4jJH>3Xm|y4GJLHmla$8LGJ;@^JS_i{)pA(m`CC-xyvV z5REM?s7txjTekS-A;i-L|9#c%dd_-2*c-2?2jiU*E8}qbuFk!bxMragB!H?&adH3h zdE>{9%;9X?+UIMl_vfOjz-WDpO0`3@GCZ91b;rw`c+nkU3MlEi_g|`2VZI)C7()5l zizl+MhmWhQ8X8CJKY)`pi|WfbXaN(JdiZm~t_oN(6V!h&~Qp+1mIpT~PI0kL`Bj3kEPi)bB)ww$C9dPB;=SJRx2zK7=e? z_B)NHi${@1+5`J@&1uKjSe0KC6Yt|=#VbeGR!giY?=aK8r^NCV@s#x|d0sNBafFbu z-%N-IIrdwdkqzc!!IBHFA@mTp_2v_~D@}aa*;t*+ph>oc@bNnzR;&Vh^mV2Ge`(r( zC{c&%GhFgNoJI`=0D$y=DUrUurJbdVzWzTrRHL?OcgTj|`>GCu1JbCdIob-*>5v#s zkPQUL78kW8H2B2r0WDo*ini>s7Iqo2gK`5>5f;^bk*!R%t@0;qXR6-*GV zgblvJNSc9YNtYg$>E%Er@rOt;uZ$*rx(GKGJTrWuHB_J_Rjf+PrpnZkMSQd3v{M9i z=*#g30a%}S_fO89QF|GAl&A5xK@3|k*bpP3Rq7vY7B#D7ppqH_S@2-$_Rb*hcrd15 z+`%kcL_bhM+sr1cmD$v$^OW+(Sh7Bv)vl0BqYv@W6~u_#-rt{-G5nof8O>vtft(}c zK)4QdITyBdV%fE{i5yx}I$hp%$+o-%$4qN+NFuD}uD@_$_;~y?{5#)lAQc-i(-POK zdB2I-`rv{}nmD5FRjMpxxF=}Z`sNoe%XPv(Vv3qwtfuCJh90fLN-ICG8KF$>{O{sP z6R5af7CbQrct-Z?tS9f+=E{aLu7obfcG=3s@GN9LF|W06(+w`@v-NW?CH?wvegq7` zsGTYVs<8qiq#G|=;zCZopUlNiG3LPVOgL~u_R0|6%+OrHbME-%VF6Z{5kyb>M)|3@ zp;*mexryzf(5$)B zL%VdSnhPh!{P58J98E81vX? zLvun1&$}RheR}-XMO2)=XI%+{1WxgbcpuHfcVrS{zGb>P*o=yt?goTA`Wp$_;*s`Q zpF2B!-;55z)Y^iqGHeWoU$aLuUYiHd2|i0X(Wp{HDPE@8)R%hubQgGfyBt2S`dU;$ z^8~NG&ia}=9!1QNVrdpQ(R1>-pfMh0MLz8%dHq=;Kz@m}0h%9(u}kmuF9e14#2SU1 zIf_!&(!?{_)=!qt{h}P-g+YMGp^{giB6rTNCY6^qqsfXE^k^}Ndv?ChH%zO>=ms6M z&;Hxb^x%2N{y(>H@!iSRe^B;+2=Ra4!fvKc&i}=CqvPqNX{lzX=c41)>s1w)=9!n6 z6%PJ8qyFE(xP6MQni2p&ss6uyWBh->*!ced<9}vw?Q5O9Ioh&kK38|9Q9?waIIYlt z8;)%zZO!@G=|sHSc>EkbfdWp#$ebV$04NY^k^cLcC(bX&-@i}cWa~CXVJQK$UDhT4 z%IT};dv{)zpU3+v)MK?%aeCTxYHprC7~6E&x?WjpKlLGo+c9}vYw4Zpe%Yv_Hlw>x z`&b*WTS@iNYrzfHZ08nkY(P^Wt9Vt;AkZ(b``tJ7yjj`a=e2y49l3GU#$CI1@(jjz zQ#TIU@t5t^UjD-7b*^T#uh`gYHO)6MR>xIUc>B^!-~LB2e$?FD zJo_Mv%)O&G^oCuxiMFv(Pfvcyb>}(y)Hp0$8lC?aI;v8~*A%+S?739qmFG=IH(ixc zl^zLn<)0;oUOc#uh;65S(+*tPL$mhntX{sSRxynT6$z_DNfUULnyXm%PHp;B)#p2l zDsQvTa}3En!E%va@|HEssCw3bSFphnf*}g(e#||rt6L?%b^w{o;}-S)u-)FT?#s-P zC6r(yr3B-ltO@BWB;Q@848)d!ZLn|QtGZRbo$}Q=s5C*c`m3j~xA}rcR8a{XZaTFE zt3h6GU59ZQ8Q4bKF5;D5)S2e0FAu~$`xL3c63GCBf>MatWC@gyh!JBZE~pCwUibPhsm>9EnxLoOW@)xv)n zxOk3&TEh5K!vziA1kcCPmDxuNr#nuq%1&*Ex*An+O5D0b3^gRfOvxz;(BDlQkCfAP zmTnL$#?XoY{KT6Otus_XTCe_hA##vCS_f)${vlh)7~>xu>yb*HV2s?_;{8Nw{-;SY%nPLDLq@U?HHQi)5C|3`UoD*61%D@rMnr> zZH$P|b3ud$o*?=m@c$XnX3(=VuoJ>MFXgQN^-2azaO8Meov#^Q3ncky+(8dh_W~g_ zm#p@uS)uz5D#h4E2W@-*B)x;u-a<)v6?NQ;sB!{MM(l5S6-S=g$ugQ>xmf$GR+!|j9vtWP1hJ4{AF7?kYn1ay74+#Y~ zI2itZF&yVa6eOR71Twc2i&M`|CrI{}9WhWfFRttRyxF`xq4DOw;ZYUmRnu(TeLWDS zpDO~wK@d^FrJ>ND`?w!*uj}=E#&<^h)4*~Gc3EmGr~vlS&E`@px=UGM$bywrj~HH% zT0>o6K{?s@2baQ_k`;O!hh-}0DNq)W3#3x(!nMh|@}yKJneMLWGRqb6gDhf)KHC;< zSpLq<7VymAJ_;pT*3%cZy5*+Cg>RqLGH*{$^1xR-cxqYpy|z5lIeJI8D!oomMq)W2 zuO^$8LaJN=Ra?JIcx%q{Tp0InH%^L8G!!%yc}KTwNyGhtZ|}CM*6cDsA|lm{(CG=Z zYNQk<9ar0?SkG>)fZRN92c?z5(rRnYhI;`)s6vhb+_fs{G^+|ayCjkjX+OngT|EXBixZuRCnBP-$4J z4tk^=nfg$JU*W;szV8Og>Rs>)b@{``$W;6SY0j%le!Zku6n~VDFLeu#@eyLeR92@t z1?A54y?V#CeM4Uq2w_3{2^?91xB}}lEKT_jTiv!_=Khgv1(h%0NVB8T7HCPso;Ca?fhy|8h5fhNtuO2@{OXABucuUi2uFyS4$^{ruaG#g+4p&$HFtN|6% zR%UDg!0d9NihUYfqrTSoZRTM=FUBscgHU;PRcpuRH`bY>w)}GZC`!p1mS|VF8OdU= zH#Ssfm(NS&&%>6_d+_^%X3-t`-0#!GRrDO+`@@vH*=fEwXx`!wz1iLS z*c^Z6%xp1|e?jHlT@(KoqQEdHpK!khYQEpYSG<1S!~pB3U)yaa2;#!JM2riIn)^)e z#$J*ps#|hQL>5>CdqL`P@x=?Iug60W0&zo ztZS{G$8($d?#~+)n9Twiz~^}MrG`x=R|s=-4tc*~?tSYbH6XwVc&L}l4wdb35A6f& z?Q8uiy2Zpc!OR`s^Ket>ta6ybu9K!t)iDx#oIMggGF@U;4Z3a+|~8)iBJ{vI$%OvmKJm~iDdEHL3_Yy z(Zjx^qUw;d+SPB6E?1X8G9U^p7gCmsP&O!P)RqPGDW^ANr4$+fY%Gq#PIbINFVIhD z({x)997q@{g}GfW=;6LAb$CledP{OjEwLmgQ*a70sMA3yRRlk3K@5WQWKfhvbVobR z7*wNMe29s+q8`{x)0Q@X=!ltAc+?Ep(iJ)IG^AF$dGI27t&>4AG_TAQ%9}Ay0BzN+ z55#CS?UDMJ*5CSIbZ&2m3QFe*g)_&d5V8Beq-9uL)q8C_*Css)6Bt8nwHWZ|r^MT#`nITxZ_}+=dXr_qSQ#@0=b1Gh z!4mx|KmMs;R{(y*LH^W44oFAhr9g!8#f^2xmVu@Sf4lJ1mn0;PFW z)*<}({9d||Aw0G)N5n_cjL#I&0TkG5>`stCIk~Gh$s1H_wL$9!@Oowgjga`I|xXeS*)Q?Yj`k)^I@*Ia)Mu>{T)>?DOvSJVmE#t~cCA3(M&lW&+5Abj`$x;l8C%^v zzaQ5o4#g3K$uZIovl$tvioi7psBC^#SZyq1p(VR=l}j&TDY@5>x!5kOC4c^fQ}#u! z%R%NTI-X=Sy5|_B1oSHLfsIb?$`uR72Fe!RRRfXDl&%0SENyRSp`_0wAeov~rMRC1 zt&az*r-5h1d-U3K&M-yg2=aOU-icse;!ws5@44MjHR!-S_&&f_Y$k^M=qfZUe|Ge~ z78%ZMyFeSy>w`w$6_M)AG9c=xmlfg_rQU1S_n19{NuQBSob;>)lg0Gn6$C=qHdJ)dY9$D{Qn#IUeOQdnsj6=oE<-*vi_7X3CntT5%Yj z+w+e=9zv{vO(ixjbCAf8Fs&36@+Ez_v!h>TBfY135NIjq zA(Ym%Ph1E=P(+O4Nyl}8HCM9%!Z58ThG_O6sG zW_V2;o<%1X=)aL~06S*|1)HBi34qwl1f$GS(40Q8LG3||H;XL3PD#NC`n*&1ha2ry zFk{1av+l>G^ZW*Pmj`DjAG`swVEW1MnKxXpfknpE*LSK@OokV>($vq5jSd+Hd zGhb5ppzT=l%WVbA4o5)X_@9VdG)kQac3F;91e_|EBkKZgMf6TPp5yp z$;?Huw}8(gB+xf!EJh?O5w~M*1aMz-s%MmqE~%rg&Q$zYDa1^`ku}j}MBUGn2-H)q zupPi$;%nz~tay@89v9||vNh64>hDXy%b=o4*shSUM3lL6BOysT;#JHD z;FO(mAn|yB=&G?n`7&h=zn`3V;Gm8dp7n;yk@rdftu&`XZOA2*!#ZiB*pW^|XTEq6 zZIORb`b`T;eYJ2r+~hH%>eG6h35P2Zjd@zwosea7^w4_L*M?EcCXEW3)zg4tkVz>? zw9-&6jEguxtEUcdZtzgQM!JfPfsg?+DY-ZM4@RO7$l~d_FUVw6`T6YBqgeFZ7hHkZrq9K2Nz4oSh+`uBW#nMC5Xy1 zrZC!#4`jYm5#<9up^64M!;CuPho!m713g^%a4FY^Jy!Bh&!D?SF6%BZxh>1~GM6`( z#~JPiaq^c5z`z)|80Nk~=khTye(M4{(aAMrKS9{4I)`5eSwKJ7fEoO@4jLD3!cjEZ zXyX0O;s5*`q#~4dIc^c6xv{1~T!#@4xCE3oRh&@&Ip5JXcEi(6uqlF+_H;f|Z1B4@ zmfCMvLYjx70vmJ4ep6lz3*A!&e$ut5b;ES)Xjp699;5;TBDlQgq~frhO>C^rxXE)| zqXBcRl`JE7jXvxahz_*$FC%V7<}lD^8QnMt^op7oSySL!_cL*1D54q5=z3GBR<;3T zswzWXKtpYTO1Xxuw%&?(z{UcZN^Q3~$KVF59ilzhWGhHJAUu?V93{s%z#*R;zD&{u z5NvOxqgcI7i`g)(L5`@fux@Q(wh`Ga@7mVaS0A_53@#%$?S@^^Rkw35Uvb=*&Dw!! z%Zo1eroW4LTPlsTZmVa#-2ihDHw}XYaZ+Zj>dq=x7j3ABveo1Nbkuhj2pdd9XhiB} zat3NHlw~L2#|D9hC+k5~lEmW8?G&cM#<@palg_| zIIvymqdgB8@~&Aw>!E=$6m|+tjA)0GGFBqgl_}l`wWtXbkk?Oj61m+YJSng>{dV~7 zQLjsm`4IUccwW8qFw0|sW9S-5F=9di)nzpCfswj>Hvp zFt{PN?$Nsw;em6k2pIuM3ero_AN0FxbHG1az3g!)rP>?WB*<5XDA zY=o>m(DQ%rTM8;O#YJ1UjMPr9sEG>skG9V53CH!!M4@#ty$uw7Y?`4LX`O&si%IE>sp% zDRQ=3=n!8oO0T6@PtpT)t^;gVzYFUDUPn;r;LW19Ko>|0BMP)3UgqDAfHI94Z+`?AG3~JV2JHL>R->uLn8?Z~vPNI~XUJ zG4W%;!>8hharo^_2uUjnB5iI=uwYSO2LNHXoSOioIMdCTrqJir!z75efs6>k)g)** zP>#yc-Y4`WFSDqE!1j`XbqW7@7Tat?pV_GxUGJlk_F;zb1atZU-+hsUp^*U6&sL_~ zo>3qvP(ZbRX58rXDdC71oe(wl#E=R3b^aCS6Y!|p8D1u(h3>EIa9Ay^X}#qlTP-tz5v`jF zMyxoriry^ra9Enj#j#i0En3qb1d9-HwmC0xV*XJ5d?2)FU+EQix@4e6p=+NGTQ+z{ zai3IUqPWd@IuQJ-##MZEqf484lKP$Gk@+^1+pO7RT?sQdz^tQT!oM%R)3yBS^eV4& zyeD7t*>qXl3vijv?iBAJnxTo%AS)8SDxw+*FPGZs6+j)djRa>TFIN%yqLhpCZo7(U zp$EEw;P~7d9c*dE`&M9?U*s}d1Ugm40BG3CQA$(xc}r}Bo+C%4E=lOVi>Jg!DT?!n z*10s9G)9St%e=;)QTq;JLC~>|xt&8_G@Mf6SOC(jYq0%%QNmzgcOjJ`hedJ+@s`}5rPKCVTy+tRFRG~y`qL~6(-Ub|S6%wwukah6Dy-I85hjuSpjEvcFWM_6 z;Wr0}Et~ATELZ@{!3`Cf-F^bw1p4B7i%i3RaB>_(rou<}jhT#&{LBlIm7kTcSD0h; zu&gg7!#x?D*qWh*-JDmy`NYa|T&B=-!~oU=q+zlOu&$3AO2BwI;yfYv6Zc`22+}9G zK|Gf@5Lp$G3`z;vL8?GPA*cU(@~koM`J}V8g@=~Xrqw(feQv77>|r>we7`Y)En|Y9_ou&h>~0N%|wl>Jv35 z79kyMj(tk&5|8hQ4|7VamV>EWD%W2@8F=Fn!*G$?S_|_B;#13@sf)EkMCb6Rf#JXn zf~8w5EB#=>lV#LfObG+o3XbEY;o}jAgD_5d-eP`OAzl}D8d5hk^d;AZQwMDg{QXJK5daA=a@kYD?NbU6zWKmC~cU(t$Ej<~k{eMvfWCHxIN1k2pN|Knn*k zjC=ai65m9>m;tLfp>YiPyUgk+GDJ&W7#|#i-EhBp6lfjHd99x`qgxZ8{#)uA(L!H{ z+>AFB*Oa6WV?8r$(q-KQ4V(Iwn{0Z(ku}Ly$Ceq57bL_V7K>(X+g7NBHGJaxJjz!Y z7j$NiQ-R;JflFnbJCn+~_A?c=$T}fDEAa#8D*FTPwaPs(QQr9dQEFxvSMEl{XyAm% zbYp9W7<6xd-I~RMf3JnB_=yw(?a36RgIxc9=}11G~G**TL5A?RMZX?HtD-=LC5@Z%k{k8$bc zE4Now7aFvlR5QvL+G@>X)P=S^yp|%cPb{P`x?CE`G6>v-RDLkBn_3d1KiWkZ64fW{ z9|0@!!OZ7!ThIjITD2~ZONwsiwjBN3aagd{0Wvn1y?KZlU?sSZ5xA74i$ z+_tM<=_ECGPng)(0k*l`wX^5$U^ZMmiw9iV-fJ~tqAID}bs4#gpuE>l+{@S9Kd;f6 z0IcNk$XbkIQ}k8@FUb*0l#3_>z$i+LVoV1Lh@?&`BLiSo5>cs9?x)8NIn%|J*kx zf>MDc#M*5f02J+c#EA{E*5@S2YRXn2qrii^iM6s9#zw((Sj_gP&Y>mM(m%kCQSFSF zO<8V5>GpRQoO1CFYES0`l*)En((w0VbUoV&k{=3@ScR9u99)&YkrB-LNow-TC?l)T zuN18A8dR6UTY?Co^J8Sd%Z5JAXPwX5V5OFA84*;uihvd-l*G}Zi`vF~+B&OW9wr@_ zivHdYu~QivohK3rtImsMd5aUWgDP2RqI1PMsJG@U!x6-n1Oir((;qB`2AoAwW+;2c^7F)Qk@z>b6ZB5=)g$@b@HTSEQ79dhV z3feC^3Y;${PKjd^FOR8kb`9ih8*eD5%C|`#7d??F7!mb~(Ro%O*mnqqX>@&+^!l16 zd55^Les>`8Rmc9bA9{DlP7*0yv<&g7hoX3R5(fjN9z0If|F+Ld?h5NCWI&4~?y4<# zXO0&_T3a}uTjAu@*2sYbWzS?LHXr`tCTp8HL0qJ`JHNr#3n0SO$T?_?Q2YcBnnk#m zkTPYhQ;2I{eK}JHuv@}zW^->CD0JB}w--C+%S(L_s1ok5!t0^(ToYpenPgD+xJ(jm z{){6Vjl*zt6^L{YA<>#^n}2iS923vT1F0T-&J|WldO2~spNsliznmvA6Kgo<<3x%V zlOI!{U>)j&28xMa9JoF8*p)4+YqJz-i!1Gnthq_KRYzBJF+#Lo0DbypXlda*uG(q- z<)g7qqc6;K8*oYkbveQ1>$ir53_P;yUgv=pK;TAWIMH#Y5jks`C+7qL@xnc_6w|GZ z@~aS+&-(=vEQVBr%=WaoDVr5YUwDT}RX?(uD^O23Fokt`CXWTDdKTxReOl6P8WbNL zo>b=hZde7efdLx?6Z5nP);S^{d6xJ!;2JzX2qF)t^KPF8B|dTdd$Xe6-eg-Fz)G-3b?k>LSxtvEy{GX90`czz8_A#TSro(bP7A5q3VOOt_p^4{2>GJE84kP zpU{YGYi|U`ey_cIAS@1=3ZVrwbSFXx!fo7N?ZOQ3)&7nn40|-e+;SQ1eG`y;dE$%# zT^?#LXnK9yPc&)?aRv;WXCdO@<40u%OvhYP0tdbEpo9<=^#KR`Fz-VoD){ZMHS}>V z@!^NW<)QxQZTKDrJweBMB2PcyEZA2L*8C$lKo%?zRU7*iU6$-_>IiNg@?gKHK6H9# z^{3ZG1wz$Ya#$7dS5B05UoI4V%_;Zust+e>o@&YrdKpcALfn8ZNfM3N=eES<>YKRr z+}r66rN_@E%31CE8+*ofKn_~gBN#n5aCr$pRHV$EI~$*&9NxOG!^Upv^XHYufF*c= zvrOh+b7HU5XNx5Joq)mAI;u1Fv(Pz;i50M$)k|%knVG7(WI=cj!y5u(9(+t1rvW^Z zMH@EWd|87ben@7&K?_SP&#jK?333iY+sPbAdR-`fPFtsqu$lH~bAPV<0G%!jL#2SC z5qEe(W_(poZ)8k6@LKJ1J=9eU_=O>{ox<{-0?#3R`W^JdF~qt;U{4Q1DY?@cakE6@ zHmG|z3*v~s+gz>ap6TftRNFK9frdUjYWMdU!#y}!cbndUq?Uc%tyyLO0X<*R-z?unkvLrW=KO_X4PI;2aIH$MrvFAH&vC>4bldkRbX7ewWCX%Ij)I}+rwa>|i!JxZ{7KZF z?LOtd^Mh31ZAKxfM28#;qMD5L(2Fn zy`sqKckCF{Eg1x(GaULotmf@z==18?lE>#>I&IDspzN_|d7>z>(x^-3D2X;pX7(+q zo%)=ziFrmxzt8cD;1*GU!@WseeU^lYJEC_K_>92DMZq7NuwxP4CZ0cFA<0r@)w2+U z_tt}$8HHg=5F@6Aa>?37ea@I*(mv@^RPiAnb_)c3?7S>NPt*(lsddun zb4;XubQJlL3y1@Unv`_~5K}aV?4eSz-SvlIYdCC``n47dFBE%Na+s^+{IJh zcS&L5oE1VXiSUnDut52Hzs)WH0l2?M#^3yoTX?E;WGtGt&#f*7(~zPzo*jNk33M`~ z=7%@>JJaYugS-$18`O2r5oSgU|~I+-#n3GGV{V_F{g(4U4^6&m#KRhP|1VL&0n9x@ zj!c#;mQCpl7WI>y>m5iEy$pE>vJCsc#6CT=N9#UDd+Z`kV|--U8?^f%aO8;!3Ao9! zc-9g|`RBO8?B5i1S`JAfFWu(^@+=S>{VC|1#buLj(D0?Wpbi`IyYz^JF-15;MX3V$ z6~zk|;FH80pyGnxkAbK&h?{cQNj6rYc8#cWqy00H$)E8Sub!|t#ZJreyf#ev2)j6W ziv5NZj*m{F$X>J$H%Pqr%?()pDHr)m+D~X+#AW6V7~M=)anqPuS|y%kAF4Mb4nLA? zisC;1XL`TlZW(-XV~9L+pYcZbhgPIrjhH2|*&Q<3)j=`)0c$uc?!9m;B~Pb8;Fgro z4icI{w48$L^jDdsL425&a4%wv%5;Ldq-&~Yahya1IGom#rt|~n=;UnyuiqxrzchzR zP3SS}+fn*8tR~gl!~%Mx_c&na>uSHj46lw4t@b_hmCmN7rR-8o=^4N%b$eH@um5Wz6m1)nTHpZi*gVZ2;@4 zvtNHw8C#e1~m!FPR}n~!Zk_XvtC zuV3lGhXm4ZlZ}&1nq*q9?LiA4+2%w~*{Q0m-|BaC$b11NqL#p90Rn|5#k6Fmj1wW0 zb=fbMCd%X%x<0|z42V<+bgU}#d&NG?@zmC*n!#Cq0K@MrkZ)99>UpzmmZB-^yD*pb zsvqxygIGqdfDe2c=F+ZR<2j78wDKtg`!?M&E+M)HrTku#2l{Wtfm+T+U&{bG?_Ig* zc`m*8zB!PX!2@?c%HK>3)}0%Ny7{3K za8K{$C@$Vyaz?tr5~q$+UM_^+b}9Kr!xK8nsc4u#B-=Zsk8&YxK$Je2(vGho2kJp2 z_G`?yLE*01WpC1x0=@m$XY5}gVm*sCXRa8pd`&mt<)UzBm~0a2%Q$(D7}+D+l%id!%*qAJ4t|wWGBD3L$Z?@+d%H2c#NiClspP^P}?p~)z^61 zz<+NDm)n;0o`+;9SjTU4Dl2a0f#*yoUHY~rA=k<7B7cteGMed!VJkiUA*}r$P)h>@ z6aWAK2moqmEmBj5n0uN-003(?0RR*L004AhWMp}6FJ*XeWpZh4Wo~pXaCz;0X>%J# zmf&aeSJaT903d-7KpkzP4M%8wwWiyW!&Xo44$XxNK#?pGK%uJ&q-cl#`@SQOmq!&q zN$v6M2w{srRp!f=*UNY3;o;%I$uRjQn$+O!k#B!a_vocZ#e&FD` z)1m78Qq7Ap>nH2tm#i$NFhusUEYlk5TkfwSY=b^tNa%nas}Y! zci)?bRJRFLC~rHYYhPsRtW4`{`eeZ`tCsec>1ws9T7bv`)j{@lo^1d@D)e<(7A1F% zx7pyf%g2rGt{44eewod$lkfk}o4>q%_5F)CfB9+M>4||+EyDb6mPNhH zXM@che#1S#S=JVLQDVN*)vmI7PpoWpiyWhJu*l9~AHo99-fm#2tg>}I#U`h?>Z|TL zUBOyBhd+HBm|~SptL&eB*b`N;+~VB#4|Z(!d9hyPv`QwgiZwvX7tlz4o@b?cFoy}4 z)_0qXfA0dAt$(>&sj>;6%~d;p$&bJ6^pl4VuWzS|teTfS9txzs`1fzn%PL9NiS21p z%&uSs^BBK*@zpG^kM;B~Xx}HWg|e!j)R!sDN|`0gysCLs73aw&&C3eE&|twVZ8lJ^ zE|L_UoWo97&oeb_g9EBG1`?C5Xh6qFUEL7;y_*GazCBR@;4tm;X)IM`z1#z_Tz5)YuEWm@Mq8TKBV z!P!WNLi(+{f?pHB?-nT5rH|q*?1Tl>3ZU>J7-I*4I1&|7&ysBglK}m(c*Ms_ zzf#D=2bZCB=i3ryvtHf-rtl9{%_}`#)pmpXFI$9TW>^0hp5Kknx9j=%XIw=;V`H|V zbScWhx*l8%G(y zoIr>FItxnT^ts56X$pgawC>A7@H!0z*G0KXm)N5n1qBH)1x?YdN1e14E{qnJTpEDU@=!}C04Y7ko2b|k{#R+mq5UwN3d_~aZ+q+K207v z#}d)tNiyUg%uh}6VFgcr{Y^f`C#Pr36~N-3mn&?~9?NzKEVK0#Ur(Sw-93i`zV5=a zt}S~Cug`kD4O{y&JC0CQ;f8492#mxCba8^9h&vO#-kGR>;?+M1>z_2&htWGl93By*hct9& zIAJ5N$O#o0xkV0mHv#j%mIRggLP1FdLr9_r&eR0pHW5X^70P2z&|3So5r!ea=38Hr zS^gvVL;a-*nBW@^4(3ZZo@9TSQS>-UkGF7HypJ4P^52tV)2nw3{mYnXVJ^MEZ^*e} zn zS%ZO)l`aGMO&V%Cws<3h6qMB4%`!6`(U5_Wfd1eT!R|mO5dVbr4}j8b@Icdku)h zWqx5+Ff><_iU9Q^x5-Vq+-4tToR2b&E%;H!X_IjX;G5T9y&eNQFc-U5ywD?<;tRuC zaaB}IPN(@gucuRB+n4A4#AiAMr^(7dgeQK7YgL`RsyI__Q+JA{kI6UbvVxzt8PI~d zY67%VsTrx_YB}$##>5W}!+^LR@tM%LxMlopF%hHYmh{)=MD)ZhY4A7gnkQ~S#ncG| z`H5S~P&}%J)=q35NJR~z%$68%r;D}}#+p1BQ?UYe!2vb6Is1eF6Ppe&JrVasU zD8narw!pKz!ZNf&y+UX!t7Kz-$ER#ptD+@f;0)LAY+R~J<`MnAtG{US;cQh2(Ga61 zkfuP_eA@|Biw+GS)$6YMYsr}UYhh(eLa{a-C-xp6C_*TH$NS+}nEvtNhgUCOeLH4W zEoVE+YE$1O)g@2~B(E$>0E3hbltw?v&c0BUph4RnnCb^8?^k@nq+3 z=IG|1_JGFUJyMs11IMQdnQFTp@dUmawPt2l^iWg_$-CKE{phlWfsQ?<{n24(Z=t{q@!Bf4u6L=V+k?#%Z11BDZssl@(Us6jgov<&R%|H*&Z( z533lr=VB#F07igAuLWF;9dyBogLyZ&7}My26UTQ994aG_F5$rV2f0fj!p0vQk3OwL zdswv}Ksm+lXM$9*jr&Cnh|jilCd}OWgOZj{Hn?eLXQhjUVJ1mdLq#&I*qXUMvE8(a z4?op*WtBOu++3l49nHPCQeb5bq5yDDjhJyoRj#+s6e@!VE21ffWLYLbad#*j_QtF2 z6r5k8zI{RbP;jauacY6PO5b*6uX+)BnAL*S5=7fuoz$5<3#%iG=PX=o4M&okE||SV zeom(O+L0tW$)k4BwgWhlT5ML3v0iFv@v!0JlBo?A+YOLJEI2AHEVV77G#Eb!AB_p< z57srDSXkynm*LS33&oG5$cXATh|D4r)C~Y}8@nJ`OqxJ>>k+j$!A6L4X|VYa9&Jxy zCptZ2JJBR^kl@Eyo*dAp!?O^3(ZXqdrZ<+TGPua0+L3acf@!DSCU-Du z2gSipN<36YR45j&vih=E2spSak$w{xQO)S(@zcPd{Tq)V!H6w#U103*h#2pot%K9^ zbY8>p)#<^M0yS^gD0@`yg{uf=nPoGOZrZlNSy0p63kV~+Ol2cbKIX&)&nZT{^Q%|X`tnnnfro6gri{P6k*PyeYH zlL}U7eVb+LoeYHdbZ8+9I!O|?Un)E??%9t$7%aQX_Qt;>=<+NBN`Xc*WT9Y>uChhY z6}7tFfW#9K1@`RDy}BY0+^bieUEK(0;{93McSCn4s;E>HoLNNk6k*;+5rIG*OvJ