def top_result(self):
        """Return top `blastn` result
        Try to find a 100% identity and coverage result (perfect match).
        If one does not exist, then retrieve the result with the highest bitscore.

        Returns:
            Ordered dict of BLASTN results or None if no BLASTN results generated
        """

        if self.is_missing:
            return None

        df_perfect_matches = self.df[(self.df['coverage'] == 1.0) & (self.df['pident'] == 100.0)]
        if df_perfect_matches.shape[0]:
            self.is_perfect_match = True
            return BlastReader.df_first_row_to_dict(df_perfect_matches)

        # Return the result with the highest bitscore.
        # This is the first result in dataframe since the df is ordered by
        # bitscore in descending order.
        result_dict = BlastReader.df_first_row_to_dict(self.df)
        result_trunc = BlastReader.is_blast_result_trunc(qstart=result_dict['qstart'],
                                                         qend=result_dict['qend'],
                                                         sstart=result_dict['sstart'],
                                                         send=result_dict['send'],
                                                         qlen=result_dict['qlen'],
                                                         slen=result_dict['slen'])
        self.is_trunc = result_trunc
        return result_dict