PUBLIC float alifold(const char **strings, char *structure){ int length, energy, s, n_seq; circ = 0; length = (int) strlen(strings[0]); if (length>init_length) init_alifold(length); if ((P==NULL)||(fabs(P->temperature - temperature)>1e-6)) { update_fold_params(); P = scale_parameters(); } for (s=0; strings[s]!=NULL; s++); n_seq = s; alloc_sequence_arrays(strings, &S, &S5, &S3, &a2s, &Ss, circ); make_pscores((const short **) S, strings, n_seq, structure); energy = fill_arrays((const char **)strings); backtrack((const char **)strings, 0); parenthesis_structure(structure, length); free_sequence_arrays(n_seq, &S, &S5, &S3, &a2s, &Ss); if (backtrack_type=='C') return (float) c[indx[length]+1]/(n_seq*100.); else if (backtrack_type=='M') return (float) fML[indx[length]+1]/(n_seq*100.); else return (float) f5[length]/(n_seq*100.); }
PUBLIC float alifold(const char **strings, char *structure){ int length, energy, s, n_seq; circular = 0; length = (int) strlen(strings[0]); #ifdef _OPENMP /* always init everything since all global static variables are uninitialized when entering a thread */ init_alifold(length); #else if (length>init_length) init_alifold(length); #endif if (fabs(P->temperature - temperature)>1e-6) update_alifold_params(); for (s=0; strings[s]!=NULL; s++); n_seq = s; alloc_sequence_arrays(strings, &S, &S5, &S3, &a2s, &Ss, circular); make_pscores((const short **) S, strings, n_seq, structure); energy = fill_arrays((const char **)strings); backtrack((const char **)strings, 0); #ifdef PAREN parenthesis_structure(structure, base_pair2, length); #else letter_structure(structure, base_pair2, length); #endif /* * Backward compatibility: * This block may be removed if deprecated functions * relying on the global variable "base_pair" vanishs from within the package! */ base_pair = base_pair2; /* { if(base_pair) free(base_pair); base_pair = (bondT *)space(sizeof(bondT) * (1+length/2)); memcpy(base_pair, base_pair2, sizeof(bondT) * (1+length/2)); } */ free_sequence_arrays(n_seq, &S, &S5, &S3, &a2s, &Ss); if (backtrack_type=='C') return (float) c[indx[length]+1]/(n_seq*100.); else if (backtrack_type=='M') return (float) fML[indx[length]+1]/(n_seq*100.); else return (float) f5[length]/(n_seq*100.); }
PUBLIC vrna_fold_compound_t * vrna_fold_compound_comparative( const char **sequences, vrna_md_t *md_p, unsigned int options){ int s, n_seq, length; vrna_fold_compound_t *vc; vrna_md_t md; unsigned int aux_options; aux_options = 0L; if(sequences == NULL) return NULL; for(s=0;sequences[s];s++); /* count the sequences */ n_seq = s; length = strlen(sequences[0]); /* sanity check */ if(length == 0) vrna_message_error("vrna_fold_compound_comparative: sequence length must be greater 0"); for(s = 0; s < n_seq; s++) if(strlen(sequences[s]) != length) vrna_message_error("vrna_fold_compound_comparative: uneqal sequence lengths in alignment"); vc = vrna_alloc(sizeof(vrna_fold_compound_t)); vc->type = VRNA_VC_TYPE_ALIGNMENT; vc->n_seq = n_seq; vc->length = length; vc->sequences = vrna_alloc(sizeof(char *) * (vc->n_seq + 1)); for(s = 0; sequences[s]; s++) vc->sequences[s] = strdup(sequences[s]); /* get a copy of the model details */ if(md_p) md = *md_p; else /* this fallback relies on global parameters and thus is not threadsafe */ vrna_md_set_default(&md); aux_options |= WITH_PTYPE; if(options & VRNA_OPTION_PF) aux_options |= WITH_PTYPE_COMPAT; set_fold_compound(vc, &md, options, aux_options); make_pscores(vc); if(!(options & VRNA_OPTION_EVAL_ONLY)){ /* add default hard constraints */ vrna_hc_init(vc); /* add DP matrices (if required) */ vrna_mx_add(vc, VRNA_MX_DEFAULT, options); } return vc; }