18 #include "ReadFiles.h"
19 #include "TestValidate.h"
27 assert(!inSam1.IsEOF());
29 assert(inSam1.ReadRecord(samHdr, rec) ==
true);
30 assert(inSam1.IsEOF());
41 testFlagRead(
"testFiles/testSam.sam");
48 assert(!inSam1.IsEOF());
50 assert(inSam1.ReadRecord(samHdr, rec) ==
true);
51 assert(inSam1.IsEOF());
62 testFlagRead(
"testFiles/testBam.bam");
70 assert(!inSam.
IsEOF());
72 validateHeader(samHeader);
74 testCopyHeader(samHeader);
76 testModHeader(samHeader);
79 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
80 validateRead1(samRecord);
84 validateRead1ModQuality(samRecord);
87 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
88 validateRead2(samRecord);
90 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
91 validateRead3(samRecord);
93 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
94 validateRead4(samRecord);
96 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
97 validateRead5(samRecord);
99 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
100 validateRead6(samRecord);
102 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
103 validateRead7(samRecord);
105 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
106 validateRead8(samRecord);
108 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
109 validateRead9(samRecord);
111 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
112 validateRead10(samRecord);
116 void testAddHeaderAndTagToFile(
const char* inputName,
const char* outputName)
127 assert(samHeader.
addHeaderLine(
"@RG\tID:myID\tSM:mySM") ==
false);
128 assert(samHeader.
addHeaderLine(
"@RG\tID:myID3\tSM:mySM") ==
true);
134 assert(inSam.
ReadRecord(samHeader, samRecord));
139 assert(samRecord.
addTag(
"RR",
'Z',
"myID1"));
140 assert(samRecord.
addTag(
"RR",
'Z',
"myID2"));
149 assert(inSam.
ReadRecord(samHeader, samRecord));
150 assert(inSam.
ReadRecord(samHeader, samRecord));
157 assert(newMDTag ==
"2T1N0");
158 assert(SamTags::updateMDTag(samRecord, reference));
165 void testValidateSortedRead()
169 assert(inSam.
OpenForRead(
"testFiles/testSam.sam"));
180 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
181 validateRead1(samRecord);
184 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
185 validateRead2(samRecord);
188 assert(inSam.
ReadRecord(samHeader, samRecord) ==
false);
189 validateRead3(samRecord);
192 assert(inSam.
ReadRecord(samHeader, samRecord) ==
false);
193 validateRead4(samRecord);
196 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
197 validateRead5(samRecord);
200 assert(inSam.
ReadRecord(samHeader, samRecord) ==
false);
201 validateRead6(samRecord);
204 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
205 validateRead7(samRecord);
208 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
209 validateRead8(samRecord);
212 assert(inSam.
ReadRecord(samHeader, samRecord) ==
false);
213 validateRead9(samRecord);
216 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
217 validateRead10(samRecord);
222 assert(inSam.
OpenForRead(
"testFiles/testSam.sam"));
231 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
232 validateRead1(samRecord);
235 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
236 validateRead2(samRecord);
239 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
240 validateRead3(samRecord);
243 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
244 validateRead4(samRecord);
247 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
248 validateRead5(samRecord);
251 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
252 validateRead6(samRecord);
255 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
256 validateRead7(samRecord);
259 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
260 validateRead8(samRecord);
263 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
264 validateRead9(samRecord);
267 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
268 validateRead10(samRecord);
272 assert(inSam.
OpenForRead(
"testFiles/testSam.sam"));
281 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
282 validateRead1(samRecord);
284 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
285 validateRead2(samRecord);
287 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
288 validateRead3(samRecord);
290 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
291 validateRead4(samRecord);
293 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
294 validateRead5(samRecord);
296 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
297 validateRead6(samRecord);
299 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
300 validateRead7(samRecord);
302 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
303 validateRead8(samRecord);
305 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
306 validateRead9(samRecord);
308 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
309 validateRead10(samRecord);
313 assert(inSam.
OpenForRead(
"testFiles/testSamSOcoord.sam"));
322 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
323 validateRead1(samRecord);
326 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
327 validateRead2(samRecord);
330 assert(inSam.
ReadRecord(samHeader, samRecord) ==
false);
331 validateRead3(samRecord);
334 assert(inSam.
ReadRecord(samHeader, samRecord) ==
false);
335 validateRead4(samRecord);
338 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
339 validateRead5(samRecord);
342 assert(inSam.
ReadRecord(samHeader, samRecord) ==
false);
343 validateRead6(samRecord);
346 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
347 validateRead7(samRecord);
350 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
351 validateRead8(samRecord);
354 assert(inSam.
ReadRecord(samHeader, samRecord) ==
false);
355 validateRead9(samRecord);
358 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
359 validateRead10(samRecord);
364 assert(inSam.
OpenForRead(
"testFiles/testSamSOquery.sam"));
373 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
374 validateRead1(samRecord);
377 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
378 validateRead2(samRecord);
381 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
382 validateRead3(samRecord);
385 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
386 validateRead4(samRecord);
389 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
390 validateRead5(samRecord);
393 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
394 validateRead6(samRecord);
397 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
398 validateRead7(samRecord);
401 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
402 validateRead8(samRecord);
405 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
406 validateRead9(samRecord);
409 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
410 validateRead10(samRecord);
414 assert(inSam.
OpenForRead(
"testFiles/testSamSOinvalid.sam"));
423 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
424 validateRead1(samRecord);
426 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
427 validateRead2(samRecord);
429 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
430 validateRead3(samRecord);
432 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
433 validateRead4(samRecord);
435 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
436 validateRead5(samRecord);
438 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
439 validateRead6(samRecord);
441 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
442 validateRead7(samRecord);
444 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
445 validateRead8(samRecord);
447 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
448 validateRead9(samRecord);
450 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
451 validateRead10(samRecord);
456 void validateRead1ModQuality(
SamRecord& samRecord)
461 int expectedBlockSize = 89;
462 const char* expectedReferenceName =
"1";
463 const char* expectedMateReferenceName =
"1";
464 const char* expectedMateReferenceNameOrEqual =
"=";
473 unsigned char* varPtr;
475 expectedRecordPtr->myBlockSize = expectedBlockSize;
476 expectedRecordPtr->myReferenceID = 0;
477 expectedRecordPtr->myPosition = 1010;
478 expectedRecordPtr->myReadNameLength = 23;
479 expectedRecordPtr->myMapQuality = 0;
480 expectedRecordPtr->myBin = 4681;
481 expectedRecordPtr->myCigarLength = 2;
482 expectedRecordPtr->myFlag = 73;
483 expectedRecordPtr->myReadLength = 5;
484 expectedRecordPtr->myMateReferenceID = 0;
485 expectedRecordPtr->myMatePosition = 1010;
486 expectedRecordPtr->myInsertSize = 0;
498 assert(samRecord.
getBlockSize() == expectedRecordPtr->myBlockSize);
499 assert(samRecord.
getReferenceID() == expectedRecordPtr->myReferenceID);
504 expectedRecordPtr->myReadNameLength);
505 assert(samRecord.
getMapQuality() == expectedRecordPtr->myMapQuality);
506 assert(samRecord.
getBin() == expectedRecordPtr->myBin);
507 assert(samRecord.
getCigarLength() == expectedRecordPtr->myCigarLength);
508 assert(samRecord.
getFlag() == expectedRecordPtr->myFlag);
509 assert(samRecord.
getReadLength() == expectedRecordPtr->myReadLength);
511 expectedRecordPtr->myMateReferenceID);
513 expectedMateReferenceName) == 0);
515 expectedMateReferenceNameOrEqual) == 0);
517 expectedRecordPtr->myMatePosition + 1);
519 expectedRecordPtr->myMatePosition);
520 assert(samRecord.
getInsertSize() == expectedRecordPtr->myInsertSize);
521 assert(strcmp(samRecord.
getReadName(),
"1:1011:F:255+17M15D20M") == 0);
522 assert(strcmp(samRecord.
getCigar(),
"5M2D") == 0);
523 assert(strcmp(samRecord.
getSequence(),
"CCGAA") == 0);
524 assert(strcmp(samRecord.
getQuality(),
"ABCDE") == 0);
538 assert(tag[0] ==
'A');
539 assert(tag[1] ==
'M');
541 assert(*(
char*)value == 0);
543 assert(tag[0] ==
'M');
544 assert(tag[1] ==
'D');
546 assert(*(
String*)value ==
"37");
548 assert(tag[0] ==
'N');
549 assert(tag[1] ==
'M');
551 assert(*(
char*)value == 0);
553 assert(tag[0] ==
'X');
554 assert(tag[1] ==
'T');
556 assert(*(
char*)value ==
'R');
564 assert(bufferPtr->myBlockSize == expectedRecordPtr->myBlockSize);
565 assert(bufferPtr->myReferenceID == expectedRecordPtr->myReferenceID);
566 assert(bufferPtr->myPosition == expectedRecordPtr->myPosition);
567 assert(bufferPtr->myReadNameLength == expectedRecordPtr->myReadNameLength);
568 assert(bufferPtr->myMapQuality == expectedRecordPtr->myMapQuality);
569 assert(bufferPtr->myBin == expectedRecordPtr->myBin);
570 assert(bufferPtr->myCigarLength == expectedRecordPtr->myCigarLength);
571 assert(bufferPtr->myFlag == expectedRecordPtr->myFlag);
572 assert(bufferPtr->myReadLength == expectedRecordPtr->myReadLength);
573 assert(bufferPtr->myMateReferenceID ==
574 expectedRecordPtr->myMateReferenceID);
575 assert(bufferPtr->myMatePosition == expectedRecordPtr->myMatePosition);
576 assert(bufferPtr->myInsertSize == expectedRecordPtr->myInsertSize);
580 varPtr = (
unsigned char*)(&(bufferPtr->myData[0]));
583 for(
int i = 0; i < expectedRecordPtr->myReadNameLength; i++)
591 assert(*(
unsigned int*)varPtr == 80);
595 assert(*(
unsigned int*)varPtr == 34);
601 assert(*varPtr == 0x22);
604 assert(*varPtr == 0x41);
607 assert(*varPtr == 0x10);
611 for(
int i = 0; i < expectedRecordPtr->myReadLength; i++)
613 assert(*varPtr == samRecord.
getQuality()[i] - 33);
618 assert(*varPtr ==
'A');
620 assert(*varPtr ==
'M');
622 assert(*varPtr ==
'C');
624 assert(*varPtr == 0);
626 assert(*varPtr ==
'M');
628 assert(*varPtr ==
'D');
630 assert(*varPtr ==
'Z');
632 assert(*varPtr ==
'3');
634 assert(*varPtr ==
'7');
636 assert(*varPtr == 0);
638 assert(*varPtr ==
'N');
640 assert(*varPtr ==
'M');
642 assert(*varPtr ==
'C');
644 assert(*varPtr == 0);
646 assert(*varPtr ==
'X');
648 assert(*varPtr ==
'T');
650 assert(*varPtr ==
'A');
652 assert(*varPtr ==
'R');
660 std::string headerString =
"";
662 assert(headerString ==
"@SQ\tSN:1\tLN:247249719\n@SQ\tSN:2\tLN:242951149\n@SQ\tSN:3\tLN:199501827\n@SQ\tSN:4\tLN:191273063\n@SQ\tSN:5\tLN:180857866\n@SQ\tSN:6\tLN:170899992\n@SQ\tSN:7\tLN:158821424\n@SQ\tSN:8\tLN:146274826\n@SQ\tSN:9\tLN:140273252\n@SQ\tSN:10\tLN:135374737\n@SQ\tSN:11\tLN:134452384\n@SQ\tSN:12\tLN:132349534\n@SQ\tSN:13\tLN:114142980\n@SQ\tSN:14\tLN:106368585\n@SQ\tSN:15\tLN:100338915\n@SQ\tSN:16\tLN:88827254\n@SQ\tSN:17\tLN:78774742\n@SQ\tSN:18\tLN:76117153\n@SQ\tSN:19\tLN:63811651\n@SQ\tSN:20\tLN:62435964\n@SQ\tSN:21\tLN:46944323\n@SQ\tSN:22\tLN:49691432\n@SQ\tSN:X\tLN:154913754\n@RG\tID:myID\tLB:library\tSM:sample\n@RG\tID:myID2\tSM:sample2\tLB:library2\n@CO\tComment 1\n@CO\tComment 2\n");
665 assert(samHeader.
setRGTag(
"LB",
"",
"myID2") ==
true);
670 assert(headerString ==
"@SQ\tSN:1\tLN:247249719\n@SQ\tSN:2\tLN:242951149\n@SQ\tSN:3\tLN:199501827\n@SQ\tSN:4\tLN:191273063\n@SQ\tSN:5\tLN:180857866\n@SQ\tSN:6\tLN:170899992\n@SQ\tSN:7\tLN:158821424\n@SQ\tSN:8\tLN:146274826\n@SQ\tSN:9\tLN:140273252\n@SQ\tSN:10\tLN:135374737\n@SQ\tSN:11\tLN:134452384\n@SQ\tSN:12\tLN:132349534\n@SQ\tSN:13\tLN:114142980\n@SQ\tSN:14\tLN:106368585\n@SQ\tSN:15\tLN:100338915\n@SQ\tSN:16\tLN:88827254\n@SQ\tSN:17\tLN:78774742\n@SQ\tSN:18\tLN:76117153\n@SQ\tSN:19\tLN:63811651\n@SQ\tSN:20\tLN:62435964\n@SQ\tSN:21\tLN:46944323\n@SQ\tSN:22\tLN:49691432\n@SQ\tSN:X\tLN:154913754\n@RG\tID:myID\tLB:library\tSM:sample\n@RG\tID:myID2\tSM:sample2\n@CO\tComment 1\n@CO\tComment 2\n");
674 assert(hd->
setTag(
"VN",
"1.3") ==
true);
675 assert(samHeader.
addHD(hd) ==
true);
678 assert(headerString ==
"@SQ\tSN:1\tLN:247249719\n@SQ\tSN:2\tLN:242951149\n@SQ\tSN:3\tLN:199501827\n@SQ\tSN:4\tLN:191273063\n@SQ\tSN:5\tLN:180857866\n@SQ\tSN:6\tLN:170899992\n@SQ\tSN:7\tLN:158821424\n@SQ\tSN:8\tLN:146274826\n@SQ\tSN:9\tLN:140273252\n@SQ\tSN:10\tLN:135374737\n@SQ\tSN:11\tLN:134452384\n@SQ\tSN:12\tLN:132349534\n@SQ\tSN:13\tLN:114142980\n@SQ\tSN:14\tLN:106368585\n@SQ\tSN:15\tLN:100338915\n@SQ\tSN:16\tLN:88827254\n@SQ\tSN:17\tLN:78774742\n@SQ\tSN:18\tLN:76117153\n@SQ\tSN:19\tLN:63811651\n@SQ\tSN:20\tLN:62435964\n@SQ\tSN:21\tLN:46944323\n@SQ\tSN:22\tLN:49691432\n@SQ\tSN:X\tLN:154913754\n@RG\tID:myID\tLB:library\tSM:sample\n@RG\tID:myID2\tSM:sample2\n@HD\tVN:1.3\n@CO\tComment 1\n@CO\tComment 2\n");
682 assert(hd2->
setTag(
"VN",
"1.4") ==
true);
683 assert(samHeader.
addHD(hd2) ==
false);
687 assert(headerString ==
"@SQ\tSN:1\tLN:247249719\n@SQ\tSN:2\tLN:242951149\n@SQ\tSN:3\tLN:199501827\n@SQ\tSN:4\tLN:191273063\n@SQ\tSN:5\tLN:180857866\n@SQ\tSN:6\tLN:170899992\n@SQ\tSN:7\tLN:158821424\n@SQ\tSN:8\tLN:146274826\n@SQ\tSN:9\tLN:140273252\n@SQ\tSN:10\tLN:135374737\n@SQ\tSN:11\tLN:134452384\n@SQ\tSN:12\tLN:132349534\n@SQ\tSN:13\tLN:114142980\n@SQ\tSN:14\tLN:106368585\n@SQ\tSN:15\tLN:100338915\n@SQ\tSN:16\tLN:88827254\n@SQ\tSN:17\tLN:78774742\n@SQ\tSN:18\tLN:76117153\n@SQ\tSN:19\tLN:63811651\n@SQ\tSN:20\tLN:62435964\n@SQ\tSN:21\tLN:46944323\n@SQ\tSN:22\tLN:49691432\n@SQ\tSN:X\tLN:154913754\n@RG\tID:myID\tLB:library\tSM:sample\n@RG\tID:myID2\tSM:sample2\n@HD\tVN:1.3\n@CO\tComment 1\n@CO\tComment 2\n");
690 assert(samHeader.
removeHD() ==
true);
693 assert(headerString ==
"@SQ\tSN:1\tLN:247249719\n@SQ\tSN:2\tLN:242951149\n@SQ\tSN:3\tLN:199501827\n@SQ\tSN:4\tLN:191273063\n@SQ\tSN:5\tLN:180857866\n@SQ\tSN:6\tLN:170899992\n@SQ\tSN:7\tLN:158821424\n@SQ\tSN:8\tLN:146274826\n@SQ\tSN:9\tLN:140273252\n@SQ\tSN:10\tLN:135374737\n@SQ\tSN:11\tLN:134452384\n@SQ\tSN:12\tLN:132349534\n@SQ\tSN:13\tLN:114142980\n@SQ\tSN:14\tLN:106368585\n@SQ\tSN:15\tLN:100338915\n@SQ\tSN:16\tLN:88827254\n@SQ\tSN:17\tLN:78774742\n@SQ\tSN:18\tLN:76117153\n@SQ\tSN:19\tLN:63811651\n@SQ\tSN:20\tLN:62435964\n@SQ\tSN:21\tLN:46944323\n@SQ\tSN:22\tLN:49691432\n@SQ\tSN:X\tLN:154913754\n@RG\tID:myID\tLB:library\tSM:sample\n@RG\tID:myID2\tSM:sample2\n@CO\tComment 1\n@CO\tComment 2\n");
696 assert(strcmp(samHeader.
getSQTagValue(
"LN",
"11"),
"134452384") == 0);
697 assert(samHeader.
removeSQ(
"11") ==
true);
698 assert(strcmp(samHeader.
getSQTagValue(
"LN",
"11"),
"") == 0);
700 assert(headerString ==
"@SQ\tSN:1\tLN:247249719\n@SQ\tSN:2\tLN:242951149\n@SQ\tSN:3\tLN:199501827\n@SQ\tSN:4\tLN:191273063\n@SQ\tSN:5\tLN:180857866\n@SQ\tSN:6\tLN:170899992\n@SQ\tSN:7\tLN:158821424\n@SQ\tSN:8\tLN:146274826\n@SQ\tSN:9\tLN:140273252\n@SQ\tSN:10\tLN:135374737\n@SQ\tSN:12\tLN:132349534\n@SQ\tSN:13\tLN:114142980\n@SQ\tSN:14\tLN:106368585\n@SQ\tSN:15\tLN:100338915\n@SQ\tSN:16\tLN:88827254\n@SQ\tSN:17\tLN:78774742\n@SQ\tSN:18\tLN:76117153\n@SQ\tSN:19\tLN:63811651\n@SQ\tSN:20\tLN:62435964\n@SQ\tSN:21\tLN:46944323\n@SQ\tSN:22\tLN:49691432\n@SQ\tSN:X\tLN:154913754\n@RG\tID:myID\tLB:library\tSM:sample\n@RG\tID:myID2\tSM:sample2\n@CO\tComment 1\n@CO\tComment 2\n");
704 assert(samHeader.
addHD(hd) ==
false);
709 assert(headerString ==
"@SQ\tSN:1\tLN:247249719\n@SQ\tSN:2\tLN:242951149\n@SQ\tSN:3\tLN:199501827\n@SQ\tSN:4\tLN:191273063\n@SQ\tSN:5\tLN:180857866\n@SQ\tSN:6\tLN:170899992\n@SQ\tSN:7\tLN:158821424\n@SQ\tSN:8\tLN:146274826\n@SQ\tSN:9\tLN:140273252\n@SQ\tSN:10\tLN:135374737\n@SQ\tSN:12\tLN:132349534\n@SQ\tSN:13\tLN:114142980\n@SQ\tSN:14\tLN:106368585\n@SQ\tSN:15\tLN:100338915\n@SQ\tSN:16\tLN:88827254\n@SQ\tSN:17\tLN:78774742\n@SQ\tSN:18\tLN:76117153\n@SQ\tSN:19\tLN:63811651\n@SQ\tSN:20\tLN:62435964\n@SQ\tSN:21\tLN:46944323\n@SQ\tSN:22\tLN:49691432\n@SQ\tSN:X\tLN:154913754\n@RG\tID:myID\tLB:library\tSM:sample\n@RG\tID:myID2\tSM:sample2\n@CO\tComment 1\n@CO\tComment 2\n");
713 assert(samHeader.
addSQ(sq) ==
false);
715 assert(headerString ==
"@SQ\tSN:1\tLN:247249719\n@SQ\tSN:2\tLN:242951149\n@SQ\tSN:3\tLN:199501827\n@SQ\tSN:4\tLN:191273063\n@SQ\tSN:5\tLN:180857866\n@SQ\tSN:6\tLN:170899992\n@SQ\tSN:7\tLN:158821424\n@SQ\tSN:8\tLN:146274826\n@SQ\tSN:9\tLN:140273252\n@SQ\tSN:10\tLN:135374737\n@SQ\tSN:12\tLN:132349534\n@SQ\tSN:13\tLN:114142980\n@SQ\tSN:14\tLN:106368585\n@SQ\tSN:15\tLN:100338915\n@SQ\tSN:16\tLN:88827254\n@SQ\tSN:17\tLN:78774742\n@SQ\tSN:18\tLN:76117153\n@SQ\tSN:19\tLN:63811651\n@SQ\tSN:20\tLN:62435964\n@SQ\tSN:21\tLN:46944323\n@SQ\tSN:22\tLN:49691432\n@SQ\tSN:X\tLN:154913754\n@RG\tID:myID\tLB:library\tSM:sample\n@RG\tID:myID2\tSM:sample2\n@CO\tComment 1\n@CO\tComment 2\n");
718 assert(samHeader.
addHD(hd2) ==
true);
722 assert(headerString ==
"@SQ\tSN:1\tLN:247249719\n@SQ\tSN:2\tLN:242951149\n@SQ\tSN:3\tLN:199501827\n@SQ\tSN:4\tLN:191273063\n@SQ\tSN:5\tLN:180857866\n@SQ\tSN:6\tLN:170899992\n@SQ\tSN:7\tLN:158821424\n@SQ\tSN:8\tLN:146274826\n@SQ\tSN:9\tLN:140273252\n@SQ\tSN:10\tLN:135374737\n@SQ\tSN:12\tLN:132349534\n@SQ\tSN:13\tLN:114142980\n@SQ\tSN:14\tLN:106368585\n@SQ\tSN:15\tLN:100338915\n@SQ\tSN:16\tLN:88827254\n@SQ\tSN:17\tLN:78774742\n@SQ\tSN:18\tLN:76117153\n@SQ\tSN:19\tLN:63811651\n@SQ\tSN:20\tLN:62435964\n@SQ\tSN:21\tLN:46944323\n@SQ\tSN:22\tLN:49691432\n@SQ\tSN:X\tLN:154913754\n@RG\tID:myID\tLB:library\tSM:sample\n@RG\tID:myID2\tSM:sample2\n@HD\tVN:1.4\n@CO\tComment 1\n@CO\tComment 2\n");
731 void testFlagRead(
const char* fileName)
742 validateHeader(samHeader);
745 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
746 validateRead1(samRecord);
748 assert(inSam.
ReadRecord(samHeader, samRecord) ==
false);
757 validateHeader(samHeader);
760 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
761 validateRead2(samRecord);
763 assert(inSam.
ReadRecord(samHeader, samRecord) ==
false);
773 validateHeader(samHeader);
776 assert(inSam.
ReadRecord(samHeader, samRecord) ==
false);
786 validateHeader(samHeader);
789 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
790 validateRead2(samRecord);
792 assert(inSam.
ReadRecord(samHeader, samRecord) ==
false);
802 validateHeader(samHeader);
805 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
806 validateRead2(samRecord);
808 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
809 validateRead8(samRecord);
811 assert(inSam.
ReadRecord(samHeader, samRecord) ==
true);
812 validateRead10(samRecord);
814 assert(inSam.
ReadRecord(samHeader, samRecord) ==
false);
826 while(recPtr != NULL)
833 while(nextComment != SamFileHeader::EMPTY_RETURN)
839 validateHeader(samHeader2);
@ RETURN
just return failure on the error
Create/Access/Modify/Load Genome Sequences stored as binary mapped files.
Allows the user to easily read/write a SAM/BAM file.
bool ReadHeader(SamFileHeader &header)
Reads the header section from the file and stores it in the passed in header.
void Close()
Close the file if there is one open.
@ FLAG
SO flag from the header indicates the sort type.
@ QUERY_NAME
file is sorted by queryname.
@ COORDINATE
file is sorted by coordinate.
bool ReadRecord(SamFileHeader &header, SamRecord &record)
Reads the next record from the file & stores it in the passed in record.
void SetReadFlags(uint16_t requiredFlags, uint16_t excludedFlags)
Specify which reads should be returned by ReadRecord.
bool OpenForRead(const char *filename, SamFileHeader *header=NULL)
Open a sam/bam file for reading with the specified filename, determing the type of file and SAM/BAM b...
bool IsEOF()
Returns whether or not the end of the file has been reached.
bool OpenForWrite(const char *filename, SamFileHeader *header=NULL)
Open a sam/bam file for writing with the specified filename, determining SAM/BAM from the extension (...
bool WriteHeader(SamFileHeader &header)
Writes the specified header into the file.
bool WriteRecord(SamFileHeader &header, SamRecord &record)
Writes the specified record into the file.
void setSortedValidation(SortedType sortType)
Set the flag to validate that the file is sorted as it is read/written.
Class providing an easy to use interface to get/set/operate on the fields in a SAM/BAM record.
int32_t getBlockSize()
Get the block size of the record (BAM format).
uint16_t getCigarLength()
Get the length of the BAM formatted CIGAR.
const char * getReferenceName()
Get the reference sequence name (RNAME) of the record.
int32_t getInsertSize()
Get the inferred insert size of the read pair (ISIZE) or observed template length (TLEN).
int32_t get0BasedMatePosition()
Get the 0-based(BAM) leftmost mate/next fragment's position.
int32_t get1BasedPosition()
Get the 1-based(SAM) leftmost position (POS) of the record.
bool addIntTag(const char *tag, int32_t value)
Add the specified integer tag to the record.
int32_t getReferenceID()
Get the reference sequence id of the record (BAM format rid).
int32_t getAlignmentLength()
Returns the length of the clipped sequence, returning 0 if the cigar is '*'.
int32_t get1BasedAlignmentEnd()
Returns the 1-based inclusive rightmost position of the clipped sequence.
uint8_t getReadNameLength()
Get the length of the readname (QNAME) including the null.
const char * getMateReferenceNameOrEqual()
Get the mate/next fragment's reference sequence name (RNEXT), returning "=" if it is the same as the ...
int32_t get1BasedUnclippedStart()
Returns the 1-based inclusive left-most position adjusted for clipped bases.
bool addTag(const char *tag, char vtype, const char *value)
Add the specified tag,vtype,value to the record.
uint16_t getBin()
Get the BAM bin for the record.
int32_t getMateReferenceID()
Get the mate reference id of the record (BAM format: mate_rid/next_refID).
uint16_t getFlag()
Get the flag (FLAG).
const void * getRecordBuffer()
Get a const pointer to the buffer that contains the BAM representation of the record.
int32_t get1BasedMatePosition()
Get the 1-based(SAM) leftmost mate/next fragment's position (PNEXT).
int32_t get0BasedUnclippedEnd()
Returns the 0-based inclusive right-most position adjusted for clipped bases.
int32_t get1BasedUnclippedEnd()
Returns the 1-based inclusive right-most position adjusted for clipped bases.
uint32_t getNumOverlaps(int32_t start, int32_t end)
Return the number of bases in this read that overlap the passed in region.
const char * getMateReferenceName()
Get the mate/next fragment's reference sequence name (RNEXT).
bool getNextSamTag(char *tag, char &vtype, void **value)
Get the next tag from the record.
int32_t get0BasedUnclippedStart()
Returns the 0-based inclusive left-most position adjusted for clipped bases.
int32_t getReadLength()
Get the length of the read.
int32_t get0BasedAlignmentEnd()
Returns the 0-based inclusive rightmost position of the clipped sequence.
int32_t get0BasedPosition()
Get the 0-based(BAM) leftmost position of the record.
const char * getCigar()
Returns the SAM formatted CIGAR string.
uint8_t getMapQuality()
Get the mapping quality (MAPQ) of the record.
const char * getReadName()
Returns the SAM formatted Read Name (QNAME).
void resetTagIter()
Reset the tag iterator to the beginning of the tags.
bool setQuality(const char *quality)
Sets the quality (QUAL) to the specified SAM formatted quality string.
const char * getQuality()
Returns the SAM formatted quality string (QUAL).
const char * getSequence()
Returns the SAM formatted sequence string (SEQ), translating the base as specified by setSequenceTran...
Structure of a BAM record.