public synchronized int[] aaNumber2Pos() {
		if (aa2pos != null) return aa2pos;

		calcCdsStartEnd();

		aa2pos = new int[protein().length()];
		for (int i = 0; i < aa2pos.length; i++)
			aa2pos[i] = -1;

		int cdsMin = Math.min(cdsStart, cdsEnd);
		int cdsMax = Math.max(cdsStart, cdsEnd);

		// For each exon, add CDS position to array
		int aaBaseNum = 0;
		for (Exon exon : sortedStrand()) {
			int min = isStrandPlus() ? exon.getStart() : exon.getEnd();
			int step = isStrandPlus() ? 3 : -3;
			for (int pos = min; exon.intersects(pos) && aaBaseNum < aa2pos.length; pos += step)
				if ((cdsMin <= pos) && (pos <= cdsMax)) aa2pos[aaBaseNum++] = pos;
		}

		return aa2pos;
	}