github.com/biogo/biogo@v1.0.4/align/pals/filter/trapezoid.go (about)

     1  // Copyright ©2011-2012 The bíogo Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package filter
     6  
     7  // Type to store a successfully filtered w × e Parallelogram
     8  type Trapezoid struct {
     9  	Top, Bottom int // B (query) coords of top and bottom of trapzoidal zone
    10  	Left, Right int // Left and right diagonals of trapzoidal zone
    11  }
    12  
    13  type trapezoid struct {
    14  	next *trapezoid // Organized in a list linked on this field
    15  	Trapezoid
    16  }
    17  
    18  // prependFrontTo prepends a copy of front of list onto the front of the list
    19  // taking the allocation from the receiver which acts as a pool. It returns the
    20  // next element of the pool.
    21  func (tr *trapezoid) prependFrontTo(list *trapezoid) *trapezoid {
    22  	next := tr.next
    23  	*tr = *list
    24  	list.join(tr)
    25  	return next
    26  }
    27  
    28  // join joins list to the receiver, returning the receiver.
    29  func (tr *trapezoid) join(list *trapezoid) *trapezoid {
    30  	tr.next = list
    31  	return tr
    32  }
    33  
    34  // Return the receiver and the subsequent trapezoid in the list.
    35  func (tr *trapezoid) decapitate() (*trapezoid, *trapezoid) {
    36  	return tr, tr.next
    37  }
    38  
    39  // clip is the trapezoid trimming method used during merge.
    40  func (tr *trapezoid) clip(lagPosition, lagClip int) {
    41  	if bottom := lagClip + tr.Left; tr.Bottom < bottom {
    42  		tr.Bottom = bottom
    43  	}
    44  	if top := lagPosition + tr.Right; tr.Top > top {
    45  		tr.Top = top
    46  	}
    47  	midPosition := (tr.Bottom + tr.Top) / 2
    48  	if left := midPosition - lagPosition; tr.Left < left {
    49  		tr.Left = left
    50  	}
    51  	if right := midPosition - lagClip; tr.Right > right {
    52  		tr.Right = right
    53  	}
    54  }
    55  
    56  // Trapezoids implements the sort.Sort interface.
    57  type Trapezoids []Trapezoid
    58  
    59  // Return the sum of all Trapezoids in the slice.
    60  func (tr Trapezoids) Sum() (a, b int) {
    61  	for _, t := range tr {
    62  		la, lb := t.Top-t.Bottom, t.Right-t.Left
    63  		a, b = a+la, b+lb
    64  	}
    65  	return
    66  }
    67  
    68  // Required for sort.Interface
    69  func (tr Trapezoids) Len() int {
    70  	return len(tr)
    71  }
    72  
    73  // Required for sort.Interface
    74  func (tr Trapezoids) Less(i, j int) bool {
    75  	return tr[i].Bottom < tr[j].Bottom
    76  }
    77  
    78  // Required for sort.Interface
    79  func (tr Trapezoids) Swap(i, j int) {
    80  	tr[i], tr[j] = tr[j], tr[i]
    81  }