1 #ifndef DEF_BAMfunctions
2 #define DEF_BAMfunctions
3
4 #include "IncludeDefine.h"
5 #include SAMTOOLS_BGZF_H
6 #include SAMTOOLS_SAM_H
7 #include "ErrorWarning.h"
8
9
10 void outBAMwriteHeader (BGZF* fp, const string &samh, const vector <string> &chrn, const vector <uint> &chrl);
11 int bam_read1_fromArray(char *bamChar, bam1_t *b);
12 string bam_cigarString (bam1_t *b);
13
14 int reg2bin(int beg, int end);
15 int bamAttrArrayWrite(int32 attr, const char* tagName, char* attrArray );
16 int bamAttrArrayWrite(float attr, const char* tagName, char* attrArray );
17 int bamAttrArrayWrite(char attr, const char* tagName, char* attrArray );
18 int bamAttrArrayWrite(string &attr, const char* tagName, char* attrArray );
19 int bamAttrArrayWrite(const vector<char> &attr, const char* tagName, char* attrArray );
20 int bamAttrArrayWrite(const vector<int32> &attr, const char* tagName, char* attrArray );
21 int bamAttrArrayWriteSAMtags(string &attrStr, char *attrArray, Parameters &P);
22
23 template <class TintType>
bamAttributeInt(const char * bamAux,const char * attrName)24 TintType bamAttributeInt(const char *bamAux, const char *attrName) {//not tested!!!
25 const char *attrStart=strstr(bamAux,attrName);
26 if (attrStart==NULL) return (TintType) -1;
27 switch (attrStart[2]) {
28 case ('c'):
29 return (TintType) *(int8_t*)(attrStart+3);
30 case ('s'):
31 return (TintType) *(int16_t*)(attrStart+3);
32 case ('i'):
33 return (TintType) *(int32_t*)(attrStart+3);
34 case ('C'):
35 return (TintType) *(uint8_t*)(attrStart+3);
36 case ('S'):
37 return (TintType) *(uint16_t*)(attrStart+3);
38 case ('I'):
39 return (TintType) *(uint32_t*)(attrStart+3);
40 };
41 };
42
43 template <typename intType>
bamAttrArrayWriteInt(intType xIn,const char * tagName,char * attrArray,Parameters & P)44 int bamAttrArrayWriteInt(intType xIn, const char* tagName, char* attrArray, Parameters &P) {//adapted from samtools
45 attrArray[0]=tagName[0];attrArray[1]=tagName[1];
46 #define ATTR_RECORD_INT(_intChar,_intType,_intValue) attrArray[2] = _intChar; *(_intType*)(attrArray+3) = (_intType) _intValue; return 3+sizeof(_intType)
47 int64 x = (int64) xIn;
48 if (x < 0) {
49 if (x >= -127) {
50 ATTR_RECORD_INT('c',int8_t,x);
51 } else if (x >= -32767) {
52 ATTR_RECORD_INT('s',int16_t,x);
53 } else {
54 ATTR_RECORD_INT('i',int32_t,x);
55 if (!(x>=-2147483647)) {
56 ostringstream errOut;
57 errOut <<"EXITING because of FATAL BUG: integer out of range for BAM conversion: "<< x <<"\n";
58 errOut <<"SOLUTION: contact Alex Dobin at dobin@cshl.edu\n";
59 exitWithError(errOut.str(), std::cerr, P.inOut->logMain, EXIT_CODE_BUG, P);
60 };
61 };
62 } else {
63 if (x <= 255) {
64 ATTR_RECORD_INT('C',uint8_t,x);
65 } else if (x <= 65535) {
66 ATTR_RECORD_INT('S',uint16_t,x);
67 } else {
68 ATTR_RECORD_INT('I',uint32_t,x);
69 if (!(x<=4294967295)) {
70 ostringstream errOut;
71 errOut <<"EXITING because of FATAL BUG: integer out of range for BAM conversion: "<< x <<"\n";
72 errOut <<"SOLUTION: contact Alex Dobin at dobin@cshl.edu\n";
73 exitWithError(errOut.str(), std::cerr, P.inOut->logMain, EXIT_CODE_BUG, P);
74 };
75 };
76 };
77 };
78
79 #endif