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