/* ******************************************* */ DBL_TYPE ExplHairpin( int i, int j, int seq[], int seqlength, int **etaN) { //this version disallows nicks here DBL_TYPE energy = 0; int index; int nNicks = 0; index = EtaNIndex(i+0.5, j-0.5, seqlength); nNicks = etaN[ index][0]; if( nNicks >= 1) return 0; if( nNicks == 0 && j-i <= 3) { return 0; } if( nNicks == 0) { energy = HairpinEnergy( i, j, seq); } if( energy == NAD_INFINITY) { return 0.0; } return EXP_FUNC( -energy/( kB*TEMP_K) ); }
void CapR::CalcHairpinProbability(vector<double> &hairpin_probability){ for(int x = 1; x <=_seq_length;x++){ double temp = 0.0; int type = 0; bool flag = 0; double h_energy = 0.0; for(int i = max(1,x-_maximal_span);i<x ;i++){ for(int j = x+1; j<=min(i+_maximal_span,_seq_length);j++){ type = BP_pair[_int_sequence[i]][_int_sequence[j]]; if(_Beta_stemend[i][j-i-1] != -INF){ h_energy = _Beta_stemend[i][j-i-1] + HairpinEnergy(type, i,j); temp = flag == 1 ? logsumexp(temp, h_energy) : h_energy; flag = 1; } } } if(flag == 1){ hairpin_probability[x-1] = exp(temp-_Alpha_outer[_seq_length]); }else{ hairpin_probability[x-1] = 0.0; } } }
void CapR::CalcInsideVariable(){ for (int j =TURN+1; j <= _seq_length; j++){ for (int i=j-TURN; i >= max(0,j-_maximal_span-1); i--){ //Alpha_stem int type = BP_pair[_int_sequence[i+1]][_int_sequence[j]]; int type2 = BP_pair[_int_sequence[i+2]][_int_sequence[j-1]]; double temp = 0; bool flag = 0; if (type != 0) { type2 = rtype[type2]; if(_Alpha_stem[i+1][j-i-2] != -INF){ //Stem¨Stem if(type2 != 0){ temp = _Alpha_stem[i+1][j-i-2]+ LoopEnergy(type, type2,i+1,j,i+2,j-1); } flag = 1; } if(_Alpha_stemend[i+1][j-i-2] != -INF){ //Stem¨StemEnd temp = flag == 1 ? logsumexp(temp,_Alpha_stemend[i+1][j-i-2]) : _Alpha_stemend[i+1][j-i-2]; flag = 1; } _Alpha_stem[i][j-i] = flag == 0 ? -INF : temp; }else{ _Alpha_stem[i][j-i] = -INF; } //Alpha_multiBif temp = 0; flag = 0; for (int k=i+1; k<=j-1; k++){ if(_Alpha_multi1[i][k-i] != -INF && _Alpha_multi2[k][j-k] != -INF){ temp = flag == 0 ? _Alpha_multi1[i][k-i]+_Alpha_multi2[k][j-k] : logsumexp(temp,_Alpha_multi1[i][k-i]+_Alpha_multi2[k][j-k]); flag = 1; } } _Alpha_multibif[i][j-i] = flag == 0 ? -INF : temp; //Alpha_multi2 temp = 0; flag = 0; if (type != 0) { if(_Alpha_stem[i][j-i] != -INF){ temp = _Alpha_stem[i][j-i]+MLintern+CalcDangleEnergy(type,i,j); flag = 1; } } if(_Alpha_multi2[i][j-i-1] != -INF){ _Alpha_multi2[i][j-i] = _Alpha_multi2[i][j-i-1]+MLbase; if(flag == 1){ _Alpha_multi2[i][j-i] = logsumexp(temp,_Alpha_multi2[i][j-i]); } }else{ _Alpha_multi2[i][j-i] = flag == 0 ? -INF : temp; } //Alpha_multi1 if(_Alpha_multi2[i][j-i] != -INF && _Alpha_multibif[i][j-i] != -INF){ _Alpha_multi1[i][j-i] = logsumexp(_Alpha_multi2[i][j-i],_Alpha_multibif[i][j-i]); }else if(_Alpha_multi2[i][j-i] == -INF){ _Alpha_multi1[i][j-i] = _Alpha_multibif[i][j-i]; }else if(_Alpha_multibif[i][j-i] == -INF){ _Alpha_multi1[i][j-i] = _Alpha_multi2[i][j-i]; }else{ _Alpha_multi1[i][j-i] = -INF; } //Alpha_multi flag = 0; if(_Alpha_multi[i+1][j-i-1] != -INF){ _Alpha_multi[i][j-i] = _Alpha_multi[i+1][j-i-1]+MLbase; flag = 1; } if(flag == 1){ if(_Alpha_multibif[i][j-i] != -INF){ _Alpha_multi[i][j-i] = logsumexp(_Alpha_multi[i][j-i],_Alpha_multibif[i][j-i]); } }else{ _Alpha_multi[i][j-i] = _Alpha_multibif[i][j-i]; } //Alpha_stemend if(j != _seq_length){ temp = 0; type = BP_pair[_int_sequence[i]][_int_sequence[j+1]]; if (type!=0) { //StemEnd¨sn temp = HairpinEnergy(type, i,j+1); //StemEnd¨sm_Stem_sn for (int p =i; p <= min(i+MAXLOOP,j-TURN-2); p++) { int u1 = p-i; for (int q=max(p+TURN+2,j-MAXLOOP+u1); q<=j; q++) { type2 = BP_pair[_int_sequence[p+1]][_int_sequence[q]]; if(_Alpha_stem[p][q-p] != -INF){ if (type2 != 0 && !(p == i && q == j)) { type2 = rtype[type2]; temp = logsumexp(temp,_Alpha_stem[p][q-p]+LoopEnergy(type, type2,i,j+1,p+1,q)); } } } } //StemEnd¨Multi int tt = rtype[type]; temp = logsumexp(temp,_Alpha_multi[i][j-i]+MLclosing+MLintern+dangle3[tt][_int_sequence[i+1]]+dangle5[tt][_int_sequence[j]]); _Alpha_stemend[i][j-i] = temp; }else{ _Alpha_stemend[i][j-i] = -INF; } } } } //Alpha_Outer for(int i = 1;i <= _seq_length;i++){ double temp = _Alpha_outer[i-1]; for(int p = max(0,i-_maximal_span-1); p <i;p++){ if(_Alpha_stem[p][i-p] != -INF){ int type = BP_pair[_int_sequence[p+1]][_int_sequence[i]]; double ao = _Alpha_stem[p][i-p]+CalcDangleEnergy(type,p,i); temp = logsumexp(temp,ao+_Alpha_outer[p]); } } _Alpha_outer[i] = temp; } }