mobiusklein / ms_deisotope

A library for deisotoping and charge state deconvolution of complex mass spectra

Home Page:https://mobiusklein.github.io/ms_deisotope

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

AttributeError: 'PeakDependenceGraph' object has no attribute 'best_exact_fits'

MKoesters opened this issue · comments

I'm trying to run this code

from ms_deisotope.deconvolution import deconvolute_peaks
from ms_peak_picker import simple_peak

peaks = [(200, 10000), (203.12312, 3132132)] # example data
peaks = [simple_peak(p[0], p[1], 0.01) for p in peaks]
decon_result = deconvolute_peaks(peaks, *args, **kwargs)

which always worked for me, but started failing with ms_deisotope==0.0.13 under linux with python >3.5, under windows it works fine for me.

Can you tell me if I need to adapt my code or if there is a bug in ms_deisotope?

I recently moved best_exact_fits from Python to Cython. The release passed the test suite which exercises this component on Py3.5-3.7 on Linux. Can you make sure you've completely uninstalled ms_deisotope from your environment, and then do a clean install?

I think I've encountered this type of issue before when I directly execute setup.py instead of pip to install packages from source, since pip always enforces "single version externally managed" mode", but setuptools doesn't automatically.

Thanks for your fast answer.

I'm running tests with tox and recreating the environment, so I'm quite confident that I'm not using an older version of ms_deisotope.

Also, this fails in the CI/CD pipeline of pymzML for pymzml/pymzML#210 , see the log here
I'm not quite sure if this is an error in our setup and if so, how to fix it

Best,
Manuel

Thank you for following up.

There are two issues here. The first is that you're not loading the C extensions for some reason, which is odd. The second is that I didn't indent the conditional declaration of the Python fallback implementation correctly, so half of the methods on it were missing.

I've pushed commit 98cec45 which fixes the indentation in the Python fallback implementation so all of the methods are properly defined on it.

I suspect you're encountering an error during C extension compilation on those versions of Python, but the error is getting swallowed by whatever you're using to install your dependencies. I'll look around a bit, but I thought my setup.py script would generate loud warning messages if C extensions failed to compile. Is there a verbose option for your environment setup?

I'll have a look at the logs and try to run the test CI/CD in verbose mode, I'll come back to you as soon as I found the relevant information.

I think I figured out what is going wrong.

When I download ms_deisotope==0.0.13 from pip and run pip install -v . I get the following output:

cd ms_deisotope-0.0.13
pip install -v .
Non-user install because user site-packages disabled
Created temporary directory: /tmp/pip-ephem-wheel-cache-w8adtcxa
Created temporary directory: /tmp/pip-req-tracker-wlr9xe9d
Initialized build tracking at /tmp/pip-req-tracker-wlr9xe9d
Created build tracker: /tmp/pip-req-tracker-wlr9xe9d
Entered build tracker: /tmp/pip-req-tracker-wlr9xe9d
Created temporary directory: /tmp/pip-install-xiw4qdo7
Processing /mnt/Downloads/ms_deisotope-0.0.13
  Created temporary directory: /tmp/pip-req-build-8vzo4lan
  Added file:///mnt/Downloads/ms_deisotope-0.0.13 to build tracker '/tmp/pip-req-tracker-wlr9xe9d'
    Running setup.py (path:/tmp/pip-req-build-8vzo4lan/setup.py) egg_info for package from file:///mnt/Downloads/ms_deisotope-0.0.13
    Running command python setup.py egg_info
    Version is: '0.0.13'
    Installation requires `brainpy`, install with `python -m pip install brain-isotopic-distribution`
    No module named 'brainpy'
    Version is: '0.0.13'
    running egg_info
    creating /tmp/pip-req-build-8vzo4lan/pip-egg-info/ms_deisotope.egg-info
    writing /tmp/pip-req-build-8vzo4lan/pip-egg-info/ms_deisotope.egg-info/PKG-INFO
    writing dependency_links to /tmp/pip-req-build-8vzo4lan/pip-egg-info/ms_deisotope.egg-info/dependency_links.txt
    writing entry points to /tmp/pip-req-build-8vzo4lan/pip-egg-info/ms_deisotope.egg-info/entry_points.txt
    writing requirements to /tmp/pip-req-build-8vzo4lan/pip-egg-info/ms_deisotope.egg-info/requires.txt
    writing top-level names to /tmp/pip-req-build-8vzo4lan/pip-egg-info/ms_deisotope.egg-info/top_level.txt
    writing manifest file '/tmp/pip-req-build-8vzo4lan/pip-egg-info/ms_deisotope.egg-info/SOURCES.txt'
    reading manifest file '/tmp/pip-req-build-8vzo4lan/pip-egg-info/ms_deisotope.egg-info/SOURCES.txt'
    reading manifest template 'MANIFEST.in'
    warning: no files found matching '*.h' under directory 'ms_deisotope'
    warning: no previously-included files matching '*.pyd' found under directory 'ms_deisotope'
    warning: no previously-included files matching '*' found under directory 'ms_deisotope/test/test_data'
    writing manifest file '/tmp/pip-req-build-8vzo4lan/pip-egg-info/ms_deisotope.egg-info/SOURCES.txt'
    ***************************************************************************
    WARNING: The C extension could not be compiled, speedups are not enabled.
    Plain-Python build succeeded.
    ***************************************************************************
  Source in /tmp/pip-req-build-8vzo4lan has version 0.0.13, which satisfies requirement ms-deisotope==0.0.13 from file:///mnt/Downloads/ms_deisotope-0.0.13
  Removed ms-deisotope==0.0.13 from file:///mnt/Downloads/ms_deisotope-0.0.13 from build tracker '/tmp/pip-req-tracker-wlr9xe9d'
cd ms_deisotope-0.0.13
pip install -v cython numpy brain-isotopic-distribution .

Doesnt work either, since brainpy is built, but not available to ms_deisotope at that point.

So I guess when installing ms_deisotope from pip, I need to install brainpy manually with a separate pip call before, which is a bit annoying, but rather a problem of pymzMLs or python/pip dependency management, but please correct me if I'm wrong.

Ah, right. Build time dependencies. Thank you for getting the installation log. In order to build the C-extensions, you need Cython, numpy, ms_peak_picker, and brain-isotopic-distribution compiled and installed prior to executing pip install ms_deisotope, and because pip squelches any messages that do not actually kill the build, nobody would know this is happening.

Right now, what you need to do is the following to make sure all build-time dependencies are in place in-order:

pip install Cython numpy
pip install brain-isotopic-distribution
pip install  ms_peak_picker
pip install ms_deisotope

This sounds like it needs to be tackled both as a documentation issue and a build system issue.

I'll cut a release tonight that explicitly lists these instructions, patches the pure Python implementation on PyPI, and start looking into the recent build system tooling that is supposed to make build time dependencies reasonable to use.

Okay. A 0.0.14 release for ms_deisotope is live on PyPI which has all of the above changes and PEP 517/518 build isolation baked in, as does ms_peak_picker and brainpy, so they will ensure that all their build time dependencies are available first.

Testing with a clean environment seemed to work for me, but I am still uncertain I set this up correctly. Please let me know if they work for you.

I tested everything locally and using CI/CD, your fixes resolved the problem
Thank you really much for resolving this issue that fast!