]> git.donarmstrong.com Git - bamtools.git/blob - src/api/BamMultiReader.h
Cleaned up index file handling throughout toolkit. Did this by adding a FileExists...
[bamtools.git] / src / api / BamMultiReader.h
1 // ***************************************************************************\r
2 // BamMultiReader.h (c) 2010 Erik Garrison\r
3 // Marth Lab, Department of Biology, Boston College\r
4 // All rights reserved.\r
5 // ---------------------------------------------------------------------------\r
6 // Last modified: 2 September 2010 (DB)\r
7 // ---------------------------------------------------------------------------\r
8 // Functionality for simultaneously reading multiple BAM files\r
9 // ***************************************************************************\r
10 \r
11 #ifndef BAMMULTIREADER_H\r
12 #define BAMMULTIREADER_H\r
13 \r
14 // C++ includes\r
15 #include <string>\r
16 #include <map>\r
17 #include <utility> // for pair\r
18 #include <sstream>\r
19 \r
20 using namespace std;\r
21 \r
22 // BamTools includes\r
23 #include "BamAux.h"\r
24 #include "BamReader.h"\r
25 \r
26 namespace BamTools {\r
27 \r
28 // index mapping reference/position pairings to bamreaders and their alignments\r
29 typedef multimap<pair<int, int>, pair<BamReader*, BamAlignment*> > AlignmentIndex;\r
30 \r
31 \r
32 class BamMultiReader {\r
33 \r
34     // constructor / destructor\r
35     public:\r
36         BamMultiReader(void);\r
37         ~BamMultiReader(void);\r
38 \r
39     // public interface\r
40     public:\r
41 \r
42         // positioning\r
43         int CurrentRefID;\r
44         int CurrentLeft;\r
45 \r
46         // region under analysis, specified using SetRegion\r
47         BamRegion Region;\r
48 \r
49         // ----------------------\r
50         // BAM file operations\r
51         // ----------------------\r
52 \r
53         // close BAM files\r
54         void Close(void);\r
55 \r
56         // opens BAM files (and optional BAM index files, if provided)\r
57         // @openIndexes - triggers index opening, useful for suppressing\r
58         // error messages during merging of files in which we may not have\r
59         // indexes.\r
60         // @coreMode - setup our first alignments using GetNextAlignmentCore();\r
61         // also useful for merging\r
62         // @useDefaultIndex - look for default BAM index ".bai" first.  If false, \r
63         // or if ".bai" does not exist, will look for BamTools index ".bti".  If \r
64         // neither exist, will open without an index\r
65         bool Open(const vector<string> filenames, bool openIndexes = true, bool coreMode = false, bool useDefaultIndex = true);\r
66 \r
67         // returns whether underlying BAM readers ALL have an index loaded\r
68         // this is useful to indicate whether Jump() or SetRegion() are possible\r
69         bool IsIndexLoaded(void) const;\r
70         \r
71         // performs random-access jump to reference, position\r
72         bool Jump(int refID, int position = 0);\r
73 \r
74         // sets the target region\r
75         bool SetRegion(const BamRegion& region);\r
76         bool SetRegion(const int&, const int&, const int&, const int&); // convenience function to above\r
77 \r
78         // returns file pointers to beginning of alignments\r
79         bool Rewind(void);\r
80 \r
81         // ----------------------\r
82         // access alignment data\r
83         // ----------------------\r
84         // updates the reference id marker to match the lower limit of our readers\r
85         void UpdateReferenceID(void);\r
86 \r
87         // retrieves next available alignment (returns success/fail) from all files\r
88         bool GetNextAlignment(BamAlignment&);\r
89         // retrieves next available alignment (returns success/fail) from all files\r
90         // and populates the support data with information about the alignment\r
91         // *** BUT DOES NOT PARSE CHARACTER DATA FROM THE ALIGNMENT\r
92         bool GetNextAlignmentCore(BamAlignment&);\r
93         // ... should this be private?\r
94         bool HasOpenReaders(void);\r
95 \r
96         // ----------------------\r
97         // access auxiliary data\r
98         // ----------------------\r
99 \r
100         // returns unified SAM header text for all files\r
101         const string GetHeaderText(void) const;\r
102         // returns number of reference sequences\r
103         const int GetReferenceCount(void) const;\r
104         // returns vector of reference objects\r
105         const BamTools::RefVector GetReferenceData(void) const;\r
106         // returns reference id (used for BamMultiReader::Jump()) for the given reference name\r
107         const int GetReferenceID(const std::string& refName) const;\r
108         // validates that we have a congruent set of BAM files that are aligned against the same reference sequences\r
109         void ValidateReaders() const;\r
110 \r
111         // ----------------------\r
112         // BAM index operations\r
113         // ----------------------\r
114 \r
115         // creates index for BAM files which lack them, saves to files (default = bamFilename + ".bai")\r
116         bool CreateIndexes(bool useDefaultIndex = true);\r
117 \r
118         //const int GetReferenceID(const string& refName) const;\r
119 \r
120         // utility\r
121         void PrintFilenames(void);\r
122         void DumpAlignmentIndex(void);\r
123         void UpdateAlignments(void); // updates our alignment cache\r
124 \r
125     // private implementation\r
126     private:\r
127 \r
128         // the set of readers and alignments which we operate on, maintained throughout the life of this class\r
129         vector<pair<BamReader*, BamAlignment*> > readers;\r
130 \r
131         // readers and alignments sorted by reference id and position, to keep track of the lowest (next) alignment\r
132         // when a reader reaches EOF, its entry is removed from this index\r
133         AlignmentIndex alignments;\r
134 \r
135         vector<string> fileNames;\r
136 };\r
137 \r
138 } // namespace BamTools\r
139 \r
140 #endif // BAMMULTIREADER_H\r