1 #ifndef MULTIREADS_H
2 #define MULTIREADS_H
3 
4 #include <boost/thread.hpp>
5 
6 typedef uint64_t RefID;
7 typedef uint64_t InsertID;
8 
9 struct MultiHit
10 {
MultiHitMultiHit11     MultiHit(RefID id, int l, int r)
12     :   r_id(id),
13         left(l),
14         right(r),
15         expr(0) {}
16     RefID r_id;
17     int left;
18     int right;
19     double expr;
20 };
21 
22 class MultiRead
23 {
24 	size_t _curr_index;
25 	std::vector<MultiHit> _hits;
26 	double _tot_expr;
27 	InsertID _id;
28 
29     MultiHit* get_hit(RefID r_id, int left, int right);
30 
31 public:
32 
MultiRead(InsertID id,int exp_num_hits)33 	MultiRead(InsertID id, int exp_num_hits)
34 	:	_curr_index(0),
35 		_tot_expr(0.0),
36 		_id(id)
37 	{
38 		_hits.reserve(exp_num_hits);
39 	}
40 
num_hits()41 	size_t num_hits() { return (int)_hits.size(); }
42 	void add_hit(RefID r_id, int left, int right);
43 	void add_expr(RefID r_id, int left, int right, double expr);
44 	double get_mass(RefID r_id, int left, int right, bool valid_mass);
45 };
46 
47 class MateHit;
48 
49 class MultiReadTable
50 {
51 	typedef std::map<InsertID, MultiRead> MultiReadMap;
52 	MultiReadMap _read_map;
53 	bool _valid_mass;
54 	MultiRead* get_read(InsertID mr_id);
55 #if ENABLE_THREADS
56 	boost::mutex _lock;
57 #endif
58 public:
MultiReadTable()59 	MultiReadTable(): _valid_mass(false) {}
60 
valid_mass(bool vm)61 	void valid_mass(bool vm) { _valid_mass = vm; }
62 	void add_hit(const MateHit& hit);
63 	void add_hit(RefID r_id, int left, int right, InsertID mr_id, int exp_num_hits);
64 	void add_expr(const MateHit& hit, double expr);
65 	void add_expr(RefID r_id, int left, int right, InsertID mr_id, double expr);
66 	double get_mass(const MateHit& hit);
67 	size_t num_multireads();
68 	size_t num_multihits();
69 
70 };
71 
72 #endif
73