void calcExpectedEffectiveLengths(ModelType& model) { int lb, ub, span; double *pdf = NULL, *cdf = NULL, *clen = NULL; // clen[i] = sigma_{j=1}^{i}pdf[i]*(lb+i) model.getGLD().copyTo(pdf, cdf, lb, ub, span); clen = new double[span + 1]; clen[0] = 0.0; for (int i = 1; i <= span; i++) { clen[i] = clen[i - 1] + pdf[i] * (lb + i); } eel.clear(); eel.resize(M + 1, 0.0); for (int i = 1; i <= M; i++) { int totLen = refs.getRef(i).getTotLen(); int fullLen = refs.getRef(i).getFullLen(); int pos1 = max(min(totLen - fullLen + 1, ub) - lb, 0); int pos2 = max(min(totLen, ub) - lb, 0); if (pos2 == 0) { eel[i] = 0.0; continue; } eel[i] = fullLen * cdf[pos1] + ((cdf[pos2] - cdf[pos1]) * (totLen + 1) - (clen[pos2] - clen[pos1])); assert(eel[i] >= 0); if (eel[i] < MINEEL) { eel[i] = 0.0; } } delete[] pdf; delete[] cdf; delete[] clen; }