Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.stsci.edu/spst/UnixTransition/doc/pcalopt.py
Дата изменения: Fri Feb 28 14:46:11 2014
Дата индексирования: Sat Mar 1 13:55:47 2014
Кодировка:
#
# Module pcalopt
#
#***********************************************************************
"""

**PURPOSE** --
Plot constraint window and USR data.

**DEVELOPER** --
Don Chance

**MODIFICATION HISTORY** --
Initial implemetation 7/6/11
only plot visits with usr output. drc 7/21/11
suppress printing bannner pages. drc 8/4/11
"""
#***********************************************************************

import ccl_util
import matplotlib as mpl
mpl.use('PS')
import matplotlib.pyplot as plt
#from matplotlib.backends.backend_pdf import PdfPages
import time_util
import visit_util
import calendar_util
from suggest_sus import parse_usr, compact_usr_list
from math import ceil
import os
import spss_sys_util

__version__ = "8/4/11"

DEFAULT_PRINTER = 'hpc84'

STATUS_COLOR = {'SAA': 'yellow',
'CVZ': 'green',
'SAC': 'magenta',
'PSA': 'cyan',
'PAC': 'blue',
'' : 'red'}

def cmp_cands(cand1, cand2):
"""Sort by priority first, then SU id
"""
i = cmp(cand2.get('priority'), cand1.get('priority'))
if i == 0:
i = cmp(cand1.get('sunit_id'), cand2.get('sunit_id'))
return i

def get_usr_dict(calendar, usr_directory='.'):
"""Turn USR info into a dictionary with sunit_id as key.
"""
usr_dict = {}
usr_list = parse_usr(usr_directory, calendar)
usr_list = compact_usr_list(usr_list)
for usr in usr_list:
if usr_dict.has_key(usr.sunit_id):
usr_dict[usr.sunit_id].append(usr)
else:
usr_dict[usr.sunit_id] = [usr]
return usr_dict

def pcalopt_mpl(calendar, usr_directory='.'):
"""Generate matplotlib color graphics for constaint windows and USR info.
"""
plot_paths = []
candlist = calendar.get_candidates()
candlist.get('priority')
candlist.get('sis_used')
candlist.sort(cmp_cands)

#pp = PdfPages('multipage.pdf')
calstart = calendar.get_begin_time()
calend = calendar.get_end_time()
calwindow = time_util.window(calstart, calend)

orbital_period = float(calendar.get_orbit_file_obj().get_period())

usr_dict = get_usr_dict(calendar, usr_directory)

# get SAA windows
calendar.get()
caldisp = calendar_util.cal_display()
saas = caldisp.get_saa_list(30)
saawins = []
for saa in saas:
saawins.append((float(saa['begin_time']), float(saa['end_time'] - saa['begin_time'])))

# set up the x axis ticks and labels
xticks = []
xticklabels = []
ttime = calstart
if (int(float(ttime)/86400.) - int(ttime)/86400) != 0:
ttime = time_util.spss_time((int(ttime)/86400 + 1)*86400)
while ttime <= calend:
xticks.append(float(ttime))
xticklabels.append(ttime.strftime('%j'))
ttime += 86400.

pltcount = 1
count = 0
VISITS_PER_PLOT = 24
YSCALE = 5
yticks = [YSCALE/2]
yticklabels = ['SAA']
Y = 0
fig = plt.figure()
#plt.grid(True)
ax = fig.add_subplot(111)
numplots = len(usr_dict)/VISITS_PER_PLOT
if len(usr_dict)%VISITS_PER_PLOT:
numplots += 1
for cand in candlist:
# Only plot SUs that have USR output
if cand.get('sunit_id') not in usr_dict.keys():
continue
if count == VISITS_PER_PLOT:
count = 0
Y=0
yticks = [YSCALE/2]
yticklabels = ['SAA']
fig = plt.figure()
ax = fig.add_subplot(111)
count += 1

# set up y axis
Y += YSCALE
yrange = (Y, YSCALE-1)
ypos = Y + YSCALE/2
yticks.append(ypos)
priority = cand.get('priority')
if not priority:
priority = '0'

# turn the candidate into a visit so we can get at the
# constraint_windows
v=visit_util.visit(cand)
cws=v.get_constraint_windows()

# construct y axis labels from sunit_id, priority, etc
yticklabels.append('%7s %3s %4s %2i' % (str(cand.get('sunit_id')),
priority,
cand.get('sis_used'),
v.get('est_orbits', 0)
))

# turn the candidate into a visist so we can get at the
# constraint_windows
v=visit_util.visit(cand)
cws=v.get_constraint_windows()

cal_cws = []
for w in cws:
cal_cws.append(w.intersection(calwindow))

calwins = []
fcolors = []
for calwin in cal_cws:
if calwin:
calwins.append((float(calwin.start), float(calwin.size())))
fcolors.append(STATUS_COLOR[calwin.status[0].strip()])

# plot the constraint windows for cand
ax.broken_barh(calwins , yrange, facecolors=fcolors)

# plot usr data on top of constaint windows
if usr_dict.has_key(cand.get('sunit_id')):
for usr in usr_dict[cand.get('sunit_id')]:
orbits=int(ceil(float(time_util.delta_time(usr.duration))/orbital_period))
xpos = float(usr.pcs_start_time)
if float(calstart) <= xpos <= float(calend):
ax.text(xpos, ypos, orbits, fontsize='xx-small', ha='left', va='center')

if count == VISITS_PER_PLOT:
fig.subplots_adjust(left=0.2, right=0.95)
ax.broken_barh(saawins, (0, YSCALE-1))
ax.grid(True)
ax.set_xlim(float(calstart), float(calend))
ax.set_ylim(0,YSCALE*(VISITS_PER_PLOT+2))
ax.set_xlabel('DOY')
ax.set_xticks(xticks)
ax.set_yticks(yticks)
ax.set_xticklabels(xticklabels, family='monospace')
ax.set_yticklabels(yticklabels, family='monospace', fontsize='x-small')
ax.set_title('Constraint windows + USR Data for %s (%i of %i)' % (str(calendar), pltcount, numplots))
ax.set_ylim(ax.get_ylim()[::-1])
ax.text(float(calstart)-1.5*86400.0, -YSCALE, 'SU Pri SIs est-orb', weight='bold', family='monospace', fontsize='x-small')
pltpath = os.path.join(usr_directory, 'plt%02i' % pltcount)
plt.savefig(pltpath, orientation='landscape')
plot_paths.append(pltpath + '.ps')
pltcount += 1

if count != VISITS_PER_PLOT:
fig.subplots_adjust(left=0.2, right=0.95)
ax.broken_barh(saawins, (0, YSCALE-1))
ax.grid(True)
ax.set_xlim(float(calstart), float(calend))
ax.set_ylim(0,YSCALE*(count+2))
ax.set_xlabel('DOY')
ax.set_xticks(xticks)
ax.set_yticks(yticks)
ax.set_xticklabels(xticklabels, family='monospace')
ax.set_yticklabels(yticklabels, family='monospace', fontsize='x-small')
ax.set_title('Constraint windows for %s (%i of %i)' % (str(calendar), pltcount, numplots))
ax.set_ylim(ax.get_ylim()[::-1])
pltpath = os.path.join(usr_directory,'plt%02i' % pltcount)
plt.savefig(pltpath, orientation='landscape')
plot_paths.append(pltpath + '.ps')

return plot_paths

def print_plots(calendar, usr_directory='.', print_key=True, printer=None):
if not printer:
printer = spss_sys_util.get_environ_variable('COLOR_PRINTER')
if printer:
printer = printer[0]
else:
printer = DEFAULT_PRINTER
files = ''
if print_key:
files += ' %s' % make_key(usr_directory)
for plot in pcalopt_mpl(calendar, usr_directory):
files += ' %s' % plot
os.system('lp -d %s -o nobanner %s' % (printer, files))

def make_key(usr_directory='.'):
"""Construct the key.
"""
fig = plt.figure()
fig.subplots_adjust(left=0.45)
fig.set_figwidth(4.5)
fig.set_figheight(3.5)
ax = fig.add_subplot(111)
ax.broken_barh([(0,5)], (0,5), facecolors=[STATUS_COLOR['']]) # free demander
ax.broken_barh([(0,5)], (5,9), facecolors=[STATUS_COLOR['PSA']]) # partial hider
ax.broken_barh([(0,5)], (10,14), facecolors=[STATUS_COLOR['SAA']]) # SAA hider
ax.broken_barh([(0,5)], (15,19), facecolors=[STATUS_COLOR['PAC']]) # partial SAA hider + CVZ
ax.broken_barh([(0,5)], (20,24), facecolors=[STATUS_COLOR['CVZ']]) # CVZ
ax.broken_barh([(0,5)], (25,29), facecolors=[STATUS_COLOR['SAC']]) # CVZ + hider
ax.grid(False)
ax.set_xlim(0,5)
ax.set_ylim(0,30)
ax.set_xticks([])
ax.set_yticks((2,7,12,17,22,27))
ax.set_yticklabels(('Free Demander',
'Partial SAA Hider',
'SAA Hider',
'Partial SAA hider + CVZ',
'Schedulable in the CVZ',
'CVZ + SAA hider'))
ax.set_title('Key')
path = os.path.join(usr_directory, 'key')
plt.savefig(path, orientation='landscape')
return path + '.ps'