def exact_mean_open_shut_time(mec, tres): """ Calculate exact mean open or shut time from HJC probability density function. Parameters ---------- tres : float Time resolution (dead time). QAA : array_like, shape (kA, kA) QFF : array_like, shape (kF, kF) QAF : array_like, shape (kA, kF) QAA, QFF, QAF - submatrices of Q. kA : int A number of open states in kinetic scheme. kF : int A number of shut states in kinetic scheme. GAF : array_like, shape (kA, kB) GFA : array_like, shape (kB, kA) GAF, GFA- transition probabilities Returns ------- mean : float Apparent mean open/shut time. """ GAF, GFA = qml.iGs(mec.Q, mec.kA, mec.kF) expQFF = qml.expQt(mec.QFF, tres) expQAA = qml.expQt(mec.QAA, tres) eGAF = qml.eGs(GAF, GFA, mec.kA, mec.kF, expQFF) eGFA = qml.eGs(GFA, GAF, mec.kF, mec.kA, expQAA) phiA = qml.phiHJC(eGAF, eGFA, mec.kA) phiF = qml.phiHJC(eGFA, eGAF, mec.kF) QexpQF = np.dot(mec.QAF, expQFF) QexpQA = np.dot(mec.QFA, expQAA) DARS = qml.dARSdS(tres, mec.QAA, mec.QFF, GAF, GFA, expQFF, mec.kA, mec.kF) DFRS = qml.dARSdS(tres, mec.QFF, mec.QAA, GFA, GAF, expQAA, mec.kF, mec.kA) uF, uA = np.ones((mec.kF, 1)), np.ones((mec.kA, 1)) # meanOpenTime = tres + phiA * DARS * QexpQF * uF meanA = tres + np.dot(phiA, np.dot(np.dot(DARS, QexpQF), uF))[0] meanF = tres + np.dot(phiF, np.dot(np.dot(DFRS, QexpQA), uA))[0] return meanA, meanF
def HJC_adjacent_mean_open_to_shut_time_pdf(sht, tres, Q, QAA, QAF, QFF, QFA): """ Calculate theoretical HJC (with missed events correction) mean open time given previous/next gap length (continuous function; CHS96 Eq.3.5). Parameters ---------- sht : array of floats Shut time interval. tres : float Time resolution. Q : array, shape (k,k) Q matrix. QAA, QAF, QFF, QFA : array_like Submatrices of Q. Returns ------- mp : ndarray of floats Mean open time given previous gap length. mn : ndarray of floats Mean open time given next gap length. """ kA, kF = QAA.shape[0], QFF.shape[0] uA = np.ones((kA))[:,np.newaxis] uF = np.ones((kF))[:,np.newaxis] expQFF = qml.expQt(QFF, tres) expQAA = qml.expQt(QAA, tres) GAF, GFA = qml.iGs(Q, kA, kF) eGAF = qml.eGs(GAF, GFA, kA, kF, expQFF) eGFA = qml.eGs(GFA, GAF, kF, kA, expQAA) phiA = qml.phiHJC(eGAF, eGFA, kA) phiF = qml.phiHJC(eGFA, eGAF, kF) DARS = qml.dARSdS(tres, QAA, QFF, GAF, GFA, expQFF, kA, kF) eigs, A = qml.eigs(-Q) Feigvals, FZ00, FZ10, FZ11 = qml.Zxx(Q, eigs, A, kA, QAA, QFA, QAF, expQAA, False) Froots = asymptotic_roots(tres, QFF, QAA, QFA, QAF, kF, kA) FR = qml.AR(Froots, tres, QFF, QAA, QFA, QAF, kF, kA) Q1 = np.dot(np.dot(DARS, QAF), expQFF) col1 = np.dot(Q1, uF) row1 = np.dot(phiA, Q1) mp = [] mn = [] for t in sht: eGFAt = qml.eGAF(t, tres, Feigvals, FZ00, FZ10, FZ11, Froots, FR, QFA, expQAA) denom = np.dot(np.dot(phiF, eGFAt), uA)[0] nom1 = np.dot(np.dot(phiF, eGFAt), col1)[0] nom2 = np.dot(np.dot(row1, eGFAt), uA)[0] mp.append(nom1 / denom) mn.append(nom2 / denom) return np.array(mp), np.array(mn)