def compute_aa_CDR3_pgen(self, CDR3_seq, V_usage_mask_in = None, J_usage_mask_in = None, print_warnings = True):
        """Compute Pgen for the amino acid sequence CDR3_seq.
    
        Conditioned on the V genes/alleles indicated in V_usage_mask_in and the 
        J genes/alleles in J_usage_mask_in. (Examples are TCRB sequences/model)
    
        Parameters
        ----------
        CDR3_seq : str
            CDR3 sequence composed of 'amino acids' -- the standard amino acids, 
            plus any custom symbols for an expanded codon alphabet (note the 
            standard ambiguous amino acids -- B, J, X, and Z -- are included by
            default).
        V_usage_mask_in : str or list
            An object to indicate which V alleles should be considered. The default
            input is None which returns the list of all productive V alleles.
        J_usage_mask_in : str or list
            An object to indicate which J alleles should be considered. The default
            input is None which returns the list of all productive J alleles.
        print_warnings : bool
            Determines whether warnings are printed or not. Default ON.
    
        Returns
        -------
        pgen : float
            The generation probability (Pgen) of the sequence
        
        Examples
        --------
        >>> generation_probability.compute_aa_CDR3_pgen('CAWSVAPDRGGYTF')
        1.5756106696284584e-10
        >>> generation_probability.compute_aa_CDR3_pgen('CAWSVAPDRGGYTF', 'TRBV30*01', 'TRBJ1-2*01')
        1.203646865765782e-10
        >>> generation_probability.compute_aa_CDR3_pgen('CAWXXXXXXXGYTF')
        7.8102586432014974e-05
            
        """
        if len(CDR3_seq) == 0:
            return  0
        for aa in CDR3_seq:
            if aa not in self.codons_dict.keys():
                #Check to make sure all symbols are accounted for
                if print_warnings:
                    print 'Invalid amino acid CDR3 sequence --- unfamiliar symbol: ' + aa
                return 0    
        
        V_usage_mask, J_usage_mask = self.format_usage_masks(V_usage_mask_in, J_usage_mask_in, print_warnings)
        
        return self.compute_CDR3_pgen(CDR3_seq, V_usage_mask, J_usage_mask)