annotate tools/rgenetics/listFiles.py @ 0:9071e359b9a3

Uploaded
author xuebing
date Fri, 09 Mar 2012 19:37:19 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
1 #Provides Upload tool with access to list of available files
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
2 import glob,sys
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
3 import galaxy.app as thisapp
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
4 import galaxy.util
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
5
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
6 from elementtree.ElementTree import XML
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
7
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
8 librepos = '/usr/local/galaxy/data/rg'
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
9 myrepos = '/home/rerla/galaxy'
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
10 marchinirepos = '/usr/local/galaxy/data/rg/snptest'
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
11
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
12 from galaxy.tools.parameters import DataToolParameter
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
13
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
14 #Provides Upload tool with access to list of available builds
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
15
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
16 builds = []
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
17 #Read build names and keys from galaxy.util
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
18 for dbkey, build_name in galaxy.util.dbnames:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
19 builds.append((build_name,dbkey,False))
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
20
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
21 #Return available builds
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
22 def get_available_builds(defval='hg18'):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
23 for i,x in enumerate(builds):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
24 if x[1] == defval:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
25 x = list(x)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
26 x[2] = True
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
27 builds[i] = tuple(x)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
28 return builds
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
29
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
30
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
31
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
32 def get_tabular_cols( input, outformat='gg' ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
33 """numeric only other than rs for strict genome graphs
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
34 otherwise tabular. Derived from galaxy tool source around August 2007 by Ross"""
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
35 columns = []
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
36 seenCnames = {}
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
37 elems = []
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
38 colnames = ['Col%d' % x for x in range(input.metadata.columns+1)]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
39 strict = (outformat=='gg')
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
40 for i, line in enumerate( file ( input.file_name ) ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
41 if line and not line.startswith( '#' ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
42 line = line.rstrip('\r\n')
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
43 elems = line.split( '\t' )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
44
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
45 """
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
46 Strict gg note:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
47 Since this tool requires users to select only those columns
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
48 that contain numerical values, we'll restrict the column select
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
49 list appropriately other than the first column which must be a marker
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
50 """
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
51 if len(elems) > 0:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
52 for col in range(1, input.metadata.columns+1):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
53 isFloat = False # short circuit common result
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
54 try:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
55 val = float(elems[col-1])
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
56 isFloat = True
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
57 except:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
58 val = elems[col-1]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
59 if val:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
60 if i == 0: # header row
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
61 colnames[col] = val
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
62 if isFloat or (not strict) or (col == 1): # all in if not GG
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
63 option = colnames[col]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
64 if not seenCnames.get(option,None): # new
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
65 columns.append((option,str(col),False))
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
66 seenCnames[option] = option
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
67 #print 'get_tab: %d=%s. Columns=%s' % (i,line,str(columns))
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
68 if len(columns) > 0 and i > 10:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
69 """
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
70 We have our select list built, so we can break out of the outer most for loop
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
71 """
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
72 break
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
73 if i == 30:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
74 break # Hopefully we never get here...
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
75 for option in range(min(5,len(columns))):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
76 (x,y,z) = columns[option]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
77 columns[option] = (x,y,True)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
78 return columns # sorted select options
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
79
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
80 def get_marchini_dir():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
81 """return the filesystem directory for snptest style files"""
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
82 return marchinirepos
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
83
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
84
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
85 def get_lib_SNPTESTCaCofiles():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
86 """return a list of file names - without extensions - available for caco studies
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
87 These have a common file name with both _1 and _2 suffixes"""
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
88 d = get_marchini_dir()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
89 testsuffix = '.gen_1' # glob these
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
90 flist = glob.glob('%s/*%s' % (d,testsuffix))
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
91 flist = [x.split(testsuffix)[0] for x in flist] # leaves with a list of file set names
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
92 if len(flist) > 0:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
93 dat = [(flist[0],flist[0],True),]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
94 dat += [(x,x,False) for x in flist[1:]]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
95 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
96 dat = [('No Marchini CaCo files found in %s - convert some using the Marchini converter tool' % d,'None',True),]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
97 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
98
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
99 def getChropt():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
100 """return dynamic chromosome select options
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
101 """
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
102 c = ['X','Y']
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
103 c += ['%d' % x for x in range(1,23)]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
104 dat = [(x,x,False) for x in c]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
105 x,y,z = dat[3]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
106 dat[3] = (x,y,True)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
107 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
108
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
109
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
110 def get_phecols(fname=''):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
111 """ return a list of phenotype columns for a multi-select list
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
112 prototype:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
113 foo = ('fake - not yet implemented','not implemented','False')
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
114 dat = [foo for x in range(5)]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
115 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
116 """
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
117 try:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
118 header = file(fname,'r').next().split()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
119 except:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
120 return [('get_phecols unable to open file %s' % fname,'None',False),]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
121 dat = [(x,x,False) for x in header]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
122 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
123
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
124 #Return various kinds of files
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
125
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
126 def get_lib_pedfiles():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
127 dat = glob.glob('%s/ped/*.ped' % librepos)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
128 dat += glob.glob('%s/ped/*.ped' % myrepos)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
129 dat.sort()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
130 if len(dat) > 0:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
131 dat = [x.split('.ped')[0] for x in dat]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
132 dat = [(x,x,'True') for x in dat]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
133 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
134 dat = [('No ped files - add some to %s/ped or %s/ped' % (librepos,myrepos),'None',True),]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
135 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
136
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
137 def get_lib_phefiles():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
138 ext = 'phe'
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
139 dat = glob.glob('%s/pheno/*.%s' % (librepos,ext))
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
140 dat += glob.glob('%s/pheno/*.%s' % (myrepos,ext))
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
141 dat.sort()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
142 if len(dat) > 0:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
143 dat = [(x,x,'False') for x in dat]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
144 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
145 dat = [('No %s files - add some to %s/pheno or %s/pheno' % (ext,librepos,myrepos),'None',True),]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
146 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
147
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
148 def get_lib_bedfiles():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
149 dat = glob.glob('%s/plinkbed/*.bed' % librepos)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
150 dat += glob.glob('%s/plinkbed/*.bed' % myrepos)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
151 dat.sort()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
152 if len(dat) > 0:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
153 dat = [x.split('.bed')[0] for x in dat]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
154 dat = [(x,x,False) for x in dat]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
155 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
156 dat = [('No bed files - Please import some to %s/plinkbed or %s/plinkbed' % (librepos,myrepos),'None',True),]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
157 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
158
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
159 def get_lib_fbatfiles():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
160 dat = glob.glob('%s/plinkfbat/*.ped' % librepos)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
161 dat += glob.glob('%s/plinkfbat/*.ped' % myrepos)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
162 dat.sort()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
163 if len(dat) > 0:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
164 dat = [(x,x,False) for x in dat]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
165 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
166 dat = [('No fbat bed files - Please import some to %s/plinkfbat or %s/plinkfbat' % (librepos,myrepos),'None',True),]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
167 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
168
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
169 def get_lib_mapfiles():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
170 dat = glob.glob('%s/ped/*.map' % librepos)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
171 dat += glob.glob('%s/ped/*.map' % myrepos)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
172 dat.sort()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
173 if len(dat) > 0:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
174 dat = [(x,x,False) for x in dat]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
175 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
176 dat = [('No map files - add some to %s/ped' % librepos,'None',True),]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
177 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
178
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
179 def get_my_pedfiles():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
180 dat = glob.glob('%s/*.ped' % myrepos)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
181 if len(dat) > 0:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
182 dat = [(x,x,False) for x in dat]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
183 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
184 dat = [('No ped files - add some to %s' % librepos,'None',True),]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
185 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
186
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
187 def get_my_mapfiles():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
188 dat = glob.glob('%s/*.map' % myrepos)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
189 if len(dat) > 0:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
190 dat = [(x,x,'True') for x in dat]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
191 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
192 dat = [('No ped files - add some to %s' % librepos,'None',True),]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
193 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
194
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
195 def get_lib_xlsfiles():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
196 dat = glob.glob('%s/*.xls' % librepos)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
197 if len(dat) > 0:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
198 dat = [(x,x,False) for x in dat]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
199 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
200 dat = [('No ped files - add some to %s' % librepos,'None',True),]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
201 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
202
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
203 def get_lib_htmlfiles():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
204 dat = glob.glob('%s/*.html' % librepos)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
205 if len(dat) > 0:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
206 dat = [(x,x,False) for x in dat]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
207 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
208 dat = [('No ped files - add some to %s' % librepos,'None',True),]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
209 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
210
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
211 def get_my_xlsfiles():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
212 dat = glob.glob('%s/*.xls' % myrepos)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
213 if len(dat) > 0:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
214 dat = [(x,x,False) for x in dat]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
215 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
216 dat = [('No ped files - add some to %s' % librepos,'None',True),]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
217 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
218
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
219 def get_my_htmlfiles():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
220 dat = glob.glob('%s/*.html' % myrepos)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
221 if len(dat) > 0:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
222 dat = [(x,x,False) for x in dat]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
223 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
224 dat = [('No ped files - add some to %s' % librepos,'None',True),]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
225 return dat
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
226
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
227