// Avoid string allocations by iterating over the internal byte array. public static int CompareNames(SerializedBamAlignment alignment1, SerializedBamAlignment alignment2, SerializedAlignmentContainer alignmentContainer1, SerializedAlignmentContainer alignmentContainer2) { byte[] byteArray1 = null; int offset1 = 0; alignmentContainer1._serializedAlignments.GetByteArrayAndOffset( alignment1.SerializedOffset, ref byteArray1, ref offset1); byte[] byteArray2 = null; int offset2 = 0; alignmentContainer2._serializedAlignments.GetByteArrayAndOffset( alignment2.SerializedOffset, ref byteArray2, ref offset2); // The name starts at the 36th byte UInt32 alignmentNamePos = 36; offset1 += (int)alignmentNamePos; offset2 += (int)alignmentNamePos; int initOffset1 = offset1; while (byteArray1[offset1] != '\0' && byteArray1[offset1] == byteArray2[offset2]) { ++offset1; ++offset2; } if (byteArray1[offset1] < byteArray2[offset2]) { return(-1); } if (byteArray1[offset1] > byteArray2[offset2]) { return(1); } return(0); }
public BamListContainer(SerializedAlignmentContainer bamList) { _index = 0; _bamList = bamList; }
// This comparison operator is copied exactly from samtools. public int Compare(SerializedBamAlignment a, SerializedBamAlignment b, SerializedAlignmentContainer alignmentContainerA, SerializedAlignmentContainer alignmentContainerB) { int cmp = FileOrderCompare(a, b); if (cmp != 0) { return(cmp); } // They're the same. // Test of negative strand flag is not really necessary, because it is tested // with cmp if getFlags, but it is left here because that is the way it was done // in the past. if (a.IsReverseStrand == b.IsReverseStrand) { cmp = -1 * a.MapQuality.CompareTo(b.MapQuality); if (cmp != 0) { return(cmp); } if (alignmentContainerA != null && alignmentContainerB != null) { // When storing a large number of records, the names are stored in the byte // array to avoid a lot of memory allocations. cmp = SerializedAlignmentContainer.CompareNames(a, b, alignmentContainerA, alignmentContainerB); } else { cmp = string.CompareOrdinal(a.Name, b.Name); } if (cmp != 0) { return(cmp); } cmp = a.AlignmentFlag.CompareTo(b.AlignmentFlag); if (cmp != 0) { return(cmp); } cmp = a.MateRefID.CompareTo(b.MateRefID); if (cmp != 0) { return(cmp); } cmp = a.MatePosition.CompareTo(b.MatePosition); if (cmp != 0) { return(cmp); } cmp = a.FragmentLength.CompareTo(b.FragmentLength); return(cmp); } else { return(a.IsReverseStrand ? 1 : -1); } }
public BamAlignmentComparer(SerializedAlignmentContainer alignmentContainer = null) : base() { _alignmentContainer = alignmentContainer; }