def guess_phred_format(self):
        """Guess the PHRED score format. The gold standard is the first one, aka
        the one called "Sanger". Sanger encoding is exactly equivalent to
        Illumina-1.8 encoding. In other words, they finally gave up with their bullshit."""
        # Possibilities #
        self.intervals = {
            'Sanger':       (33,  74),         # <- This one is the gold standard
            'Solexa':       (59, 105),
            'Illumina-1.3': (64, 105),         # <- These were abandoned after they wised up.
            'Illumina-1.5': (67, 105),         # <- These were abandoned after they wised up.
        }
        # Initialize variables #
        glob_min  = 9999
        glob_max  = 0
        take_next = False
        # Stop after #
        max_sequences_to_consider = 2000000
        # Error message #
        message = "Multiple PHRED encodings possible for '%s'.\n"
        # Loop #
        self.open()
        for i, line in enumerate(self.handle):
            # Are we on the PHRED line? #
            if not take_next:
                take_next = line.startswith('+')
                continue
            # Now we are on the PHRED line! #
            take_next = False
            current_min, current_max = self.get_qual_range(line.rstrip('\n'))
            if current_min < glob_min or current_max > glob_max:
                glob_min = min(current_min, glob_min)
                glob_max = max(current_max, glob_max)
                valid_encodings = [e for e, r in self.intervals.items() if glob_min >= r[0] and glob_max <= r[1]]
                if len(valid_encodings) == 0:
                    message = "Illegal PHRED encoding for '%s'.\n"
                    break
                if len(valid_encodings) == 1:
                    return valid_encodings[0]
            # Stop condition #
            if i >= max_sequences_to_consider: break
        # It didn't work #
        message += "Maximum detected value is: %s.\n"
        message += "Minimum detected value is: %s.\n"
        message += "Possibilities are: %s."
        message  = message % (self, glob_max, glob_min, ' or '.join(valid_encodings))
        raise Exception(message)
def guess_phred_format ( self ) : self . intervals = { 'Sanger' : ( 33 , 74 ) , 'Solexa' : ( 59 , 105 ) , 'Illumina-1.3' : ( 64 , 105 ) , 'Illumina-1.5' : ( 67 , 105 ) , } glob_min = 9999 glob_max = 0 take_next = False max_sequences_to_consider = 2000000 message = "Multiple PHRED encodings possible for '%s'.\n" self . open ( ) for i , line in enumerate ( self . handle ) : if not take_next : take_next = line . startswith ( '+' ) continue take_next = False current_min , current_max = self . get_qual_range ( line . rstrip ( '\n' ) ) if current_min < glob_min or current_max > glob_max : glob_min = min ( current_min , glob_min ) glob_max = max ( current_max , glob_max ) valid_encodings = [ e for e , r in self . intervals . items ( ) if glob_min >= r [ 0 ] and glob_max <= r [ 1 ] ] if len ( valid_encodings ) == 0 : message = "Illegal PHRED encoding for '%s'.\n" break if len ( valid_encodings ) == 1 : return valid_encodings [ 0 ] if i >= max_sequences_to_consider : break message += "Maximum detected value is: %s.\n" message += "Minimum detected value is: %s.\n" message += "Possibilities are: %s." message = message % ( self , glob_max , glob_min , ' or ' . join ( valid_encodings ) ) raise Exception ( message )
Guess the PHRED score format. The gold standard is the first one, aka
        the one called "Sanger". Sanger encoding is exactly equivalent to
        Illumina-1.8 encoding. In other words, they finally gave up with their bullshit.