Line 90: |
Line 90: |
| | | |
| | | |
− | == Simple Read/Write Indexed BAM Files == | + | == Read Only One Reference/Chromosome from Sorted/Indexed BAM Files == |
| This example reads in the inputFilename bam file and writes it back out section by section to the specified outputFilename, starting with section -1. It also prints a count of the number of records in each section. | | This example reads in the inputFilename bam file and writes it back out section by section to the specified outputFilename, starting with section -1. It also prints a count of the number of records in each section. |
| <source lang="cpp"> | | <source lang="cpp"> |
Line 173: |
Line 173: |
| } | | } |
| </source> | | </source> |
| + | |
| + | |
| + | == Read a Specified Region from a Sorted & Indexed BAM File == |
| + | This example is found in pipeline/bam/WriteRegion.cpp and is part of the bam executable. |
| + | |
| + | |
| + | <source lang="cpp"> |
| + | #include "SamFile.h" |
| + | #include "Parameters.h" |
| + | #include "BgzfFileType.h" |
| + | |
| + | int writeRegion(int argc, char **argv) |
| + | { |
| + | // Extract command line arguments. |
| + | static const int UNSPECIFIED_INT = -1; |
| + | String inFile = ""; |
| + | String outFile = ""; |
| + | String indexFile = ""; |
| + | String refName = ""; |
| + | int refID = UNSPECIFIED_INT; |
| + | int start = UNSPECIFIED_INT; |
| + | int end = UNSPECIFIED_INT; |
| + | bool noeof = false; |
| + | |
| + | ParameterList inputParameters; |
| + | BEGIN_LONG_PARAMETERS(longParameterList) |
| + | LONG_STRINGPARAMETER("in", &inFile) |
| + | LONG_STRINGPARAMETER("out", &outFile) |
| + | LONG_STRINGPARAMETER("bamIndex", &indexFile) |
| + | LONG_STRINGPARAMETER("refName", &refName) |
| + | LONG_INTPARAMETER("refID", &refID) |
| + | LONG_INTPARAMETER("start", &start) |
| + | LONG_INTPARAMETER("end", &end) |
| + | LONG_PARAMETER("noeof", &noeof) |
| + | END_LONG_PARAMETERS(); |
| + | |
| + | inputParameters.Add(new LongParameters ("Input Parameters", |
| + | longParameterList)); |
| + | |
| + | inputParameters.Read(argc-1, &(argv[1])); |
| + | |
| + | inputParameters.Status(); |
| + | |
| + | // If no eof block is required for a bgzf file, set the bgzf file type to |
| + | // not look for it. |
| + | if(noeof) |
| + | { |
| + | // Set that the eof block is not required. |
| + | BgzfFileType::setRequireEofBlock(false); |
| + | } |
| + | |
| + | // Check to see if the in file was specified, if not, report an error. |
| + | if(inFile == "") |
| + | { |
| + | writeRegionUsage(); |
| + | // mandatory argument was not specified. |
| + | std::cerr << "Missing mandatory argument: --in" << std::endl; |
| + | return(-1); |
| + | } |
| + | if(outFile == "") |
| + | { |
| + | writeRegionUsage(); |
| + | // mandatory argument was not specified. |
| + | std::cerr << "Missing mandatory argument: --out" << std::endl; |
| + | return(-1); |
| + | } |
| + | |
| + | if(indexFile == "") |
| + | { |
| + | // In file was not specified, so set it to the in file |
| + | // + ".bai" |
| + | indexFile = inFile + ".bai"; |
| + | } |
| + | |
| + | if(refID != -1 && refName.Length() != 0) |
| + | { |
| + | std::cerr << "Can't specify both refID and refName" << std::endl; |
| + | return(-1); |
| + | } |
| + | |
| + | SamFile samIn; |
| + | // Open the file for reading. |
| + | if(!samIn.OpenForRead(inFile)) |
| + | { |
| + | fprintf(stderr, "%s\n", samIn.GetStatusMessage()); |
| + | return(samIn.GetStatus()); |
| + | } |
| + | |
| + | // If refName is set, use that. |
| + | if(refName.Length() != 0) |
| + | { |
| + | // Use Reference Name. |
| + | if(!samIn.SetReadSection(refName.c_str(), start, end)) |
| + | { |
| + | fprintf(stderr, "%s\n", samIn.GetStatusMessage()); |
| + | return(samIn.GetStatus()); |
| + | } |
| + | } |
| + | else |
| + | { |
| + | // Use Reference ID |
| + | if(!samIn.SetReadSection(refID, start, end)) |
| + | { |
| + | fprintf(stderr, "%s\n", samIn.GetStatusMessage()); |
| + | return(samIn.GetStatus()); |
| + | } |
| + | } |
| + | |
| + | // Open the output file for writing. |
| + | SamFile samOut; |
| + | if(!samOut.OpenForWrite(outFile)) |
| + | { |
| + | fprintf(stderr, "%s\n", samOut.GetStatusMessage()); |
| + | return(samOut.GetStatus()); |
| + | } |
| + | |
| + | // Open the bam index file for reading. |
| + | if(!samIn.ReadBamIndex(indexFile)) |
| + | { |
| + | fprintf(stderr, "%s\n", samIn.GetStatusMessage()); |
| + | return(samIn.GetStatus()); |
| + | } |
| + | |
| + | // Read the sam header. |
| + | SamFileHeader samHeader; |
| + | if(!samIn.ReadHeader(samHeader)) |
| + | { |
| + | fprintf(stderr, "%s\n", samIn.GetStatusMessage()); |
| + | return(samIn.GetStatus()); |
| + | } |
| + | |
| + | // Write the sam header. |
| + | if(!samOut.WriteHeader(samHeader)) |
| + | { |
| + | fprintf(stderr, "%s\n", samOut.GetStatusMessage()); |
| + | return(samOut.GetStatus()); |
| + | } |
| + | |
| + | // Read the sam records. |
| + | SamRecord samRecord; |
| + | // Track the status. |
| + | int numSectionRecords = 0; |
| + | |
| + | // Set returnStatus to success. It will be changed |
| + | // to the failure reason if any of the writes fail. |
| + | SamStatus::Status returnStatus = SamStatus::SUCCESS; |
| + | |
| + | // Keep reading records until they aren't anymore. |
| + | while(samIn.ReadRecord(samHeader, samRecord)) |
| + | { |
| + | // Successfully read a record from the file, so write it. |
| + | if(!samOut.WriteRecord(samHeader, samRecord)) |
| + | { |
| + | // Failed to write a record. |
| + | fprintf(stderr, "%s\n", samOut.GetStatusMessage()); |
| + | returnStatus = samOut.GetStatus(); |
| + | } |
| + | ++numSectionRecords; |
| + | } |
| + | |
| + | if(samIn.GetStatus() != SamStatus::NO_MORE_RECS) |
| + | { |
| + | // Failed to read a record. |
| + | fprintf(stderr, "%s\n", samIn.GetStatusMessage()); |
| + | // Set the return status to the reason why |
| + | // the read failed. |
| + | returnStatus = samIn.GetStatus(); |
| + | } |
| + | |
| + | std::cout << "Wrote " << outFile << " with " << numSectionRecords << " records.\n"; |
| + | return(returnStatus); |
| + | } |
| + | </source> |
| + | |
| | | |
| == Validate SAM/BAM Files Continuing Processing After Allowed Errors == | | == Validate SAM/BAM Files Continuing Processing After Allowed Errors == |