def printTable(assembliesList, caption, options):
    print '''
\\rowcolors{1}{tableShade}{white}
\\begin{FPtable}
\caption[Contig path statistics.]{Contig path statistics. %s}
\\tiny
\\centering
\\begin{tabular}{| r | p{.75in} | p{.75in} | p{.4in} | p{.4in} | p{.5in} | p{.5in} || c |}
\\hline
ID & Intra chromosomal joins & Inter chromosomal joins & Insertions & Deletions & Insertion and deletion & Insertion at ends & \(\sum\) errors \\\\
\\hline
\\hline''' % (caption)  # hom/het sw & scf & ctgE+ctgN
    i = 0
    for row in assembliesList:
        i += 1
        if options.showAssemblyNumbers:
            s = '%s.%s' % (lgn.idMap[row.ID[0]], row.ID[1:])
        else:
            s = '%s' % (lgn.idMap[row.ID[0]])
        sys.stdout.write('%s' % s)
        # sys.stdout.write( ' & %s & %s' % ( lgn.prettyNumber(row.valuesDict['totalHomoToHeteroSwitches']),
        #                                    lgn.prettyNumber( row.valuesDict['totalScaffoldGaps'] +
        #                                                  row.valuesDict['totalBleedingHeartScaffoldGaps'] ) ))
        # sys.stdout.write( ' & %s' % ( lgn.prettyNumber( row.valuesDict['totalContigEnds'] +
        #                                             row.valuesDict['totalContigEndsWithNs'] )))
        #sys.stdout.write( ' & %.4f' % ( row.valuesDict['errorsPerContig']))
        #sys.stdout.write( ' & %.2e' % ( row.valuesDict['errorsPerMappedBase']))
        for v in [
                'totalErrorsHaplotypeToHaplotypeSameChromosome',
                'totalErrorsHaplotypeToHaplotypeDifferentChromosome',
                'totalErrorsHaplotypeToInsertion',
                'totalErrorsHaplotypeToDeletion',
                'totalErrorsHaplotypeToInsertionAndDeletion',
                'totalErrorsContigEndsWithInsert'
        ]:
            sys.stdout.write(' & %s' % (lgn.prettyNumber(row.valuesDict[v])))
        #sys.stdout.write( ' & %s' % ( lgn.prettyNumber( row.valuesDict['totalErrorsNonSpecific'])))
        sys.stdout.write(' & %s \\\\\n' % lgn.prettyNumber(row.totalErrors))
        if not i % options.mod and i != len(assembliesList):
            print '\\hline'
    print '''\\hline
def printLine( a, kind, options ):
   if options.showAssemblyNumbers:
      s = '%s.%s' % (lgn.idMap[a.ID[0]], a.ID[1:])
   else:
      s = '%s' % (lgn.idMap[a.ID[0]])
   sys.stdout.write( '%s' % s )
   if kind == 'hom':
      for k in [ 'totalCallsInHomozygous', 
                 'totalCorrectInHomozygous', 'totalErrorsInHomozygous' ]:
         sys.stdout.write( ' & %s -- %s' % ( lgn.prettyNumber( a.subStatsLower[ k ]), lgn.prettyNumber( a.subStatsUpper[ k ])))
      sys.stdout.write( ' \\\\\n' )
   elif kind == 'het':
      for k in [ 'totalCallsInHeterozygous', 
                 'totalCorrectInHeterozygous', 'totalErrorsInHeterozygous' ]:
         sys.stdout.write( ' & %s -- %s' % ( lgn.prettyNumber( a.subStatsLower[ k ]), lgn.prettyNumber( a.subStatsUpper[ k ])))
      sys.stdout.write( ' \\\\\n' )
   elif kind == 'indel':
      for k in [ 'totalCallsInOneHaplotypeOnly', 
                 'totalCorrectInOneHaplotypeOnly', 'totalErrorsInOneHaplotypeOnly' ]:
         sys.stdout.write( ' & %s -- %s' % ( lgn.prettyNumber( a.subStatsLower[ k ]), lgn.prettyNumber( a.subStatsUpper[ k ])))
      sys.stdout.write( ' \\\\\n' )
def printLine(a, kind, options):
    if options.showAssemblyNumbers:
        s = '%s.%s' % (lgn.idMap[a.ID[0]], a.ID[1:])
    else:
        s = '%s' % (lgn.idMap[a.ID[0]])
    sys.stdout.write('%s' % s)
    if kind == 'hom':
        for k in [
                'totalCallsInHomozygous', 'totalCorrectInHomozygous',
                'totalErrorsInHomozygous'
        ]:
            sys.stdout.write(' & %s -- %s' % (lgn.prettyNumber(
                a.subStatsLower[k]), lgn.prettyNumber(a.subStatsUpper[k])))
        sys.stdout.write(' \\\\\n')
    elif kind == 'het':
        for k in [
                'totalCallsInHeterozygous', 'totalCorrectInHeterozygous',
                'totalErrorsInHeterozygous'
        ]:
            sys.stdout.write(' & %s -- %s' % (lgn.prettyNumber(
                a.subStatsLower[k]), lgn.prettyNumber(a.subStatsUpper[k])))
        sys.stdout.write(' \\\\\n')
    elif kind == 'indel':
        for k in [
                'totalCallsInOneHaplotypeOnly',
                'totalCorrectInOneHaplotypeOnly',
                'totalErrorsInOneHaplotypeOnly'
        ]:
            sys.stdout.write(' & %s -- %s' % (lgn.prettyNumber(
                a.subStatsLower[k]), lgn.prettyNumber(a.subStatsUpper[k])))
        sys.stdout.write(' \\\\\n')
def printTable( assembliesList, caption, options ):
   print '''
\\rowcolors{1}{tableShade}{white}
\\begin{FPtable}
\caption[Contig path statistics.]{Contig path statistics. %s}
\\tiny
\\centering
\\begin{tabular}{| r | p{.75in} | p{.75in} | p{.4in} | p{.4in} | p{.5in} | p{.5in} || c |}
\\hline
ID & Intra chromosomal joins & Inter chromosomal joins & Insertions & Deletions & Insertion and deletion & Insertion at ends & \(\sum\) errors \\\\
\\hline
\\hline''' % ( caption ) # hom/het sw & scf & ctgE+ctgN 
   i = 0
   for row in assembliesList:
      i += 1
      if options.showAssemblyNumbers:
         s = '%s.%s' % (lgn.idMap[row.ID[0]], row.ID[1:])
      else:
         s = '%s' % (lgn.idMap[row.ID[0]])
      sys.stdout.write( '%s' % s )
      # sys.stdout.write( ' & %s & %s' % ( lgn.prettyNumber(row.valuesDict['totalHomoToHeteroSwitches']),
      #                                    lgn.prettyNumber( row.valuesDict['totalScaffoldGaps'] + 
      #                                                  row.valuesDict['totalBleedingHeartScaffoldGaps'] ) ))
      # sys.stdout.write( ' & %s' % ( lgn.prettyNumber( row.valuesDict['totalContigEnds'] + 
      #                                             row.valuesDict['totalContigEndsWithNs'] )))
      #sys.stdout.write( ' & %.4f' % ( row.valuesDict['errorsPerContig']))
      #sys.stdout.write( ' & %.2e' % ( row.valuesDict['errorsPerMappedBase']))
      for v in [ 'totalErrorsHaplotypeToHaplotypeSameChromosome',
                 'totalErrorsHaplotypeToHaplotypeDifferentChromosome',
                 'totalErrorsHaplotypeToInsertion',
                 'totalErrorsHaplotypeToDeletion',
                 'totalErrorsHaplotypeToInsertionAndDeletion',
                 'totalErrorsContigEndsWithInsert' ]:
         sys.stdout.write( ' & %s' % ( lgn.prettyNumber( row.valuesDict[v] )))
      #sys.stdout.write( ' & %s' % ( lgn.prettyNumber( row.valuesDict['totalErrorsNonSpecific'])))
      sys.stdout.write( ' & %s \\\\\n' % lgn.prettyNumber( row.totalErrors ))
      if not i % options.mod and i != len( assembliesList ):
         print '\\hline'
   print '''\\hline
def isMaxFormat(n, m):
    if n == m:
        return '\\textbf{ %s }' % lgn.prettyNumber(n)
    else:
        return '%s' % lgn.prettyNumber(n)
def isMaxFormat( n, m ):
   if n == m:
      return '\\textbf{ %s }' % lgn.prettyNumber( n )
   else:
      return '%s' % lgn.prettyNumber( n )
def outputDict( assembliesDict, options ):
   sortOrder = sorted( assembliesDict, key = lambda x: int(x[1:]) ) # number
   sortOrder = sorted( sortOrder, key = lambda x: assembliesDict[x].id[0] ) # letter
   fileOrder = []
   if not options.noContigs:
      fileOrder += ['contigsOverlapGene', 'contigsOverlap' ]
   # if options.scaffolds:
   #    fileOrder += ['scaffoldsOverlapGene', 'scaffoldsOverlap']

   annotOrderGenes = ['transcripts'] # 'cds'
   annotOrder = ['cds', 'utr', 'nxe+nge', 'repeat'] # 'island'
   fileNameMap = {'contigsOverlapGene':'COG', 'contigsOverlap':'CO'}
   annotNameMap = {'transcripts':'xcript', 'cds':'cds', 'utr':'utr',
                   'nxe+nge':'nxe+nge', 'repeat':'repeat'}
   
   # print the header
   sys.stdout.write('#ID')
   i = -1
   for f in fileOrder:
      i += 1
      if f.endswith('OverlapGene'):
         order = annotOrderGenes
      else:
         order = annotOrder
      for a in order:
         if options.bases:
            if options.aveHaps:
               totalStr = lgn.prettyNumber( assembliesDict[sortOrder[0]].valuesDict[f][a][1].baseLength +
                                            assembliesDict[sortOrder[0]].valuesDict[f][a][2].baseLength )
            else:
               totalStr = '%s, %s' % ( lgn.prettyNumber(assembliesDict[sortOrder[0]].valuesDict[f][a][1].baseLength),
                                       lgn.prettyNumber(assembliesDict[sortOrder[0]].valuesDict[f][a][2].baseLength ))
         else:
            if options.aveHaps:
               totalStr = lgn.prettyNumber( assembliesDict[sortOrder[0]].valuesDict[f][a][1].samples +
                                            assembliesDict[sortOrder[0]].valuesDict[f][a][2].samples )
            else:
               totalStr = '%s, %s' % ( lgn.prettyNumber(assembliesDict[sortOrder[0]].valuesDict[f][a][1].samples),
                                       lgn.prettyNumber(assembliesDict[sortOrder[0]].valuesDict[f][a][2].samples) )
         sys.stdout.write('\t%s-%s (%s)' % (fileNameMap[f], annotNameMap[a], totalStr))
   sys.stdout.write('\n')
   
   for assembly in sortOrder:
      if options.hideAssemblyNumbers:
         nameStr = '%s' % (lgn.idMap[assembliesDict[assembly].id[0]])
      else:
         nameStr = '%s.%s' % (lgn.idMap[assembliesDict[assembly].id[0]], assembliesDict[assembly].id[1:])
      sys.stdout.write('%s' % nameStr)
      for filetype in fileOrder:
         if filetype.endswith('OverlapGene'):
            order = annotOrderGenes
         else:
            order = annotOrder
         for annot in order:
            aveHap = IntervalsTag()
            for hap in assembliesDict[assembly].valuesDict[filetype][annot]:
               it = assembliesDict[assembly].valuesDict[filetype][annot][hap]
               if options.bases:
                  fracStr = '%.2f' % ( float( it.totalComplete ) / it.baseLength )
                  numer = it.complete
                  denom = it.samples
               else:
                  fracStr = '%.2f' % ( float( it.complete ) / it.samples )
                  numer = it.complete
                  denom = it.samples
               if fracStr == '1.00' and ( numer != denom ):
                  fracStr = '0.99'
               if not options.aveHaps:
                  sys.stdout.write('\thapA%d %s' 
                                   % (hap, fracStr))
               else:
                  aveHap.complete += it.complete
                  aveHap.samples += it.samples
                  aveHap.totalComplete += it.totalComplete
                  aveHap.baseLength += it.baseLength
            if options.aveHaps:
               if options.bases:
                  fracStr = '%.2f' % ( float( aveHap.totalComplete ) / aveHap.baseLength )
                  numer = aveHap.totalComplete
                  denom = aveHap.baseLength
               else:
                  fracStr = '%.2f' % ( float( aveHap.complete ) / aveHap.samples )
                  numer = aveHap.complete
                  denom = aveHap.samples
               if fracStr == '1.00' and ( numer != denom ):
                  fracStr = '0.99'
               sys.stdout.write('\t%s' % fracStr)
      sys.stdout.write('\n')
def outputDict(assembliesDict, options):
    sortOrder = sorted(assembliesDict, key=lambda x: int(x[1:]))  # number
    sortOrder = sorted(sortOrder,
                       key=lambda x: assembliesDict[x].id[0])  # letter
    fileOrder = []
    if not options.noContigs:
        fileOrder += ['contigsOverlapGene', 'contigsOverlap']
    # if options.scaffolds:
    #    fileOrder += ['scaffoldsOverlapGene', 'scaffoldsOverlap']

    annotOrderGenes = ['transcripts']  # 'cds'
    annotOrder = ['cds', 'utr', 'nxe+nge', 'repeat']  # 'island'
    fileNameMap = {'contigsOverlapGene': 'COG', 'contigsOverlap': 'CO'}
    annotNameMap = {
        'transcripts': 'xcript',
        'cds': 'cds',
        'utr': 'utr',
        'nxe+nge': 'nxe+nge',
        'repeat': 'repeat'
    }

    # print the header
    sys.stdout.write('#ID')
    i = -1
    for f in fileOrder:
        i += 1
        if f.endswith('OverlapGene'):
            order = annotOrderGenes
        else:
            order = annotOrder
        for a in order:
            if options.bases:
                if options.aveHaps:
                    totalStr = lgn.prettyNumber(assembliesDict[
                        sortOrder[0]].valuesDict[f][a][1].baseLength +
                                                assembliesDict[sortOrder[0]].
                                                valuesDict[f][a][2].baseLength)
                else:
                    totalStr = '%s, %s' % (lgn.prettyNumber(assembliesDict[
                        sortOrder[0]].valuesDict[f][a][1].baseLength),
                                           lgn.prettyNumber(
                                               assembliesDict[sortOrder[0]].
                                               valuesDict[f][a][2].baseLength))
            else:
                if options.aveHaps:
                    totalStr = lgn.prettyNumber(assembliesDict[
                        sortOrder[0]].valuesDict[f][a][1].samples +
                                                assembliesDict[sortOrder[0]].
                                                valuesDict[f][a][2].samples)
                else:
                    totalStr = '%s, %s' % (lgn.prettyNumber(assembliesDict[
                        sortOrder[0]].valuesDict[f][a][1].samples),
                                           lgn.prettyNumber(
                                               assembliesDict[sortOrder[0]].
                                               valuesDict[f][a][2].samples))
            sys.stdout.write('\t%s-%s (%s)' %
                             (fileNameMap[f], annotNameMap[a], totalStr))
    sys.stdout.write('\n')

    for assembly in sortOrder:
        if options.hideAssemblyNumbers:
            nameStr = '%s' % (lgn.idMap[assembliesDict[assembly].id[0]])
        else:
            nameStr = '%s.%s' % (lgn.idMap[assembliesDict[assembly].id[0]],
                                 assembliesDict[assembly].id[1:])
        sys.stdout.write('%s' % nameStr)
        for filetype in fileOrder:
            if filetype.endswith('OverlapGene'):
                order = annotOrderGenes
            else:
                order = annotOrder
            for annot in order:
                aveHap = IntervalsTag()
                for hap in assembliesDict[assembly].valuesDict[filetype][
                        annot]:
                    it = assembliesDict[assembly].valuesDict[filetype][annot][
                        hap]
                    if options.bases:
                        fracStr = '%.2f' % (float(it.totalComplete) /
                                            it.baseLength)
                        numer = it.complete
                        denom = it.samples
                    else:
                        fracStr = '%.2f' % (float(it.complete) / it.samples)
                        numer = it.complete
                        denom = it.samples
                    if fracStr == '1.00' and (numer != denom):
                        fracStr = '0.99'
                    if not options.aveHaps:
                        sys.stdout.write('\thapA%d %s' % (hap, fracStr))
                    else:
                        aveHap.complete += it.complete
                        aveHap.samples += it.samples
                        aveHap.totalComplete += it.totalComplete
                        aveHap.baseLength += it.baseLength
                if options.aveHaps:
                    if options.bases:
                        fracStr = '%.2f' % (float(aveHap.totalComplete) /
                                            aveHap.baseLength)
                        numer = aveHap.totalComplete
                        denom = aveHap.baseLength
                    else:
                        fracStr = '%.2f' % (float(aveHap.complete) /
                                            aveHap.samples)
                        numer = aveHap.complete
                        denom = aveHap.samples
                    if fracStr == '1.00' and (numer != denom):
                        fracStr = '0.99'
                    sys.stdout.write('\t%s' % fracStr)
        sys.stdout.write('\n')