def get_contributions(ctc, dall, dctc, ltemp): if ctc not in dctc.keys(): return None # Only one conformer? if len(dctc[ctc]._itcs) == 1: itc, weight = dctc[ctc]._itcs[0] dchi = {itc: [1.0 for T in ltemp]} return dchi # Get total partition function V0, V1, PFN = dall["pfn"]["%s.msho" % ctc] # Get ratios dchi = {} for itc, weight in dctc[ctc]._itcs: # Get individual partition functions try: V0i, V1i, PFNi = dall["pfn"][PN.struckey(ctc, itc)] # Calculate contribution dE = (V1i - V1) exp_arg = [-dE / pc.KB / T for T in ltemp] ratio_pfn = [weight * pfi / pftot for pfi, pftot in zip(PFNi, PFN)] chi_i = [ aa * fncs.exp128(bb) for aa, bb in zip(ratio_pfn, exp_arg) ] dchi[itc] = np.array(chi_i) except: exception = Exc.LostConformer(Exception) exception._var = PN.struckey(ctc, itc) raise exception # Return data return dchi
def get_TSratios(ctc, itcs, V1TS, QTS, ltemp, dall): ''' ratio = QTS(i)/QTS * exp(-dE(i) * beta) ''' exception = Exc.LostConformer(Exception) tst_ratios = {} for itc, weight in itcs: key = PN.struckey(ctc, itc) if key not in dall["pfn"].keys(): exception._var = key raise exception V0_i, V1_i, Q_i = dall["pfn"][key] ratio = [0.0 for T in ltemp] dE = (V1_i - V1TS) for idx, T in enumerate(ltemp): ratio[idx] = weight * Q_i[idx] / QTS[idx] * np.exp(-dE / KB / T) tst_ratios[itc] = ratio # get individual data return tst_ratios