//=====================================================================
// File: ABIIndexEntry.java
// Class: ABIIndexEntry
// Package: AFLPcore
//
// Author: James J. Benham
// Date: August 10, 1998
// Contact: james_benham@hmc.edu
//
// Genographer v1.0 - Computer assisted scoring of gels.
// Copyright (C) 1998 Montana State University
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; version 2
// of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// The GNU General Public License is distributed in the file GPL
//=====================================================================
package AFLPcore;
/**
* This class represents an index entry in the ABI Lane files, which
* are produced by extracting lanes with GeneScan 2.0 or later. It contains
* information from the entry, like the name, the tag, the number of
* elements contained in the file, and the data or a pointer to the data.
* If the data size is less than or equal to 4 bytes,
* dataOffset
will contain the actual data, otherwise, it
* is an offset into the file which points to the data.
*
*
The name is converted into a long integer by the constructor so * that a single comparison can be made, instead of comparing characters. * *
The format of the file is described more fully in the help files
* distributed with the program.
*
* @see ABILaneFilter
*
* @author James J. Benham
* @version 1.0.0
* @date August 10, 1998
*/
class ABIIndexEntry
{
/** The identifying name of this record */
String name;
/** The name represented as a single long integer */
long nameKey;
/** The number used to distiguish different fields with the same name*/
long tagNumber;
/** The number of elements in this record.*/
long numElements;
/** The location of the data in the file, or in some cases, the data
* itself. See the class description to tell which it is. */
long dataOffset;
/** Used to determine if this record should be matched with a specific
* tag. */
boolean matchTag;
long recLength;
/**
* Create a new index entry with the specified name. The names in the
* ABI Lane files are four character entries.
*
* @param name the name of the entry, e.g. DATA, or SpNm
*/
ABIIndexEntry(String name)
{
this.name = name;
nameKey = calculateKey(name);
tagNumber = 0;
numElements = 0;
dataOffset = 0;
matchTag = false;
recLength = 0;
}
/**
* Create a new index entry with the specified name and tag. The names
* in the ABI Lane files are four characters long.
*
* @param name the name of the entry, e.g. DATA, or SpNm
* @param tag the identifying number of the field. For example, a
* file can contain up to 12 DATA entries, but each one
* has a different tag number.
*/
ABIIndexEntry(String name, int tag)
{
this.name = name;
nameKey = calculateKey(name);
tagNumber = tag;
numElements = 0;
dataOffset = 0;
matchTag = true;
recLength = 0;
}
/**
* Gives a numeric representation of the name, which is unique for the
* name. It works by taking the byte value for the charachters and
* packing them together into a long integer. It assumes that the input
* is only four charachters long. Any length longer will have only the
* first four bytes stored, and anything shorter will result in
* invalid accesses.
*
* @param input the four-character string to convert to an integer.
*
* @return the bytes of the string (1 per character) packed together.
*
* @exception ArrayIndexOutOfBounds if the input is less than four
* characters.
*/
long calculateKey(String input)
{
byte b[] = input.getBytes();
long temp = b[0];
temp = (((temp << 8) | b[1]) << 8) | b[2];
temp = (temp << 8) | b[3];
return temp;
}
/**
* Tells whether or not this record should be matched with only a name
* or with a tag as well.
*
* @return true
if the tag should be matched.
*/
boolean matchTagNumber()
{
return matchTag;
}
}