Skip to content

Latest commit

 

History

History
356 lines (303 loc) · 32.9 KB

File metadata and controls

356 lines (303 loc) · 32.9 KB

Finding the code

On the landing page of the article, there is a link for downloading a zip file with all the supplementary material. This zip file contains a file bioinf-2007-1619-File004.tar, whose contents are in file:scripts-from-suplementary-material-to-original-paper.

ls scripts-from-suplementary-material-to-original-paper
README
analyze_crystal_fluctuations.py
calculate_crystal_fluctuations.py

I remember that I had somewhat later published an update on my lab’s Web site. That site, based on an increasingly hard to maintain Plone server, was later replaced by a simpler static HTML site, but much of the original content was not transferred. My updated scripts are therefore no longer available there, but fortunately there is a copy in the Internet Archive which is in file:updated-scripts-from-obsolete-web-server.

ls updated-scripts-from-obsolete-web-server
README
analyze_crystal_fluctuations.py
calculate_crystal_fluctuations.py
calculate_crystal_fluctuations_small_memory.py

A quick look at the changes shows

  • an update in the version number of a dependency
  • the correction of a typo that had no influence on the results
  • a bug fix for handling PDB files with missing ADPs (anisotropic displacement parameters)
  • additional diagnostic output
  • an additional script for computing crystal modes with a lower memory footprint, at the cost of higher runtime, using a different matrix diagonalization algorithm.
diff -r scripts-from-suplementary-material-to-original-paper updated-scripts-from-obsolete-web-server
diff -r scripts-from-suplementary-material-to-original-paper/README updated-scripts-from-obsolete-web-server/README
21c21
< 4) Scientific Python, version 2.7.7 or later
---
> 4) Scientific Python, version 2.7.8 or later
diff -r scripts-from-suplementary-material-to-original-paper/analyze_crystal_fluctuations.py updated-scripts-from-obsolete-web-server/analyze_crystal_fluctuations.py
73,74c73,74
<     f_exp = N.array(adp_exp)
<     b_exp = f_exp[:,0,0]++f_exp[:,1,1]+f_exp[:,2,2]
---
>     f_exp = N.array([t.array for t in adp_exp])
>     b_exp = f_exp[:,0,0]+f_exp[:,1,1]+f_exp[:,2,2]
152,153c152,154
< writeArray(N.array([anisotropy(u.array) for u in adp_exp]),
<            'anisotropy_exp_%s_%d_%d_%d.plot' % (pdb_code, n1, n2 ,n3))
---
> if None not in adp_exp:
>     writeArray(N.array([anisotropy(u.array) for u in adp_exp]),
>                'anisotropy_exp_%s_%d_%d_%d.plot' % (pdb_code, n1, n2 ,n3))
diff -r scripts-from-suplementary-material-to-original-paper/calculate_crystal_fluctuations.py updated-scripts-from-obsolete-web-server/calculate_crystal_fluctuations.py
91a92,95
> print len(au_atoms), "C-alpha atoms in the asymmetric unit"
> print len(atoms), "C-alpha atoms in the unit cell"
> 
> 
Only in updated-scripts-from-obsolete-web-server: calculate_crystal_fluctuations_small_memory.py

None of these changes is important for reproducing the original results, so I will use the original code in the following.

Dependencies

Comments on the README from 2008

The Python interpreter, version 2.4 or 2.5.

Apparently I was careful back then, not envisaging later versions to be sufficiently compatible.

Python is still available from http://www.python.org/, although it is not clear if this will remain true after the end of support for Python in January 2020.

Numerical Python 23.8.2 or NumPy 1.x

There was a good reason to be specific about Numerical Python, since I knew my code did not work with versions 24.x, although I never found out why. It wasn’t worth exploring since everybody was moving on to NumPy anyway. The download link for Numerical Python 23.8.2 no longer works.

“NumPy 1.x” was an overly optimistic statement. Contrary to Numerical Python, whose version number moved quickly without backwards compatibility issues, NumPy has introduced multiple breaking changes while remaining at major version 1 to this day. I know now that my code only works up to NumPy 1.8. The site http://numpy.scipy.org/ no longer responds. The new home page is numpy.org, but I can’t find a link to the source code there! I happen to know that NumPy is hosted on GitHub now (https://github.com/numpy/numpy). Old releases can be found there as well, though it requires some familiarity with GitHub habits.

Unfortunately I did not write down which version of NumPy I had actually used for my calculations. The paper was submitted in December 2007, so the most recent candidate is 1.0.4, released in November 2007.

netCDF 3.4 or later

All later versions should indeed work, including the current 4.x series. netCDF is still available from http://www.unidata.ucar.edu/software/netcdf/.

ScientificPython 2.7.7 or later, MMTK 2.5.21 or later

These are my own libraries, so I could be confident about compatibility. The download links are no longer valid (the forge at sourcesup.cru.fr no longer exists). The home pages are still alive (I maintain the server that hosts them myself) and point to the new download site at bitbucket.org. However, the code is managed by Mercurial, which Bitbucket won’t support for much longer. I have to move somewhere else!

Which versions to use for the reproduction attempt?

I feel confident to move on to:

These are the latest versions of everything except for NumPy.

Input data

The only input data for each computation is a protein structure. The two protein structured used are still available from the Protein Data Bank: entry IEEE and entry 2LYM. The PDB does update its files from time to time, The file for a specifc entry is intended to represent the original data deposited by its authors at any time, but may be modified to conform to newer versions of the file format, or to fix mistakes. There is thus no guarantee that a file downloaded today is the same as in 2008, but the scientific information it contains is supposed to stay the same.

Running the code using Guix

All the dependencies are already packaged for Guix. Creating an environment from

(specifications->manifest
 '("wget"
   "python2"
   "python2-mmtk"
   "gnuplot"))

should allow to download the PDB files, run the two scripts, and plot the results. Tested with guix version

guix describe
Generation 11	Nov 16 2019 10:44:27	(current)
  guix 87e7faa
    repository URL: https://git.savannah.gnu.org/git/guix.git
    branch: master
    commit: 87e7faa2ae641d8302efc8b90f1e45f43f67f6da

The steps are

wget -O 1IEE.pdb http://www.ebi.ac.uk/pdbe/entry-files/download/pdb1iee.ent
wget -O 2LYM.pdb http://www.ebi.ac.uk/pdbe/entry-files/download/pdb2lym.ent
python calculate_crystal_fluctuations.py
python analyze_crystal_fluctuations.py

The second script (analyze_crystal_fluctuations.py) crashes with the traceback:

Traceback (most recent call last):
  File "analyze_crystal_fluctuations.py", line 74, in <module>
    b_exp = f_exp[:,0,0]++f_exp[:,1,1]+f_exp[:,2,2]
IndexError: too many indices

An analysis using pdb (the Python Debugger, not the Protein Data Bank!) shows that the conversion from a list of Scientific.Geometry.Tensor objects to a 3-dimensional NumPy array fails. This is probably due to a compatibility-breaking change in NumPy at some point (to be confirmed). The fix is to change line 73 from

f_exp = N.array(adp_exp)

to

f_exp = N.array([u.array for u in adp_exp])

With that fix, the script runs and produces several output files whose only documentation is the code.

Older NumPy versions in Guix

The oldest NumPy version in Guix is 1.9.1, added with commit ee8869a694803e582e203208d04a0725bfc8241 in December 2014.

Trying to use NumPy 1.0.4

To explore the cause of the crash in analyze_crystal_fluctuations.py, it would be nice to run with a NumPy version close to the original. Unfortunately, NumPy 1.0.4 cannot be installed with Python 2.7.16. NumPy 1.0.4 uses a modified version of the then-current distutils, whose code to read the Python installation configuration cannot deal with the configuration files of Python 2.7.

Python 2.5

Installation under Guix

guix environment --ad-hoc wget -- wget https://www.python.org/ftp/python/2.5.2/Python-2.5.2.tgz

guix environment --container --ad-hoc wget gzip tar binutils autoconf coreutils sed grep make gcc-toolchain
wget https://www.python.org/ftp/python/2.5.2/Python-2.5.2.tgz
tar xzf Python-2.5.2.tgz
cd Python-2.5.2
./configure --prefix=$HOME/python2.5
make install

Fails:

IOError: [Errno 2] No such file or directory: '/usr/include/netinet/in.h'

Conclusion: Python 2.5 must first be packaged for Guix.

Reproduction using the patched original scripts

The scripts perform the core of the computations, but their output is not sufficient to reproduce the figures shown in the paper. The transformation from the output of the scripts to the figures has been done using additional scripts (not published and lost in the meantime) and by manual intervention. It would not be difficult to reconstruct this work, but that would be replication rather then reproduction, and thus not the subject of the current exercise. In the following, I will limite myself to producing figures that should convince the reader that the numbers I obtain today are sufficiently close to the numbers I obtained in 2007.

Fix the Guix version

To use the current Guix version on your system (the one from your last guix pull), replace guix-command by a plain guix.

guix time-machine –commit=7357b3d7a52eb5db1674012c50d308d792741c48 –

Download PDB files

cd reproduction
$guix_command environment --pure --ad-hoc wget -- wget -O 1IEE.pdb http://www.ebi.ac.uk/pdbe/entry-files/download/pdb1iee.ent
$guix_command environment --pure --ad-hoc wget -- wget -O 2LYM.pdb http://www.ebi.ac.uk/pdbe/entry-files/download/pdb2lym.ent
$guix_command environment --pure --ad-hoc wget -- wget -O 3LZT.pdb http://www.ebi.ac.uk/pdbe/entry-files/download/pdb3lzt.ent

Run the analysis on 3LZT (for Figure 2)

cd reproduction

$guix_command environment --container --ad-hoc python2 python2-mmtk -- python calculate_crystal_fluctuations.py 3LZT 1 1 1 1.0
$guix_command environment --container --ad-hoc python2 python2-mmtk -- python analyze_crystal_fluctuations.py  3LZT 1 1 1
129 out of 129 atoms have ADPs

Run the analysis on 1IEE (for Figures 3 to 5)

cd reproduction

$guix_command environment --container --ad-hoc python2 python2-mmtk -- python calculate_crystal_fluctuations.py 1IEE 1 1 1 2.99
$guix_command environment --container --ad-hoc python2 python2-mmtk -- python analyze_crystal_fluctuations.py  1IEE 1 1 1

$guix_command environment --container --ad-hoc python2 python2-mmtk -- python calculate_crystal_fluctuations.py 1IEE 2 2 2 2.99
$guix_command environment --container --ad-hoc python2 python2-mmtk -- python analyze_crystal_fluctuations.py  1IEE 2 2 2

$guix_command environment --container --ad-hoc python2 python2-mmtk -- python calculate_crystal_fluctuations.py 1IEE 3 3 3 2.99
$guix_command environment --container --ad-hoc python2 python2-mmtk -- python analyze_crystal_fluctuations.py  1IEE 3 3 3

$guix_command environment --container --ad-hoc python2 python2-mmtk -- python calculate_crystal_fluctuations.py 1IEE 4 4 4 2.99
$guix_command environment --container --ad-hoc python2 python2-mmtk -- python analyze_crystal_fluctuations.py  1IEE 4 4 4

$guix_command environment --container --ad-hoc python2 python2-mmtk -- python calculate_crystal_fluctuations.py 1IEE 5 5 5 2.99
$guix_command environment --container --ad-hoc python2 python2-mmtk -- python analyze_crystal_fluctuations.py  1IEE 5 5 5

$guix_command environment --container --ad-hoc python2 python2-mmtk -- python calculate_crystal_fluctuations.py 1IEE 10 10 10 2.99
$guix_command environment --container --ad-hoc python2 python2-mmtk -- python analyze_crystal_fluctuations.py  1IEE 10 10 10

$guix_command environment --container --ad-hoc python2 python2-mmtk -- python calculate_crystal_fluctuations.py 1IEE 20 20 20 2.99
$guix_command environment --container --ad-hoc python2 python2-mmtk -- python analyze_crystal_fluctuations.py  1IEE 20 20 20
129 out of 129 atoms have ADPs
129 out of 129 atoms have ADPs
129 out of 129 atoms have ADPs
129 out of 129 atoms have ADPs
129 out of 129 atoms have ADPs
129 out of 129 atoms have ADPs
129 out of 129 atoms have ADPs

Reconstruct the plots (partially)

Figures 2 and 3

Both figures contain single-molecule data that are not computed by the scripts and thus not shown here. The crystal data should however convince the reader that the reproduced values are the same as the original ones.

In Fig. 2, the B factor scale is in “arbitray units” and it isn’t quite clear what factor was used in the original plot.

set terminal png
set output "fig2.png"
set multiplot
set size 1.,0.5
set origin 0.,0.5
set yrange [0.:0.001]
plot "btotal_3LZT_1_1_1.plot" w l
set size 1.,0.5
set origin 0.,0.
set yrange [0.:1.]
plot "anisotropy_total_3LZT_1_1_1.plot" w l
unset multiplot
cd reproduction
$guix_command environment --pure --ad-hoc gnuplot -- gnuplot < fig2.gnuplot

reproduction/fig2.png

In Fig. 3, the B factors are scaled by a factor 100 to convert the nm^2 values in the files to Ang^2 as used in the original plots.

set terminal png
set output "fig3.png"
set multiplot
set size 1.,0.5
set origin 0.,0.5
set yrange [0.:0.1]
plot "btotal_1IEE_1_1_1.plot" using (100*$1) w l
set size 1.,0.5
set origin 0.,0.
set yrange [0.:1.]
plot "anisotropy_total_1IEE_1_1_1.plot" w l
unset multiplot
cd reproduction
$guix_command environment --pure --ad-hoc gnuplot -- gnuplot < fig3.gnuplot

reproduction/fig3.png

Figure 4

The elastic medium approximation is not computed by the scripts, so only the crystal modes will be plotted here. Moreover, the following plot mixes the four panes (and more) of the original figure, because the scripts do not sort the q vectors by direction, as would be required to reproduce Figure 4 correctly. The link between the figure below and the original Figure 4 is that all the drawn-out lines in the latter should pass through the points in the former.

set terminal png
set output "fig4.png"
plot "dispersion_1IEE_5_5_5.plot" w p
cd reproduction
$guix_command environment --pure --ad-hoc gnuplot -- gnuplot < fig4.gnuplot

reproduction/fig4.png

Figure 5

Because of the large space occupied by the legends, I plot the two panes separately.

set terminal pngcairo
set output "fig5a.png"
set key bmargin
set yrange [0.:0.0025]
plot "bacoustic_1IEE_2_2_2.plot" using (100*$1) w l dt 5 lc rgb "black", "bacoustic_1IEE_3_3_3.plot" using (100*$1) w l dt 4 lc rgb "black", "bacoustic_1IEE_4_4_4.plot" using (100*$1) w l dt 3 lc rgb "black", "bacoustic_1IEE_5_5_5.plot" using (100*$1) w l dt 2 lc rgb "black", "bacoustic_1IEE_10_10_10.plot" using (100*$1) w l dt 5 lc rgb "black", "bacoustic_1IEE_20_20_20.plot" using (100*$1) w l dt 1 lc rgb "black"
set terminal pngcairo
set output "fig5b.png"
set key bmargin
set yrange [0.:1.]
plot "anisotropy_acoustic_1IEE_2_2_2.plot" w l dt 5 lc rgb "black", "anisotropy_acoustic_1IEE_3_3_3.plot" w l dt 4 lc rgb "black", "anisotropy_acoustic_1IEE_4_4_4.plot" w l dt 3 lc rgb "black", "anisotropy_acoustic_1IEE_5_5_5.plot" w l dt 2 lc rgb "black", "anisotropy_acoustic_1IEE_10_10_10.plot" w l dt 5 lc rgb "black", "anisotropy_acoustic_1IEE_20_20_20.plot" w l dt 1 lc rgb "black"
cd reproduction
$guix_command environment --pure --ad-hoc gnuplot -- gnuplot < fig5a.gnuplot
$guix_command environment --pure --ad-hoc gnuplot -- gnuplot < fig5b.gnuplot

reproduction/fig5a.png reproduction/fig5b.png

List all dependencies with version numbers

The Guile script show-dependencies.scm performs a deep dependency analysis starting from the packages listed on the command line. See this blog post for an explanation of what the three different levels of dependencies mean precisely.

cd reproduction
$guix_command environment --container --ad-hoc guix guile -- guile -s show-dependencies.scm wget python2 python2-mmtk gnuplot
Packages: 4
  gnuplot@5.2.7 python2-mmtk@2.7.12 python2@2.7.16 wget@1.20.3
Package inputs: 27 packages
  bzip2@1.0.6 cairo@1.16.0 expat@2.2.7 gd@2.2.5 gdbm@1.18.1 gnutls@3.6.9 libffi@3.2.1 libidn2@2.2.0 libpsl@0.21.0 lua@5.3.5 lzip@1.21 netcdf@4.4.1.1 openssl@1.1.1c pango@1.42.4 perl-http-daemon@6.01 perl-io-socket-ssl@2.066 perl@5.30.0 pkg-config@0.29.2 python2-scientific@2.9.4 python2@2.7.16 python@3.7.4 readline@8.0 sqlite@3.28.0 tcl@8.6.9 texlive-tiny@49435 tk@8.6.9.1 zlib@1.2.11
Build inputs: 49 packages
  [source code from #<<git-reference> url: "https://github.com/khinsen/MMTK" commit: "rel2.7.12" recursive?: #f>] [source code from https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tar.xz] [source code from mirror://gnu/wget/wget-1.20.3.tar.lz] [source code from mirror://sourceforge/gnuplot/gnuplot/5.2.7/gnuplot-5.2.7.tar.gz] bash-minimal@5.0.7 binutils@2.32 bzip2@1.0.6 cairo@1.16.0 coreutils@8.31 diffutils@3.7 expat@2.2.7 file@5.33 findutils@4.6.0 gawk@5.0.1 gcc@7.4.0 gd@2.2.5 gdbm@1.18.1 glibc-utf8-locales@2.29 glibc@2.29 gnutls@3.6.9 grep@3.3 gzip@1.10 ld-wrapper@0 libffi@3.2.1 libidn2@2.2.0 libpsl@0.21.0 lua@5.3.5 lzip@1.21 make@4.2.1 netcdf@4.4.1.1 openssl@1.1.1c pango@1.42.4 patch@2.7.6 perl-http-daemon@6.01 perl-io-socket-ssl@2.066 perl@5.30.0 pkg-config@0.29.2 python2-scientific@2.9.4 python2@2.7.16 python@3.7.4 readline@8.0 sed@4.7 sqlite@3.28.0 tar@1.32 tcl@8.6.9 texlive-tiny@49435 tk@8.6.9.1 xz@5.2.4 zlib@1.2.11
Package closure: 356 packages
  acl@2.2.53 attr@2.4.48 autoconf-wrapper@2.69 autoconf@2.69 automake@1.16.1 bash-minimal@5.0.7 bash-static@5.0.7 bash@5.0.7 bdb@5.3.28 binutils-cross-boot0@2.32 binutils-mesboot0@2.20.1a binutils-mesboot@2.20.1a binutils@2.32 bison@3.4.1 boost@1.70.0 bootstrap-binaries@0 bootstrap-mes@0 bootstrap-mescc-tools@0.5.2 bzip2@1.0.6 c-ares@1.15.0 cairo@1.16.0 cmake-minimal@3.15.1 coreutils@8.31 cunit@2.1-3 curl@7.65.3 cyrus-sasl@2.1.27 dbus@1.12.16 diffutils-boot0@3.7 diffutils-mesboot@2.7 diffutils@3.7 docbook-xml@4.4 docbook-xsl@1.79.1 doxygen@1.8.15 ed@1.15 expat@2.2.7 file-boot0@5.33 file@5.33 findutils-boot0@4.6.0 findutils@4.6.0 flex@2.6.4 fontconfig@2.13.1 fontforge@20190801 freetype@2.10.1 fribidi@1.0.5 gawk@5.0.1 gcc-core-mesboot@2.95.3 gcc-cross-boot0-wrapped@7.4.0 gcc-cross-boot0@7.4.0 gcc-mesboot-wrapper@4.9.4 gcc-mesboot0@2.95.3 gcc-mesboot1-wrapper@4.7.4 gcc-mesboot1@4.7.4 gcc-mesboot@4.9.4 gcc@7.4.0 gd@2.2.5 gdbm@1.18.1 gettext-boot0@0.19.8.1 gettext-minimal@0.20.1 gfortran@7.4.0 ghostscript@9.27 glib@2.60.6 glibc-headers-mesboot@2.16.0 glibc-intermediate@2.29 glibc-mesboot0@2.2.5 glibc-mesboot@2.16.0 glibc-utf8-locales@2.29 glibc@2.29 gmp@6.1.2 gnuplot@5.2.7 gnutls@3.6.9 gobject-introspection@1.60.2 gperf@3.1 graphite2@1.3.13 graphviz@2.40.1 grep@3.3 groff@1.22.4 gs-fonts@8.11 gts@0.7.6 guile-bootstrap@2.0 guile@2.0.14 guile@2.2.6 gzip@1.10 harfbuzz@2.5.3 hdf4-alt@4.2.14 hdf5@1.8.21 help2man@1.47.10 icu4c@64.2 intltool@0.51.0 isl@0.21 itstool@2.0.6 jansson@2.12 jbig2dec@0.16 jemalloc@5.2.0 lapack@3.9.0 lcms@2.9 ld-wrapper-boot0@0 ld-wrapper-boot3@0 ld-wrapper@0 libarchive@3.4.0 libatomic-ops@7.6.10 libbsd@0.9.1 libcap@2.27 libelf@0.8.13 libev@4.25 libffi@3.2.1 libgc@7.6.12 libgcrypt@1.8.4 libgpg-error@1.36 libice@1.0.10 libidn2@2.2.0 libidn@1.35 libjpeg-turbo@2.0.2 libjpeg@9c libltdl@2.4.6 libpaper@1.1.24 libpng@1.6.37 libpsl@0.21.0 libpthread-stubs@0.4 libselinux@2.7 libsepol@2.7 libsigsegv@2.12 libsm@1.2.3 libspectre@0.2.8 libspiro@0.5.20150702 libstdc++-boot0@4.9.4 libstdc++@7.4.0 libtasn1@4.14 libtiff@4.0.10 libtirpc@1.1.4 libtool@2.4.6 libungif@4.1.4 libuninameslist@20190701 libunistring@0.9.10 libuv@1.30.1 libx11@1.6.8 libxau@1.0.9 libxaw@1.0.13 libxcb@1.13 libxdmcp@1.1.3 libxext@1.3.4 libxfixes@5.0.3 libxft@2.3.3 libxi@1.7.10 libxml2@2.9.9 libxmu@1.1.3 libxpm@3.5.12 libxrender@0.9.10 libxslt@1.1.33 libxt@1.2.0 linux-libre-headers-bootstrap@0 linux-libre-headers@4.19.56 lua@5.3.5 lzip@1.21 lzo@2.10 m4@1.4.18 make-boot0@4.2.1 make-mesboot0@3.80 make-mesboot@3.82 make@4.2.1 mes-boot@0.19 mesboot-headers@0.19 meson-for-build@0.50.1 mit-krb5@1.17 mpc@1.1.0 mpfr@4.0.2 nasm@2.14.02 ncurses@6.1-20190609 net-base@5.3 net-tools@1.60-0.479bb4a netcdf@4.4.1.1 nettle@3.5.1 nghttp2@1.39.1 ninja@1.9.0 openblas@0.3.7 openjpeg@2.3.1 openldap@2.4.47 openssl@1.1.1c pango@1.42.4 patch@2.7.6 pcre@8.43 perl-boot0@5.30.0 perl-encode-locale@1.05 perl-http-daemon@6.01 perl-http-date@6.02 perl-http-message@6.18 perl-io-html@1.00 perl-io-socket-ssl@2.066 perl-lwp-mediatypes@6.02 perl-net-ssleay@1.88 perl-test-needs@0.002005 perl-try-tiny@0.30 perl-uri@1.76 perl-xml-parser@2.44 perl@5.30.0 pixman@0.38.4 pkg-config@0.29.2 poppler@0.79.0 potrace@1.15 psutils@17 python-atomicwrites@1.3.0 python-attrs-bootstrap@19.1.0 python-coverage@4.5.3 python-entrypoints@0.3 python-flake8@3.7.7 python-fonttools@3.38.0 python-hypothesis@4.18.3 python-libxml2@2.9.9 python-linecache2@1.0.0 python-mccabe@0.6.1 python-minimal-wrapper@3.7.4 python-minimal@3.5.7 python-minimal@3.7.4 python-mock@2.0.0 python-more-itertools@7.1.0 python-nose@1.3.7 python-pbr-minimal@3.0.1 python-pluggy@0.11.0 python-py@1.8.0 python-pycodestyle@2.5.0 python-pyflakes@2.1.1 python-pytest-bootstrap@4.4.2 python-pytest-runner@4.4 python-pytest@4.4.2 python-setuptools-scm@3.2.0 python-six-bootstrap@1.12.0 python-six@1.12.0 python-traceback2@1.4.0 python-unittest2@1.1.0 python-wrapper@3.7.4 python2-mmtk@2.7.12 python2-nose@1.3.7 python2-numpy@1.8.2 python2-pyro@3.16 python2-scientific@2.9.4 python2@2.7.16 python@3.7.4 readline@8.0 rhash@1.3.8 ruby@2.5.3 sed@4.7 sqlite@3.28.0 swig@3.0.12 tar@1.32 tcc-boot0@0.9.26-6.c004e9a tcc-boot@0.9.27 tcl@8.6.9 tcsh@6.20.00 teckit@2.5.9 texinfo@6.6 texlive-bin@20180414 texlive-cm@49435 texlive-dehyph-exptl@49435 texlive-dvips@49435 texlive-etex@49435 texlive-fontname@49435 texlive-fonts-knuth-lib@49435 texlive-fonts-latex@49435 texlive-generic-babel-english@49435 texlive-graphics-cfg@49435 texlive-graphics-def@49435 texlive-hyph-utf8@49435 texlive-hyphen-afrikaans@49435 texlive-hyphen-ancientgreek@49435 texlive-hyphen-armenian@49435 texlive-hyphen-base@49435 texlive-hyphen-basque@49435 texlive-hyphen-belarusian@49435 texlive-hyphen-bulgarian@49435 texlive-hyphen-catalan@49435 texlive-hyphen-chinese@49435 texlive-hyphen-churchslavonic@49435 texlive-hyphen-coptic@49435 texlive-hyphen-croatian@49435 texlive-hyphen-czech@49435 texlive-hyphen-danish@49435 texlive-hyphen-dutch@49435 texlive-hyphen-english@49435 texlive-hyphen-esperanto@49435 texlive-hyphen-estonian@49435 texlive-hyphen-ethiopic@49435 texlive-hyphen-finnish@49435 texlive-hyphen-french@49435 texlive-hyphen-friulan@49435 texlive-hyphen-galician@49435 texlive-hyphen-georgian@49435 texlive-hyphen-german@49435 texlive-hyphen-greek@49435 texlive-hyphen-hungarian@49435 texlive-hyphen-icelandic@49435 texlive-hyphen-indic@49435 texlive-hyphen-indonesian@49435 texlive-hyphen-interlingua@49435 texlive-hyphen-irish@49435 texlive-hyphen-italian@49435 texlive-hyphen-kurmanji@49435 texlive-hyphen-latin@49435 texlive-hyphen-latvian@49435 texlive-hyphen-lithuanian@49435 texlive-hyphen-mongolian@49435 texlive-hyphen-norwegian@49435 texlive-hyphen-occitan@49435 texlive-hyphen-piedmontese@49435 texlive-hyphen-polish@49435 texlive-hyphen-portuguese@49435 texlive-hyphen-romanian@49435 texlive-hyphen-romansh@49435 texlive-hyphen-russian@49435 texlive-hyphen-sanskrit@49435 texlive-hyphen-serbian@49435 texlive-hyphen-slovak@49435 texlive-hyphen-slovenian@49435 texlive-hyphen-spanish@49435 texlive-hyphen-swedish@49435 texlive-hyphen-thai@49435 texlive-hyphen-turkish@49435 texlive-hyphen-turkmen@49435 texlive-hyphen-ukrainian@49435 texlive-hyphen-uppersorbian@49435 texlive-hyphen-welsh@49435 texlive-kpathsea@49435 texlive-latex-amscls@49435 texlive-latex-amsmath@49435 texlive-latex-babel@49435 texlive-latex-base@49435 texlive-latex-cyrillic@49435 texlive-latex-graphics@49435 texlive-latex-psnfss@49435 texlive-latex-tools@49435 texlive-latexconfig@49435 texlive-metafont-base@49435 texlive-mkpattern@49435 texlive-ruhyphen@49435 texlive-tetex@49435 texlive-tex-ini-files@49435 texlive-tex-plain@49435 texlive-tiny@49435 texlive-ukrhyph@49435 texlive-unicode-data@49435 tk@8.6.9.1 tzdata@2019b unzip@6.0 util-linux@2.34 util-macros@1.19.2 wget@1.20.3 which@2.21 xcb-proto@1.13 xmlto@0.0.28 xorgproto@2019.1 xtrans@1.4.0 xz@5.2.4 yelp-tools@3.28.0 yelp-xsl@3.32.1 zip@3.0 zlib@1.2.11 zstd@1.4.2 zziplib@0.13.69

The last level, package closure, contains everything needed to guarantee bit-for-bit reproducibility of the results. Its large size (356 packages) is mainly due to the many graphics backends included with gnuplot. For reproducing only the numerical results, a smaller dependency list is sufficient, but the package closure still contains 254 packages:

cd reproduction
$guix_command environment --container --ad-hoc guix guile -- guile -s show-dependencies.scm wget python2 python2-mmtk
Packages: 3
  python2-mmtk@2.7.12 python2@2.7.16 wget@1.20.3
Package inputs: 22 packages
  bzip2@1.0.6 expat@2.2.7 gdbm@1.18.1 gnutls@3.6.9 libffi@3.2.1 libidn2@2.2.0 libpsl@0.21.0 lzip@1.21 netcdf@4.4.1.1 openssl@1.1.1c perl-http-daemon@6.01 perl-io-socket-ssl@2.066 perl@5.30.0 pkg-config@0.29.2 python2-scientific@2.9.4 python2@2.7.16 python@3.7.4 readline@8.0 sqlite@3.28.0 tcl@8.6.9 tk@8.6.9.1 zlib@1.2.11
Build inputs: 43 packages
  [source code from #<<git-reference> url: "https://github.com/khinsen/MMTK" commit: "rel2.7.12" recursive?: #f>] [source code from https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tar.xz] [source code from mirror://gnu/wget/wget-1.20.3.tar.lz] bash-minimal@5.0.7 binutils@2.32 bzip2@1.0.6 coreutils@8.31 diffutils@3.7 expat@2.2.7 file@5.33 findutils@4.6.0 gawk@5.0.1 gcc@7.4.0 gdbm@1.18.1 glibc-utf8-locales@2.29 glibc@2.29 gnutls@3.6.9 grep@3.3 gzip@1.10 ld-wrapper@0 libffi@3.2.1 libidn2@2.2.0 libpsl@0.21.0 lzip@1.21 make@4.2.1 netcdf@4.4.1.1 openssl@1.1.1c patch@2.7.6 perl-http-daemon@6.01 perl-io-socket-ssl@2.066 perl@5.30.0 pkg-config@0.29.2 python2-scientific@2.9.4 python2@2.7.16 python@3.7.4 readline@8.0 sed@4.7 sqlite@3.28.0 tar@1.32 tcl@8.6.9 tk@8.6.9.1 xz@5.2.4 zlib@1.2.11
Package closure: 254 packages
  acl@2.2.53 attr@2.4.48 autoconf-wrapper@2.69 autoconf@2.69 automake@1.16.1 bash-minimal@5.0.7 bash-static@5.0.7 bash@5.0.7 bdb@5.3.28 binutils-cross-boot0@2.32 binutils-mesboot0@2.20.1a binutils-mesboot@2.20.1a binutils@2.32 bison@3.4.1 boost@1.70.0 bootstrap-binaries@0 bootstrap-mes@0 bootstrap-mescc-tools@0.5.2 bzip2@1.0.6 c-ares@1.15.0 cairo@1.16.0 cmake-minimal@3.15.1 coreutils@8.31 cunit@2.1-3 curl@7.65.3 cyrus-sasl@2.1.27 dbus@1.12.16 diffutils-boot0@3.7 diffutils-mesboot@2.7 diffutils@3.7 docbook-xml@4.4 docbook-xsl@1.79.1 doxygen@1.8.15 ed@1.15 expat@2.2.7 file-boot0@5.33 file@5.33 findutils-boot0@4.6.0 findutils@4.6.0 flex@2.6.4 fontconfig@2.13.1 freetype@2.10.1 fribidi@1.0.5 gawk@5.0.1 gcc-core-mesboot@2.95.3 gcc-cross-boot0-wrapped@7.4.0 gcc-cross-boot0@7.4.0 gcc-mesboot-wrapper@4.9.4 gcc-mesboot0@2.95.3 gcc-mesboot1-wrapper@4.7.4 gcc-mesboot1@4.7.4 gcc-mesboot@4.9.4 gcc@7.4.0 gd@2.2.5 gdbm@1.18.1 gettext-boot0@0.19.8.1 gettext-minimal@0.20.1 gfortran@7.4.0 ghostscript@9.27 glib@2.60.6 glibc-headers-mesboot@2.16.0 glibc-intermediate@2.29 glibc-mesboot0@2.2.5 glibc-mesboot@2.16.0 glibc-utf8-locales@2.29 glibc@2.29 gmp@6.1.2 gnutls@3.6.9 gobject-introspection@1.60.2 gperf@3.1 graphite2@1.3.13 graphviz@2.40.1 grep@3.3 groff@1.22.4 gs-fonts@8.11 gts@0.7.6 guile-bootstrap@2.0 guile@2.0.14 guile@2.2.6 gzip@1.10 harfbuzz@2.5.3 hdf4-alt@4.2.14 hdf5@1.8.21 help2man@1.47.10 icu4c@64.2 intltool@0.51.0 isl@0.21 itstool@2.0.6 jansson@2.12 jbig2dec@0.16 jemalloc@5.2.0 lapack@3.9.0 lcms@2.9 ld-wrapper-boot0@0 ld-wrapper-boot3@0 ld-wrapper@0 libarchive@3.4.0 libatomic-ops@7.6.10 libbsd@0.9.1 libcap@2.27 libelf@0.8.13 libev@4.25 libffi@3.2.1 libgc@7.6.12 libgcrypt@1.8.4 libgpg-error@1.36 libice@1.0.10 libidn2@2.2.0 libidn@1.35 libjpeg-turbo@2.0.2 libjpeg@9c libltdl@2.4.6 libpaper@1.1.24 libpng@1.6.37 libpsl@0.21.0 libpthread-stubs@0.4 libselinux@2.7 libsepol@2.7 libsigsegv@2.12 libsm@1.2.3 libspectre@0.2.8 libstdc++-boot0@4.9.4 libstdc++@7.4.0 libtasn1@4.14 libtiff@4.0.10 libtirpc@1.1.4 libtool@2.4.6 libunistring@0.9.10 libuv@1.30.1 libx11@1.6.8 libxau@1.0.9 libxaw@1.0.13 libxcb@1.13 libxdmcp@1.1.3 libxext@1.3.4 libxft@2.3.3 libxml2@2.9.9 libxmu@1.1.3 libxpm@3.5.12 libxrender@0.9.10 libxslt@1.1.33 libxt@1.2.0 linux-libre-headers-bootstrap@0 linux-libre-headers@4.19.56 lzip@1.21 lzo@2.10 m4@1.4.18 make-boot0@4.2.1 make-mesboot0@3.80 make-mesboot@3.82 make@4.2.1 mes-boot@0.19 mesboot-headers@0.19 meson-for-build@0.50.1 mit-krb5@1.17 mpc@1.1.0 mpfr@4.0.2 nasm@2.14.02 ncurses@6.1-20190609 net-base@5.3 net-tools@1.60-0.479bb4a netcdf@4.4.1.1 nettle@3.5.1 nghttp2@1.39.1 ninja@1.9.0 openblas@0.3.7 openjpeg@2.3.1 openldap@2.4.47 openssl@1.1.1c pango@1.42.4 patch@2.7.6 pcre@8.43 perl-boot0@5.30.0 perl-encode-locale@1.05 perl-http-daemon@6.01 perl-http-date@6.02 perl-http-message@6.18 perl-io-html@1.00 perl-io-socket-ssl@2.066 perl-lwp-mediatypes@6.02 perl-net-ssleay@1.88 perl-test-needs@0.002005 perl-try-tiny@0.30 perl-uri@1.76 perl-xml-parser@2.44 perl@5.30.0 pixman@0.38.4 pkg-config@0.29.2 poppler@0.79.0 psutils@17 python-atomicwrites@1.3.0 python-attrs-bootstrap@19.1.0 python-coverage@4.5.3 python-entrypoints@0.3 python-flake8@3.7.7 python-fonttools@3.38.0 python-hypothesis@4.18.3 python-libxml2@2.9.9 python-linecache2@1.0.0 python-mccabe@0.6.1 python-minimal-wrapper@3.7.4 python-minimal@3.5.7 python-minimal@3.7.4 python-mock@2.0.0 python-more-itertools@7.1.0 python-nose@1.3.7 python-pbr-minimal@3.0.1 python-pluggy@0.11.0 python-py@1.8.0 python-pycodestyle@2.5.0 python-pyflakes@2.1.1 python-pytest-bootstrap@4.4.2 python-pytest-runner@4.4 python-pytest@4.4.2 python-setuptools-scm@3.2.0 python-six-bootstrap@1.12.0 python-six@1.12.0 python-traceback2@1.4.0 python-unittest2@1.1.0 python-wrapper@3.7.4 python2-mmtk@2.7.12 python2-nose@1.3.7 python2-numpy@1.8.2 python2-pyro@3.16 python2-scientific@2.9.4 python2@2.7.16 python@3.7.4 readline@8.0 rhash@1.3.8 sed@4.7 sqlite@3.28.0 swig@3.0.12 tar@1.32 tcc-boot0@0.9.26-6.c004e9a tcc-boot@0.9.27 tcl@8.6.9 tcsh@6.20.00 texinfo@6.6 tk@8.6.9.1 tzdata@2019b unzip@6.0 util-linux@2.34 util-macros@1.19.2 wget@1.20.3 which@2.21 xcb-proto@1.13 xmlto@0.0.28 xorgproto@2019.1 xtrans@1.4.0 xz@5.2.4 yelp-tools@3.28.0 yelp-xsl@3.32.1 zlib@1.2.11 zstd@1.4.2