CMS 3D CMS Logo

/data/git/CMSSW_5_3_11_patch5/src/RecoLuminosity/LumiDB/python/matplotRender.py

Go to the documentation of this file.
00001 '''
00002 Specs:
00003 -- We use matplotlib OO class level api, we do not use its high-level helper modules. Favor endured stability over simplicity. 
00004 -- PNG as default batch file format
00005 -- we support http mode by sending string buf via meme type image/png. Sending a premade static plot to webserver is considered a uploading process instead of http dynamic graphical mode. 
00006 '''
00007 import sys,os
00008 import numpy,datetime
00009 import matplotlib
00010 from RecoLuminosity.LumiDB import CommonUtil,lumiTime,csvReporter
00011 
00012 batchonly=False
00013 if not os.environ.has_key('DISPLAY') or not os.environ['DISPLAY']:
00014     batchonly=True
00015     matplotlib.use('Agg',warn=False)
00016 else:
00017     try:
00018         from RecoLuminosity.LumiDB import lumiQTWidget  
00019     except ImportError:
00020         print 'unable to import GUI backend, switch to batch only mode'
00021         matplotlib.use('Agg',warn=False)
00022         batchonly=True
00023 from matplotlib.backends.backend_agg import FigureCanvasAgg as CanvasBackend
00024 from matplotlib.figure import Figure
00025 from matplotlib.font_manager import fontManager,FontProperties
00026 matplotlib.rcParams['lines.linewidth']=1.5
00027 matplotlib.rcParams['grid.linewidth']=0.2
00028 matplotlib.rcParams['xtick.labelsize']=11
00029 matplotlib.rcParams['ytick.labelsize']=11
00030 matplotlib.rcParams['legend.fontsize']=10
00031 matplotlib.rcParams['axes.labelsize']=11
00032 matplotlib.rcParams['font.weight']=567
00033 
00034 def guessInstLumiUnit(t):
00035     '''
00036     input : largest total lumivalue
00037     output: (unitstring,denomitor)
00038     '''
00039     unitstring='$\mu$b$^{-1}$s$^{-1}$'
00040     denomitor=1.0
00041     if t>=1.0e3 and t<1.0e06:
00042         denomitor=1.0e3
00043         unitstring='nb$^{-1}$s$^{-1}$'
00044     elif t>=1.0e6 and t<1.0e9:
00045         denomitor=1.0e6
00046         unitstring='pb$^{-1}$s$^{-1}$'
00047     elif t>=1.0e9 and t<1.0e12:
00048         denomitor=1.0e9
00049         unitstring='fb$^{-1}$s$^{-1}$'
00050     elif  t>=1.0e12 and t<1.0e15:
00051         denomitor=1.0e12
00052         unitstring='ab$^{-1}$s$^{-1}$'
00053     elif t<=1.0e-3 and t>1.0e-6: #left direction
00054         denomitor=1.0e-3
00055         unitstring='mb$^{-1}$s$^{-1}$'
00056     elif t<=1.0e-6 and t>1.0e-9:
00057         denomitor=1.0e-6
00058         unitstring='b$^{-1}$s$^{-1}$'
00059     elif t<=1.0e-9 and t>1.0e-12:
00060         denomitor=1.0e-9
00061         unitstring='kb$^{-1}$s$^{-1}$'
00062     return (unitstring,denomitor)
00063 
00064 def guessLumiUnit(t):
00065     '''
00066     input : largest total lumivalue
00067     output: (unitstring,denomitor)
00068     '''
00069     unitstring='$\mu$b$^{-1}$'
00070     denomitor=1.0
00071     if t>=1.0e3 and t<1.0e06:
00072         denomitor=1.0e3
00073         unitstring='nb$^{-1}$'
00074     elif t>=1.0e6 and t<1.0e9:
00075         denomitor=1.0e6
00076         unitstring='pb$^{-1}$'
00077     elif t>=1.0e9 and t<1.0e12:
00078         denomitor=1.0e9
00079         unitstring='fb$^{-1}$'
00080     elif  t>=1.0e12 and t<1.0e15:
00081         denomitor=1.0e12
00082         unitstring='ab$^{-1}$'
00083     elif t<=1.0e-3 and t>1.0e-6: #left direction
00084         denomitor=1.0e-3
00085         unitstring='mb$^{-1}$'
00086     elif t<=1.0e-6 and t>1.0e-9:
00087         denomitor=1.0e-6
00088         unitstring='b$^{-1}$'
00089     elif t<=1.0e-9 and t>1.0e-12:
00090         denomitor=1.0e-9
00091         unitstring='kb$^{-1}$'
00092     return (unitstring,denomitor)
00093 
00094 class matplotRender():
00095     def __init__(self,fig):
00096         self.__fig=fig
00097         self.__canvas=''
00098         self.colormap={}
00099         self.colormap['Delivered']='r'
00100         self.colormap['Recorded']='b'
00101         self.colormap['Effective']='g'
00102         self.colormap['Max Inst']='r'
00103 
00104     def plotSumX_Run(self,rawdata={},resultlines=[],minRun=None,maxRun=None,nticks=6,yscale='linear',withannotation=False,referenceLabel='Delivered',labels=['Delivered','Recorded'],textoutput=None):
00105         '''
00106         input:
00107           rawdata = {'Delivered':[(runnumber,lumiperrun),..],'Recorded':[(runnumber,lumiperrun),..]}
00108           resultlines = [[runnumber,dellumiperrun,reclumiperrun],[runnumber,dellumiperrun,reclumiperrun],]
00109           minRun : minimal runnumber required
00110           maxRun : max runnumber required
00111           yscale: linear,log or both
00112           withannotation: wheather the boundary points should be annotated
00113           referenceLabel: the one variable that decides the total unit and the plot x-axis range
00114           labels: labels of the variables to plot
00115           textoutput: text output file name. 
00116         '''
00117         ypoints={}
00118         ytotal={}
00119         for r in resultlines:#parse old text data
00120             runnumber=int(r[0])
00121             if rawdata and runnumber in [t[0] for t in rawdata[referenceLabel]]:continue#use text input only if not in selected data
00122             if minRun and runnumber<minRun: continue
00123             if maxRun and runnumber>maxRun: continue
00124             for i,lab in enumerate(labels) :
00125                 v=float(r[-(len(labels)-i)-1])#the values to plot are always the last n fields
00126                 rawdata.setdefault(lab,[]).append((runnumber,v))
00127         if not rawdata:
00128             print '[WARNING]: no data to plot , exit'
00129             return
00130       
00131         tot=sum([t[1] for t in rawdata[referenceLabel]])
00132         (unitstring,denomitor)=guessLumiUnit(tot)
00133         csvreport=None
00134         rows=[]
00135         flat=[]
00136         for label,yvalues in rawdata.items():
00137             yvalues.sort()
00138             flat.append([t[1] for t in yvalues])
00139             ypoints[label]=[]
00140             ytotal[label]=0.0
00141             lumivals=[t[1] for t in yvalues]
00142             for i,val in enumerate(lumivals):
00143                 ypoints[label].append(sum(lumivals[0:i+1])/denomitor)#integrated lumi
00144             ytotal[label]=sum(lumivals)/denomitor
00145         xpoints=[t[0] for t in rawdata[referenceLabel]]
00146         ax=self.__fig.add_subplot(111)
00147         if yscale=='linear':
00148             ax.set_yscale('linear')
00149         elif yscale=='log':
00150             ax.set_yscale('log')
00151         else:
00152             raise 'unsupported yscale ',yscale
00153         ax.set_xlabel(r'Run',position=(0.95,0))
00154         ax.set_ylabel(r'L '+unitstring,position=(0,0.9))
00155         xticklabels=ax.get_xticklabels()
00156         for tx in xticklabels:
00157             tx.set_rotation(30)
00158         majorLocator=matplotlib.ticker.LinearLocator( nticks )
00159         majorFormatter=matplotlib.ticker.FormatStrFormatter('%d')
00160         minorLocator=matplotlib.ticker.LinearLocator(numticks=4*nticks)
00161         ax.xaxis.set_major_locator(majorLocator)
00162         ax.xaxis.set_major_formatter(majorFormatter)
00163         ax.xaxis.set_minor_locator(minorLocator)
00164         ax.set_xbound(lower=xpoints[0],upper=xpoints[-1])
00165         ax.grid(True)
00166         keylist=ypoints.keys()
00167         keylist.sort()
00168         keylist.insert(0,keylist.pop(keylist.index(referenceLabel)))#move refereceLabel to front from now on
00169         legendlist=[]
00170         head=['#Run']
00171         textsummaryhead=['#TotalRun']
00172         textsummaryline=['#'+str(len(xpoints))]
00173         for ylabel in keylist:
00174             cl='k'
00175             if self.colormap.has_key(ylabel):
00176                 cl=self.colormap[ylabel]
00177             ax.plot(xpoints,ypoints[ylabel],label=ylabel,color=cl,drawstyle='steps')
00178             legendlist.append(ylabel+' '+'%.3f'%(ytotal[ylabel])+' '+unitstring)
00179             textsummaryhead.append('Total'+ylabel)
00180             textsummaryline.append('%.3f'%(ytotal[ylabel])+' '+unitstring)
00181             head.append(ylabel)
00182         if textoutput:
00183             csvreport=csvReporter.csvReporter(textoutput)
00184             csvreport.writeRow(head)
00185             allruns=[int(t[0]) for t in rawdata[referenceLabel]]
00186             flat.insert(0,allruns)
00187             rows=zip(*flat)
00188             csvreport.writeRows([list(t) for t in rows])
00189             csvreport.writeRow(textsummaryhead)
00190             csvreport.writeRow(textsummaryline)
00191         #font=FontProperties(size='medium',weight='demibold')
00192         #legend
00193         ax.legend(tuple(legendlist),loc='upper left')
00194         #adjust
00195         self.__fig.subplots_adjust(bottom=0.18,left=0.1)
00196         #annotations
00197         if withannotation:
00198             trans=matplotlib.transforms.BlendedGenericTransform(ax.transData,ax.transAxes)
00199             ax.text(xpoints[0],1.025,str(xpoints[0]),transform=trans,horizontalalignment='left',size='x-small',color='green',bbox=dict(facecolor='white'))
00200             ax.text(xpoints[-1],1.025,str(xpoints[-1]),transform=trans,horizontalalignment='left',size='x-small',color='green',bbox=dict(facecolor='white'))
00201         
00202     
00203     def plotSumX_Fill(self,rawdata={},resultlines=[],minFill=None,maxFill=None,nticks=6,yscale='linear',withannotation=False,referenceLabel='Delivered',labels=['Delivered','Recorded'],textoutput=None):
00204         '''
00205         input:
00206         rawdata = {'Delivered':[(fill,runnumber,lumiperrun)],'Recorded':[(fill,runnumber,lumiperrun)]}
00207         resultlines = [[fillnumber,runnumber,dellumiperrun,reclumiperrun],[fillnumber,runnumber,dellumiperrun,reclumiperrun],]
00208         minFill : min fill to draw
00209         maxFill : max fill to draw
00210         yscale: linear,log or both
00211         withannotation: wheather the boundary points should be annotated
00212         textoutput: text output file name. 
00213         '''
00214         ytotal={}
00215         ypoints={}
00216         for r in resultlines: #parse old text data
00217             fillnum=int(r[0])
00218             runnum=int(r[1])
00219             if rawdata and (fillnum,runnum) in [(t[0],t[1]) for t in rawdata[referenceLabel]]:continue
00220             if minFill and fillnum<minFill:continue
00221             if maxFill and fillnum>maxFill:continue
00222             for i,lab in enumerate(labels) :
00223                 v=float(r[-(len(labels)-i)])#the values to plot are always the last n fields
00224                 rawdata.setdefault(lab,[]).append((fillnum,runnum,v))
00225         #print 'fillrunDict ',fillrunDict
00226         if not rawdata:
00227             print '[WARNING]: no data, do nothing'
00228             return
00229         tot=sum([t[2] for t in rawdata[referenceLabel]])
00230         beginfo=''
00231         endinfo=''
00232         (unitstring,denomitor)=guessLumiUnit(tot)
00233         csvreport=None
00234         rows=[]
00235         flat=[]
00236         for label,yvalues in rawdata.items():
00237             yvalues.sort()
00238             flat.append([t[2] for t in yvalues])
00239             ypoints[label]=[]
00240             ytotal[label]=0.0
00241             lumivals=[t[2] for t in yvalues]
00242             for i,val in enumerate(lumivals):
00243                 ypoints[label].append(sum(lumivals[0:i+1])/denomitor)
00244             ytotal[label]=sum(lumivals)/denomitor
00245         xpoints=[t[0] for t in rawdata[referenceLabel]]#after sort
00246         ax=self.__fig.add_subplot(111)
00247         ax.set_xlabel(r'LHC Fill Number',position=(0.84,0))
00248         ax.set_ylabel(r'L '+unitstring,position=(0,0.9))
00249         ax.set_xbound(lower=xpoints[0],upper=xpoints[-1])
00250         if yscale=='linear':
00251             ax.set_yscale('linear')
00252         elif yscale=='log':
00253             ax.set_yscale('log')
00254         else:
00255             raise 'unsupported yscale ',yscale
00256         xticklabels=ax.get_xticklabels()
00257         majorLocator=matplotlib.ticker.LinearLocator( nticks )
00258         majorFormatter=matplotlib.ticker.FormatStrFormatter('%d')
00259         #minorLocator=matplotlib.ticker.MultipleLocator(sampleinterval)
00260         ax.xaxis.set_major_locator(majorLocator)
00261         ax.xaxis.set_major_formatter(majorFormatter)
00262         #ax.xaxis.set_minor_locator(minorLocator)
00263         ax.grid(True)
00264         keylist=ypoints.keys()
00265         keylist.sort()
00266         keylist.insert(0,keylist.pop(keylist.index(referenceLabel)))#move refereceLabel to front from now on
00267         legendlist=[]
00268         head=['#fill','run']        
00269         textsummaryhead=['#TotalFill']
00270         textsummaryline=['#'+str(len(xpoints))]
00271         for ylabel in keylist:
00272             cl='k'
00273             if self.colormap.has_key(ylabel):
00274                 cl=self.colormap[ylabel]
00275             ax.plot(xpoints,ypoints[ylabel],label=ylabel,color=cl,drawstyle='steps')
00276             legendlist.append(ylabel+' '+'%.3f'%(ytotal[ylabel])+' '+unitstring)
00277             textsummaryhead.append('Total'+ylabel)
00278             textsummaryline.append('%.3f'%(ytotal[ylabel])+' '+unitstring)
00279             head.append(ylabel)
00280         if textoutput:
00281             csvreport=csvReporter.csvReporter(textoutput)
00282             allfills=[int(t[0]) for t in rawdata[referenceLabel]]
00283             allruns=[int(t[1]) for t in rawdata[referenceLabel]]
00284             flat.insert(0,allfills)
00285             flat.insert(1,allruns)
00286             rows=zip(*flat)
00287             csvreport.writeRow(head)
00288             csvreport.writeRows([list(t) for t in rows])
00289             csvreport.writeRow(textsummaryhead)
00290             csvreport.writeRow(textsummaryline)
00291         #font=FontProperties(size='medium',weight='demibold')
00292         #annotations
00293         if withannotation:
00294             trans=matplotlib.transforms.BlendedGenericTransform(ax.transData,ax.transAxes)
00295             ax.text(xpoints[0],1.025,beginfo,transform=trans,horizontalalignment='left',size='x-small',color='green',bbox=dict(facecolor='white'))
00296             ax.text(xpoints[-1],1.025,endinfo,transform=trans,horizontalalignment='left',size='x-small',color='green',bbox=dict(facecolor='white'))
00297         #legend
00298         ax.legend(tuple(legendlist),loc='upper left')
00299         #adjust
00300         self.__fig.subplots_adjust(bottom=0.1,left=0.1)
00301         
00302     def plotSumX_Time(self,rawdata={},resultlines=[],minTime=None,maxTime=None,nticks=6,yscale='linear',withannotation=False,referenceLabel='Delivered',labels=['Delivered','Recorded'],textoutput=None):
00303         '''
00304         input:
00305         rawdata = {'Delivered':[(runnumber,starttimestamp,stoptimestamp,lumiperrun)],'Recorded':[(runnumber,starttimestamp,stoptimestamp,lumiperrun)]}
00306         resultlines = [[runnumber,starttimestampStr,stoptimestampStr,dellumiperrun,reclumiperrun],[runnumber,starttimestampStr,stoptimestampStr,dellumiperrun,reclumiperrun],]
00307         minTime (python DateTime) : min *begin* time to draw: format %m/%d/%y %H:%M:%S
00308         maxTime (python DateTime): max *begin* time to draw %m/%d/%y %H:%M:%S
00309         yscale: linear,log or both
00310         withannotation: wheather the boundary points should be annotated
00311         referenceLabel: the one variable that decides the total unit and the plot x-axis range
00312         labels: labels of the variables to plot
00313         '''
00314         xpoints=[]
00315         ypoints={}
00316         ytotal={}
00317         lut=lumiTime.lumiTime()
00318         if not minTime:
00319             minTime='03/01/10 00:00:00'
00320         minTime=lut.StrToDatetime(minTime,customfm='%m/%d/%y %H:%M:%S')
00321         if not maxTime:
00322             maxTime=datetime.datetime.utcnow()
00323         else:
00324             maxTime=lut.StrToDatetime(maxTime,customfm='%m/%d/%y %H:%M:%S')
00325         for r in resultlines:
00326             runnumber=int(r[0])
00327             starttimeStr=r[1].split('.')[0]
00328             starttime=lut.StrToDatetime(starttimeStr,customfm='%Y-%m-%d %H:%M:%S')
00329             stoptimeStr=r[2].split('.')[0]
00330             stoptime=lut.StrToDatetime(stoptimeStr,customfm='%Y-%m-%d %H:%M:%S')
00331             if rawdata and runnumber in [t[0] for t in rawdata[referenceLabel]]:continue
00332             if starttime<minTime:continue
00333             if starttime>maxTime:continue
00334                 
00335             for i,lab in enumerate(labels):
00336                 v=float(r[-(len(labels)-i)])
00337                 rawdata.setdefault(lab,[]).append((runnumber,starttime,stoptime,v))        
00338         if not rawdata:
00339             print '[WARNING]: no data, do nothing'
00340             return
00341         tot=sum([t[3] for t in rawdata[referenceLabel]])
00342         (unitstring,denomitor)=guessLumiUnit(tot)
00343         csvreport=None
00344         rows=[]
00345         flat=[]
00346         for label,yvalues in rawdata.items():
00347             yvalues.sort()
00348             flat.append([t[3] for t in yvalues])
00349             if label==referenceLabel:
00350                 minTime=yvalues[0][1]
00351                 maxTime=yvalues[-1][1]
00352             ypoints[label]=[]
00353             lumivals=[t[3] for t in yvalues]
00354             for i,val in enumerate(lumivals):
00355                 ypoints[label].append(sum(lumivals[0:i+1])/denomitor)
00356             ytotal[label]=sum(lumivals)/denomitor
00357         xpoints=[matplotlib.dates.date2num(t[1]) for t in rawdata[referenceLabel]]
00358         ax=self.__fig.add_subplot(111)
00359         ax.set_yscale(yscale)
00360         yearStrMin=minTime.strftime('%Y')
00361         yearStrMax=maxTime.strftime('%Y')
00362         if yearStrMin==yearStrMax:
00363             dateFmt=matplotlib.dates.DateFormatter('%d/%m')
00364         else:
00365             dateFmt=matplotlib.dates.DateFormatter('%d/%m/%y')
00366         majorLoc=matplotlib.ticker.LinearLocator(numticks=nticks)
00367         ax.xaxis.set_major_locator(majorLoc)
00368         minorLoc=matplotlib.ticker.LinearLocator(numticks=nticks*4)
00369         ax.xaxis.set_major_formatter(dateFmt)
00370         ax.set_xlabel(r'Date',position=(0.84,0))
00371         ax.set_ylabel(r'L '+unitstring,position=(0,0.9))
00372         ax.xaxis.set_minor_locator(minorLoc)
00373         ax.set_xbound(lower=xpoints[0],upper=xpoints[-1])
00374         xticklabels=ax.get_xticklabels()
00375         for tx in xticklabels:
00376             tx.set_horizontalalignment('left')
00377         ax.grid(True)
00378         keylist=ypoints.keys()
00379         keylist.sort()
00380         keylist.insert(0,keylist.pop(keylist.index(referenceLabel)))#move refereceLabel to front from now on
00381         legendlist=[]
00382         head=['#Run','StartTime','StopTime']
00383         textsummaryhead=['#TotalRun']
00384         textsummaryline=['#'+str(len(xpoints))]
00385         for ylabel in keylist:
00386             cl='k'
00387             if self.colormap.has_key(ylabel):
00388                 cl=self.colormap[ylabel]
00389             ax.plot(xpoints,ypoints[ylabel],label=ylabel,color=cl,drawstyle='steps')
00390             legendlist.append(ylabel+' '+'%.3f'%(ytotal[ylabel])+' '+unitstring)
00391             textsummaryhead.append('Total'+ylabel)
00392             textsummaryline.append('%.3f'%(ytotal[ylabel])+' '+unitstring)
00393             head.append(ylabel)
00394         if textoutput:
00395             csvreport=csvReporter.csvReporter(textoutput)
00396             csvreport.writeRow(head)
00397             allruns=[int(t[0]) for t in rawdata[referenceLabel]]
00398             allstarts=[ lut.DatetimeToStr(t[1],customfm='%Y-%m-%d %H:%M:%S') for t in rawdata[referenceLabel] ]
00399             allstops=[ lut.DatetimeToStr(t[2],customfm='%Y-%m-%d %H:%M:%S') for t in rawdata[referenceLabel] ]
00400             flat.insert(0,allruns)
00401             flat.insert(1,allstarts)
00402             flat.insert(2,allstops)
00403             rows=zip(*flat)
00404             csvreport.writeRows([list(t) for t in rows])
00405             csvreport.writeRow(textsummaryhead)
00406             csvreport.writeRow(textsummaryline)
00407         #annotations
00408         trans=matplotlib.transforms.BlendedGenericTransform(ax.transData,ax.transAxes)
00409         #print 'run boundary ',runs[0],runs[-1]
00410         #print 'xpoints boundary ',xpoints[0],xpoints[-1]
00411         #annotation
00412         if withannotation:
00413             runs=[t[0] for t in rawdata[referenceLabel]]
00414             ax.text(xpoints[0],1.025,str(runs[0]),transform=trans,horizontalalignment='left',size='x-small',color='green',bbox=dict(facecolor='white'))        
00415             ax.text(xpoints[-1],1.025,str(runs[-1]),transform=trans,horizontalalignment='left',size='x-small',color='green',bbox=dict(facecolor='white'))
00416         
00417         if yearStrMin==yearStrMax:
00418             firsttimeStr=rawdata[referenceLabel][1][1].strftime('%b %d %H:%M') #time range(start) in the title is the first run beg time 
00419             lasttimeStr=rawdata[referenceLabel][-1][2].strftime('%b %d %H:%M') #time range(stop) in the tile is the last run stop time
00420             #firstimeStr=minTime.strftime('%b %d %H:%M')
00421             #lasttimeStr=maxTime.strftime('%b %d %H:%M')
00422             #ax.set_title('CMS Total Integrated Luminosity '+yearStrMin+' ('+firstimeStr+' - '+lasttimeStr+' UTC)',size='small',family='fantasy')
00423             ax.set_title('CMS Total Integrated Luminosity '+yearStrMin+' ('+firsttimeStr+' - '+lasttimeStr+' UTC)',size='small')
00424         else:
00425             #ax.set_title('CMS Total Integrated Luminosity '+yearStrMin+'-'+yearStrMax,size='small',family='fantasy')
00426             ax.set_title('CMS Total Integrated Luminosity '+yearStrMin+'-'+yearStrMax,size='small')
00427         ax.legend(tuple(legendlist),loc='upper left')
00428         ax.autoscale_view(tight=True,scalex=True,scaley=False)
00429         self.__fig.autofmt_xdate(bottom=0.18,rotation=15,ha='right')
00430         self.__fig.subplots_adjust(bottom=0.2,left=0.15)
00431         
00432     def plotPerdayX_Time(self,rawdata={},resultlines=[],minTime=None,maxTime=None,nticks=6,yscale='linear',withannotation=False,referenceLabel='Delivered',labels=['Delivered','Recorded'],textoutput=None):
00433         '''
00434         Input:
00435         rawdata={'Delivered':[(day,begrun:ls,endrun:ls,lumi)],'Recorded':[(dayofyear,begrun:ls,endrun:ls,lumi)]}
00436         resultlines=[[day,begrun:ls,endrun:ls,deliveredperday,recordedperday],[]]
00437         minTime (python DateTime) : min *begin* time to draw: format %m/%d/%y %H:%M:%S
00438         maxTime (python DateTime): max *begin* time to draw %m/%d/%y %H:%M:%S
00439         withannotation: wheather the boundary points should be annotated
00440         referenceLabel: the one variable that decides the total unit and the plot x-axis range
00441         labels: labels of the variables to plot
00442         '''
00443         xpoints=[]
00444         ypoints={}
00445         ymax={}
00446         lut=lumiTime.lumiTime()
00447         if not minTime:
00448             minTime='03/01/10 00:00:00'
00449         minTime=lut.StrToDatetime(minTime,customfm='%m/%d/%y %H:%M:%S')
00450         if not maxTime:
00451             maxTime=datetime.datetime.utcnow()
00452         else:
00453             maxTime=lut.StrToDatetime(maxTime,customfm='%m/%d/%y %H:%M:%S')
00454         for r in resultlines:
00455             day=int(r[0])
00456             begrunls=r[1]
00457             endrunls=r[2]
00458             #[begrun,begls]=[int(s) for s in r[1].split(':')]
00459             if rawdata and day in [t[0] for t in rawdata[referenceLabel]]:continue
00460             if day < minTime.date().toordinal():continue
00461             if day > maxTime.date().toordinal():continue
00462             for i,lab in enumerate(labels):
00463                 v=float(r[-(len(labels)-i)-1])
00464                 rawdata.setdefault(lab,[]).append((day,begrunls,endrunls,v))
00465         if not rawdata:
00466             print '[WARNING]: no data, do nothing'
00467             return
00468         maxlum=max([t[3] for t in rawdata[referenceLabel]])
00469         minlum=min([t[3] for t in rawdata[referenceLabel] if t[3]>0]) #used only for log scale, fin the non-zero bottom
00470         (unitstring,denomitor)=guessLumiUnit(maxlum)
00471         csvreport=None
00472         rows=[]
00473         flat=[]
00474         MinDay=minTime.date().toordinal()
00475         MaxDay=maxTime.date().toordinal()
00476         fulldays=range(MinDay,MaxDay+1)
00477         allstarts=[]
00478         allstops=[]
00479         for label,yvalues in rawdata.items():
00480             yvalues.sort()
00481             flat.append([t[3] for t in yvalues])
00482             alldays=[t[0] for t in yvalues]
00483             alldates=[str(datetime.date.fromordinal(t)) for t in alldays]
00484             ypoints[label]=[]
00485             lumivals=[t[3] for t in yvalues]
00486             for d in fulldays:
00487                 if not d in alldays:
00488                     ypoints[label].append(0.0)
00489                 else:
00490                     thisdaylumi=[t[3] for t in yvalues if t[0]==d][0]
00491                     if yscale=='log':
00492                         if thisdaylumi<minlum:
00493                             thisdaylumi=minlum/denomitor
00494                         else:
00495                             thisdaylumi=thisdaylumi/denomitor
00496                     else:
00497                          thisdaylumi=thisdaylumi/denomitor
00498                     ypoints[label].append(thisdaylumi)
00499                 ymax[label]=max(lumivals)/denomitor
00500         xpoints=fulldays
00501         if textoutput:
00502             csvreport=csvReporter.csvReporter(textoutput)
00503             head=['#day','begrunls','endrunls','delivered','recorded','date']
00504             csvreport.writeRow(head)
00505             flat.insert(0,alldays)
00506             allstarts=[ t[1] for t in rawdata[referenceLabel]]
00507             allstops=[ t[2] for t in rawdata[referenceLabel]]
00508             #print 'allstarts ',allstarts
00509             flat.insert(1,allstarts)
00510             flat.insert(2,allstops)
00511             flat.append(alldates)
00512             rows=zip(*flat)
00513             csvreport.writeRows([list(t) for t in rows])
00514         yearStrMin=minTime.strftime('%Y')
00515         yearStrMax=maxTime.strftime('%Y')
00516         if yearStrMin==yearStrMax:
00517             dateFmt=matplotlib.dates.DateFormatter('%d/%m')
00518         else:
00519             dateFmt=matplotlib.dates.DateFormatter('%d/%m/%y')
00520         ax=self.__fig.add_subplot(111)     
00521         if yscale=='linear':
00522             ax.set_yscale('linear')
00523         elif yscale=='log':
00524             ax.set_yscale('log')
00525         else:
00526             raise 'unsupported yscale ',yscale        
00527         majorLoc=matplotlib.ticker.LinearLocator(numticks=nticks)
00528         minorLoc=matplotlib.ticker.LinearLocator(numticks=nticks*4)
00529         ax.xaxis.set_major_formatter(dateFmt)
00530         ax.set_xlabel(r'Date',position=(0.84,0))
00531         ax.xaxis.set_major_locator(majorLoc)
00532         ax.xaxis.set_minor_locator(minorLoc)
00533         xticklabels=ax.get_xticklabels()
00534         for tx in xticklabels:
00535             tx.set_horizontalalignment('right')
00536         ax.grid(True)
00537         legendlist=[]
00538         ax.set_ylabel(r'L '+unitstring,position=(0,0.9))
00539         textsummaryhead=['#TotalRunningDays']
00540         textsummaryline=['#'+str(len(alldays))]
00541         for ylabel in labels:
00542             cl='k'
00543             if self.colormap.has_key(ylabel):
00544                 cl=self.colormap[ylabel]
00545             ax.plot(xpoints,ypoints[ylabel],label=ylabel,color=cl,drawstyle='steps')
00546             legendlist.append(ylabel+' Max '+'%.3f'%(ymax[ylabel])+' '+unitstring)
00547             textsummaryhead.append('Max'+ylabel)
00548             textsummaryline.append('%.3f'%(ymax[ylabel])+' '+unitstring)
00549         if textoutput:
00550             csvreport.writeRow(textsummaryhead)
00551             csvreport.writeRow(textsummaryline)
00552         ax.legend(tuple(legendlist),loc='upper left')
00553         ax.set_xbound(lower=matplotlib.dates.date2num(minTime),upper=matplotlib.dates.date2num(maxTime))
00554         #if withannotation:
00555         #        begtime=boundaryInfo[0][0]
00556         #        beginfo=boundaryInfo[0][1]
00557         #        endtime=boundaryInfo[1][0]
00558         #        endinfo=boundaryInfo[1][1]
00559         #        #annotations
00560         #        trans=matplotlib.transforms.BlendedGenericTransform(ax.transData,ax.transAxes)
00561         #        ax.text(matplotlib.dates.date2num(begtime),1.025,beginfo,transform=trans,horizontalalignment='left',size='x-small',color='green',bbox=dict(facecolor='white'))        
00562         #        ax.text(matplotlib.dates.date2num(endtime),1.025,endinfo,transform=trans,horizontalalignment='left',size='x-small',color='green',bbox=dict(facecolor='white'))
00563         
00564         firstday=datetime.date.fromordinal(rawdata[referenceLabel][0][0])
00565         lastday=datetime.date.fromordinal(rawdata[referenceLabel][-1][0])
00566         firstdayStr=firstday.strftime('%Y %b %d')
00567         lastdayStr=lastday.strftime('%Y %b %d')
00568         ax.set_title('CMS Integrated Luminosity/Day ('+firstdayStr+' - '+lastdayStr+')',size='small')
00569         #ax.autoscale(tight=True)
00570         ax.autoscale_view(tight=True,scalex=True,scaley=False)
00571         #ax.set_xmargin(0.015)
00572         self.__fig.autofmt_xdate(bottom=0.18,rotation=15,ha='right')
00573         self.__fig.subplots_adjust(bottom=0.2,left=0.15)
00574 
00575     def plotPeakPerday_Time(self,rawdata={},resultlines=[],minTime=None,maxTime=None,nticks=6,withannotation=False,yscale='linear',referenceLabel='Delivered',labels=['Delivered'],textoutput=None):
00576         '''
00577         THIS PLOT IS DELIVERED ONLY
00578         Input:
00579         rawdata={'Delivered':[(day,run,ls,instlumi)]}
00580         resultlines=[[day,run,ls,maxinstlum],[]]
00581         minTime (python DateTime) : min *begin* time to draw: format %m/%d/%y %H:%M:%S
00582         maxTime (python DateTime): max *begin* time to draw %m/%d/%y %H:%M:%S
00583         withannotation: wheather the boundary points should be annotated
00584         referenceLabel: the one variable that decides the total unit and the plot x-axis range
00585         labels: labels of the variables to plot
00586         '''
00587         xpoints=[]
00588         ypoints={}
00589         legendlist=[]
00590         maxinfo=''
00591         ymax={}
00592         lut=lumiTime.lumiTime()
00593         if not minTime:
00594             minTime='03/01/10 00:00:00'
00595         minTime=lut.StrToDatetime(minTime,customfm='%m/%d/%y %H:%M:%S')
00596         if not maxTime:
00597             maxTime=datetime.datetime.utcnow()
00598         else:
00599             maxTime=lut.StrToDatetime(maxTime,customfm='%m/%d/%y %H:%M:%S')
00600         for r in resultlines:
00601             day=int(r[0])
00602             runnumber=int(r[1])
00603             lsnum=int(r[2].split('.')[0])
00604             if rawdata and day in [int(t[0]) for t in rawdata[referenceLabel]]:continue
00605             if day < minTime.date().toordinal():continue
00606             if day > maxTime.date().toordinal():continue
00607             for i,lab in enumerate(labels):
00608                 v=float(r[-(len(labels)-i)-1])
00609                 rawdata.setdefault(lab,[]).append((day,runnumber,lsnum,v))
00610         if not rawdata:
00611             print '[WARNING]: no data, do nothing'
00612             return
00613         maxlum=max([t[3] for t in rawdata[referenceLabel]])
00614         minlum=min([t[3] for t in rawdata[referenceLabel] if t[3]>0]) #used only for log scale, fin the non-zero bottom
00615         (unitstring,denomitor)=guessInstLumiUnit(maxlum)
00616         
00617         csvreport=None
00618         rows=[]
00619         flat=[]
00620         MinDay=minTime.date().toordinal()
00621         MaxDay=maxTime.date().toordinal()
00622         fulldays=range(MinDay,MaxDay+1)
00623         for label in rawdata.keys():
00624             yvalues=rawdata[label]
00625             yvalues.sort()#sort by day
00626             alldays=[t[0] for t in yvalues]
00627             alldates=[str(datetime.date.fromordinal(t)) for t in alldays]
00628             ypoints[label]=[]
00629             lumivals=[t[3] for t in yvalues]
00630             flat.append(lumivals)
00631             for d in fulldays:
00632                 if not d in alldays:
00633                     ypoints[label].append(0.0)
00634                 else:
00635                     thisdaylumi=[t[3] for t in yvalues if t[0]==d][0]
00636                     if yscale=='log':
00637                         if thisdaylumi<minlum:
00638                             thisdaylumi=minlum/denomitor
00639                         else:
00640                             thisdaylumi=thisdaylumi/denomitor
00641                     else:
00642                         thisdaylumi=thisdaylumi/denomitor
00643                     ypoints[label].append(thisdaylumi)
00644             ymax[label]=max(lumivals)/denomitor
00645             'ymax ',max(lumivals)
00646         xpoints=fulldays
00647         if textoutput:
00648             csvreport=csvReporter.csvReporter(textoutput)
00649             head=['#day','run','lsnum','maxinstlumi','date']
00650             csvreport.writeRow(head)
00651             flat.insert(0,alldays)
00652             allruns=[ t[1] for t in rawdata[referenceLabel]]
00653             allls=[ t[2] for t in rawdata[referenceLabel]]
00654             flat.insert(1,allruns)
00655             flat.insert(2,allls)
00656             flat.append(alldates)
00657             rows=zip(*flat)
00658             csvreport.writeRows([list(t) for t in rows])
00659             
00660         yearStrMin=minTime.strftime('%Y')
00661         yearStrMax=maxTime.strftime('%Y')
00662         if yearStrMin==yearStrMax:
00663             dateFmt=matplotlib.dates.DateFormatter('%d/%m')
00664         else:
00665             dateFmt=matplotlib.dates.DateFormatter('%d/%m/%y')
00666         ax=self.__fig.add_subplot(111)
00667         if yscale=='linear':
00668             ax.set_yscale('linear')
00669         elif yscale=='log':
00670             ax.set_yscale('log')
00671         else:
00672             raise 'unsupported yscale ',yscale
00673         majorLoc=matplotlib.ticker.LinearLocator(numticks=nticks)
00674         minorLoc=matplotlib.ticker.LinearLocator(numticks=nticks*4)
00675         ax.xaxis.set_major_formatter(dateFmt)
00676         ax.set_xlabel(r'Date',position=(0.84,0))
00677         ax.set_ylabel(r'L '+unitstring,position=(0,0.9))
00678         ax.xaxis.set_major_locator(majorLoc)
00679         ax.xaxis.set_minor_locator(minorLoc)
00680         xticklabels=ax.get_xticklabels()
00681         for tx in xticklabels:
00682             tx.set_horizontalalignment('right')
00683         ax.grid(True)
00684         cl=self.colormap['Max Inst']
00685         textsummaryhead=['#TotalRunningDays']
00686         textsummaryline=['#'+str(len(alldays))]
00687         for ylabel in labels:
00688             cl='k'
00689             if self.colormap.has_key(ylabel):
00690                 cl=self.colormap[ylabel]
00691             ax.plot(xpoints,ypoints[ylabel],label='Max Inst',color=cl,drawstyle='steps')
00692             legendlist.append('Max Inst %.3f'%(ymax[ylabel])+' '+unitstring)
00693             textsummaryhead.append('Max Inst'+ylabel)
00694             textsummaryline.append('%.3f'%(ymax[ylabel])+' '+unitstring)
00695         if textoutput:
00696             csvreport.writeRow(textsummaryhead)
00697             csvreport.writeRow(textsummaryline)
00698         ax.legend(tuple(legendlist),loc='upper left')
00699         ax.set_xbound(lower=matplotlib.dates.date2num(minTime),upper=matplotlib.dates.date2num(maxTime))
00700         if withannotation:
00701            #annotations
00702            trans=matplotlib.transforms.BlendedGenericTransform(ax.transData,ax.transAxes)
00703            ax.text(xpoints[0],1.025,beginfo,transform=trans,horizontalalignment='left',size='x-small',color='green',bbox=dict(facecolor='white'))
00704            ax.text(xpoints[-1],1.025,endinfo,transform=trans,horizontalalignment='left',size='x-small',color='green',bbox=dict(facecolor='white'))
00705            ax.annotate(maxinfo,xy=(xmax,ymax),xycoords='data',xytext=(0,13),textcoords='offset points',arrowprops=dict(facecolor='green',shrink=0.05),size='x-small',horizontalalignment='center',color='green',bbox=dict(facecolor='white'))
00706            
00707         firstday=datetime.date.fromordinal(rawdata[referenceLabel][0][0])
00708         lastday=datetime.date.fromordinal(rawdata[referenceLabel][-1][0])
00709         firstdayStr=firstday.strftime('%Y %b %d')
00710         lastdayStr=lastday.strftime('%Y %b %d')
00711         ax.set_title('CMS Peak Luminosity/Day ('+firstdayStr+' - '+lastdayStr+')',size='small')
00712 
00713         #ax.autoscale(tight=True)
00714         ax.autoscale_view(tight=True,scalex=True,scaley=False)        
00715         #ax.set_xmargin(0.015)
00716         self.__fig.autofmt_xdate(bottom=0.18,rotation=15,ha='right')
00717         self.__fig.subplots_adjust(bottom=0.2,left=0.15)
00718 
00719     def plotInst_RunLS(self,rawxdata,rawydata,nticks=6,textoutput=None):
00720         '''
00721         Input: rawxdata [run,fill,starttime,stoptime,totalls,ncmsls]
00722                rawydata {label:[lumi]}
00723         '''
00724         lslength=23.357
00725         lut=lumiTime.lumiTime()
00726         runnum=rawxdata[0]
00727         fill=rawxdata[1]
00728         starttime=lut.DatetimeToStr(rawxdata[2],customfm='%m/%d/%y %H:%M:%S')
00729         stoptime=lut.DatetimeToStr(rawxdata[3],customfm='%m/%d/%y %H:%M:%S')
00730         totalls=rawxdata[-2]
00731         ncmsls=rawxdata[-1]
00732         peakinst=max(rawydata['Delivered'])/lslength
00733         totaldelivered=sum(rawydata['Delivered'])
00734         totalrecorded=sum(rawydata['Recorded'])
00735         xpoints=range(1,totalls+1)        
00736         #print len(xpoints)
00737         ypoints={}
00738         ymax={}
00739         for ylabel,yvalue in rawydata.items():
00740             ypoints[ylabel]=[y/lslength for y in yvalue]
00741             ymax[ylabel]=max(yvalue)/lslength
00742         left=0.15
00743         width=0.7
00744         bottom=0.1
00745         height=0.65
00746         bottom_h=bottom+height
00747         rect_scatter=[left,bottom,width,height]
00748         rect_table=[left,bottom_h,width,0.25]
00749         
00750         nullfmt=matplotlib.ticker.NullFormatter()
00751         nullloc=matplotlib.ticker.NullLocator()
00752         axtab=self.__fig.add_axes(rect_table,frameon=False)
00753         axtab.set_axis_off()
00754         axtab.xaxis.set_major_formatter(nullfmt)
00755         axtab.yaxis.set_major_formatter(nullfmt)
00756         axtab.xaxis.set_major_locator(nullloc)
00757         axtab.yaxis.set_major_locator(nullloc)
00758 
00759         ax=self.__fig.add_axes(rect_scatter)
00760         
00761         majorLoc=matplotlib.ticker.LinearLocator(numticks=nticks)
00762         minorLoc=matplotlib.ticker.LinearLocator(numticks=nticks*4)
00763         ax.set_xlabel(r'LS',position=(0.96,0))
00764         ax.set_ylabel(r'L $\mu$b$^{-1}$s$^{-1}$',position=(0,0.9))
00765         ax.xaxis.set_major_locator(majorLoc)
00766         ax.xaxis.set_minor_locator(minorLoc)
00767         ax.set_xbound(lower=xpoints[0],upper=xpoints[-1])
00768         xticklabels=ax.get_xticklabels()
00769         for tx in xticklabels:
00770             tx.set_horizontalalignment('right')
00771         ax.grid(True)
00772         keylist=ypoints.keys()
00773         keylist.sort()
00774         legendlist=[]
00775 
00776         for ylabel in keylist:
00777             cl='k'
00778             if self.colormap.has_key(ylabel):
00779                 cl=self.colormap[ylabel]
00780             ax.plot(xpoints,ypoints[ylabel],'.',label=ylabel,color=cl)
00781             legendlist.append(ylabel)      
00782         #ax.axhline(0,color='green',linewidth=0.2)
00783         ax.axvline(xpoints[ncmsls-1],color='green',linewidth=0.2)
00784         (unitstring,denomitor)=guessLumiUnit(totaldelivered)
00785         colLabels=('run','fill','max inst(/$\mu$b/s)','delivered('+unitstring+')','recorded('+unitstring+')')
00786         cellText=[[str(runnum),str(fill),'%.3f'%(peakinst),'%.3f'%(totaldelivered/denomitor),'%.3f'%(totalrecorded/denomitor)]]
00787        
00788         sumtable=axtab.table(cellText=cellText,colLabels=colLabels,colWidths=[0.12,0.1,0.27,0.27,0.27],cellLoc='center',loc='center')
00789         trans=matplotlib.transforms.BlendedGenericTransform(ax.transData,ax.transAxes)        
00790         axtab.add_table(sumtable)
00791         
00792         ax.text(xpoints[0],1.02,starttime[0:17],transform=trans,horizontalalignment='left',size='x-small',color='green',bbox=dict(facecolor='white'))   
00793         ax.text(xpoints[ncmsls-1],1.02,stoptime[0:17],transform=trans,horizontalalignment='left',size='x-small',color='green',bbox=dict(facecolor='white'))        
00794         ax.legend(tuple(legendlist),loc='upper right',numpoints=1)
00795 
00796     def drawHTTPstring(self):
00797         self.__canvas=CanvasBackend(self.__fig)    
00798         cherrypy.response.headers['Content-Type']='image/png'
00799         buf=StringIO()
00800         self.__canvas.print_png(buf)
00801         return buf.getvalue()
00802     
00803     def drawPNG(self,filename):
00804         self.__canvas=CanvasBackend(self.__fig)    
00805         self.__canvas.print_figure(filename)
00806     
00807     def drawInteractive(self):
00808         if batchonly:
00809             print 'interactive mode is not available for your setup, exit'
00810             sys.exit()
00811         aw=lumiQTWidget.ApplicationWindow(fig=self.__fig)
00812         aw.show()
00813         aw.destroy()
00814         
00815 if __name__=='__main__':
00816     import csv
00817     print '=====testing plotSumX_Run======'
00818     f=open('/afs/cern.ch/cms/lumi/www/plots/operation/totallumivsrun-2011.csv','r')
00819     reader=csv.reader(f,delimiter=',')
00820     resultlines=[]
00821     for row in reader:
00822         if not row[0].isdigit():continue
00823         resultlines.append(row)
00824     #print resultlines
00825     fig=Figure(figsize=(7.2,5.4),dpi=120)
00826     m=matplotRender(fig)
00827     m.plotSumX_Run(rawdata={},resultlines=resultlines,minRun=None,maxRun=None,nticks=6,yscale='linear',withannotation=False)
00828     #m.drawPNG('totallumivsrun-2011test.png')
00829     m.drawInteractive()
00830     print 'DONE'
00831     
00832 '''
00833     print '=====testing plotSumX_Fill======'
00834     f=open('/afs/cern.ch/cms/lumi/www/plots/operation/totallumivsfill-2011.csv','r')
00835     reader=csv.reader(f,delimiter=',')
00836     resultlines=[]
00837     for row in reader:
00838         if not row[0].isdigit():continue
00839         resultlines.append(row)
00840     #print resultlines
00841     fig=Figure(figsize=(7.2,5.4),dpi=120)
00842     m=matplotRender(fig)
00843     m.plotSumX_Fill(rawdata={},resultlines=resultlines,minFill=None,maxFill=None,nticks=6,yscale='linear',withannotation=True)
00844     m.drawPNG('totallumivsfill-2011test.png')
00845     print 'DONE'
00846     print '=====testing plotSumX_Time======'
00847     f=open('/afs/cern.ch/cms/lumi/www/publicplots/totallumivstime-2011.csv','r')
00848     reader=csv.reader(f,delimiter=',')
00849     resultlines=[]
00850     for row in reader:
00851         if not row[0].isdigit():continue
00852         resultlines.append(row)
00853     #print resultlines
00854     fig=Figure(figsize=(7.25,5.4),dpi=120)
00855     m=matplotRender(fig)
00856     m.plotSumX_Time(rawdata={},resultlines=resultlines,minTime="03/14/11 09:00:00",maxTime=None,nticks=6,yscale='linear',withannotation=False)
00857     m.drawPNG('totallumivstime-2011test.png')
00858     print 'DONE'
00859     
00860     print '=====testing plotPerdayX_Time======'
00861     f=open('/afs/cern.ch/cms/lumi/www/publicplots/lumiperday-2011.csv','r')
00862     reader=csv.reader(f,delimiter=',')
00863     resultlines=[]
00864     for row in reader:
00865         if not row[0].isdigit():continue
00866         resultlines.append(row)
00867     #print resultlines
00868     fig=Figure(figsize=(7.25,5.4),dpi=120)
00869     m=matplotRender(fig)
00870     m.plotPerdayX_Time(rawdata={},resultlines=resultlines,minTime="03/14/11 09:00:00",maxTime=None,nticks=6,yscale='linear',withannotation=False)
00871     m.drawPNG('lumiperday-2011test.png')
00872     print 'DONE'
00873 
00874     print '=====testing plotPeakPerday_Time======'
00875     f=open('/afs/cern.ch/cms/lumi/www/publicplots/lumipeak-2011.csv','r')
00876     reader=csv.reader(f,delimiter=',')
00877     resultlines=[]
00878     for row in reader:
00879         if not row[0].isdigit():continue
00880         resultlines.append(row)
00881     #print resultlines
00882     fig=Figure(figsize=(7.25,5.4),dpi=120)
00883     m=matplotRender(fig)
00884     m.plotPeakPerday_Time(rawdata={},resultlines=resultlines,minTime="03/14/11 09:00:00",maxTime=None,nticks=6,yscale='linear',withannotation=False)
00885     m.drawPNG('lumipeak-2011test.png')
00886     print 'DONE'
00887     
00888 '''