#/*$Id: Wurst.xs,v 1.10 2008/03/14 15:43:31 mmundry Exp $ */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "align_i.h" #include "altscores.h" #include "bad_angle.h" #include "class_model.h" #include "classifyStructure.h" #include "cmp_dmat_i.h" #include "compound.h" #include "coord.h" #include "coord_i.h" #include "coordinfo_i.h" #include "geo_gap.h" #include "lsqf.h" #include "model.h" #include "multialign.h" #include "pair_set_chim.h" #include "pair_set_i.h" #include "pair_set_p_i.h" #include "param_fx_i.h" #include "pdbin_i.h" #include "pdbout_i.h" #include "prob_vec_i.h" #include "read_ac.h" #include "read_ac_i.h" #include "read_ac_strct.h" #include "read_ac_strct_i.h" #include "read_blst.h" #include "read_mat.h" #include "read_sec_i.h" #include "read_seq_i.h" #include "rescore.h" #include "score_fx_i.h" #include "score_mat_i.h" #include "score_probvec.h" #include "score_sec_i.h" #include "score_smat.h" #include "scratch.h" #include "sec_s_i.h" #include "silly.h" #include "scor_set.h" #include "scor_set_i.h" #include "seq.h" static double constant(char *name, int len, int arg) { errno = 0; if (strEQ(name + 0, "WURST_H")) { /* removed */ # ifdef WURST_H return WURST_H; # else errno = ENOENT; return 0; # endif } errno = EINVAL; return 0; } typedef struct aa_clssfcn Aa_clssfcn; typedef struct aa_strct_clssfcn Aa_strct_clssfcn ; typedef struct prob_vec Prob_vec; typedef struct sec_s_data Sec_s_data; typedef struct seq Seq; typedef struct seq_array Seq_array; typedef struct sub_mat Sub_mat; typedef struct score_mat Score_mat; typedef struct pair_set Pair_set; typedef struct coord Coord; typedef void Param; typedef struct FXParam FXParam; typedef float RSParam; typedef struct seqprof Seqprof; typedef struct scor_set Scor_set; typedef struct clssfcn Clssfcn; MODULE = Wurst PACKAGE = Wurst PROTOTYPES: ENABLE double constant(sv,arg) PREINIT: STRLEN len; INPUT: SV * sv char * s = SvPV(sv, len); int arg CODE: RETVAL = constant(s,len,arg); OUTPUT: RETVAL #/* ---------------- Sec struct data --------------------------- */ Sec_s_data * sec_s_data_read (fname) char *fname; char * sec_s_data_string (sec_s_data) Sec_s_data *sec_s_data; MODULE = Wurst PACKAGE = Sec_s_dataPtr PREFIX = sec_s_data_ void sec_s_data_DESTROY (sec_s_data) Sec_s_data *sec_s_data CODE: sec_s_data_destroy (sec_s_data); MODULE = Wurst PACKAGE = Wurst #/* ---------------- Sequences -------------------------------- */ Seq * seq_read(fname) char *fname; Seq * seq_from_string (s) char *s; Seq * seq_get_1 ( ps_a, n) Seq_array **ps_a size_t n; size_t seq_num ( ps_a) Seq_array **ps_a; size_t seq_size ( seq) Seq *seq; char * seq_print ( seq ) Seq *seq Seq_array ** seq_read_many (fname, s_a = NULL) const char *fname Seq_array **s_a; char * seq_print_many (ps_a) Seq_array **ps_a MODULE = Wurst PACKAGE = SeqPtr PREFIX = seq_ void seq_DESTROY(seq) Seq *seq CODE: seq_destroy (seq); MODULE = Wurst PACKAGE = Seq_arrayPtrPtr PREFIX = seq_arrayPtr_ void seq_arrayPtr_DESTROY(s_a) Seq_array **s_a CODE: seq_array_destroy (s_a); MODULE = Wurst PACKAGE = Wurst #/* ---------------- sub_mat ----------------------------------- # */ Sub_mat * sub_mat_read (fname) const char *fname char * sub_mat_string(s_m) Sub_mat *s_m Sub_mat * sub_mat_shift (s_m, x) Sub_mat *s_m float x; void sub_mat_scale (s_m, bot, top) Sub_mat *s_m int bot int top float sub_mat_get_by_i (s_m, ndx1, ndx2) Sub_mat *s_m int ndx1 int ndx2 float sub_mat_get_by_c (s_m, ndx1, ndx2) Sub_mat *s_m char ndx1 char ndx2 int sub_mat_set_by_i (s_m, ndx1, ndx2, f) Sub_mat *s_m int ndx1 int ndx2 float f CODE: RETVAL = sub_mat_set_by_i (s_m, ndx1, ndx2, f); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL int sub_mat_set_by_c (s_m, ndx1, ndx2, f) Sub_mat *s_m char ndx1 char ndx2 float f CODE: RETVAL = sub_mat_set_by_c (s_m, ndx1, ndx2, f); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL MODULE = Wurst PACKAGE = Sub_matPtr PREFIX = sub_mat_ void sub_mat_DESTROY (s_m) Sub_mat *s_m CODE: sub_mat_destroy (s_m); #/* ---------------- coord ----------------------------------- # */ MODULE = Wurst PACKAGE = Wurst int coord_2_bin (c, fname) Coord *c; const char *fname; CODE: RETVAL = coord_2_bin (c, fname); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL char * coord_name (c) Coord *c; size_t coord_size (c) Coord *c; Coord * coord_read ( fname ) const char *fname; Seq * coord_get_seq (c) Coord *c; int coord_has_sec_s (c) Coord *c; char * coord_get_sec_s(c) Coord *c; int coord_2_pdb ( fname, c, seq = NULL) const char *fname Coord *c Seq *seq; CODE: RETVAL = coord_2_pdb (fname, c, seq); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL int coord_2_spdb ( fname, c, scorset, seq = NULL) const char *fname; Coord *c Scor_set *scorset Seq *seq; CODE: RETVAL = coord_2_spdb (fname, c, seq, scorset); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL float coord_c_n_dist (c, i, j, sqrt_flag) Coord *c unsigned int i unsigned int j unsigned int sqrt_flag void coord_calc_psi (c) Coord *c void coord_calc_phi (c) Coord *c float coord_psi (c, j, shift_min); Coord *c const size_t j const float shift_min CODE: RETVAL = coord_psi (c, j, shift_min); if (RETVAL == BAD_ANGLE) XSRETURN_UNDEF; OUTPUT: RETVAL float coord_phi (c, j, shift_min); Coord *c const size_t j const float shift_min CODE: RETVAL = coord_phi (c, j, shift_min); if (RETVAL == BAD_ANGLE) XSRETURN_UNDEF; OUTPUT: RETVAL void coord_geo_gap (IN Coord *c, \ OUTLIST float quad, OUTLIST float linear, \ OUTLIST float logistic, OUTLIST unsigned int num_gap, \ IN float scale, IN float max) PROTOTYPE: $$$ CODE: { int i; i = coord_geo_gap (c, &quad, &linear, &logistic, \ &num_gap, scale, max); if (i == EXIT_FAILURE) XSRETURN_EMPTY; } int dme_thresh (frac, c1, c2, thresh) float frac = NO_INIT Coord *c1 Coord *c2 float thresh; CODE: RETVAL = dme_thresh (&frac, c1, c2, thresh); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: frac RETVAL Coord * pdb_read ( fname, acq_c, chain) const char *fname const char *acq_c const char chain; MODULE = Wurst PACKAGE = CoordPtr PREFIX = coord_ void coord_DESTROY (c) Coord *c CODE: coord_destroy (c); MODULE = Wurst PACKAGE = Wurst #/* ---------------- make_model -------------------------------- # */ Coord * make_model (p, seq, coord) Pair_set *p Seq *seq Coord *coord int model_pdb_num ( mdl, resnum) Coord *mdl int resnum; CODE: RETVAL = model_pdb_num(mdl, resnum); if (RETVAL == -99999) XSRETURN_UNDEF; OUTPUT: RETVAL int model_res_num ( mdl, mnum) Coord *mdl int mnum; CODE: RETVAL = model_res_num(mdl, mnum); if (RETVAL == -1) XSRETURN_UNDEF; OUTPUT: RETVAL float * coord_2_pnlty (c, f) Coord *c float f #/* ---------------- scoring routines -------------------------- # */ MODULE = Wurst PACKAGE = Wurst Score_mat * score_mat_new (n_rows, n_cols) size_t n_rows size_t n_cols Score_mat * score_mat_read (fname) const char *fname Score_mat * score_mat_add (mat1, mat2, scale, shift = 0.0) Score_mat *mat1 Score_mat *mat2 float scale float shift; void score_mat_info (IN Score_mat *mat, \ OUTLIST float min, OUTLIST float max, OUTLIST float av, \ OUTLIST float std_dev) PROTOTYPE: $ CODE: score_mat_info (mat, &min, &max, &av, &std_dev); Score_mat * score_mat_scale (mat, scale) Score_mat *mat const float scale; Score_mat * score_mat_shift (mat1, shift) Score_mat *mat1 const float shift; int score_mat_write ( mat1, fname) Score_mat *mat1 const char *fname; CODE: RETVAL = score_mat_write (mat1, fname); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL int score_mat_write_gnuplot( smat, fname, protA, protB ) Score_mat *smat const char *fname const char *protA const char *protB; void score_mat_diag_wipe( pair_set, smat ) Pair_set *pair_set Score_mat *smat; Score_mat * score_mat_double_matrix ( smat ) Score_mat *smat; int score_prof_prof (score_mat, sp1, sp2, subst_matrix) Score_mat *score_mat Seqprof *sp1 Seqprof *sp2 Sub_mat *subst_matrix; CODE: RETVAL = score_prof_prof (score_mat, sp1, sp2, subst_matrix); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL int score_smat (score_mat, seq1, seq2, subst_matrix) Score_mat *score_mat Seq *seq1 Seq *seq2 Sub_mat *subst_matrix; CODE: RETVAL = score_smat (score_mat, seq1, seq2, subst_matrix); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL int score_sprof (score_mat, s_p, seq, subst_matrix) Score_mat *score_mat Seqprof *s_p Seq *seq Sub_mat *subst_matrix; CODE: RETVAL = score_sprof (score_mat, s_p, seq, subst_matrix); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL int score_fx (score_mat, seq, coord, param) Score_mat *score_mat Seq *seq Coord *coord FXParam *param CODE: RETVAL = score_fx (score_mat, seq, coord, param); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL int score_fx_prof (score_mat, s_p, coord, param) Score_mat *score_mat Seqprof *s_p Coord *coord FXParam *param CODE: RETVAL = score_fx_prof (score_mat, s_p, coord, param); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL int score_sec (score_mat, sec_s, coord) Score_mat *score_mat Sec_s_data *sec_s Coord *coord CODE: RETVAL = score_sec (score_mat, sec_s, coord); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL RSParam * param_rs_read(fname) const char *fname; float score_rs (coord, params) Coord *coord RSParam *params; FXParam * param_fx_read (fname) const char *fname MODULE = Wurst PACKAGE = RSParamPtr PREFIX = RSParam_ void RSParam_DESTROY (p) RSParam *p CODE: param_rs_destroy (p); MODULE = Wurst PACKAGE = FXParamPtr PREFIX = FXParam_ void FXParam_DESTROY (f) FXParam *f CODE: FXParam_destroy(f); MODULE = Wurst PACKAGE = Wurst char * score_mat_string (scores, seq0, seq1) Score_mat *scores Seq *seq0 Seq *seq1; Pair_set * score_mat_sum_full (rmat, scores, pgap_open, pgap_widen, qgap_open, qgap_widen,p_mult, q_mult, align_type, bias_set = NULL) Score_mat * &rmat = NO_INIT Score_mat *scores float pgap_open float pgap_widen float qgap_open float qgap_widen float *p_mult float *q_mult int align_type Pair_set *bias_set OUTPUT: rmat RETVAL MODULE = Wurst PACKAGE = floatPtr PREFIX = float_ void float_DESTROY (f) float *f CODE: if (f) free (f); MODULE = Wurst PACKAGE = Score_matPtr PREFIX = score_mat_ void score_mat_DESTROY (s) Score_mat *s CODE: score_mat_destroy (s); #/* ---------------- pair_set --------------------------------- #/* This is very messy. We want to return a list with two strings #/* on it. Current versions of xsubpp let us use the nicer IN/OUT #/* keywords. Older versions require us to PPCODE and dork around #/* in the return stack explicitly. # */ MODULE = Wurst PACKAGE = Wurst char * pair_set_chimera (s, c1, c2) Pair_set *s Coord *c1 Coord *c2 void pair_set_coverage (s, n1, n2) Pair_set *s size_t n1 size_t n2 PPCODE: { char *c1, *c2; if (pair_set_coverage (s, n1, n2, &c1, &c2) == EXIT_FAILURE) { free (c1); free (c2); XSRETURN_UNDEF; } EXTEND(SP, 2); PUSHs(sv_2mortal(newSVpv (c1, 0))); PUSHs(sv_2mortal(newSVpv (c2, 0))); free (c1); free (c2); } void pair_set_gap (IN Pair_set *s, \ OUTLIST float open_cost, OUTLIST float widen_cost, \ IN float open_scale, IN float widen_scale) PROTOTYPE: $$$ CODE: { int i; i = pair_set_gap (s, &open_cost, &widen_cost, \ open_scale, widen_scale); if (i == EXIT_FAILURE) XSRETURN_EMPTY; } char * pair_set_string (s, seq0, seq1) Pair_set *s Seq *seq0 Seq *seq1; char * multal_string (s) Pair_set *s; char * pair_set_pretty_string (s, seq0, seq1, sec_s_data = NULL, c2 = NULL) Pair_set *s Seq *seq0 Seq *seq1 Sec_s_data *sec_s_data Coord *c2; void pair_set_get_alignment_indices (IN Pair_set *p_s, IN int sequencenumber,\ OUTLIST int start, OUTLIST int stop) PROTOTYPE: $$ CODE: pair_set_get_alignment_indices (p_s, sequencenumber, &start, &stop); int get_seq_id_simple ( Pair_set *pair_set, Seq *s1, Seq *s2 ); void pair_set_score(IN Pair_set *s, \ OUTLIST float score, OUTLIST float score_smpl) PROTOTYPE: $ CODE: { int i; i = pair_set_score (s, &score, &score_smpl); if (i == EXIT_FAILURE) XSRETURN_EMPTY; } int pair_set_extend(s, n0, n1, ext_len) Pair_set *s size_t n0 size_t n1 int ext_len; MODULE = Wurst PACKAGE = Pair_setPtr PREFIX = pair_set_ void pair_set_DESTROY (s) Pair_set *s CODE: pair_set_destroy (s); MODULE = Wurst PACKAGE = Wurst int func_int ( ) float func_float () char * func_char () char * funcs1_char (in) char *in; char * funcs2_char () #/* ---------------- clean_up -------------------------------- void free_scratch () #/* ---------------- blast checkpoint files -------------------- # */ Seqprof * blst_chk_read (f) const char *f; char * seqprof_str (p) Seqprof *p; Seq * seqprof_get_seq (c) Seqprof *c; MODULE = Wurst PACKAGE = SeqprofPtr PREFIX = seqprof_ void seqprof_DESTROY (p) Seqprof *p CODE: seqprof_destroy (p); #/* -------------------- scor_set routines --------------- # */ MODULE = Wurst PACKAGE = Wurst void scor_set_fromvec ( dblvec ) AV *dblvec; PREINIT: size_t s=0; size_t t; SV **d_el, *ssv; Scor_set *ss=NULL; double *dv; PPCODE: t = 1+av_len(dblvec); if (t>0) { dv = malloc(sizeof(*dv)*t); /* vector passed to C function */ while (sn); while (in) { a_el = sv_newref(newSVnv(scoreset->scores[i])); if (av_store(av, i, a_el)==NULL) croak("scor_set_to_vec: av_store returned null - \ where is my array ???"); i++; } } RETVAL = av; OUTPUT: RETVAL Scor_set * scor_set_simpl ( pairset, scoremat) Pair_set *pairset Score_mat *scoremat; int scor_set_scale ( scorset, scale ) Scor_set *scorset float scale; CODE: RETVAL = scor_set_scale( scorset, scale); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL MODULE = Wurst PACKAGE = Scor_setPtr PREFIX = scor_set_ void scor_set_DESTROY (p) Scor_set *p CODE: scor_set_destroy (p); #/* ---------------- class probability vectors ----------------- # */ MODULE = Wurst PACKAGE = Wurst char * prob_vec_info (pvec) Prob_vec *pvec; #Prob_vec * #seq_2_prob_vec ( seq, ac ) # Seq *seq # Aa_clssfcn *ac; int score_pvec (score_mat, pvec1, pvec2) Score_mat *score_mat Prob_vec *pvec1 Prob_vec *pvec2 CODE: RETVAL = score_pvec (score_mat, pvec1, pvec2); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL size_t prob_vec_size(pvec); Prob_vec * pvec; size_t prob_vec_length(pvec); Prob_vec * pvec; Prob_vec * prob_vec_copy(pvec); Prob_vec * pvec; int prob_vec_write (pvec, fname) Prob_vec *pvec const char *fname CODE: RETVAL = prob_vec_write (pvec, fname); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL Prob_vec * prob_vec_read (fname) const char *fname MODULE = Wurst PACKAGE = Prob_vecPtr PREFIX = prob_vec_ void prob_vec_DESTROY (pvec) Prob_vec *pvec CODE: prob_vec_destroy (pvec); #/* ---------------- amino acid + structure classification ----- # */ MODULE=Wurst PACKAGE = Wurst Aa_strct_clssfcn * aa_strct_clssfcn_read (fname, error) const char *fname const float error void aa_strct_dump (ac) Aa_strct_clssfcn *ac size_t aa_strct_nclass (ac) Aa_strct_clssfcn *ac size_t aa_strct_size (ac) Aa_strct_clssfcn *ac Prob_vec * strct_2_prob_vec (structure, cmodel, norm = 1) Coord * structure Aa_strct_clssfcn * cmodel int norm Prob_vec * aa_strct_2_prob_vec (structure, cmodel, norm = 1) Coord * structure Aa_strct_clssfcn * cmodel int norm Prob_vec * prof_aa_strct_2_prob_vec (structure, s_p, cmodel, norm = 1) Coord * structure Seqprof * s_p Aa_strct_clssfcn * cmodel int norm Prob_vec * aa_2_prob_vec (seq, cmodel, norm = 1) Seq * seq Aa_strct_clssfcn * cmodel int norm Prob_vec * prof_aa_2_prob_vec (s_p, cmodel, norm = 1); Seqprof * s_p Aa_strct_clssfcn * cmodel int norm; MODULE = Wurst PACKAGE = Aa_strct_clssfcnPtr PREFIX = aa_strct_clssfcn_ void aa_strct_clssfcn_DESTROY (aa) Aa_strct_clssfcn *aa CODE: aa_strct_clssfcn_destroy (aa); #/* ---------------- amino acid classification------------------ # */ MODULE = Wurst PACKAGE = Wurst Aa_clssfcn * ac_read (fname) const char *fname size_t ac_size (ac) Aa_clssfcn *ac size_t ac_nclass (ac) Aa_clssfcn *ac void ac_dump (ac) Aa_clssfcn *ac int computeMembershipAAProf (mship, s_p, ac) float ** mship Seqprof * s_p Aa_clssfcn * ac CODE: RETVAL = computeMembershipAAProf (mship, s_p, ac); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL int computeMembershipAA (mship, seq, ac) float ** mship Seq * seq Aa_clssfcn * ac CODE: RETVAL = computeMembershipAA (mship, seq, ac); if (RETVAL == EXIT_FAILURE) XSRETURN_UNDEF; else RETVAL = 1; OUTPUT: RETVAL Prob_vec * seq_2_prob_vec (seq, ac) Seq *seq Aa_clssfcn *ac MODULE = Wurst PACKAGE = Aa_clssfcnPtr PREFIX = aa_clssfcn_ void aa_clssfcn_DESTROY (aa) Aa_clssfcn *aa CODE: aa_clssfcn_destroy (aa); #/* ---------------- alternative scores routines -------------------- # */ MODULE = Wurst PACKAGE = Wurst float find_alt_path_score_simple (Score_mat *score_mat, Pair_set *pair_set); #/* ---------------- bayesian fragments routines -------------------- # */ MODULE = Wurst PACKAGE = Wurst #Prob_vec * #struct_2_prob_vec(structure, cmodel); # Coord * structure # Clssfcn * cmodel; Clssfcn * get_clssfcn(influence_report_filename, abs_error); const char * influence_report_filename float abs_error; float * computeMembership(mship, test_vec, cmodel); float * mship float * test_vec Clssfcn * cmodel; MODULE = Wurst PACKAGE = ClssfcnPtr PREFIX = clssfcn_ void clssfcn_DESTROY (c) Clssfcn *c CODE: clssfcn_destroy (c); #/* ---------------- multiple alignments ------------------ # */ MODULE = Wurst PACKAGE = Wurst Pair_set * merge_alignments (align1, align2, alignment); Pair_set * align1 Pair_set * align2 Pair_set * alignment; Prob_vec * pvec_avg (p_vec1, p_vec2, p_set, cur_step); Prob_vec * p_vec1 Prob_vec * p_vec2 Pair_set * p_set int cur_step; Pair_set * remove_seq (pairset, index); Pair_set * pairset int index; Pair_set * split_multal (pairset, a, b); Pair_set * pairset int a int b; #/* ---------------- superimposing structures, RMSD ------------------ # */ MODULE = Wurst PACKAGE = Wurst void coord_rmsd ( IN Pair_set *pair_set, IN Coord *coord1, IN Coord *coord2, \ IN int sub_flag,\ OUTLIST float rmsd, OUTLIST Coord *c1_new, OUTLIST Coord *c2_new) PROTOTYPE: $$$$ CODE: { int i; i = coord_rmsd(pair_set, coord1, coord2, sub_flag, &rmsd, &c1_new, &c2_new); if (i == EXIT_FAILURE) XSRETURN_EMPTY; } void get_rmsd(IN Pair_set *pairset, IN Coord *r1, \ IN Coord *r2, OUTLIST float rmsd, OUTLIST int count) PROTOTYPE: $$$ CODE: { int i; i = get_rmsd(pairset, r1, r2, &rmsd, &count); if (i == EXIT_FAILURE) XSRETURN_EMPTY; } #/* ------------ accessing compound info ---------------------------- #*/ char * get_compound_coord(c) Coord * c; char * get_compound_vec(v) Prob_vec * v;