libStatGen Software  1
SamHeaderRecord.h
1 /*
2  * Copyright (C) 2010 Regents of the University of Michigan
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef __SAMHEADER_RECORD_H__
19 #define __SAMHEADER_RECORD_H__
20 
21 #include "StringArray.h"
22 #include "StringHash.h"
23 #include "SamHeaderTag.h"
24 
25 /// This class encapsulates the tag value pairs contained with a SAM Header
26 /// line with accessors for getting and setting the tags within this header.
28 {
29 public:
30  /// Specifies the Type for the sam header record (line).
32  HD, ///< Header
33  SQ, ///< Sequence Dictionary
34  RG, ///< Read Group
35  PG ///< Program
36  };
37 
38  /// Constructor
40 
41  /// Destructor
42  virtual ~SamHeaderRecord();
43 
44  /// Return a pointer to a newly created header record of the appropriate type
45  /// that is a copy of this record. The newly created record will not be
46  /// deleted by this class and it is the responsibility of the calling method
47  /// to handle the deletion.
48  /// Returns NULL on failure to copy.
49  virtual SamHeaderRecord* createCopy() const = 0;
50 
51  /// Set the fields from the passed in line.
52  /// Return true if successfully set.
53  bool setFields(const StringArray& tokens);
54 
55  /// Check to see if the record is valid.
56  bool isValid();
57 
58  /// Return the value associated with the specified tag. Returns "" if it
59  /// is not set.
60  const char* getTagValue(const char* tag) const;
61 
62  /// Set the value of the specified tag to the specified value, deletes
63  /// the tag when value is NULL.
64  /// Returns whether or not it was successful, fails if tag is the key tag
65  /// and the key tag already exists.
66  bool setTag(const char* tag, const char* value);
67 
68  /// Reset this header record to an empty state with no tags.
69  void reset();
70 
71  /// Appends the string representation of this header record
72  /// to the passed in string.
73  bool appendString(std::string& header);
74 
75  /// Add the key tag with the specified value (not for HD headers).
76  bool addKey(const char* value);
77 
78  /// Get the value associated with the key tag. Returns "" if it is not set.
79  const char* getKeyValue() const;
80 
81  /// This record is active (true) if there is at least one tag set.
82  bool isActiveHeaderRecord();
83 
84  /// Return the type of this header record (HD, SQ, RG, or PG) as a string.
85  const char* getTypeString();
86 
87  /// Return the type of this header record (HD, SQ, RG, or PG) as an enum.
89 
90 protected:
91  void addRequiredTag(const char* requiredTag);
92 
93  // Copy this record into the specified new one.
94  virtual void internalCopy(SamHeaderRecord& newRec) const;
95 
96  // The type for this header record.
97  std::string myTypeString;
98 
99  // The type for this header record.
100  SamHeaderRecordType myType;
101 
102  // The TAG name that is the key for this record
103  // Only applicable if more than one of this type
104  // of record is allowed.
105  std::string myKeyTag;
106 
107 private:
108  SamHeaderRecord(const SamHeaderRecord& samHeaderRecord);
109  SamHeaderRecord& operator=(const SamHeaderRecord& samHeaderRecord);
110 
111  // hash from tag name to index into the tag values vector.
112  StringIntHash myTagHash;
113  std::vector<SamHeaderTag*> myTags;
114 
115  // The tags that are required for this record.
116  std::vector<String> myRequiredTags;
117 
118  int myNumActiveTags;
119 };
120 
121 #endif
This class encapsulates the tag value pairs contained with a SAM Header line with accessors for getti...
const char * getKeyValue() const
Get the value associated with the key tag. Returns "" if it is not set.
const char * getTagValue(const char *tag) const
Return the value associated with the specified tag.
const char * getTypeString()
Return the type of this header record (HD, SQ, RG, or PG) as a string.
void reset()
Reset this header record to an empty state with no tags.
SamHeaderRecordType getType()
Return the type of this header record (HD, SQ, RG, or PG) as an enum.
virtual ~SamHeaderRecord()
Destructor.
bool isValid()
Check to see if the record is valid.
bool setFields(const StringArray &tokens)
Set the fields from the passed in line.
bool isActiveHeaderRecord()
This record is active (true) if there is at least one tag set.
bool appendString(std::string &header)
Appends the string representation of this header record to the passed in string.
virtual SamHeaderRecord * createCopy() const =0
Return a pointer to a newly created header record of the appropriate type that is a copy of this reco...
bool addKey(const char *value)
Add the key tag with the specified value (not for HD headers).
SamHeaderRecordType
Specifies the Type for the sam header record (line).
@ SQ
Sequence Dictionary.
@ RG
Read Group.
SamHeaderRecord()
Constructor.
bool setTag(const char *tag, const char *value)
Set the value of the specified tag to the specified value, deletes the tag when value is NULL.