/
pair.go
112 lines (99 loc) · 2.53 KB
/
pair.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Copyright ©2011-2012 The bíogo Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package pals
import (
"github.com/biogo/biogo/align/pals/dp"
"github.com/biogo/biogo/io/featio/gff"
"github.com/biogo/biogo/seq"
"fmt"
"strconv"
"strings"
)
// A Pair holds a pair of features with additional information relating the two.
type Pair struct {
A, B *Feature
Score int // Score of alignment between features.
Error float64 // Identity difference between feature sequences.
Strand seq.Strand // Strand relationship: seq.Plus indicates same strand, seq.Minus indicates opposite strand.
}
func (fp *Pair) String() string {
if fp == nil {
return "<nil>"
}
return fmt.Sprintf("%s/%s[%d,%d)--%s/%s[%d,%d)",
fp.A.Location().Name(), fp.A.Name(), fp.A.Start(), fp.A.End(),
fp.B.Location().Name(), fp.B.Name(), fp.B.Start(), fp.B.End(),
)
}
// NewPair converts a dp.Hit and two packed sequences into a Pair.
func NewPair(target, query *Packed, hit dp.Hit, comp bool) (*Pair, error) {
t, err := target.feature(hit.Abpos, hit.Aepos, false)
if err != nil {
return nil, err
}
q, err := query.feature(hit.Bbpos, hit.Bepos, comp)
if err != nil {
return nil, err
}
var strand seq.Strand
if comp {
strand = -1
} else {
strand = 1
}
return &Pair{
A: t,
B: q,
Score: hit.Score,
Error: hit.Error,
Strand: strand,
}, nil
}
// ExpandFeature converts a *gff.Feature containing PALS-type feature attributes into a Pair.
func ExpandFeature(f *gff.Feature) (*Pair, error) {
targ := f.FeatAttributes.Get("Target")
if targ == "" {
return nil, fmt.Errorf("pals: not a feature pair")
}
fields := strings.Fields(targ)
if len(fields) != 3 {
return nil, fmt.Errorf("pals: not a feature pair")
}
s, err := strconv.Atoi(fields[1])
if err != nil {
return nil, err
}
s--
e, err := strconv.Atoi(fields[2])
if err != nil {
return nil, err
}
maxe, err := strconv.ParseFloat(f.FeatAttributes.Get("maxe"), 64)
if err != nil {
return nil, err
}
fp := &Pair{
A: &Feature{
ID: fmt.Sprintf("%s:%d..%d", f.SeqName, f.FeatStart, f.FeatEnd),
Loc: Contig(f.SeqName),
From: f.FeatStart,
To: f.FeatEnd,
},
B: &Feature{
ID: fmt.Sprintf("%s:%d..%s", fields[0], s, fields[2]),
Loc: Contig(fields[0]),
From: s,
To: e,
},
Score: int(*f.FeatScore),
Error: maxe,
Strand: f.FeatStrand,
}
fp.A.Pair = fp
fp.B.Pair = fp
f.FeatScore = nil
f.FeatAttributes = nil
f.FeatStrand = seq.None
return fp, nil
}