annotate bin/bsf-call @ 2:f274c166e738 default tip

remove comments in bsfcall_wrapper.xml
author yutaka-saito
date Sun, 19 Apr 2015 23:02:04 +0900
parents 06f8460885ff
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
1 #!/usr/bin/env python
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
2 """
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
3 Bisulfighter::bsf-call
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
4
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
5 Bisulfighter (http://epigenome.cbrc.jp/bisulfighter)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
6 by National Institute of Advanced Industrial Science and Technology (AIST)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
7 is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
8 http://creativecommons.org/licenses/by-nc-sa/3.0/
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
9 """
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
10
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
11 __version__= "1.3"
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
12
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
13 from optparse import OptionParser
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
14 import os
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
15 import sys
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
16 import re
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
17
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
18 prog = 'bsf-call'
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
19 usage = """%prog [options] refgenome read1 read2 ...
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
20 example: %prog -o experiment.txt hg38.fa paired-sample1-1.fastq,paired-sample1-2.fastq"""
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
21 description = "A mapping of the read bisulfite treated by LAST, to detect methylated cytosine (mC) of the results, and outputs the detection result to the file."
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
22
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
23 op = OptionParser(prog=prog, usage=usage, description=description, version="%s-%s" % (prog, __version__))
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
24
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
25 op.add_option("-c", "--coverage", type="int", default=5, metavar="C",
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
26 help="threshold of read coverate (default: %default)")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
27
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
28 # op.add_option("-d", "--pe-direction", type="string", default="ff",
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
29 # help="direction of paired-end probes: ff, fr, rf, rr (default: %default)")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
30 #
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
31 op.add_option("-l", "--lower-bound", type="float", default=0.05, metavar="L",
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
32 help="threshold of mC ratio (default: %default)")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
33
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
34 op.add_option("-p", "--multi-thread", type="int", default=1, metavar="P",
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
35 help="number of threads (default: %default)")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
36
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
37 op.add_option("-s", "", type="int", default=150, metavar="S",
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
38 help="threshold of the alignment score at filtering (default: %default)")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
39
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
40 op.add_option("-m", "", type="float", default=1e-9, metavar="M",
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
41 help="threshold of the mismap probability at filtering (default: %default)")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
42
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
43 # op.add_option("", "--last", type="string", default="", metavar="OPT1,OPT2,...",
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
44 # help="options for LAST (lastal command)")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
45 #
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
46 op.add_option("-o", "", type="string", default="bsf-call.out", metavar="FILE",
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
47 help="output file (default: bsf-call.out)")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
48
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
49 op.add_option("-W", "", type="string", default="./bsfwork", metavar="WORKDIR",
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
50 help="work directory (default: ./bsfwork)")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
51
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
52 op.add_option("", "--work-auto", action="store_true", dest="auto_create_work_dir", default=False,
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
53 help="create work directory automatically")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
54
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
55 # op.add_option("-n", "", action="store_true", dest="use_cluster", default=False,
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
56 # help="run bsf-call on pc cluster")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
57 #
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
58 # op.add_option("-q", "", type="string", default="", metavar="QUEUE_LIST",
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
59 # help="queue list")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
60 #
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
61 op.add_option("-M", "", type="string", metavar="MAPPING_DIR",
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
62 help="mapping result directory")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
63
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
64 op.add_option("-T", "", type="string", metavar="LOCAL_DIR",
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
65 help="local directory")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
66
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
67 # op.add_option("-r", "", type="string", default="100M", metavar="SPLIT_READ_SIZE",
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
68 # help="split read size")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
69 #
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
70 # op.add_option("", "--bam", action="store_true", dest="read_bam", default=False,
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
71 # help="read BAM file for mC detection")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
72 #
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
73 # op.add_option("", "--sam", action="store_true", dest="read_sam", default=False,
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
74 # help="read SAM file for mC detection")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
75 #
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
76 # op.add_option("-z", "--compress-prog", type="string", dest="z", metavar="COMPRESS_PROG", default="bzip2",
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
77 # help="compression program")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
78
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
79 options, args = op.parse_args()
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
80
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
81 errors = []
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
82
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
83 work_dir = None
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
84 if options.W:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
85 work_dir = options.W
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
86 else:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
87 if not options.auto_create_work_dir:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
88 work_dir = "bsfwork"
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
89
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
90 if options.M:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
91 if len(args) < 1:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
92 op.error("\n Reference genome is not specified.")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
93
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
94 for result_dir in options.M.split(","):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
95 if not os.path.exists(result_dir):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
96 errors.append("Mapping result directory: '%s' does not exist." % options.M)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
97
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
98 # if options.read_bam and options.read_sam:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
99 # errors.append("--bam and --sam cannot be placed simultaneously.")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
100
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
101 ref_genome = args[0]
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
102 reads = None
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
103 else:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
104 if len(args) < 2:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
105 op.error("\n Reference genome and read sequence is not specified.")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
106
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
107 # if options.read_bam:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
108 # errors.append("--bam option is specified but -M option is not specified.")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
109
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
110 # if options.read_sam:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
111 # errors.append("--sam option is specified but -M option is not specified.")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
112
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
113 ref_genome = args[0]
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
114 reads = args[1:]
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
115
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
116 for read_files in reads:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
117 for read_file in read_files.split(','):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
118 if not os.path.exists(read_file):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
119 errors.append("Read file: '%s' does not exists." % read_file)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
120
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
121 if work_dir and os.path.exists(work_dir):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
122 errors.append("Working directory: '%s' already exists." % work_dir)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
123
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
124 if not os.path.exists(ref_genome):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
125 errors.append("Reference genome: '%s' does not exists." % ref_genome)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
126
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
127 # if options.read_bam or options.read_sam:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
128 # try:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
129 # import pysam
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
130 # except:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
131 # errors.append("--bam or --sam is specified but pysam is not installed.")
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
132
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
133 if len(errors) > 0:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
134 op.error("\n " + "\n ".join(errors))
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
135
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
136 cmd_opts = {}
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
137 cmd_opts["coverage"] = options.coverage
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
138 # cmd_opts["pe_direction"] = options.pe_direction
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
139 cmd_opts["num_threads"] = options.multi_thread
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
140 cmd_opts["lower_bound"] = options.lower_bound
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
141 cmd_opts["aln_score_thres"] = options.s
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
142 cmd_opts["aln_mismap_prob_thres"] = options.m
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
143 cmd_opts["output"] = options.o
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
144 # cmd_opts["last_opts"] = options.last
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
145 cmd_opts["work_dir"] = work_dir
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
146 # cmd_opts["use_cluster"] = options.use_cluster
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
147 # cmd_opts["queue_list"] = options.q
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
148 cmd_opts["mapping_dir"] = options.M
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
149 cmd_opts["local_dir"] = options.T
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
150 # cmd_opts["split_read_size"] = options.r
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
151 # cmd_opts["read_bam"] = options.read_bam
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
152 # cmd_opts["read_sam"] = options.read_sam
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
153 # cmd_opts["compress_prog"] = options.z
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
154
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
155 try:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
156 sys.path.append('.');
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
157 import bsfcall
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
158 except ImportError:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
159 errors.append("\"import bsfcall\" failed. Please be sure you have bsfcall.py in your python library path.");
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
160
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
161 import subprocess
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
162
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
163 # if not checkRunnable('last-map-probs'):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
164 # sys.exit(1)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
165 # if not checkRunnable('last-pair-probs'):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
166 # sys.exit(1)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
167 # if not checkRunnable(options.z):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
168 # sys.exit(1)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
169
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
170 if len(errors) > 0:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
171 op.error("\n " + "\n ".join(errors))
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
172
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
173 # if cmd_opts["use_cluster"]:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
174 # cmd_opts["num_threads"] = 1
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
175 # bsf_call = bsfcall.BsfCallCluster(ref_genome, reads, cmd_opts)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
176 # else:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
177 # bsf_call = bsfcall.BsfCall(ref_genome, reads, cmd_opts)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
178 bsf_call = bsfcall.BsfCall(ref_genome, reads, cmd_opts)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
179
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
180 bsf_call.execute()
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
181
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
182 sys.exit(0)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
183
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
184 def checkRunnable(cmd):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
185 for outline, errline in runProcess(cmd.split()):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
186 if (re.match(r'error: subProcess:', errline) is not None):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
187 print >>sys.stderr, '\"%s\" is not found.' % cmd
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
188 return False
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
189 return True
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
190
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
191 def runProcess(exe):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
192 try:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
193 p = subprocess.Popen(exe, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
194 except:
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
195 yield (None, 'error: runProcess: \'%s\' failed.' % ' '.join(exe))
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
196 return
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
197 while (True):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
198 retcode = p.poll()
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
199 if (retcode is not None):
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
200 break
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
201 outline = p.stdout.readline()
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
202 errline = p.stderr.readline()
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
203 yield (outline, errline)
06f8460885ff migrate from GitHub
yutaka-saito
parents:
diff changeset
204