def count_de_novos_per_transcript(ensembl, gene_id, de_novos=[]):
    """ count de novos in transcripts for a gene.
    
    Args:
        ensembl: EnsemblRequest object to request data from ensembl
        gene_id: HGNC symbol for gene
        de_novos: list of de novo positions, so we can check they all fit in
            the gene transcript
        
    Returns:
        dictionary of lengths and de novo counts, indexed by transcript IDs.
    """
    
    transcripts = get_transcript_ids(ensembl, gene_id)
    
    # TODO: allow for genes without any coding sequence.
    if len(transcripts) == 0:
        raise IndexError("{0} lacks coding transcripts".format(gene_id))
    
    # count the de novos observed in all transcripts
    counts = {}
    for key in transcripts:
        try:
            gene = construct_gene_object(ensembl, key)
            total = len(get_de_novos_in_transcript(gene, de_novos))
            if total > 0:
                counts[key] = {}
                counts[key]["n"] = total
                counts[key]["len"] = transcripts[key]
        except ValueError:
            pass
    
    return counts