Beispiel #1
0
    def assign_formula(self, features, for_adducts, with_tol_ppm=10.0):
        """
        assign molecular formula to features using multiprocessing module
        :param for_adducts: string adducts list
        :param features: list or set ? of features
        :param with_tol_ppm: mz tolerance in order to perform the look up
        :return: dictionary with key: feature, value: list of metabolites
        """
        m_count, not_found = 0, 0
        for for_adduct in for_adducts:
            formula = Formula.from_str(for_adduct)
            logging.info("searching for adducts: {}".format(str(formula)))

            # pool = billiard.Pool(processes=billiard.cpu_count())
            # args = [(self.HMDB_FILE, f, formula, with_tol_ppm) for f in features]
            # metabs = pool.map(search_metabolites_for, args, chunksize=20)
            # pool.close()

            #DEBUG CODE
            metabolites = []
            for f in features:
                metabolites.append(search_metabolites_for((self.HMDB_FILE, f, formula, with_tol_ppm)))

            # create Annotation objects

            for f, metabs in izip(features, metabolites):
                if not metabs:
                    not_found += 1
                else:
                    m_count += len(metabs)
                for_adducts_str = '[M{}{}]='.format('-' if f.polarity > 0 else '+', formula)
                f.annotations += [Annotation(m, for_adducts_str) for m in metabs]
        return m_count, not_found