]> git.donarmstrong.com Git - bamtools.git/commitdiff
Reviewed BAM to YAML conversion contribution (thank you Chase Miller). Reorganized...
authorderek <derek@donatello.(none)>
Mon, 4 Oct 2010 14:25:30 +0000 (10:25 -0400)
committerderek <derek@donatello.(none)>
Mon, 4 Oct 2010 14:26:47 +0000 (10:26 -0400)
src/toolkit/bamtools_convert.cpp
src/toolkit/bamtools_count.cpp
src/toolkit/bamtools_coverage.cpp
src/toolkit/bamtools_filter.cpp
src/toolkit/bamtools_sort.cpp

index f68207378788f3a1fcc7312c48e30f1334101005..b236b63dda0ce2eb20cc70c66d4e7a231269d523 100644 (file)
@@ -3,7 +3,7 @@
 // Marth Lab, Department of Biology, Boston College
 // All rights reserved.
 // ---------------------------------------------------------------------------
-// Last modified: 23 September 2010
+// Last modified: 4 October 2010
 // ---------------------------------------------------------------------------
 // Converts between BAM and a number of other formats
 // ***************************************************************************
@@ -34,10 +34,10 @@ namespace BamTools {
     static const string FORMAT_FASTA    = "fasta";
     static const string FORMAT_FASTQ    = "fastq";
     static const string FORMAT_JSON     = "json";
-    static const string FORMAT_YAML     = "yaml";
     static const string FORMAT_SAM      = "sam";
     static const string FORMAT_PILEUP   = "pileup";
     static const string FORMAT_WIGGLE   = "wig";
+    static const string FORMAT_YAML     = "yaml";
 
     // other constants
     static const unsigned int FASTA_LINE_MAX = 50;
@@ -130,9 +130,9 @@ struct ConvertTool::ConvertToolPrivate {
         void PrintFasta(const BamAlignment& a);
         void PrintFastq(const BamAlignment& a);
         void PrintJson(const BamAlignment& a);
-        void PrintYaml(const BamAlignment& a);
         void PrintSam(const BamAlignment& a);
         void PrintWiggle(const BamAlignment& a);
+       void PrintYaml(const BamAlignment& a);
         
         // special case - uses the PileupEngine
         bool RunPileupConversion(BamMultiReader* reader);
@@ -162,7 +162,21 @@ bool ConvertTool::ConvertToolPrivate::Run(void) {
     
     // open input files
     BamMultiReader reader;
-    reader.Open(m_settings->InputFiles);
+    if ( !m_settings->HasInput ) { // don't attempt to open index for stdin
+        if ( !reader.Open(m_settings->InputFiles, false) ) {
+            cerr << "Could not open input files" << endl;
+            return false;
+        }
+    } else {
+        if ( !reader.Open(m_settings->InputFiles, true) ) {
+            if ( !reader.Open(m_settings->InputFiles, false) ) {
+                cerr << "Could not open input files" << endl;
+                return false;
+            } else {
+                cerr << "Opened reader without index file, jumping is disabled." << endl;
+            }
+        }
+    }
     m_references = reader.GetReferenceData();
 
     // set region if specified
@@ -216,9 +230,9 @@ bool ConvertTool::ConvertToolPrivate::Run(void) {
         else if ( m_settings->Format == FORMAT_FASTA )    pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintFasta;
         else if ( m_settings->Format == FORMAT_FASTQ )    pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintFastq;
         else if ( m_settings->Format == FORMAT_JSON )     pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintJson;
-        else if ( m_settings->Format == FORMAT_YAML )     pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintYaml;
         else if ( m_settings->Format == FORMAT_SAM )      pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintSam;
         else if ( m_settings->Format == FORMAT_WIGGLE )   pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintWiggle;
+        else if ( m_settings->Format == FORMAT_YAML )     pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintYaml;
         else { 
             cerr << "Unrecognized format: " << m_settings->Format << endl;
             cerr << "Please see help|README (?) for details on supported formats " << endl;
@@ -466,7 +480,10 @@ void ConvertTool::ConvertToolPrivate::PrintJson(const BamAlignment& a) {
                 case('H') : 
                     m_out << "\""; 
                     while (tagData[index]) {
-                        m_out << tagData[index];
+                        if (tagData[index] == '\"')
+                            m_out << "\\\""; // escape for json
+                        else
+                            m_out << tagData[index];
                         ++index;
                     }
                     m_out << "\""; 
@@ -484,48 +501,6 @@ void ConvertTool::ConvertToolPrivate::PrintJson(const BamAlignment& a) {
     m_out << "}" << endl;
 }
 
-
-// Print BamAlignment in YAML format
-void ConvertTool::ConvertToolPrivate::PrintYaml(const BamAlignment& a) {
-
-
-        // write alignment name
-        m_out << "---" << endl;
-        m_out << a.Name << ":" << endl;
-
-        // write alignment data
-        m_out << "   " << "AlndBases: "  <<  a.AlignedBases << endl;
-        m_out << "   " << "Qualities: "     <<  a.Qualities << endl;
-        m_out << "   " << "Name: "          <<  a.Name << endl;
-        m_out << "   " << "Length: "        <<  a.Length << endl;
-        m_out << "   " << "TagData: "       <<  a.TagData << endl;
-        m_out << "   " << "RefID: "         <<  a.RefID << endl;
-        m_out << "   " << "RefName: "       <<  m_references[a.RefID].RefName << endl;
-        m_out << "   " << "Position: "      <<  a.Position << endl;
-        m_out << "   " << "Bin: "           <<  a.Bin << endl;
-        m_out << "   " << "MapQuality: "    <<  a.MapQuality << endl;
-        m_out << "   " << "AlignmentFlag: " <<  a.AlignmentFlag << endl;
-        m_out << "   " << "MateRefID: "     <<  a.MateRefID << endl;
-        m_out << "   " << "MatePosition: "  <<  a.MatePosition << endl;
-        m_out << "   " << "InsertSize: "    <<  a.InsertSize << endl;
-
-       // Write Cigar data
-       const vector<CigarOp>& cigarData = a.CigarData;
-       if ( !cigarData.empty() ) {
-          m_out << "   " <<  "Cigar: ";
-          vector<CigarOp>::const_iterator cigarBegin = cigarData.begin();
-          vector<CigarOp>::const_iterator cigarIter = cigarBegin;
-          vector<CigarOp>::const_iterator cigarEnd  = cigarData.end();
-          for ( ; cigarIter != cigarEnd; ++cigarIter ) {
-              const CigarOp& op = (*cigarIter);
-              m_out << op.Length << op.Type;
-          }
-       m_out << endl;
-       }
-
-}
-
-
 // print BamAlignment in SAM format
 void ConvertTool::ConvertToolPrivate::PrintSam(const BamAlignment& a) {
   
@@ -656,6 +631,44 @@ void ConvertTool::ConvertToolPrivate::PrintWiggle(const BamAlignment& a) {
     ; 
 }
 
+// Print BamAlignment in YAML format
+void ConvertTool::ConvertToolPrivate::PrintYaml(const BamAlignment& a) {
+
+    // write alignment name
+    m_out << "---" << endl;
+    m_out << a.Name << ":" << endl;
+
+    // write alignment data
+    m_out << "   " << "AlndBases: "     <<  a.AlignedBases << endl;
+    m_out << "   " << "Qualities: "     <<  a.Qualities << endl;
+    m_out << "   " << "Name: "          <<  a.Name << endl;
+    m_out << "   " << "Length: "        <<  a.Length << endl;
+    m_out << "   " << "TagData: "       <<  a.TagData << endl;
+    m_out << "   " << "RefID: "         <<  a.RefID << endl;
+    m_out << "   " << "RefName: "       <<  m_references[a.RefID].RefName << endl;
+    m_out << "   " << "Position: "      <<  a.Position << endl;
+    m_out << "   " << "Bin: "           <<  a.Bin << endl;
+    m_out << "   " << "MapQuality: "    <<  a.MapQuality << endl;
+    m_out << "   " << "AlignmentFlag: " <<  a.AlignmentFlag << endl;
+    m_out << "   " << "MateRefID: "     <<  a.MateRefID << endl;
+    m_out << "   " << "MatePosition: "  <<  a.MatePosition << endl;
+    m_out << "   " << "InsertSize: "    <<  a.InsertSize << endl;
+
+    // write Cigar data
+    const vector<CigarOp>& cigarData = a.CigarData;
+    if ( !cigarData.empty() ) {
+       m_out << "   " <<  "Cigar: ";
+       vector<CigarOp>::const_iterator cigarBegin = cigarData.begin();
+       vector<CigarOp>::const_iterator cigarIter = cigarBegin;
+       vector<CigarOp>::const_iterator cigarEnd  = cigarData.end();
+       for ( ; cigarIter != cigarEnd; ++cigarIter ) {
+           const CigarOp& op = (*cigarIter);
+           m_out << op.Length << op.Type;
+       }
+       m_out << endl;
+    }
+}
+
 bool ConvertTool::ConvertToolPrivate::RunPileupConversion(BamMultiReader* reader) {
   
     // check for valid BamMultiReader
index 20ed3ae7bd7d7552b21039157635ce822a68a01f..9d6623b3604cb79bb4dc54fa375c50660f67114e 100644 (file)
@@ -80,7 +80,10 @@ int CountTool::Run(int argc, char* argv[]) {
     
     // open reader without index
     BamMultiReader reader;
-    reader.Open(m_settings->InputFiles, false, true);
+    if (!reader.Open(m_settings->InputFiles, false, true)) {
+        cerr << "ERROR: Could not open input BAM file(s)... Aborting." << endl;
+        return 1;
+    }
 
     // alignment counter
     BamAlignment al;
index 5924edb78a85b93af928f56610dd0b9d8be2a007..d46ba2050b37337b96456e98ce3ae494d38d8acb 100644 (file)
@@ -123,7 +123,10 @@ bool CoverageTool::CoverageToolPrivate::Run(void) {
     
     //open our BAM reader
     BamReader reader;
-    reader.Open(m_settings->InputBamFilename);
+    if (!reader.Open(m_settings->InputBamFilename)) {
+        cerr << "Could not open " << m_settings->InputBamFilename << " for reading." << endl;
+        return false;
+    }
     m_references = reader.GetReferenceData();
     
     // set up our output 'visitor'
index cb153cf84fdd4c08c4c480eb3f2c68738883883e..59e89dd9e59d7c1f7bf3d3d8c94d9b8fa85763bf 100644 (file)
@@ -51,6 +51,7 @@ const string NAME_PROPERTY                = "name";
 const string POSITION_PROPERTY            = "position";
 const string QUERYBASES_PROPERTY          = "queryBases";
 const string REFERENCE_PROPERTY           = "reference";
+const string CIGAR_PROPERTY               = "cigar";
 
 // boolalpha
 const string TRUE_STR  = "true";
@@ -100,6 +101,20 @@ struct BamAlignmentChecker {
                 const string& refName = filterToolReferences.at(al.RefID).RefName;
                 keepAlignment &= valueFilter.check(refName);
             }
+            else if ( propertyName == CIGAR_PROPERTY ) {
+                stringstream cigarSs;
+                const vector<CigarOp>& cigarData = al.CigarData;
+                if ( !cigarData.empty() ) {
+                    vector<CigarOp>::const_iterator cigarBegin = cigarData.begin();
+                    vector<CigarOp>::const_iterator cigarIter = cigarBegin;
+                    vector<CigarOp>::const_iterator cigarEnd  = cigarData.end();
+                    for ( ; cigarIter != cigarEnd; ++cigarIter ) {
+                        const CigarOp& op = (*cigarIter);
+                        cigarSs << op.Length << op.Type;
+                    }
+                    keepAlignment &= valueFilter.check(cigarSs.str());
+                }
+            }
             else BAMTOOLS_ASSERT_UNREACHABLE;
             
             // if alignment fails at ANY point, just quit and return false
@@ -403,7 +418,8 @@ bool FilterTool::FilterToolPrivate::AddPropertyTokensToFilter(const string& filt
         else if ( propertyName == MATEREFERENCE_PROPERTY ||
                   propertyName == NAME_PROPERTY ||
                   propertyName == QUERYBASES_PROPERTY ||
-                  propertyName == REFERENCE_PROPERTY
+                  propertyName == REFERENCE_PROPERTY ||
+                  propertyName == CIGAR_PROPERTY
                 ) 
         {
             m_filterEngine.parseToken(token, stringValue, type);
@@ -482,6 +498,7 @@ void FilterTool::FilterToolPrivate::InitProperties(void) {
     m_propertyNames.push_back(POSITION_PROPERTY);
     m_propertyNames.push_back(QUERYBASES_PROPERTY);
     m_propertyNames.push_back(REFERENCE_PROPERTY);
+    m_propertyNames.push_back(CIGAR_PROPERTY);
     
     // add vector contents to FilterEngine<BamAlignmentChecker>
     vector<string>::const_iterator propertyNameIter = m_propertyNames.begin();
@@ -628,14 +645,20 @@ bool FilterTool::FilterToolPrivate::Run(void) {
 
     // open reader without index
     BamMultiReader reader;
-    reader.Open(m_settings->InputFiles, false, true);
+    if (!reader.Open(m_settings->InputFiles, false, true)) {
+        cerr << "Could not open input files for reading." << endl;
+        return false;
+    }
     const string headerText = reader.GetHeaderText();
     filterToolReferences = reader.GetReferenceData();
     
     // open writer
     BamWriter writer;
     bool writeUncompressed = ( m_settings->OutputFilename == Options::StandardOut() && !m_settings->IsForceCompression );
-    writer.Open(m_settings->OutputFilename, headerText, filterToolReferences, writeUncompressed);
+    if (!writer.Open(m_settings->OutputFilename, headerText, filterToolReferences, writeUncompressed)) {
+        cerr << "Could not open " << m_settings->OutputFilename << " for writing." << endl;
+        return false;
+    }
     
     BamAlignment al;
     
index 83584a6c8bd9b258bca86a6b4094b2761ceddc82..a6b3bba7a1964b40c4f3b5757469901e5352b2c9 100644 (file)
@@ -197,7 +197,10 @@ bool SortTool::SortToolPrivate::GenerateSortedRuns(void) {
     
     // open input BAM file
     BamReader inputReader;
-    inputReader.Open(m_settings->InputBamFilename);
+    if (!inputReader.Open(m_settings->InputBamFilename)) {
+        cerr << "Could not open " << m_settings->InputBamFilename << " for reading." << endl;
+        return false;
+    }
     
     // get basic data that will be shared by all temp/output files 
     m_headerText = inputReader.GetHeaderText();
@@ -322,4 +325,4 @@ bool SortTool::SortToolPrivate::WriteTempFile(const vector<BamAlignment>& buffer
     // close temp file & return success
     tempWriter.Close();
     return true;
-}
\ No newline at end of file
+}