<s> """<STR_LIT>""" <EOL> import math <EOL> GAMMA_REC709 = <NUM_LIT:0> <EOL> NTSCsystem = { "<STR_LIT:name>" : "<STR_LIT>" , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : GAMMA_REC709 } <EOL> EBUsystem = { "<STR_LIT:name>" : "<STR_LIT>" , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : GAMMA_REC709 } <EOL> SMPTEsystem = { "<STR_LIT:name>" : "<STR_LIT>" , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : GAMMA_REC709 } <EOL> HDTVsystem = { "<STR_LIT:name>" : "<STR_LIT>" , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : GAMMA_REC709 } <EOL> CIEsystem = { "<STR_LIT:name>" : "<STR_LIT>" , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : GAMMA_REC709 } <EOL> Rec709system = { "<STR_LIT:name>" : "<STR_LIT>" , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : <NUM_LIT> , "<STR_LIT>" : <NUM_LIT> , <EOL> "<STR_LIT>" : GAMMA_REC709 } <EOL> def upvp_to_xy ( up , vp ) : <EOL> xc = ( <NUM_LIT:9> * up ) / ( ( <NUM_LIT:6> * up ) - ( <NUM_LIT:16> * vp ) + <NUM_LIT:12> ) <EOL> yc = ( <NUM_LIT:4> * vp ) / ( ( <NUM_LIT:6> * up ) - ( <NUM_LIT:16> * vp ) + <NUM_LIT:12> ) <EOL> return ( xc , yc ) <EOL> def xy_toupvp ( xc , yc ) : <EOL> up = ( <NUM_LIT:4> * xc ) / ( ( - <NUM_LIT:2> * xc ) + ( <NUM_LIT:12> * yc ) + <NUM_LIT:3> ) <EOL> vp = ( <NUM_LIT:9> * yc ) / ( ( - <NUM_LIT:2> * xc ) + ( <NUM_LIT:12> * yc ) + <NUM_LIT:3> ) <EOL> return ( up , vp ) <EOL> def xyz_to_rgb ( cs , xc , yc , zc ) : <EOL> """<STR_LIT>""" <EOL> xr = cs [ "<STR_LIT>" ] <EOL> yr = cs [ "<STR_LIT>" ] <EOL> zr = <NUM_LIT:1> - ( xr + yr ) <EOL> xg = cs [ "<STR_LIT>" ] <EOL> yg = cs [ "<STR_LIT>" ] <EOL> zg = <NUM_LIT:1> - ( xg + yg ) <EOL> xb = cs [ "<STR_LIT>" ] <EOL> yb = cs [ "<STR_LIT>" ] <EOL> zb = <NUM_LIT:1> - ( xb + yb ) <EOL> xw = cs [ "<STR_LIT>" ] <EOL> yw = cs [ "<STR_LIT>" ] <EOL> zw = <NUM_LIT:1> - ( xw + yw ) <EOL> rx = ( yg * zb ) - ( yb * zg ) <EOL> ry = ( xb * zg ) - ( xg * zb ) <EOL> rz = ( xg * yb ) - ( xb * yg ) <EOL> gx = ( yb * zr ) - ( yr * zb ) <EOL> gy = ( xr * zb ) - ( xb * zr ) <EOL> gz = ( xb * yr ) - ( xr * yb ) <EOL> bx = ( yr * zg ) - ( yg * zr ) <EOL> by = ( xg * zr ) - ( xr * zg ) <EOL> bz = ( xr * yg ) - ( xg * yr ) <EOL> rw = ( ( rx * xw ) + ( ry * yw ) + ( rz * zw ) ) / yw <EOL> gw = ( ( gx * xw ) + ( gy * yw ) + ( gz * zw ) ) / yw <EOL> bw = ( ( bx * xw ) + ( by * yw ) + ( bz * zw ) ) / yw <EOL> rx = rx / rw <EOL> ry = ry / rw <EOL> rz = rz / rw <EOL> gx = gx / gw <EOL> gy = gy / gw <EOL> gz = gz / gw <EOL> bx = bx / bw <EOL> by = by / bw <EOL> bz = bz / bw <EOL> r = ( rx * xc ) + ( ry * yc ) + ( rz * zc ) <EOL> g = ( gx * xc ) + ( gy * yc ) + ( gz * zc ) <EOL> b = ( bx * xc ) + ( by * yc ) + ( bz * zc ) <EOL> return ( r , g , b ) <EOL> def inside_gamut ( r , g , b ) : <EOL> """<STR_LIT>""" <EOL> return ( r >= <NUM_LIT:0> ) and ( g >= <NUM_LIT:0> ) and ( b >= <NUM_LIT:0> ) <EOL> def constrain_rgb ( r , g , b ) : <EOL> """<STR_LIT>""" <EOL> w = - min ( [ <NUM_LIT:0> , r , g , b ] ) <EOL> if w > <NUM_LIT:0> : <EOL> r += w <EOL> g += w <EOL> b += w <EOL> return ( r , g , b ) <EOL> def gamma_correct ( cs , c ) : <EOL> """<STR_LIT>""" <EOL> gamma = cs . gamma <EOL> if gamma == GAMMA_REC709 : <EOL> cc = <NUM_LIT> <EOL> if c < cc : <EOL> c = ( ( <NUM_LIT> * math . pow ( cc , <NUM_LIT> ) ) - <NUM_LIT> ) / cc <EOL> else : <EOL> c = ( <NUM_LIT> * math . pow ( c , <NUM_LIT> ) ) - <NUM_LIT> <EOL> else : <EOL> c = math . pow ( c , <NUM_LIT:1.0> / gamma ) <EOL> return ( c ) <EOL> def gamma_correct_rgb ( cs , r , g , b ) : <EOL> r = gamma_correct ( cs , r ) <EOL> g = gamma_correct ( cs , g ) <EOL> b = gamma_correct ( cs , b ) <EOL> return ( r , g , b ) <EOL> def norm_rgb ( r , g , b ) : <EOL> """<STR_LIT>""" <EOL> greatest = max ( [ r , g , b ] ) <EOL> if greatest > <NUM_LIT:0> : <EOL> r /= greatest <EOL> g /= greatest <EOL> b /= greatest <EOL> return ( r , g , b ) <EOL> def spectrum_to_xyz ( spec_intens , temp ) : <EOL> """<STR_LIT>""" <EOL> cie_colour_match = [ <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] ] <EOL> X = <NUM_LIT:0> <EOL> Y = <NUM_LIT:0> <EOL> Z = <NUM_LIT:0> <EOL> for i , lamb in enumerate ( range ( <NUM_LIT> , <NUM_LIT> , <NUM_LIT:5> ) ) : <EOL> Me = spec_intens ( lamb , temp ) <EOL> X += Me * cie_colour_match [ i ] [ <NUM_LIT:0> ] <EOL> Y += Me * cie_colour_match [ i ] [ <NUM_LIT:1> ] <EOL> Z += Me * cie_colour_match [ i ] [ <NUM_LIT:2> ] <EOL> XYZ = ( X + Y + Z ) <EOL> x = X / XYZ <EOL> y = Y / XYZ <EOL> z = Z / XYZ <EOL> return ( x , y , z ) <EOL> def bb_spectrum ( wavelength , bbTemp = <NUM_LIT> ) : <EOL> """<STR_LIT>""" <EOL> wlm = wavelength * <NUM_LIT> <EOL> return ( <NUM_LIT> * <EOL> math . pow ( wlm , - <NUM_LIT> ) ) / ( math . exp ( <NUM_LIT> / ( wlm * bbTemp ) ) - <NUM_LIT:1.0> ) <EOL> """<STR_LIT>""" <EOL> if __name__ == "<STR_LIT:__main__>" : <EOL> print ( "<STR_LIT>" ) <EOL> print ( "<STR_LIT>" ) <EOL> for t in range ( <NUM_LIT:1000> , <NUM_LIT> , <NUM_LIT> ) : <EOL> x , y , z = spectrum_to_xyz ( bb_spectrum , t ) <EOL> r , g , b = xyz_to_rgb ( SMPTEsystem , x , y , z ) <EOL> print ( "<STR_LIT>" % ( t , x , y , z ) ) <EOL> r , g , b = constrain_rgb ( r , g , b ) <EOL> r , g , b = norm_rgb ( r , g , b ) <EOL> print ( "<STR_LIT>" % ( r , g , b ) ) </s>
