Source code for fluxpyt.mid_vec_gen

# -*- coding: utf-8 -*-
"""
Generate correction vector for a given natural isotope distribution vector and number of atomic elements
    iDist = isotope_dist = isotopomer distribution vector of the atom
    ele = num_atom = number of elements of the same atom
Similar to corr_vect = cVectGen(iDist, ele) in openFLux  by  Lake-Ee Quek, AIBN
Created on Mon Jul 18 16:44:48 2016

@author: Trunil
"""
import numpy as np

from fluxpyt.utility import size,nCr,find,prod
from scipy.signal import convolve

#import sys
    
    
[docs]def mid_vec_gen(iDist,ele=0): #similar to cVectGen in openflux if ele == 0: corr_vect = [] if ele == 1: corr_vect = iDist if size([corr_vect]) == 1: corr_vect = corr_vect # print('corr_vect is as follows:') # for a in corr_vect: # print(round(a,4)) return corr_vect if len(iDist) == 2: p = iDist[0] q = iDist[1] corr_vect = [] for count in range(ele+1): corr_vect.append(nCr(ele,count) * p**(ele-count) * q**(count) ) # print('corr_vect is as follows:') # for a in corr_vect: # print(round(a,4)) return corr_vect no = len(iDist) start_comb = [] for i in range(ele): start_comb.append(0) start_comb = np.array([start_comb]) cont = 1 comb_store = start_comb count = 0 while cont == 1: comb_ini = np.copy(comb_store[-1]) comb_ini[ele-1] = comb_ini[ele-1]+1 if comb_ini[ele-1] == no: i = ele-1 while i >= 0: if comb_ini[i] < no-1: comb_ini[i] = comb_ini[i] + 1 comb_ini[i+1::] = 0 break if i == 0: cont = 0 i -= 1 if cont == 1: comb_store = np.vstack((comb_store,comb_ini)) count += 1 sum_vect = sum_row(comb_store) # print('sum_vect',sum_vect) corr_vect = [] # print('sum_vect',sum_vect) tmp = [] p = 0 for i in range(min(sum_vect),max(sum_vect)+1): hit = find(sum_vect,i) sum_prob = 0 for j in range(len(hit)): sub_comb_store = comb_store[hit[j]] # print('sub_comb_store',sub_comb_store) p += len(sub_comb_store) sub_iDist = [iDist[k] for k in sub_comb_store] sum_prob = sum_prob + prod([sub_iDist])[0] corr_vect.append(sum_prob) # print('corr_vect is as follows:') # for a in corr_vect: # print(round(a,4)) return corr_vect
[docs]def mid_round(vector): v = [] for n in vector: v.append(round(n,4)) return v
[docs]def sum_row(matrix): s = [] for r in matrix: s.append(sum(r)) return s
[docs]def test(): nat = [0.9893, 0.0107] lab = [0.01,0.99] a = [x*0.99 for x in convolve(lab,mid_vec_gen(nat,2))] b = [x*0.01 for x in mid_vec_gen(nat,3)] c = [x+y for x,y in zip(a,b)] # print(a,'\n',c) d = [x-y for x,y in zip(c,a)] d = mid_vec_gen(lab,2) print(d)
#test()