def get_preferred_title(transcript_id, nucleotide_change, gene_name='', amino_acid_change=''):
  """Method to return the variant preferred title. Examples given as below.
  
  `NM_015506.3(MMACHC):c.436_450del (p.Ser146_Ile150del)`

  NM: Chromosome

  015506: Gene on chromosome (a gene produces certain protein)

  MMACHC: Symbol represent the gene

  c.436_450del: Nucleotide change

  p.Ser146_Ile150del: Name of the amino acid (protein) change

  ### Other Examples
    
  Regarding the title format, below gives another example:

  When both gene name and protein effect information are available, the format will be `NM_002496.4(Gene):c.64C>T (Amino-acid change)`.

  When protein effect is unavailable, the format will be `NM_002496.4(Gene):c.64C>T`.

  When both gene and protein effect not available, will fall back to hgvs format `NM_002496.4:c.64C>T`.

  When gene name is unavailable, amino-acid change is unavailable as well, so the format will fallback to hgvs as above.


  """

  if not (transcript_id and nucleotide_change):
    return

  if not gene_name:
    return '{coordinate}:{nucleotide_change}'.format(coordinate=transcript_id, nucleotide_change=nucleotide_change)
  
  # when gene name is unavailable, then there will be no amino-acid change, where title will fall back to hgvs form, i.e. transcriptId:nucleotideChange
  if not amino_acid_change:
    return '{coordinate}({gene_symbol}):{nucleotide_change}'.format(
      coordinate=transcript_id, 
      nucleotide_change=nucleotide_change,
      gene_symbol=gene_name
    )
  
  return '{coordinate}({gene_symbol}):{nucleotide_change} ({amino_acid_change})'.format(
    coordinate=transcript_id, 
    nucleotide_change=nucleotide_change,
    gene_symbol=gene_name,
    amino_acid_change=amino_acid_change
  )