コード例 #1
0
ファイル: pk_interrupted.py プロジェクト: rampasek/RNArobo
def re_evaluate_pk_with_IB(pk_dic_ib, INIT, PENALTY):
    """ Function: re_evaluate_pk_with_IB()

        Purpose:  Calculate pseudoknot free energies under energy model LongPK
                  where one of the stems is interrupted. Take into account
                  recursive structure elements which can occur in loops L1 and L3.               
                  
        Input:    Dictionary with pseudoknots where one of the stems is
                  interrupted.
        
        Return:   Dictionary with pseudoknots and associated free energy. 

    """ 
    for pk_stem, values in pk_dic_ib.items():

        if values[1] or values[2] or values[3]:
            list1 = values[1]
            list2 = values[2]
            list3 = values[3]                   
            l1 = values[0][1]
            l2 = values[0][2]     
            l3 = values[0][3]
            entropy_l1, energy_l1, entropy_l2, energy_l2, entropy_l3, energy_l3 = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0            
            energy = values[0][4]         # Store stem energies for S1 and S2
            
            # Calculate effective loop lengths
            if list1:
                energy_l1 = sum([item[3] for item in list1])          # Add free energies
                effective_l1 = functions.effective_length(list1, l1)  # Calculate effective loop length    
            else:
                effective_l1 = l1
                
            if list2:
                energy_l2 = sum([item[3] for item in list2])          # Add free energies
                effective_l2 = functions.effective_length(list2, l2)  # Calculate effective loop length                      
            else:
                effective_l2 = l2
                
            if list3:
                energy_l3 = sum([item[3] for item in list3])          # Add free energies
                effective_l3 = functions.effective_length(list3, l3)  # Calculate effective loop length                    
            else:
                effective_l3 = l3
                
            looplength = effective_l1 + effective_l2 + effective_l3            
            entropy = PENALTY*(looplength)
            
            pk_energy = energy + entropy + energy_l1 + energy_l2 + energy_l3 + INIT

            # Only include internal loop energies if this leads to more stable pseudoknots
            if pk_energy < values[0][0]:
                pk_dic_ib[pk_stem] = pk_energy, values[1], values[2], values[3]
            else:
                energy = values[0][0]
                pk_dic_ib[pk_stem] = energy, [], [], []                                           
        else:
            energy = values[0][0]
            pk_dic_ib[pk_stem] = energy, values[1], values[2], values[3]

    return pk_dic_ib
コード例 #2
0
def re_evaluate_pk_with_IB(pk_dic_ib, INIT, PENALTY):
    """ Function: re_evaluate_pk_with_IB()

        Purpose:  Calculate pseudoknot free energies under energy model LongPK
                  where one of the stems is interrupted. Take into account
                  recursive structure elements which can occur in loops L1 and L3.               
                  
        Input:    Dictionary with pseudoknots where one of the stems is
                  interrupted.
        
        Return:   Dictionary with pseudoknots and associated free energy. 

    """
    for pk_stem, values in pk_dic_ib.items():

        if values[1] or values[2] or values[3]:
            list1 = values[1]
            list2 = values[2]
            list3 = values[3]
            l1 = values[0][1]
            l2 = values[0][2]
            l3 = values[0][3]
            entropy_l1, energy_l1, entropy_l2, energy_l2, entropy_l3, energy_l3 = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
            energy = values[0][4]  # Store stem energies for S1 and S2

            # Calculate effective loop lengths
            if list1:
                energy_l1 = sum([item[3]
                                 for item in list1])  # Add free energies
                effective_l1 = functions.effective_length(
                    list1, l1)  # Calculate effective loop length
            else:
                effective_l1 = l1

            if list2:
                energy_l2 = sum([item[3]
                                 for item in list2])  # Add free energies
                effective_l2 = functions.effective_length(
                    list2, l2)  # Calculate effective loop length
            else:
                effective_l2 = l2

            if list3:
                energy_l3 = sum([item[3]
                                 for item in list3])  # Add free energies
                effective_l3 = functions.effective_length(
                    list3, l3)  # Calculate effective loop length
            else:
                effective_l3 = l3

            looplength = effective_l1 + effective_l2 + effective_l3
            entropy = PENALTY * (looplength)

            pk_energy = energy + entropy + energy_l1 + energy_l2 + energy_l3 + INIT

            # Only include internal loop energies if this leads to more stable pseudoknots
            if pk_energy < values[0][0]:
                pk_dic_ib[pk_stem] = pk_energy, values[1], values[2], values[3]
            else:
                energy = values[0][0]
                pk_dic_ib[pk_stem] = energy, [], [], []
        else:
            energy = values[0][0]
            pk_dic_ib[pk_stem] = energy, values[1], values[2], values[3]

    return pk_dic_ib
コード例 #3
0
ファイル: cc09.py プロジェクト: rampasek/RNArobo
def pk_energy_reevaluation_09(pk_dic_cc09, entropies_dic, entropies_dic_L1, entropies_dic_L3):
    """ Function: pk_energy_reevaluation_09()

        Purpose:  Energy evaluation for pseudoknots with energy parameters CC09.
                  Take into account recursive structure elements which can 
                  occur in loops L1 and L3.  
                  
        Input:    Dictionary with pseudoknots where 2 <= L2 <= 6.
        
        Return:   Dictionary with recursive pseudoknots and associated free energy. 
    """      
    pk_dic_cc09_result = {}
  
    for pk_stem, values in pk_dic_cc09.items():
        entropy = 0.0
        list1 = values[1]
        list3 = values[3]
    
        if list1 or list3:
            i, j, k, l = pk_stem[2], pk_stem[3], pk_stem[5], pk_stem[6]
            stemlength1 = pk_stem[4]                        
            stemlength2 = pk_stem[7]  
                                                                  
            l1 = k - (i + stemlength1)
            l2 = (j - stemlength1 + 1) - (k + stemlength2)             
            l3 = (l - stemlength2) - j            
      
            energy_l1, energy_l3 = 0.0, 0.0
      
            if stemlength1 > 10:
                stemlength1 = 10
            if stemlength2 > 10:
                stemlength2 = 10

            effective_l1 = functions.effective_length(list1, l1) # Calculate effective loop length                
            effective_l3 = functions.effective_length(list3, l3) # Calculate effective loop length       

            if list1:   
                energy_l1 = sum([item[3] for item in list1])    # Add free energies        
                                              
            if list3:   
                energy_l3 = sum([item[3] for item in list3])    # Add free energies
                             
            if effective_l1 <= 7 and effective_l3 <= 7:   
                quintet = stemlength1, stemlength2, effective_l1, effective_l3, l2
                if quintet in entropies_dic:
                    entropy = entropies_dic[quintet]
                  
            elif effective_l1 <= 7 and effective_l3 > 7:          
                quintet = stemlength1, stemlength2, effective_l1, 'long', l2
                if quintet in entropies_dic_L3:
                    a_b = entropies_dic_L3[quintet]
                    entropy = a_b[0] * math.log(effective_l3) + a_b[1]
                
            elif effective_l1 > 7 and effective_l3 <= 7:             
                quintet = stemlength1, stemlength2, 'long', effective_l3, l2                   
                if quintet in entropies_dic_L1:
                    a_b = entropies_dic_L1[quintet]
                    entropy = a_b[0] * math.log(effective_l1) + a_b[1]     
                                       
            elif effective_l1 > 7 and effective_l3 > 7:   
                quintet = stemlength1, stemlength2, effective_l1, 'long', l2
                if quintet in entropies_dic_L3:
                    a_b = entropies_dic_L3[quintet]
                    entropy = a_b[0] * math.log(l3) + a_b[1]
            else:
                entropy = 0.0
        
            stack_s1 = values[0][1]
            stack_s2 = values[0][2]   
            
            pk_energy = stack_s1 + stack_s2 - (0.62 * entropy) + energy_l1 + energy_l3 
            
            if entropy:
                if pk_energy < 0.0:
                    if pk_energy < values[0][0]:                 
                        pk_dic_cc09_result[pk_stem] = pk_energy, values[1], values[2], values[3]
                    else:
                        pk_dic_cc09_result[pk_stem] = values[0][0], [], [], []                            
        else:
            pk_energy = pk_dic_cc09[pk_stem][0][0]
            pk_dic_cc09_result[pk_stem] = pk_energy, values[1], values[2], values[3]                
        
    return pk_dic_cc09_result
コード例 #4
0
ファイル: longPK.py プロジェクト: rampasek/RNArobo
def pk_energy_reevaluation_long(pk_dic_longpk, INIT, PENALTY):
    """ Function: pk_energy_reevaluation_long()

        Purpose:  Calculate pseudoknot free energies under energy model LongPK. 
                  Take into account recursive structure elements which can 
                  occur in loops L1, L2 and L3.               
                  
        Input:    Dictionary with recursive pseudoknots where L2 >= 7.
        
        Return:   Dictionary with recursive pseudoknots and associated free energy. 

    """  
    for pk_stem, values in pk_dic_longpk.items():

        list1 = values[1]
        list2 = values[2]
        list3 = values[3]
        
        if list1 or list2 or list3:
            i, j, k, l = pk_stem[2], pk_stem[3], pk_stem[5], pk_stem[6]
            
            stem1 = i, j        
            stemlength1 = pk_stem[4]
            stem2 = k, l                
            stemlength2 = pk_stem[7]  
            stack_s1 = values[0][1]
            stack_s2 = values[0][2]
            
            l1 = values[0][3]
            l2 = values[0][4]     
            l3 = values[0][5]                                                
            
            entropy_l1, energy_l1 = 0.0, 0.0
            entropy_l2, energy_l2 = 0.0, 0.0
            entropy_l3, energy_l3 = 0.0, 0.0            
            
            energy = stack_s1 + stack_s2    # Store stem energies for S1 plus S2

            # Calculate effective loop lengths
            effective_looplength1 = functions.effective_length(list1, l1)
            effective_looplength2 = functions.effective_length(list2, l2)
            effective_looplength3 = functions.effective_length(list3, l3)
                                    
            if list1:      
                energy_l1 = sum([item[3] for item in list1])      # Add free energies          
                      
            if list2:            
                energy_l2 = sum([item[3] for item in list2])      # Add free energies
                                       
            if list3:       
                energy_l3 = sum([item[3] for item in list3])      # Add free energies    
            
            # Calculate free energy of pseudoknot
            entropy = PENALTY * (effective_looplength1 + effective_looplength2 + effective_looplength3)

            pk_energy = stack_s1 + stack_s2 + entropy + energy_l1 + energy_l2 + energy_l3 + INIT
            
            if pk_energy < values[0][0]:
                pk_dic_longpk[pk_stem] = pk_energy, values[1], values[2], values[3]
            else:
                energy = values[0][0]
                pk_dic_longpk[pk_stem] = energy, [], [], []                                           

        else:
            energy = values[0][0]
            pk_dic_longpk[pk_stem] = energy, values[1], values[2], values[3]
              
    return pk_dic_longpk
コード例 #5
0
def traceback_mwis_2d(seq, array, MAX_LOOP_UPPER):
    """ Function: traceback_mwis_2d()

        Purpose:  Traceback.              
                  
        Input:    Dynamic programming matrix.
        
        Return:   Result for each loop interval plus effective looplength. 
    """
    # Traceback for given loop interval
    array_traceback = [[(0.0, None) for i in xrange(len(seq) + 1)]
                       for j in xrange(len(seq) + 1)]

    for i in xrange(1, len(seq)):
        for j in xrange(i - 1, len(seq)):

            if j - i + 1 <= MAX_LOOP_UPPER:

                energy = array[i][j][0]
                loop_start = i
                loop_end = j
                elements = []

                #if energy != 0.0:
                energy = array[loop_start][loop_end][0]
                element = array[loop_start][loop_end][1]
                new_loop_end = loop_end

                if element:
                    elements.append(element)
                    energy = array[loop_start][loop_end][0] - element[3]
                    new_loop_end = element[0]

                while round(energy, 2) != 0.0:
                    element = array[loop_start][new_loop_end][1]
                    if element:
                        elements.append(element)
                        energy = array[loop_start][new_loop_end][0] - element[3]
                        new_loop_end = element[0]
                    elif new_loop_end > loop_start:
                        new_loop_end = new_loop_end - 1
                    else:
                        break

                # Calculate effective loop length
                looplength = loop_end - loop_start + 1
                effective_looplength = functions.effective_length(
                    elements, looplength)

                #else:
                #    effective_looplength = j - i + 1

                array_traceback[i][j] = array[i][j][
                    0], elements, effective_looplength
    """mwis_2d_file = file("mwis_2d_file.txt",'w')
    for index, item in enumerate(array_traceback):        
        for index2, item2 in enumerate(array_traceback[index]):
            #if item2[0] != 0.0 and item2[1] != [] and index < index2:
            mwis_2d_file.write(str(index))
            mwis_2d_file.write(" ")            
            mwis_2d_file.write(str(index2))
            mwis_2d_file.write(" result ")
            mwis_2d_file.write(str(item2))
            mwis_2d_file.write("\n")"""

    return array_traceback
コード例 #6
0
def pk_energy_reevaluation_06(pk_dic_cc06):
    """ Function: pk_energy_reevaluation_06()

        Purpose:  Calculate pseudoknot free energies under energy model CC06. 
                  Take into account recursive structure elements which can 
                  occur in loops L1 and L3.               
                  
        Input:    Dictionary with recursive pseudoknots where L2 <= 1.
        
        Return:   Dictionary with recursive pseudoknots and associated free energy. 

    """
    for pk_stem, values in pk_dic_cc06.items():

        i, j, k, l = pk_stem[2], pk_stem[3], pk_stem[5], pk_stem[6]
        stemlength1 = pk_stem[4]
        stemlength2 = pk_stem[7]

        l1 = k - (i + stemlength1)
        l2 = (j - stemlength1 + 1) - (k + stemlength2)
        l3 = (l - stemlength2) - j

        list1 = values[1]
        list3 = values[3]

        if list1:
            energy_l1 = sum([item[3] for item in list1])  # Add free energies
            effective_l1 = functions.effective_length(
                list1, l1)  # Calculate effective loop length

            if stemlength2 > 12:
                stemlength2 = 12

            # Calculate loop entropy for L1 dependent on stem S2
            loop1_stem2 = effective_l1, stemlength2

            if loop1_stem2 in loop1_dic_cc:
                entropy_l1 = 0.62 * loop1_dic_cc[loop1_stem2]
            else:
                if effective_l1 > 0:
                    ln_w_coil = 2.14 * effective_l1 + 0.10
                    fitting = lmin_S2[stemlength2]
                    l_min = fitting[0]
                    ln_w = fitting[1] * math.log(
                        effective_l1 - l_min + 1) + fitting[2] * (
                            effective_l1 - l_min + 1) + fitting[3]
                    entropy_l1 = 0.62 * (ln_w_coil - ln_w)
        else:
            energy_l1 = 0.0
            entropy_l1 = values[0][3]

        if list3:
            energy_l3 = sum([item[3] for item in list3])  # Add free energies
            effective_l3 = functions.effective_length(
                list3, l3)  # Calculate effective loop length

            if stemlength1 > 12:
                stemlength1 = 12

            # Calculate loop entropy for L3 dependent on stem S1
            loop3_stem1 = effective_l3, stemlength1

            if loop3_stem1 in loop3_dic_cc:
                entropy_l3 = 0.62 * loop3_dic_cc[loop3_stem1]
            else:
                if effective_l3 > 1:
                    ln_w_coil = 2.14 * effective_l3 + 0.10
                    fitting = lmin_S1[stemlength1]
                    l_min = fitting[0]
                    ln_w = fitting[1] * math.log(
                        effective_l3 - l_min + 1) + fitting[2] * (
                            effective_l3 - l_min + 1) + fitting[3]
                    entropy_l3 = 0.62 * (ln_w_coil - ln_w)
        else:
            energy_l3 = 0.0
            entropy_l3 = values[0][5]

        stack_s1 = values[0][1]
        stack_s2 = values[0][2]

        energy = stack_s1 + stack_s2 + entropy_l1 + energy_l1 + entropy_l3 + energy_l3 + 1.3 + values[
            0][6]

        if energy < values[0][0]:  # If recursive elements stabilize pseudoknot
            pk_dic_cc06[pk_stem] = energy, values[1], values[2], values[3]
        else:
            energy = values[0][0]
            pk_dic_cc06[pk_stem] = energy, [], [], []

    return pk_dic_cc06
コード例 #7
0
def traceback_mwis_2d_positive(seq, array, MAX_LOOP_UPPER):
    """ Function: traceback_mwis_2d_positive()

        Purpose:  Traceback for positive weights.              
                  
        Input:    Dynamic programming matrix.
        
        Return:   Result for each loop interval plus effective looplength. 
    """
    # Traceback for given loop interval
    rows = len(seq)
    columns = len(seq)
    array_traceback = [[(0.0, None, None) for i in xrange(columns + 1)]
                       for j in xrange(rows + 1)]

    for i in xrange(1, len(seq)):
        for j in xrange(i - 1, len(seq)):

            if j - i + 1 <= MAX_LOOP_UPPER:

                energy = array[i][j][0]
                loop_start = i
                loop_end = j
                elements = []

                if energy != 0.0:
                    energy = array[loop_start][loop_end][0]
                    element = array[loop_start][loop_end][1]
                    new_loop_end = loop_end

                    if element:
                        elements.append(element)
                        energy = array[loop_start][loop_end][0] - element[2]
                        new_loop_end = element[0]

                    while round(energy, 2) != 0.0:
                        element = array[loop_start][new_loop_end][1]
                        if element:
                            elements.append(element)
                            energy = array[loop_start][new_loop_end][
                                0] - element[2]
                            new_loop_end = element[0]
                        elif new_loop_end > loop_start:
                            new_loop_end = new_loop_end - 1
                        else:
                            break

                    # Calculate effective loop length
                    looplength = loop_end - loop_start + 1
                    effective_looplength = functions.effective_length(
                        elements, looplength)

                else:
                    effective_looplength = j - i + 1

                array_traceback[i][j] = array[i][j][
                    0], elements, effective_looplength

    # Now write real, positive free energy weights to array
    for i in xrange(1, len(seq)):
        for j in xrange(i - 1, len(seq)):
            elements = array_traceback[i][j][1]
            if elements:
                energy = sum([item[3] for item in elements])
                array_traceback[i][j] = energy, elements, array_traceback[i][
                    j][2]

    return array_traceback
コード例 #8
0
ファイル: cc06.py プロジェクト: rampasek/RNArobo
def pk_energy_reevaluation_06(pk_dic_cc06):
    """ Function: pk_energy_reevaluation_06()

        Purpose:  Calculate pseudoknot free energies under energy model CC06. 
                  Take into account recursive structure elements which can 
                  occur in loops L1 and L3.               
                  
        Input:    Dictionary with recursive pseudoknots where L2 <= 1.
        
        Return:   Dictionary with recursive pseudoknots and associated free energy. 

    """ 
    for pk_stem, values in pk_dic_cc06.items():
    
        i, j, k, l = pk_stem[2], pk_stem[3], pk_stem[5], pk_stem[6]  
        stemlength1 = pk_stem[4]
        stemlength2 = pk_stem[7]
      
        l1 = k - (i + stemlength1)
        l2 = (j - stemlength1 + 1) - (k + stemlength2) 
        l3 = (l - stemlength2) - j
    
        list1 = values[1]
        list3 = values[3]
      
        if list1:   
            energy_l1 = sum([item[3] for item in list1])          # Add free energies
            effective_l1 = functions.effective_length(list1, l1)  # Calculate effective loop length            
        
            if stemlength2 > 12:
                stemlength2 = 12                            
        
            # Calculate loop entropy for L1 dependent on stem S2    
            loop1_stem2 = effective_l1, stemlength2
        
            if loop1_stem2 in loop1_dic_cc:
                entropy_l1 = 0.62 * loop1_dic_cc[loop1_stem2]
            else:
                if effective_l1 > 0:
                    ln_w_coil = 2.14 * effective_l1 + 0.10
                    fitting = lmin_S2[stemlength2]
                    l_min = fitting[0]                    
                    ln_w = fitting[1] * math.log(effective_l1 - l_min + 1) + fitting[2] * (effective_l1 - l_min + 1) + fitting[3]
                    entropy_l1 = 0.62*(ln_w_coil - ln_w)
        else:
            energy_l1 = 0.0
            entropy_l1 = values[0][3]
          
        if list3:   
            energy_l3 = sum([item[3] for item in list3])          # Add free energies
            effective_l3 = functions.effective_length(list3, l3)  # Calculate effective loop length    
                
            if stemlength1 > 12:
                stemlength1 = 12   
        
            # Calculate loop entropy for L3 dependent on stem S1
            loop3_stem1 = effective_l3, stemlength1
        
            if loop3_stem1 in loop3_dic_cc:
                entropy_l3 = 0.62 * loop3_dic_cc[loop3_stem1]
            else:
                if effective_l3 > 1:
                    ln_w_coil = 2.14 * effective_l3 + 0.10
                    fitting = lmin_S1[stemlength1]
                    l_min = fitting[0]
                    ln_w = fitting[1] * math.log(effective_l3 - l_min + 1) + fitting[2] * (effective_l3 - l_min + 1) + fitting[3]
                    entropy_l3 = 0.62*(ln_w_coil - ln_w)    
        else:
            energy_l3 = 0.0
            entropy_l3 = values[0][5]          

        stack_s1 = values[0][1]
        stack_s2 = values[0][2]
      
        energy = stack_s1 + stack_s2 + entropy_l1 + energy_l1 + entropy_l3 + energy_l3 + 1.3 + values[0][6]
      
        if energy < values[0][0]:     # If recursive elements stabilize pseudoknot
            pk_dic_cc06[pk_stem] = energy, values[1], values[2], values[3]
        else:
            energy = values[0][0]
            pk_dic_cc06[pk_stem] = energy, [],[],[]
            
    return pk_dic_cc06
コード例 #9
0
ファイル: mwis_2d.py プロジェクト: rampasek/RNArobo
def traceback_mwis_2d(seq, array, MAX_LOOP_UPPER):    
    """ Function: traceback_mwis_2d()

        Purpose:  Traceback.              
                  
        Input:    Dynamic programming matrix.
        
        Return:   Result for each loop interval plus effective looplength. 
    """
    # Traceback for given loop interval  
    array_traceback = [[(0.0, None) for i in xrange(len(seq) + 1)] for j in xrange(len(seq) + 1)]                 
    
    for i in xrange(1, len(seq)):
        for j in xrange(i-1, len(seq)):       

            if j - i + 1 <= MAX_LOOP_UPPER:
                
                energy = array[i][j][0]
                loop_start = i
                loop_end = j
                elements = []
                
                #if energy != 0.0:
                energy = array[loop_start][loop_end][0]
                element = array[loop_start][loop_end][1]
                new_loop_end = loop_end

                if element:
                    elements.append(element)    
                    energy = array[loop_start][loop_end][0] - element[3]
                    new_loop_end = element[0]    
                    
                while round(energy, 2) != 0.0:
                    element = array[loop_start][new_loop_end][1]
                    if element:
                        elements.append(element)    
                        energy = array[loop_start][new_loop_end][0] - element[3]
                        new_loop_end = element[0]
                    elif new_loop_end > loop_start:
                        new_loop_end = new_loop_end - 1
                    else:
                        break

                # Calculate effective loop length
                looplength = loop_end - loop_start + 1
                effective_looplength = functions.effective_length(elements, looplength)                 

                #else:
                #    effective_looplength = j - i + 1
                
                array_traceback[i][j] = array[i][j][0], elements, effective_looplength


    """mwis_2d_file = file("mwis_2d_file.txt",'w')
    for index, item in enumerate(array_traceback):        
        for index2, item2 in enumerate(array_traceback[index]):
            #if item2[0] != 0.0 and item2[1] != [] and index < index2:
            mwis_2d_file.write(str(index))
            mwis_2d_file.write(" ")            
            mwis_2d_file.write(str(index2))
            mwis_2d_file.write(" result ")
            mwis_2d_file.write(str(item2))
            mwis_2d_file.write("\n")"""

    return array_traceback
コード例 #10
0
ファイル: mwis_2d.py プロジェクト: rampasek/RNArobo
def traceback_mwis_2d_positive(seq, array, MAX_LOOP_UPPER):    
    """ Function: traceback_mwis_2d_positive()

        Purpose:  Traceback for positive weights.              
                  
        Input:    Dynamic programming matrix.
        
        Return:   Result for each loop interval plus effective looplength. 
    """
    # Traceback for given loop interval
    rows = len(seq)        
    columns = len(seq)    
    array_traceback = [[(0.0, None, None)  for i in xrange(columns + 1)] for j in xrange(rows + 1)]                 
    
    for i in xrange(1, len(seq)):
        for j in xrange(i-1, len(seq)):       

            if j - i + 1 <= MAX_LOOP_UPPER:
                
                energy = array[i][j][0]
                loop_start = i
                loop_end = j
                elements = []
                
                if energy != 0.0:
                    energy = array[loop_start][loop_end][0]
                    element = array[loop_start][loop_end][1]
                    new_loop_end = loop_end

                    if element:
                        elements.append(element)    
                        energy = array[loop_start][loop_end][0] - element[2]
                        new_loop_end = element[0]    
                        
                    while round(energy, 2) != 0.0:
                        element = array[loop_start][new_loop_end][1]
                        if element:
                            elements.append(element)    
                            energy = array[loop_start][new_loop_end][0] - element[2]
                            new_loop_end = element[0]
                        elif new_loop_end > loop_start:
                            new_loop_end = new_loop_end - 1
                        else:
                            break

                    # Calculate effective loop length
                    looplength = loop_end - loop_start + 1
                    effective_looplength = functions.effective_length(elements, looplength)                 

                else:                    
                    effective_looplength = j - i + 1
                
                array_traceback[i][j] = array[i][j][0], elements, effective_looplength
                
                    
    # Now write real, positive free energy weights to array
    for i in xrange(1, len(seq)):
        for j in xrange(i-1, len(seq)):
            elements = array_traceback[i][j][1]            
            if elements:                
                energy = sum([item[3] for item in elements])                
                array_traceback[i][j] = energy, elements, array_traceback[i][j][2]
                    
    return array_traceback
コード例 #11
0
def pk_energy_reevaluation_long(pk_dic_longpk, INIT, PENALTY):
    """ Function: pk_energy_reevaluation_long()

        Purpose:  Calculate pseudoknot free energies under energy model LongPK. 
                  Take into account recursive structure elements which can 
                  occur in loops L1, L2 and L3.               
                  
        Input:    Dictionary with recursive pseudoknots where L2 >= 7.
        
        Return:   Dictionary with recursive pseudoknots and associated free energy. 

    """
    for pk_stem, values in pk_dic_longpk.items():

        list1 = values[1]
        list2 = values[2]
        list3 = values[3]

        if list1 or list2 or list3:
            i, j, k, l = pk_stem[2], pk_stem[3], pk_stem[5], pk_stem[6]

            stem1 = i, j
            stemlength1 = pk_stem[4]
            stem2 = k, l
            stemlength2 = pk_stem[7]
            stack_s1 = values[0][1]
            stack_s2 = values[0][2]

            l1 = values[0][3]
            l2 = values[0][4]
            l3 = values[0][5]

            entropy_l1, energy_l1 = 0.0, 0.0
            entropy_l2, energy_l2 = 0.0, 0.0
            entropy_l3, energy_l3 = 0.0, 0.0

            energy = stack_s1 + stack_s2  # Store stem energies for S1 plus S2

            # Calculate effective loop lengths
            effective_looplength1 = functions.effective_length(list1, l1)
            effective_looplength2 = functions.effective_length(list2, l2)
            effective_looplength3 = functions.effective_length(list3, l3)

            if list1:
                energy_l1 = sum([item[3]
                                 for item in list1])  # Add free energies

            if list2:
                energy_l2 = sum([item[3]
                                 for item in list2])  # Add free energies

            if list3:
                energy_l3 = sum([item[3]
                                 for item in list3])  # Add free energies

            # Calculate free energy of pseudoknot
            entropy = PENALTY * (effective_looplength1 +
                                 effective_looplength2 + effective_looplength3)

            pk_energy = stack_s1 + stack_s2 + entropy + energy_l1 + energy_l2 + energy_l3 + INIT

            if pk_energy < values[0][0]:
                pk_dic_longpk[pk_stem] = pk_energy, values[1], values[
                    2], values[3]
            else:
                energy = values[0][0]
                pk_dic_longpk[pk_stem] = energy, [], [], []

        else:
            energy = values[0][0]
            pk_dic_longpk[pk_stem] = energy, values[1], values[2], values[3]

    return pk_dic_longpk
コード例 #12
0
ファイル: cc09.py プロジェクト: PeterKoza/Galaxy-fmfi
def pk_energy_reevaluation_09(pk_dic_cc09, entropies_dic, entropies_dic_L1,
                              entropies_dic_L3):
    """ Function: pk_energy_reevaluation_09()

        Purpose:  Energy evaluation for pseudoknots with energy parameters CC09.
                  Take into account recursive structure elements which can 
                  occur in loops L1 and L3.  
                  
        Input:    Dictionary with pseudoknots where 2 <= L2 <= 6.
        
        Return:   Dictionary with recursive pseudoknots and associated free energy. 
    """
    pk_dic_cc09_result = {}

    for pk_stem, values in pk_dic_cc09.items():
        entropy = 0.0
        list1 = values[1]
        list3 = values[3]

        if list1 or list3:
            i, j, k, l = pk_stem[2], pk_stem[3], pk_stem[5], pk_stem[6]
            stemlength1 = pk_stem[4]
            stemlength2 = pk_stem[7]

            l1 = k - (i + stemlength1)
            l2 = (j - stemlength1 + 1) - (k + stemlength2)
            l3 = (l - stemlength2) - j

            energy_l1, energy_l3 = 0.0, 0.0

            if stemlength1 > 10:
                stemlength1 = 10
            if stemlength2 > 10:
                stemlength2 = 10

            effective_l1 = functions.effective_length(
                list1, l1)  # Calculate effective loop length
            effective_l3 = functions.effective_length(
                list3, l3)  # Calculate effective loop length

            if list1:
                energy_l1 = sum([item[3]
                                 for item in list1])  # Add free energies

            if list3:
                energy_l3 = sum([item[3]
                                 for item in list3])  # Add free energies

            if effective_l1 <= 7 and effective_l3 <= 7:
                quintet = stemlength1, stemlength2, effective_l1, effective_l3, l2
                if quintet in entropies_dic:
                    entropy = entropies_dic[quintet]

            elif effective_l1 <= 7 and effective_l3 > 7:
                quintet = stemlength1, stemlength2, effective_l1, 'long', l2
                if quintet in entropies_dic_L3:
                    a_b = entropies_dic_L3[quintet]
                    entropy = a_b[0] * math.log(effective_l3) + a_b[1]

            elif effective_l1 > 7 and effective_l3 <= 7:
                quintet = stemlength1, stemlength2, 'long', effective_l3, l2
                if quintet in entropies_dic_L1:
                    a_b = entropies_dic_L1[quintet]
                    entropy = a_b[0] * math.log(effective_l1) + a_b[1]

            elif effective_l1 > 7 and effective_l3 > 7:
                quintet = stemlength1, stemlength2, effective_l1, 'long', l2
                if quintet in entropies_dic_L3:
                    a_b = entropies_dic_L3[quintet]
                    entropy = a_b[0] * math.log(l3) + a_b[1]
            else:
                entropy = 0.0

            stack_s1 = values[0][1]
            stack_s2 = values[0][2]

            pk_energy = stack_s1 + stack_s2 - (0.62 *
                                               entropy) + energy_l1 + energy_l3

            if entropy:
                if pk_energy < 0.0:
                    if pk_energy < values[0][0]:
                        pk_dic_cc09_result[pk_stem] = pk_energy, values[
                            1], values[2], values[3]
                    else:
                        pk_dic_cc09_result[pk_stem] = values[0][0], [], [], []
        else:
            pk_energy = pk_dic_cc09[pk_stem][0][0]
            pk_dic_cc09_result[pk_stem] = pk_energy, values[1], values[
                2], values[3]

    return pk_dic_cc09_result