122 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
| #!/usr/bin/yap -L --
 | |
| #.
 | |
| 
 | |
| :- initialization(main).
 | |
| 
 | |
| :- ensure_loaded(library('clpbn/viterbi')).
 | |
| 
 | |
| :- use_module(fasta,
 | |
| 	      [fa2atoms/3]).
 | |
| 
 | |
| :- use_module(library(lists),
 | |
| 	      [
 | |
| 	       nth/3,
 | |
| 	       append/3
 | |
| 	      ]).
 | |
| 
 | |
| :- [plan7].
 | |
| 
 | |
| :- ['globin.yap'].
 | |
| %:- ['hmmer_b.1.18.1.yap'].
 | |
| 
 | |
| :- dynamic len/1, emission/2.
 | |
| 
 | |
| main :-
 | |
| 	unix(argv([Sequence])),
 | |
| 	fa2atoms(Sequence, L, [a]),
 | |
| 	run_model([a|L],_Trace).
 | |
| 
 | |
| artemia :-
 | |
| 	fa2atoms('Artemia.fa', L, [a]),
 | |
| 	run_model([a|L],_Trace).
 | |
| 
 | |
| % given a string, construct a model
 | |
| run_model(String,Trace) :-
 | |
| 	viterbi(s(0,_),t(_,_),String,Trace),
 | |
| 	out(Trace,String).
 | |
| 
 | |
| write_keys([]).
 | |
| write_keys([V|Vars0]) :-
 | |
| 	clpbn:get_atts(V,[key(K)]), !,
 | |
| 	write(K), nl,
 | |
| 	write_keys(Vars0).
 | |
| write_keys([_|Vars0]) :-
 | |
| 	write(no_key),nl,
 | |
| 	write_keys(Vars0).
 | |
| 
 | |
| 
 | |
| convert2emissions([],_).
 | |
| convert2emissions([E|String],I0) :-
 | |
| 	I is I0+1,
 | |
| 	assert(emission(I,E)),
 | |
| 	convert2emissions(String, I).
 | |
| 
 | |
| 
 | |
| out([],_).
 | |
| out([State|Trace],String) :-
 | |
| 	out_state(State,String,RString),
 | |
| 	out(Trace,RString).
 | |
| 
 | |
| out_state(s(_),String,String).
 | |
| out_state(n(_),[_|String],String).
 | |
| out_state(j(_),[_|String],String).
 | |
| out_state(c(_),[_|String],String).
 | |
| out_state(t(_),String,String).
 | |
| out_state(b(Pos),String,String) :-
 | |
| 	format('START MATCH at ~d~n', [Pos]).
 | |
| out_state(d(_,State),String,String) :-
 | |
| 	find_consensus(State,Consensus),
 | |
| 	format('     -~a~n', [Consensus]).
 | |
| out_state(i(_,_),[Code|String],String) :-
 | |
| 	to_upper(Code,UCode),
 | |
| 	format('    ~a+~n', [UCode]).
 | |
| out_state(m(_,State),[Code|String],String) :-
 | |
| 	to_upper(Code,UCode),
 | |
| 	find_consensus(State,Consensus),
 | |
| 	find_match_type(State,Code,Consensus,MatchType),
 | |
| 	format('    ~a~a~a~n', [UCode,MatchType,Consensus]).
 | |
| out_state(e(Pos),String,String) :-
 | |
| 	format('END MATCH at ~d~n', [Pos]).
 | |
| 
 | |
| to_upper(A,U) :-
 | |
| 	atom_codes(A,[C]),
 | |
| 	( C =< "A", C>="Z" ->
 | |
| 	  U = A
 | |
| 	;
 | |
| 	  NC is C + ("A"-"a"),
 | |
| 	  atom_codes(U,[NC])
 | |
| 	).
 | |
| find_consensus(State,Consensus) :-
 | |
| 	consensus(State,I),
 | |
| 	hmm_domain(Type),
 | |
| 	domain_vals(Type,Vals),
 | |
| 	arg(I, Vals, Consensus).
 | |
| 
 | |
| find_match_type(_,Code,Code,'=') :- !.
 | |
| find_match_type(State,Code,_,'^') :-
 | |
| 	me_cpt(State,Probs,_,_),
 | |
| 	hmm_domain(Type),
 | |
| 	domain_vals(Type,Vals),
 | |
| 	find_prob_for_code(Vals,Code,Probs,Prob),
 | |
| 	Prob >= 0, !.
 | |
| find_match_type(_,_,_,' ').
 | |
| 
 | |
| find_prob_for_code(Vals,Code,Probs,Prob) :-
 | |
| 	Vals =.. [_|L],
 | |
| 	once(nth(I,L,Code)),
 | |
| 	arg(I,Probs,Prob).
 | |
| 
 | |
| domain_vals(aminoacids,domain(a,  c,  d,  e,  f,  g,  h,  i,  k,  l,  m,  n,  p,  q,  r,  s,  t,  v,  w,  y)).
 | |
| domain_vals(bool,domain(t,f)).
 | |
| domain_vals(bases,domain(a,c,g,t)).
 | |
| domain_vals([A|B],Domain) :-
 | |
| 	Domain =.. [domain,A|B].
 | |
| 
 | |
| 
 | |
| start(S) :-
 | |
| 	s_state(0,S).
 | |
| 
 | |
| end(Items,E) :-
 | |
| 	t_state(Items,E).
 | |
| 
 |