import numpy

# R() is the reflectance of an object at a given band
# E() is the energy of the illuminant at a given band
# x_cmf() is the sensitivitiy of the X primary at a given band
# numpy.trapz(x_values, y_values) cacluated the area under a curve

X_curve   = []
Y_curve   = []
Z_curve   = []
K_curve   = []
for band in bands: #380, 385, 390...760
    X_curve.append(R(band) * E(band) * x_cmf(band))
    Y_curve.append(R(band) * E(band) * y_cmf(band))
    Z_curve.append(R(band) * E(band) * z_cmf(band))

    # calculate the y curve of a perfectly reflective object
    # this is the standard normalization constant.
    K_curve.append(1 * E(band) * y_cmf(band))

# calculate the area of a perfectly reflective object
K = numpy.trapz(K_curve, bands)

# normalize the other areas by the area of the perfectly
# reflective object
X = numpy.trapz(X_curve, bands) * (100/K)
Y = numpy.trapz(Y_curve, bands) * (100/K)
Z = numpy.trapz(Z_curve, bands) * (100/K)