00001 #!/usr/local/bin/python 00002 # 00003 # Copyright 2004 00004 # by 00005 # The Board of Trustees of the 00006 # Leland Stanford Junior University. 00007 # All rights reserved. 00008 # 00009 00010 00011 __facility__ = "Trigger" 00012 __abstract__ = "Histogram for trigger display" 00013 __author__ = "Martin Kocian, SLAC" 00014 __date__ = ("$Date: 2005/06/15 23:42:30 $").split(' ')[1] 00015 __version__ = "$Revision: 2.3 $" 00016 __release__ = "$Name: R04-12-00 $" 00017 __credits__ = "SLAC" 00018 00019 from qt import * 00020 import sys 00021 from math import * 00022 BORDERSIZE=10 00023 MARGINLEFT=15 00024 MARGINLOW=25 00025 NTICKMIN=10 00026 NTICKMAX=50 00027 00028 class doublehisto(QWidget): 00029 def __init__(self,parent=None,name=None,fl=0): 00030 QWidget.__init__(self,parent,name,fl) 00031 self.__firstsetup=True 00032 if not name: 00033 self.setName("doublehisto") 00034 self.clearWState(Qt.WState_Polished) 00035 def setup(self,nbins,lower,upper,logx,logy): 00036 self.__nbins=nbins 00037 self.__lower=float(lower) 00038 self.__upper=float(upper) 00039 self.__nhist=0 00040 self.__logx=logx 00041 self.__logy=logy 00042 self.__scale=1. 00043 self.__scalehaschanged=True 00044 self.fontsize=8 00045 self.bds=BORDERSIZE 00046 self.labelboxx=.05 00047 self.labelboxy=.04 00048 self.boxwidth=0.5 00049 if self.__logy==False: 00050 self.__scalelow=0. 00051 else: 00052 self.__scalelow=0.5 00053 self.__histtitle0="Hist 0" 00054 self.__histtitle1="Hist 1" 00055 self.__marginleft=MARGINLEFT 00056 self.__marginlow=MARGINLOW 00057 self.__ticksx=self.computeticks(self.__lower,self.__upper,self.__logx) 00058 self.__ticksy=self.computeticks(self.__scalelow,self.__scale,self.__logy) 00059 if self.__firstsetup==False: 00060 for it in self.__xlabels: it.deleteLater() 00061 for it in self.__ylabels: it.deleteLater() 00062 self.xaxislabel.deleteLater() 00063 self.__firstsetup=False 00064 self.__xlabels=self.makelabels(self.__ticksx[0],self.__logx,QLabel.AlignTop|QLabel.AlignHCenter) 00065 self.__ylabels=self.makelabels(self.__ticksy[0],self.__logy,QLabel.AlignVCenter|QLabel.AlignRight) 00066 self.xaxislabel=QLabel(self,"xaxis") 00067 font=QFont(self.xaxislabel.font()) 00068 font.setPointSize(self.fontsize) 00069 self.xaxislabel.setFont(font) 00070 self.xaxislabel.setPaletteBackgroundColor(QColor("white")) 00071 self.xaxislabel.setAlignment(QLabel.AlignVCenter|QLabel.AlignRight) 00072 self.histolabel=[] 00073 self.__contents=[] 00074 self.style=[] 00075 self.color=[] 00076 self.uselabel=[] 00077 self.showhisto=[] 00078 self.histoname=[] 00079 self.setBinBoundaries() 00080 def addHisto(self,name="histo",color="black",style=0,uselabel=0,showhis=1): 00081 self.histoname.append(name) 00082 self.uselabel.append(uselabel) 00083 self.showhisto.append(showhis) 00084 self.color.append(color) 00085 self.style.append(style) 00086 self.histolabel.append(QLabel(self,"histo_%d"%self.__nhist)) 00087 font=QFont(self.histolabel[-1].font()) 00088 font.setPointSize(self.fontsize) 00089 self.histolabel[-1].setFont(font) 00090 self.histolabel[-1].setPaletteBackgroundColor(QColor("white")) 00091 self.histolabel[-1].setAlignment(QLabel.AlignVCenter|QLabel.AlignLeft) 00092 self.__contents.append([]) 00093 for i in range(self.__nbins): 00094 self.__contents[self.__nhist].append(0.) 00095 self.__nhist+=1 00096 self.drawLabels() 00097 def find(self,name): 00098 try: 00099 ind=self.histoname.index(name) 00100 except: 00101 ind=-1 00102 return ind 00103 def setHistoLabel(self,name,lab): 00104 ind=self.histoname.index(name) 00105 self.histolabel[ind].setText(lab) 00106 def hideHisto(self,name): 00107 ind=self.histoname.index(name) 00108 self.showhisto[ind]=0 00109 newmax=1. 00110 for i in range(self.__nhist): 00111 if self.showhisto[i]==1: 00112 newmax=max(newmax,max(self.__contents[i])) 00113 if newmax<max(self.__contents[ind]): 00114 self.__scale=newmax*1.25 00115 self.__scalehaschanged=True 00116 self.updateHisto() 00117 self.drawLabels() 00118 def showHisto(self,name): 00119 ind=self.histoname.index(name) 00120 self.showhisto[ind]=1 00121 if max(self.__contents[ind])>self.__scale*.95: 00122 self.__scale=max(self.__contents[ind])*1.25 00123 self.__scalehaschanged=True 00124 self.updateHisto() 00125 self.drawLabels() 00126 def removeHisto(self,name): 00127 ind=self.histoname.index(name) 00128 newmax=1. 00129 for i in range(self.__nhist): 00130 if self.showhisto[i]==1: 00131 newmax=max(newmax,max(self.__contents[i])) 00132 if newmax<max(self.__contents[ind]): 00133 self.__scale=newmax*1.25 00134 self.__scalehaschanged=True 00135 self.__contents.pop(ind) 00136 self.histoname.pop(ind) 00137 self.uselabel.pop(ind) 00138 self.showhisto.pop(ind) 00139 self.color.pop(ind) 00140 self.style.pop(ind) 00141 self.histolabel.pop(ind).deleteLater() 00142 self.__nhist-=1 00143 self.updateHisto() 00144 self.drawLabels() 00145 def removeAllHistos(self): 00146 self.__contents=[] 00147 self.histoname=[] 00148 self.uselabel=[] 00149 self.showhisto=[] 00150 self.color=[] 00151 self.style=[] 00152 for i in self.histolabel:i.deleteLater() 00153 self.histolabel=[] 00154 self.__nhist=0 00155 self.updateHisto() 00156 self.drawLabels() 00157 self.__scale==1. 00158 def setBinBoundaries(self): 00159 self.__binboundary=[] 00160 for i in range (self.__nbins): 00161 if self.__logx: 00162 self.__binboundary.append(pow(10,(log10(self.__upper)-log10(self.__lower))/self.__nbins*i+log10(self.__lower))) 00163 else: 00164 self.__binboundary.append((self.__upper-self.__lower)/self.__nbins*(i)+self.__lower) 00165 00166 def resetHisto(self,number): 00167 for i in range(self.__nbins): 00168 self.__contents[number][i]=0. 00169 def resetAllHistos(self): 00170 for i in range (self.__nhist): 00171 self.resetHisto(i) 00172 self.__scale=1. 00173 00174 def setLogy(self, on): 00175 self.__logy=on 00176 if on: 00177 self.__marginleft=MARGINLEFT 00178 self.__scalelow=0.5 00179 else: self.__scalelow=0. 00180 self.__scalehaschanged=True 00181 self.updateHisto() 00182 00183 def makelabels(self,ticks,logs,alignment): 00184 labels=[] 00185 for tick in ticks: 00186 labels.append(QLabel(self,"tick_%d"%tick)) 00187 font=QFont(labels[-1].font()) 00188 font.setPointSize(self.fontsize) 00189 labels[-1].setFont(font) 00190 if logs==True: 00191 if floor(log10(tick)+.1)==0:labels[-1].setText("<b>1<sup> ") 00192 elif int(log10(tick)+.1)==1:labels[-1].setText("<b>10<sup> ") 00193 else: labels[-1].setText("<b>10<sup>%d"% floor(log10(tick)+.1)) 00194 else: 00195 if remainder(tick)<1e-5 or tick==0: 00196 labels[-1].setText("<b>%d"%tick) 00197 else: 00198 labels[-1].setText("<b>"+str(tick)) 00199 labels[-1].setPaletteBackgroundColor(QColor("white")) 00200 labels[-1].setAlignment(alignment) 00201 return labels 00202 def fill(self,name,xval,weight=1.): 00203 hist=self.histoname.index(name) 00204 if hist>=self.__nhist or xval>self.__upper:return 00205 for i in range(self.__nbins-1,-1,-1): 00206 if xval>self.__binboundary[i]: 00207 self.__contents[hist][i]+=weight 00208 if self.__contents[hist][i]>self.__scale*.95 and self.showhisto[hist]==1: 00209 self.__scale=self.__contents[hist][i]*1.25 00210 self.__scalehaschanged=True 00211 break 00212 def setBinContent(self,name,i,w): 00213 hist=self.histoname.index(name) 00214 self.__contents[hist][i]=w 00215 if self.__contents[hist][i]>self.__scale*.95 and self.showhisto[hist]==1: 00216 self.__scale=self.__contents[hist][i]*1.25 00217 self.__scalehaschanged=True 00218 def resetlin(self): 00219 newaxis=False 00220 if self.__logx==True: 00221 newaxis=True 00222 self.__logx=False 00223 self.resetxaxis(newaxis) 00224 def resetlog(self): 00225 newaxis=False 00226 if self.__logx==False: 00227 newaxis=True 00228 self.__logx=True 00229 self.resetxaxis(newaxis) 00230 00231 def resetxaxis(self,newaxis): 00232 for i in range (self.__nhist): 00233 self.resetHisto(i) 00234 if newaxis==True: 00235 self.__ticksx=self.computeticks(self.__lower,self.__upper,self.__logx) 00236 for j in self.__xlabels:j.deleteLater() 00237 self.__xlabels=self.makelabels(self.__ticksx[0],self.__logx,QLabel.AlignHCenter|QLabel.AlignTop) 00238 self.setBinBoundaries() 00239 self.__scale=1. 00240 self.__scalehaschanged=True 00241 self.updateHisto() 00242 00243 def updateHisto(self): 00244 if self.__scalehaschanged==True: 00245 self.__ticksy=self.computeticks(self.__scalelow,self.__scale,self.__logy) 00246 for j in self.__ylabels:j.deleteLater() 00247 self.__ylabels=self.makelabels(self.__ticksy[0],self.__logy,QLabel.AlignVCenter|QLabel.AlignRight) 00248 if len(self.__ylabels[-1].text())>6 and not self.__logy:self.__marginleft=(len(self.__ylabels[-1].text())-3)*6 00249 self.drawLabels() 00250 self.__scalehaschanged=False 00251 self.update() 00252 def computeticks(self,lower,upper,log): 00253 if log: 00254 l=floor(log10(float(lower))) 00255 tickval=ceil(float(lower)/pow(10,l))*pow(10,l) 00256 ticks=[[],[]] 00257 while tickval<=upper: 00258 if int(tickval/pow(10,l)+.1)==10: 00259 l+=1 00260 ticks[0].append(tickval) 00261 else: 00262 if int(tickval/pow(10,l)+.1)==1: 00263 ticks[0].append(tickval) 00264 else: 00265 ticks[1].append(tickval) 00266 tickval+=pow(10,l) 00267 else: 00268 l=pow(10,floor(log10(upper-lower)-.1)) 00269 if (upper-lower)/l*10<=NTICKMAX:subd=10 00270 elif (upper-lower)/l*5<=NTICKMAX:subd=5 00271 elif (upper-lower)/l*2<=NTICKMAX:subd=2 00272 else: subd=1 00273 l2=float(l)/subd 00274 ticks=[[],[]] 00275 if lower%l==0: 00276 ticks[0].append(lower) 00277 for i in range(int((upper-(upper%l)-(lower-lower%l))/l)): 00278 ticks[0].append(lower+(i+1)*l-((lower)%l)) 00279 if lower%l2==0: 00280 ticks[1].append(lower) 00281 for i in range(int((upper-(upper%l2)-(lower-lower%l2))/l2)): 00282 ticks[1].append(lower+(i+1)*l2-((lower)%l2)) 00283 return ticks 00284 00285 def paintEvent(self,pe): 00286 try: 00287 r=pe.rect() 00288 painter=QPainter() 00289 painter.begin(self) 00290 painter.setBrush(QColor("white")) 00291 painter.drawRect(0,0,self.size().width(),self.size().height()) 00292 widthx=float(self.size().width()-2*self.bds-self.__marginleft) 00293 widthy=float(self.size().height()-2*self.bds-self.__marginlow) 00294 pen=QPen() 00295 for j in range (self.__nhist): 00296 if self.showhisto[j]==0:continue 00297 if self.style[j]==1: 00298 painter.setBrush(QColor(self.color[j])) 00299 pen.setColor(QColor(self.color[j])) 00300 painter.setPen(pen) 00301 for i in range(self.__nbins): 00302 if self.__logy == True and self.__contents[j][i]>self.__scalelow: 00303 painter.drawRect(1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx, 00304 self.bds+widthy-(log10(self.__contents[j][i])-log10(self.__scalelow)) 00305 /(log10(self.__scale)-log10(self.__scalelow))*widthy, 00306 int(float(i+1)*widthx/self.__nbins)-int(float(i)*widthx/self.__nbins), 00307 1+(log10(self.__contents[j][i])-log10(self.__scalelow))/ 00308 (log10(self.__scale)-log10(self.__scalelow))*widthy) 00309 else: 00310 painter.drawRect(1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx, 00311 self.bds+widthy-(self.__contents[j][i]/self.__scale)*widthy, 00312 int(float(i+1)*widthx/self.__nbins)-int(float(i)*widthx/self.__nbins), 00313 1+(self.__contents[j][i]/self.__scale)*widthy) 00314 for j in range (self.__nhist): 00315 if self.showhisto[j]==0:continue 00316 if self.style[j]==0: 00317 pen.setColor(QColor(self.color[j])) 00318 painter.setPen(pen) 00319 for i in range(self.__nbins): 00320 if self.__logy==True : 00321 if self.__contents[j][i]>self.__scalelow : 00322 if i!=0: 00323 if self.__contents[j][i-1]>self.__scalelow: 00324 painter.drawLine(1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx, 00325 self.bds+widthy-(log10(self.__contents[j][i-1])-log10(self.__scalelow)) 00326 /(log10(self.__scale)-log10(self.__scalelow))*widthy, 00327 1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx, 00328 self.bds+widthy-(log10(self.__contents[j][i])-log10(self.__scalelow)) 00329 /(log10(self.__scale)-log10(self.__scalelow))*widthy) 00330 else: 00331 painter.drawLine(1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx, 00332 self.bds+widthy, 00333 1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx, 00334 self.bds+widthy-(log10(self.__contents[j][i])-log10(self.__scalelow)) 00335 /(log10(self.__scale)-log10(self.__scalelow))*widthy) 00336 painter.drawLine(1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx, 00337 self.bds+widthy-(log10(self.__contents[j][i])-log10(self.__scalelow)) 00338 /(log10(self.__scale)-log10(self.__scalelow))*widthy, 00339 self.bds+self.__marginleft+float(i)/self.__nbins*widthx+ 00340 int(float(i+1)*widthx/self.__nbins)-int(float(i)*widthx/self.__nbins), 00341 self.bds+widthy-(log10(self.__contents[j][i])-log10(self.__scalelow))/ 00342 (log10(self.__scale)-log10(self.__scalelow))*widthy) 00343 if i<self.__nbins-1: 00344 if self.__contents[j][i+1]<self.__scalelow: 00345 painter.drawLine(self.bds+self.__marginleft+float(i)/self.__nbins*widthx+ 00346 int(float(i+1)*widthx/self.__nbins)-int(float(i)*widthx/self.__nbins), 00347 self.bds+widthy, 00348 self.bds+self.__marginleft+float(i)/self.__nbins*widthx+ 00349 int(float(i+1)*widthx/self.__nbins)-int(float(i)*widthx/self.__nbins), 00350 self.bds+widthy-(log10(self.__contents[j][i])-log10(self.__scalelow)) 00351 /(log10(self.__scale)-log10(self.__scalelow))*widthy) 00352 00353 else: 00354 if i!=0: 00355 painter.drawLine(1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx, 00356 self.bds+widthy-(self.__contents[j][i-1]/self.__scale)*widthy, 00357 1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx, 00358 self.bds+widthy-(self.__contents[j][i]/self.__scale)*widthy) 00359 painter.drawLine(1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx, 00360 self.bds+widthy-(self.__contents[j][i]/self.__scale)*widthy, 00361 self.bds+self.__marginleft+float(i)/self.__nbins*widthx+ 00362 int(float(i+1)*widthx/self.__nbins)-int(float(i)*widthx/self.__nbins), 00363 self.bds+widthy-(self.__contents[j][i]/self.__scale)*widthy) 00364 #done with histograms, now do ticks 00365 pen.setColor(QColor("black")) 00366 painter.setPen(pen) 00367 painter.setBrush(QBrush(Qt.NoBrush)) 00368 painter.drawRect(self.bds+self.__marginleft,self.bds,widthx+1,widthy+1) 00369 for tick in self.__ticksx[0]: 00370 if self.__logx: 00371 painter.drawLine(self.bds+self.__marginleft+widthx/(log10(self.__upper)-log10(self.__lower))*(log10(tick)- 00372 log10(self.__lower)),widthy+self.bds-1, 00373 self.bds+self.__marginleft+widthx/(log10(self.__upper)-log10(self.__lower))*(log10(tick)- 00374 log10(self.__lower)),widthy+self.bds-6) 00375 else: 00376 painter.drawLine(self.bds+self.__marginleft+widthx/(self.__upper-self.__lower)*(tick-self.__lower),widthy+self.bds-1, 00377 self.bds+self.__marginleft+widthx/(self.__upper-self.__lower)*(tick-self.__lower),widthy+self.bds-6) 00378 for tick in self.__ticksx[1]: 00379 if self.__logx: 00380 painter.drawLine(self.bds+self.__marginleft+widthx/(log10(self.__upper)-log10(self.__lower))*(log10(tick)- 00381 log10(self.__lower)),widthy+self.bds-1, 00382 self.bds+self.__marginleft+widthx/(log10(self.__upper)-log10(self.__lower))*(log10(tick)- 00383 log10(self.__lower)),widthy+self.bds-4) 00384 else: 00385 painter.drawLine(self.bds+self.__marginleft+widthx/(self.__upper-self.__lower)*(tick-self.__lower),widthy+self.bds-1, 00386 self.bds+self.__marginleft+widthx/(self.__upper-self.__lower)*(tick-self.__lower),widthy+self.bds-4) 00387 for tick in self.__ticksy[0]: 00388 if self.__logy: 00389 painter.drawLine(self.bds+self.__marginleft,self.bds+widthy-widthy/(log10(self.__scale)-log10(self.__scalelow))* 00390 (log10(tick)-log10(self.__scalelow)), 00391 self.bds+6+self.__marginleft,self.bds+widthy-widthy/(log10(self.__scale)-log10(self.__scalelow))* 00392 (log10(tick)-log10(self.__scalelow))) 00393 else: 00394 painter.drawLine(self.bds+self.__marginleft,self.bds+widthy-widthy/(self.__scale)*tick, 00395 self.bds+6+self.__marginleft,self.bds+widthy-widthy/(self.__scale)*tick) 00396 for tick in self.__ticksy[1]: 00397 if self.__logy: 00398 painter.drawLine(self.bds+self.__marginleft,self.bds+widthy-widthy/(log10(self.__scale)-log10(self.__scalelow))* 00399 (log10(tick)-log10(self.__scalelow)), 00400 self.bds+3+self.__marginleft,self.bds+widthy-widthy/(log10(self.__scale)-log10(self.__scalelow))* 00401 (log10(tick)-log10(self.__scalelow))) 00402 else: 00403 painter.drawLine(self.bds+self.__marginleft,self.bds+widthy-widthy/(self.__scale)*tick, 00404 self.bds+3+self.__marginleft,self.bds+widthy-widthy/(self.__scale)*tick) 00405 #box with labels 00406 nlab=0 00407 textdist=self.fontsize*2 00408 for i in range(self.__nhist): 00409 if self.uselabel[i] and self.showhisto[i]:nlab+=1 00410 if nlab>0: 00411 painter.setBrush(QColor("white")) 00412 painter.drawRect(self.bds+self.__marginleft+widthx*self.labelboxx,self.bds+widthy*self.labelboxy, 00413 widthx*self.boxwidth,textdist*nlab+2) 00414 i=0 00415 for j in range (self.__nhist): 00416 if self.uselabel[j]==0 or self.showhisto[j]==0:continue 00417 if self.style[j]: 00418 painter.setBrush(QColor(self.color[j])) 00419 pen.setColor(QColor(self.color[j])) 00420 painter.setPen(pen) 00421 painter.drawRect(self.bds+self.__marginleft+widthx*(self.labelboxx+.02), 00422 self.bds+widthy*self.labelboxy+textdist*i+2,widthx*.04,textdist-2) 00423 else: 00424 painter.setBrush(QColor("white")) 00425 pen.setColor(QColor(self.color[j])) 00426 painter.setPen(pen) 00427 painter.drawLine(self.bds+self.__marginleft+widthx*(self.labelboxx+.02), 00428 self.bds+widthy*self.labelboxy+textdist*i+textdist/2, 00429 self.bds+self.__marginleft+widthx*(self.labelboxx+.06), 00430 self.bds+widthy*self.labelboxy+textdist*i+textdist/2) 00431 i+=1 00432 pen.setColor(QColor("black")) 00433 painter.setPen(pen) 00434 except : 00435 print "Unexpected error:", sys.exc_info()[1] 00436 00437 00438 def resizeEvent(self,rev): 00439 try: 00440 self.drawLabels() 00441 except: 00442 print "Unexpected Label error:", sys.exc_info()[1] 00443 00444 00445 def drawLabels(self): 00446 width=float(self.size().width()-2*self.bds-self.__marginleft) 00447 height=float(self.size().height()-2*self.bds-self.__marginlow) 00448 self.xaxislabel.setGeometry(self.bds+self.__marginleft,height+2*self.bds-2+self.__marginlow-15,width,13) 00449 #histogram labels 00450 i=0 00451 textdist=self.fontsize*2 00452 for j in range (self.__nhist): 00453 if self.uselabel[j]==0 or self.showhisto[j]==0: 00454 self.histolabel[j].hide() 00455 continue 00456 self.histolabel[j].setGeometry(self.bds+self.__marginleft+width*(self.labelboxx+.1), 00457 self.bds+height*self.labelboxy+textdist*i+1,width*(self.boxwidth-0.12),textdist-2) 00458 self.histolabel[j].show() 00459 i+=1 00460 00461 #axis labels 00462 i=0 00463 for tick in self.__ticksx[0]: 00464 if self.__logx: 00465 self.__xlabels[i].setGeometry(QRect(self.bds+self.__marginleft+width/(log10(self.__upper)- 00466 log10(self.__lower))*(log10(tick) 00467 -log10(self.__lower))-15, height+self.bds+2,30,self.bds+self.__marginlow-18)) 00468 else: 00469 if len(self.__ticksx[0])>1: 00470 labelwidth=(self.__ticksx[0][1]-self.__ticksx[0][0])/2./(self.__upper-self.__lower)*width-2 00471 else: 00472 labelwidth=self.size().width()/2. 00473 while (self.bds+self.__marginleft+width/(self.__upper-self.__lower)*(tick-self.__lower)-labelwidth<1 or 00474 self.bds+self.__marginleft+width/(self.__upper-self.__lower)*(tick-self.__lower)+labelwidth>self.size().width()-1): 00475 labelwidth-=1 00476 if labelwidth<=6:break 00477 self.__xlabels[i].setGeometry(QRect(self.bds+self.__marginleft+width/(self.__upper-self.__lower) 00478 *(tick-self.__lower)-labelwidth, height+self.bds+2,2*labelwidth, 00479 self.bds+self.__marginlow-18)) 00480 00481 00482 self.__xlabels[i].show() 00483 i+=1 00484 i=0 00485 for tick in self.__ticksy[0]: 00486 if self.__logy: 00487 self.__ylabels[i].setGeometry(QRect(1,self.bds+height-height/(log10(self.__scale)-log10(self.__scalelow)) 00488 *(log10(tick)-log10(self.__scalelow))-8,self.bds+self.__marginleft-4,16)) 00489 else: 00490 self.__ylabels[i].setGeometry(QRect(1,self.bds+height-height/self.__scale*tick-8, 00491 self.bds+self.__marginleft-4,16)) 00492 self.__ylabels[i].show() 00493 i+=1 00494 00495 00496 def remainder(nr): 00497 remainder = ceil(nr) - nr 00498 if remainder>.5: 00499 remainder=nr-floor(nr) 00500 return remainder