SAMProgramRecord
是 htsjdk
库中的一个类,用于处理 SAM/BAM 文件中的程序记录。htsjdk
是一个用于处理高通量测序数据的 Java 库,其中 SAM/BAM 文件格式是存储序列比对数据的标准格式。
SAMProgramRecord
类用于描述程序的元数据,这些数据通常在 SAM/BAM 文件的头部部分(SAMFileHeader
)中记录。程序记录包含以下主要信息:
- ID: 程序的唯一标识符。
- Name: 程序的名称。
- Version: 程序的版本号。
- Command Line: 执行程序时使用的命令行参数。
- Description: 程序的简短描述。
这些记录有助于在数据处理和分析过程中追溯使用的工具和版本,确保数据的可重现性和透明度。通过 SAMProgramRecord
类,用户可以读取、修改或创建这些程序记录,以便在处理 SAM/BAM 文件时维护准确的程序信息。
SAMProgramRecord源码:
/*
* The MIT License
*
* Copyright (c) 2009 The Broad Institute
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package htsjdk.samtools;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* In-memory representation of @PG SAM header record.
*/
public class SAMProgramRecord extends AbstractSAMHeaderRecord {
public static final String PROGRAM_GROUP_ID_TAG = "ID";
public static final String PROGRAM_NAME_TAG = "PN";
public static final String PROGRAM_VERSION_TAG = "VN";
public static final String COMMAND_LINE_TAG = "CL";
public static final String PREVIOUS_PROGRAM_GROUP_ID_TAG = "PP";
private String mProgramGroupId;
public static final Set<String> STANDARD_TAGS = Collections.unmodifiableSet(
new HashSet<String>(Arrays.asList(PROGRAM_GROUP_ID_TAG,
PROGRAM_NAME_TAG,
PROGRAM_VERSION_TAG,
COMMAND_LINE_TAG,
PREVIOUS_PROGRAM_GROUP_ID_TAG)) );
public SAMProgramRecord(final String programGroupId) {
this.mProgramGroupId = programGroupId;
}
public SAMProgramRecord(final String id, SAMProgramRecord srcProgramRecord) {
mProgramGroupId = id;
for (final Map.Entry<String, String> entry : srcProgramRecord.getAttributes()) {
setAttribute(entry.getKey(), entry.getValue());
}
}
@Override
public String getId() {
return getProgramGroupId();
}
public String getProgramGroupId() {
return mProgramGroupId;
}
public String getProgramName() {
return (String)getAttribute(PROGRAM_NAME_TAG);
}
public void setProgramName(final String name) {
setAttribute(PROGRAM_NAME_TAG, name);
}
public String getProgramVersion() {
return (String)getAttribute(PROGRAM_VERSION_TAG);
}
public void setProgramVersion(final String version) {
setAttribute(PROGRAM_VERSION_TAG, version);
}
public String getCommandLine() {
return (String)getAttribute(COMMAND_LINE_TAG);
}
public void setCommandLine(final String commandLine) {
setAttribute(COMMAND_LINE_TAG, commandLine);
}
public String getPreviousProgramGroupId() {
return (String)getAttribute(PREVIOUS_PROGRAM_GROUP_ID_TAG);
}
public void setPreviousProgramGroupId(final String id) {
setAttribute(PREVIOUS_PROGRAM_GROUP_ID_TAG, id);
}
/**
* @return true if this == that except for the program group ID, which is arbitrary
*/
public boolean equivalent(final SAMProgramRecord that) {
return attributesEqual(that);
}
@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
final SAMProgramRecord that = (SAMProgramRecord) o;
if (!attributesEqual(that)) return false;
if (mProgramGroupId != null ? !mProgramGroupId.equals(that.mProgramGroupId) : that.mProgramGroupId != null) return false;
return true;
}
@Override
public int hashCode() {
int result = mProgramGroupId != null ? mProgramGroupId.hashCode() : 0;
result = 31 * result + attributesHashCode();
return result;
}
@Override
Set<String> getStandardTags() {
return STANDARD_TAGS;
}
@Override
public String getSAMString() {
return new SAMTextHeaderCodec().getPGLine(this);
}
}
AbstractSAMHeaderRecord源码:
/*
* The MIT License
*
* Copyright (c) 2009 The Broad Institute
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package htsjdk.samtools;
import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
/**
* Base class for the various concrete records in a SAM header, providing uniform
* access to the attributes.
*/
public abstract class AbstractSAMHeaderRecord implements Serializable {
public static final long serialVersionUID = 1L;
private final Map<String,String> mAttributes = new LinkedHashMap<String, String>();
public String getAttribute(final String key) {
return mAttributes.get(key);
}
/**
* Set the given value for the attribute named 'key'. Replaces an existing value, if any.
* If value is null, the attribute is removed.
* Otherwise, the value will be converted to a String with toString.
* @param key attribute name
* @param value attribute value
* @deprecated Use {@link #setAttribute(String, String) instead
*/
@Deprecated
public void setAttribute(final String key, final Object value) {
setAttribute(key, value == null? null: value.toString());
}
/**
* Set the given value for the SAMTag 'tag'. Replaces an existing value, if any.
* If value is null, the attribute is removed.
* @param tag attribute name
* @param value attribute value
*/
public void setAttribute(final SAMTag tag, final String value) {
setAttribute(tag.name(), value);
}
/**
* Set the given value for the attribute named 'key'. Replaces an existing value, if any.
* If value is null, the attribute is removed.
* @param key attribute name
* @param value attribute value
*/
public void setAttribute(final String key, final String value) {
if (value == null) {
mAttributes.remove(key);
} else {
mAttributes.put(key, value);
}
}
/**
* Returns the Set of attributes.
*/
public Set<Map.Entry<String,String>> getAttributes() {
return mAttributes.entrySet();
}
/**
* Returns the ID tag (or equivalent) for this header record. The
* default implementation throws a SAMException to indicate "not implemented".
*/
public String getId() {
throw new UnsupportedOperationException("Method not implemented for: " + this.getClass());
}
/**
* For use in the equals() method of the concrete class.
*/
protected boolean attributesEqual(final AbstractSAMHeaderRecord that) {
return mAttributes.equals(that.mAttributes);
}
/**
* For use in the hashCode() method of the concrete class.
*/
protected int attributesHashCode() {
return (mAttributes != null ? mAttributes.hashCode() : 0);
}
/**
* Standard tags are the tags defined in SAM spec. These do not have type information in the test
* representation, because the type information is predefined for each tag.
* @return list of predefined tags for the concrete SAMHeader record type.
*/
abstract Set<String> getStandardTags();
/** Simple to String that outputs the concrete class name and the set of attributes stored. */
@Override public String toString() {
return getClass().getSimpleName() + this.mAttributes.toString();
}
/**
* Returns the record in the SAM line-based text format. Fields are
* separated by '\t' characters. The String is NOT terminated by '\n'.
*/
abstract public String getSAMString();
}