Implement -regions and -expand-regions for slice-numpy.
[lightning.git] / slice_test.go
1 // Copyright (C) The Lightning Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package lightning
6
7 import (
8         "io/ioutil"
9         "os"
10         "os/exec"
11
12         "github.com/kshedden/gonpy"
13         "gopkg.in/check.v1"
14 )
15
16 type sliceSuite struct{}
17
18 var _ = check.Suite(&sliceSuite{})
19
20 func (s *sliceSuite) TestImportAndSlice(c *check.C) {
21         tmpdir := c.MkDir()
22         err := os.Mkdir(tmpdir+"/lib1", 0777)
23         c.Assert(err, check.IsNil)
24         err = os.Mkdir(tmpdir+"/lib2", 0777)
25         c.Assert(err, check.IsNil)
26         err = os.Mkdir(tmpdir+"/lib3", 0777)
27         c.Assert(err, check.IsNil)
28         cwd, err := os.Getwd()
29         c.Assert(err, check.IsNil)
30         err = os.Symlink(cwd+"/testdata/pipeline1", tmpdir+"/pipeline1")
31         c.Assert(err, check.IsNil)
32         err = os.Symlink(cwd+"/testdata/pipeline1", tmpdir+"/pipeline1dup")
33         c.Assert(err, check.IsNil)
34
35         err = ioutil.WriteFile(tmpdir+"/chr1-12-100.bed", []byte("chr1\t12\t100\ttest.1\n"), 0644)
36         c.Check(err, check.IsNil)
37
38         c.Log("=== import testdata/ref ===")
39         exited := (&importer{}).RunCommand("import", []string{
40                 "-local=true",
41                 "-tag-library", "testdata/tags",
42                 "-output-tiles",
43                 "-save-incomplete-tiles",
44                 "-o", tmpdir + "/lib1/library1.gob",
45                 "testdata/ref.fasta",
46         }, nil, os.Stderr, os.Stderr)
47         c.Assert(exited, check.Equals, 0)
48
49         c.Log("=== import testdata/pipeline1 ===")
50         exited = (&importer{}).RunCommand("import", []string{
51                 "-local=true",
52                 "-tag-library", "testdata/tags",
53                 "-output-tiles",
54                 "-o", tmpdir + "/lib2/library2.gob",
55                 tmpdir + "/pipeline1",
56         }, nil, os.Stderr, os.Stderr)
57         c.Assert(exited, check.Equals, 0)
58
59         c.Log("=== import pipeline1dup ===")
60         exited = (&importer{}).RunCommand("import", []string{
61                 "-local=true",
62                 "-tag-library", "testdata/tags",
63                 "-output-tiles",
64                 "-o", tmpdir + "/lib3/library3.gob",
65                 tmpdir + "/pipeline1dup",
66         }, nil, os.Stderr, os.Stderr)
67         c.Assert(exited, check.Equals, 0)
68
69         slicedir := c.MkDir()
70
71         c.Log("=== slice ===")
72         exited = (&slicecmd{}).RunCommand("slice", []string{
73                 "-local=true",
74                 "-output-dir=" + slicedir,
75                 "-tags-per-file=2",
76                 tmpdir + "/lib1",
77                 tmpdir + "/lib2",
78                 tmpdir + "/lib3",
79         }, nil, os.Stderr, os.Stderr)
80         c.Check(exited, check.Equals, 0)
81         out, _ := exec.Command("find", slicedir, "-ls").CombinedOutput()
82         c.Logf("%s", out)
83
84         c.Log("=== slice-numpy ===")
85         {
86                 npydir := c.MkDir()
87                 exited := (&sliceNumpy{}).RunCommand("slice-numpy", []string{
88                         "-local=true",
89                         "-input-dir=" + slicedir,
90                         "-output-dir=" + npydir,
91                 }, nil, os.Stderr, os.Stderr)
92                 c.Check(exited, check.Equals, 0)
93                 out, _ := exec.Command("find", npydir, "-ls").CombinedOutput()
94                 c.Logf("%s", out)
95
96                 f, err := os.Open(npydir + "/matrix.0000.npy")
97                 c.Assert(err, check.IsNil)
98                 defer f.Close()
99                 npy, err := gonpy.NewReader(f)
100                 c.Assert(err, check.IsNil)
101                 c.Check(npy.Shape, check.DeepEquals, []int{4, 4})
102                 variants, err := npy.GetInt16()
103                 c.Check(variants, check.DeepEquals, []int16{2, 1, 1, 2, -1, -1, 1, 1, 2, 1, 1, 2, -1, -1, 1, 1})
104
105                 annotations, err := ioutil.ReadFile(npydir + "/matrix.0000.annotations.csv")
106                 c.Assert(err, check.IsNil)
107                 c.Logf("%s", annotations)
108                 for _, s := range []string{
109                         "chr1:g.161A>T",
110                         "chr1:g.178A>T",
111                         "chr1:g.1_3delinsGGC",
112                         "chr1:g.222_224del",
113                 } {
114                         c.Check(string(annotations), check.Matches, "(?ms).*"+s+".*")
115                 }
116
117                 annotations, err = ioutil.ReadFile(npydir + "/matrix.0002.annotations.csv")
118                 c.Assert(err, check.IsNil)
119                 c.Logf("%s", annotations)
120                 for _, s := range []string{
121                         ",2,chr2:g.1_3delinsAAA",
122                         ",2,chr2:g.125_127delinsAAA",
123                         ",4,chr2:g.125_127delinsAAA",
124                 } {
125                         c.Check(string(annotations), check.Matches, "(?ms).*"+s+".*")
126                 }
127         }
128
129         c.Log("=== slice-numpy + regions ===")
130         {
131                 npydir := c.MkDir()
132                 exited := (&sliceNumpy{}).RunCommand("slice-numpy", []string{
133                         "-local=true",
134                         "-regions=" + tmpdir + "/chr1-12-100.bed",
135                         "-input-dir=" + slicedir,
136                         "-output-dir=" + npydir,
137                 }, nil, os.Stderr, os.Stderr)
138                 c.Check(exited, check.Equals, 0)
139                 out, _ := exec.Command("find", npydir, "-ls").CombinedOutput()
140                 c.Logf("%s", out)
141
142                 f, err := os.Open(npydir + "/matrix.0000.npy")
143                 c.Assert(err, check.IsNil)
144                 defer f.Close()
145                 npy, err := gonpy.NewReader(f)
146                 c.Assert(err, check.IsNil)
147                 c.Check(npy.Shape, check.DeepEquals, []int{4, 2})
148                 variants, err := npy.GetInt16()
149                 c.Check(variants, check.DeepEquals, []int16{2, 1, -1, -1, 2, 1, -1, -1})
150
151                 annotations, err := ioutil.ReadFile(npydir + "/matrix.0000.annotations.csv")
152                 c.Assert(err, check.IsNil)
153                 c.Logf("%s", annotations)
154                 for _, s := range []string{
155                         "chr1:g.161A>T",
156                         "chr1:g.178A>T",
157                         "chr1:g.1_3delinsGGC",
158                         "chr1:g.222_224del",
159                 } {
160                         c.Check(string(annotations), check.Matches, "(?ms).*"+s+".*")
161                 }
162
163                 annotations, err = ioutil.ReadFile(npydir + "/matrix.0002.annotations.csv")
164                 c.Assert(err, check.IsNil)
165                 c.Logf("%s", annotations)
166                 c.Check(string(annotations), check.Equals, "")
167         }
168 }