StochHMM
v0.34
Flexible Hidden Markov Model C++ Library and Application
Main Page
Modules
Namespaces
Classes
Files
File List
File Members
•
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
output.cpp
Go to the documentation of this file.
1
//Copyright (c) 2007-2012 Paul C Lott
2
//University of California, Davis
3
//Genome and Biomedical Sciences Facility
4
//UC Davis Genome Center
5
//Ian Korf Lab
6
//Website: www.korflab.ucdavis.edu
7
//Email: lottpaul@gmail.com
8
//
9
//Permission is hereby granted, free of charge, to any person obtaining a copy of
10
//this software and associated documentation files (the "Software"), to deal in
11
//the Software without restriction, including without limitation the rights to
12
//use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
13
//the Software, and to permit persons to whom the Software is furnished to do so,
14
//subject to the following conditions:
15
//
16
//The above copyright notice and this permission notice shall be included in all
17
//copies or substantial portions of the Software.
18
//
19
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
21
//FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
22
//COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
23
//IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24
//CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
26
///*
27
// * output.cpp
28
// * StochHMM3
29
// *
30
// * Created by Quidage on 8/27/08.
31
// * Copyright 2008 University of California, Davis. All rights reserved.
32
// *
33
// */
34
//
35
//#include "output.h"
36
//namespace StochHMM{
37
//
38
////Takes trellis once all filled and outputs the tracebacks as label
39
//
40
//
41
//void map_label (trellis &scores, const HMM &model, options &opt){
42
// int seq_size=scores.trell[0].size();
43
// string modl=opt.sopt("-model");
44
// string seq=opt.sopt("-seq");
45
// string lbl=opt.sopt("-label");
46
//
47
// //Reassign stdout to file if output filename is defined
48
// streambuf* sbuf=cout.rdbuf();
49
// ofstream file;
50
//
51
// if (lbl.compare("")!=0){
52
// file.open(lbl.c_str());
53
// cout.rdbuf(file.rdbuf());
54
// }
55
//
56
//
57
// string line (50,'#');
58
//
59
// map<string,string> label;
60
// for(int state=0;state<model.states.size();state++){
61
// //cout << model.state[state].label <<endl;
62
// //cout << model.state[state].name <<endl;
63
// label[model.states[state].label]+=model.states[state].name;
64
// }
65
//
66
// cout << "#Model: " << modl <<endl;
67
// cout << "#Sequence: " << seq << endl;
68
// cout << "#Algorithm: Viterbi" <<endl;
69
// cout << "#Output: Label" << endl;
70
// cout << "#Label Key: ";
71
//
72
// map<string,string>::iterator itera;
73
// for (itera=label.begin(); itera!=label.end(); itera++){
74
// cout << "(" << (*itera).first << "=" << (*itera).second << "),";
75
// }
76
//
77
// cout <<endl;
78
//
79
// traceback_path (trellis::*funct)();
80
//
81
// if (opt.getopt("-stoch","viterbi")){
82
// funct=&trellis::trace_stoch_viterbi;
83
// }
84
// else if (opt.getopt("-stoch","forward")){
85
// funct=&trellis::trace_stoch_forward;
86
// }
87
//
88
//
89
// map<traceback_path,int> paths;
90
// int max=0;
91
//
92
// double posterior=scores.trell[0][seq_size-1].forw;
93
// for(unsigned int r=1;r<model.states.size(); r++){
94
// posterior+=log(1+exp(scores.trell[r][seq_size-1].forw-posterior));
95
// }
96
//
97
// for(int i=0;i<opt.iopt("-repetitions");i++){
98
// traceback_path theta=(scores.*funct)();
99
// paths[theta]++;
100
// max = (paths[theta]>max) ? paths[theta] : max;
101
// }
102
//
103
//
104
// //print top n paths type vector<int>
105
// int sum=0;
106
// int i=0;
107
//
108
// map<traceback_path, int>::iterator it;
109
// //int ranking=1;
110
//
111
// for (int k=max;k>0;k--){
112
// for( it=paths.begin(); it!=paths.end();it++){
113
// if ((*it).second==k){
114
// cout << line << endl;
115
//
116
// cout << "Path occured " << k << " times:" <<endl;
117
// traceback_path final=(*it).first;
118
//
119
// //Determine Path probability
120
// //double path_probi=final.path_prob(model,seq);
121
//
122
// //if (path_probi==-INFINITY){
123
// // continue;
124
// //}
125
// //cout << "Path probability:\texp(" << path_probi<<")"<<endl;
126
// //double post=100*exp(path_probi-posterior);
127
//
128
// sum+=k;
129
//
130
// final.print_label(model);
131
//
132
//
133
// i++;
134
// if (i>=opt.iopt("-report") || sum==opt.iopt("-repetitions")){
135
// goto LAST_PRINT;
136
// }
137
// }
138
// }
139
// };
140
//LAST_PRINT:
141
// cout <<endl;
142
//
143
// //Re-assign the cout to stdout
144
// if (lbl.compare("")!=0){
145
// cout.rdbuf(sbuf);
146
// file.close();
147
// }
148
//}
149
//
150
//
151
////Mapping stochastic traceback
152
//void map_path (trellis &scores, const HMM &model, options &opt){
153
// int seq_size=scores.trell[0].size();
154
// string modl=opt.sopt("-model");
155
// string seq=opt.sopt("-seq");
156
// string path=opt.sopt("-path");
157
//
158
//
159
// streambuf* sbuf=cout.rdbuf();
160
// ofstream file;
161
//
162
//
163
// if (path.compare("")!=0){
164
// file.open(path.c_str());
165
// cout.rdbuf(file.rdbuf());
166
// }
167
//
168
// string line (50,'#');
169
//
170
// cout << "#Model: " << modl <<endl;
171
// cout << "#Sequence: " << seq<< endl;
172
// cout << "#Algorithm: Viterbi" <<endl;
173
// cout << "#Output: Path" << endl;
174
// cout << "#Path Key: ";
175
//
176
// for (int i=0; i<model.state_name.size()-1; i++){
177
// cout << "(" << i << "=" << model.state_name[i] << "),";
178
// }
179
//
180
// cout <<endl;
181
//
182
//
183
// traceback_path (trellis::*funct)();
184
//
185
// if (opt.getopt("-stoch","viterbi")){
186
// funct=&trellis::trace_stoch_viterbi;
187
// }
188
// else {
189
// funct=&trellis::trace_stoch_forward;
190
// }
191
//
192
// map<traceback_path,int> paths;
193
// int max=0;
194
//
195
//
196
//
197
// double posterior=scores.trell[0][seq_size-1].forw;
198
// for(unsigned int r=1;r<model.states.size(); r++){
199
// posterior+=log(1+exp(scores.trell[r][seq_size-1].forw-posterior));
200
// }
201
// //cout << "Posterior:\texp(" << posterior <<")"<<endl;
202
//
203
// //cout << "Viterbi:\texp("<< scores.trell[scores.vit_end][sequence.size()-1].viti <<")"<< endl<<endl;
204
//
205
// for(int i=0;i<opt.iopt("-repetitions");i++){
206
// traceback_path theta=(scores.*funct)();
207
// paths[theta]++;
208
// max = (paths[theta]>max) ? paths[theta] : max;
209
// }
210
//
211
//
212
// //print top n paths type vector<int>
213
// int sum=0;
214
// int i=0;
215
//
216
// map<traceback_path, int>::iterator it;
217
// //int ranking=1;
218
//
219
// for (int k=max;k>0;k--){
220
// for( it=paths.begin(); it!=paths.end();it++){
221
// if ((*it).second==k){
222
// cout << line << endl;
223
//
224
// cout << "Path occured " << k << " times:" <<endl;
225
// traceback_path final=(*it).first;
226
//
227
// //Determine Path probability
228
// //double path_probi=final.path_prob(model,seq);
229
//
230
// //if (path_probi==-INFINITY){
231
// // continue;
232
// //}
233
// //cout << "Path probability:\texp(" << path_probi<<")"<<endl; //Need to rewrite function for path probability
234
// //double post=100*exp(path_probi-posterior);
235
//
236
// sum+=k;
237
//
238
// final.print_path();
239
//
240
// /*
241
// if (opt.gff_flag==1){
242
// final.print_gff(model,opt.sequence,path_probi,ranking, k,posterior);
243
// ranking++;
244
// }
245
// */
246
//
247
// i++;
248
// if (i>=opt.iopt("-report") || sum==opt.iopt("-repetitions")){
249
// goto LAST_PRINT;
250
// }
251
// }
252
// }
253
// };
254
//LAST_PRINT:
255
// cout <<endl;
256
// if (path.compare("")!=0){
257
// cout.rdbuf(sbuf);
258
// file.close();
259
// }
260
//}
261
//
262
//
263
////NEED to account for posterior based traceback in map_GFF
264
////Mapping stochastic viterbi-based traceback
265
//void map_gff (trellis &scores, const HMM &model, options& opt){
266
// int seq_size=scores.trell[0].size();
267
// string modl=opt.sopt("-model");
268
// string seq=opt.sopt("-seq");
269
// string gff=opt.sopt("-gff");
270
//
271
// streambuf* sbuf=cout.rdbuf();
272
// ofstream file;
273
//
274
// if (gff.compare("")!=0){
275
// file.open(gff.c_str());
276
// cout.rdbuf(file.rdbuf());
277
// }
278
//
279
// string line (50,'#');
280
// int repetitions=opt.iopt("-repetitions");
281
//
282
// map<vector<char>,int> paths;
283
// map<char,string> label_key;
284
//
285
// for(int i=0;i<model.states.size();i++){
286
// if (!model.states[i].desc.empty()){
287
// label_key[model.states[i].label[0]]=model.states[i].desc;
288
// //cout << i << "\t" << model.state[i].label[0] << "\t" << model.state[i].desc <<endl;
289
// }
290
// }
291
//
292
// int max=0;
293
//
294
// //Calculate total posterior probability
295
//
296
// double posterior=scores.trell[0][seq_size-1].forw;
297
// for(unsigned int r=1;r<model.states.size(); r++){
298
// posterior+=log(1+exp(scores.trell[r][seq_size-1].forw-posterior));
299
// }
300
//
301
// //Perform repetitions by tracingback trellis
302
// for(int i=0;i<repetitions;i++){
303
// vector<char> theta=scores.trace_stoch_viterbi_char();
304
// paths[theta]++;
305
// max = (paths[theta]>max) ? paths[theta] : max;
306
// }
307
//
308
// //print top n paths type: GFF
309
// int sum=0;
310
// int i=0;
311
//
312
// map<vector<char>, int>::iterator it;
313
// int ranking=1;
314
//
315
// for (int k=max;k>0;k--){
316
// for( it=paths.begin(); it!=paths.end();it++){
317
// if ((*it).second==k){
318
//
319
// //print_gff(model,(*it).first,opt.sequence,strand,path_probi,ranking, k,posterior);
320
// convert_label(label_key,(*it).first,opt,ranking,k,posterior);
321
// ranking++;
322
// i++;
323
// if (sum==repetitions){
324
// goto LAST_PRINT;
325
// }
326
// }
327
// }
328
// };
329
//LAST_PRINT:
330
// cout <<endl;
331
//
332
// if (gff.compare("")!=0){
333
// cout.rdbuf(sbuf);
334
// file.close();
335
// }
336
//}
337
//
338
//
339
//
340
//void convert_label( map<char,string> label_key, vector<char> path, options opt, int ranking,int times,double posterior){
341
// string sequence_name=opt.sopt("-seq");
342
// char current_label;
343
// double start=0;
344
// int path_size=path.size();
345
//
346
// for(int k=path_size-1;k>=0;k--){
347
//
348
// char new_label=path[k];
349
//
350
// if (label_key.count(new_label)== 0){
351
// if (start>0){
352
// //cout << current_label << endl;
353
// cout << sequence_name << "\tStochHMM\t" << label_key[current_label] <<"\t"<< start << "\t" << path_size-(k+1) << "\t.\t+\t.\tRank:"<<ranking<<",Counts:" << times<<",Posterior:"<<posterior<<endl;
354
// start=0;
355
// current_label=new_label;
356
// }
357
// else {
358
// continue;
359
// }
360
// }
361
// else {
362
// if(k==0){
363
// //cout << current_label << endl;
364
// cout << sequence_name << "\tStochHMM\t" << label_key[current_label] <<"\t"<< start << "\t" << path_size << "\t.\t+\t.\tRank:"<<ranking<<",Counts:" << times<<",Posterior:"<<posterior<<endl;
365
// }
366
// else if (start==0){
367
// start=path_size-k;
368
// current_label=new_label;
369
// }
370
// else if (new_label==current_label){
371
// continue;
372
// }
373
// else {
374
// //cout << current_label << endl;
375
// cout << sequence_name << "\tStochHMM\t" << label_key[current_label] <<"\t"<< start << "\t" << path_size-(k+1) << "\t.\t+\t.\tRank:"<<ranking<<",Counts:" << times<<",Posterior:"<<posterior<<endl;
376
// start=path_size-k;
377
// current_label=new_label;
378
// }
379
// }
380
// }
381
//}
382
//
383
//
384
////Outputs the traceback state hit file for heat map.
385
////Need to integrate with previous map functions
386
////void map_heat (trellis &scores, const HMM &model, sequence &seq, int repetitions, int top_N, int flag, options &opt, string strand){
387
//void map_heat (trellis &scores, const HMM &model, options &opt){
388
//
389
//
390
// int states=scores.trell.size();
391
// //int seq_length=model.tracks.size();
392
// int seq_length=scores.trell[0].size();
393
//
394
// map<int,int> st;
395
// vector<map<int,int> > cell (seq_length,st);
396
// vector<vector< map<int,int> > > output (model.states.size(),cell);
397
//
398
// traceback_path (trellis::*funct)();
399
//
400
// if (opt.getopt("-stoch","viterbi")){
401
// funct=&trellis::trace_stoch_viterbi;
402
// }
403
// else {
404
// funct=&trellis::trace_stoch_forward;
405
// }
406
//
407
//
408
// //cout << "Heatmap" << opt.heatmap <<endl;
409
//
410
// streambuf* sbuf=cout.rdbuf();
411
// ofstream file;
412
// file.open(opt.sopt("-heat").c_str());
413
// cout.rdbuf(file.rdbuf());
414
//
415
// for(int i=0;i<opt.iopt("-repetitions");i++){
416
// traceback_path theta= (scores.*funct)();
417
// for(int j=theta.size()-1;j>=0;j--){
418
// if (j==0){
419
// output[theta.val(j)][j][-1]++;
420
// }
421
// else{
422
// output[theta.val(j)][j][theta.val(j-1)]++;
423
// }
424
// //cout << theta[j] << endl;
425
// }
426
// }
427
//
428
// cout << "STATE KEY:\t(-1,END),";
429
// for(int k=0;k<model.states.size();k++){
430
// cout << "(" << k << "," << model.states[k].name << ")";
431
// if (k+1<states){
432
// cout << ",";
433
// }
434
// }
435
// cout <<endl;
436
//
437
// /*
438
// cout << "SEQUENCE:\t";
439
//
440
// for(int j=0;j<seq.size();j++){
441
// cout << model.alpha[seq.val(j)];
442
// }
443
// cout <<endl;
444
// */
445
//
446
//
447
// cout << "HEADER KEY:\tSTATE,SEQUENCE,(PREV_STATE,TRACEBACK_COUNTS)" << endl;
448
//
449
// /* //Sequence first
450
// for (int j=seq_length-1;j>=0;j--){
451
// for (int i=0;i<output.size();i++){
452
// map<int,int>::iterator it;
453
// for(it=output[i][j].begin();it!=output[i][j].end();it++){
454
// int position=seq_length-1-j;
455
// cout <<position<< "," << i <<","<< it->first <<"," << it->second << endl;
456
// }
457
// }
458
// }
459
// */
460
//
461
// //State first
462
// for (int i=0;i<output.size();i++){
463
// for (int j=output[i].size()-1;j>=0;j--){
464
// map<int,int>::iterator it;
465
// if (output[i][j].size()>0){
466
// int position=seq_length-1-j;
467
// cout << i << "," << position;
468
// }
469
// for(it=output[i][j].begin();it!=output[i][j].end();it++){
470
// cout <<",("<< it->first <<"," << it->second << ")";
471
// }
472
// if (output[i][j].size()>0){
473
// cout << endl;
474
// }
475
//
476
// }
477
// }
478
// cout.rdbuf(sbuf);
479
// file.close();
480
//}
481
//}
Generated on Tue Jul 30 2013 13:23:11 for StochHMM by
1.8.1