comparison commons/tools/tabFileReader.py @ 18:94ab73e8a190

Uploaded
author m-zytnicki
date Mon, 29 Apr 2013 03:20:15 -0400
parents
children
comparison
equal deleted inserted replaced
17:b0e8584489e6 18:94ab73e8a190
1 #!/usr/bin/env python
2
3 ###@file
4 # Read a file recording matches in the 'tab' format (output from Matcher) and return the number of matches between queries and subjects being CC, CI, IC and II.
5 # A match is said to be CC (for complete-complete) when both query and subject match over x% of their entire respective length. By default, x=95.
6 #
7 # usage: tabFileReader.py [ options ]
8 # options:
9 # -h: this help
10 # -m: name of the file recording the matches (format='tab', output from Matcher)
11 # -q: name of the fasta file recording the queries
12 # -s: name of the fasta file recording the subjects
13 # -t: threshold over which the match is 'complete', in % of the seq length (default=95)
14 # -i: identity below which matches are ignored (default=0)
15 # -l: length below which matches are ignored (default=0)
16 # -o: overlap on query and subject below which matches are ignored (default=0)
17 # -v: verbose (default=0/1)
18
19 import sys
20 import getopt
21 from string import *
22
23 import pyRepet.seq.BioseqDB
24 import pyRepet.util.Stat
25
26 #TODO: remove case changes in headers (4 lower() method calls in this script)
27
28 #----------------------------------------------------------------------------
29
30 def help():
31 print
32 print "usage: %s [ options ]" % ( sys.argv[0].split("/")[-1] )
33 print "options:"
34 print " -h: this help"
35 print " -m: name of the file recording the matches (format='tab', output from Matcher)"
36 print " -q: name of the fasta file recording the queries"
37 print " -s: name of the fasta file recording the subjects"
38 print " -t: coverage threshold over which the match is 'complete' (in %% of the seq length, default=95)"
39 print " -i: identity below which matches are ignored (default=0)"
40 print " -l: length below which matches are ignored (default=0)"
41 print " -o: overlap on query and subject below which matches are ignored (default=0)"
42 print " -I: identity threshold for 'CC' matches (default=90)"
43 print " -E: E-value threshold for 'CC' matches (default=1e-10)"
44 print " -T: coverage threshold for match length on query compare to subject length (default=90)"
45 print " -v: verbose (default=0/1)"
46 print
47
48 #----------------------------------------------------------------------------
49
50 #here are the fields of a '.tab' file:
51 #[0]: query sequence name
52 #[1]: whole match start coordinate on the query sequence
53 #[2]: whole match end coordinate on the query sequence
54 #[3]: length on the query sequence
55 #[4]: length in percentage of the query sequence
56 #[5]: length on the query relative to the subject length in percentage
57 #[6]: subject sequence name
58 #[7]: whole match start coordinate on the subject sequence
59 #[8]: whole match end coordinate on the subject sequence
60 #[9]: length on the subject sequence
61 #[10]: length in percentage of the subject sequence
62 #[11]: BLAST E-value
63 #[12]: BLAST score
64 #[13]: identity percentage
65 #[14]: path
66
67 class tabFileReader( object ):
68
69 def __init__( self, line ):
70
71 columns = line.split("\t")
72
73 self.name_sbj = (columns[6])
74 self.length_sbj = int(round(int(columns[9])/float(columns[10]),0)) #length of the subject
75 self.prct_sbj = float(columns[10]) * 100 #prct_sbj = length of the match on the subject divided by the length of the subject * 100
76 if int(columns[7]) < int(columns[8]):
77 self.start_sbj = int(columns[7]) #start of the match on the subject
78 self.end_sbj = int(columns[8]) #end of the match on the subject
79 else:
80 self.start_sbj = int(columns[8])
81 self.end_sbj = int(columns[7])
82 self.sbj_dist_ends = int(columns[9]) #length on the subject that matches with the query
83
84 self.name_qry = columns[0]
85 self.length_qry = int(round(int(columns[3])/float(columns[4]),0)) #length of the query
86 self.prct_qry = float(columns[4]) * 100 #prct_qry = length of the match on the query divided by the length of the query * 100
87 if int(columns[1]) < int(columns[2]):
88 self.start_qry = int(columns[1]) #start of the match on the query
89 self.end_qry = int(columns[2]) #end of the match on the query
90 else:
91 self.start_qry = int(columns[2])
92 self.end_qry = int(columns[1])
93 self.qry_dist_ends = int(columns[3]) #length on the query that matches with the subject
94
95 self.length_match = int(columns[3])
96 self.prct_matchQryOverSbj = float(columns[5]) * 100 #length on the query relative to the subject length in percentage
97 self.identity = float(columns[13])
98 self.score = int(columns[12])
99 self.evalue = float(columns[11])
100
101 self.sbj2qry = [self.length_sbj,self.prct_sbj,self.start_sbj,self.end_sbj,self.name_qry,self.length_sbj,self.prct_qry,self.start_qry,self.end_qry,self.identity,self.score]
102
103 self.qry2sbj = [self.length_qry,self.prct_qry,self.start_qry,self.end_qry,self.name_sbj,self.length_sbj,self.prct_sbj,self.start_sbj,self.end_sbj,self.identity,self.score]
104
105 #----------------------------------------------------------------------------
106
107 def make_dico( lMatches ):
108 """
109 Record the matches in two dictionaries which keys are the queries or the subjects.
110 """
111
112 Sbj2Qry = {}
113 Qry2Sbj = {}
114
115 for match in lMatches:
116 if Sbj2Qry.has_key( match.name_sbj ):
117 Sbj2Qry[match.name_sbj].append( match )
118 else:
119 Sbj2Qry[match.name_sbj] = [ match ]
120 if Qry2Sbj.has_key( match.name_qry ):
121 Qry2Sbj[match.name_qry].append( match )
122 else:
123 Qry2Sbj[match.name_qry] = [ match ]
124
125 return [ Sbj2Qry, Qry2Sbj ]
126
127 #----------------------------------------------------------------------------
128
129 def find_UniqRedun( list_matchs ):
130
131 list_total_sbj = [];list_total_qry = []
132 list_uniq_sbj = [];list_redun_sbj = []
133 list_uniq_qry = [];list_redun_qry = []
134
135 for match in list_matchs:
136 list_total_sbj.append(match.name_sbj)
137 list_total_qry.append(match.name_qry)
138
139 for name_sbj in list_total_sbj:
140 if list_total_sbj.count(name_sbj) == 1:
141 list_uniq_sbj.append(name_sbj)
142 else:
143 if name_sbj not in list_redun_sbj:
144 list_redun_sbj.append(name_sbj)
145
146 for name_qry in list_total_qry:
147 if list_total_qry.count(name_qry) == 1:
148 list_uniq_qry.append(name_qry)
149 else:
150 if name_qry not in list_redun_qry:
151 list_redun_qry.append(name_qry)
152
153 return [ list_uniq_sbj, list_redun_sbj, list_uniq_qry, list_redun_qry ]
154
155 #----------------------------------------------------------------------------
156
157 def remove( all, sup_sbjqry, sup_sbj, sup_qry, inf_sbjqry ):
158
159 for name_sbj in all.keys():
160
161 if sup_sbjqry.has_key( name_sbj ) and sup_sbj.has_key( name_sbj ):
162 del sup_sbj[ name_sbj ]
163
164 if sup_sbjqry.has_key( name_sbj ) and sup_qry.has_key( name_sbj ):
165 del sup_qry[ name_sbj ]
166
167 if sup_sbjqry.has_key( name_sbj ) and inf_sbjqry.has_key( name_sbj ):
168 del inf_sbjqry[ name_sbj ]
169
170 if sup_sbj.has_key( name_sbj ) and sup_qry.has_key( name_sbj ):
171 del sup_qry[ name_sbj ]
172
173 if sup_sbj.has_key( name_sbj ) and inf_sbjqry.has_key( name_sbj ):
174 del inf_sbjqry[ name_sbj ]
175
176 if sup_qry.has_key( name_sbj ) and inf_sbjqry.has_key( name_sbj ):
177 del inf_sbjqry[ name_sbj ]
178
179 return [ sup_sbj, sup_qry, inf_sbjqry ]
180
181 #----------------------------------------------------------------------------
182
183 def write_output( outFile, match_type, Sbj2Qry, dSbj2Cat, Qry2Sbj, dQry2Cat ):
184 """
185 Save the results (subjects in each category and its matches) in a human-readable way.
186 """
187
188 if match_type == 'CC':
189 msg = "Matches with L >= %i%% for subject and query (CC)" % ( thresholdCoverage )
190 elif match_type == 'CI':
191 msg = "Matches with L >= %i%% for subject and L < %i%% for query (CI)" % ( thresholdCoverage, thresholdCoverage )
192 elif match_type == 'IC':
193 msg = "Matches with L < %i%% for subject and L >= %i%% for query (IC)" % ( thresholdCoverage, thresholdCoverage )
194 elif match_type == 'II':
195 msg ="Matches with L < %i%% for subject and query (II)" % ( thresholdCoverage )
196 if verbose > 1:
197 print "%s: %i subjects" % ( msg, len(Sbj2Qry.keys()) )
198 outFile.write("\n%s\n" % ( msg ) )
199
200 for name_sbj in Sbj2Qry.keys():
201 matchs = Sbj2Qry[name_sbj]
202 if len(matchs) == 1:
203 outFile.write("-> subject %s (%s: %s,%s) matches with query %s (%s: %s,%s): prct_sbj %.3f & prct_qry %.3f (id=%.3f,Eval=%g)\n" % (name_sbj,matchs[0].length_sbj,matchs[0].start_sbj,matchs[0].end_sbj,matchs[0].name_qry,matchs[0].length_qry,matchs[0].start_qry,matchs[0].end_qry,matchs[0].prct_sbj,matchs[0].prct_qry,matchs[0].identity,matchs[0].evalue))
204 else:
205 outFile.write("-> subject %s (%s: %s,%s) matches with %s queries:\n" % (name_sbj,matchs[0].length_sbj,matchs[0].start_sbj,matchs[0].end_sbj,len(matchs)))
206 for match in matchs:
207 outFile.write("%s versus %s (%s: %s,%s): prct_sbj %.3f & prct_qry %.3f (id=%.3f,Eval=%g)\n"%(name_sbj,match.name_qry,match.length_qry,match.start_qry,match.end_qry,match.prct_sbj,match.prct_qry,match.identity,match.evalue))
208
209 tmpList = []
210 for name_sbj in Sbj2Qry.keys():
211 tmpList.append( name_sbj.split(" ")[0].lower() )
212 tmpList.sort()
213 for name_sbj in tmpList:
214 outFile.write( name_sbj+"\n" )
215 dSbj2Cat[ name_sbj ] = match_type
216
217 tmpList = []
218 for name_qry in Qry2Sbj.keys():
219 tmpList.append( name_qry.split(" ")[0].lower() )
220 tmpList.sort()
221 for name_qry in tmpList:
222 outFile.write( name_qry+"\n" )
223 dQry2Cat[ name_qry ] = match_type
224
225 #----------------------------------------------------------------------------
226
227 def writeSubjectCategory( dSbj2Cat ):
228 """
229 Save the category (CC/CI/IC/II/NA) in which each subject has been found.
230
231 @param dSbj2Cat: dictionary which keys are subject names and values the category of that subject
232 @type dSbj2Cat: dictionary
233 """
234
235 # sort the subject names in alphabetical order
236 lSbjSorted = dSbj2Cat.keys()
237 lSbjSorted.sort()
238
239 catFile = open( tabFileName + "_sbjCategories.txt", "w" )
240 for sbj in lSbjSorted:
241 string = "%s\t%s\n" % ( sbj, dSbj2Cat[ sbj ] )
242 catFile.write( string )
243 catFile.close()
244
245 #----------------------------------------------------------------------------
246
247 def writeQueryCategory( dQry2Cat ):
248 """
249 Save the category (CC/CI/IC/II/NA) in which each query has been found.
250
251 @param dQry2Cat: dictionary which keys are query names and values the category of that query
252 @type dQry2Cat: dictionary
253 """
254
255 # sort the query names in alphabetical order
256 lQrySorted = dQry2Cat.keys()
257 lQrySorted.sort()
258
259 catFile = open( tabFileName + "_qryCategories.txt", "w" )
260 for qry in lQrySorted:
261 string = "%s\t%s\n" % ( qry, dQry2Cat[ qry ] )
262 catFile.write( string )
263 catFile.close()
264
265 #----------------------------------------------------------------------------
266
267 def main():
268
269 global tabFileName
270 tabFileName = ""
271 qryFileName = ""
272 sbjFileName = ""
273 global thresholdCoverage
274 thresholdCoverage = 95
275 minIdentity = 0
276 minLength = 0
277 minOverlap = 0
278 global thresholdIdentity
279 thresholdIdentity = 90
280 global thresholdEvalue
281 thresholdEvalue = 1e-10
282 global thresholdCoverageMatch
283 thresholdCoverageMatch = 90
284 global verbose
285 verbose = 0
286
287 try:
288 opts, args = getopt.getopt(sys.argv[1:],"hm:q:s:t:i:l:I:E:T:o:v:")
289 except getopt.GetoptError, err:
290 print str(err); help(); sys.exit(1)
291 for o,a in opts:
292 if o == "-h":
293 help()
294 sys.exit(0)
295 elif o == "-m":
296 tabFileName = a
297 elif o == "-q":
298 qryFileName = a
299 elif o == "-s":
300 sbjFileName = a
301 elif o == "-t":
302 thresholdCoverage = int(a)
303 elif o == "-i":
304 minIdentity = float(a)
305 elif o == "-l":
306 minLength = int(a)
307 elif o == "-o":
308 minOverlap = float(a)
309 elif o == "-I":
310 thresholdIdentity = int(a)
311 elif o == "-E":
312 thresholdEvalue = float(a)
313 elif o == "-T":
314 thresholdCoverageMatch = int(a)
315 elif o == "-v":
316 verbose = int(a)
317
318 if tabFileName == "":
319 msg = "ERROR: missing 'tab' file (-m)"
320 sys.stderr.write( "%s\n" % msg )
321 help()
322 sys.exit(1)
323 if qryFileName == "" or sbjFileName == "":
324 msg = "ERROR: missing 'fasta' files (-q or -s)"
325 sys.stderr.write( "%s\n" % msg )
326 help()
327 sys.exit(1)
328
329 if verbose > 0:
330 print "START %s" % (sys.argv[0].split("/")[-1])
331 sys.stdout.flush()
332
333 # 4 categories of matchs:
334 # type 1 (CC): the length of the match on the subject is >= 95% of the total length of the subject, idem for the query
335 # type 2 (CI): sbj >= 95% & qry < 95%
336 # type 3 (IC): sbj < 95% & qry >= 95%
337 # type 4 (II): sbj & qry < 95%
338 ListMatches_all = []
339 ListMatches_sup_sbjqry = []
340 ListMatches_sup_sbj = []
341 ListMatches_sup_qry = []
342 ListMatches_inf_sbjqry = []
343
344 qryDB = pyRepet.seq.BioseqDB.BioseqDB( qryFileName )
345 nbQry = qryDB.getSize()
346 if verbose > 0:
347 print "nb of queries in '%s': %i" % ( qryFileName, nbQry )
348 dQry2Cat = {}
349 for bs in qryDB.db:
350 dQry2Cat[ bs.header.split(" ")[0].lower() ] = "NA"
351
352 sbjDB = pyRepet.seq.BioseqDB.BioseqDB( sbjFileName )
353 nbSbj = sbjDB.getSize()
354 if verbose > 0:
355 print "nb of subjects in '%s': %i" % ( sbjFileName, nbSbj )
356 dSbj2Cat = {}
357 for bs in sbjDB.db:
358 dSbj2Cat[ bs.header.split(" ")[0].lower() ] = "NA"
359
360 tabFile = open( tabFileName )
361 nbMatchesInTab = 0
362 dSubject2DistinctQueries = {}
363 dQuery2DistinctSubjects = {}
364
365 # For each match, create a 'tabFileReader' object and record it in a list according to the type of the match
366 if verbose > 0:
367 print "parse the 'tab' file..."; sys.stdout.flush()
368 while True:
369 line = tabFile.readline()
370 if line == "":
371 break
372 if line[0:10] == "query.name":
373 continue
374 nbMatchesInTab += 1
375
376 match = tabFileReader( line )
377 if match.identity < minIdentity:
378 line = tabFile.readline()
379 continue
380 if match.length_match < minLength:
381 line = tabFile.readline()
382 continue
383 if match.prct_qry < minOverlap or match.prct_sbj < minOverlap:
384 line = tabFile.readline()
385 continue
386 ListMatches_all.append( match )
387
388 # type 1: sbj C & qry C
389 if match.prct_sbj >= thresholdCoverage and match.prct_qry >= thresholdCoverage:
390 qsLengthRatio = 100 * match.length_qry / float(match.length_sbj)
391 if match.identity >= thresholdIdentity \
392 and match.evalue <= thresholdEvalue \
393 and qsLengthRatio >= thresholdCoverage - 2 \
394 and qsLengthRatio <= 100 + (100-thresholdCoverage) + 2 \
395 and match.prct_matchQryOverSbj >= thresholdCoverageMatch:
396 ListMatches_sup_sbjqry.append( match )
397 else:
398 ListMatches_inf_sbjqry.append( match )
399
400 # type 2: sbj C & qry I
401 elif match.prct_sbj >= thresholdCoverage and match.prct_qry < thresholdCoverage:
402 ListMatches_sup_sbj.append( match )
403
404 # type 3: sbj I & qry C
405 elif match.prct_qry >= thresholdCoverage and match.prct_sbj < thresholdCoverage:
406 ListMatches_sup_qry.append( match )
407
408 # type 4: sbj I & qry I
409 elif match.prct_qry < thresholdCoverage and match.prct_sbj < thresholdCoverage:
410 ListMatches_inf_sbjqry.append( match )
411
412 if not dSubject2DistinctQueries.has_key( match.name_sbj ):
413 dSubject2DistinctQueries[ match.name_sbj ] = []
414 if not match.name_qry in dSubject2DistinctQueries[ match.name_sbj ]:
415 dSubject2DistinctQueries[ match.name_sbj ].append( match.name_qry )
416 if not dQuery2DistinctSubjects.has_key( match.name_qry ):
417 dQuery2DistinctSubjects[ match.name_qry ] = []
418 if not match.name_sbj in dQuery2DistinctSubjects[ match.name_qry ]:
419 dQuery2DistinctSubjects[ match.name_qry ].append( match.name_sbj )
420
421 if verbose > 0:
422 print "parsing done !"; sys.stdout.flush()
423 print "nb matches in '%s': %i" % ( tabFileName, nbMatchesInTab )
424 print "nb matches 'CC': %i" % ( len(ListMatches_sup_sbjqry) )
425 if verbose > 1:
426 for match in ListMatches_sup_sbjqry:
427 print "\t%s (%.2f%%) - %s (%.2f%%) id=%.2f" % ( match.name_sbj, match.prct_sbj, match.name_qry, match.prct_qry, match.identity )
428 print "nb matches 'CI': %i" % ( len(ListMatches_sup_sbj) )
429 if verbose > 1:
430 for match in ListMatches_sup_sbj:
431 print "\t%s (%.2f%%) - %s (%.2f%%) id=%.2f" % ( match.name_sbj, match.prct_sbj, match.name_qry, match.prct_qry, match.identity )
432 print "nb matches 'IC': %i" % ( len(ListMatches_sup_qry) )
433 print "nb matches 'II': %i" % ( len(ListMatches_inf_sbjqry) )
434
435 if nbMatchesInTab == 0:
436 print "nothing to do"
437 sys.exit(0)
438
439 # For each type of matchs, record them in 2 dictionaries: Sbj2Qry and Qry2Sbj
440 D_all = make_dico( ListMatches_all )
441 Sbj2Qry_all = D_all[0]
442 Qry2Sbj_all = D_all[1]
443
444 D_sup_sbjqry = make_dico(ListMatches_sup_sbjqry)
445 Sbj2Qry_sup_sbjqry = D_sup_sbjqry[0]
446 Qry2Sbj_sup_sbjqry = D_sup_sbjqry[1]
447
448 D_sup_sbj = make_dico(ListMatches_sup_sbj)
449 Sbj2Qry_sup_sbj = D_sup_sbj[0]
450 Qry2Sbj_sup_sbj = D_sup_sbj[1]
451
452 D_sup_qry = make_dico(ListMatches_sup_qry)
453 Sbj2Qry_sup_qry = D_sup_qry[0]
454 Qry2Sbj_sup_qry = D_sup_qry[1]
455
456 D_inf_sbjqry = make_dico(ListMatches_inf_sbjqry)
457 Sbj2Qry_inf_sbjqry = D_inf_sbjqry[0]
458 Qry2Sbj_inf_sbjqry = D_inf_sbjqry[1]
459
460
461 # For each type of matches, find the subjects/queries that are involve in one or several match
462 list_all = find_UniqRedun(ListMatches_all)
463 UniqSbj_all = list_all[0]
464 RedunSbj_all = list_all[1]
465 UniqQry_all = list_all[2]
466 RedunQry_all = list_all[3]
467
468 list1 = find_UniqRedun(ListMatches_sup_sbjqry)
469 UniqSbj_sup_sbjqry = list1[0]
470 RedunSbj_sup_sbjqry = list1[1]
471 UniqQry_sup_sbjqry = list1[2]
472 RedunQry_sup_sbjqry = list1[3]
473
474 list2 = find_UniqRedun(ListMatches_sup_sbj)
475 UniqSbj_sup_sbj = list2[0]
476 RedunSbj_sup_sbj = list2[1]
477 UniqQry_sup_sbj = list2[2]
478 RedunQry_sup_sbj = list2[3]
479
480 list3 = find_UniqRedun(ListMatches_sup_qry)
481 UniqSbj_sup_qry = list3[0]
482 RedunSbj_sup_qry = list3[1]
483 UniqQry_sup_qry = list3[2]
484 RedunQry_sup_qry = list3[3]
485
486 list4 = find_UniqRedun(ListMatches_inf_sbjqry)
487 UniqSbj_inf_sbjqry = list4[0]
488 RedunSbj_inf_sbjqry = list4[1]
489 UniqQry_inf_sbjqry = list4[2]
490 RedunQry_inf_sbjqry = list4[3]
491
492 iStatSbj = pyRepet.util.Stat.Stat()
493 for subject in dSubject2DistinctQueries.keys():
494 iStatSbj.add( len( dSubject2DistinctQueries[ subject ] ) )
495 iStatQry = pyRepet.util.Stat.Stat()
496 for query in dQuery2DistinctSubjects.keys():
497 iStatQry.add( len( dQuery2DistinctSubjects[ query ] ) )
498
499
500 # Write the review of the '.tab' file
501 outFile = open( tabFileName + "_tabFileReader.txt", "w" )
502 outFile.write( "Input: %s\n" % ( tabFileName ) )
503
504 outFile.write( "\n# Number of subjects in '%s': %i\n" % ( sbjFileName, nbSbj ) )
505 outFile.write( "# Number of queries in '%s': %i\n" % ( qryFileName, nbQry ) )
506
507 outFile.write( "\nNumber of matches: %s\n" % (len(ListMatches_all)))
508 outFile.write( " # Number of different subjects that match: %s (Sn*=%.2f%%)\n" % ( len(Sbj2Qry_all.keys()), 100 * len(Sbj2Qry_all.keys()) / float(nbSbj) ) )
509 outFile.write( " Among them, number of different subjects having exactly one match: %s (%.2f%%)\n" % ( len(UniqSbj_all), 100 * len(UniqSbj_all) / float(len(Sbj2Qry_all.keys())) ) )
510 outFile.write( " Among them, number of different subjects having more than one match: %s\n" % (len(RedunSbj_all)))
511 outFile.write( " Different queries per subject: mean=%.2f sd=%.2f min=%.2f q25=%.2f med=%.2f q75=%.2f max=%.2f\n" % ( iStatSbj.mean(), iStatSbj.sd(), iStatSbj.min, iStatSbj.quantile(0.25), iStatSbj.median(), iStatSbj.quantile(0.75), iStatSbj.max ) )
512 outFile.write( " # Number of different queries that match: %s (Sp*=%.2f%%)\n" % ( len(Qry2Sbj_all.keys()), 100 * len(Qry2Sbj_all.keys()) / float(nbQry) ) )
513 outFile.write( " Among them, number of different queries having exactly one match: %s (%.2f%%)\n" % ( len(UniqQry_all), 100 * len(UniqQry_all) / float(len(Qry2Sbj_all.keys())) ) )
514 outFile.write( " Among them, number of different queries having more than one match: %s\n" % (len(RedunQry_all)) )
515 outFile.write( " Different subjects per query: mean=%.2f sd=%.2f min=%.2f q25=%.2f med=%.2f q75=%.2f max=%.2f\n" % ( iStatQry.mean(), iStatQry.sd(), iStatQry.min, iStatQry.quantile(0.25), iStatQry.median(), iStatQry.quantile(0.75), iStatQry.max ) )
516
517 outFile.write( "\nNumber of matches with L >= %i%% for subject & query: %i\n" % ( thresholdCoverage, len(ListMatches_sup_sbjqry) ) )
518 outFile.write( " # Number of different subjects in the 'CC' case: %s (%.2f%%)\n" % ( len(Sbj2Qry_sup_sbjqry), 100 * len(Sbj2Qry_sup_sbjqry) / float(nbSbj) ) )
519 outFile.write( " Among them, number of different subjects having exactly one match: %s\n" % (len(UniqSbj_sup_sbjqry)))
520 outFile.write( " Among them, number of different subjects having more than one match: %s\n" % (len(RedunSbj_sup_sbjqry)))
521 outFile.write( " # Number of different queries in the 'CC' case: %s (%.2f%%)\n" % ( len(Qry2Sbj_sup_sbjqry), 100 * len(Qry2Sbj_sup_sbjqry) / float(nbQry) ) )
522 outFile.write( " Among them, number of different queries having exactly one match: %s\n" % (len(UniqQry_sup_sbjqry)))
523 outFile.write( " Among them, number of different queries having more than one match: %s\n" % (len(RedunQry_sup_sbjqry)))
524
525 outFile.write( "\nNumber of matches with L >= %i%% for subject and L < %i%% for query: %i\n" % ( thresholdCoverage, thresholdCoverage, len(ListMatches_sup_sbj) ) )
526 outFile.write( " Number of different subjects in that case: %s\n" % (len(Sbj2Qry_sup_sbj)))
527 outFile.write( " Among them, number of different subjects having exactly one match: %s\n" % (len(UniqSbj_sup_sbj)))
528 outFile.write( " Among them, number of different subjects having more than one match: %s\n" % (len(RedunSbj_sup_sbj)))
529 outFile.write( " Number of different queries in that case: %s\n" % (len(Qry2Sbj_sup_sbj)))
530 outFile.write( " Among them, number of different queries having exactly one match: %s\n" % (len(UniqQry_sup_sbj)))
531 outFile.write( " Among them, number of different queries having more than one match: %s\n" % (len(RedunQry_sup_sbj)))
532
533 outFile.write( "\nNumber of matches with L < %i%% for subject and L >= %i%% for query: %i\n" % ( thresholdCoverage, thresholdCoverage, len(ListMatches_sup_qry) ) )
534 outFile.write( " Number of different subjects in that case: %s\n" % (len(Sbj2Qry_sup_qry)))
535 outFile.write( " Among them, number of different subjects having exactly one match: %s\n" % (len(UniqSbj_sup_qry)))
536 outFile.write( " Among them, number of different subjects having more than one match: %s\n" % (len(RedunSbj_sup_qry)))
537 outFile.write( " Number of different queries in that case: %s\n" % (len(Qry2Sbj_sup_qry)))
538 outFile.write( " Among them, number of different queries having exactly one match: %s\n" % (len(UniqQry_sup_qry)))
539 outFile.write( " Among them, number of different queries having more than one match: %s\n" % (len(RedunQry_sup_qry)))
540
541 outFile.write( "\nNumber of matches with L < %i%% for subject & query: %i\n" % ( thresholdCoverage, len(ListMatches_inf_sbjqry) ) )
542 outFile.write( " Number of different subjects in that case: %s\n" % (len(Sbj2Qry_inf_sbjqry)))
543 outFile.write( " Among them, number of different subjects having exactly one match: %s\n" % (len(UniqSbj_inf_sbjqry)))
544 outFile.write( " Among them, number of different subjects having more than one match: %s\n" % (len(RedunSbj_inf_sbjqry)))
545 outFile.write( " Number of different queries in that case: %s\n" % (len(Qry2Sbj_inf_sbjqry)))
546 outFile.write( " Among them, number of different queries having exactly one match: %s\n" % (len(UniqQry_inf_sbjqry)))
547 outFile.write( " Among them, number of different queries having more than one match: %s\n" % (len(RedunQry_inf_sbjqry)))
548
549
550 # For the elements already counted in the matches with L >= 95% for subject & query, remove them from the other dictionnaries
551 rmv_Sbj2Qry = remove( Sbj2Qry_all, Sbj2Qry_sup_sbjqry, Sbj2Qry_sup_sbj, Sbj2Qry_sup_qry, Sbj2Qry_inf_sbjqry )
552 rmv_Qry2Sbj = remove( Qry2Sbj_all, Qry2Sbj_sup_sbjqry, Qry2Sbj_sup_sbj, Qry2Sbj_sup_qry, Qry2Sbj_inf_sbjqry )
553
554 outFile.write("\n\nAfter removal of the subjects/queries already counted in the matches with L >= %i%% for them:\n" % ( thresholdCoverage ) )
555
556 outFile.write( "\nMatches with L >= %i%% for subject and L < %i%% for query:\n" % ( thresholdCoverage, thresholdCoverage ) )
557 outFile.write( " # Number of different subjects in the 'CI' case: %s (%.2f%%)\n" % ( len(rmv_Sbj2Qry[0]), 100*len(rmv_Sbj2Qry[0])/float(nbSbj) ) )
558 outFile.write( " # Number of different queries in the 'CI' case: %s (%.2f%%)\n" % ( len(rmv_Qry2Sbj[0]), 100*len(rmv_Qry2Sbj[0])/float(nbQry) ) )
559
560 outFile.write( "\nMatches with L < %i%% for subject and L >= %i%% for query:\n" % ( thresholdCoverage, thresholdCoverage ) )
561 outFile.write( " # Number of different subjects in the 'IC' case: %s (%.2f%%)\n" % (len(rmv_Sbj2Qry[1]), 100*len(rmv_Sbj2Qry[1])/float(nbSbj) ) )
562 outFile.write( " # Number of different queries in the 'IC' case: %s (%.2f%%)\n" % (len(rmv_Qry2Sbj[1]), 100*len(rmv_Qry2Sbj[1])/float(nbQry) ) )
563
564 outFile.write( "\nMatches with L < %i%% for subject & query:\n" % ( thresholdCoverage ) )
565 outFile.write( " # Number of different subjects in the 'II' case: %s (%.2f%%)\n" % (len(rmv_Sbj2Qry[2]), 100*len(rmv_Sbj2Qry[2])/float(nbSbj) ) )
566 outFile.write( " # Number of different queries in the 'II' case: %s (%.2f%%)\n" % (len(rmv_Qry2Sbj[2]), 100*len(rmv_Qry2Sbj[2])/float(nbQry) ) )
567
568 outFile.write("\n==========================================================================\n")
569
570 write_output( outFile, 'CC', Sbj2Qry_sup_sbjqry, dSbj2Cat, Qry2Sbj_sup_sbjqry, dQry2Cat )
571
572 outFile.write("\n==========================================================================\n")
573
574 write_output( outFile, 'CI', rmv_Sbj2Qry[0], dSbj2Cat, rmv_Qry2Sbj[0], dQry2Cat )
575
576 outFile.write("\n==========================================================================\n")
577
578 write_output( outFile, 'IC', rmv_Sbj2Qry[1], dSbj2Cat, rmv_Qry2Sbj[1], dQry2Cat )
579
580 outFile.write("\n==========================================================================\n")
581
582 write_output( outFile, 'II', rmv_Sbj2Qry[2], dSbj2Cat, rmv_Qry2Sbj[2], dQry2Cat )
583
584 outFile.write("\n==========================================================================\n")
585
586 outFile.close()
587
588 writeSubjectCategory( dSbj2Cat )
589 writeQueryCategory( dQry2Cat )
590
591 if verbose > 0:
592 print "END %s" % (sys.argv[0].split("/")[-1])
593 sys.stdout.flush()
594
595 return 0
596
597 #-----------------------------------------------------------------------------------------------------
598
599 if __name__ == "__main__":
600 main()