/*
* The MIT License (MIT)
*
* Copyright (c) 2007-2015 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 org.broad.igv.bbfile;
import org.apache.log4j.Logger;
import org.broad.igv.util.LittleEndianInputStream;
import java.io.IOException;
import java.io.DataInputStream;
/**
* Created by IntelliJ IDEA.
* User: martind
* Date: Jan 6, 2010
* Time: 3:00:11 PM
* To change this template use File | Settings | File Templates.
*/
/*
* Container class for BigWig section header class for data items - BBFile Table J
*
* Note: appropriate WIG data formats are accomodated
* according to WIG type in Table J
* */
public class BigWigSectionHeader {
public enum WigItemType {
BedGraph,
VarStep,
FixedStep,
Unknown // bad value
}
private static Logger log = Logger.getLogger(BigWigSectionHeader.class);
public static final int SECTION_HEADER_SIZE = 24;
public static final int FIXEDSTEP_ITEM_SIZE = 4;
public static final int VARSTEP_ITEM_SIZE = 8;
public static final int BEDGRAPH_ITEM_SIZE = 12;
private int chromID; // Chromosome/contig Numerical ID from BBFile Chromosome B+ tree
private int chromStart; // starting base position
private int chromEnd; // ending base position
private int itemStep; // number of base spaces between fixed items
private int itemSpan; // number of bases in fixed step items
private WigItemType itemType; // type of data items: 1 = bedGraph, 2 = varStep, 3 = fixedStep
private byte reserved; // reserved; currently = 0
private int itemCount; // number of data items in this chromosome section
private boolean isValidType; // indicates a if a valid Wig item type was read
private String itemDescription; // string representation of item type.
/*
* Constructor creates a Wig Section Header (Table J) from uncompressed buffer.
*
* Parameters:
* mLbdis - // buffer stream containing section header arranged low to high bytes
* */
public BigWigSectionHeader(LittleEndianInputStream lbdis) {
byte type;
// get Wig Section Header
try {
chromID = lbdis.readInt();
chromStart = lbdis.readInt();
chromEnd = lbdis.readInt();
itemStep = lbdis.readInt();
itemSpan = lbdis.readInt();
type = lbdis.readByte();
reserved = lbdis.readByte();
itemCount = lbdis.readUShort();
}catch(IOException ex) {
log.error("Error reading wig section header ", ex);
throw new RuntimeException("Error reading wig section header", ex);
}
// tag as valid
isValidType = getItemType(type);
}
/*
* Constructor creates a Wig Section Header (Table J) from uncompressed buffer.
*
* Parameters:
* mLbdis - // buffer stream containing section header arranged high to low bytes
* */
public BigWigSectionHeader(DataInputStream bdis) {
byte type;
// get Wig Section Header
try {
chromID = bdis.readInt();
chromStart = bdis.readInt();
chromEnd = bdis.readInt();
itemStep = bdis.readInt();
itemSpan = bdis.readInt();
type = bdis.readByte();
reserved = bdis.readByte();
itemCount = (short) bdis.readUnsignedShort();
}catch(IOException ex) {
log.error("Error reading wig section header ", ex);
throw new RuntimeException("Error reading wig section header", ex);
}
// tag as valid
isValidType = getItemType(type);
}
/*
* Method returns the chromosome ID
*
* Returns:
* Chromosome ID for the section's region
* */
public int getChromID() {
return chromID;
}
/*
* Method returns the chromosome starting base
*
* Returns:
* Chromosome start base for the section's region
* */
public int getChromosomeStart() {
return chromStart;
}
/*
* Method returns the chromosome ending base
*
* Returns:
* Chromosome end base for the section's region
* */
public int getChromosomeEnd() {
return chromEnd;
}
/*
* Method returns the base pairs step between items.
*
* Returns:
* Chromosome base step between fixed step sections
* */
public int getItemStep() {
return itemStep;
}
/*
* Method returns the base pairs span in items.
*
* Returns:
* Chromosome base span for fixed and variable step sections
* */
public int getItemSpan() {
return itemSpan;
}
/*
* Method returns the item type for the section's Wig data.
*
* Returns:
* Section item type for Wig data
* */
public WigItemType getItemType() {
return itemType;
}
/*
* Method returns if the section's data item type is valid.
*
* Returns:
* Specifies if section's data iytem type is valid
* */
public boolean IsValidType() {
return isValidType;
}
/*
* Method returns the number of section items.
*
* Returns:
* Number of items defined for the section
* */
public int getItemCount() {
return itemCount;
}
/*
* Method returns the reserved value for the section.
*
* Returns:
* Reserved byte for the section (should always be 0)
* */
public byte getReserved() {
return reserved;
}
public void print(){
log.debug(" BigWig section header "
+ " for "+ itemDescription + " data");
log.debug("Chromosome ID = " + chromID);
log.debug("ChromStart = " + chromStart);
log.debug("ChromEnd = " + chromEnd);
log.debug("ItemStep = " + itemStep);
log.debug("ItemSpan = " + itemSpan);
log.debug("ItemType = " + itemType);
log.debug("mReserved = " + reserved);
log.debug("mItemCount = " + itemCount);
}
/*
* Method determines the Wig data type.
*
* Parameters:
* byte type read from Wig section header
*
* Returns:
* Indicates if type is a valid Wig item type
* */
private boolean getItemType(byte type){
boolean isValid;
if(type == 1){
itemType = WigItemType.BedGraph;
itemDescription = "Wig Bed Graph";
isValid = true;
}
else if(type == 2){
itemType = WigItemType.VarStep;
itemDescription = "Wig Variable Step";
isValid = true;
}
else if(type == 3){
itemType = WigItemType.FixedStep;
itemDescription = "Wig Fixed Step";
isValid = true;
}
else {
itemType = WigItemType.Unknown;
itemDescription = "Wig Type Unknown";
isValid = false;
}
return isValid;
}
}